atm银行取款机(精选5篇)
一、引言 1.1 整体描述
本系统的名称为“银行ATM机自动取款系统”。系统的功能主要有:能够读取和存储客户的存款和取款信息,方便客户自由交易;在客户选定交易类型后,直接与客户进行现金交易,方便快捷。将客户最新的存取信息上传到银行的总存储系统,并自动更新系统中的客户信息,方便银行系统管理员对客户信息的管理。
1.2 各个事件流
1.取款
客户将银行卡插到卡槽中后,进入个人账户登录界面,客户输入密码后,点击“确认”,进入个人账户界面,点击“取款”,进入取款界面,选择取款金额,点击选中的数字按钮,进入等待界面,取出取款口的现金后,进入“是否打印凭条”界面,点击“是”,凭条从凭条口吐出,取出后,点击“退出”,取出银行卡;在进入“是否打印凭条”界面,点击“否”,直接进入退出界面,点击“退出”,取出银行卡。
2.账户与信息查询
银行系统管理员进入系统后,点击“查询客户账户信息”按钮;客户登录个人账号,将银行卡插到卡槽中后,进入登录界面,输入密码后,点击“确认”,进入个人账户界面,点击“查询”按钮。3.口令管理
客户将银行卡插入ATM机卡槽中,进入个人账户登录界面,输入密码,点击“确认”,进入个人账户界面,点击“修改密码”按钮,在口令修改页面输入新的密码,点击“确认”。
二、需求概述
2.1 市场需求
由于的各方面发展速度的大幅提高,几乎所有的银行都配备了不用繁琐的人工操作的ATM自动取款机。人们可以随时随地进行交易,不再受银行的服务时间的约束,取款时也为人们节省了很多时间,方便快捷。对于配有ATM自动取款机的银行,客户较多,系统需操作方便,信息读取与存储及时快速,方便客户进行自由交易和系统管理员对信息的管理。
2.2功能需求 本系统相应的需求有以下方面:
(1)能够读取和存储客户账户中的存取款信息,并方便有效地进行客户选择的交易操作。这主要包括以下内容:
① 自动调用银行总系统中客户原有信息
② 信息录入与修改。输入并保存客户的信息,每个客户是一条记录。
a 编号
b 客户姓名 c.支取密码 d.客户地址 e.客户电话 f.账户总金额;
③在存取款文件中,每次存取款是一条记录。
a.编号 b.日期 c.类别 d.存取数目 e.经办人。④类别
a定期1年存款 b.活期存款 c.取款
⑤并提供信息修改、删除的功能。
⑥存取款模拟:根据存取款信息生成存款与取款单,并修改客户的账户总金额。⑦查询与统计:根据客户信息查询指定时间段的资金明细、根据日期查存取款信息、统计某年的存取款信息。
(2)提供客户信息访问的权限和管理。其中包括: ①
客户访问普通信息的权限
② 银行系统管理员对客户信息的录入、更改和删除
本例中,我们通过一定的调研和分析得到“银行ATM机自动取款系统”的用例图,如下图所示:
2.3 安全性需求
由于银行ATM机自动取款系统的客户量很大,所以在对客户账户信息的导入和交易操作要保证速度。在客户进行交易操作的过程中又要保证事务的完整性。在整个系统中,需要完整的权限控制,以防止某些人恶意地攻击系统,修改系统中的原始记录。同时对于数据库中的数据需要定时备份,防止系统数据丢失。此外,系统要求用户在登录时需要密码验证。
三、故障处理
在英国发生的这个因ATM的错误导致的多取款事件可以说在中国一经报道立即引起了轩然大波。追根溯源是因为发生在06年的许霆案。中国的许霆最终被判5年有期徒刑,英国的这两百多位“幸运儿”不但未被追究责任甚至不用还款。究其原因,中西方法律的差异是一方面,但个人认为最重要的方面是国内普遍存在的对我国民事法律关系的狭隘理解。下面我将就ATM机错误操作导致的取款案件用合同法的理论进行详细的分析。
一、英国情况的介绍
在英国有一个《银行业惯例守则》来对ATM的机操作进行调整。对银行的具体要求有:保障ATM机正常运行和能正确回复指令,保证ATM机提供准确的信息等等。应该说,英国的这个惯例守则很充分的保护了持卡人的利益[1]。其原因在于ATM机的硬件和软件设备都是由银行提供,与之相比持卡人处于不利的地位,很显然应该受到保护。在实践中,许多ATM机的纠纷都是通过这个守则而得到解决的。与之相比,我国相关法律法规在此处有相当大的空白点,一些行业类的规定则更多地维护银行的强势地位。
二、具体从我国的合同法律关系出发进行分析
(一)到ATM机取款是一种合同订立的过程
当储户到银行办理银行卡之后,就应经产生了一个银行卡支付服务合同。储户可以根据意思自由进行取款和存款。同样,持有银行卡的用户也可以到任意一个ATM机上进行取款。大致的过程如下:储户持卡到一个ATM机准备上进行取款,卡插入ATM机内,出入密码和取款金额。此时因为意思表示明确且具体,可视为是一个要约。ATM机因为是无意识的个体,由内部软件控制,只能通过输入的指令来实行具体的操作。在此,可同等看作自动售货机的原理。ATM机通过自身的行为即吐款的行为已表示承诺,双方已经形成了一个标准的合同。问题的关键就在于,由于ATM机的错误指令在出款时吐出了高于此前输入的现金额或者是银行少扣除现金额。那此种情况该如何定性呢?简单来讲,这就好比是一般的借款合同,借款人一不小心数错钱,把1.2万当作1万块出借。也或是借款人出借了1万块,却误将合同金额写成1千块。只是这里不再是人与人,而是人与机器。具体来讲,在储户与ATM机的要约和承诺中双方之间已经达成“合意”,即银行是在审核同意之后才发出的承诺支付的指令,并付现。可以说没有银行的同意,储户是无法取款的。因此,储户因ATM机的误操作而多得的利益,或多或少都存在被动性。
(二)ATM机是银行的代理人[2]
一些观点则认为,ATM机与银行相分离,只是一种金融机构智能化信息系统的控制终端。ATM机的行为不能完全等同于银行的行为。我认为这样的观点在现实中毫无可行而言,ATM机设立的初衷在于便民、高效、快捷。而ATM机与银行分离的观点,则容易导致民众不再信任ATM机。从技术层面来讲,ATM机具有存储、识别、出款等功能,它完全有资质代表银行进行意思表示。如果要区别于银行柜台上的操作,则可把ATM机视为“电子代理人”,即也是跟银行工作人员相似的一种“人员”。应该说,ATM机绝大多数时间都是准确、按时完成自己的工作。只有在少数所谓特殊情况下才会出现这种问题。就此可以说:ATM机与储户的互动是标准的商业交易,即是商业交易就必须是平等主体间的自由交换,要遵循商业运作的原则和规范。
(三)由ATM机的错误导致的多取款事件,应该作为一个可撤销的合同来处理
如上所述,ATM机(即银行)与储户之间是形成了合意。尽管可能会出现上百人“钻空子”排队来取款或如许霆一般反复多次取走17万元,但都是在一定合意范围内的存在的错误。可以说既没有欺诈,也并没有受胁迫,也不是乘人之危,勉强可以解释成为重大误解。即ATM机出现错误“理解”导致了出款或扣款的差错。从合同法的角度理解大致可以得到上述的结论。但是合同法只是规定了基本的理论,像ATM机这类特殊的案件还是需要更具体的法律法规来处理。但是很遗憾,纵观我国法律法规,因ATM机出现差错所造成的相关后果的规定还有很大的空白。因此就会蹊跷的发生许霆入罪案件,常理都会认为银行的ATM有错在先,许霆错误取款在后,于法于情都不应该出现一审判无期徒刑的情况。
三、通过此类案件或者事件的反思与总结
横向对比中西方不同的处理方式,自然会引发对法律的价值进行深层次的思考。在面对因为ATM机故障会多得利益的巨大诱惑下,民众是坚守道德模范还是持“人之常情”之心。不得不说,英国与我国的处理方式都有走极端之嫌。英国汇丰银行很可能是不希望因一次失误对储户追究责任而导致客源丧失。但如果长此以往,也会给银行带来重大的利益损失。反观我国许霆案的处理,又成为入罪的极端。在此案中我国银行的强势地位占有很大因素。应该说银行的利益损失已经从ATM机生产商中获得大量的赔偿,却还是一味地要求严惩许霆,从而使一个普通的农民工因没有抵住诱惑而给自己带来了终生的遗憾,这也是明显不符合公平原则。因此,我建议尽早设立相关的法律法规,使以后类似事件能够得到妥善解决。但鉴于许霆的前例并且正在服刑,此类法规的实现仍任重而道远。
参考文献
[1]黄立,何田田.比较适中的ATM[J].法学杂志,2008(3).
事实上,类似的纠纷在全国各地已经发生过很多例,却始终没有很好的解决方案。央行正在推广自助设备上增加钞票冠字号码记录功能,届时用户存入、取出的纸钞都能够实现追根溯源。
客户和银行的“假钞”之争
“从银行的ATM机取出了假钞!”“钞票离柜、概不负责!”类似的“假钞案”在全国各地都屡见不鲜。客户觉得憋屈,而银行则觉得委屈。到底是谁之过呢?
银行的工作人员表示,银行自助设备内的钞票装箱有着严格的管理办法。
首先,存款机本身的存款模块就具有识别假币的功能,存款机在清点货币的同时就进行假钞的鉴别。据介绍,现在自助存款机的识别假钞的功能可与银行专业的清分机相媲美。如果自助机鉴别为假钞,那么机器会直接吐出钞票,假钞无法混进存款箱。
其次,在现钞的清分环节,采用两个工作人员同时清点的方式,在整个清分的过程中,银行将架设多台摄像头从多个角度进行监视,从现钞封存到ATM机装钞期间,现钞箱严禁开启,其他时间且全程都有监控,基本杜绝了内部人放假钞的可能。
“我们在处理假钞纠纷的时候经常发现,客户在取出现钞之后往往经历了多个环节,才发现有假钞的存在。假钞很有可能是在使用的过程中被调换的,而客户却经常认为是银行取款设备的问题。”一位银行的工作人员向记者介绍说。因此,银行客服建议的处理方法是,客户在取现后,在银行的监测设备前进行展示,由监测设备记录现钞的号码,以备发生问题时进行核查。
但是,这显然不是一个可行性高的解决方案。客户即使真的从银行自助设备上取出了假钞,往往百口莫辩,难以提供有效力的证据。
自助设备将记录钞票冠字号
不过,这种“控辩双方”各持一词、争执不下的局面将得到改变。央行正在全国范围内推广自助设备的钞票冠字号记录功能。
所谓“冠字”是指纸币上的汉语拼音字母,“号”指“冠字”之后的阿拉伯数字,合称“冠字号”。每一张纸币的冠字号都是唯一的,就像这张纸币的身份证。
在一些银行新安装的ATM设备上都具备冠字号识别功能,无论是存进来还是取出去的纸钞,机器都有冠字号记录,银行能够在后台进行查询,一旦发现问题钞票,通过这一功能将达到追根溯源的作用。
在一些城市的新型存取款设备上,除了银行的后台记录,客户在存取款时,也可以选择“打印冠字号”的选项,在点击该选项以后,就能够在取款、存款的回单上打印出所取、所存的每张人民币的冠字号码。
由于设备的更新需要新的投入,尤其是对于大型银行来说,花费的时间和资金成本较高,因此目前能够记录钞票冠字号的自助设备尚没有全面普及。不过,央行已经有具体的时间表推出。按照央行的计划,银行业金融机构必须在2013年底前,实现ATM机付出的100元面额人民币冠字号码可查询;在2014年底前,存取款循环一体机付出的100元面额人民币冠字号码可查询,在2015年底前,银行业金融机构柜台付出的100元面额人民币冠字号码可查询。
ATM常见故障如能及时排除,可减少停机时间,因此遇到下列故障可按照相应步骤处理。
(一)用户打印机问题及处理方法
1、用户凭条卡在面板内
(1)检查凭条出口是否有异物堵塞;
(2)检查面板有无受力变形;
(3)拉出打印机检查传送部分有无异常,推入打印机重试;
(4)如仍卡纸, 需进行专业维修。
2、打印纸堵塞在切纸位置
(1)松开传送部件;
(2)拉动蓝色手柄,使打印头露出;
(3)清除堵塞的纸;
(4)查看打印机控制板上有无黄灯常亮;
(5)如无,重试打印机;
(6)如黄灯长亮,需进行专业维修。
3、凭条双倍长度
(1)检查打印纸上的黑色标记是否清晰;
(2)检查黑标方向是否正确;
(3)重试,如仍不正常, 需进行专业维修。
(二)流水打印机问题及处理方法
4、打印纸堵塞在切纸位置
(1)清除堵塞的纸;
(2)查看打印机控制板上有无黄灯常亮;
(3)如无,重试打印机;
(4)如黄灯长亮,需进行专业维修。
(三)读卡机问题及处理方法
1、读卡机堵塞
(1)按照关机程序关机;
(2)取出读卡机;
(3)查看读卡机内有无异物,有则取出;
(4)开机,执行读卡机清洗程序;
(5)重试读卡机。
2、卡不能插入
(1)按程序关机;
(2)取出读卡机,查看有无异常;
(3)如流水打印机上无读卡机故障信息,检查面板插卡口有无异常;
(4)检查读卡机口有无异常;
(5)装回,开机重试;如仍不正常, 需进行专业维修。
(四)吐钞机问题及处理方法
1、出钞不整齐
(1)拉出吐钞机,检查送钞皮带是否脱落;
(2)检查出钞口有无异常(如里面低,外面高);
(3)检查钱箱内钱币是否整齐;
(4)重试, 如仍不正常, 需进行专业维修。
2、只有挖钞声,钱不吐出来
(1)检查钱箱内是否有钱;
(2)检查废钞箱内的钱币质量;
(3)如上述正常,做加钞程序中的吐钞机诊断;
(4)如诊断不能通过,将钱箱换一个通道;
(5)再做吐钞机诊断;
(6)如仍不正常, 需进行专业维修。
3、吐钞机报“钱币堵塞”
(1)按程序关机;
(2)拉出吐钞机;
(3)查看有无钱币卡在上面传送带;
(4)查看有无钱币卡在侧面传送带;
(5)取出钱箱,查看通道内有无钱币堵塞;
(6)清除堵塞的钱币;
(7)重新装回钱箱,开机重试;
(8)如故障依旧,检查传感器;
(9)更换传感器或进行专业维修。
4、废钞箱卷帘门裂开
(1)取出废钞箱卷帘门;
(2)如仅前三条裂开,裁下裂开的那条;
(3)装回卷帘门,即可;
(4)如已裁下三条以上,更换。
(五)其它故障
1、通讯不通
(1)按程序关机;
(2)检查通讯线是否插好;
(3)开机,注意系统上电启动时有无提示相关信息;
(4)请电信局检查线路;
(5)进行专业维修。
2、屏幕无显示
(1)关机;
(2)检查显示信号线是否接好;
(3)开机,观测是否有系统开机自检信息;
(4)如有,表明硬件无问题,重装软件;
(5)如无, 进行专业维修。
二、存取款机常见故障的原因及解决方法
1、磁条读写器吞卡
磁条读写器吞卡是由于以下四种情况造成:
(1)主机命令
(2)弹卡超时不取走
(3)用户操作超时
(4)插卡动作不当造成。
如果是主机命令或弹卡超时造成吞卡,客户会得到一张打印的客户凭条,凭条上有该卡的卡号和吞卡原因。
如果是由于插卡动作不当或操作超时不取造成吞卡,客户也同样能够得到一张客户凭条,但该凭条上面没有卡号和吞卡原因。
2、存款模块回收箱不空
当回收箱不空时,存款交易暂停,以避免其他客户操作而产生的帐务不清。以下情况存款进入回收箱。
有识别不出的钞票或用户中途取消操作的情况下,存款退回到入钞口,如果客户没有及时取走,机器将把入钞口上全部钞票打入回收箱。
客户钞票识别完毕,提交主机,在等待主机应答超时的情况下,把客户提交的存款打入回收箱,其面值总额应该与客户得到的客户凭条相符。
3、存款模块卡钞票
当钞票在中途卡住,存钞模块停止工作,只有排除故障之后,才能初始化继续。当卡住钞票,整个流水线全部停止。除了在钞票卡住的部位,请检查其前后流水线上是否有钞票在中间。如果有则请旋转绿色旋钮,把钞票取出。这时如果需要继续正常使用存款模块则需要重新启动应用,或者清除存款箱。
4、取款模块钞箱安放不当
取款模块的钞箱分为两种,回收箱和出钞箱,在使用出钞模块之前需要对各出钞箱进行序号设置,为钞箱编号。以尽量减小钞箱装错的可能性。当钞箱安装没有到位,或者顺序不符,系统能够检测到,并提示取款钞箱出错。这时需要重新安装钞箱,直到正确为止。
5、客户插卡后没有可做交易
金库门打开的情况下,只能进行管理员卡类交易。请检查金库门是否关闭好。
系统只有查询交易可以进行
系统缺少客户凭条打印纸,则仅提供查询服务。
6、没有存款功能
存款模块初始化失败,请拧动管理员钥匙,检查设备状态。
存款模块回收箱中有钞票,请检查存款模块中的回收箱。
存款功能在系统中没有设置,拧动管理员钥匙,修改系统参数为“存取款”或“仅存款”。
7、没有取款功能
取款模块初始化失败。
钞箱中钞票数量低于最低限制数量。
取款功能在系统中没有设置,拧动管理员钥匙,修改系统参数为“存取款”或“仅取款”。
三、存折补登机常见故障及处理方法
(一)存折打印机故障
1、磁条读写故障,表现为磁条读写失败
(1)原因分析1:有异物(如纸削)阻塞磁头的水平移动
解决方法:清除异物
(2)原因分析2:磁条读写磁头脏
解决方法:用异丙醇和酒精或随机配送的清洁卡清洗磁头
(3)原因分析3:打印机磁道读写参数与软件系统不匹配
解决方法:更改打印机的磁条读写参数或软件系统参数
(4)原因分析4:磁条读写电路故障
解决方法:更换磁条读写板
(5)原因分析5:磁条读写机械部分故障
解决方法:更换磁条读写组件
2、卡纸(折)、纸(折)进出困难或歪斜
(1)原因分析1:有异物阻塞进出纸槽
解决方法:清除异物
(2)原因分析2:打印机机架故障
解决方法:调整机架
3、打印机无打印动作,常见故障为放入存折后打印机无打印动作
(1)原因分析1:存折无补登项目
解决方法:无需处理
(2)原因分析2:打印机通信接口坏
解决方法:检查联机电缆是否损坏,如损坏更换之;更换打印机主板
(3)原因分析3:主机网络通信故障
解决方法:检查网络通讯部分
(4)原因分析4:多用户卡故障
解决方法:检查在Windows系统内多用户卡的IRQ值是否于BIOS设置值一致(推荐IRQ值取5);更换多用户卡
不能进折或打印头撞墙,或者开机打印头来回移动
原因分析:由于长时间使用,灰尘过多造成光电参数丢失
解决方法:此时请设置光电参数。具体操作如下:
(1)关闭电源,打开打印机的上盖;
(2)将打印头移到打印机的最左边;
(3)按住面板上的三个键,同时打开电源,机械动作停止后,关上机盖;
(4)按操作面板上的STATION1键两次,此时READY灯停止闪烁,并发出蜂鸣声;
(5)在进纸器槽中插入一张A4的纸并按一次STATION2键;
(6)当打印机退出纸张后,再插入一张A4纸,打印机打印出光电参数值。
(二)触摸屏故障
1、触摸屏无反映,常见故障为触摸屏幕鼠标无任何反映
(1)原因分析1:更换、移动、插拔触摸屏的联机接口后会造成触摸屏失效,这是由于触摸屏属于非即插即用产品,因此硬件上的改变都有可能引起触摸屏失效
解决方法:重新安装触摸屏驱动程序
(2)原因分析2:重新安装、克隆操作系统,原因分析如上
解决方法:同上
(3)原因分析3:触摸屏硬件故障
解决方法:更换触摸屏控制卡、联机电缆
2、触摸屏不灵敏,常见故障为需要大力触摸才有反映
原因分析:屏幕灰尘过多,或者有水滴在屏幕上都会造成不灵敏
解决方法:清洁屏幕
触摸屏触摸的位置发生偏移
解决方法:打开控制面板,调用校准程序,根据提示点击3个圆点进行校准
(二)金属键盘故障
1、键反应过灵敏,当按下某一数字键时幕显示输入两个或多个相同数字
原因分析:在系统里设置按键重复时间过短
解决方法:打开“控制面板”里的“键盘”项,如图所示把红色部分按照图中调整即可
2、按键经常无反应,常见故障为多个数字按键无反应
(1)原因分析1:键盘使用时间长,键盘膜片失效
解决方法:更换键盘膜片
(2)原因分析2:键盘电缆松脱或者损坏
解决方法:检查接口是否松脱,电缆是否损坏,更换故障部分
3、整个键盘失效
(1)原因分析1:键盘控制板故障
解决方法:更换键盘控制卡
(2)原因分析2:PC机的键盘PS/2接口坏
解决方法:更换PC主板
(三)PC机及系统其他故障
1、不能开机
(1)原因分析1:PC机电源坏,常见故障为开机时CPU风扇不转动
解决方法:更换PC电源
(2)原因分析2:PC机主板、CPU、内存及其他板卡故障都可能造成不能开机
解决方法:用替换法确定损坏部件进行更换
打开主机电源后PC机不能自动开启,需手动开机
原因分析:BIOS中未设置自动上电开机功能
解决方法:手动开机进入BIOS设置界面,进入“Integrated Peripherals”(整合周边设备)设置项,把选项“Power on Function”设置为“BUTTON ONLY”,把选项“PWRON After PWR-Fail”设置为“On”。(注:上述操作主要针对微星的主板MS-6153,其他型号主板的设置请参考相应主板的说明书)
2、不能进入操作系统或业务画面
(1)原因分析1:硬盘产生坏区,无法正常启动Windows系统
解决方法:格式化C盘,重新安装Windows系统和应用程序
(2)原因分析2:系统中病毒
课程设计报告
题 目: ATM模拟银行
学生姓名(学号): 代小龙(20***1)安梓玮(20***7)侯硕(20***5)
专 业: 信息管理与信息系统
班 级: 18信管(一)班
指导教师: 申晨
信息管理与工程系
2019年01月02日
基于Java的ATM模拟银行开发与设计
摘要:
自动取款机又称ATM,意思是自动柜员机,因大部分用于取款,又称自动取款机。它是一种利用磁性代码卡或智能卡实现金融交易的自助服务,代替银行柜面人员的工作。可提取现金、查询存款余额、进行账户之间资金转账、余额查询等工作;还可以进行现金存款(实时入账)、中间业务等工作。持卡人可以根据密码办理自动取款、查询余额、转账、现金存款,更改密码,缴纳手机话费等业务。我们在这次课程设计上运用了JAVA以及 SQL Server 2012进行设计。.该系统是站在用户的角度来实现取款,存款,转账,修改密码,定期存款,查询余额多个页面的实现,页面的实现满足了银行基本的业务需求,使银行工作规范化,自动化,在系统页面设计方面,我们使得系统的功能操作简单,用户体验较好。
窗体底端
关键字:ATM模拟机,用户,管理员,页面设计,JAVA,sql server,Eclipse集成开发环境下开发系统
目 录 项目简介与分工 1
1.1 项目简介 1
1.1.1 系统开发需求 1
1.1.2系统具体事务 1
1.1.3 系统开发环境要求 1
1.2 项目分工 2 项目设计方案 3 项目功能实现 4
3.1数据库的实现 4
3.2主要功能实现 5
3.2.1主界面 5
3.2.2普通用户存款界面 9
3.2.3用户转账 11
3.2.4手机缴费 16
3.2.5用户取款 19
3.2.6冻结 24
3.2.7开户 26
3.2.8销户 30项目总结及展望 33 心得体会 34
参 考 文 献 35 项目简介与分工
1.1 项目简介
本系统采用JAVA语言编写测试完成,基本上在字符界面下模拟了ATM系统的相关实现。主要模拟银行ATM机系统功能,主要有查阅、转账、取款、存款、添加用户、删除用户、修改密码、冻结用户,管理员解冻、手动手机费缴费等功能
1.1.1 系统开发需求
随着市场经济的发展,经济信息化程度的不断深入,银行的传统业务己愈来
愈不能满足银行客户的需要。同时,随着国内银行机构的大量增加,我国的银行业面临更加激烈的同业竞争,如何提供更多的金融产品和更优质的服务,如何吸引更多的客户,如何利用计算机技术加强银行帐户信息管理,提高银行的工作效率和业务竟争能力是摆在各家银行面前的一个迫切需要解诀的问题。随着信息技术对银行业的渗透和促进,银行卡业务近年来得到“迅猛发展,银行卡发卡量、交易量大幅激增,ATM设备数量也随之增加。
1.1.2系统具体事务
用户:用户存款、取款、转账、余额信息查询、修改密码、手机话费的缴费并与数据库实时同步。
管理员:对用户账号的冻结以及解冻并询问是否修改密码、开户与销户、与数据库实时同步。
1.1.3 系统开发环境要求.操作系统:Windows系统
.开发语言:Java、SQL server
.数据库:SQLServer2012
.软件:eclipse
1.2 项目分工
代小龙:管理员的开户,销户,冻结,用户明细,JDBC的连接
安梓玮:存款,转账,查询余额,电话缴费,撰写报告
侯硕:取款,用户界面美化,撰写报告 项目设计方案
实现ATM机的基本功能,包括:查询余额、存款、取款、转账、用户明细、手机缴费以及管理员开户、销户等操作,等基本功能;
查询余额:连接数据库,根据与数据库内数据相同的正确的用户名和密码登录查询对应的余额;转账,存取款的金额必须为100或者是100的整数倍,操作完成后会实时更新数据库内相应的内容。
修改密码:在旧密码相同的情况下,新密码和确认密码也相同的情况下,密码修改完成。
转账:可以转账任何金额,但是当转账金额小于余额时,转账失败。
手机缴费:需要缴费的手机号需时已经存在的,可以存任意金额。
管理员操作的基本功能包括对银行卡开户、销户、冻结、解冻、修改管理员密码等的操作,并在数据库内实时更新。项目功能实现
3.1数据库的实现
card表:主要是用户银行卡的信息,包括账号、密码、余额、是否被冻结、存款余额,其中account是varchar型的主键。
details表:主要是户主名account,日期和资金明细。
GLY表:包含所有管理员的信息。并对管理员的account设为主键。
3.2主要功能实现
3.2.1登录界面package atm_client;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import comm.Card;
import comm.CardGLY;
public class Login extends JFrame {
JTextField tfAccount;
JPasswordField tfPwd;
JButton btOK,btCancel,btGLY;
Card currCard;
CardGLY currCardGLY;
private int count=0;
public void init(){
//界面
JLabel IAccount,IPwd,Itag;
IAccount= new JLabel(”账号:“);
IPwd= new JLabel(”密码:“);
Itag=new JLabel(”欢迎登录ATM系统“);
tfAccount = new JTextField();
tfPwd =new JPasswordField();
btOK=new JButton(”普通登录“);
btGLY=new JButton(”管理员登录“);
btCancel =new JButton(”取消“);
Itag.setFont(new Font(”“,Font.CENTER_BASELINE, 20));
btGLY.setFont(new Font(”“,Font.CENTER_BASELINE, 12));
btOK.setFont(new Font(”“,Font.CENTER_BASELINE, 12));
btCancel.setFont(new Font(”“,Font.CENTER_BASELINE, 12));
IAccount.setFont(new Font(”“,Font.CENTER_BASELINE, 18));
tfAccount.setFont(new Font(”“,Font.CENTER_BASELINE, 18));
tfPwd.setFont(new Font(”“,Font.CENTER_BASELINE, 18));
IPwd.setFont(new Font(”“,Font.CENTER_BASELINE, 18));
JPanel panelOne = new JPanel(null);
panelOne.setOpaque(false);
Itag.setBounds(120,15,350,30);
btOK.setBounds(40, 270, 100, 40);
btGLY.setBounds(160,270,100,40);
btCancel.setBounds(280,270,100,40);
tfAccount.setBounds(160,100,160,40);
IAccount.setBounds(90,105,80,40);
IPwd.setBounds(90, 165,80, 40);
tfPwd.setBounds(160,160,160,40);
panelOne.add(Itag);
panelOne.add(IPwd);
panelOne.add(IAccount);
panelOne.add(btCancel);
panelOne.add(btGLY);
panelOne.add(btOK);
panelOne.add(tfAccount);
panelOne.add(tfPwd);
this.add(panelOne);
this.setTitle(”精神小伙银行“);
this.setBounds(700, 250, 450, 400);
this.setVisible(true);
//监听
//普通用户登录
btOK.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// TODO Auto-generated method stub
String account=tfAccount.getText();
String pwd=new String(tfPwd.getPassword());
BufferedReader br=null;
PrintWriter pw=null;
String strEcho=”“;
try {
Socket s=new Socket(InetAddress.getByName(”127.0.0.1“), 8009);
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
pw=new PrintWriter(s.getOutputStream());
pw.write(”Loginrn“);
pw.write(account+”rn“);
pw.write(pwd+”rn“);
pw.flush();
strEcho=br.readLine();
if(strEcho.equals(”1“)){
JOptionPane.showMessageDialog(Login.this, ”对不起,您的账号有误!“);
tfAccount.setText(”“);
tfPwd.setText(”“);
}else if(strEcho.equals(”2“)){
float money =Float.parseFloat(br.readLine());
String dongjie=br.readLine();
String name=br.readLine();
currCard=new Card(account,pwd,money,dongjie,name);
JOptionPane.showMessageDialog(Login.this, ”欢迎登录河北金苑银行!“);
Login.this.dispose();
new MainFrame(br,pw,currCard).init();
}else if(strEcho.equals(”3“)){
count++;
if(count==3){
JOptionPane.showMessageDialog(Login.this, ”对不起,密码错误3次,您的卡已被冻结!请联系管理员“);
pw.write(”dongjiern“);
pw.flush();
Login.this.dispose();
}else {
JOptionPane.showMessageDialog(Login.this,”密码错误,请重新输入“);
String c=String.valueOf(count);
pw.write(c+”rn“);
pw.flush();
}
}else if(strEcho.equals(”4“)){
JOptionPane.showMessageDialog(Login.this,”对不起,您的卡已被冻结,请联系管理员“);
Login.this.dispose();
}
} catch(UnknownHostException e1){
// TODO Auto-generated catch block
e1.printStackTrace();
} catch(IOException e1){
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
//管理员登录
btGLY.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// TODO Auto-generated method stub
String account=tfAccount.getText();
String pwd=new String(tfPwd.getPassword());
BufferedReader br=null;
PrintWriter pw=null;
String strEcho=”“;
try {
Socket s=new Socket(InetAddress.getByName(”127.0.0.1“), 8009);
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
pw=new PrintWriter(s.getOutputStream());
pw.write(”GLYrn“);
pw.write(account+”rn“);
pw.write(pwd+”rn“);
pw.flush();
strEcho=br.readLine();
if(strEcho.equals(”9“)){
JOptionPane.showMessageDialog(Login.this, ”对不起,您的账号有误!“);
tfAccount.setText(”“);
tfPwd.setText(”“);
}else if(strEcho.equals(”8“)){
JOptionPane.showMessageDialog(Login.this,”您已经以管理员身份登录!“);
Login.this.dispose();
new MainFrameGLY(br,pw,currCardGLY).init();
}else if(strEcho.equals(”7“)){
JOptionPane.showMessageDialog(Login.this,”您的密码错误“);
}
} catch(UnknownHostException e1){
// TODO Auto-generated catch block
e1.printStackTrace();
} catch(IOException e1){
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
btCancel.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// TODO Auto-generated method stub
Login.this.dispose();
}
});
}
public static void main(String[] args){
new Login().init();
}
}
3.2.2普通存款界面package atm_client;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import comm.Card;
import atm_client.Take;
public class Save extends JFrame implements ActionListener{
// 存款界面按钮
JTextField tfmoney;
private JButton bt000,bt001,bt002,bt003,bt004,bt005,bt006,bt007,bt008,bt009;
private JButton bt100,bt200,bt300,bt500,bt1000;
private JButton btOK,btCancel,btRetry;
BufferedReader br;
PrintWriter pw;
Card currCard;
public Save(BufferedReader br,PrintWriter pw,Card currCard){
this.br=br;
this.pw=pw;
this.currCard=currCard;
}
public void init(){
JPanel panelTake = new JPanel(null);
panelTake.setBackground(new Color(119,119,253));
JLabel lblqukuan = new JLabel(”请输入您的存款数:“);
panelTake.add(lblqukuan);
lblqukuan.setBounds(115, 20, 150, 30);
lblqukuan=new JLabel(”提示:只能是100元或100元的整数倍。“);
panelTake.add(lblqukuan);
lblqukuan.setBounds(115, 50, 300, 30);
tfmoney=new JTextField(12);
tfmoney.setEnabled(false);
panelTake.add(tfmoney);
tfmoney.setBounds(115,90,200,30);
bt100=new JButton(”100“);
panelTake.add(bt100);
bt100.addActionListener(this);
bt100.setBounds(45,190,60,30);
bt200=new JButton(”200“);
panelTake.add(bt200);
bt200.addActionListener(this);
bt200.setBounds(115,190,60,30);
bt300=new JButton(”300“);
panelTake.add(bt300);
bt300.addActionListener(this);
bt300.setBounds(185,190,60,30);
bt500=new JButton(”500“);
panelTake.add(bt500);
bt500.addActionListener(this);
bt500.setBounds(255,190,60,30);
bt1000=new JButton(”1000“);
panelTake.add(bt1000);
bt1000.addActionListener(this);
bt1000.setBounds(325,190,65,30);
bt001=new JButton(”1“);
panelTake.add(bt001);
bt001.addActionListener(this);
bt001.setBounds(45,230,60,30);
bt002=new JButton(”2“);
panelTake.add(bt002);
bt002.addActionListener(this);
bt002.setBounds(115,230,60,30);
bt003=new JButton(”3“);
panelTake.add(bt003);
bt003.addActionListener(this);
bt003.setBounds(185,230,60,30);
bt004=new JButton(”4“);
panelTake.add(bt004);
bt004.addActionListener(this);
bt004.setBounds(255,230,60,30);
bt005=new JButton(”5“);
panelTake.add(bt005);
bt005.addActionListener(this);
bt005.setBounds(325,230,65,30);
bt006=new JButton(”6“);
panelTake.add(bt006);
bt006.addActionListener(this);
bt006.setBounds(45,270,60,30);
bt007=new JButton(”7“);
panelTake.add(bt007);
bt007.addActionListener(this);
bt007.setBounds(115,270,60,30);
bt008=new JButton(”8“);
panelTake.add(bt008);
bt008.addActionListener(this);
bt008.setBounds(185,270,60,30);
bt009=new JButton(”9“);
panelTake.add(bt009);
bt009.addActionListener(this);
bt009.setBounds(255,270,60,30);
bt000=new JButton(”0“);
panelTake.add(bt000);
bt000.addActionListener(this);
bt000.setBounds(325,270,65,30);
btOK=new JButton(”确定“);
panelTake.add(btOK);
btOK.addActionListener(this);
btOK.setBounds(70,140,80,30);
btRetry=new JButton(”重输“);
panelTake.add(btRetry);
btRetry.addActionListener(this);
btRetry.setBounds(175,140,80,30);
btCancel=new JButton(”返回“);
panelTake.add(btCancel);
btCancel.addActionListener(this);
btCancel.setBounds(280,140,80,30);
this.setTitle(”存款!“);
this.add(panelTake);
this.setSize(435,350);
this.setVisible(true);
this.setLocation(500, 250);
}
@Override
public void actionPerformed(ActionEvent arg0){
// TODO Auto-generated method stub
if(arg0.getSource()==bt100||arg0.getSource()==bt200||arg0.getSource()==bt300||arg0.getSource()==bt500||arg0.getSource()==bt1000)
tfmoney.setText(arg0.getActionCommand());
else if(arg0.getSource()==bt000||arg0.getSource()==bt001||arg0.getSource()==bt002||arg0.getSource()==bt003||arg0.getSource()==bt004||arg0.getSource()==bt005||arg0.getSource()==bt006||arg0.getSource()==bt007||arg0.getSource()==bt008||arg0.getSource()==bt009){
tfmoney.setText(tfmoney.getText()+arg0.getActionCommand());
}else if(arg0.getSource()==btOK){
int saveMoney=Integer.parseInt(tfmoney.getText());
if(saveMoney%100!=0){
JOptionPane.showMessageDialog(Save.this, ”对不起,您输入的金额不符合规定!“);
tfmoney.setText(”“);
}
else{
//发送新的账户信息给服务器
pw.write(”savern“);
pw.write(saveMoney+”rn“);
pw.flush();
//等待响应,更新当前登录账号
String strEcho=”“;
try {
strEcho = br.readLine();
if(strEcho.equals(”Success“)){
currCard.setMoney(currCard.getMoney()+saveMoney);
JOptionPane.showMessageDialog(null, ”恭喜你成功存款“+saveMoney+”元n当前账户余额为:“+currCard.getMoney());
tfmoney.setText(”“);
} else if(strEcho.equals(”Failure“)){
JOptionPane.showMessageDialog(Save.this,”存款失败“);
}
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}else if(arg0.getSource()==btCancel){
Save.this.dispose();
new MainFrame(br,pw,currCard).init();
}else if(arg0.getSource()==btRetry){
tfmoney.setText(”“);
}
}
}
3.2.3用户转账界面package atm_client;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import comm.Card;
public class Trans extends JFrame {
JTextField Taccount,Tmoney;
JButton btOk,btCancel;
JLabel lAccount,lMoney;
BufferedReader br;
PrintWriter pw;
Card currCard;
public Trans(BufferedReader br,PrintWriter pw,Card currCard){
this.br=br;
this.pw=pw;
this.currCard=currCard;
}
public void init(){
JPanel panelTrans=new JPanel(null);
panelTrans.setLayout(new GridLayout(3,2));
lAccount =new JLabel(”账户:“);
lMoney =new JLabel(”金额:“);
btOk = new JButton(”确定“);
btCancel = new JButton(”取消“);
Taccount=new JTextField();
Tmoney = new JTextField();
panelTrans.add(lAccount);
panelTrans.add(Taccount);
panelTrans.add(lMoney);
panelTrans.add(Tmoney);
panelTrans.add(btOk);
panelTrans.add(btCancel);
this.add(panelTrans);
this.setTitle(”转账!“);
this.setSize(300,160);
this.setLocation(500, 250);
this.setVisible(true);
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btOk.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// TODO Auto-generated method stub
if(Taccount.getText().equals(”“)){
JOptionPane.showMessageDialog(Trans.this, ”请输入账号“);
}else if(Tmoney.getText().equals(”“)){
JOptionPane.showMessageDialog(Trans.this, ”请输入金额“);
}else {
pw.write(”transrn“);
pw.write(Taccount.getText()+”rn“);
pw.write(Tmoney.getText()+”rn“);
pw.flush();
String strEcho=”“;
try {
strEcho=br.readLine();
if(strEcho.equals(”Success“)){
currCard.setMoney(currCard.getMoney()-Float.parseFloat(Tmoney.getText()));
JOptionPane.showMessageDialog(Trans.this, ”转账成功“);
}else if(strEcho.equals(”1“)){
JOptionPane.showMessageDialog(Trans.this, ”账号不存在“);
}else if(strEcho.equals(”2“)){
JOptionPane.showMessageDialog(Trans.this,”不能向自己转账“);
}else if(strEcho.equals(”3“)){
JOptionPane.showMessageDialog(Trans.this,”余额不足“);
}else if(strEcho.equals(”Fuilure“)){
JOptionPane.showMessageDialog(Trans.this,”转账失败“);
}
} catch(IOException e1){
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
btCancel.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// TODO Auto-generated method stub
Trans.this.dispose();
}
});
}
}
3.2.4手机缴费package atm_client;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import comm.Card;
public class Communi extends JFrame{
JTextField TNumber,Tmoney;
JButton btOk,btCancel;
JLabel INumber,lMoney;
BufferedReader br;
PrintWriter pw;
Card currCard;
public Communi(BufferedReader br,PrintWriter pw,Card currCard){
this.br=br;
this.pw=pw;
this.currCard=currCard;
}
public void init(){
JPanel panelTrans=new JPanel(null);
panelTrans.setLayout(new GridLayout(3,2));
INumber =new JLabel(”账户:“);
lMoney =new JLabel(”金额:“);
btOk = new JButton(”确定“);
btCancel = new JButton(”取消“);
TNumber=new JTextField();
Tmoney = new JTextField();
panelTrans.add(INumber);
panelTrans.add(TNumber);
panelTrans.add(lMoney);
panelTrans.add(Tmoney);
panelTrans.add(btOk);
panelTrans.add(btCancel);
this.add(panelTrans);
this.setTitle(”手机缴费!“);
this.setSize(300,160);
this.setLocation(500, 250);
this.setVisible(true);
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btOk.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// TODO Auto-generated method stub
if(TNumber.getText().equals(”“)){
JOptionPane.showMessageDialog(Communi.this, ”请输入手机号“);//导入类——消息对话框
}else if(Tmoney.getText().equals(”“)){
JOptionPane.showMessageDialog(Communi.this, ”请输入金额“);
}else {
pw.write(”communirn“);
pw.write(TNumber.getText()+”rn“);
pw.write(Tmoney.getText()+”rn“);
pw.flush();
String strEcho=”“;
try {
strEcho=br.readLine();
if(strEcho.equals(”Success“)){
currCard.setMoney(currCard.getMoney()-Float.parseFloat(Tmoney.getText()));
JOptionPane.showMessageDialog(Communi.this, ”充值成功“);
Communi.this.dispose();
}else if(strEcho.equals(”1“)){
JOptionPane.showMessageDialog(Communi.this, ”手机号不存在“);
}else if(strEcho.equals(”2“)){
JOptionPane.showMessageDialog(Communi.this,”余额不足“);
}else if(strEcho.equals(”Fuilure“)){
JOptionPane.showMessageDialog(Communi.this,”充值失败“);
}
} catch(IOException e1){
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
btCancel.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// TODO Auto-generated method stub
Communi.this.dispose();
}
});
}
}
3.2.5用户取款package atm_client;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import comm.Card;
import atm_client.Take;
public class Take extends JFrame implements ActionListener{
// 取款界面按钮
JTextField tfmoney;
private JButton bt000,bt001,bt002,bt003,bt004,bt005,bt006,bt007,bt008,bt009;
private JButton bt100,bt200,bt300,bt500,bt1000;
private JButton btOK,btCancel,btRetry;
BufferedReader br;
PrintWriter pw;
Card currCard;
public Take(BufferedReader br,PrintWriter pw,Card currCard){
this.br=br;
this.pw=pw;
this.currCard=currCard;
}
public void init(){
JPanel panelTake = new JPanel(null);
panelTake.setBackground(new Color(119,119,253));
JLabel lblqukuan = new JLabel(”请输入您要取的钱数:“);
panelTake.add(lblqukuan);
lblqukuan.setBounds(115, 20, 150, 30);
lblqukuan=new JLabel(”提示:只能是100元或100元的整数倍。“);
panelTake.add(lblqukuan);
lblqukuan.setBounds(115, 50, 300, 30);
tfmoney=new JTextField(12);
tfmoney.setEnabled(false);
panelTake.add(tfmoney);
tfmoney.setBounds(115,90,200,30);
bt100=new JButton(”100“);
panelTake.add(bt100);
bt100.addActionListener(this);
bt100.setBounds(45,190,60,30);
bt200=new JButton(”200“);
panelTake.add(bt200);
bt200.addActionListener(this);
bt200.setBounds(115,190,60,30);
bt300=new JButton(”300“);
panelTake.add(bt300);
bt300.addActionListener(this);
bt300.setBounds(185,190,60,30);
bt500=new JButton(”500“);
panelTake.add(bt500);
bt500.addActionListener(this);
bt500.setBounds(255,190,60,30);
bt1000=new JButton(”1000“);
panelTake.add(bt1000);
bt1000.addActionListener(this);
bt1000.setBounds(325,190,65,30);
bt001=new JButton(”1“);
panelTake.add(bt001);
bt001.addActionListener(this);
bt001.setBounds(45,230,60,30);
bt002=new JButton(”2“);
panelTake.add(bt002);
bt002.addActionListener(this);
bt002.setBounds(115,230,60,30);
bt003=new JButton(”3“);
panelTake.add(bt003);
bt003.addActionListener(this);
bt003.setBounds(185,230,60,30);
bt004=new JButton(”4“);
panelTake.add(bt004);
bt004.addActionListener(this);
bt004.setBounds(255,230,60,30);
bt005=new JButton(”5“);
panelTake.add(bt005);
bt005.addActionListener(this);
bt005.setBounds(325,230,65,30);
bt006=new JButton(”6“);
panelTake.add(bt006);
bt006.addActionListener(this);
bt006.setBounds(45,270,60,30);
bt007=new JButton(”7“);
panelTake.add(bt007);
bt007.addActionListener(this);
bt007.setBounds(115,270,60,30);
bt008=new JButton(”8“);
panelTake.add(bt008);
bt008.addActionListener(this);
bt008.setBounds(185,270,60,30);
bt009=new JButton(”9“);
panelTake.add(bt009);
bt009.addActionListener(this);
bt009.setBounds(255,270,60,30);
bt000=new JButton(”0“);
panelTake.add(bt000);
bt000.addActionListener(this);
bt000.setBounds(325,270,65,30);
btOK=new JButton(”确定“);
panelTake.add(btOK);
btOK.addActionListener(this);
btOK.setBounds(70,140,80,30);
btRetry=new JButton(”重输“);
panelTake.add(btRetry);
btRetry.addActionListener(this);
btRetry.setBounds(175,140,80,30);
btCancel=new JButton(”返回“);
panelTake.add(btCancel);
btCancel.addActionListener(this);
btCancel.setBounds(280,140,80,30);
this.setTitle(”取款!“);
this.add(panelTake);
this.setSize(435,350);
this.setVisible(true);
this.setLocation(500, 250);
}
@Override
public void actionPerformed(ActionEvent arg0){
// TODO Auto-generated method stub
if(arg0.getSource()==bt100||arg0.getSource()==bt200||arg0.getSource()==bt300||arg0.getSource()==bt500||arg0.getSource()==bt1000)
tfmoney.setText(arg0.getActionCommand());
else if(arg0.getSource()==bt000||arg0.getSource()==bt001||arg0.getSource()==bt002||arg0.getSource()==bt003||arg0.getSource()==bt004||arg0.getSource()==bt005||arg0.getSource()==bt006||arg0.getSource()==bt007||arg0.getSource()==bt008||arg0.getSource()==bt009){
tfmoney.setText(tfmoney.getText()+arg0.getActionCommand());
}else if(arg0.getSource()==btOK){
int takeMoney=Integer.parseInt(tfmoney.getText());
if(currCard.getMoney() JOptionPane.showMessageDialog(Take.this, ”对不起,您的余额不足!“); tfmoney.setText(”“); }else if(takeMoney%100!=0){ JOptionPane.showMessageDialog(Take.this, ”对不起,您输入的金额不符合规定!“); tfmoney.setText(”“); } else{ //发送新的账户信息给服务器 pw.write(”takern“); pw.write(takeMoney+”rn“); pw.flush(); //等待响应,更新当前登录账号 String strEcho=”“; try { strEcho = br.readLine(); if(strEcho.equals(”Success“)){ currCard.setMoney(currCard.getMoney()-takeMoney); JOptionPane.showMessageDialog(null, ”恭喜你成功取款“+takeMoney+”元n当前账户余额为:“+currCard.getMoney()); tfmoney.setText(”“); } else if(strEcho.equals(”Failure“)){ JOptionPane.showMessageDialog(Take.this,”取款失败“); } } catch(IOException e){ // TODO Auto-generated catch block e.printStackTrace(); } } }else if(arg0.getSource()==btCancel){ Take.this.dispose(); }else if(arg0.getSource()==btRetry){ tfmoney.setText(”“); } } } } 3.2.6冻结 package atm_client; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import comm.CardGLY; public class DongJie extends JFrame implements ActionListener{ JButton btOK,btCancel; JTextField Account,Name; BufferedReader br; PrintWriter pw; CardGLY currCardGLY; public DongJie(BufferedReader br,PrintWriter pw,CardGLY currCardGLY){ this.br=br; this.pw=pw; this.currCardGLY=currCardGLY; } public void init(){ JLabel IAccount,IName,Itag; IAccount =new JLabel(”账号“); IName=new JLabel(”用户名“); Itag=new JLabel(”请输入要冻结的账号及用户名“); Account =new JTextField(); Name =new JTextField(); btOK=new JButton(”确定“); btCancel=new JButton(”取消“); Itag.setFont(new Font(”“,Font.CENTER_BASELINE, 20)); btOK.setFont(new Font(”“,Font.CENTER_BASELINE, 12)); btCancel.setFont(new Font(”“,Font.CENTER_BASELINE, 12)); IAccount.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); Account.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); Name.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); IName.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); JPanel panelOne = new JPanel(null); panelOne.setOpaque(false); Itag.setBounds(80,15,350,30); btOK.setBounds(80, 270, 100, 40); btCancel.setBounds(240,270,100,40); Account.setBounds(160,100,160,40); IAccount.setBounds(90,105,80,40); IName.setBounds(90, 165,80, 40); Name.setBounds(160,160,160,40); btCancel.addActionListener(this); btOK.addActionListener(this); panelOne.add(Itag); panelOne.add(IName); panelOne.add(IAccount); panelOne.add(btCancel); panelOne.add(btOK); panelOne.add(Account); panelOne.add(Name); this.add(panelOne); this.setTitle(”代小龙+安梓玮+侯硕“); this.setBounds(700, 250, 450, 400); this.setVisible(true); } @Override public void actionPerformed(ActionEvent arg0){ // TODO Auto-generated method stub if(arg0.getSource()==btOK){ if(Account.getText().equals(”“)||Name.getText().equals(”“)){ JOptionPane.showMessageDialog(DongJie.this,”用户名和账号不能为空“); }else { pw.write(”dongjiern“); pw.write(Account.getText()+”rn“); pw.write(Name.getText()+”rn“); pw.flush(); System.out.println(Name.getText()+Name.getText()); try { String strEcho=br.readLine(); if(strEcho.equals(”9“)){ JOptionPane.showMessageDialog(DongJie.this, ”账号不存在,请重新输入“); Account.setText(”“); Name.setText(”“); }else if(strEcho.equals(”7“)){ JOptionPane.showMessageDialog(DongJie.this, ”冻结成功“); DongJie.this.dispose(); new Ask(br, pw, currCardGLY).init(); }else if(strEcho.equals(”5“)){ JOptionPane.showMessageDialog(DongJie.this, ”用户名错误“); Name.setText(”“); }else if(strEcho.equals(”6“)){ JOptionPane.showMessageDialog(DongJie.this, ”您的账号已被冻结“); DongJie.this.dispose(); }else if(strEcho.equals(”8“)){ JOptionPane.showMessageDialog(DongJie.this, ”冻结失败“); } } catch(IOException e){ // TODO Auto-generated catch block e.printStackTrace(); } } }else if(arg0.getSource()==btCancel){ DongJie.this.dispose(); } } } package atm_client; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import comm.CardGLY; public class Open extends JFrame implements ActionListener{ JTextField tfname;//文本框 JTextField tfmoney; JPasswordField tfpwd;//密码框 JPasswordField tfpwd1; JButton btOK,btCancel; CardGLY currCardGLY; BufferedReader br; PrintWriter pw; public Open(BufferedReader br,PrintWriter pw,CardGLY currCardGLY){ this.br=br; this.pw=pw;//文本字节流写入 this.currCardGLY=currCardGLY; } //初始化 public void init(){ JLabel Iname;//标签组件 JLabel Imoney; JLabel Ipwd,Ipwd1; JLabel Itag=new JLabel(”请输入要开户用户的基本信息“); Ipwd=new JLabel(”密码:“); Ipwd1=new JLabel(”确认密码“); Iname=new JLabel(”姓名:“); Imoney=new JLabel(”预存金额“); tfname=new JTextField(); tfmoney=new JTextField(); btOK=new JButton(”确定“); btCancel=new JButton(”取消“); tfpwd=new JPasswordField(); tfpwd1=new JPasswordField(); Itag.setFont(new Font(”“,Font.CENTER_BASELINE, 20)); Iname.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); tfmoney.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); tfname.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); tfpwd.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); tfpwd1.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); Ipwd.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); Ipwd1.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); Imoney.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); btOK.setFont(new Font(”“,Font.CENTER_BASELINE, 12)); btCancel.setFont(new Font(”“,Font.CENTER_BASELINE, 12)); JPanel panelOne = new JPanel(null); panelOne.setOpaque(false);//设置控件透明 Itag.setBounds(80,15,350,30); Iname.setBounds(70,85,80,40); tfname.setBounds(200,80,160,40); Ipwd.setBounds(70, 135, 80, 40); tfpwd.setBounds(200, 130, 160, 40); Ipwd1.setBounds(70, 185,80, 40); tfpwd1.setBounds(200, 180, 160, 40); Imoney.setBounds(70, 235, 80, 40); tfmoney.setBounds(200, 230, 160, 40); btOK.setBounds(80, 280, 100, 40); btCancel.setBounds(240,280,100,40); btOK.addActionListener(this); btCancel.addActionListener(this); panelOne.add(Itag); panelOne.add(Iname); panelOne.add(Ipwd); panelOne.add(Ipwd1); panelOne.add(Imoney); panelOne.add(tfname); panelOne.add(tfpwd); panelOne.add(tfpwd1); panelOne.add(tfmoney); panelOne.add(btCancel); panelOne.add(btOK); this.add(panelOne); this.setTitle(”代小龙+安梓玮+侯硕“); this.setBounds(700, 250, 450, 400); this.setVisible(true); } //监听button.@Override //socket编程,client发出消息,在Server中接收,并且在接收时采用readline()方法时需要注意,//readline()方法要读到分隔符才会完成读取操作,用pw.write,或者pw.println public void actionPerformed(ActionEvent arg0){ // TODO Auto-generated method stub if(arg0.getSource()==btOK){ //如果事件源始按钮OK,则进行下面操作 if(tfname.getText().equals(”“)||tfpwd.getText().equals(”“)||tfpwd.getText().equals(”“)){ JOptionPane.showMessageDialog(Open.this,”账号密码不能为空“);//导入类——消息对话框 }else if(!tfpwd.getText().equals(tfpwd1.getText())){ JOptionPane.showMessageDialog(Open.this,”两次输入的密码不相同“); tfpwd.setText(”“); tfpwd1.setText(”“); }else if(tfmoney.getText().equals(”“)){ JOptionPane.showMessageDialog(Open.this,”若不需要存钱,请输入0“); }else if(tfpwd.getText().equals(tfpwd1.getText())&&!tfname.getText().equals(”“)&&!tfmoney.getText().equals(”“)){ pw.write(”openrn“);//在服务器获取输入流写入一段字符 pw.write(tfname.getText()+”rn“); pw.write(tfpwd.getText()+”rn“); pw.write(tfmoney.getText()+”rn“); pw.flush(); try { String strEcho=br.readLine(); if(strEcho.equals(”1“)){ JOptionPane.showMessageDialog(Open.this,”开户失败!有用户名重复的可能!“); }else if(strEcho.equals(”2“)){ String account=br.readLine(); JOptionPane.showMessageDialog(Open.this,”开户成功!您的账号为“+account+”,请牢记您的账号“); Open.this.dispose(); } } catch(IOException e){ // TODO Auto-generated catch block e.printStackTrace(); } } }else if(arg0.getSource()==btCancel){ Open.this.dispose(); } } } package atm_client; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import comm.CardGLY; public class Close extends JFrame implements ActionListener { BufferedReader br; PrintWriter pw; CardGLY currCardGLY; private JButton btOK,btCancel; private JTextField tfAccount; private JPasswordField tfPwd; public Close(BufferedReader br,PrintWriter pw,CardGLY currCardGLY){ this.br=br; this.pw=pw; this.currCardGLY=currCardGLY; } public void init(){ JLabel IAccount,IPwd,Itag; IAccount= new JLabel(”账号:“); IPwd= new JLabel(”密码:“); Itag=new JLabel(”请输入要销户的账号及密码“); tfAccount=new JTextField(); tfPwd=new JPasswordField(); btOK=new JButton(”确定“); btCancel=new JButton(”取消“); Itag.setFont(new Font(”“,Font.CENTER_BASELINE, 20)); btOK.setFont(new Font(”“,Font.CENTER_BASELINE, 12)); btCancel.setFont(new Font(”“,Font.CENTER_BASELINE, 12)); IAccount.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); tfAccount.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); tfPwd.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); IPwd.setFont(new Font(”“,Font.CENTER_BASELINE, 18)); JPanel panelOne = new JPanel(null); panelOne.setOpaque(false); Itag.setBounds(120,15,350,30); btOK.setBounds(80, 270, 100, 40); btCancel.setBounds(240,270,100,40); tfAccount.setBounds(160,100,160,40); IAccount.setBounds(90,105,80,40); IPwd.setBounds(90, 165,80, 40); tfPwd.setBounds(160,160,160,40); btCancel.addActionListener(this); btOK.addActionListener(this); panelOne.add(Itag); panelOne.add(IPwd); panelOne.add(IAccount); panelOne.add(btCancel); panelOne.add(btOK); panelOne.add(tfAccount); panelOne.add(tfPwd); this.add(panelOne); this.setTitle(”代小龙+安梓玮+侯硕“); this.setBounds(700, 250, 450, 400); this.setVisible(true); } @Override public void actionPerformed(ActionEvent arg0){ // TODO Auto-generated method stub if(arg0.getSource()==btOK){ String account=tfAccount.getText(); String pwd=new String(tfPwd.getPassword()); pw.write(”closern“); pw.write(account+”rn“); pw.write(pwd+”rn“); pw.flush(); String strEcho; try { strEcho=br.readLine(); if(strEcho.equals(”7“)){ JOptionPane.showMessageDialog(Close.this, ”销户成功“); }else if(strEcho.equals(”9“)){ JOptionPane.showMessageDialog(Close.this, ”您输入的账号不存在“); tfAccount.setText(”“); tfPwd.setText(”“); }else if(strEcho.equals(”8“)){ JOptionPane.showMessageDialog(Close.this, ”销户失败“); }else if(strEcho.equals(”6“)){ JOptionPane.showMessageDialog(Close.this, ”您的密码错误“); tfPwd.setText(”"); } } catch(IOException e){ // TODO Auto-generated catch block e.printStackTrace(); } }else if(arg0.getSource()==btCancel){ Close.this.dispose(); } } }项目总结及展望 本次课程设计主要做的是模拟ATM机,在实现传统的ATM机基础功能的情况下,我们还增添新的内容,用户明细以及话费缴费。实现了普通用户与管理员登录。管理员对用户账号的冻结,解冻。连接数据库并实时更新。将普通用户和管理员的信息分别放在两个表中。 在实现过程中,由于考虑和实现不充分,表的结构过于简单。在实现话费充值上号码预存实现的不人性化,我们后续会加以完善。在接下来的学习中,我们想更加完善ATM功能,并增加新的特色,完善界面。心得体会 通过这次的c/s程序设计,从了解用户需求,到设计数据库,编写代码,连接数据库,调试程序,实现功能我们都得到了很大的进步,我们遇到过很多Bug,我们请教别人,上网查询,最终可以说是得到解决,把老师在课上所授的知识应用到实践中去。c/s程序设计中,是java与连接数据库的统一。为了防止开户生成的账号重复,我们在数据库中对相应的表设置主键,以免重复,在明细中,我们修复了很多问题,克服了很多困难,最终得以实现,感谢申晨老师的帮助,让我们更加深入了解Java语言设计并应用到实践中去。感受到了Java语言编程的魅力,在接下来的时间中,我们不会停止对Java网络项目编程的探索和学习。 参 考 文 献 [1] Eric.Java编程思想[M].第4版.机械工业出版社, 机械工业出版社 [2] JAVA从入门到精通[M].北京:清华大学出版社, 2005.4 [3]萨师煊,王珊.《数据库系统概论》.高等教育出版社,2002.2 [4] Brown.JAVA编程指南(第二版)[M].电子工业出版社,2003.3 [5] 清宏计算机工作室.JAVA编程技巧[M].机械工业出版社,2004.5 【atm银行取款机】推荐阅读: 助农取款报告05-24 工商银行网上银行业务06-07 中国工商银行网上银行07-03 建设银行个人手机银行07-09 2024银行工资待遇银行工资排名10-02 模拟银行实习,个人银行卡业务06-21 电话银行与手机银行课后测试07-05 中国邮政储蓄银行个人网上银行06-22 银行实习总结-大学生银行实习总结07-04 中国建设银行手机银行业务介绍09-20