JAVA课程设计[ATM柜员机模拟系统]【附带文件】

ATM柜员机模拟系统

摘要:在本次JAVA课程设计中,我们小组致力于开发一个ATM柜员机模拟系统。该系统的目标是模拟真实ATM柜员机的功能,为学生提供一个实践平台,帮助他们更好地理解和应用Java编程语言,同时培养他们的问题解决和团队协作能力。

该系统主要包括以下功能:

(1)用户登录:用户可以输入用户名和密码进行登录。系统会验证这些信息是否与预定义的用户信息匹配。

账户查询:用户可以查询自己的账户信息,包括账户余额和最近的交易记录。

存款功能:用户可以向自己的账户中存款,系统会更新用户的账户余额。

(4)取款功能:用户可以从自己的账户中取款,但系统会先检查账户余额是否足够。如果余额足够,系统会扣除取款金额并返回取款成功的提示信息。

(5)更改密码:用户可以更改原有的密码。

此外,为了确保系统的稳定性和可靠性,我们还进行了详细的测试,包括单元测试、集成测试和功能测试。

关键词:ATM柜员机;登录;界面;查询;改密。

1.需求分析

ATM柜员机模拟系统是一个用于模拟实际ATM柜员机功能的软件系统。该系统旨在为学生提供一个实践机会,以加深对Java编程语言的理解和应用,并熟悉软件开发过程。本报告将对该系统的需求进行详细分析,以便为后续的课程设计工作提供指导。

功能需求:ATM柜员机模拟系统应该具备基本的ATM功能,如查询余额、取款、存款、转账等。这些功能应该能够满足用户日常的银行业务需求。

性能需求:系统应具备良好的实时性,响应时间应足够快,以便用户能够迅速完成操作。同时,系统应具备稳定性和可靠性,能够保证用户数据的安全。

界面需求:系统界面应简洁明了,易于操作。用户友好性是界面设计的重要原则,应尽可能降低用户使用系统的难度。

安全性需求:系统应具备足够的安全性,以保护用户的个人信息和交易数据。这包括对用户密码的加密存储和传输,以及对用户操作的安全审计等功能。

维护需求:系统应具备良好的可维护性,方便管理员进行系统的日常维护和升级。

扩展性需求:考虑到未来可能的功能增加或改进,系统应具备良好的扩展性,以便能够适应未来的变化。

兼容性需求:系统应支持多种操作系统和浏览器,以便能够满足不同用户的需求。

成本需求:在满足以上需求的同时,系统应尽可能降低成本,以提高性价比。

1.1 实验目的

本次实验旨在通过设计和实现ATM柜员机模拟系统,达到以下目的:

(1)掌握Java编程语言的基本语法和面向对象编程思想。

通过本次实验,学生将更加深入地理解Java编程语言的特点和优势,掌握Java的基本语法和面向对象编程思想,包括类、对象、封装、继承和多态等概念。

(2)熟悉Java Swing框架,掌握图形用户界面(GUI)开发技术。

通过本次实验,学生将熟悉Java Swing框架,了解GUI开发的基本原理和常用组件。学生将学会使用Java Swing创建窗口、添加组件、处理事件等基本操作,并能够根据需求设计出友好的用户界面。

(3)理解软件设计的基本原则和软件工程的基本概念。

通过本次实验,学生将了解软件设计的基本原则,如模块化、抽象、信息隐藏等,并能够将这些原则应用到实际的软件开发中。同时,学生将熟悉软件工程的基本概念,如需求分析、设计、编码、测试和维护等,并能够按照软件工程的方法进行软件开发。

(4)培养解决实际问题的能力。

本次实验将通过一个实际的ATM柜员机模拟系统的设计和实现,培养学生解决实际问题的能力。学生将学会分析问题、提出解决方案、编写代码、测试和调试程序等技能,并能够将所学知识应用于实际项目中。

(5)培养团队协作精神。

本次实验将采取分组的方式进行,每组由若干名学生组成。学生将在小组内分工合作,共同完成实验任务。通过小组讨论、协作和互相学习,学生将能够培养团队协作精神和沟通能力,提高自己的综合素质。

1.2 ATM柜员机模拟系统的功能分析

ATM柜员机使用与ATM机相似的图形用户界面,当用户在登录界面输入给定的卡号和密码时,系统能登录ATM柜员机系统,通过数据链接操作来达到独立的客户与机器交互从而进行取款、存款、转账、查询余额、修改密码等业务办理的目的。

ATM柜员机模拟系统的主要功能是:

(1)用户登录:用户可以通过输入用户名和密码进行登录。系统应验证用户输入的用户名和密码是否与预定义的用户信息匹配。

(2)账户查询:用户可以查询自己的账户信息,包括账户余额、最近交易记录等。系统应提供相应的查询功能,并返回查询结果。

(3)存款功能:用户可以向自己的账户中存款。系统应接收用户输入的存款金额,并将该金额添加到用户的账户余额中。

(4)取款功能:用户可以从自己的账户中取款。系统应接收用户输入的取款金额,并检查用户的账户余额是否足够。如果余额足够,系统应将取款金额从用户的账户余额中扣除,并返回取款成功的提示信息。

(5)修改密码功能:用户可以修改自己的账户密码。

(6)退出系统:用户可以退出ATM柜员机模拟系统。系统应关闭所有界面,结束程序运行。

ATM柜员机主要是由各个实体窗口组成,它是由登录页面、选择服务、存款、取款、查询余额、修改密码以及查看交易记录等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求,让用户在电脑上可以轻松体验ATM取款机的使用流程,以达到易学易用的效果,避免用户在真实的ATM机上出现失误,带来不必要的损失。此外,系统应具备良好的实时性、稳定性和可靠性,界面简洁明了,易于操作,同时要保证用户数据的安全。在实现上,可以根据实际需求选择合适的编程语言和开发工具,并遵循软件工程的原则进行开发。

1.3系统实现重难点分析

(1)用户界面设计:为了提供友好的用户体验,需要设计易于操作和直观的用户界面。这涉及到GUI组件的选择、布局和事件处理等方面的技术挑战。

(2)账户管理和交易逻辑:系统需要实现账户管理功能,包括创建账户、查询账户信息、存款、取款等操作。同时,交易逻辑的设计也需要严谨,以确保数据的一致性和安全性。

(3)数据持久化:为了使系统在重启后仍然可用,需要将用户数据保存到磁盘。这涉及到数据持久化技术的选择和应用,如文件存储或数据库存储等。

(4)异常处理和日志记录:系统需要具备完善的异常处理机制,以应对各种可能的异常情况。同时,为了便于调试和维护,需要实现详细的日志记录功能。

(5)性能优化:系统需要具备一定的性能,以处理大量用户请求和交易操作。这涉及到算法优化、并发控制等方面的技术挑战。

(6)安全考虑:作为金融应用,系统的安全性至关重要。需要采取加密技术、安全认证等措施来确保用户数据和交易信息的安全。

(7)测试:系统的稳定性和可靠性对于实际应用至关重要。因此,需要进行充分的测试,包括单元测试、集成测试和系统测试等。

综上所述,ATM柜员机模拟系统的实现涉及多个方面的技术挑战。为了确保系统的成功实现,需要综合考虑技术选型、设计、开发和测试等多个环节。

1.4 ATM柜员机模拟系统的功能图

根据以上需求分析,实现了主要的功能,ATM柜员机模拟系统功能如图1-1所示。

图 1-1 功能图

2.界面设计

ATM柜员机模拟系统界面设计采用登陆界面,1个主窗口和5个窗口,主窗口主要使用多个button按钮用于窗口之间的切换。5个窗口分别实现查询、转账、取款、存款、改密功能。

2.1窗口切换

在ATM柜员机模拟系统中,查询、转账、取款、存款、改密和退出之间的窗口切换可以通过以下方式表示:

在菜单选择中,ATM柜员机模拟系统的界面上会显示一个菜单,列出可用的服务选项,例如查询、转账、取款、存款、改密和退出。用户可以通过按下相应的按钮或触摸屏幕上的选项来选择所需的服务窗口。

查询:点击查询按钮,会跳转到查询窗口,该窗口可以查询数据库中用户的当前余额。

转账:点击转账按钮,会跳转到转账窗口,该窗口包含需要给转账对象的卡号和金额,输入对应的数字,即可转账成功。

存款:点击存款按钮,会跳转到存款窗口,该窗口包含存款金额,输入想要存款的余额,点击存入,余额就会存入到数据库中用户的总余额中去。

取款:点击取款按钮,会跳转到取款窗口,在该窗口中的输入所需的金额,会在数据库中将总金额减掉取款金额。

改密:点击改密按钮,会跳转到改密窗口,改密窗口包含原密码、新密码和确认新密码。如果想要更改现有密码,可在改密窗口中输入原有密码,新密码,最后确认新密码,点击确认修改将会改变原密码。

退出:点击退出按钮,将会跳转到登录界面。

2.2登陆界面和主菜单界面

登陆界面:该界面包含卡号和密码,用户输入即可登录(详情如图2-1)

图 2-1 登陆界面

主菜单:该界面包含查询、存取款、转账、改密、退出功能(详情如图2-2)

图 2-2 主菜单界面

2.3功能界面

用户查询:该界面可查询用户当前余额(该界面如图3-1)

图 3-1 查询界面    

存款功能:该界面可用于用户存款(该界面如图3-2)     

图 3-2存款界面

取款功能:该界面用于用户取款(详情如图3-3)

图 3-3 取款界面

转账功能:该界面用于用户转账(详情如图3-4)

图 3-4 转账界面

改密功能:该界面输入原密码及新密码即可更改密码(详情如图3-5)

图 3-5 改密界面

3.功能实现

要实现需求分析中软件各功能,需要设计一些事件的功能代码。利用所需的

代码,编写一些ATM柜员机模拟系统的主要功能,使ATM柜员机模拟系统更加完善。

3.1取钱和存钱功能代码

用户可以存入金额和取出金额。

主要代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

public class ChangeMoneyPanel extends JPanel {
       
private final Image backgroundImage; // 用于存储背景图像
       
public ChangeMoneyPanel(String type, Container contentPane, CardLayout cardLayout, MainView mainView){

            setLayout(
null);
           
final String substring = type.substring(0, 1);

           
JLabel label = new JLabel("请输入"+substring+"款金额,ATM"+substring+"款必须是整百的");
           
JLabel moneyLabel = new JLabel(substring+"款金额:");
           
final JTextField moneyText = new JTextField();
           
JButton enterButton = new JButton(type);
           
final JButton backButton = new JButton("返回");

           
backgroundImage = new ImageIcon(Objects.requireNonNull(getClass().getResource("/images/9602.gif_wh860.gif"))).getImage();

           
label.setLocation(0, 30);
           
label.setSize(700,50);
           
label.setForeground(Color.white);
           
label.setFont(new Font("黑体", Font.BOLD, 30));
           
label.setHorizontalAlignment(SwingConstants.CENTER);

           
moneyLabel.setLocation(160, 150);
           
moneyLabel.setSize(160,50);
           
moneyLabel.setForeground(Color.white);
           
moneyLabel.setFont(new Font("黑体", Font.BOLD, 30));

           
moneyText.setLocation(310, 150);
           
moneyText.setSize(250,50);
           
moneyText.setFont(new Font("黑体", Font.BOLD, 30));



           
enterButton.setLocation(150, 300);
           
enterButton.setSize(180,60);
           
enterButton.setFont(new Font("黑体", Font.BOLD, 30));


           
backButton.setLocation(390,300);
           
backButton.setSize(180,60);
           
backButton.setFont(new Font("黑体", Font.BOLD, 30));

           
enterButton.addActionListener(new ActionListener() {
               
@Override
               
public void actionPerformed(ActionEvent e) {
                   
if(type.equals("存入")){
                       
HandleServiceImpl handleService = new HandleServiceImpl();
                       
Result<Boolean> booleanResult = handleService.addMoney(mainView.currentId, moneyText.getText().trim());
                       
JOptionPane.showMessageDialog(mainView,booleanResult.massage,"提示",JOptionPane.INFORMATION_MESSAGE);
                       
if(booleanResult.data){
                           
backButton.doClick();
                        }
                    }
else{//取钱
                       
HandleServiceImpl handleService = new HandleServiceImpl();
                       
Result<Boolean> booleanResult = handleService.minusMoney(mainView.currentId, moneyText.getText().trim());
                       
JOptionPane.showMessageDialog(mainView,booleanResult.massage,"提示",JOptionPane.INFORMATION_MESSAGE);
                       
if(booleanResult.data){
                           
backButton.doClick();
                        }
                    }
                }
            });

           
backButton.addActionListener(new ActionListener() {
               
@Override
               
public void actionPerformed(ActionEvent e) {
                   
mainView.setTitle("菜单");
                   
cardLayout.show(contentPane,"菜单");
                   
moneyText.setText("");
                }
            });
            add(
label);
            add(
moneyLabel);
            add(
moneyText);
            add(
enterButton);
            add(
backButton);
        }
   
@Override
   
protected void paintComponent(Graphics g) {
       
super.paintComponent(g);

       
// 绘制背景图像
       
if (backgroundImage != null) {
            g.drawImage(
backgroundImage, 0, 0, getWidth(), getHeight(), this);
        }
    }
    }

3.2逻辑校验

@Override
public Result<Boolean> addMoney(Long id, String money) {
   
if (money.equals("")){
       
return new Result<Boolean>("不能为空",false);
    }
   
if(!StringUtils.isStrictlyNumeric(money)){
       
return new Result<Boolean>("含有非法字符",false);
    }
   
if(Double.parseDouble(money)%100!=0){
       
return new Result<Boolean>("ATM中只支持百元大钞,零钱请前往柜台领取",false);
    }
   
SqlSession sqlSession = sqlSessionFactory.openSession();
   
MysqlOperateMapper userMapper = sqlSession.getMapper(MysqlOperateMapper.class);
   
userMapper.addMoneyById(id,new BigDecimal(money));
   
sqlSession.commit();
   
sqlSession.close();
   
return new Result<Boolean>("存款成功",true);
}

@Override
public Result<Boolean> minusMoney(Long id, String money) {

   
if(!StringUtils.isStrictlyNumeric(money)){
       
return new Result<Boolean>("含有非法字符",false);
    }
   
if (money.equals("")){
       
return new Result<Boolean>("不能为空",false);
    }
   
if(Double.parseDouble(money)%100!=0){
       
return new Result<Boolean>("ATM中只支持百元大钞,零钱请前往柜台领取",false);
    }

   
SqlSession sqlSession = sqlSessionFactory.openSession();
   
MysqlOperateMapper userMapper = sqlSession.getMapper(MysqlOperateMapper.class);
   
User user = userMapper.selectById(id);
   
if(user.getMoney().compareTo(new BigDecimal(money))<0){//比较大小,a>b 返回值>0,a=b返回值=0 ,a<b 返回值小于0
       
return new Result<Boolean>("余额不足",false);
    }
   
userMapper.minusMoneyById(id,new BigDecimal(money));
   
sqlSession.commit();
   
sqlSession.close();
   
return new Result<Boolean>("取款成功",true);
}

3.3 sql语句

<update id="addMoneyById">
    update tb_user set money=money+#{money} where id =#{id}
</
update>

<
update id="minusMoneyById">
    update tb_user set money=money-#{money} where id =#{id}
</
update>

4.项目总结

随着银行业务的快速发展和客户需求的多样化,传统的银行柜员服务模式已经难以满足市场的需求。为了提高银行业务处理效率,提升客户体验,我们开发了一款ATM柜员机模拟系统。该系统的目标是实现自助化的银行业务处理,包括查询、转账、取款、存款、改密等功能,为客户提供方便快捷的金融服务。总的来说,ATM柜员机模拟系统是一种非常实用的工具,可以帮助用户更好地了解和使用ATM机。通过模拟真实的环境和操作流程,用户可以在安全的环境中进行练习和测试,从而提高操作技能和工作效率。同时,该系统的应用范围也非常广泛,可以满足不同领域的需求。

通过这次ATM柜员机模拟系统的设计,我不仅掌握了Java编程语言的基本知识,还提高了自己的团队协作能力和解决实际问题的能力。在设计过程中,我遇到了许多挑战和困难,但通过不断尝试和探索,最终成功地完成了任务。

这次课程设计让我深刻认识到,编程不仅仅是编写代码,更是一种思维方式。在未来的学习和工作中,我将继续深入学习Java编程语言,提高自己的编程技能和解决问题的能力。同时,我也将注重团队协作和沟通能力的培养,以更好地适应未来社会的需求。

参考文献

[1] 《Java编程思想》(Thinking in Java),Bruce Eckel著,机械工业出版社。

[2] 《Java核心技术卷Ⅰ》(Core Java Volume I--Fundamentals),Cay S. Horstmann、Gary Cornell著,机械工业出版社。

[3] 《Java并发编程实战》(Java Concurrency in Practice),Brian Goetz等著,机械工业出版社。

[4] 《MySQL从入门到精通》,明日科技编著,中国铁道出版社。

附录一:本人完成部分

本人完成账户查询和更改密码功能,详细代码在该报告3.1,3.2及3.3中。

存款和取款功能是ATM系统的核心部分,它们允许用户在账户中存入资金或从账户中提取资金。在此次课程设计中,我完成了存款和取款功能的模拟实现。

存款功能允许用户将现金存入其账户中。为了实现这一功能,我们首先需要设计一个存款界面,用户通过输入存款金额来进行存款操作。在后端,我们编写代码来更新数据库中的账户余额。为了确保数据的一致性,我们在存款操作中加入了事务处理机制。

取款功能允许用户从其账户中提取现金。同样,我们设计了一个取款界面,用户输入取款金额后进行取款操作。在后端,我们根据用户输入的金额来减少数据库中的账户余额。为了防止因余额不足而导致的取款失败,我们在取款操作中加入了余额检查机制。

在技术实现上,我们使用了Java语言。对于界面设计,我们采用了Swing库来创建用户界面。此外,为了保证数据的安全性,我们对所有输入进行了严格的验证和过滤,防止SQL注入等安全攻击。为了提高系统的性能和用户体验,我们对存款和取款功能进行了优化。例如,我们采用了缓存技术来减少与数据库的交互次数,通过批量处理来提高数据处理的效率等。

在完成功能实现后,我们对存款和取款功能进行了详细的测试。测试中,我们模拟了各种用户输入和异常情况,验证了功能的正确性和稳定性。同时,我们还进行了性能测试,确保系统能够高效地处理大量的存款和取款请求。

通过本次课程设计,我们成功地实现了ATM柜员机模拟系统的存款和取款功能。在实际应用中,这些功能将极大地便利用户的银行业务办理过程。在未来的开发中,我们将进一步完善系统功能,如增加转账、查询交易记录等,并不断提升系统的性能和安全性。同时,我们也将探索如何将新技术引入到ATM系统中,如使用自然语言处理技术实现智能客服等,为用户提供更加便捷、智能的服务体验。

课程设计文档

课程设计文档icon-default.png?t=N7T8https://download.csdn.net/download/L152690/89236287

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值