ATM 管理系统的设计与实现(类似毕业设计,附源代码)

ATM 管理系统的设计与实现

作者前言:本系统通过基本规范化的设计,简单的利用了java基本功能实现了ATM系统,本系统虽然简单,但是逻辑很严密,对于有一定java知识的读者有较大帮助,可以用作参考。

0 摘要等

摘 要:ATM 管理系统是基于 C/S(客户机/服务器)架构、采用.NET 框架平台、通过 TCP/IP 通信协议连接客户端和服务端等技术搭建而成的。C/S 架构合理地将处理任务分配到各个 Client 端及 Server 端,从而减少不同系统间的不必要通信,有效降低联网通信成本,提高系统的效率和安全性。本设计基于上述技术,实现了账户账号和密码验证、存取款、修改密码、查询余额、查询操作记录、转账等模块功能。设计界面友善,简单易懂,使客户得到更为友好的应用体验,且让人们日常资金存储更加便捷。

关键词:ATM 管理系统;银行;C/S 架构;储蓄

1 绪 论

1.1 课题研究背景和现状

1.1.1 研究背景

信息化的发展、人民生活水平的提高,资金的存取成为了人民生活的一部分。银行的营业时间是固定的这对于日常生活较忙的人而言存取资金就造成了困扰。基于这一 问题我们开发出 24 小时都可以进行工作的 ATM 系统,应对人们日常资金的存取。

1.1.2 研究现状

由于我国城乡发展差异,导致我国 ATM 机数量分布不均。具体体现在我国的一、二 线城市 ATM 机的数量已基本处于全球平均水平甚至有些城市已远超出。但是我国城乡地 区 ATM 机的分布还是很少。 现在我国 ATM 机使用人群依旧偏青年化,虽然 ATM 系统的功能、界面简洁易操作, 但对老年人的使用还是有些难度,所以 ATM 系统也应根据人群的特殊需求进行改进。提 供更加人性化、便捷的操作方式,使其适用于更广泛的人群。

1.2 课题研究的目的

方便人们对资金的存取工作不受时间的限制随时可取可存。

1.3 课题研究的意义

方便了人们的日常资金存取,减轻银行工作人员的工作量,节省人们排队办理业务 的 时间,解决了受时间限制的条件。

2 系统可行性分析

2.1 可行性研究方法

可行性研究方法应对系统开发过程中可能遇到问题的讨论、分析、建模、解决。主 要方法市场调研、分析调研数据、系统分析、模型方法、技术预测、采纳总结。

2.2 现有系统分析

进入系统页面,有注册操作和登录操作。注册操作是输入用户名,密码,分配一个不重复的8位银行卡号。登录操作是,输入注册的银行卡号, 在系统识别后进行密码输入。进入业务操作页面:查询账户、 存款、取款、 转账、修改密码、退出、注销账户,选择需要进行的业务,办理结束后退出登录。

2.3 技术可行性分析

目前 ATM 系统发展已经成熟,但是对于安全保密性可以更进一步发展。除此 之外 还可以对系统业务进行扩展。系统开发运用了面向对象编程语言(Java)。 Java 语言具有能运行于不同的平台,不受运营环境的限制,一次编译多 处运行;此语言可 以提供防止恶意代码攻击的安全机制由此可见 Java 语言的安全性 和编程简易的可行性。本系统仅仅使用java编程语言实现了所有业务逻辑,逻辑简单清晰,操作作便捷。

2.4 社会因素可行性分析

快节奏的生活环境中的大部分人都不喜欢排队等待,特别是对日常的存取款这样简 单 业务。再则持着不同银行的银行卡不可以到其他银行营业厅办理业务。ATM 柜员系 统虽然不能跨行存款,但是能取款和查询余额;ATM 柜员系统的开发就有效的解决了跨 行取款和查询余额的业务。ATM 柜员系统可进行 24 小时营业在时间解决了人们办理业 务的限制。

2.5 得出结论

ATM 柜员系统的开发是可行,对银行的工作和人们日常银行办理业务都是有很大的 帮助。从系统开发、实现、测试到投入使用、预期效益、预期体验效果上都可体现出系 统开发是可行。于银行而言省去了大量的工作量,且同样可有收益;于人们而言省去了 排队等待的时间,日常存取变得方便快捷。技术日益的向安全保密的方向越来越成熟, 日后 ATM 系统的普及会越来越广。

3 系统需求分析

3.1 系统概要分析

首先用户在使用 ATM 柜员系统前要开办一个银行账户(一张银行卡)。其次用户 将银行卡插入柜员机相应位置(或用户使用账户、密码登录),柜员机进行识别成功后 可以根据自己的需求在 ATM 柜员系统上进行账户的存款、取款、查询余额、修改账户密码、转账(可跨行);存取款结束后选择是否打印 本次交易的凭条。最后用户结束交易后将银行卡退出系统(或退出账号登录)。系统管理员可以对柜员机库存余额进行查询,便于及时对柜员机补充钞票;也可以 查询用户信息、管理用户信息、统计系统每日或每月的交易量、系统日常问题的维护。 ATM 系统柜员机在用户使用时会在用户插入银行卡或登录账户时进行身份认证,用户认 证成功后进入用户操作页面,对用户操作产生日志、用户数据与系统数据库同步、提示 用户操作是否得当。 银行管理员根据客户的要求进行创建账户、管理账户、注销账户。

3.2 系统具体需求分析

3.2.1 功能需求分析

用户:用户可通过在银行注册的账户(即办理银行卡)在 AMT 柜员机上有以下功能存取款、查询账户余额、转账等。用户在使用以上功能前先在柜员机的 相应位置插入银行卡或是输入用账号(银行卡卡号)。柜员机验证身份成功 (当验证失败时,可能是账号未输入正确则要核对账号是否正确重新输入,或银行卡失磁、损坏则要持着开户的有效身份证到对应银行营业厅找到管理员重新办理一张卡即 可);输入账户密码,正确 输入密码(六位数字)。进入账户操作页面即可使用以上功 能。

系统管理员:注册用户信息、查看用户信息。

3.2.2 性能需求分析

用户在存取款操作结束后有 30 秒的时间选择继续存取款、退出(退出系统)、返 回(回到功能选择界面)等操作。30 秒过后用户未进行选择则退出。用户成功进入系 统后有 30 秒时间进行选择服务,30 秒过后将会退出银行卡或是退出账号登录。

3.2.3 系统接口要求

操作面板接口:提供各种选项供用户选择;

读卡接口:根据顾客插入的卡进行识别,有效卡则进行工作,无效卡则退出柜员机;

网络连接接口:便于跨行操作;

吞吐现金接口:取款时吐出现金、存款时吞入现金;

打印机接口:打印凭条;

通讯接口:网络传输协议 TCP/IP 协议等。

3.3 分析建模

3.3.1 用例图

用户在系统中有查询账户、 存款、取款、 转账、修改密码、退出、注销账户。

image-20220728234231866

系统管理员:注册、查看用户信息。

image-20220728234336141

4 系统设计

4.1 系统总体设计

本系统的主要设计目标是用户可以通过系统进行日常存取款、转账、修改账户密码、 查询账户余额。系统与用户的交互界面简单易懂、易操作,本 系统 24 小时均可工作,方便用户使用节省用户排队时间。

image-20220728235614493

4.2 详细设计

4.2.1准备内容

03准备

4.2.2开户功能

04开户功能

4.2.3登录功能

05登录功能

4.2.4用户操作页、查询、退出等功能

06用户操作页、查询、退出等功能

4.2.5存款

07存款

4.2.6取款

08取款

4.2.7转账

09转账

4.2.8修改密码、销户

10修改密码

4.3 系统前端设计(或人机交互设计)

4.3.1 用户交互界面设计

系统窗口界面主要是 UI 方面的设计,以最直观的形式显示给用户,使得用户在使 用系统时方便快捷。用户使用时就近选择柜员机将银行卡插入相应卡口或在柜员机界面 对应输入框输入账户编号,待系统核对为有效账号后进行账户密码输入,正确输入密码 后进入柜员机服务选项主界面;用户就根据自己的需求进行相应的交易操作

image-20220729000512347

5 系统编码与实现

5.1 首页界面

image-20220729000512347

5.2注册界面

image-20220729000835034

5.3登录页面

image-20220729001202623

5.4查询

image-20220729001253801

5.5存钱

image-20220729001344611

5.6取钱

image-20220729001432561

5.7转账

image-20220729001745823

6 系统测试

系统编码实现后将进行系统测试,测试包括各个模块的测试、集成测试、确认测试。 测试主要是为了检测系统功能实现是否出现异常或错误,将其进行及时改正。进而保系 统在交付使用时出现不必要的错误。

6.1 模块测试

6.1.1登录模块测试

6.1.2查询模块测试

6.1.3存款模块测试

6.1.4取款模块测试

6.1.5转账模块测试

6.1.6注销模块测试

6.2 集成测试

将各模块用接口连接,测试各接口在操作过程中是否出现数据、信息传输出错。如 存取款、转账过程中数据库是否修改数据修改好的数据在查询余额或消费记录时是否有 更新完毕。成功登录后对各功能选项进行操作,操作后查看数据库、用户信息表、记录 表等等相关的数据表是否有相应的更新。

6.3 确认测试

易用性测试 ATM 管理系统用户操作界面是运用窗口模式,界面清晰明了操 作过程中系统会进行一定的语音式提示和文字式提示;对用户使用是很方便的。编码实 现运用 Java 语言和 SQL server 进行后台数据管理;可方便对用户需求及时作出更改。 安全性测试账号输入和密码输入的电子键盘是随机打乱的,且系统会提示用户输入 时要注意周围环境的安全;在固定的键盘上也会设置有阻挡外界视线的设施。账号对应 用户身份证进行创建且账号是唯一的,密码设置由用户自行设置且提醒用户不要设置安 全性较低的密码。编码实现用 Java 语言,Java 用来创建浏览器时,语言功能和浏览 33 器本身提供的功能结合起来,使它更安全。Java 语言在机器上执行前,要经过很多次 的测试。它经过代码校验,检查代码段的格式,检测指针操作,对象操作是否过分以及 试图改变一个对象的类型。

7 总结

本系统采用了 C/S 架构,运用 Java 语言链接前台与后台数据,TCP/IP 网络族协议 进行操作与数据库的通信。实现了通过本系统用户可以对账户进行存取款、转账、查询、 修改账户密码等操作。24 小时自助服务,减轻银行工作人员的工作压力;同时也方便 了人们日常银行业务的办理。Web 前台界面简洁、易操作,使用过程有相应的提示。系 统采用账户账号与密码验证的方式进入系统,提高了系统使用的安全性。

参考文献:

[1]陈飞标. ATM 服务支撑系统设计及实现[D].上海交通大学,2016.

[2]胡茂林. 模拟 ATM 系统的设计与实现[D].电子科技大学,2014.

[3]佟军. 银行 ATM 机模 拟系统设计与实现[D].辽宁科技大学,2014.

[4]盛妤,万伟.ATM 机银行储蓄模拟系统研究与应用[J].科技广 场,2014(12):74-79.DOI:10.13838/j.cnki.kjgc.2014.12.016.

附录:

用户信息类

package com.itheima.ATM;

public class Account {
    private String cardId;
    private String userName;
    private String passRord;
    private  double money;
    private  double quotaMoney;

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassRord() {
        return passRord;
    }

    public void setPassRord(String passRord) {
        this.passRord = passRord;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public double getQuotaMoney() {
        return quotaMoney;
    }

    public void setQuotaMoney(double quotaMoney) {
        this.quotaMoney = quotaMoney;
    }
}

ATM系统

package com.tyj.ATM;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATMSystem {
    //整个系统的入口
    public static void main(String[] args) {
        //1.准备一个容器
        ArrayList<Account> accounts = new ArrayList<>();
        //2.准备一个扫描器
        Scanner sc = new Scanner(System.in);
        //3.首页
        while (true) {
            System.out.println("******ATM系统*****");
            System.out.println("1.登录操作");
            System.out.println("2.注册操作");
            System.out.println("请输入命令:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //登录功能
                    login(accounts,sc);
                    break;
                case 2:
                    //注册功能
                    register(accounts,sc);
                    break;
                default:
                    System.out.println("您输入的命令有误,请重新输入");
            }
        }
    }

    /**
     * 登录功能
     * @param accounts 所有账户的集合
     * @param sc 扫描器
     */
    private static void login(ArrayList<Account> accounts,Scanner sc) {
        while (true) {
            System.out.println("******登录页*******");
            if(accounts.size()==0){
                System.out.println("当前系统没有账户,快去注册一个吧");
                break;
            }
            System.out.println("请输入您的卡号:");
            String cardId=sc.next();
            //通过调用getAccountCardId方法,得到一个Account对象
            Account acc=getAccountCardId(cardId,accounts);
            //如果其实例为空值,说明找不到此实例,即没有创建账户
           if(acc!=null){
               while (true) {
                   System.out.println("请输入您的密码:");
                   String passWord=sc.next();
                   if(passWord.equals(acc.getPassWord())){
                       //密码正确
                       System.out.println("欢迎"+acc.getUserName()+acc.getSex()+"登录本ATM系统");
                       //显示主菜单
                       showHomepage(accounts,acc,sc);
                       return;
                   }else {
                       System.out.println("密码不正确,请重新输入");
                   }
               }
           } else{
                System.out.println("您输入的卡号不存在!请重新输入");
            }

        }

    }

    /**
     * 显示主菜单(登录功能的子方法)
     * @param accounts 所有账户的集合
     * @param acc  当前登录用户
     * @param sc   扫描器
     */
    private static void showHomepage(ArrayList<Account> accounts,Account acc,Scanner sc) {
        while (true) {
            System.out.println("******ATM主菜单******");
            System.out.println("1.查询账户");
            System.out.println("2.存款");
            System.out.println("3.取款");
            System.out.println("4.转账");
            System.out.println("5.修改密码");
            System.out.println("6.退出");
            System.out.println("7.注销账户");
            System.out.println("请输入您的操作:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //1.查询账户
                    showAccount(acc);
                    break;
                case 2:
                    //2.存款
                    saveMoney(acc,sc);
                    break;
                case 3:
                    //3.取款
                    drawMoney(acc,sc);
                    break;
                case 4:
                    //4.转账
                    transferAccount(acc,accounts,sc);
                    break;
                case 5:
                    //5.修改密码
                    updatepassWord(acc,sc);
                    return;
                case 6:
                    //6.退出
                    System.out.println("欢迎下次光临!");
                    return;
                case 7:
                    //7.注销账户
                    System.out.println("选择注销账户后,您所有账户信息将不会保留,请提前取走余额,是否确认注销账户?(y/n)");
                    String confirm = sc.next();
                    switch(confirm){
                        case "y":
                        case "Y":
                            accounts.remove(acc);
                            System.out.println("注销成功");
                            return;
                        default:
                            break;
                    }
                    break;
            }
        }
    }

    /**
     * 修改密码功能
     * @param acc 当前账户
     * @param sc  扫描器
     */
    private static void updatepassWord(Account acc, Scanner sc) {
        System.out.println("******更改密码******");
        while (true) {
            System.out.println("请输入原始密码");
            String oldPassWord = sc.next();
            if(oldPassWord.equals(acc.getPassWord())){
                //原密码正确
                while (true) {
                    System.out.println("请输入新密码:");
                    String passWord=sc.next();
                    System.out.println("请再次输入新密码:");
                    String okPassWord=sc.next();
                    if(passWord.equals(okPassWord)){
                        acc.setPassWord(passWord);
                        System.out.println("密码修改成功,请重新登录");
                        return;
                    }
                }
            }else{
                System.out.println("原密码错误,请重新输入");
            }

        }
    }

    /**
     * 转账功能
     * @param acc 当前用户
     * @param accounts  所有用户集合
     * @param sc   扫描器
     */
    private static void transferAccount(Account acc, ArrayList<Account> accounts, Scanner sc) {
        System.out.println("******转账操作******");
        //转账至少需要两个账户
        if(accounts.size()<2){
            System.out.println("当前用户账号不足2个,不能完成转账交易");
            return;
        }
        //没有钱,也不能转账
        if(acc.getMoney()==0){
            System.out.println("对不起,你的账户余额为0元,不能转账");
            return;
        }
        //验证卡号
        while (true) {
            System.out.println("请输入转账卡号:");
            String cardId = sc.next();
            //调用验证,卡号是否在系统中。
            Account transferacc = getAccountCardId(cardId, accounts);
            if (transferacc == null) {
                System.out.println("您输入的转账账户不存在,请重新输入。");
            } else if (cardId.equals(acc.getCardId())) {
                System.out.println("对不起,不能给自己转账");
            }else {
                while (true) {
                    //验证姓氏
                    String name=transferacc.getUserName().substring(1);
                    System.out.println("你将向*"+name+"转账,请输入转账姓氏:");
                    String okname = sc.next();
                    if(transferacc.getUserName().startsWith(okname)) {
                        while (true) {
                            //验证金额
                            System.out.println("请输入转账金额:");
                            double money = sc.nextDouble();
                            if(money> acc.getQuotaMoney()){
                                System.out.println("对不起,不可以超过单次限额,您的额度为"+acc.getQuotaMoney()+"元");
                            }else if(money>acc.getMoney()){
                                System.out.println("对不起,转账金额不可以超过余额");
                            }else {
                                acc.setMoney(acc.getMoney()-money);
                                transferacc.setMoney(transferacc.getMoney()+money);
                                System.out.println("已经为您转账成功。");
                                showAccount(acc);
                                return;
                            }
                        }
                    }
                }
            }
        }
        }

    /**
     * 取款功能
     * @param acc 当前账户
     * @param sc  扫描器
     */
    private static void drawMoney(Account acc, Scanner sc) {
        if(acc.getMoney()<100){
            System.out.println("对不起,你的账户余额不足100元,不能取款");
            return;
        }
        while (true){
            System.out.println("=====取款操作=====");
            System.out.println("请输入取款金额:");
            Double money = sc.nextDouble();
            if(money%100==0){//判断取款金额是否为100的整数倍
                if(money<acc.getQuotaMoney()&&money<acc.getMoney()){
                    acc.setMoney(acc.getMoney()-money);
                    System.out.println("您已取款"+money+"元,请及时取走您的钞票");
                    break;
                }else {
                    System.out.println("您输入的取款金额不正确,请重新输入。");
                }

            }else {
                System.out.println("取款必须为100的整数倍");
            }
        }
    }

    /**
     * 存款功能
     * @param acc 当前用户
     * @param sc  扫描器
     */
    private static void saveMoney(Account acc,Scanner sc) {
        while (true) {
            System.out.println("=====存款操作=====");
            System.out.println("请输入存款金额:");
            double money = sc.nextDouble();
            if (money<=20000){
                acc.setMoney(acc.getMoney()+money);
                System.out.println("存款成功!");
                showAccount(acc);
                return;
            }else{
                System.out.println("单次存款不得超过20000元,请重新输入。");
            }
        }

    }

    /**
     * 显示账户信息
     * @param acc 当前账户
     */
    private static void showAccount(Account acc) {
        System.out.println("=====账户信息=====");
        System.out.println("用 户 名:"+acc.getUserName());
        System.out.println("卡    号:"+acc.getCardId());
        System.out.println("余    额:"+acc.getMoney());
        System.out.println("单次限额:"+acc.getQuotaMoney());
    }

    /**
     * 注册功能
     * @param accounts 所有账户集合
     * @param sc  扫描器
     */
    private static  void  register(ArrayList<Account> accounts,Scanner sc){
        System.out.println("*****注册操作*****");
        Account account = new Account();
        //1.录入用户名
        System.out.println("请输入用户名:");
        String userName = sc.next();
        account.setUserName(userName);

        //2.键入密码
        while (true) {
            System.out.println("请输入密码:");
            String passWord=sc.next();
            System.out.println("请再次输入密码:");
            String okPassWord=sc.next();
            if (passWord.equals(okPassWord)){
                //密码设置成功
                account.setPassWord(passWord);
                break;
            }else {
                System.out.println("两次密码不一致,请重新输入");
            }
        }
        //3.设置性别
        System.out.println("请输入性别(1男,2女):");
        int sex = sc.nextInt();
        if(sex==1){
            account.setSex("先生");
        }else if(sex==2){
            account.setSex("女士");
        }else{
            account.setSex("先生/女士");
        }
        //4.设置单次取款额度
        while (true) {
            System.out.println("请输入单次取款限额:");
            Double quotaMoney = sc.nextDouble();
            if (quotaMoney>=100){
            account.setQuotaMoney(quotaMoney);
            break;
            }else {
                System.out.println("单次取款限额必须大于等于100元,请重新输入");
            }
        }
        //5.键入银行卡号
        String accountCardId = createAccountCardId(accounts);
        account.setCardId(accountCardId);
        //将这个对象,注入account容器中
        accounts.add(account);
        System.out.println("恭喜您,"+account.getUserName()+account.getSex()+"!,您已经成功注册,您的卡号是"+account.getCardId()+"。请您妥善保管!");
    }

    /**
     * 生成一个随机不重复的8位银行卡号
     * @param accounts 所有账户
     * @return 返回银行卡号
     */
    private static String createAccountCardId(ArrayList<Account> accounts) {
        Random random = new Random();
        while (true) {
            String cardId="";
            for (int i = 0; i < 8; i++) {
                cardId+=random.nextInt(10);
            }
            //调用判断,是否重复
            Account accountCardId = getAccountCardId(cardId, accounts);
            if(accountCardId==null){
                return cardId;
            }
        }
    }

    /**
     * 判断cardId是否注册了
     * @param cardId 卡号
     * @param accounts 系统所有账号
     * @return  返回一个Account对象
     */
    private static Account getAccountCardId(String cardId , ArrayList<Account> accounts) {
        for (int i = 0; i < accounts.size(); i++) {
            Account acc=accounts.get(i);
            if(acc.getCardId().equals(cardId)){
                return acc;
            }
        }
        return null;
    }
}





posted @ 2022-07-29 01:02  涂勇军  阅读(1433)  评论(0编辑  收藏  举报