1、1探讨小型银行帐户软件系统设计摘要:本文通过设计一个简单的银行帐户系统软件来分析银行帐户系统的设计思想。该软件实现了帐户管理的最基本功能,其中包括开户、销户、办卡、换卡、挂失卡、存款、取款、交易记录查询及打印、客户信息修改及打印、客户密码修改、管理员密码修改、利率设置等。 关键词银行帐户系统;VC;ODBC; SQL Server 2000 中图分类号:F83 文献标识码:A 文章编号: 1 小型银行帐户系统概述 随着银行行业的发展,银行的业务发展也逐渐地走向了多样化,业务类型逐渐增多,使银行的服务范围逐渐地变广,随着经济全球化的发展很多银行已走向了国际化,不仅为国内的众多客户提供了更优质服务
2、,还使外国公民从中获得更多益处。 本系统主要实现了开户、销户、用户信息修改、存款、取款、办卡、挂失卡、数据查询(用户信息查询,及交易记录查询)。根据这些功能及系统设计方面的考虑,系统采用模块化设计,各模块分别实现为: “管理用户模块”包括: 开户:由客户提供姓名、身份证号、联系地址、联系电话、存入金额、初始密码等。开户时间有系统自动生成。 销户:提供帐号用于销户,系统显示客户姓名及余额以便确认。 数据查询:查询客户存取款记录。 2用户信息查询及修改:通过帐号、卡号、证件号进行查询。系统显示客户信息并可修改。 “管理员模块”包括: 业务设置:利率等相关业务设置。 管理员密码修改:修改登录的管理员
3、密码。 “卡管理模块” 包括: 办卡:输入帐号信息,生成卡号,并由客户提供密码。 换卡:输入帐号信息,生成新卡号,并由客户提供密码。 挂失卡:由客户提供卡号及身份证号(此为真实用户挂失依据)。 “存取操作模块” 包括: 存款:提供帐号或卡号以及存款金额,操作完成后显示余额。 取款:提供帐号或卡号以及取款金额,操作完成后显示余额。 同时,系统还实现了客户信息及客户交易记录的打印功能。 2 数据库设计 根据本系统实现的功能,我们需要建立 5 个表,分别是用户数据表user_data,用户密码表 user_password,交易记录表 user_exchange,用户余额表 user_balance
4、,管理员密码表 admin_password。user_data表用于开户时,前台应用将用户开户时所需要的客户信息写入此表。 其中包括的数据有用户名、证件号、联系地址、联系电话、业务类型、存入金额、开户时间、帐号、卡号,共 9 个数据。为了便于简化前台应用与数据库的存取,其数据类型都设为字符型(char),但不影响正常的程序功能与精度。如 user_data 建立如表所示。 3表 1user_data 表 创建 user_data 表的 SQL 语句为: USE BankManager CREATE TABLE user_data ( 用户名 char(15) NOT NULL, 证件号 ch
5、ar(20) NOT NULL, 联系地址 char(80) NOT NULL, 联系电话 char(15) NOT NULL, 业务类型 char(15) NOT NULL, 存入金额 char(15) NOT NULL, 开户时间 char(20) NOT NULL, 帐号 char(15) NOT NULL, 卡号 char(15)NULL ) GO 3 各模块代码实现 因为各模块的代码实现基本上都是在用 CRecordset 类,所以在这里只给出具有代表性的代码实现的分析,其它模块的代码不再讲述。 先来分析登录代码: 4登录代码的第一个语句为: UpdateData(true); 这条
6、语句是将登录对话框中的数据传递给 Login 类中对应绑定的String 变量。这样可以对用户输入的用户名、密码、数据源等信息进行分析处理。 然后我们需要判断用户是否输入了用户名、密码和数据源,如果没有输入提示用户输入。代码如下: if(m_UserName=_T(“) MessageBox(“请输入用户名!“); return ; if(m_Password=_T(“) MessageBox(“请输入密码!“); return ; DataSource=“ODBC;DSN=“; DataSource+=m_DataSource; if(m_Database.Open(NULL,false,f
7、alse,DataSource)=false) MessageBox(“请正确输入数据源!“); 5return ; 如果用户输入了用户名、密码、数据源信息,我们还需要根据管理员静态变量 Admin,判断用户是作为管理员登录还是用户登录。 如果是管理员登录,就查找 admin_password 表,要访问Admin_password 表,我们需要先建立个 CRecordset 类: CRecordset m_PasswordSet(&m_Database); 用前面打开的数据库连接构造 CRecordset 类。 然后必须打开此记录集,打开时,第一个参数指定记录集以向前只读方式打开,第二项用
8、SQL 语句指定返回给记录集的列,代码如下: CString strSQL; strSQL.Format(“select * from admin_password where 管理员=%s“,m_UserName); m_PasswordSet.Open(CRecordset:forwardOnly,strSQL); 在此,我们忽略了对 Admin 变量的判断。 下一步判断是否存在此管理员,通过记录集类的 IsEOF()可以知道返回的记录集是否有记录,没有说明不存在此管理员,那就 return。 if(m_PasswordSet.IsEOF() MessageBox(“没有此管理员!“);
9、m_PasswordSet.Close(); m_Database.Close(); 6return ; 如果有记录我们需要判断管理员密码是否正确,首先要先把密码取出,然后跟用户的输入进行比较。 CString tempPWD; m_PasswordSet.GetFieldValue(“密码“,tempPWD); if(tempPWD.Compare(m_Password) MessageBox(“密码错误,请正确输入管理员名和密码!“); m_PasswordSet.Close(); m_Database.Close(); return ; 如果是作为用户登录,就查询 user_passwo
10、rd 表中的卡号和卡密码,这是先建立记录集类,这次我们建立的是我们自己定义的派生自CRecordset 类的 CuserPasswordSet 类,此类中的数据与 user_data 表中的数据对应,已经绑定好。打开方式我们选 CRecordset:snapshot,即快照方式,因为我们在后面要对数据库中绑定的数据进行查询(使用Requery()函数),其实我们也是可以用前面查询 admin_password 表的方法的。 strSQL.Format(“select * from user_password where 卡号=%s“,m_UserName); 7CUserPasswordSet
11、 m_PasswordSet(&m_Database); m_PasswordSet.Open(CRecordset:snapshot,strSQL); 然后我们看看是否存在此卡号,与前面的方法相同。 下一步我们查询 user_data 表中的挂失状态,看看是否此卡已经挂失,若挂失就 return。 m_PasswordSet.Requery(); if(m_PasswordSet.status=TRUE) MessageBox(“此卡已经挂失,暂不能用!“); m_PasswordSet.Close(); m_Database.Close(); return ; 然后就是确认密码是否正确了,
12、与前面不同的是用m_PasswordSet.m_CardPassword!=m_Password 进行判断,m_CardPassword 与数据库中的卡密码对应。 如果用户输入的各项数据都正确,就销毁登录框,进入主界面。 CDialog:OnOK(); 如果用户按了“取消” ,退出整个程序,实现是在 BankManager.cpp中的 InitInstance()中完成的。如下: Login* m_pLogin=new Login(); if(IDCANCEL=m_pLogin-DoModal() 8 return false; 接下来我们分析开户模块: 开户时我们需要在 user_data
13、表中添加数据,所以要用记录集类中的 AddNew()和 Update()函数。一些代码实现与登录框的很相近,我们就主要说差别的地方。 首先我们检测用户是否输入了所有数据,并且检测存入金额是否合法: if(m_CunRuJinECOleCurrency(0, 0) MessageBox(“输入的“存入金额”小于零!“); return ; 然后查看“证件号”是否使用过,若使用过就提示并返回,方法和查看前面的卡号是否挂失等同。 下一步取得用户的帐号密码给全局变量 transfer: CPassword m_Password; if(IDOK!=m_Password.DoModal() return
14、 ; 然后整理要存入数据库的各变量值,大部分是由用户输入的,而卡号和开户时间是由系统生成的。 9根据用户的输入,将业务类型记录到 m_Item 变量中。 开户时间的生成比较简单,建立了 ColeDateTime 后,获得当前时间并格式化成字符串后即可: COleDateTime now; now=COleDateTime:GetCurrentTime(); m_KaiHuShiJian=now.Format(); 帐号利用时间生成(后来的卡号也是),前面加个 A,是 Accounts 的第一个字母,共 15 位。 最后我们要把数据写入各个表先打开对应的记录集,然后 AddNew(),添加新值,
15、下一步 Update(),最后对所有表进行更新。 比如说向 user_data 表写数据: m_DataSet.Open(); /CRecordset:snapshot,strSQL1 if(!m_DataSet.IsEOF() m_DataSet.MoveLast(); m_DataSet.AddNew(); m_DataSet.m_UserName=m_XingMing; m_DataSet.m_Type=m_Item; m_DataSet.m_Certificate =m_ZhengJianHao; m_DataSet.m_Accounts =m_ZhangHao; m_DataSet.
16、m_Address = m_LianXiDiZhi; m_DataSet.m_Telephone = m_LianXiDianHua; m_DataSet.m_Time =m_KaiHuShiJian; 10m_DataSet.m_Currency = m_CunRuJinE.Format(); 密码表需要写入帐号、密码和挂失状态,余额表写入帐号和余额,写入方法同写入 user_data 一样。更新如下: if(m_BalanceSet.Update()&m_DataSet.Update()&m_UserPassword.Update() MessageBox(“开户成功!“); else M
17、essageBox(“开户失败!“); 在我们的应用程序中,一用到密码,基本上都要调用密码框,相应的类是 CPassword,它的作用是将用户输入的密码传递给全局变量transfer。代码如下: UpdateData(true); if(m_Password1.GetLength()!=6|m_Password2.GetLength()!=6) MessageBox(“你确认输入 6 位密码!“); else if(m_Password1!=m_Password2) MessageBox(“请确认两次输入的密码一致!“); else transfer=m_Password1; CDialog:OnOK();