Java ATM自动取款机.docx
Java ATM自动取款机Java课程设计报告 项目: ATM自动取款机 姓名: 学号: 10592127 班级: 10级网络一班 分数: 项 目 说 明 角色 组长 10592127 数据库连接,主页代码,取款,查询,系统提示,和整理代码。 姓名 学号 任务分配 组员 10592235 欢迎界面,登陆界面, 修改密码,退出界面 目 录 第一部分、项目整体概述页 第二部分、数据库信息描述页 第三部分、自己承担部分的实验报告页 第四部分、心得体会页 一、 项目整体概述 我们的ATN机系统设计的实现根据结构程序设计原理,将每个模块的功能用相应的标准语句表示出来。包括代码设计、数据库设计、用户界面设计、处理过程设计。代码设计是指把系统管理对象数字化或字符化,便于计算机的处理。遵照代码设计的原则:合理性、简明性、系统性、稳定性、可扩充性、标准化、便于识别和记忆。 数据库设计指对系统所采用的数据模式、子模式、应用程序、数据库等根据用户的具体要求进行分析和设计。它也是管理信息系统设计的重要组成部分。数据库设计的基本原则是尽可能提高数据组织的相对独立性,简化其结构,即用规范化方法设施数据存储的结构,提高数据的可维护性、完整性、一致性。通过收集和分析用户需求,确定了数据库要保存的信息。 我们这次实训课设计的ATM机,主要应用java图形用户界面开发的知识,主要界面有欢迎界面,登陆界面,选择业务界面和退出,其中选择业务界面又包括修改密码,取款服务和查询余额。能让人们通过我们的设计完成想要的操作。为人们带来方面。 模拟ATM柜员机程序; 欢迎界面点击Login跳到登陆界面,点击quit则退出。 登陆界面包括输入卡号和密码,不正确时则不能进入提示没有该用户名称或密码错误,请核对后重新输入。当密码和用户名都正确时则进入选择服务界面。 选择页面可以选择修改密码,查询余额,和取款3个服务。 修改密码。当用户需要修改密码时,可以用这个功能,新密码不能为空,确定密码时不能为空,旧密码必须正确,且新密码和确定密码两次输入相同的情况下才可以成功修改密码。 取款。用户根据自己需要取多少钱,点击自定义按钮输入要取的金额,每次取款金额为大于0的数就可以了,但取款金额不允许透支。还可以点击按钮进行取款,如果选择的金额大于自己账户的金额则提示金额不足。 查询余额。用户需要知道自己账户还剩多少钱时,可以查询自己账户的余额。 实验流程图如下: 查询 待机界面 登录界面 选择服务界面 取款 修改密码 退出 交易完成 点击退出 二、数据库信息描述 建立的数据库是根据代码的完成建立的其数据库为ATM,表名为guest。在表中建立id字段其类型为自动编号,并设置其为主键,用户名字段为gid,密码字段为pwd,金额字段为gmoney。在表中分别输入我的和组员信息。金额类型为数字。建立好数据库知道连接到程序中运行即可。 三、自己承担部分的实验报告 连接数据库现在控制面板管理工具中建立数据源 连接数据库代码为 import java.sql.*; import java.io.*; public class dataAccess private Connection conn; private Statement stmt; public dataAccess /构造函数设置连接数据库 try Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); catch(Exception e1) System.out.println(e1.toString); String dburl ="jdbc:odbc:driver=Microsoft Access Driver (*.mdb);DBQ=Dataatm.mdb" conn=DriverManager.getConnection(dburl); stmt=conn.createStatement; public ResultSet getData(String sqlstr)/返回查询的数据集 try ResultSet rs=this.stmt.executeQuery(sqlstr); return rs; catch(Exception e) System.out.println(e.toString); return null; public int getRowcount(String sqlstr) int i=0; try ResultSet rs=this.getData(sqlstr); while(rs.next) i+; catch(Exception e) System.out.println(e.toString); finally return i; public boolean exeSql(String sqlstr)/执行无返回的SQL语句 try stmt.execute(sqlstr); return true; catch(Exception e) System.out.println(e.toString); try Thread th=new Thread; return false; public void sleep(int second) th.sleep(second*1000); catch(Exception e) System.out.println(e.toString); protected void finalize/析构函数 try if(stmt!=null) stmt.close; if(conn!=null) conn.close; catch(Exception e) 选择服务界面: 它是由取款,查询金额,和修改密码构成点击按钮的时候跳到相应的界面有四个按钮分别布局于东西南北四个方向,选择服务字放在中间。 选择服务页面代码: public void showMenu PnlMenu=new Panel; GridLayout gdo3=new GridLayout(4,3,4,3); Label albl=new Label("请选择业务"); /albl.setBackground(Color.green); albl.setAlignment(Label.CENTER); a1=new Button("1、取款服务"); a2=new Button("2、查询余额"); a3=new Button("3、修改密码"); a4=new Button("4、退出"); a1.addActionListener(this); a3.addActionListener(this); a2.addActionListener(this); a4.addActionListener(this); PnlMenu.setLayout(gdo3); PnlMenu.add(albl); PnlMenu.add(a1); PnlMenu.add(a2); PnlMenu.add(a3); PnlMenu.add(a4); a1.setSize(200,200); a2.setSize(600,200); a3.setSize(200,200); a4.setSize(600,200); albl.setSize(200, 200); a1.setFont(new Font("楷体",Font.BOLD,18); a2.setFont(new Font("楷体",Font.BOLD,18); a3.setFont(new Font("楷体",Font.BOLD,18); a4.setFont(new Font("楷体",Font.BOLD,18); albl.setFont(new Font("楷体",Font.BOLD,24); albl.setForeground(Color.red); PnlMenu.setLayout(new BorderLayout); PnlMenu.add(a1,BorderLayout.WEST); PnlMenu.add(a4,BorderLayout.SOUTH); PnlMenu.add(a2,BorderLayout.NORTH); PnlMenu.add(a3,BorderLayout.EAST); PnlMenu.add(albl,BorderLayout.CENTER); 用于点击按钮跳转到页面代码: if(e.getSource=a1)/进入取款界面 if(e.getSource=a2)/进入余额查看界面 if(e.getSource=a3)/进入密码修改界面 clt.show(fram,"Chgpwd"); return; float mleft=act.queryBalance(gid); lbleft.setText("帐号余额为:¥ "+mleft); lbleft.setFont(new Font("楷体",Font.BOLD,15); clt.show(fram,"Queryleft"); return; clt.show(fram,"Getmoney"); return; 取款页面可以根据想要去的金额去点击按钮取钱,也可以输入自定义金额取钱,但两种方法都不能透支。 取款页面代码: public void showGetMoney PnlGetmoney=new Panel; GridLayout gdo4=new GridLayout(4,2); PnlGetmoney.setLayout(new BorderLayout); Label blbl=new Label("请选择取款金额"); blbl.setFont(new Font("楷体",Font.BOLD,24); msg3=new Label(""); p1=new Panel; b1=new Button("100"); b2=new Button("500"); b3=new Button("1000");b4=new Button("3000"); b5=new Button("5000");b6=new Button("自定义"); b1.setFont(new Font("楷体",Font.BOLD,15); b2.setFont(new Font("楷体",Font.BOLD,15); b3.setFont(new Font("楷体",Font.BOLD,15); b4.setFont(new Font("楷体",Font.BOLD,15); b5.setFont(new Font("楷体",Font.BOLD,15); b6.setFont(new Font("楷体",Font.BOLD,15); b1.addActionListener(this); b5.addActionListener(this); b2.addActionListener(this); b6.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); b7=new Button("返回"); b7.setFont(new Font("楷体",Font.BOLD,15); b7.addActionListener(this); b8=new Button("退出"); b8.setFont(new Font("楷体",Font.BOLD,15); b8.addActionListener(this); Panel bpnl1=new Panel; bpnl1.add(blbl); Panel bpnl3=new Panel; bpnl3.add(b7); bpnl3.add(b8); Panel bpnl2=new Panel; bpnl2.setLayout(gdo4); bpnl2.add(b1); bpnl2.add(b2); bpnl2.add(b3); bpnl2.add(new Label); bpnl2.add(b4); bpnl2.add(msg3); bpnl2.add(b5); bpnl2.add(new Label); bpnl2.add(b6); bpnl2.add(new Label); bpnl2.add(bpnl3); bpnl2.add(new Label); PnlGetmoney.add(bpnl1,BorderLayout.NORTH); PnlGetmoney.add(bpnl2,BorderLayout.CENTER); PnlGetmoney.add(bpnl3,BorderLayout.SOUTH); public boolean reduceMoney(String tgid,float money) String ssql; if(this.queryBalance(tgid)<money) return false; ssql="update guest set gmoney=gmoney-"+money+" where gid='"+tgid+"'" if(das.exeSql(ssql) return true; /扣款成功 else return false; /扣款未成功 protected void finalize/析构函数 das.finalize; 点击对应按钮跳到相应的页面代码机取钱过程代码: if(e.getSource=b1)/执行取款100操作 if(e.getSource=b2)/执行取款500操作 if(e.getSource=b3)/执行取款1000操作 if(!act.reduceMoney(gid,1000) nstate=3; clt.show(fram,"Msg"); return; lblMsg.setText("余额不足!"); else lblMsg.setText(mce.printBill(1000,gid,act.queryBalance(gid); if(!act.reduceMoney(gid,500) nstate=3; clt.show(fram,"Msg"); return; lblMsg.setText("余额不足!"); else lblMsg.setText(mce.printBill(500,gid,act.queryBalance(gid); if(!act.reduceMoney(gid,100) nstate=3; clt.show(fram,"Msg"); return; lblMsg.setText("余额不足!"); else lblMsg.setText(mce.printBill(100,gid,act.queryBalance(gid); if(e.getSource=b4)/执行取款3000操作 if(e.getSource=b5)/执行取款5000操作 if(e.getSource=b6)/进入手动输入金额取款界面 y2.setVisible(true); msgstr.setText("请输入金额"); msgstr.setFont(new Font("楷体",Font.BOLD,15); ta.setText(""); msghint.setText(""); clt.show(fram,"input"); return; if(!act.reduceMoney(gid,5000) nstate=3; clt.show(fram,"Msg"); return; lblMsg.setText("余额不足!"); else lblMsg.setText(mce.printBill(5000,gid,act.queryBalance(gid); if(!act.reduceMoney(gid,3000) nstate=3; clt.show(fram,"Msg"); return; lblMsg.setText("余额不足!"); else lblMsg.setText(mce.printBill(3000,gid,act.queryBalance(gid); 自定义取款: if(msgstr.getText.indexOf("金额")>0)/手动输入金额操作 try gmoney=Float.parseFloat(ta.getText); if(act.reduceMoney(gid,gmoney) else lblMsg.setText("余额不足!"); lblMsg.setFont(new Font("楷体",Font.BOLD,15); nstate=3; lblMsg.setText(mce.printBill(gmoney,gid,act.queryBalance(gid); nstate=3; catch(NumberFormatException e2)/输入非法的金额 finally clt.show(fram,"Msg"); return; lblMsg.setText("您输入的金额错误!"); nstate=2; if(e.getSource=a4 | e.getSource=b8 | e.getSource=c2 | e.getSource=d2 | e.getSource=x1 | e.getSource=y1 | e.getSource=quit)/退出系统 this.gid="" this.pwd="" act.finalize; dac.finalize; rcd.exitCard; 查询界面; public void showQueryLeft PnlQueryleft=new Panel; PnlQueryleft.setLayout(new BorderLayout); Label clbl=new Label("帐户余额"); clbl.setFont(new Font("楷体",Font.BOLD,24); clbl.setAlignment(Label.CENTER); lbleft=new Label(""); Panel cpnl1=new Panel; cpnl1.add(lbleft); Panel cpnl2=new Panel; c1=new Button("返回"); c1.setFont(new Font("楷体",Font.BOLD,15); c1.addActionListener(this); c2=new Button("退出"); c2.setFont(new Font("楷体",Font.BOLD,15); c2.addActionListener(this); cpnl2.add(c1); /cpnl2.add(edok);Button edok=new Button("确定"); cpnl2.add(c2); PnlQueryleft.add(clbl,BorderLayout.NORTH); PnlQueryleft.add(cpnl1,BorderLayout.CENTER); PnlQueryleft.add(cpnl2,BorderLayout.SOUTH); public float queryBalance(String gid) ResultSet rs; String ssql="select * from guest where gid='"+gid+"'" float balance=0; try catch(Exception e) finally return balance; System.out.println(e.toString); rs=das.getData(ssql); rs.next; balance=rs.getFloat("gmoney"); 系统提示界面非法操作或操作成功的时候跳转到此界面 代码: public void showHint PnlMsg=new Panel; PnlMsg.setLayout(new BorderLayout); Label elbl=new Label("系统提示"); elbl.setFont(new Font("楷体",Font.BOLD,24); elbl.setAlignment(Label.CENTER); lblMsg=new Label(""); Panel epnl=new Panel; epnl.add(lblMsg); Panel epnl2=new Panel; epnl2.add(back); epnl2.add(quit); PnlMsg.add(elbl,BorderLayout.NORTH); PnlMsg.add(epnl,BorderLayout.CENTER); PnlMsg.add(epnl2,BorderLayout.SOUTH); 截图: 四、心得体会 在这次的期中课程设计中,我主要运用了Java语言的图形用户界面设计、异常处理、Swing控件,输入输出等,综合运用了Java语言。我深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现基本功能,在完成设计的同时培养了自己的编程思维,为以后做别的设计打下基础。此次实训基本把我们本学期所学的内容进行综合应用,让我们更加容易简单的了解体验到了未来工作的一般状况,锻炼了我的实际操作能力,同时也在一定程度上增加了同学们对Java语言学习的信心,一个简单的程序,能通过运用自己所学也是可以实现的,让我们不在对编程感觉那么神秘。这次实训课我们是使用java编写简单的ATM登录系统的设计,通过这次的实训课我不仅复习了这学期的java编程设计基础知识,并且增强了我对java语言的领悟和应用,同时也更深刻的懂得了学好学会了并不是代表能够真正的在实践中运用得流畅,这次实践给了我们一个既动手又动脑独立实践的机会,但其中也包含了自我寻找资料的能力和同学间的合作能力。这个系统将理论和实践相结合,提高自己的分析、解决问题的能力,并且让我明白了计算机的技术一定要从实际出发才能真正的提高自己的能力;团队合作与交流很重要,“团结就是力量”在本次项目开发中真的体会得到,在做项目时,小组成员要知道本小组所做项目的基本构想框架,要做什么、实现什么。如果有自己的想法就要和自己的伙伴进行交流。