欢迎添加微信互相交流学习哦!
项目源码:https://gitee.com/oklongmm/biye
题 目: 银行ATM管理系统
一. 设计目的
银行ATM管理是银行业务流程中十分重要的且必备的环节,由于银行有大量数据需要处理,全部采用人工方式明显不现实:这不仅需要花费很高的成本,而且处理事务的效率和质量都存在很大的问题,出于这些问题的考虑,使用计算机来处理这类问题就成为一个相当理想的方案。利用计算机可以极大地降低成本,更重要的是可以几乎没有错误地高效地处理所有的事务,所以做一款基于银行ATM管理方面的系统是十分必要的。
本次课程设计通过对《银行ATM管理系统》中银行业务流程的基本实现以及用户环节的事务处理,旨在体验数据库设计和实现的基本过程中掌握数据库模式的设计、分析和实现方法,了解数据库应用系统软件开发的一般过程。
二. 设计内容
分别完成银行业务功能、ATM功能和用户管理功能,并设计数据库以支持这些功能的实现,最后通过代码进行具体实现以及数据库链接。
所用数据库:SQL Server 2008
开发语言:Java
数据库设计:使用了六张表,分别为:管理员表(admin)、ATM机表(ATM)、ATM机出纳
表(ATMOutIn)、银行柜台出纳表(BankOutIn)、银行卡表(card)、用户
表(users)。
三个触发器,分别为:冻结用户账号操作(userstatus_update)、
ATM机存取款操作(ATMOutIn_insert)和
银行存取款操作(BankOutIn_insert)。
一个视图、一个虚表:用户操作查询
(allInfo(userId,cunquTime,cunquAddress,cunquMoney,cunq
uSummary,balanceMoney))。
银行业务功能:设置管理员账号,赋予管理员权限以实现开户、销户、存款、取款、查询、办卡和挂失功能。
ATM功能:ATM机连接系统数据库,实现用户登录、存(取)款以及用户查询功能。
用户管理:通过登录功能获得系统数据库中自己的用户信息,并有权限修改系统允许用
户修改的信息。
三.概要设计
1、数据库设计
(1)ER图
2.功能模块图;
3.各个模块详细的功能描述。
银行业务功能:
管理员登录
在数据库中添加管理员数据,管理员可登录系统并有权限完成与 用户相关所有操作。
开户
收集用户信息,为用户分配账号并通过程序在系统数据库中添加用户信息。
销户
根据账号在数据库中查找用户,确认用户身份信息后,管理员通过程序删除数据库中用户信息。
存款
根据卡号在数据库中查找用户,依据存入金额,管理员通过程序修改数据库中用户的金额信息。
取款
根据卡号在数据库中查找用户,通过密码确认用户,依据取出金额,经判断取出金额合法后(不大于余额),管理员通过程序修改数据库中用户的金额信息。
查询
以用户卡号、账号或身份证号之一为关键字,在数据库中查找用户,依据业务需求显示用户信息(开户人信息、用户近期操作记录)。
办卡
为用户账号绑定卡号,由管理员通过程序将卡号以及用户设置的密码存入系统数据库相应用户信息中。
挂失
根据账号在数据库中查找用户,用户提供登录密码确认用户身份信息后,管理员通过程序将数据库中用户卡状态信息由“使用”改为“冻结”。
ATM功能:
登录
ATM机依据用户卡号和密码在系统数据库中查询用户信息,在信息匹配的情况下进入用户操作界面。
存款
ATM机依据用户存入金额,通过程序修改数据库中用户的金额信息。
取款
ATM机依据取出金额, 通过对比本机余额和数据库中用户余额,若金额合法则通过程序修改数据库中用户的金额信息,否则弹出错误信息。
用户管理:
登录
依据用户账号和密码由管理员或ATM机在系统数据库中查询用户信息,在信息匹配的情况下用户获得用户管理权限。
查询个人信息
打印数据库中记录的用户个人信息。
修改个人信息
收集用户新信息,由管理员操作,修改数据库中用户拥有修改权限的相应数据。
查询近期操作
依据用户提供所要查询时间范围,由管理员或ATM机通过程序查询系统数据库中用户的操作记录。
四.详细设计
1.功能函数的调用关系图
用户类
卡查询
操作
卡密修改
操作
卡操作记 录
查询近期 操作
用户管理
登录方法
用户信息
查询
2.重点设计及编码
数据库设计:
create database account
use account
create table users
(
userId varchar(10) not null, /*用户账号,主键*/
userName varchar(10) not null, /*用户名*/
userPassword varchar(10) not null, /*密码*/
idNo varchar(20) not null, /*身份证号码,唯一*/
userMoney numeric(10,2) default 0, /*总金额,不能小于零*/
userStatus varchar(4) check (userStatus='使用' or userStatus='冻结') default '使用', /*用户状态(使用,冻结),默认是使用中*/
userAddress varchar(30) not null, /*用户地址*/
startTime DateTime, /*开户时间,应该是开户时的系统时间,不应该人为输入*/
primary key(userId), /*设置主键*/
)
--用户的状态一旦变成冻结状态,那么卡也应该不能使用
create trigger userstatus_update
on users
after update
as
if update(userStatus)
begin
if (select userStatus from inserted) = '冻结'
update card set cardStatus = '冻结' where userId = (select userId from deleted)
if (select userStatus from inserted) = '使用'
update card set cardStatus = '使用' where userId = (select userId from deleted)
end
create table card
(
cardId varchar(20) primary key, /*卡号,主键*/
userId varchar(10) not null, /*用户账号,外键,参照users表的userId*/
cardPassword varchar(10) not null, /*卡密码*/
cardStatus varchar(5) check (cardStatus in ('使用','冻结','挂失')) default '使用', /*卡状态(使用,冻结,挂失),默认是使用*/
--cardMoney numeric(10,2) check(cardMoney >=0),
foreign key (userId) references users(userId)
on delete cascade /*当删除用户帐号时,他的卡号会及联删除*/
)
--管理员表
create table admin
(
adminId varchar(10) not null primary key, /*操作员号码,主键*/
adminName varchar(10) not null, /*操作员名字*/
adminPassword varchar(20) not null, /*操作员密码*/
BankAddress varchar(20) not null /*操作员所在银行地址*/
)
insert into admin values('001','沈万三','123','工商银行长安分行')
--创建一个ATM表,至少应该含有编号以及ATM机里的总金额
create table ATM
(ATMId varchar(10) primary key, /*ATM机ID*/
ATMMoney numeric(20,2) check (ATMMoney >=0), /*ATM机里的总钱数,不允许用户的取款数大于它的总钱数,所以它的总钱数不能小于*/
ATMAddress varchar(20) /*ATM机的地点*/
)
insert into ATM values('000', 10000, '长安区')
insert into ATM values('111', 50000, '长安区')
--用户ATM机存取款信息表
create table ATMOutIn
(
ATMId varchar(10), /*取款机号,外键,参照ATM表的ATMId*/
cardId varchar(20) not null, /*用户卡号,外键,参照card表的cardId*/
ATMTime DateTime, /*在ATM机存取款时间(应该是进行存取款时的系统时间*/
ATMCunQu numeric(10,2), /*ATM机存款金额*/
ATMSummary varchar(30), /*存取款摘要*/
balanceMoney numeric(10,2) default 0, /*经过操作后账号中的金额*/
foreign key(ATMId) references ATM(ATMId) on delete cascade,
foreign key(cardId) references card(cardId) on delete cascade
)
--创建一个触发器,当产生这一信息时,账号上的钱也会随之改动
create trigger ATMOutIn_insert
on ATMOutIn
after insert
as
declare @num_rows int
select @num_rows = @@rowcount
if @num_rows = 0 /*未插入成功*/
return
if @num_rows>0 /*数据插入成功*/
begin
update users set userMoney = userMoney + (select ATMCunQu from Inserted) where userId in (select userId from card c,inserted i where c.cardId = i.cardId)
update ATM set ATMMoney = ATMMoney + (select ATMCunQu from Inserted) where ATMId in (select ATMId from inserted) /*对应的atm机的总金额也会随之改变*/
declare @balanceMoney numeric(10,2) /*账号余额*/
select @balanceMoney = (select userMoney from users where userId in (select userId from card c,inserted i where c.cardId = i.cardId))
update ATMOutIn set balanceMoney = (@balanceMoney) where cardId in (select cardId from inserted) and atmtime in (select atmtime from inserted) /*完成了账号金额的修改,再将新的金额插入到信息表中,就是剩余的总余额了(注意修改的只是一个账号此次的操作*/
end
--用户银行存取款信息信息表
create table BankOutIn
(
adminId varchar(10) not null, /*操作员号码,外键,参照操作员表的adminId*/
cardId varchar(20) not null, /*用户卡号,外键,参照用户信息表*/
BankTime DateTime, /*银行存款时间*/
BankCunQu numeric(10,2), /*银行存款*/
BankSummary varchar(30),
balanceMoney numeric(10,2) default 0, /*经过操作后账号中的金额*/
foreign key (adminId) references admin(adminId) on delete cascade,
foreign key (cardId) references card(cardId) on delete cascade
)
--创建一个触发器,当插入这条数据时会自动修改users表里的金额信息
create trigger BankOutIn_insert
on BankOutIn
for insert
as
declare @num_rows int
select @num_rows = @@rowcount
if @num_rows = 0 /*未插入成功*/
return
if @num_rows>0 /*数据插入成功*/
begin
update users set userMoney = userMoney + (select BankCunQu from Inserted) where users.userId = (select userId from card c,inserted i where c.cardId = i.cardId)
declare @balanceMoney numeric(10,2)
select @balanceMoney = (select userMoney from users where userId = (select userId from card c,inserted i where c.cardId = i.cardId ))
update BankOutIn set balanceMoney = (@balanceMoney) where cardId = (select cardId from inserted) and banktime = (select banktime from inserted) /*完成了账号金额的修改,再将新的金额插入到信息表中,就是剩余的总余额了(要注意这个信息总额的唯一性)*/
end
--总信息可以用其它的表推出,建一个视图,一个虚表,来综合他们的信息
create view allInfo(userId,cunquTime,cunquAddress,cunquMoney,cunquSummary,balanceMoney)
as
select userId,bankTime,BankAddress,bankCunqu,bankSummary,balanceMoney
from bankoutin b,admin a,card c
where b.adminId = a.adminId and c.cardId = b.cardId
union
select userId,ATMTime, ATMAddress,ATMCunqu,ATMSummary,balanceMoney
from atmoutin a,card c,ATM atm
where c.cardId = a.cardId and a.atmid = atm.atmid
数据库链接:
package com.connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 定义一个数据库的连接及关闭资源的类
* @author Administrator
*
*/
public class DBConnection {
/**
* 创建数据库的链接
* @return 返回一个数据库的链接
*/
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); //加载数据库驱动
String url = "jdbc:microsoft:sqlserver://localhost:1433;databaseName=account";
String username = "sa"; //数据库用户名
String password = "1126"; //数据库密码
conn = DriverManager.getConnection(url,username,password); //获得数据库的链接
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库资源
* @param obj 数据库打开的资源对象(在此处用Object,因为链接数据库是会打开多个资源)
*/
public static void closeObject(Object obj){
if(obj != null){
if(obj instanceof ResultSet){
try {
((ResultSet) obj).close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(obj instanceof PreparedStatement){
try {
((PreparedStatement) obj).close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
-
if(obj instanceof Connection){
try {
((Connection) obj).close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
程序入口函数:
package com.main;
import com.frame.MainFrame;
public class Begin {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new MainFrame();
}
}
五.测试数据及运行结果
1.正常测试数据和运行结果
管理员登录:
登录名:沈万三 登录密码:123
管理员操作:
1. 查询用户信息
2. 开户
ATM机操作
1. 登录
2. 查询
2.异常测试数据及运行结果
1.查询失败
3. ATM机存款失败
六.调试情况,设计技巧及体会
1.改进方案
本系统基本实现了银行ATM管理的基本功能,不过在细节方面处理的不够完善,细化功能也做的不够好,此外,交互界面美工基本没做。对于此,在接下来的时间里我将对系统不断完善,尽力做到尽善尽美。
2.体会
在课程设计的两周中,我在数据库设计以及代码编写方面都遇到了不少问题,所幸在同学们的帮助下以及借助网络查找相应问题,总算按时完成了课程设计关于上机的任务。
在此过程中我通过数据库设计和实现的基本过程中掌握数据库模式的设计、分析和实现方法,了解数据库应用系统软件开发的一般过程,获益匪浅。
七.参考文献
《数据库系统原理与应用》 ——孟彩霞、乔平安、张荣 编著
八.附录:
源码见电子版