基于JavaSwing ATM取款机系统的设计和实现

举报
Java李杨勇 发表于 2021/08/16 00:12:40 2021/08/16
【摘要】 前言: 本项目是使用Java swing开发,可实现ATM系统/银行系统的基本登陆、转账、查询余额、存取款业务。界面设计比较简介、适合作为Java课设设计以及学习技术使用。 需求分析: 随着生活水平的提高,消费量的增大,开销也越来越大,自然离不开的就是钱。人们有的要取钱,有的要存钱,可是只能去银行,而银行的遍布并不是很广,它可能在人流密集度比较大的地方会设立...

前言:

本项目是使用Java swing开发,可实现ATM系统/银行系统的基本登陆、转账、查询余额、存取款业务。界面设计比较简介、适合作为Java课设设计以及学习技术使用。

需求分析:

随着生活水平的提高,消费量的增大,开销也越来越大,自然离不开的就是钱。人们有的要取钱,有的要存钱,可是只能去银行,而银行的遍布并不是很广,它可能在人流密集度比较大的地方会设立,或者稍大范围内设立一个,但是对于比较偏远地区的人们,无疑造成了非常大的困难。那么,如何来解决这个问题那?研发ATM柜员机即为广大用户提供了便捷,改善了生活。您无需再到银行排队办理一些简单的业务, ATM柜员机为您提供取款,存款,余额查询,修改密码等功能操作。而且ATM的遍及范围远远大于银行,主要是ATM的自身功能容易实现日容易布局,不需要耗费大量的空间,人力及物力,可以在很多点来设立。也正是在这种情况下, ATM柜员机得到了人们的喜爱并得到了大量的普及,可以说对银行和人们都非常有益的。本系统通过设计与开发Windows系统,主要完成了余额查询功能,取款功能,存款功能,转账功能,退出系统功能,目的在于通过 ATM自动存取款 机实现一些简单的动能。

主要模块:

用户登录、注册、重置、存款、查询余额、取款、转账、更改密码、退卡等具体功能

功能截图: 

登录注册:

运行程序启动mian方法进入登录页面

首页

存款

存入输入的金额点击确认完成存款、存款的时候输入的必须是整数

查询余额

查询自己的余额以及操作记录信息

取款

取款金额不能大于账户余额

转账

转账的时候必须正确输入用户id信息、否则转款失败

更改密码

输入原密码进行校验后、输入2次相同的新密码完成修改密码功能

数据库设计:

这个ATM暂时没用数据库、是以文本txt的形式进行存储数据、更方便快捷简单话

部分关键代码:

主启动:


  
  1. public static void main(String[] args)throws Exception {
  2. usersList = new ArrayList<Account>();
  3. //System.out.println(usersList);
  4. /**********************用户文本**********************/
  5. File users = new File("users.txt");
  6. if (!users.exists()) {
  7. try {
  8. users.createNewFile();
  9. Writer fw = new FileWriter("users.txt");
  10. fw.write("123456 123456 10000");
  11. fw.flush();
  12. fw.close();
  13. } catch (Exception e1) {
  14. JOptionPane.showMessageDialog(null, "创建用户文档失败");
  15. }
  16. }
  17. usersFile = users;//创建用户文档,存储用户账户,密码,余额信息;
  18. usersListRead();
  19. usersListUpdate();
  20. /*****************************Login****************************/
  21. LoginGui loginGui = new LoginGui();
  22. }

账号相关:


  
  1. package atm;
  2. //import com.sun.deploy.util.SyncFileAccess;
  3. //import com.sun.org.apache.regexp.internal.RE;
  4. import javax.swing.*;
  5. import java.io.*;
  6. import java.text.SimpleDateFormat;
  7. import java.util.*;
  8. public class Account {
  9. int money;
  10. String id;//账号名
  11. String password;
  12. Date now=new Date();
  13. Date currentTime;
  14. SimpleDateFormat formatter;
  15. Reader fr;
  16. ;
  17. public Account(String id, String password, String money) {//构造方法
  18. this.id = id;
  19. this.password = password;
  20. this.money=Integer.parseInt(money);
  21. }
  22. public void outMoney (int money)throws Exception {//抛出异常,由相关的界面类弹窗处理异常,下面几个方法同理
  23. //如在取钱界面取钱,则会调用此函数,进行try/catch处理,获得这个函数的异常,弹窗说明异常
  24. if (money > this.money) {
  25. throw new Exception("余额不足");
  26. }
  27. if(money<0)
  28. {
  29. throw new Exception("不能取出负数");
  30. }
  31. formatter = new SimpleDateFormat("yy-MM-dd HH:mm:ss");//时间格式
  32. currentTime = new Date();//当前时间
  33. String dateString = formatter.format(currentTime);//处理当前时间格式
  34. Writer fw = new FileWriter(Test.file);
  35. fw.write(Test.recordString.append(dateString + "\t" + Test.currentAccount.id + "\t取出" + money + "元\r\n").toString());//将这次的取钱行为添加到记录文件中
  36. fw.flush();//写进文件
  37. fw.close();
  38. this.money -= money;
  39. Test.usersListUpdate();//更新用户文档(信息)
  40. }
  41. public void inMoney(int money)throws Exception
  42. {
  43. try {
  44. Writer fw = new FileWriter(Test.file);
  45. // System.out.println(Test.file);
  46. formatter = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
  47. currentTime=new Date();
  48. String dateString=formatter.format(currentTime);
  49. fw.write(Test.recordString.append(dateString+"\t"+Test.currentAccount.id+"\t存入" + money + "元\r\n").toString());
  50. fw.flush();//写进文件
  51. fw.close();
  52. this.money+=money;
  53. Test.usersListUpdate();//更新当前用户信息
  54. }
  55. catch (Exception e1)
  56. {
  57. throw new Exception("写入记录失败");
  58. }
  59. }
  60. public void transfer(int money,String id)throws Exception//转账
  61. {
  62. if(id.equals(Test.currentAccount.id))
  63. {
  64. throw new Exception("不能转给自己");
  65. }
  66. if(money>this.money)
  67. {
  68. throw new Exception("余额不足");
  69. }
  70. if(money<0) {
  71. throw new Exception("不能转入负数");
  72. }
  73. for(int i=0;i<Test.usersList.size();i++)
  74. {
  75. if(Test.usersList.get(i).id.equals(id))//找到要转帐的用户
  76. {
  77. Test.usersList.get(i).money+=money;//转入
  78. this.money-=money;//扣钱
  79. FileWriter fw=new FileWriter(Test.file);
  80. formatter = new SimpleDateFormat("yy-MM-dd HH:mm:ss");//声明时间格式
  81. currentTime=new Date();//获取当前时间
  82. String dateString=formatter.format(currentTime);//转换时间格式
  83. fw.write(Test.recordString.append(dateString+"\t向"+id+"\t转出"+money+"元\r\n").toString());//Test类中的静态字符串拼接上这个字符串覆盖写入当前用户文档
  84. fw.close();
  85. /********************向转入目标写入转账信息*************************/
  86. try {
  87. fr = new FileReader(id+".txt");//字符流
  88. }
  89. catch (Exception e)
  90. {
  91. System.out.println("字符流创建失败");
  92. }
  93. BufferedReader bfr = new BufferedReader(fr);
  94. String temp="";
  95. String temp1;
  96. while ((temp1 = bfr.readLine()) != null)
  97. {
  98. temp+=temp1;
  99. }
  100. temp=temp.replace("元","元\n\r")+dateString+"\t由"+Test.currentAccount.id+"\t转进"+money+"元\r\n";
  101. System.out.println(temp);
  102. fw=new FileWriter(id+".txt");
  103. fw.write(temp);
  104. fw.close();
  105. JOptionPane.showMessageDialog(null,"转账成功");
  106. Test.usersListUpdate();//更新用户文档
  107. return;
  108. }
  109. }
  110. throw new Exception("目标用户不存在");
  111. }
  112. public void ChangePassword(String newPassword)throws Exception
  113. {
  114. if(newPassword.equals(this.password))
  115. {
  116. throw new Exception("原密码和新密码不能一样");
  117. }
  118. else
  119. {
  120. if(newPassword.equals(""))
  121. {
  122. throw new Exception("密码不能为空");
  123. }
  124. }
  125. password=newPassword;
  126. Test.usersListUpdate();
  127. }
  128. }

修改密码:


  
  1. package atm;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. public class ChangePassword implements ActionListener{
  7. public JPasswordField oldPassword,newPassword,checkPassword;
  8. public JFrame iframe;
  9. public JPanel ip0,ip1,ip2,ip3,ip4;
  10. public JButton confirm,cancel,exit;
  11. public ChangePassword() {
  12. iframe=new JFrame("更改密码");
  13. iframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  14. ip2=new JPanel();
  15. ip2.add(new JLabel("原密码:"));
  16. oldPassword=new JPasswordField(20);
  17. ip2.add(new JLabel("<html><br/><html>"));//换行
  18. ip2.add(oldPassword);
  19. ip0=new JPanel();
  20. ip0.add(new JLabel("新密码:"));
  21. newPassword=new JPasswordField(20);
  22. ip0.add(new JLabel("<html><br/><html>"));//换行
  23. ip0.add(newPassword);
  24. ip4=new JPanel();
  25. ip4.add(new JLabel("再次输入新密码:"));
  26. checkPassword=new JPasswordField(20);
  27. ip4.add(new JLabel("<html><br/><html>"));//换行
  28. ip4.add(checkPassword);
  29. ip3=new JPanel();
  30. confirm=new JButton("确定");
  31. ip3.add(confirm);
  32. cancel=new JButton("返回");
  33. ip3.add(cancel);
  34. iframe.add(ip2);
  35. iframe.add(ip0);
  36. iframe.add(ip4);
  37. iframe.add(ip3);
  38. iframe.add(confirm);
  39. iframe.add(cancel);
  40. iframe.setLayout(new FlowLayout());
  41. iframe.setVisible(true);
  42. iframe.setTitle("密码更改");//窗体标签
  43. iframe.setSize(400, 200);//窗体大小
  44. iframe.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
  45. confirm.addActionListener(this);
  46. cancel.addActionListener(this);
  47. }
  48. public void pw_clean() {
  49. newPassword.setText("");
  50. oldPassword.setText("");
  51. checkPassword.setText("");
  52. }
  53. @Override
  54. public void actionPerformed(ActionEvent e) {
  55. if(e.getActionCommand().equals("确定")) {
  56. if (Test.currentAccount.password.equals(oldPassword.getText())) {
  57. try {
  58. if(newPassword.getText().equals(checkPassword.getText())) {
  59. if(newPassword.getText().length()>=6) {
  60. Test.currentAccount.ChangePassword(newPassword.getText());
  61. JOptionPane.showMessageDialog(null, "更改密码成功");
  62. iframe.setVisible(false);
  63. Test.menu.mframe.setVisible(false);//关闭菜单界面
  64. new LoginGui();
  65. }else {
  66. JOptionPane.showMessageDialog(null,"密码不能少于6位!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
  67. pw_clean();
  68. }
  69. }
  70. else
  71. {
  72. JOptionPane.showMessageDialog(null, "两次输入的密码不一致");
  73. pw_clean();
  74. }
  75. }
  76. catch (Exception e1) {//捕获账户类中更改密码函数的异常并弹窗显示
  77. JOptionPane.showMessageDialog(null, e1.getMessage());
  78. pw_clean();
  79. }
  80. } else {
  81. JOptionPane.showMessageDialog(null, "原密码错误");
  82. pw_clean();
  83. }
  84. }
  85. else//如果点击cancel
  86. {
  87. iframe.setVisible(false);
  88. }
  89. }
  90. }

 文档结构图:

备注:项目来于网络、作者整理优化测试、若有侵权联系作者删除

总结: 

在本次课程设计中我主要负责登陆界面部分和界面优化。通过这次课程设计。我学到了许多令我受益匪浅的知识。感觉java的界面设计和 mfc差不多。只是java没有可视化的界面做起来太累了。其他主要是类和对象的问题。实现起来还是挺简单的。

完整源码下载地址

从今天开始打卡更新Java相关项目 1/100天

大家可以点赞、收藏、关注、评论我啦 

文章来源: lyyong.blog.csdn.net,作者:java李阳勇,版权归原作者所有,如需转载,请联系作者。

原文链接:lyyong.blog.csdn.net/article/details/119709337

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。