银行自助在线业务系统

chatgpt/2023/9/24 3:04:07

银行自助在线业务系统

  • 银行自助在线业务系统目录
    • 一、开发环境与工具
    • 二、项目介绍
      • 1.自助在线业务系统的主要功能如下:
      • 2.项目结构
      • 3.自助在线业务系统代码结构
      • 4.数据库结构
      • 数据访问层 DAL
      • 业务逻辑层 BLL
      • 表示层 UI
    • 主要功能实现
      • 数据访问层 DAL
      • 业务逻辑层 BLL
      • 表示层 UI
    • 三、运行结果

一、开发环境与工具

开发语言:Java

JDK版本: jdk.17.0.2

IDE: Intellij IDEA

数据库:MySQL8

日志组件:log4j2

二、项目介绍

1.自助在线业务系统的主要功能如下:

​ 需求分析

(1) 用户管理,包括用户的登录和注册功能。
(2) 账户余额查询功能。
(3) 账户存取款功能。
(4) 转账功能。
(5) 交易日志功能。

在这里插入图片描述

2.项目结构

按照三层架构结构编写

将业务应用划分为表示层 UI数据访问层 DAL 以及业务逻辑层 BLL
在这里插入图片描述


3.自助在线业务系统代码结构

在这里插入图片描述


4.数据库结构


数据访问层 DAL

beans包:创建数据实体类, 实体类与数据表设计相对应

dao包:数据访问对象(DAO) 用来进行数据库驱动、 连接、 关闭等操作, 其中包括不同数据表 的操作方法。

dbutils包:数据库连接辅助类

业务逻辑层 BLL

service包:实现功能如登录、注册等

utils包:功能辅助类,代码重构提高代码复用性,健壮性。

表示层 UI

main包:程序的入口

frame包:系统的GUI界面

systmenu包:控制台交互菜单


主要功能实现

数据访问层 DAL

dao包

UserDaoImpl类实现DAO接口,可以实现对数据库的增删改查,属于数据访问层

findUserByName()方法实现根据用户ID查找User对象以便对账户操作

createNewUser()和addUser(String id, int serialNum)方法实现用户的注册

public class UserDaoImpl implements UserDao {
/*** 根据用户名查找数据库中的账号* @param name* @return 返回对应name账号的User对象,如果不存在返回null* */@Overridepublic User findUserByName(String name) {if(name == null){return null;}Connection conn = DBHelper.getConn();String sql = "select * from User WHERE name='" + name + "';";PreparedStatement stat = null;ResultSet rs = null;User u = new User();try {stat = conn.prepareStatement(sql);rs = stat.executeQuery();while (rs.next()) {u.setId(rs.getString("id"));u.setName(rs.getString("name"));u.setPassword(rs.getString("password"));u.setBalance(rs.getDouble("balance"));}} catch (SQLException e) {e.printStackTrace();} finally {DBHelper.closeAll(conn,stat,rs);}if (u.getId().equals(" "))return null;elsereturn u;}

dbutils包

DBHelper类实现与数据库的连接,独立一个类便于代码的复用

closeAll()方法关闭数据库连接,防止连接未释放,造成内存泄漏

public class DBHelper {//连接数据库public static  Connection conn=null;public static final String DRIVER="com.mysql.cj.jdbc.Driver";public static final String RUL="jdbc:mysql://localhost:3306/ssobs?serverTimezone=Asia/Shanghai&useSSL=true";public static final String DBUser="root";public static final String DBPassword="123456";public static Connection getConn() {try{Class.forName(DRIVER);conn= DriverManager.getConnection(RUL,DBUser,DBPassword);}catch (SQLException | ClassNotFoundException e) {e.printStackTrace();}return conn;}//关闭数据库连接public static void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {......}
}

业务逻辑层 BLL

service包

实现功能登录、注册、查余额、存款、取款、转账、查看日志、查看帮助

UserService类可以在控制台显示和操作所有功能

public class UserService {//注册-登录-查询余额-取款-存款-日志-帮助,详见src//以下为转账public void transfer(User user_Login){System.out.println("请输入转账的账户ID:");String tranId = ValidationUtil.getString();System.out.println("请输入转账的账户的姓名:");String tranName = ValidationUtil.getString();UserDaoImpl udi = new UserDaoImpl();User tranUser = udi.findUserbyId(tranId);if(tranId.equals(tranUser.getId()) && tranName.equals(tranUser.getName())){System.out.println("请输入转入的金额:");double tranMoney = ValidationUtil.get();if(user_Login.getBalance()>=tranMoney){double totalMoney2 = tranUser.getBalance() + tranMoney;tranUser.setBalance(totalMoney2);double totalMoney1 = user_Login.getBalance() - tranMoney;user_Login.setBalance(totalMoney1);udi.updataUser(tranUser);udi.updataUser(user_Login);System.out.println("转账成功!转账金额为:"+tranMoney+"元。"+"当前您的账户余额为"+user_Login.getBalance()+"元。");LogService.addLogs(user_Login,"转账给用户:"+tranName+",转账金额:"+tranMoney);LogService.addLogs(tranUser,"收到用户:"+user_Login.getName()+"的转账,转账金额:"+tranMoney);} else {System.out.println("余额不足");}} else {System.out.println("用户ID与用户名不匹配,转账失败。");LogService.addLogs(user_Login,"转账失败");}}
}

OutputExcel类实现可自由选择路径导出Excel格式的日志

public class OutputExcel {/** 查询日志* */public static List<Logs> queryLogs(User user) {LogDaoImpl logdaoimpl = new LogDaoImpl();List<Logs> logList = logdaoimpl.queryLog(user.getId());return logList;}/** 导出日志,导成Excel* */public OutputExcel(User user) throws Exception {//写入日志到ExcelString[] title = {"账号", "时间", "操作系统"};HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel工作表HSSFSheet sheet = workbook.createSheet();//创建一个工作表sheetHSSFRow row = sheet.createRow(0);//创建第一行HSSFCell cell;//创建单元格//插入第一行数据、id、name、sexfor (int i = 0; i < title.length; i++) {cell = row.createCell(i);cell.setCellValue(title[i]);}//追加数据List<Logs> logList = queryLogs(user);Iterator<Logs> list = logList.iterator();int i = 1;while (list.hasNext()) {Logs log = list.next();HSSFRow nextRow = sheet.createRow(i);//创建第二行单元格HSSFCell cell2 = nextRow.createCell(0);cell2.setCellValue(log.getUserId());cell2 = nextRow.createCell(1);cell2.setCellValue(log.getTimes());cell2 = nextRow.createCell(2);cell2.setCellValue(log.getLogContext());i++;}//可选择日志文件存放的路径JFileChooser chooser = new JFileChooser();chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//仅仅选择文件夹chooser.showOpenDialog(null);String path = chooser.getSelectedFile().getPath();String time = DateUtil.getDateTimeNow();//创建一个文件:文件路径可更新File file = new File(path+"/Log_"+user.getId()+"_"+time+".xls");FileOutputStream stream = FileUtils.openOutputStream(file);//文件流workbook.write(stream);//写入流stream.close();//关闭流JOptionPane.showMessageDialog(null,"日志导出成功!","日志导出",JOptionPane.INFORMATION_MESSAGE);}
}

表示层 UI

frame包存放图形界面,属于表示层

GUI的设计思路:一个.java文件实现一个功能(如:存款、取款……)其中有两个类,一个类继承JFrame,作为图形框架。一个类实现ActionListener接口,作为事件监听类,两个类之间用一个框架类的变量产生联系,事件监听类中的actionPerformed()方法就可以以类名.属性/方法 如:Class.forName()的形式实现面向对象编程。目的是将图形框架和事件监听独立开以避免代码混乱,增加代码可读性。下面以取款WithdrawFrame.java文件为例。

//WithdrawFrame是框架类
public class WithdrawFrame extends JFrame {User user1;UserDaoImpl udi;JPanel panel1;JPanel panel2;JPanel panel3;JLabel title;JTextField withdrawmoney;JButton button;public WithdrawFrame(User user){//图形界面的设计panel1 = new JPanel();panel2 = new JPanel();panel3 = new JPanel();button = new JButton("确定");Font font = new Font("宋体",Font.PLAIN,20);title = new JLabel("请输入您的取款金额");title.setFont(font);withdrawmoney = new JTextField(15);panel1.add(title);panel2.add(withdrawmoney);panel3.add(button);add(panel1);add(panel2);add(panel3);setTitle("取款");setBounds(300,200,300,200);setLayout(new GridLayout(3,1));setVisible(true);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//注册事件button.addActionListener(new WithdrawAction(this));user1 = user;udi = new UserDaoImpl();}
}
//WithdrawAction是事件监听类
class WithdrawAction implements ActionListener{//定义WithdrawFrame框架类的私有属性,以便联系GUI框架类和事件监听类private WithdrawFrame frame;//定义构造方法,用于传参public WithdrawAction(WithdrawFrame frame){this.frame = frame;}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getSource()==frame.button){String str = frame.withdrawmoney.getText();if(str.equals("")){JOptionPane.showMessageDialog(null,"请输入要取款的余额。");}else{//调用GuiUtil辅助类判断用户输入取款金额是否为数字GuiUtil.digit(str);if(!GuiUtil.k){double numb = Double.parseDouble(str);frame.user1.setBalance(frame.user1.getBalance()-numb);frame.udi.updataUser(frame.user1);TradeMenuFrame.jTextArea.append("\n您成功取款:"+numb+"元。");frame.dispose();JOptionPane.showMessageDialog(null,"您成功取款"+numb+"元。");}GuiUtil.k = false;}}}
}

LogFrame类查询日志在JTable中显示

public class LogFrame extends JFrame {//定义行和列的两个动态数组Vector rowData,columnNames;JTable jt;JScrollPane jsp;//与数据库建立联系Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;//定义构造方法public LogFrame(User user) {//存放列名columnNames = new Vector();columnNames.add("userId");columnNames.add("times");columnNames.add("logContext");//rowData用来存放行数据rowData = new Vector();//表格添加内容try {conn = DBHelper.getConn();ps = conn.prepareStatement("SELECT * FROM logs WHERE userId='" + user.getId() + "';");rs = ps.executeQuery();//将数据库查出的数据填入动态数组while (rs.next()) {Vector hang = new Vector();hang.add(rs.getString("userId"));hang.add(rs.getString("times"));hang.add(rs.getString("logContext"));//加入到rowDatarowData.add(hang);}} catch (SQLException e) {JOptionPane.showMessageDialog(null, "用户网格视图中有错误。 " + e);}finally{DBHelper.closeAll(conn,ps,rs);}//将数据加入到JTable中jt = new JTable(rowData,columnNames);jsp = new JScrollPane(jt);//设置滚动条add(jsp);setTitle("日志");pack();//窗口自适应setVisible(true);setBounds(300, 200, 600, 300);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}
}

最后以Main包中的main()方法作为程序的入口

在这里插入图片描述


三、运行结果

原始界面版本

在这里插入图片描述

Windows界面版本

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5314608.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

Python入门【__init__ 构造方法和 __new__ 方法、类对象、类属性、类方法、静态方法、内存分析实例对象和类对象创建过程(重要)】(十四)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

指令收集:DOCKER+K8S

docker 1.镜像指令&#xff1a;docker images 1、docker images &#xff1a; 列出本地主机上的镜像OPTION字段说明&#xff1a; -a 列出所有本地镜像&#xff0c; -q 只显示镜像ID2、docker search 某个镜像名字 &#xff1a; 查找某个镜像加上 --limit 5 redis&#xff…

ubuntu远程控制小车 运行rviz时报错

我买的是wheeltec的小车&#xff0c;测试rgbd相机时想在ubuntu上的rviz中显示小车的姿态和看到的rgb和depth图&#xff0c;但是ubuntu中rostopic list和rviz都找不到小车发布的话题信息&#xff0c;运行rqt_image_view时可以显示图片信息。 最终wheeltec的技术人员lucas帮我找了…

IDEA中配置pom文件时对annotationProcessorPaths作修改后Lombok不起作用

IDEA中配置pom文件时对annotationProcessorPaths作修改后Lombok不起作用 问题&#xff1a;在学习MyBatis-Flex框架时&#xff0c;要求在pom文件中配置 annotationProcessor&#xff0c;官方说这样的好处是&#xff1a;mybatis-flex-processor提供APT服务&#xff0c;可以配置到…

oracle 19c打补丁遭遇OPATCHAUTO-72043OPATCHAUTO-68061

最近&#xff0c;在AIX上的新装oracle 19C数据库基础版本&#xff0c;使用opatchauto打PSU补丁集35037840时遇到了OPATCHAUTO-72043报错&#xff0c;无法正常应用GI补丁。 一、环境描述 操作系统&#xff1a;AIX 数据库版本&#xff1a;oracle rac 19.3.0新装基础版 应用PS…

青龙面板的安装和使用

玩nas除了看看电影&#xff0c;那肯定还得玩转docker&#xff0c;这期讲的就是青龙面板&#xff0c;一个跑脚本的神器。 GitHub地址&#xff1a;青龙面板 1.安装 你安装完docker那就很简单了&#xff0c;不懂可以看看我这篇博客docker安装 镜像源一定要搞&#xff0c;要不然…

【HuggingFace】RoBERTa分词器RobertaTokenizer编码完整单词

【HuggingFace】RoBERTa分词器RobertaTokenizer编码完整单词 问题描述 解决方案&#xff1a;在想要编码成完整的单词前面加个空格 问题描述 在用RobertaTokenizer对单词进行分词的时候&#xff0c;发现单词acquire会被分词两个词根&#xff0c;但是RobertaForMaskedLM可以预…

Docker部署Springboot应用【mysql部署+jar部署+Nginx部署】

【项目达到目标】 1.基本准备 2、mysql部署 3、jar部署 4、Nginx部署 一、基本准备 石工拿的就是之前放置在我们服务器上的应用进行部署&#xff0c;主要就是mysql和jar还有Vue的部署。 目前已经有的是jar、已经打包好的vue 二、mysql部署 docker run -d --name mysql \ …
推荐文章