面向对象程序设计Java+ATM银行系统.docx
《面向对象程序设计Java+ATM银行系统.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计Java+ATM银行系统.docx(31页珍藏版)》请在冰豆网上搜索。
![面向对象程序设计Java+ATM银行系统.docx](https://file1.bdocx.com/fileroot1/2023-2/22/fc27cdc6-3737-4282-8e68-d66610eca652/fc27cdc6-3737-4282-8e68-d66610eca6521.gif)
面向对象程序设计Java+ATM银行系统
南华大学
计算机科学与技术学院
课程设计报告
(2008~2009学年度第一学期)
课程名称
面向对象程序设计—Java
课程设计名称
ATM银行系统
组长
包伟辉
学号
20064440147
组员
李阳
学号
20064440119
组员
包月涛
学号
20064440146
专业
计算机专业
班级
计算机061班
地点
宏辰7-103
教师
谭敏生
一、系统分析3
一、系统分析
在信息高速发展的当今时代,ATM自动取款机已在日常生活中普遍存在,ATM是AutomaticTellerMachine的缩写,意思是自动柜员机,因大部分用于取款,又称自动取款机。
它是一种高度精密的机电一体化装置,利用磁性代码卡或智能卡实现金融交易的自助服务,代替银行柜台人员的工作。
可提取现金、查询存款余额、进行账户之间资金划拨、余额查询等工作;还可以进行现金存款(实时入账)、支票存款(国内无)、存折补登、中间业务等工作。
持卡人可以使用信用卡或储蓄卡,根据密码办理自动取款、查询余额、转账、现金存款,存折补登,购买基金,更改密码等业务。
要实现这样一个系统,首先应该进行需求分析,这样才能令设计出的软件满足用户的各项功能。
下面就对在线考试系统的设计进行需求分析
1.1系统概述
ATM系统分为前台和后台,前台用于用户的登录以实现用户的取款、存款、转账、查询、修改、取卡等功能;后台用于管理员管理和维护用户的信息实现的功能为开户、销户、查询、修改用户的各种信息。
本系统主要以JAVA为开发平台,采用JAVA+ECLIPSE+ACCESS的开发模式,ATM系统以数据库为中心,由数据库控制整个系统的运作。
ATM取款系统的目的是在网络上搭建一个管理员管理系统和用户取款系统,针对不同的功能进行不同的操作。
用户要取款时只需到ATM自动取款机上登录就可进行取款、存款、转账、查询、修改、取卡等操作,而管理员可在柜台前管理和维护用户的各种信息。
1.2系统需要解决的主要问题
首先,因为ATM取款机是面向特定的某些对象的,所以用户到ATM取款机进入系统操作时应该进行身份验证,用户通过卡号验证进入ATM取款机系统后,应该能根据自己的需要进行取款、存款、转账、查询、修改、取卡等操作,对于每个用户来说,ATM自动取款机的功能都就是相同的,但个人需要操作并不相同。
管理员进入管理员系统,可以查看和修改用户的信息,管理员系统是基于网络环境,卡号应从服务器的数据库随机抽取生成的。
另外,管理员系统还应该对用户实现开户、销户、查询、修改等功能。
1.3系统应具备的基本功能
1.3.1用户基本功能
用户登录:
用户可以用卡及密码进行登录,登录后用户可以进行必要的操作。
用户取款功能:
用户可以根据自己的需要进行取款。
用户存款功能:
用户可以利用此功能存入相应的金额。
用户查询功能:
用户可以查询余额。
用户改密功能:
用户可以用此功能修改自己银行卡的密码。
用户取卡功能:
用户操作完可取卡退出。
1.3.2管理员基本功能
开户:
管理员可以用此功能为用户办理银行卡。
销户:
管理员可取消用户对银行卡的使用权。
查询:
管理员可查询用户的基本信息。
修改:
管理员可以修改用户的基本信息。
改密:
管理员可进行自行改密。
1.3.3该系统的额外功能
用户转帐功能:
用户可以用这个功能进行卡与卡之间的金额转帐。
管理员查看IP功能:
管理员可查看当前IP地址。
打印功能:
可以打印出各种交易记录。
1.4系统设计开发工具与环境
1.4.1.开发工具Eclipse
1.4.2.开发环境
•开发语言:
Java、J2SE
•数据库:
Access
•操作系统:
WindowsXP
•客户端:
IE6.0
•开发工具:
Eclipse
硬件方面:
处理器:
IntelPentium166MX或更高。
内存:
512M以上。
硬盘空间:
1GB以上。
显卡:
SVGA显示适配器
软件方面:
操作系统:
Windows98/ME/2000/XP
二、系统设计
2.1概要设计
上图为ATM银行系统总模块功能图
2.1.1设计思想
ATM取款系统需要满足来自两个方面的需求,这两个方面分别是管理员和用户。
用户的需求是取款、存款、转账、查询、修改、取卡等功能;管理人员的功能较为复杂,包括对用户实现开户、销户、查询、修改和维护用户的各种信息。
用户可以根据自己的银行卡通过ATM机登录到用户系统,登录成功后可进行六种操作,分别是取款、存款、转账、查询、修改、取卡。
不能查看他人的信息。
这样就可以保证其他用户信息的保密性。
管理人员有对用户实现开户、销户、查询、修改和维护用户的各种信息等记录的权限,所以需对管理员登陆模块进行更多的考虑。
2.1.2系统功能模块划分
一般可分为:
用户模块:
包括取款模块、存款模块、转账模块、查询模块、修改模块、取卡模块。
管理员模块:
包括文件模块、系统管理模块、操作模块、关于模块、交易记录模块。
其中文件模块包括:
开户、销户。
系统模块包括:
改密、注销。
操作模块包括:
查询、修改。
关于模块包括:
版本。
交易模块包括:
打印。
(各模块功能图:
见P52.1)
2.1.3ATM银行系统各模块图
在概念设计阶段中,设计人员从用户的角度看待数据及处理要求和约束,产生一个反映用户观点的概念模式。
然后再把概念模式转换成逻辑模式。
将概念设计从设计过程中独立开来,使各阶段的任务相对单一化,设计复杂程度大大降低,不受特定DBMS的限制。
各个E-R图分析如下:
用户系统E-R实图
管理员系统E-R实图
2.1.4数据库的逻辑设计
由于概念设计的结果是ER图,DBMS一般采用关系型(我们所使用的MSACCESS就是关系型的DBMS),因此数据库的逻辑设计过程就是把ER图转化为关系模式的过程。
由于关系模型所具有的优点,逻辑设计可以充分运用关系数据库规范化理论,使设计过程形式化地进行。
设计结果是一组关系模式的定义。
1.数据字典
取款=卡号+密码+取款金额。
查询=卡号+密码+查询余额。
存款=卡号+密码+存款金额。
改密=卡号+密码+旧密码+新密码。
转账=卡号+密码+收款人卡号。
开户=客户编号+姓名+身份证+电话+地址+卡号+货币类型+存款类型+金额+密码+余额+开户日期
销户=卡号
打印=交易日期+卡号+交易类型+交易金额
2.具体表——数据库(Bank.mdb)
表一(管理员-admin)字段及内容
表二(用户表-userInfo)字段及内容
表三(卡号表-cardInfo)字段及内容
表四(交易表-transInfo)字段及内容
2.2详细设计
2.2.1管理员窗体模块组成
1.文件模块
功能:
文件模块包括开户和销户两个小模块,开户可以为用户办理银行卡,销户可以取消用户的卡号。
2.系统管理模块
功能:
系统管理模块包括改密和注销两个小模块,通过改密功能,管理员可自行修改密码,注销可返回到登录界。
3.操作模块
功能:
操作模块包括查询、修改和查看IP三个小模块,其中,查询中还包括查询用户信息和查询卡信息模块;修改中还包括修改用户信息和修改卡信息模块;查看IP就是查看当前工作的IP。
4.交易记录模块
功能:
交易记录模块包括打印小模块,可以打印出用户各种交易情况。
2.2.2管理员模块窗体界面及相应代码
1、窗体界面说明
(1)登录界面
管理员登录由管理员名和密码构成,在管理员输入管理员名和密码后,系统首先验证输入字符的有效性,然后调用数据库查看此管理员名是否存在或密码是否正确,最后判断管理员权限确定操作员还是管理员,并赋与不同的权限。
代码如下:
代码如下:
if(jTextField.getText().equals("")||jPasswordField.getPassword().equals("")&&jPasswordField1.getPassword().equals("")){
JOptionPane.showMessageDialog(null,"请先选择登陆角色!
");
}else{
Connectioncon;
con=db.getConn();
user=String.valueOf(jTextField.getText());
Stringpass=String.valueOf(jPasswordField.getPassword());
booleanbb=db.isValid(con,user,pass);
if(bb){
if(jTextField.getText().equals("admin")||jTextField.getText().equals("admin1")||jTextField.getText().equals("admin2")){
MFrmm=newMFrm();
m.setVisible(true);
close();
}else{
if(i==0)
JOptionPane.showMessageDialog(null,"密码输错3次!
请到柜台改密码!
");
else{
i--;
JOptionPane.showMessageDialog(null,"密码错误!
请重新输入!
!
");
}
}
}else{
JOptionPane.showMessageDialog(null,"该管理员不存在!
");
}
}
(2)主界面
(3)开户界面
代码如下:
publicvoiddel(){
Sqldbc=newSql();
dbc.getConn();
introw=jTable.getSelectedRow();
System.out.println(row);
if(row<0){
javax.swing.JOptionPane.showMessageDialog(null,"您还没有选中要删除的信息!
");
return;
}
Objectvalue=jTable.getValueAt(row,0);
Stringid=value.toString();
System.out.println(id);
intreturnValue;
returnValue=JOptionPane.showConfirmDialog(this,"确实要删除该记录吗?
","确认删除",JOptionPane.YES_NO_OPTION);
if(returnValue==JOptionPane.YES_OPTION){
if(dbc.executeUpdateSQL("DELETEFROMcardInfoWHEREcardID='"+id+"'")){
javax.swing.JOptionPane.showMessageDialog(this,"卡号为"+id+"的顾客信息已成功被删除!
请刷新!
");
}else{
javax.swing.JOptionPane.showMessageDialog(this,"删除失败!
请再试。
");
}
}else
return;
}
(4)销户界面
代码如下:
if(jTextField.getText().equals("")||jTextField1.getText().equals("")||jTextField2.getText().equals("")||jTextField3.getText().equals("")||jTextField4.getText().equals("")){
javax.swing.JOptionPane.showMessageDialog(null,"各栏不能为空,请重填!
");
}else{
try{
Integer.parseInt(jTextField.getText());
}catch(NumberFormatExceptionex){
javax.swing.JOptionPane.showMessageDialog(null,"请确保数量栏及单价栏为数字!
");
return;
}
if(Integer.parseInt(jTextField.getText())<0){
javax.swing.JOptionPane.showMessageDialog(null,"不能有负数!
");
return;
}
Sqldbc=newSql();
dbc.getConn();
if((dbc.executeUpdateSQL("INSERTintouserInfoVALUES("+jTextField.getText()+",'"+jTextField1.getText()+"','"+jTextField2.getText()+"','"+jTextField3.getText()+"','"+jTextField4.getText()+"')"))&&(dbc.executeUpdateSQL("INSERTintocardInfo(cardID,customerID,savingType,curType,openDate,openMoney,pass,balance)VALUES('"+jTextField5.getText()+"',"+jTextField.getText()+",'"+jComboBox1.getSelectedItem()+"','"+jComboBox.getSelectedItem()+"','"+jTextField8.getText()+"','"+Integer.valueOf(jTextField9.getText())+"','"+String.valueOf(jPasswordField.getPassword())+"','"+Integer.valueOf(jTextField6.getText())+"')"))){javax.swing.JOptionPane.showMessageDialog(null,"记录插入成功!
");
jTextField.setText("");jTextField1.setText("");jTextField2.setText("");
jTextField3.setText("");jTextField4.setText("");jTextField5.setText("");
jTextField8.setText("");jTextField9.setText("");jTextField6.setText("");
jPasswordField.setText("");
}else{
javax.swing.JOptionPane.showMessageDialog(null,"该记录插入失败!
请您重试。
");
}}
(5).改密界面
代码如下:
publicvoidquer(){
if(jPasswordField.getPassword().equals("")||jPasswordField1.getPassword().equals("")||jTextField.getText().equals("")){
avax.swing.JOptionPane.showMessageDialog(this,"任何一栏不能为空!
");
}else{
Sqldbc=newSql();dbc.getConn();booleansuccess=false;
ResultSetrs=dbc.executeQuery("SELECT*FROMadmin");
try{
while(rs.next()){
if(jTextField.getText().equals(rs.getString("user"))||jPasswordField.getPassword().equals(rs.getString("pass"))){
success=true;
}
}
if(success){
if(dbc.executeUpdateSQL("UPDATEadminSETpass='"+String.valueOf(jPasswordField1.getPassword())+"'whereuser='"+UserFrm.user+"'")){
javax.swing.JOptionPane.showMessageDialog(this,"密码修改成功。
");
}else{
javax.swing.JOptionPane.showMessageDialog(this,"密码修改失败,请重试。
");
}
}else{
javax.swing.JOptionPane.showMessageDialog(this,"用户名或原始密码错误!
请重新确认!
");
return;
}
}catch(SQLExceptionex){javax.swing.JOptionPane.showMessageDialog(this,ex.getMessage().toString());
return;
}}}
(6)查询界面
代码如下:
publicvoidselect(){
if(jTextField.getText().equals("")){
javax.swing.JOptionPane.showMessageDialog(this,"请输入查询信息");
return;
}Stringsql="";
if(((String)jComboBox.getSelectedItem()).equals("顾客编号")){
sql="select*fromuserInfowherecustomerID='"+jTextField.getText()+"'";
}elseif(((String)jComboBox.getSelectedItem()).equals("顾客姓名")){
sql="select*fromuserInfowherecustomerName='"+jTextField.getText()+"'";
}elseif(((String)jComboBox.getSelectedItem()).equals("身份证")){
sql="select*fromuserInfowherePID='"+jTextField.getText()+"'";
}
con=dbc.getConn();
intcount=0;
ResultSetrs=dbc.executeQuery(sql);
try{
while(rs.next()){
count++;
}
rs.close();
Object[][]cells=newObject[count][9];
inti=0;
rs=dbc.executeQuery(sql);
while(rs.next()){
cells[i]=newObject[]{rs.getString
(1),rs.getString
(2),
rs.getString(3),rs.getString(4),
rs.getString(5)
};
i++;
}
String[]colnames={"顾客编号","顾客姓名","身份证号","联系电话","居住地址"};
jTable=newJTable(cells,colnames);
jScrollPane.setViewportView(jTable);
}catch(SQLExceptionex){
javax.swing.JOptionPane.showMessageDialog(null,ex.getMessage().toString());
}
}
(7)修改界面
代码如下:
publicvoidquer(){
db.getConn();
ResultSetrs=db.executeQuery("SELECT*FROMcardInfo");
try{if(db.executeUpdateSQL("UPDATEcardInfoSETsavingType='"+jComboBox1.getSelectedItem()+"',curType='"+jComboBox.getSelectedItem()+"',IsReportLoss="+flag+"WHEREcardID='"+jTextField.getText().trim()+"'")){
javax.swing.JOptionPane.showMessageDialog(this,"信息修改成功。
");
}else{
javax.swing.JOptionPane.showMessageDialog(this,"信息修改失败,请重试。
");}
}catch(Exceptionex){
javax.swing.JOptionPane.showMessageDialog(this,ex.getMessage().toString());
}
}
(8)IP界面
代码如下:
import.*
InetAddressid
publicvoidinet()
{
try{
id=InetAddress.getLocalHost();
}catch(Exceptioner){
er.printStackTrace();
}
System.out.println(id);
javax.swing.JOptionPane.showMessageDialog(null,"本机ip地址:
"+id);
}
(9)打印界面
代码如下:
DYd[]=newDY[1];
d[0]=newDY(jTextField.getText(),jTextField1.getText(),jTextField2.getText(),jTextField3.getText());
newFile("D:
\\java作业\\DBATM\\文档.txt");
DYda=newDY();
da.writerIO(d,file);
da.readerIO(file);
JOptionPane.showMessageDialog(null,"交易记录打印成功");