ATM银行管理系统含源码(JDBC+GUI+Socket)

前言

软件工程实训要求完成ATM银行管理系统,花了一个多星期时间由我个人完成了开发模块(说白了就是写代码的),中间遇到了很多麻烦,希望记录的同时能帮助到各位

该系统模拟ATM自动取款机

包括存款、取款、转账(分为行内和跨行)、登录、修改密码、查询交易信息、打印交易凭条功能

涉及知识:设计模式、网络编程、JDBC、I/O流、SWING、Mysql等。

架构:C/S模式(客户端和服务端)

开发工具:idea、Navicat、IReport(用于打印凭条)

开发语言:Java (Jdk为java13)

数据库:Mysql(8.0.22)

操作系统:Win10

文章末尾附有项目源代码可供下载

ATM系统需求

ATM自动动取款机是银行在银行营业大厅、超市、商业机构、机场、车站、码头和闹市区设置的一种小型机器,利用一张信用卡大小的胶卡上的磁带〔或芯片卡上的芯片〕记录客户的基本户口资料,让客户可以透过机器进行提款、存款、转帐等银行柜台服务

1) 客户将银行卡插入读卡器,读卡器识别卡的真伪,并在显示器上提示输入密码。

2) 客户通过键盘输入密码,取款机验证密码是否有效。如果密码错误提示错误信息,如果正确,提示客户进行选择操作的业务。

3) 客户根据自己的需要可进行存款、取款、查询账户、转账、修改密码等操作。

4) 在客户选择后显示器进行交互提示和操作确认等信息。

5) 操作完毕之后,客户可自行选择打印或不打印凭条。

ATM系统设计

系统流程和主要的功能

系统类图

登录时序图

image-20210126231644395

存款时序图

image-20210126231607915

取款时序图

image-20210126231617684

查询账户

image-20210126231631561

行内转账时序图

image-20210126231702835

跨行转账时序图

image-20210127020047983

数据库设计

先建立一个atm数据库

再建立三个表

用户信息表t_customer_info

字段包括:卡号、确认编号、用户名字、密码、余额、创建时间、开卡的银行、状态、保存类型

image-20210127000107483

日志表t_log_info

字段包括:日志id、日志信息、日志类型、日志时间、操作人员、日志状态

image-20210126223549711

交易记录表t_record_info

字段包括:交易id、交易时间、交易金额、用户名字、卡号、交易类型、余额

image-20210126223607880

凭条设计

转账、存款、取款的凭条

交易信息的凭条

ATM系统实现

登陆界面

登陆成功后进入主界面

存款界面(演示打印凭条功能,其他功能就不再演示打印凭条功能)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-snpUWrgp-1611683753229)(https://picture.hs-vae.com/存款界面.png)]

存款成功后提示是否打印凭条

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ueyFMacX-1611683753230)(https://picture.hs-vae.com/是否打印凭条.png)]

选择保存的路径

凭条已生成到指定的位置(桌面)

查看生成的凭条(注意这里的银行的logo是我自己本地的,你们要使用的话要重新编译jrml文件,图片选择你自己本地的logo,最后生成jasper文件,放在项目的jasper文件夹里)

取款界面

转账界面

交易信息界面

操作后的日志信息表和交易记录表

部分代码

项目结构

策略模式(对转账(行内和跨行)、存款、取款、修改密码、登录、登出等业务进行选择)

策略模式总接口

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;

/**
 *  策略模式总接口
 */
public interface IStrategy {
    CommonResult process(CommonAtmVO commonAtmVO);
}

处理上下文的Context

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;
import com.atm.util.StatusEnumEntity;

import java.util.ArrayList;
import java.util.List;

/**
 *  策略模式中处理上下文
 */
public class ProcessContext {
    private String type;
    private IStrategy is;
    private static List<ProcessContext> strategyList = new ArrayList<ProcessContext>();
    static {
        strategyList.add(new ProcessContext(StatusEnumEntity.getValue("STATUS_SAVE"),new StrategyDepositImpl()));
        strategyList.add(new ProcessContext(StatusEnumEntity.getValue("STATUS_LOGIN"),new StrategyLoginImpl()));
        strategyList.add(new ProcessContext(StatusEnumEntity.getValue("STATUS_LOGINFAILED"),new StrategyLoginImpl()));
        strategyList.add(new ProcessContext(StatusEnumEntity.getValue("STATUS_CHANGEPWD"),new StrategyChangePwdImpl()));
        strategyList.add(new ProcessContext(StatusEnumEntity.getValue("STATUS_LOGOUT"),new StrategyLogoutImpl()));
        strategyList.add(new ProcessContext(StatusEnumEntity.getValue("STATUS_INTRANSFER"),new StrategyTransferInnerImpl()));
        strategyList.add(new ProcessContext(StatusEnumEntity.getValue("STATUS_OUTTRANSFER"),new StrategyTransferOuterImpl()));
        strategyList.add(new ProcessContext(StatusEnumEntity.getValue("STATUS_FETCH"),new StrategyWithdrawImpl()));
    }
    public CommonResult delStrategy(CommonAtmVO commonAtmVO) {
        IStrategy is = null;
        for (ProcessContext pc : strategyList) {
            if (pc.getType().equals(commonAtmVO.getType())) {
                is = pc.getIs();
            }
        }
        return is.process(commonAtmVO);
    }
    public ProcessContext() {
    }

    public ProcessContext(String type, IStrategy is) {
        this.type = type;
        this.is = is;
    }
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public IStrategy getIs() {
        return is;
    }

    public void setIs(IStrategy is) {
        this.is = is;
    }
}

策略选择

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 * 策略选择
 */
public class ServerProcessIOUtil {
    public ServerProcessIOUtil(Socket socket){
        ObjectInputStream ois = null;
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
            CommonAtmVO commonAtmVO=(CommonAtmVO)ois.readObject();
            if (commonAtmVO!=null){
                ProcessContext pc = new ProcessContext();
                //调用策略选择方法
                CommonResult commonResult = pc.delStrategy(commonAtmVO);
                oos.writeObject(commonResult);
                oos.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
                try {
                    if (ois!=null || oos!=null){
                    ois.close();
                    oos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}

修改密码策略实现类

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;
import com.atm.service.LoginLogoutService;

/**
 * 策略模式修改账户密码实现类
 */
public class StrategyChangePwdImpl implements IStrategy{
    LoginLogoutService loginLogoutService = new LoginLogoutService();
    @Override
    public CommonResult process(CommonAtmVO commonAtmVO) {
        return loginLogoutService.changePwdBank(commonAtmVO.getSourceCardNumber(),
                commonAtmVO.getCustomerInfo().getPassword());
    }
}

存款策略实现类

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;
import com.atm.service.ChargeService;

/**
 * 策略模式中存款实现类
 */
public class StrategyDepositImpl implements IStrategy{
    ChargeService chargeService = new ChargeService();
    @Override
    public CommonResult process(CommonAtmVO commonAtmVO) {
        return chargeService.depositBank(commonAtmVO.getSourceCardNumber(),commonAtmVO.getOperatorMoney());
    }
}

登录策略实现类

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;
import com.atm.service.LoginLogoutService;

/**
 * 策略模式中登陆实现类
 */
public class StrategyLoginImpl implements IStrategy{
    LoginLogoutService loginLogoutService = new LoginLogoutService();
    @Override
    public CommonResult process(CommonAtmVO commonAtmVO) {
        return loginLogoutService.loginBank(commonAtmVO.getSourceCardNumber(),
                commonAtmVO.getCustomerInfo().getPassword());
    }
}

登出策略实现类

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;
import com.atm.service.LoginLogoutService;

/**
 * 策略模式中登出实现类
 */
public class StrategyLogoutImpl implements IStrategy{
    LoginLogoutService loginLogoutService = new LoginLogoutService();
    @Override
    public CommonResult process(CommonAtmVO commonAtmVO) {
        return loginLogoutService.logoutBank(commonAtmVO.getSourceCardNumber());
    }
}

行内转账策略实现类

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;
import com.atm.service.ChargeService;

/**
 * 策略模式中行内转账实现类
 */
public class StrategyTransferInnerImpl implements IStrategy{
    ChargeService chargeService = new ChargeService();
    @Override
    public CommonResult process(CommonAtmVO commonAtmVO) {
    return chargeService.transferInnerBank(commonAtmVO.getSourceCardNumber(),
            commonAtmVO.getTargetCardNumber(),
            commonAtmVO.getOperatorMoney(),
            commonAtmVO.getCustomerInfo().getPassword());
    }
}

跨行转账策略实现类

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;
import com.atm.service.ChargeService;
/**
 * 策略模式中跨行转账实现类
 */
public class StrategyTransferOuterImpl implements IStrategy{
    ChargeService chargeService = new ChargeService();
    @Override
    public CommonResult process(CommonAtmVO commonAtmVO) {
        return chargeService.transferOuterBank(commonAtmVO.getSourceCardNumber(),
                commonAtmVO.getOperatorMoney(),
                commonAtmVO.getCustomerInfo().getPassword());
    }
}

取款策略实现类

package com.atm.server;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;
import com.atm.service.ChargeService;

/**
 * 策略模式中取款实现类
 */
public class StrategyWithdrawImpl implements IStrategy{
    ChargeService chargeService = new ChargeService();
    @Override
    public CommonResult process(CommonAtmVO commonAtmVO) {
        return chargeService.withdrawBank(commonAtmVO.getSourceCardNumber(),
                commonAtmVO.getOperatorMoney(),
                commonAtmVO.getCustomerInfo().getPassword());
    }
}

ATM系统服务端

package com.atm.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 银行管理系统服务器端
 */
public class BankCenterServer {
    public BankCenterServer(){
        new LoopReceiver().start();
    }
    private class LoopReceiver extends Thread{
        private ServerSocket serverSocket =null;
        public LoopReceiver(){
            try {
                serverSocket = new ServerSocket(2021);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            while (this.isAlive()){   //利用while循环直到该线程死亡
                Socket clientSocket = null;
                try {
                    clientSocket = serverSocket.accept();
                    if (clientSocket!=null){
                        new ServerProcessIOUtil(clientSocket);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                        try {
                            if (clientSocket!=null) {
                                clientSocket.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }
        }

    public static void main(String[] args) {
        BankCenterServer bankCenterServer = new BankCenterServer();
    }
}

ATM系统客户端

package com.atm.service;

import com.atm.entity.CommonAtmVO;
import com.atm.entity.CommonResult;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 * 客户端
 */
public class ClientService {
    public CommonResult clientSendObject(CommonAtmVO commonAtmVO){
        CommonResult commonResult = new CommonResult();
        Socket clientSocket = null;
        try {
            clientSocket = new Socket("localhost",2021);
            ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
            ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
            oos.writeObject(commonAtmVO);
            oos.flush();
            commonResult = (CommonResult) ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return commonResult;
    }
}

项目源代码(完整版)下载

关注微信公众号,发送 “ATM银行管理系统” 即可下载项目源代码

_export1611667536962.jpg

有问题可以在公众号里添加我个人微信与我联系,小弟尽最大努力解决问题

  • 6
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值