ATM柜员机的设计与实现

                                     ATM柜员机的设计与实现

 

  1. 项目背景

 

ATM柜员机系统在银行业务流程当中起着承上启下的作用,其重要性不言而喻。但是,目前许多银行在具体的一些业务流程处理过程中仍然使用手工操作的方式来实施,费时、费力,效率低下,而且无法达到理想的效果。然而 ATM自动取款功能不带为银行节省大量财力人力,还为广大城市用户带来便捷。ATM柜员机系统向用户提供一个方便、简单、随时随地可以存取款的现代计算机化的网络系统。可以大大减少工作人员摩羯月人力资源的开销,同时由于手续程序减少也可以减轻业务员的工作负担,有效地提高了整体的工作效率和精确度,减少了用户办理业务的等待时间。为此,我们开发了这个系统。

 

2  ATM柜员机系统分析

 

2.1 需求描述

2.1.1ATM柜员机介绍

ATM柜员机使用与ATM机相似的图形用户界面,当用户在登录界面输入给定的卡号和密码时,系统能登录ATM柜员机系统,通过数据链接操作来达到独立的客户与机器交互从而进行取款、存款、转账、查询余额、修改密码等业务办理的目的。
 

2.1.2 基本目标

ATM柜员机主要是由各个实体窗口组成,它是由登录页面、选择服务、存款、取款、查询余额、修改密码以及查看交易记录等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求,让用户在电脑上可以轻松体验ATM取款机的使用流程,以达到易学易用的效果,避免用户在真实的ATM机上出现失误,带来不必要的损失。


2.1.3 经济目标


    由于本软件的主要背景(为课程设计)在经济上不注重直接的经济收益,而是注重小组成员整体水平的提高。


2.1.4 可行性研究所采用的方法


    根据调查,本小组成员多数有JAVA编程经验,也具备MY SQL的使用经验,因而开发此系统采用JAVA结合MY SQL的数据库系统开发。


2.1.5 设计目标


    为了减少银行的业务处理压力,尽量节省人们取钱所花费的时间和价值;并且尽可能的防止一些非法的业务操作,同时它的使用可以有效解决用户信息和资金信息的繁杂问题。


2.1.6 设计及约束条件


a. ATM面向客户十分广泛,所以界面设计要力求简单明了,只要认识汉字并具备实际行动能力的人,就可以顺利进行操作,对于用户输入的数据,系统能进行严格的数据检验,尽可能的排除人为地错误。
b. 开发人员应具备相应的开发能力,懂C++ 与java编程,小组成员能够根据计划的要求,按时完成系统的每一部分,保证后面的开发进程可以顺利进行。但根据现有条件和知识,我们还得在技术方面进行学习和提高。


2.1.7 工作原理


a. 先建立数据库且追建数据库的驱动程序。
b. 在使用时,分为后台管理和前台操作。
c. 用户输入账户基本信息进行登录,然后方能进行下一步操作 。

 

2.2 需求分析

2.1.1 系统功能概述

A.主要对象

(1)用户:使用ATM自动取款机进行现金交易。进行取款、查询余额、设置密码、转账等操作。
(2)数据库:对用户的所有信息进行存储更新。

B.主要功能
(1)取款功能:用户按照系统输入要求输入取款金额即可取出相应金额的现金。
(2)查询余额功能:用户可以查看账户所剩现金余额。
(3)修改密码功能:如果用户想要修改当前密码,通过系统可以设置新密码。
(4)转账功能:用户可以通过该功能将自己账户上的金额转到其他账户。

首先,ATM要求用户输入密码,接下来ATM把从银行卡上读到的信息以及用户输入的密码传给ATM自动取款机系统,系统通过于数据库中的信息进行核对,如果密码正确ATM就要求用户选择事务类型(取款、查询等),直至用户选择退出应用服务,询问用户是否退出银行卡结束服务,如果用户选择结束,则退出银行卡,系统重回登陆界面。

C. 相关界面
(1)登录界面:

在整个的系统中,首先用户要输入正确用户登录密码以后才可以进入主界面进行相关的操作。

(2)主界面:

当用户输入正确的用户密码以后,出现主界面,包括以下的一些功能:
a) 主界面有“查询余额”“取款”“转账”“修改密码”等功能选项。
b) 主界面中还有“退卡”功能选项,点击即退出系统服务。

 

(3)取款界面:

a) 首先你可以输入取款的金额,输入的必须为50倍数的数字,否则系统会提示输入的金额错误,请重新输入。如果屏幕上有便捷提示,比如:1000元、800元、500元等。如果上边有你想要取款的金额,你可以按相对应的按键就可以了,如果没有,你再找一个 “其他金额”按下之后,就可以自由输入自己想取的金额了,输入金额之后,按“确认”,即完成取款功能。
b) 正确输入取款的金额后,直接点击取款,会再次确认你取款的金额,点击“是”即可以取出取款机吐出的现金,并且数据更新到相关的数据库文件中,以便以后查询。
 

(4)余额查询界面:

在主界面中点击余额查询功能选项,就会弹出余额的窗口。

(5)修改密码界面

在主界面中点击修改密码功能选项,进入修改密码功能界面,系统要求首先输入旧密码,再输入写密码,并对新密码进行第二次确认,全部输入正确修改功能完成。

(6)转账界面:
    当点击转账功能选项,会出现转账的界面,这时就可以进行转账;分别输入转入的账户和转入的金额,直接点击转入。若转入过程中出错会有相关的提示的操作。
 

 

2.1.2 系统用例规约描述

1).取款的用例规约

用例名称:ATM取款
简述:客户持银行卡(本行或其他行)从ATM提取现金
actors:客户和银行主机

基本流:

1.客户插入银行卡。
2.ATM从银行卡读入卡号(含银行标识和账号),验证卡的有效性。
3.客户输入密码。
4.ATM验证帐号和密码。
5.ATM显示包括取款在内的服务功能,客户选择“取款”。
6.输入取款额:客户输入数量为50元的倍数的取款额。
7.ATM向银行主机通知卡号、密码、账号和取款额,获得含有最新余额的取款成功确认信息。
8.ATM打印并吐出凭条。
9.ATM清点并吐出现金,记录取款成功。
10.ATM询问客户是否继续服务。
11.客户选择否,ATM吐出银行卡,结束用例,否则回到步骤5。

备选流:
1. 客户取消服务:
ATM记录服务取消,打印凭条,吐出凭条和银行卡,[用例失败]
2. 客户未及时输入超过30秒:
ATM吞卡,[用例失败]
3. 卡无效:
ATM吞卡,[用例失败]
4. 读卡器或卡被损坏:
ATM吞卡,[用例失败]
5. 密码错:

5.1客户重新输入密码

5.2累计3次密码错误:ATM吞卡,[用例失败]

6. 无此帐号:ATM吞卡,[用例失败]

7. ATM无现金:ATM不显示“取款”功能,客户可选择其他服务, [用例失败]

8. 取款额超过ATM现金余额:ATM要求客户重新输入取款额。

9. 帐户余额不足:ATM要求客户重新输入取款额。

10. 取款额超过当日最高限额:ATM要求客户重新输入取款额。

11. 网络或银行主机失效、通讯超时:ATM记录服务取消,打印凭条,吐出凭条和银行卡,[用例失败]

12. 凭条打印失败,纸用完或卡纸:

12.1 ATM通知银行主机取消取款

12.2 ATM记录服务取消,吐出银行卡,[用例失败]

13. 吐现金失败:

13.1 ATM通知银行主机取消取款

13.2 ATM记录服务取消,吐出银行卡,[用例失败]

14. 客户未及时取走卡:ATM吞卡,[用例失败]

业务规则:

1. 单笔取款金额上限为5000元
2. 每月前3笔取款不收手续费

 

2). 转账的用例规约

名称:ATM转账
简述:客户持银行卡(本行)从ATM可以将卡内金额转至其他有效银行卡账户中
actors:客户和银行主机
基本流:
    1.客户插入银行卡。
    2.ATM从银行卡读入卡号(含银行标识和账号),验证卡的有效性。
    3.客户输入密码。
    4.ATM验证帐号和密码。
    5.ATM显示包括取款在内的服务功能,客户选择“转账”。
    6.输入转账金额。

7.ATM向银行主机通知卡号、密码、账号和取款额,获得含有最新余额的转账成功确认信息。

8.ATM打印并吐出凭条。
    9.记录转账成功。
    10.ATM询问客户是否继续服务。
    11.客户选择否,ATM吐出银行卡,结束用例,否则回到步骤5。
    [用例结束]
备选流:

1. 客户取消服务:ATM记录服务取消,打印凭条,吐出凭条和银行卡,[用例失败]

2. 客户未及时输入超过30秒:ATM吞卡,[用例失败]

3. 卡无效:ATM吞卡,[用例失败]

4. 读卡器或卡被损坏:ATM吞卡,[用例失败]

5. 密码错:

5.1客户重新输入密码

5.2累计3次密码错误:ATM吞卡,[用例失败]

6. 无此帐号:ATM吞卡,[用例失败]

7.帐户余额不足:ATM要求客户重新输入转账金额。

8.转账额超过当日最高限额:ATM要求客户重新输入转账金额。

9.网络或银行主机失效、通讯超时:ATM记录服务取消,打印凭条,吐出凭条和银行卡,[用例失败]

10.凭条打印失败,纸用完或卡纸:

10.1 ATM通知银行主机取消取款

    10.2 ATM记录服务取消,吐出银行卡,[用例失败]

11.客户未及时取走卡:ATM吞卡,[用例失败]
业务规则:

1. 单日转账不得超过50000元

    2. 本地本行转账免费

3. 本地异行转账+5元每笔

2.1.3用例模型

  系统Use-Case模型:

2.1.3 活动图

验证密码活动图:

查询信息活动图:

存款活动图:

 

取款活动图:

转账活动图:

2.1.4 顺序图

取款顺序图:

转账顺序图:

 

3 网上书店系统设计

3.1 体系结构的设计

(1)本系统使用java语言进行编写,数据库使用MySQL,采用面向对象的设计方法,使用C/S体系结构。

  1. 模块的层次关系(采用结构图描述),包含结构图中每个模块的简单说明

 

面向对象的包图:

 

3.2 详细设计

     面向对象的方法描述格式:

3.2.1管理员类,进行账号密码的管理。

3.2.2 业务明细,记录客户行为

3.3.3 顾客类,记录顾客信息及行为。

3.3 数据库设计

3.3.1 数据库的概要模型

 

3.3.2 数据库的关系模型

管理员:管理员名称,密码,创建时间,修改时间,备注

用户:持卡人,手机号码, 身份证号, 银行卡号, 密码, 余额, 银行卡状态,

         创建时间, 修改时间, 备注

明细: 持卡人id, 持卡人id, 金钱, 创建时间, 备注

3.3.3 数据库的物理模型

1manager.(管理员)

字段

类型

长度

描述

是否为主键

是否允许为空

id

int

11

主键

是(自增)

name

char

50

管理员名称

 

password

tinyint

1

密码

 

createtime

varchar

30

创建时间

 

updatetime

varchar

10

修改时间

 

description

varchar

255

备注

 

 

      
      

2.custom(用户)

字段

类型

长度

描述

是否为主键

是否允许为空

id

int

11

主键

是(自增)

name

char

50

持卡人

 

phone

char

12

手机号码

 

identity_card

varchar

20

身份证号

唯一键

card

char

1

银行卡号

唯一键

password

tinyint

1

密码

 

balance

float

11

余额

 

state

varchar

30

银行卡状态

 

createtime

varchar

30

创建时间

 

updatetime

varchar

10

修改时间

 

description

varchar

255

备注

 

 

      
      

3.detail(明细表)

字段

类型

长度

描述

是否为主键

是否允许为空

id

int

11

主键

是(自增)

custom_id

int

11

持卡人id

 

business

char

50

业务描述

 

money

float

11

金钱

 

createtime

varchar

30

创建时间

 

description

varchar

255

备注

 

 

4  ATM柜员机系统实现

 4.1 编码

1)登录

功能介绍;登录到ATM柜员机系统。

功能界面实现的图;

功能实现的主要代码;

try {

              if (loginInfo == null || StringUtil.isEmpty(loginInfo.getCard())

                            || !StringUtil.isBankPassword(loginInfo.getPassword())) {

                     logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 用户登录");

                     return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 用户登录");

              }

              return logServiceImpl.login(loginInfo, request);

       } catch (Exception e) {

              logger.error("用户登录error: ", e);

              return BaseResult.error(ErrorCode.ExceptionRetCode, ErrorCode.ExceptionRetInfo + ", 用户登录");

       }

}

2)取款

功能界面实现的图;

功能实现的主要代码;

String card = null;

try {

       card = (String) request.getSession().getAttribute("card");

} catch (Exception e) {

       logger.error(ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

       return BaseResult.error(ErrorCode.IllegalAccessExceptionRetCode,

                     ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

}

if (customMoney == null || customMoney.getMoney() == null) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 取款");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 取款");

}

if (customMoney.getMoney() < 0 || customMoney.getMoney() > 5000 || customMoney.getMoney() % 100 != 0) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 取款, 取款金额不符合规定");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 取款, 取款金额不符合规定");

}

return customServiceImpl.updateCustomWithdrawal(card, customMoney);

}

 

3)存款

功能界面实现的图;

功能实现的主要代码;

String card = null;

try {

       card = (String) request.getSession().getAttribute("card");

} catch (Exception e) {

       logger.error(ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

       return BaseResult.error(ErrorCode.IllegalAccessExceptionRetCode,

                     ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

}

if (customMoney == null || customMoney.getMoney() == null) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 存款");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 存款");

}

if (customMoney.getMoney() < 0 || customMoney.getMoney() % 100 != 0) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 存款, 存款金额不符合规定");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 存款, 存款金额不符合规定");

}

return customServiceImpl.updateCustomDeposit(card, customMoney);

             

 

4.2 系统测试

 

     主要模块的测试过程,如:

用例名称

登录改密测试

用例编号

Test-01

项目名称

ATM自动存取款系统

编号/版本

1.0

参考信息

参考代码

测试目的

测试登录与改密系统是否完善

环境要求

需连入内网

步骤

操作描述

预计输出

实际输出

是否通过

1

进入ATM自动存取款系统主页

成功打开界面

打开界面成功

2

输入客户的帐号密码登录系统

登陆成功

登陆成功

3

点击修改密码之后进入修改密码页面

进入成功且能修改密码

成功进入页面并且修改密码成功

4

点击忘记密码之后进入找回密码界面

输入客户的信息来找回客户的密码

密码找回成功

用例名称

存取款系统验证

用例编号

Test-02

项目名称

ATM自动存取款系统

编号/版本

1.0

参考信息

参考代码

测试目的

测试系统的存取款功能是否能够正确执行

环境要求

需连入内网

步骤

操作描述

预计输出

实际输出

是否通过

1

进入ATM自动存取款系统主页

成功打开界面

打开界面成功

2

输入客户的帐号密码登录系统

登陆成功

登陆成功

3

点击存款按键然后输入100的倍数来存款

进入页面成功并且存款成功

存款成功

4

点击取款按键然后输入100的倍数来取款

进入页面成功并且取款成功

取款成功

5

点击查询按键查看自己的余额

进入成功并且成功显示余额

显示余额成功

       

附录:( 附程序源代码(主要功能模块的源代码))

用户登录

if (loginInfo == null || StringUtil.isEmpty(loginInfo.getCard())

|| !StringUtil.isBankPassword(loginInfo.getPassword())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 用户登录");

return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 用户登录");

}

return logServiceImpl.login(loginInfo, request);

             



用户退出

HttpSession session = request.getSession();

session.setAttribute("card", null);

logger.info("用户退出, 成功");

return BaseResult.success();

             



/***

* 添加用户

*

* @param addCustom

* @return

*/

@ResponseBody

@RequestMapping(value = { "/addCustom" }, method = { RequestMethod.POST })

public BaseResult addCustom(@RequestBody CustomInfo customInfo) {

       try {

              if (customInfo == null || StringUtil.isEmpty(customInfo.getName())

                            || !StringUtil.isPhone(true, customInfo.getPhone())

                            || !StringUtil.isIdentityCard(customInfo.getIdentityCard())

                            || !StringUtil.isBankPassword(customInfo.getPasswordOne())

                            || !StringUtil.isBankPassword(customInfo.getPasswordTwo())) {

                     logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 添加用户");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 添加用户");

                     }

// 判断两次输入的密码是否相等

if (!customInfo.getPasswordOne().equals(customInfo.getPasswordTwo())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 添加用户, 两次输入密码不等");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 添加用户, 两次输入密码不等");

}

return customServiceImpl.addCustom(customInfo);

} catch (Exception e) {

logger.error("添加用户error: ", e);

       return BaseResult.error(ErrorCode.ExceptionRetCode, ErrorCode.ExceptionRetInfo + ", 添加用户");

}

}



      

查询余额

try {

// 获取卡号

String card = null;

try {

card = (String) request.getSession().getAttribute("card");

} catch (Exception e) {

logger.error(ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

return BaseResult.error(ErrorCode.IllegalAccessExceptionRetCode,

              ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

}

return customServiceImpl.selectCustomBalance(card);

catch (Exception e) {

logger.error("查询余额error: ", e);

return BaseResult.error(ErrorCode.ExceptionRetCode, ErrorCode.ExceptionRetInfo + ", 查询余额");

}

}

取款

      

// 获取卡号

String card = null;

try {

       card = (String) request.getSession().getAttribute("card");

} catch (Exception e) {

       logger.error(ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

       return BaseResult.error(ErrorCode.IllegalAccessExceptionRetCode,

                     ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

}

if (customMoney == null || customMoney.getMoney() == null) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 取款");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 取款");

}

if (customMoney.getMoney() < 0 || customMoney.getMoney() > 5000 || customMoney.getMoney() % 100 != 0) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 取款, 取款金额不符合规定");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 取款, 取款金额不符合规定");

}

return customServiceImpl.updateCustomWithdrawal(card, customMoney);

}



存款

      

// 获取卡号

String card = null;

try {

       card = (String) request.getSession().getAttribute("card");

} catch (Exception e) {

       logger.error(ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

       return BaseResult.error(ErrorCode.IllegalAccessExceptionRetCode,

                     ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

}

if (customMoney == null || customMoney.getMoney() == null) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 存款");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 存款");

}

if (customMoney.getMoney() < 0 || customMoney.getMoney() % 100 != 0) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 存款, 存款金额不符合规定");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 存款, 存款金额不符合规定");

}

return customServiceImpl.updateCustomDeposit(card, customMoney);

             

      



转账

      

// 获取卡号

String card = null;

try {

       card = (String) request.getSession().getAttribute("card");

} catch (Exception e) {

       logger.error(ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

       return BaseResult.error(ErrorCode.IllegalAccessExceptionRetCode,

                     ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

}

if (customTransfer == null || customTransfer.getMoney() == null

              || StringUtil.isEmpty(customTransfer.getToCard())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 转账");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 转账");

}

if (customTransfer.getMoney() < 0 || customTransfer.getMoney() % 100 != 0) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 转账, 转账金额不符合规定");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 转账, 转账金额不符合规定");

}

return customServiceImpl.updateCustomTransfer(card, customTransfer);

             



根据旧密码修改密码



// 获取卡号

String card = null;

try {

       card = (String) request.getSession().getAttribute("card");

} catch (Exception e) {

       logger.error(ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

       return BaseResult.error(ErrorCode.IllegalAccessExceptionRetCode,

                     ErrorCode.IllegalAccessExceptionRetInfo + ", 查询余额");

}

if (customPassword == null || !StringUtil.isBankPassword(customPassword.getPassword())

              || !StringUtil.isBankPassword(customPassword.getPasswordOne())

              || !StringUtil.isBankPassword(customPassword.getPasswordTwo())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 根据旧密码修改密码");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 根据旧密码修改密码");

}

// 判断两次输入的密码是否相等

if (!customPassword.getPasswordOne().equals(customPassword.getPasswordTwo())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 根据旧密码修改密码, 两次输入密码不等");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 根据旧密码修改密码, 两次输入密码不等");

}

return customServiceImpl.changeCustomPasswordByPassword(card, customPassword);

             



根据信息修改密码

      

if (customInfo == null || StringUtil.isEmpty(customInfo.getName())

              || StringUtil.isEmpty(customInfo.getCard()) || !StringUtil.isPhone(true, customInfo.getPhone())

              || !StringUtil.isIdentityCard(customInfo.getIdentityCard())

              || !StringUtil.isBankPassword(customInfo.getPasswordOne())

              || !StringUtil.isBankPassword(customInfo.getPasswordTwo())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 根据信息修改密码");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 根据信息修改密码");

}

// 判断两次输入的密码是否相等

if (!customInfo.getPasswordOne().equals(customInfo.getPasswordTwo())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 根据信息修改密码, 两次输入密码不等");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode,

                     ErrorCode.ParaCheckErrorRetInfo + ", 根据信息修改密码, 两次输入密码不等");

}

return customServiceImpl.changeCustomPasswordByInfo(customInfo);

             

锁定用户卡

      

if (customCard == null || StringUtil.isEmpty(customCard.getCard())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 锁定用户卡");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 锁定用户卡");

}

return customServiceImpl.changeCustomStateToLock(customCard);

             



解锁用户卡

      

if (customCard == null || StringUtil.isEmpty(customCard.getCard())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 解锁用户卡");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 解锁用户卡");

}

return customServiceImpl.changeCustomStateToUnlock(customCard);

             

销户

        

if (customCard == null || StringUtil.isEmpty(customCard.getCard())) {

       logger.error(ErrorCode.ParaCheckErrorRetInfo + ", 销户");

       return BaseResult.error(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo + ", 销户");

}

return customServiceImpl.deleteCustomByCard(customCard);

 

  • 29
    点赞
  • 241
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
1. 账户类(满分50分) 版本1:满分10 分 设计Account1 类,包含: ■ 一个名为 id 的int 类型的私有数据域(默认值为 0),长度为 6 位。 ■ 一个名为 balance的double 类型的私有数据域(默认值为 0)。 ■ 一个名为 annualInterestRate 的double 类型的私有数据域存储当前利率(默认值为 0)。 假设所有的账户都有相同的利率。 ■ 一个名为 dateCreated 的Date 类型的私有数据域存储账户的开户日期。 ■ 一个能创建默认账户的无参构造方法。 ■ 一个能创建带特定 id 和初始余额的构造方法,初始余额不能为负数。 ■ id 、balance和annualInterestRate 的访问器和修改器。 ■ dateCreated 的访问器。 ■ 一个名为 getMonthlyInterestRate 的方法返回月利率。 ■ 一个名为 withDraw 的方法从账户提取特定金额。 ■ 一个名为 deposit 的方法向账户存人特定金额。 ■ double 类型的数据域保留 2 位小数。 ■ 成员方法和数据域应进行基本的合理性检查。 设计测试类 ATMMachine1: ■ 创建一个有 100 个账户的数组,其 id 为0,1,2,...99, 并初始化收支为 1000 美元。 ■ 主菜单如下(可参考教材中文版 P296或英文版 P367): Main menu 1: check balance 2: withdraw 3: deposit 版本2:满分20 分 扩展Account1 类为Account2 类: ■ Account2 类继承 Account1 类。 ■ 为Account2 类新增一个名为 password 的String 类型的私有数据域存储账号密码。 password 只能为字母或数字,长度不能小于 6 且不能大于 10。密码显示时为*******。 ■ 为Account2 类新增一个名为 name的String 类型的私有数据域存储客户名字。 ■ 为Account2 类新增一个名为 transactions 的ArrayList 类型的新数据域,其为客户存 储交易记录。这要求新建一个名为 Transaction 的类,类的定义请参照教材中文版 P327或英 文版P404。每笔交易都是 Transaction 类的一个实例。 ■ 新增一个带初始余额的构造方法,其 id 随机产生,但不能与当前系统的 id 重复。 若初始余额的参数为负数,则抛出一个自定义异常并在当前构造方法中进行处理。 ■ 重写方法 withDraw ,要求支取的金额为 100 的整数倍,并且当日支取金额不能超过 5000,支取金额不允许透支。每进行一次操作应向 transactions 数组线性表添加一笔交易。 ■ 重写方法 deposit ,要求每进行一次操作应向 transactions 数组线性表添加一笔交易。 ■ 新增一个方法 changePassword ,只有旧密码正确,新密码符合要求,且两次输入相 同的情况下才可以成功修改密码 设计测试类 ATMMachine2,其主菜单如下(可参考教材中文版 P296或英文版 P367): Main menu 0:create a account 1: check balance 2: withdraw 3: deposit 4:details of the transaction 5: change password 6:exit ■ 若用户选择新建一个账号,则应提示用户输入账号 password 、balance 和 annualInterestRate ,其中 id 随机产生。新产生的账户应序列化到名为 accounts.dat 的文件中。 所有账户只能通过这种方式产生。 ■ 所有用户操作结果应同步到 accounts.dat 文件中相应账户中。 ■ 所有用户操作应有友好、简介的提示语。 版本3:满分20 分 请参照银行的 AT M机界面,在 Account2 类的基础上开发一个 GUI 界面的AT M系统要求界面应模拟小键盘,并且账户信息读、写于文件 accounts.dat 。
好的,以下是ATM柜员机系统概要设计说明书: 一、引言 ATM柜员机系统是一种自动化银行服务系统,它可以为用户提供24小时不间断的取款、存款、转账、查询等服务。本文档旨在描述该系统的概要设计,包括系统的功能结构、模块划分、数据流程、用户交互界面等方面。 二、功能结构 ATM柜员机系统的功能结构如下图所示: ![ATM柜员机系统功能结构图](https://img-blog.csdnimg.cn/20210716154805874.png) 该系统主要由以下模块组成: 1.用户认证模块:负责用户身份认证,包括卡号输入、密码证等功能。 2.取款模块:负责用户取款操作,包括输入取款金额证余额、出钞等功能。 3.存款模块:负责用户的存款操作,包括输入存款金额证存款金额、处理存款等功能。 4.转账模块:负责用户的转账操作,包括输入转账金额证余额、证收款人账号、处理转账等功能。 5.查询模块:负责用户的账户查询操作,包括余额查询、账单查询等功能。 6.维护模块:负责ATM机的维护,包括钞箱管理、故障处理等功能。 三、模块划分 ATM柜员机系统的模块划分如下图所示: ![ATM柜员机系统模块划分图](https://img-blog.csdnimg.cn/20210716160317483.png) 四、数据流程 ATM柜员机系统的数据流程如下图所示: ![ATM柜员机系统数据流程图](https://img-blog.csdnimg.cn/20210716160517724.png) 五、用户交互界面 ATM柜员机系统用户交互界面如下图所示: ![ATM柜员机系统用户交互界面图](https://img-blog.csdnimg.cn/20210716160713144.png) 六、总结 通过本文档的描述,可以清楚地了解ATM柜员机系统的概要设计,包括系统的功能结构、模块划分、数据流程和用户交互界面等方面。这些设计将为后续的详细设计和开发提供重要的参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值