java自动取款机模拟程序报告含源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

合肥学院
计算机科学与技术系
课程设计报告
2013~2014学年第一学期
课程面向对象课程设计
课程设计名称自动取款机模拟程序
学生姓名夏中雨
学号1204013021
专业班级12计本(3)
指导教师胡春玲、张贯虹
20 13年12月
一、前言 3
二、需求分析 3
1、功能需求 3
A、管理端方面 3
B、客户端方面 3
2、基本的安全控制机制。

4
3、性能需求: 4
4、出错处理需求 4
三、设计理论和环境 4
1、系统设计理论 4
2、系统设计环境 4
四、系统数据库设计 4
1、数据库构建语句 4
2、表构建语句 5
五、总体设计 5
B、管理端界面 5
3、删除银行卡账户对话框: 7
4、查询: 7
5、显示全部: 8
C、客户端界面 9
2、客户端操作界面 10
3、余额查询 10
4、修改密码 11
5、存款 11
6、取款 12
六、具体设计 12
1、各类主要功能及相互关系。

12
2、关键代码。

13
(2)、删除银行卡 14
(3)、验证客户登陆 15
(4)、余额查询 16
(5)、修改密码 17
(7)、取款 19
(8)、连接数据库 21
七、总结 21
八、参考文献 22
1、前言
基于进一步巩固、加深学生所学专业课程《JAVA语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力的考虑和全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。

学院进行了此项课程设计教学活动,此次课程设计的主要任务是为了训练同学们利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。

针对这次课程设计任务,我对于给定的题目,进行了详细分析,理清了思路,弄明白了应该分几步走,每一步应该怎么走。

顺利完成了课程设计任务。

项目任务要求:
1、程序分为两部分:管理端和客户端。

2、管理端负责管理所有的银行卡,管理员(省略身份验证)可以增加和删除银行卡。

(1)每张银行卡由卡号唯一标识,卡号由12位阿拉伯数字组成;
(2)新增的银行卡密码均为“123456”,卡内金额均为0元;
(3)只有管理员增加的银行卡才能登陆客户端;
(4)删除后的银行卡将不能再登陆客户端。

3、客户端负责常见的取款机操作。

(1)客户端需要登陆,用户输入正确的银行卡号和密码,系统核对无误后才能进行操作;
(2)登陆后,用户可以进行查询余额、取款、存款和修改密码的操作;
(3)修改密码时,用户需输入两次新密码,确定无误后方可更改;
(4)取款和存款操作,有操作结果提示,如“操作成功”或“余额不足,操作失败”等。

4、界面尽可能模仿自动取款机的实际界面。

5、对于失败操作,尽可能采用异常捕捉的机制来完成。

二、需求分析
1、功能需求
自动取款机模拟程序需要实现的功能主要包括以下几个方面:
A、管理端方面
新增银行卡账户
删除银行卡账户
B、客户端方面
查询账户余额
修改密码
存款
取款
2、基本的安全控制机制。

客户从客户端登录时,需要进行身份,身份合法才能进入本系统
客户修改密码时,必须输入两次新密码,确保无误后方可修改且新密码必须与旧密码不同
取款和存款操作时,要有操作提示,确保客户对每一步的操作不存在疑惑和不解
3、性能需求:
通过分析,系统性能需求如下:
系统的高速性、稳定性、安全性。

系统人机界面友好,易学易用。

系统维护成本较低。

4、出错处理需求
当操作中出现了不正确的操作内容时需要停止该操作并给出提示。

三、设计理论和环境
1、系统设计理论
该程序使用JDBC-ODBC桥与数据库连接,主要定义:主类和操作类。

主类的主要功能是提供等待用户的操作的主界面(菜单)。

操作类中定义与数据库的连接、提供各种操作界面(增、删、改及统计等操作)。

2、系统设计环境
该系统程序设计在Eclipse、JDK1.5或JBuilder运行环境下实现。

四、系统数据库设计
本软件系统经过我详细分析,我认为所用到的数据库内仅需一张信息表,针对于此,我前期所做的构建数据库及信息表的数据库代码如下:
1、数据库构建语句
CREATE DATABASE Bank
ON
(NAME = Bank,
FILENAME=
‘C:\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\Data\Bank.mdf’, SIZE = 10MB,
MAXSIZE = 50MB,
FILEGROWTH = 5MB)
LOG ON
(NAME = Bank_log.ldf,
FILENAM=‘C:\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\Data\Bank_log .ldf’,
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB)
2、表构建语句
CREATE TABLE 信息(
卡号 CHAR(12) PRIMARY KEY,
密码 CHAR(6) NOT NULL,
余额 MONEY NOT NULL)
五、总体设计
A、主登陆界面:
用户选择登陆端口选择管理端入口进入管理端,选择客户端入口进入客户端
类‘系统开始’实现此页面布局,点击“管理端入口”调用类‘管理端口’进入管理操作界面,点击“客户端入口”调用类‘客户端口’进入客户操作界面。

B、管理端界面
1、主界面:程序的主界面,实现基本的查询功能及响应各种动作按钮
类‘管理端口’和类‘管理界面’实现此页面布局,点击“添加”,调用类‘新建银行卡’进入新建银行卡界面;点击“删除”,删除选定的银行卡账户;点击“返回”,返回上一层界面。

2、增加银行卡账户界面:
新增银行卡,新用户可利用此账户的卡号和密码登陆修改账户信息
点击“添加”时,连接数据库,执行相应的instert SQL语句实现新增银行卡账户功能,点击“取消”时,关闭此界面,调用类‘管理界面’,返回管理端主界面。

3、删除银行卡账户对话框:
删除选定的银行卡后,该银行卡用户将不能再利用该卡号和密码登陆客户端修改账户信息
点击“确定”,将删除选定的账户信息,点击“取消”,取消删除账户信息。

4、查询:
管理员可根据账户卡号来查询账户信息
点击操作主界面上“查询”按钮,显示卡号为输入卡号值的账户信息。

5、显示全部:
点击此按钮,管理员可一览所有帐户信息
点击操作主界面上“显示全部”按钮,显示所有账户信息。

C、客户端界面
1、客户端登陆界面:
用户通过输入用户名和密码验证登陆
类‘客户端口’实现此页面布局,用户输入卡号和密码,点击“确认”,系统验证用户输入的密码与输入的卡号相对应的密码是否相同,验证合法后调用类‘客户界面’,进入客户操作主界面。

若非法,则关闭界面,拒绝用户登陆退出系统。

2、客户端操作界面
类‘客户界面’实现此页面布局,主要含有六个按钮“余额查询”,“存款”,“退卡”,“修改密码”,“取款”,“返回”六个按钮及相应的响应方法。

当点击各种按钮时,调用相应的响应方法或相应的类,实现各种操作;
3、余额查询
点击余额查询,显示账户余额。

4、修改密码
设置用户修改密码界面布局,用户需两次输入新密码且两次输入相同,点击“确定”执行SQL语句,修改账户信息。

点击“取消”,取消修改密码。

5、存款
用户输入存入的金额数点击“确定”执行SQL语句,修改账户信息。

点击“取消”取消存款操作。

6、取款
用户点击金额按钮取出或输入与界面上金额不同的金额,点击“确定”执行SQL语句,修改账户信息。

点击“回主菜单”,取消取款操作。

六、具体设计
1、各类主要功能及相互关系。

link:连接数据库,其余类若要连接数据库,需调用此类。

Main: 主类,软件运行入口。

系统开始:主登陆界面,根据选择的方式,分别调用类‘管理端口’或类‘客户端口’进入管理界面或客户界面。

管理端口:一个扩展JFrame的容器类,设置管理端主界面布局,包含一个管理界面类(扩展类)及分别实现添加、删除、返回等功能的按钮,包括相应的响应方法。

管理界面:一个扩展JPanel的容器类,包含一个DefaultTableModel的表用来显示账户信息及两个分别实现查询功能及显示全部账户信息功能的按钮,包括相应的响应方法。

新建银行卡:一个扩展JFrame的容器类,当在类‘管理界面’点击“添加”按钮时被调用。

此类包含两个按钮,点击“添加”时,连接数据库,执行相应的instert SQL语句实现新增银行卡账户功能,点击“取消”时,关闭此界面,调用类‘管理界面’,返回管理端主界面。

客户端口:扩展JFrame类的容器类,设置客户端登陆界面布局,含有两个客户文本框,点击“确认”,系统验证用户输入的密码与输入的卡号相对应的密码是否相同,验证合法后调用类‘客户界面’,进入客户操作主界面。

若非法,则关闭界面,拒绝用户登陆退出系统。

客户界面:扩展JFrame类,设置客户端操作主界面布局,主要含有六个按钮“余额查询”,“存款”,“退卡”,“修改密码”,“取款”,“返回”六个按钮及相应的响应方法。

当点击各种按钮时,调用相应的响应方法,实现各种操作。

存款:扩展JFrame类,设置用户存款取款界面布局,用户输入存入的金额数点击“确定”执行SQL语句,修改账户信息。

取款:扩展JFrame类,设置用户取款取款界面布局,用户点击金额按钮取出或输入与界面上金额不同的金额,点击“确定”执行SQL语句,修改账户信息。

修改密码:扩展JFrame类,设置用户修改密码界面布局,用户需两次输入新密码且两次输入相同,点击“确定”执行SQL语句,修改账户信息。

2、关键代码。

(1)、新建银行卡
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btnAdd){//点击确定按钮
try{
Long a;
String number = txtCard.getText();
String mm = "123456";//默认密码是123456
String ye = "0";//默认余额是0
a=Long.parseLong(number);//将输入卡号转换为长整形
String addDatas[] = new String[3];
addDatas[0]=number;
addDatas[1]=mm;
addDatas[2]=ye;
if(addDatas[0].length()==12){//判断卡号是否为12位
addEmployee(addDatas);//调用addEmployee方法
eface.showData("");
this.dispose();
}else
labCard2.setText("格式错,新建卡号必须为12位数字");
}catch(NumberFormatException g){
labCard2.setText("格式错误,新建卡号必须为12位数字"); }//若输入卡号转换为长整形出现异常将捕捉,判断输入是否由数字构成 }
if(e.getSource()==btnCancel){
this.dispose();//点击取消,退出界面
}
}
private void addEmployee(String[] addDatas){
try {
String sql = "insert into 信息 values('"+addDatas[0]+"',";
sql+="'"+addDatas[1]+"',";sql+="'"+addDatas[2]+"')";//插入
link link1=new link();//连接数据库
this.stm=link1.stm;
this.conn=link1.conn;
stm.executeUpdate(sql);//执行SQL语句
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
stm.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(2)、删除银行卡
if(e.getSource()==btnDel){
if(emp.updateKey!=null){ if(JOptionPane.sh owConfirmDialog(this,"if(e.getSource()==btnDel){
if(emp.updateKey!=null){
if(JOptionPane.showConfirmDialog(this,"确定删除记录吗?","员工删除",JOptionPane.WARNING_MESSAGE)==JOptionPane.YES_OPTION){
deleteData();
emp.updateKey = null;
String queryString="";
emp.showData(queryString);
}
//创建一个对话框 }",JOptionPane.WARNING_MESSAGE)==JOptionPane.YES_OPTION){ deleteData();//点击“确定”,调用方法deleteDate
emp.updateKey = null;
String queryString="";
emp.showData(queryString);//删除后,再次显示全部账号信息
}
}
private void deleteData() {
try {
String sql = "delete from 信息where 卡号='"+emp.updateKey+"'";//删除语句
link link1=new link();//连接数据库
this.stm=link1.stm;
this.conn=link1.conn;
stm.executeUpdate(sql);//执行删除SQL语句
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
stm.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
(3)、验证客户登陆
public void actionPerformed(ActionEvent e) {
if(e.getSource()==okey){//点击“确定”
String number = txtCard1.getText();//获取的卡号
String mm=txtCard2.getText();//获取的密码
String Datas[] = new String[2];
Datas[0]=number;
Datas[1]=mm;
yz(Datas);//调用方法yz
}
if(e.getSource()==cancel)
new系统开始();
this.dispose();//点击“取消”,关闭界面,返回上一层界面
}
public void yz(String[] Datas){
try{
int a,b;
Long c;
a=Integer.parseInt(Datas[1]);
c=Long.parseLong(Datas[0]);
String sql="select * from 信息where 卡号='"+Datas[0]+"'";//检索与输入的卡号相对应的密码
link link1=new link();//连接数据库
this.conn=link1.conn;
this.stm=link1.stm;
rs=stm.executeQuery(sql);//执行SQL语句
while(rs.next()){
String mm=rs.getString(2);
b=Integer.parseInt(mm);
if(a==b){
new客户界面(Datas[0],Datas[1]);
this.dispose();
}
else
throw new Exception();
}
} catch (Exception e) {
this.dispose();
}finally{
try {
rs.close();
stm.close();
conn.close();
}catch(NullPointerException e){
this.dispose();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(4)、余额查询
public void showye(){
try {
String sql="select * from 信息 where 卡号 ='"+卡号+"'";
link link1 = new link();//连接数据库
this.conn=link1.conn;
this.stm=link1.stm;
rs=stm.executeQuery(sql);//执行查询SQL语句
while(rs.next()){
String str="余额为"+rs.getString("余额")+",请选择下一步操作";
labCard2.setText(str);//在界面上显示余额
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
rs.close();
stm.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(5)、修改密码
public void actionPerformed(ActionEvent e) {
if(e.getSource()==butcancel){
this.dispose();
bCard2.setText("修改密码操作失败");
}//点击取消,取消修改密码操作
if(e.getSource()==butokey){
String mm1,mm2;
int a,b,c;
mm1=text1.getText();//获取第一次输入的新密码
mm2=text2.getText();//获取第二次输入的新密码
try{
a=Integer.parseInt(mm1);
b=Integer.parseInt(mm2);
c=Integer.parseInt(czjm.密码);
if(mm1.length()==6){//判断新密码是否为6位
if(a==b){//判断两次输入是否相同
if(a!=c){
altermm(mm1);//调用方法altermm
this.dispose();
bCard2.setText("修改密码成功,请选择下一步操作");
}else
label3.setText("新密码必须与旧密码不同");
}else
label3.setText("两次输入的密码必须相同");
}
else
label3.setText("密码必须为六位数字");
}catch(NumberFormatException g){
label3.setText("密码必须为六位数字");
}
}
}
public void altermm(String mm){
try{
String sql="update 信息 set 密码='"+mm+"' where 卡号 ='"+czjm.卡号+"'";
link link1=new link();//连接数据库
this.conn=link1.conn;
this.stm=link1.stm;
stm.executeUpdate(sql);//执行更新SQL语句
}catch(SQLException e){
bCard2.setText("修改密码操作失败");
} catch (ClassNotFoundException e) {
bCard2.setText("修改密码操作失败");
}finally{
try {
czjm.密码=mm;
stm.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(6)、存款
if(e.getSource()==butokey){//点击确定按钮,确定存款
try{
String money;
double mon;
money=text.getText();//获取输入金额
mon=Double.parseDouble(money);
if(mon%100==0){//判断输入的金额是否合理
ck(mon);//调用方法ck
this.dispose();
bCard2.setText("存款成功,请选择下一步操作");
}else
label2.setText("存入金额最小面额为100元");
}catch(NumberFormatException q){
label2.setText("输入金额格式不正确");
}
}
public void ck(Double money){
try{
String sql="select * from 信息 where 卡号 ='"+czjm.卡号+"'";
link link1=new link();//连接数据库
this.conn=link1.conn;
this.stm=link1.stm;
rs=stm.executeQuery(sql);//执行查询SQL语句,查询原有余额
while(rs.next()){
money=money+Double.parseDouble(rs.getString("余额"));
//在获取的输入金额上加上原有金额
}
}catch(Exception f){
f.printStackTrace();
}
try{
String sql="update 信息set 余额='"+Double.toString(money)+"'where 卡号 ='"+czjm.卡号+"'";
stm.executeUpdate(sql);//执行更新SQL语句
}catch(Exception e){
e.printStackTrace();
}finally{
try {
rs.close();
stm.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(7)、取款
public void actionPerformed(ActionEvent e) {
if(e.getSource()==exit){//点击退出,取消取款,关闭界面
this.dispose();
客户界面 cajm=new客户界面(czjm.卡号,czjm.密码);
bCard2.setText("取款失败,请选择下一步操作");
}if(e.getSource()==壹){//取100元
qk(100); //调用方法qk取款
}if(e.getSource()==贰){//取200元
qk(200); //调用方法qk取款
}if(e.getSource()==伍){//取500元
qk(500); //调用方法qk取款
}if(e.getSource()==拾){//取1000元
qk(1000); //调用方法qk取款
}if(e.getSource()==廿伍){//取2500元
qk(1500); //调用方法qk取款
}if(e.getSource()==伍拾){//取5000元
qk(5000); //调用方法qk取款
}if(e.getSource()==okey){//点击确定,取款金额位用户输入金额
try{
String money;
double mon;
money=text.getText();//获取用户输入金额
mon=Double.parseDouble(money);
if(mon%100==0){//判断取款金额是否合理
qk(mon); //调用方法qk取款
this.dispose();//取款后,关闭界面
}else
label2.setText("取出金额最小面额为100元");
}catch(NumberFormatException q){
label2.setText("输入金额格式不正确");
}
}
}
public void qk(double money){
double mon = 0;
try{
String sql="select * from 信息 where 卡号 ='"+czjm.卡号+"'";
link link1=new link();//连接数据库
this.conn=link1.conn;
this.stm=link1.stm;
rs=stm.executeQuery(sql);//执行搜索SQL语句
while(rs.next()){
mon=Double.parseDouble(rs.getString("余额"));
}
}catch(Exception f){
f.printStackTrace();
}
try{
if(mon>money){//判断是否余额不足
String sql="update 信息set 余额='"+Double.toString(mon-money)+"'where 卡号 ='"+czjm.卡号+"'";
stm.executeUpdate(sql);//执行更新SQL语句
this.dispose();//取款后,关闭界面
客户界面 cajm=new客户界面(czjm.卡号,czjm.密码);
bCard2.setText("取款成功,请选择下一步操作");
}
else
throw new Exception();
}catch(Exception e){
this.dispose();
客户界面 cajm=new客户界面(czjm.卡号,czjm.密码);
bCard2.setText("余额不足");
}finally{
try {
rs.close();
stm.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(8)、连接数据库
public link() throws SQLException, ClassNotFoundException{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
url = "jdbc:sqlserver://localhost:1433;databasename=Bank";
conn = DriverManager.getConnection(url,"sa","123456");
stm = conn.createStatement();
}
7、总结
这次的JAVA课程设计我可以说是费了很大的心思,当初换了题目也是出于它的功能简单,实现的任务相比于原题目来讲少了很多,在一个将要考试要着手复习的时间内,做一个任务简单的题目很明显是一个明智的选择,但我相信就是在这么仓促的时间内做原先分配的题目,我也能做的出来。

因为先前在另一个老师指导下完成过类似的与数据库相连接的java任务,所以在做这个软件时,我无疑比其他同学占了很大的优势,在其他同学还在为怎么连接数据库发愁而满世界查找资料时,我已经连接好数据库,并在准备下一步工作了。

虽然我清楚每一步应该做些什么,但是在实际写代码时,我还是碰到了各种不小的麻烦,有的问题甚至耗费了一下午的时间,但庆幸这些都没有阻挡住我的脚步,最能将这样一件作品交出来。

当作品完成并测试正常时,我感到无尽的喜悦和自豪,是属于作为一个程序员的自豪,写程序就如同创造生命,我们就是造物主,好的作品更是蕴含美学意味。

“文章本天成,妙手偶得之”,一个好的软件作品更是如此,一个好的软件作品之所以好很有可能就来自创作者的一个突发奇想,我仍然记得当自己想要为软件界面添加背景,并为之而查找资料修改代码的情景。

此次课程设计最大的收获应该是编写代码时对异常处理机制的运用,一个运行正常甚至运行巧妙的软件程序一定少不了对异常处理机制的巧妙运用,比如在修改密码和新建银行卡的执行代码中异常情况有很多,好的异常处理机制就在这里发挥了很大的作用,它们保证了代码的健康性。

总之这次课程设计收获很大,更是对做项目产生了很大兴趣,希望以后能做更多的项目,并在其中能有学习收获,享受成功喜悦。

8、参考文献
【1】张永常,JAVA程序设计实用教程,电子工业出版社
【2】施霞萍,JAVA程序设计教程,机械工业出版社
【3】辛运帏等,Java程序设计,清华大学出版社
【4】印旻, Java与面向对象程序设计教程,高等教育出版社
【5】耿祥义, Java课程设计,清华大学出版社
【6】吕凤羽、马皓《JAVA程序设计》清华大学出版社
【7】黄小东《Java课程设计案例精编》中国水利水电出版社【8】印旻《Java与面向对象程序设计》清华大学出版社。

相关文档
最新文档