银行管理系统,JavaGUI + MySQL + JDBC

银行管理系统

简介

主界面
在这里插入图片描述
登录
在这里插入图片描述
登录后要验证信息
在这里插入图片描述
验证成功进入用户界面
在这里插入图片描述

存款界面
在这里插入图片描述

存款成功刷新界面
在这里插入图片描述
注册界面
必须输入所有信息,并且勾选复选框才能注册
在这里插入图片描述
注册成功
在这里插入图片描述
取款
在这里插入图片描述

余额变更
在这里插入图片描述

转账
在这里插入图片描述
转账成功,余额变更
在这里插入图片描述
查看流水
在这里插入图片描述
注销账户
在这里插入图片描述
密码采用MD5加密
在这里插入图片描述

事先准备

1.准备两个jar包

commons-codec和mysql-connector-java
commons-codec用于简单的MD5加密
mysql-connector-java用于连接数据库

2.准备数据库

--创建一个bank数据库
create schema bank collate utf8mb4_0900_ai_ci;
--创建一个record表
create table record
(
    record_id   int auto_increment
        primary key,
    user_id     varchar(18) null,
    target_id   varchar(11) null,
    money       double      null,
    tip         double      null,
    record_type varchar(10) null,
    time        date        null,
    constraint fk_user_record_id
        foreign key (user_id) references user (user_id)
);
--创建一个user表
create table user
(
    user_name          varchar(20) not null,
    user_password      varchar(32) null,
    user_id            varchar(18) not null
        primary key,
    bank_card          varchar(19) null,
    bank_card_password varchar(32) null,
    phone_number       varchar(11) not null,
    user_balance       double      null
);

MVC分包

目前的我对MVC的理解就是,view就是能用户能看得到的东西,model就是模型,在Java中创建对应数据库表的模型类,controller就是控制前后端连接的桥梁

在这里插入图片描述

view

这里先说明一下,GUI的知识可能对我来说并不重要,所以下面基本上没有体现面向对象的思想,完全是在构造器中写所有东西。

主窗口
package view;


import controller.MD5Utils;
import controller.Users;
import model.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;

/**
 * 主窗口
 * 登录界面
 * @author 小绿龙
 * @date 2022/6/9 - 23:07
 */
public class BankInterface {
    public BankInterface(){
        JFrame jf = new JFrame("银行");
        Font f1 = new Font("华文行楷",Font.BOLD,25);
        Font f2 = new Font("黑体",Font.BOLD,25);
        jf.setLayout(null);
        jf.setBounds(550,200,800,700);
        jf.setResizable(false);


        JLabel jl1 = new JLabel("用户名:");
        jl1.setBounds(150,150,100,40);
        jl1.setFont(f1);
        jf.add(jl1);

        JTextField jtf1 = new JTextField();
        jtf1.setBounds(250,150,400,40);
        jtf1.setFont(f2);
        jf.add(jtf1);

        JLabel jl2 = new JLabel("密码:");
        jl2.setBounds(150,300,100,40);
        jl2.setFont(f1);
        jf.add(jl2);

        JPasswordField jpf = new JPasswordField();
        jpf.setEchoChar('*');
        jpf.setBounds(250,300,400,40);
        jpf.setFont(f2);
        jf.add(jpf);

        JButton jb1 = new JButton("登录");
        jb1.setBorderPainted(false);
        jb1.setFocusPainted(false);
        jb1.setFont(f1);
        jb1.setBounds(100,450,150,40);
        //对登录按钮添加监听器
        jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取User表中所有的User
                ArrayList<User> list = Users.getUsers();
                //用于判断用户名或密码是否正确
                boolean b = true;
                //遍历User集合
                for (User user : list) {
                    //如果在User集合中找到和输入信息相同的用户名和密码
                    if(jtf1.getText().equals(user.getUser_id()) && MD5Utils.encryptToMD5(new String(jpf.getPassword())).equals(user.getUser_password())){
                        b = false;
                        JOptionPane.showMessageDialog(null,"登录成功");
                        //打开验证信息的窗口,只有验证信息后才能正常使用
                        new Verify(user);
                    }
                }if("".equals(jtf1.getText()) || "".equals(new String(jpf.getPassword()))){
                    JOptionPane.showMessageDialog(null,"用户名或密码不能为空!");
                }else{
                    if (b){
                        JOptionPane.showMessageDialog(null,"用户名或者密码错误!");
                    }
                }

            }
        });
        jf.add(jb1);

        JButton jb2 = new JButton("注册");
        jb2.setBorderPainted(false);
        jb2.setFocusPainted(false);
        jb2.setFont(f1);
        jb2.setBounds(300,450,150,40);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //打开注册的界面
                new Login();
            }
        });
        jf.add(jb2);

        JButton jb3 = new JButton("修改/忘记密码");
        jb3.setFont(f1);
        jb3.setBorder(null);
        jb3.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //打开修改密码的界面
                new Change();
            }
        });
        jb3.setBounds(500,450,200,40);

        jf.add(jb3);

        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

    public static void main(String[] args) {

        new BankInterface();
    }

}

注册
package view;

import controller.MD5Utils;
import controller.Users;
import jdk.nashorn.internal.scripts.JO;
import model.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;

/**
 * @author 小绿龙
 * @date 2022/6/9 - 23:26
 */
public class Login {
    public Login(){
        JFrame jf = new JFrame();
        JDialog jd = new JDialog(jf,"注册");
        jd.setBounds(550,200,800,700);
        jd.setResizable(false);
        jd.setLayout(null);

        Font f1 = new Font("华文行楷",Font.BOLD,20);
        Font f2 = new Font("宋体",Font.BOLD,10);
        Font f3 = new Font("华文行楷",Font.BOLD,50);

        JLabel jl1 = new JLabel("姓名");
        JLabel jl2 = new JLabel("密码");
        JLabel jl3 = new JLabel("(不少于六位,不超过20位)");
        JLabel jl12 = new JLabel("(不少于六位,不超过20位)");
        JLabel jl4 = new JLabel("确认密码");
        JLabel jl5 = new JLabel("身份证号");
        JLabel jl6 = new JLabel("用户条例");
        JLabel jl7 = new JLabel("我已认真阅读并同意用户条例");
        JLabel jl8 = new JLabel("银行卡号");
        JLabel jl9 = new JLabel("银行卡支付密码");
        JLabel jl10 = new JLabel("手机号");
        JLabel jl11 = new JLabel("注册");


        JTextField jtf1 = new JTextField();
        JTextField jtf2 = new JTextField();
        JTextField jtf3 = new JTextField();
        JTextField jtf4 = new JTextField();
        JPasswordField jp1 = new JPasswordField();
        JPasswordField jp2 = new JPasswordField();
        JPasswordField jp3 = new JPasswordField();

        JCheckBox jcb  = new JCheckBox();

        JTextArea jta = new JTextArea();

        JButton jb1 = new JButton("取消");
        JButton jb2 = new JButton("注册");
        //姓名
        jl1.setBounds(50,60,80,30);
        jl1.setFont(f1);
        jd.add(jl1);

        jtf1.setBounds(100,60,150,30);
        jtf1.setFont(f1);
        jd.add(jtf1);
        //密码
        jl2.setBounds(50,120,80,30);
        jl2.setFont(f1);
        jd.add(jl2);

        jp1.setBounds(100,120,150,30);
        jd.add(jp1);

        jl3.setBounds(250,120,150,30);
        jl3.setFont(f2);
        jd.add(jl3);
        //再次输入密码
        jl4.setBounds(10,180,100,30);
        jl4.setFont(f1);
        jd.add(jl4);

        jp2.setBounds(100,180,150,30);
        jd.add(jp2);

        jl12.setBounds(250,180,150,30);
        jl12.setFont(f2);
        jd.add(jl12);
        //身份证
        jl5.setBounds(10,240,100,30);
        jl5.setFont(f1);
        jd.add(jl5);

        jtf2.setBounds(100,240,150,30);
        jtf2.setFont(f1);
        jd.add(jtf2);
        //银行卡号
        jl8.setBounds(480,60,100,30);
        jl8.setFont(f1);
        jd.add(jl8);

        jtf3.setBounds(580,60,150,30);
        jtf3.setFont(f1);
        jd.add(jtf3);
        //银行卡密码
        jl9.setBounds(415,120,150,30);
        jl9.setFont(f1);
        jd.add(jl9);

        jp3.setBounds(580,120,150,30);
        jd.add(jp3);
        //手机号
        jl10.setBounds(500,180,150,30);
        jl10.setFont(f1);
        jd.add(jl10);

        jtf4.setBounds(580,180,150,30);
        jtf4.setFont(f1);
        jd.add(jtf4);
        //注册
        jl11.setFont(f3);
        jl11.setBounds(300,20,200,50);
        jd.add(jl11);
        //用户条例
        //这里最好用IO来读,我这里偷了个懒
        jta.setBounds(100,350,600,200);
        jta.setFont(f1);
        jta.setText("1.存进去就白想取出来了!\n为明确双方的权利和义务,规范双方业务行为,改善客户服务,本着平等互利的原则,电子银行个人客户服务申请人(以下简称“甲方”)与中国建设银行股份有限公司(以下简称“乙方”)就中国建设银行电子银行服务的相关事宜达成本协议,协议双方应予遵守。\n" +
                "\n" +
                "第一条 定义\n" +
                "\n" +
                "如无特别说明,下列用语在本协议中的含义为:\n" +
                "\n" +
                "电子银行服务:指乙方借助国际互联网、公共通讯、电话集成线路等方式为甲方提供的支付结算服务、客户理财服务及信息类服务。根据服务渠道的不同,可分为网上银行服务、电话银行服务、手机银行服务、短信金融服务、家居银行服务等。\n" +
                "\n" +
                "身份认证要素:指在电子银行交易中乙方用于识别甲方身份的信息要素,如客户号(用户昵称、证件号码等)、密码、电子证书、USB Key、动态口令、签约设置的主叫电话号码、签约设置的手机SIM卡或UIM卡等。\n" +
                "\n" +
                "密码:指甲方在电子银行服务中使用的各种密码,如登录密码、交易密码、账户密码等。\n" +
                "\n" +
                "交易指令:指甲方通过电子银行渠道向乙方发出的查询、转账、购买金融资产等指示。\n" +
                "\n" +
                "错误:指乙方未能执行、未能及时执行或未能正确执行甲方交易指令的情况。\n" +
                "\n" +
                "第二条 电子银行服务的开通及服务内容\n" +
                "\n" +
                "(一)网上银行服务的开通及服务内容\n" +
                "\n" +
                "甲方通过银行网站登记甲方个人基本信息及账户信息,并按照要求完成其他相关操作后,自助开通网上银行,成为网上银行的普通客户。普通客户可享受的服务包括:查询、信用卡还款等服务。甲方到银行柜台或E动终端签约,成为网上银行的高级客户。高级客户可享受的服务包括:查询、转账、网上支付、缴费、证券基金业务、外汇业务、贵金属业务、信用卡、保险业务、贷款业务等金融交易服务和信息服务,高级客户还可申请开通或变更其他网上银行所提供的功能。\n" +
                "\n" +
                "(二)电话银行服务的开通及服务内容\n" +
                "\n" +
                "甲方通过95533客户服务电话登记甲方个人基本信息及账户信息,并按照要求完成其他相关操作后,自助开通电话银行,成为电话银行的普通客户。普通客户可享受的服务包括:查询、咨询、投诉、建议、口头挂失等服务。甲方可在银行柜台或E动终端签约,成为电话银行的高级客户。高级客户可享受的服务包括:查询、转账、缴费、证券基金业务、外汇业务、贵金属业务等金融交易服务,咨询、投诉、建议、口头挂失、登记预约等增值信息服务,高级客户还可申请开通或变更其他电话银行所提供的功能。\n" +
                "\n" +
                "(三)手机银行服务的开通及服务内容\n" +
                "\n" +
                "甲方利用银行网站、网上银行、手机等途径登记甲方个人基本信息及账户信息,并按照要求完成其他相关操作后,自助开通手机银行,成为手机银行的普通客户。普通客户可享受的服务包括:查询、小额支付、基金业务等服务。甲方可在银行柜台或E动终端签约,成为手机银行的高级客户;甲方为网上银行高级客户的,也可通过网上银行进行手机银行签约,成为手机银行的高级客户。高级客户可享受的服务包括:查询、转账、缴费、基金业务、外汇业务、信用卡、快贷等贷款业务、保险业务等服务,高级客户还可申请开通或变更其他手机银行所提供的功能。\n" +
                "\n" +
                "(四)短信金融服务的开通及服务内容\n" +
                "\n" +
                "甲方利用银行网站、网上银行、手机银行、电话银行等途径登记甲方个人基本信息及账户信息,并按照要求完成其他相关操作后,成为短信金融普通客户。普通客户可享受的服务包括:金融信息通知(系统自动扣收年费以及小额账户管理费、系统自动结息无短信通知)、查询、安全提示、交易提醒等服务。甲方可在银行柜台或E动终端签约,成为短信金融高级客户。甲方为网上银行高级客户的,也可通过网上银行进行短信金融服务签约,成为短信金融高级客户。高级客户可享受的服务包括:金融信息通知(系统自动扣收年费以及小额账户管理费、系统自动结息无短信通知)、查询、转账汇款、缴费充值、安全提示、交易提醒等服务。\n" +
                "\n" +
                "(五)客户享受上述电子银行服务还须具备相关电子设备、能接入相应电子银行系统的网络等前提条件。\n" +
                "\n" +
                "第三条 甲方主要权利与义务\n" +
                "\n" +
                "一、主要权利\n" +
                "\n" +
                "(一)甲方申请开通相应电子银行服务后,有权依本协议享受乙方提供的服务。\n" +
                "\n" +
                "(二)甲方有权在本协议有效期间根据乙方相关业务规则对本协议项下电子银行服务提出变更或终止申请。\n" +
                "\n" +
                "(三)甲方通过电子银行渠道办理相关交易后,有权在规定的时限内到乙方营业网点补登存折或补打交易凭证。\n" +
                "\n" +
                "二、主要义务\n" +
                "\n" +
                "(一)甲方办理网上银行业务应直接登录乙方网站(网址:http://www.ccb.com),而不要通过邮件或其他网站提供的链接登录。\n" +
                "甲方在中国大陆地区办理电话银行业务,应直接拨打乙方客户服务电话95533,而不要拨打任何其他电话。\n" +
                "\n" +
                "(二)甲方在享受乙方提供的电子银行服务时,应当遵守本协议以及乙方不定期通过网点、网站或电子银行等渠道公布的相关业务规则等要求。甲方通过电子银行渠道办理银行业务时,还应同时遵守通过普通渠道(如银行柜台渠道等)办理该业务所需遵循的乙方相应规定,但乙方有特殊要求的除外。\n" +
                "\n" +
                "(三)甲方应保证其提供的个人资料(如手机号码、证件信息等)的真实、完整、有效,提供的手机号码应归本人所有。如有变更,应及时书面通知乙方并按照乙方要求办理变更手续,通过乙方电子银行服务渠道能够更改的个人资料,甲方可自行通过电子银行服务渠道变更,因甲方个人资料不真实、不正确、不完整等原因而发生的风险和责任由甲方承担。\n" +
                "\n" +
                "(四)甲方不得通过电子银行渠道发送违法的、与交易无关的或破坏性的信息,不得干扰乙方电子银行系统的正常进行。短信金融服务中甲方发送的短信内容不得含有客户号、密码等关键信息。\n" +
                "\n" +
                "(五)甲方身份认证要素(具体内容请见本协议第一条的相关规定)是乙方在提供电子银行服务过程中识别甲方身份真实性的依据,甲方必须妥善保管,不得将身份认证要素提供给任何第三方(包括乙方工作人员)或交于任何第三方(包括乙方工作人员)使用。使用上述身份认证要素发出的交易指令或完成的交易操作均视为甲方本人所为,甲方应对由此产生的后果负责。\n" +
                "\n" +
                "(六)如甲方的身份认证要素(具体内容请见本协议第一条的相关规定)发生遗失、被盗、遗忘或怀疑已被他人知悉、盗用等可能导致甲方账户安全性降低的情形,甲方应立即对账户进行挂失或对相关电子银行渠道进行终止,在挂失或终止生效之前发生的损失均由甲方承担。\n" +
                "\n" +
                "(七)甲方知悉:甲方在移动运营商的手机号码销号并不会终止已开通的手机银行服务、短信金融服务;甲方如需终止相关电子银行服务,应在乙方办理。甲方手机号码销号或变更,但相关电子银行业务未及时终止或变更所产生的风险和损失由甲方承担。\n" +
                "\n" +
                "(八)甲方发出的指令经乙方执行后,甲方不得要求变更或撤销。甲方发现账户变动与本人的实际交易操作不符的,甲方应自发生该种不符后15日内向乙方作出书面错误通知并应说明错误发生的可能原因、有关的账号、金额等情况。对甲方发出的错误通知,乙方将及时受理并进行调查。如乙方认为错误确已发生并系乙方的原因,乙方将及时对错误加以纠正。\n" +
                "\n" +
                "(九)甲方应采取安装防病毒软件、及时安装电脑系统安全补丁等合理措施,防止身份认证要素(具体内容请见本协议第一条的相关规定)被盗或泄漏;甲方同时应尽到合理注意义务,在安全的环境使用相关电子银行渠道。对于自设密码,甲方应设置安全性较高的密码,避免使用简单易记的密码或容易被他人猜到的密码。对于申请开通电子银行服务时受技术条件限制只能设置数字密码的,甲方应于开通电子银行服务后及时将其更换为安全性更高的密码。\n" +
                "\n" +
                "(十)甲方应当按照乙方公布的电子银行个人客户服务收费项目及标准支付相关费用。\n" +
                "\n" +
                "第四条 乙方主要权利与义务\n" +
                "\n" +
                "一、主要权利\n" +
                "\n" +
                "(一)为不断改进电子银行服务,提高服务的安全性、可靠性、方便性,乙方有权定期或不定期对电子银行系统进行维护、升级和改造。\n" +
                "\n" +
                "(二)为保障甲方资金安全,乙方有权根据客户类别、身份认证措施、交易风险度等因素的不同设定不同的安全策略,不同安全策略对于客户身份认证措施、交易限额、操作流程等可能有不同要求,甲方应当遵守。乙方对安全策略进行调整并涉及客户权利义务变更的,应当通过网点、网站或电子银行等渠道公布或按照本协议约定予以公告。\n" +
                "\n" +
                "(三)乙方有权按照所公布的电子银行个人客户服务收费项目及标准从甲方在建设银行开立的账户中扣收相关费用。已收取的费用在相关电子服务渠道终止、本协议变更或终止等情形下均不予退还。\n" +
                "\n" +
                "(四)乙方有权依据国家有关规定及业务需要对服务内容、收费项目或标准和业务规则等内容进行调整,涉及收费或其他客户权利义务变更的调整,将正式对外公告一定时期后执行并适用于本协议,无需另行通知甲方,如有需要,乙方将在公告前报经有关金融监管部门核准或备案;甲方有权在乙方公告期间选择是否继续使用电子银行相关服务,如果甲方不愿接受乙方公告内容的,应在乙方公告施行前向乙方申请变更或终止相关服务。如果甲方未申请变更或终止相关服务,视为甲方同意相关调整,变更后的内容对甲方产生法律约束力,若甲方不执行变更后的内容,乙方有权选择终止本服务。\n" +
                "\n" +
                "(五)在乙方为甲方办理本协议项下事项所必需的情形下,甲方同意并授权乙方收集、存储甲方在办理本业务过程中主动提供或因使用服务而产生的个人信息,甲方同意并授权乙方可将上述信息用于为甲方办理并提供本协议项下相关网络金融服务,甲方同意并授权乙方向乙方集团成员(包括建设银行境内全资子公司、控股子公司)、服务机构及其他必要的业务合作机构提供乙方获取的甲方个人信息,上述信息的范围包括甲方的姓名、出生日期、身份证件号码、通信通讯联系方式、住址、个人基本资料、账户信息、交易信息。\n" +
                "  对于甲方同意乙方处理的个人信息,乙方将按照法律法规、监管规定及与甲方的约定开展信息处理行为,并采取相应的安全措施保护甲方的个人信息。接收信息的上述第三方将为处理本协议项下事务之目的接触并按照乙方的业务需要使用甲方个人信息,乙方承诺将向有关第三方明确其保护甲方个人信息的职责并要求第三方承担相应保密义务。\n" +
                "\n" +
                "(六)对于因下列原因所导致的错误的发生,乙方不承担责任。\n" +
                "\n" +
                "1.甲方账户余额或信用额度不足;\n" +
                "\n" +
                "2.账户内资金被法定有权机构冻结或扣划;\n" +
                "\n" +
                "3.甲方的行为出于欺诈等恶意目的;\n" +
                "\n" +
                "4.乙方收到的交易指令不符合要求或缺乏必要的交易信息;\n" +
                "\n" +
                "5.甲方未能正确依据电子银行服务的说明操作;\n" +
                "\n" +
                "6.因移动运营商原因造成甲方迟收或未收到我行短信通知。\n" +
                "\n" +
                "二、主要义务\n" +
                "\n" +
                "(一)乙方应及时受理甲方相关电子银行服务的申请,经审查符合条件的,应及时为甲方办理相关手续、提供相应服务。\n" +
                "\n" +
                "(二)对于甲方就相关业务规则的咨询,乙方应及时予以解答或向其提供查询渠道。\n" +
                "\n" +
                "(三)乙方应对甲方资料进行保密,但法律法规及金融监管机构另有规定、甲方与乙方另有约定的除外。\n" +
                "\n" +
                "(四)乙方根据服务项目或服务内容,对服务价格、优惠措施及其生效和终止日期、与价格相关的例外条款和限制性条款、咨询(投诉)的联系方式等信息通过乙方网点、网站等渠道以公告的方式向甲方明示。乙方亦对相关业务规则等要求通过上述渠道以公告的方式向甲方明示。乙方公告内容构成本协议不可分割的一部分,与本协议具有同等效力。甲方应在充分知晓、理解有关公告内容后签署本协议。\n" +
                "\n" +
                "(五)在乙方系统正常运行的情况下,乙方应向甲方提供甲方所申请的相应电子银行服务(部分服务须经甲方另行开通方能享受的,待甲方开通后乙方予以提供),并有义务及时准确地执行甲方的交易指令。\n" +
                "\n" +
                "(六)乙方为甲方办理支付结算业务,因工作差错发生延误,影响甲方资金使用的,应当按照中国人民银行《支付结算办法》的有关规定计付赔偿金。\n" +
                "\n" +
                "第五条 协议的生效、变更、中止和终止\n" +
                "\n" +
                "(一)甲方通过网上银行、电话、手机等自助渠道申请电子银行服务的,本协议自甲方通过自助渠道系统开通电子银行服务时生效;甲方通过乙方柜台申请电子银行服务的,本协议自乙方同意其申请并在乙方系统中设置成功后生效。\n" +
                "\n" +
                "(二)甲方变更或终止电子银行服务,须根据乙方相关业务规定通过乙方营业网点、相关电子银行渠道办理。甲方终止电子银行服务前应偿清所有应付款项。\n" +
                "\n" +
                "(三)甲方通过网上银行、手机等自助渠道终止电子银行服务的,本协议自甲方终止指令进入乙方系统时终止。甲方通过乙方柜台终止电子银行服务的,本协议自乙方同意其终止申请并在乙方系统中设置成功后终止。\n" +
                "\n" +
                "(四)甲方不遵守本协议或存在其他侵害乙方合法权益的行为时,乙方有权终止本协议。\n" +
                "\n" +
                "(五)因挂失、冻结等原因导致账户暂不能使用的,相关电子银行服务亦相应中止,待账户可以正常使用后恢复相关电子银行服务。账户销户的,该账户相关的电子银行服务以及本协议中的相关内容亦相应终止。\n" +
                "\n" +
                "(六)本协议部分条款无效,不影响其他条款的效力。\n" +
                "\n" +
                "第六条 其他约定事项\n" +
                "\n" +
                "(一)乙方不介入甲方与第三方之间的交易纠纷,但可协助甲方查明交易情况。\n" +
                "\n" +
                "(二)除有相反证据证明外,电子银行服务中产生的凭证和银行交易记录是确定交易真实有效和交易具体内容的依据。\n" +
                "\n" +
                "(三)因不可抗力(包括但不限于乙方不能预见、不能避免并不能克服的战争、暴动、严重火灾、水灾、台风、地震、政府行为、禁令、或供电、通讯、黑客攻击等客观情况)导致乙方不能按约定履约的,乙方将视情况给予甲方必要的帮助。根据不可抗力的影响,乙方部分或全部免除责任。\n" +
                "\n" +
                "(四)甲方选择使用短信金融服务的,甲方知晓短信金融服务不是获取账户变动情况的唯一渠道,还可通过乙方其他电子银行和网点等服务渠道查询。\n" +
                "\n" +
                "(五)如非特别指明,本协议条款均适用于网上银行客户、电话银行客户、手机银行客户、短信金融客户、家居银行客户。\n" +
                "\n" +
                "(六)本协议未尽事宜均依据中华人民共和国法律、行政法规、人民银行及银行业监督机关的有关规章、政策规定及金融业的行业惯例办理。\n" +
                "\n" +
                "(七)本合同项下的价款和价外费用均为包含增值税的含税价,但当事人另有约定的除外。\n" +
                "\n" +
                "第七条 协议的适用法律及争议解决方式\n" +
                "\n" +
                "(一)本协议适用中华人民共和国法律。\n" +
                "\n" +
                "(二)凡因本协议引起的或与本协议有关的任何争议,应通过协商解决;协商不成的,任何一方均可向乙方住所地人民法院提起诉讼。\n" +
                "\n" +
                "特别提示:如甲方对建设银行产品或服务有任何疑问、意见或建议,可通过拨打建设银行95533客户服务与投诉热线咨询与反映。\n" +
                "\n" +
                "甲方承诺:本人已仔细阅读上述所有条款,并已特别注意字体加黑的内容。中国建设银行已应本人要求对相关条款予以明确说明,本人对所有条款的含义及相应的法律后果已全部通晓并充分理解。\n");
        jd.add(jta);

        JScrollPane scrollPane = new JScrollPane(jta);
        scrollPane.setBounds(100,350,600,200);
        jd.add(scrollPane);

        jl6.setBounds(100,300,100,30);
        jl6.setFont(f1);
        jd.add(jl6);
        //我已阅读
        jl7.setBounds(310,550,200,30);
        jl7.setFont(f2);
        jd.add(jl7);

        jcb.setBounds(280,550,30,30);
        jd.add(jcb);

        jb1.setBounds(200,600,100,30);
        jb1.setFont(f1);
        jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //关闭当前窗口
                jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));

            }
        });
        jd.add(jb1);

        jb2.setBounds(450,600,100,30);
        jb2.setFont(f1);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (
                        //判断是否输入的信息有空的
                        !"".equals(jtf1.getText()) &&
                        !"".equals(jtf2.getText()) &&
                        !"".equals(jtf3.getText()) &&
                        !"".equals(jtf4.getText()) &&
                        !"".equals(new String(jp1.getPassword())) &&
                        !"".equals(new String(jp2.getPassword())) &&
                        !"".equals(new String(jp3.getPassword()))
                ){
                    if(
                            //判断密码是否按要求写了
                            (jp1.getPassword().length >= 6 &&
                            jp1.getPassword().length <= 20) ||
                            (jp2.getPassword().length >= 6 &&
                            jp2.getPassword().length <= 20)
                    ){
                        //判断两次输入的密码是否相同
                        if ((new String(jp1.getPassword())).equals(new String(jp2.getPassword()))){
                            //判断复选框是否选中了
                            if(jcb.isSelected()){
                                //添加用户
                                Users.add(
                                        jtf1.getText(),
                                        //MD5加密用户密码
                                        MD5Utils.encryptToMD5(new String(jp1.getPassword())),
                                        jtf2.getText(),
                                        jtf3.getText(),
                                        //MD5加密银行卡密码
                                        MD5Utils.encryptToMD5(new String(jp3.getPassword())),
                                        jtf4.getText(),
                                        0
                                );

                                JOptionPane.showMessageDialog(null,"注册成功");
                                //关闭当前窗口
                                jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));
                            }else{
                                JOptionPane.showMessageDialog(null,"必须勾选我以阅读并并同意条款内容!");
                            }
                        }else {
                            JOptionPane.showMessageDialog(null,"两次输入的密码不同");
                        }
                    }else {
                        JOptionPane.showMessageDialog(null,"密码长度不正确");
                    }


                }else {
                    JOptionPane.showMessageDialog(null,"检查一下是否有内容为空");
                }
            }
        });
        jd.add(jb2);

        jd.setLocationRelativeTo(null);
        jd.setVisible(true);
        jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }


}

修改
package view;

import controller.MD5Utils;
import controller.Users;
import model.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

/**
 * @author 小绿龙
 * @date 2022/6/13 - 9:04
 */
public class Change {
    public Change(){
        JFrame jf = new JFrame();
        JDialog jd = new JDialog(jf,"修改");
        jd.setBounds(550,200,800,700);
        jd.setResizable(false);
        jd.setLayout(null);

        Font f1 = new Font("华文行楷",Font.BOLD,30);
        Font f2 = new Font("黑体",Font.BOLD,30);

        JLabel jl1 = new JLabel("账户");
        JLabel jl2 = new JLabel("姓名");
        JLabel jl3 = new JLabel("手机号");
        JLabel jl4 = new JLabel("修改密码");
        JLabel jl5 = new JLabel("确认密码");

        JTextField jtf1 = new JTextField();
        JTextField jtf2 = new JTextField();
        JTextField jtf3 = new JTextField();

        JPasswordField jpf1 = new JPasswordField();
        JPasswordField jpf2 = new JPasswordField();

        JButton jb1 = new JButton("修改");
        JButton jb2 = new JButton("返回");

        jl1.setFont(f1);
        jl1.setBounds(150,50,100,40);
        jd.add(jl1);

        jtf1.setBounds(260,50,400,40);
        jtf1.setFont(f2);
        jd.add(jtf1);

        jl2.setFont(f1);
        jl2.setBounds(150,130,100,40);
        jd.add(jl2);

        jtf2.setBounds(260,130,400,40);
        jtf2.setFont(f2);
        jd.add(jtf2);

        jl3.setFont(f1);
        jl3.setBounds(120,210,100,40);
        jd.add(jl3);

        jtf3.setBounds(260,210,400,40);
        jtf3.setFont(f2);
        jd.add(jtf3);

        jl4.setFont(f1);
        jl4.setBounds(90,290,200,40);
        jd.add(jl4);

        jpf1.setBounds(260,290,400,40);
        jd.add(jpf1);

        jl5.setFont(f1);
        jl5.setBounds(90,370,200,40);
        jd.add(jl5);

        jpf2.setBounds(260,370,400,40);
        jd.add(jpf2);

        jb1.setFont(f1);
        jb1.setBounds(100,500,200,50);
        jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取User表中所有的User
                ArrayList<User> list = Users.getUsers();
                //用于判断User表中是否有这个用户
                boolean b = true;
                //遍历User集合
                for (User user : list) {
                    //如果当前user的信息与输入的信息相同
                    if(user.getUser_id().equals(jtf1.getText())){
                        //判断输入用户名字和电话号是否与表中一致
                        if (
                               user.getUser_name().equals(jtf2.getText()) &&
                               user.getPhone_number().equals(jtf3.getText())
                        ){
                            //两个字符串用于将char[]的密码转化为String
                            String s1 = new String(jpf1.getPassword());
                            String s2 = new String(jpf2.getPassword());
                            if (s1.equals(s2)){
                                Users.update(
                                        user.getUser_name(),
                                        //采用MD5将S1加密
                                        MD5Utils.encryptToMD5(s1),
                                        user.getUser_id(),
                                        user.getBank_card(),
                                        user.getBank_card_password(),
                                        user.getPhone_number(),
                                        user.getUser_balance()
                                );
                                JOptionPane.showMessageDialog(null,"修改成功");
                                //关闭当前窗口
                                jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));
                            }else {
                                JOptionPane.showMessageDialog(null,"两次输入的密码不同!");
                            }

                        }else {
                            JOptionPane.showMessageDialog(null,"用户姓名和手机号不匹配!");
                        }
                    }
                }if (b){
                    JOptionPane.showMessageDialog(null,"找不到该用户,请先注册");
                }
            }
        });
        jd.add(jb1);

        jb2.setFont(f1);
        jb2.setBounds(460,500,200,50);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //关闭当前窗口
                jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));
            }
        });
        jd.add(jb2);

        jd.setLocationRelativeTo(null);
        jd.setVisible(true);
        jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

验证信息
package view;

import controller.MD5Utils;
import model.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;

/**
 * @author 小绿龙
 * @date 2022/6/10 - 12:55
 */
public class Verify {
    public Verify(User user) {
        JFrame jf = new JFrame();
        JDialog jd = new JDialog(jf, "验证信息");
        jd.setBounds(550, 200, 800, 700);
        jd.setResizable(false);
        jd.setLayout(null);

        Font f1 = new Font("华文行楷", Font.BOLD, 30);
        Font f2 = new Font("宋体", Font.BOLD, 50);
        Font f3 = new Font("黑体", Font.BOLD, 30);

        JLabel jl1 = new JLabel("请输入账号");
        JLabel jl2 = new JLabel("银行卡号");
        JLabel jl3 = new JLabel("银行卡支付密码");
        JLabel jl4 = new JLabel("验证信息");

        JTextField jtf1 = new JTextField();
        JTextField jtf2 = new JTextField();
        JPasswordField jp = new JPasswordField();

        JButton jb1 = new JButton("取消");
        JButton jb2 = new JButton("验证");

        jl4.setBounds(250,50,300,50);
        jl4.setFont(f2);
        jd.add(jl4);

        jl1.setBounds(50, 150, 230, 40);
        jl1.setFont(f1);
        jd.add(jl1);

        jtf1.setBounds(300, 150, 350, 40);
        jtf1.setFont(f3);
        jd.add(jtf1);

        jl2.setBounds(50, 250, 230, 40);
        jl2.setFont(f1);
        jd.add(jl2);

        jtf2.setBounds(300, 250, 350, 40);
        jtf2.setFont(f3);
        jd.add(jtf2);

        jl3.setBounds(50, 350, 230, 40);
        jl3.setFont(f1);
        jd.add(jl3);

        jp.setBounds(300, 350, 350, 40);

        jd.add(jp);

        jb1.setBounds(100, 450, 150, 40);
        jb1.setFont(f1);
        jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jd.dispatchEvent(new WindowEvent(jd, WindowEvent.WINDOW_CLOSING));
            }
        });
        jd.add(jb1);

        jb2.setBounds(450, 450, 150, 40);
        jb2.setFont(f1);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (
                        //判断输入的信息不能为空
                        !"".equals(jtf1.getText()) &&
                                !"".equals(jtf2.getText()) &&
                                !"".equals(new String(jp.getPassword()))
                ) {
                    if (
                            //判断用户名和银行卡,银行卡密码都正确
                            user.getUser_id().equals(jtf1.getText()) &&
                                    user.getBank_card().equals(jtf2.getText()) &&
                                    user.getBank_card_password().equals(MD5Utils.encryptToMD5(new String(jp.getPassword())))
                    ) {
                        JOptionPane.showMessageDialog(null, "验证成功");
                        //关闭当前窗口
                        jd.dispatchEvent(new WindowEvent(jd, WindowEvent.WINDOW_CLOSING));
                        //打开用户界面
                        new UserInterface(user);

                    }else {
                        JOptionPane.showMessageDialog(null,"信息有误,请检查信息是否正确!");
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "信息不能为空");
                }
            }
        });
        jd.add(jb2);


        jd.setVisible(true);
        jd.setLocationRelativeTo(null);
        jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

用户
package view;



import controller.Users;
import controller.records;
import model.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;

/**
 * @author 小绿龙
 * @date 2022/6/10 - 12:26
 */
public class UserInterface {

    public UserInterface(User user){
        JFrame jf = new JFrame();
        JDialog jd = new JDialog(jf,"用户");
        jd.setBounds(550,200,800,700);
        jd.setLayout(null);
        jd.setResizable(false);

        Font f1 = new Font("华文行楷",Font.BOLD,25);
        Font f2 = new Font("黑体",Font.BOLD,25);


        JLabel jl1 = new JLabel("账号");
        JLabel jl2 = new JLabel("用户名");
        JLabel jl3 = new JLabel("银行卡号");
        JLabel jl4 = new JLabel("手机号");
        JLabel jl5 = new JLabel("余额");

        JButton jb1 = new JButton("注销");
        JButton jb2 = new JButton("刷新");
        JButton jb3 = new JButton("存款");
        JButton jb4 = new JButton("取款");
        JButton jb5 = new JButton("转账");
        JButton jb6 = new JButton("查看流水");

        JTextField jtf1 = new JTextField();
        jtf1.setText(user.getUser_id());
        jtf1.setFont(f2);
        jtf1.setEditable(false);
        JTextField jtf2 = new JTextField();
        jtf2.setText(user.getUser_name());
        jtf2.setFont(f2);
        jtf2.setEditable(false);
        JTextField jtf3 = new JTextField();
        jtf3.setText(user.getBank_card());
        jtf3.setFont(f2);
        jtf3.setEditable(false);
        JTextField jtf4 = new JTextField();
        jtf4.setText(user.getPhone_number());
        jtf4.setFont(f2);
        jtf4.setEditable(false);
        JTextField jtf5 = new JTextField();
        jtf5.setText(user.getUser_balance() + "");
        jtf5.setFont(f2);
        jtf5.setEditable(false);

        jl1.setBounds(150,80,80,30);
        jl1.setFont(f1);
        jd.add(jl1);

        jtf1.setBounds(300,80,300,30);
        jd.add(jtf1);

        jl2.setBounds(150,150,80,30);
        jl2.setFont(f1);
        jd.add(jl2);

        jtf2.setBounds(300,150,300,30);
        jd.add(jtf2);

        jl3.setBounds(150,220,120,30);
        jl3.setFont(f1);
        jd.add(jl3);

        jtf3.setBounds(300,220,300,30);
        jd.add(jtf3);

        jl4.setBounds(150,290,100,30);
        jl4.setFont(f1);
        jd.add(jl4);

        jtf4.setBounds(300,290,300,30);
        jd.add(jtf4);

        jl5.setBounds(150,360,80,30);
        jl5.setFont(f1);
        jd.add(jl5);

        jtf5.setBounds(300,360,300,30);
        jd.add(jtf5);

        //注销
        jb1.setBounds(150,450,100,30);
        jb1.setFont(f1);
        jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取点击的按钮信息
                int isdelect = JOptionPane.showConfirmDialog(null, "确定要注销账户?", "提示", JOptionPane.YES_NO_OPTION);
                if (isdelect == 0){
                    records.delete(user.getUser_id());
                    Users.delete(user.getUser_id());
                    JOptionPane.showMessageDialog(null,"账户以注销");
                    jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));
                }

            }
        });
        jd.add(jb1);

        //刷新
        jb2.setBounds(330,450,100,30);
        jb2.setFont(f1);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (User user1 : Users.getUsers()) {
                    if (user1.getUser_id().equals(user.getUser_id())){
                        //更新当前的用户信息
                        jtf1.setText(user1.getUser_id());
                        jtf2.setText(user1.getUser_name());
                        jtf3.setText(user1.getBank_card());
                        jtf4.setText(user1.getPhone_number());
                        jtf5.setText(user1.getUser_balance() + "");
                    }
                }

            }
        });
        jd.add(jb2);

        //存款
        jb3.setBounds(500,450,100,30);
        jb3.setFont(f1);
        jb3.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //打开存款界面
                new Deposit(user);
                for (User user1 : Users.getUsers()) {
                    if (user1.getUser_id().equals(user.getUser_id())){
                        //更新当前的用户信息
                        jtf1.setText(user1.getUser_id());
                        jtf2.setText(user1.getUser_name());
                        jtf3.setText(user1.getBank_card());
                        jtf4.setText(user1.getPhone_number());
                        jtf5.setText(user1.getUser_balance() + "");
                    }
                }
                user.setUser_balance(Double.parseDouble(jtf5.getText()));

            }
        });
        jd.add(jb3);

        //取款
        jb4.setBounds(150,550,100,30);
        jb4.setFont(f1);
        jb4.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //打开取款界面
                new Withdrawal(user);
                for (User user1 : Users.getUsers()) {
                    if (user1.getUser_id().equals(user.getUser_id())){
                        //更新当前的用户信息
                        jtf1.setText(user1.getUser_id());
                        jtf2.setText(user1.getUser_name());
                        jtf3.setText(user1.getBank_card());
                        jtf4.setText(user1.getPhone_number());
                        jtf5.setText(user1.getUser_balance() + "");
                    }
                }
                user.setUser_balance(Double.parseDouble(jtf5.getText()));
            }
        });
        jd.add(jb4);

        //转账
        jb5.setBounds(330,550,100,30);
        jb5.setFont(f1);
        jb5.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //打开转账界面
                new Transfer(user);
                for (User user1 : Users.getUsers()) {
                    if (user1.getUser_id().equals(user.getUser_id())){
                        //更新当前的用户信息
                        jtf1.setText(user1.getUser_id());
                        jtf2.setText(user1.getUser_name());
                        jtf3.setText(user1.getBank_card());
                        jtf4.setText(user1.getPhone_number());
                        jtf5.setText(user1.getUser_balance() + "");
                    }
                }
                user.setUser_balance(Double.parseDouble(jtf5.getText()));
            }
        });
        jd.add(jb5);

        jb6.setBounds(500,550,150,30);
        jb6.setFont(f1);
        jb6.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new Check(user.getUser_id(),user.getUser_name());
            }
        });
        jd.add(jb6);


        jd.setVisible(true);
        jd.setLocationRelativeTo(null);
        jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }


}

转账
package view;

import controller.MD5Utils;
import controller.Users;
import controller.records;
import model.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.sql.Date;

/**
 * @author 小绿龙
 * @date 2022/6/22 - 21:42
 */
public class Transfer {
    public Transfer(User user){
        JFrame jf = new JFrame();
        JDialog jd = new JDialog(jf,"转账");
        jd.setBounds(550,200,800,700);
        jd.setResizable(false);
        jd.setLayout(null);

        Font f1 = new Font("华文行楷",Font.BOLD,30);
        Font f2 = new Font("宋体",Font.BOLD,50);
        Font f3 = new Font("黑体",Font.BOLD,30);

        JLabel jl1 = new JLabel("转账金额");
        JLabel jl2 = new JLabel("支付密码");
        JLabel jl3 = new JLabel("目标账户");
        JLabel jl4 = new JLabel("转账");

        JTextField jtf1 = new JTextField();
        JTextField jtf2 = new JTextField();
        JPasswordField jp = new JPasswordField();

        JButton jb1 = new JButton("取消");
        JButton jb2 = new JButton("确定");

        jl1.setBounds(50,150,230,40);
        jl1.setFont(f1);
        jd.add(jl1);

        jtf1.setBounds(300,150,350,40);
        jtf1.setFont(f3);
        jd.add(jtf1);

        jl2.setBounds(50,250,230,40);
        jl2.setFont(f1);
        jd.add(jl2);

        jp.setBounds(300,250,350,40);
        jd.add(jp);

        jl3.setBounds(50,350,230,40);
        jl3.setFont(f1);
        jd.add(jl3);

        jl4.setBounds(300,50,200,50);
        jl4.setFont(f2);
        jd.add(jl4);

        jtf2.setBounds(300,350,350,40);
        jtf2.setFont(f3);
        jd.add(jtf2);

        jb1.setBounds(100,500,150,40);
        jb1.setFont(f1);
        jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));
            }
        });
        jd.add(jb1);

        jb2.setBounds(450,500,150,40);
        jb2.setFont(f1);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(
                        //判断用户文本框是否有空的
                        !"".equals(jtf1.getText()) ||
                        !"".equals(jtf2.getText()) ||
                        !"".equals(new String(jp.getPassword()))
                ) {
                    //判断密码是否正确
                    if (user.getBank_card_password().equals(MD5Utils.encryptToMD5(new String(jp.getPassword())))) {
                        //用户判断是否找到目标用户
                        boolean b = true;
                        //遍历User表,寻找是否有目标用户
                        for (User user1 : Users.getUsers()) {
                            if (user1.getUser_id().equals(jtf2.getText())) {
                                b = false;
                                if (user.getUser_balance() >= Double.parseDouble(jtf1.getText())) {
                                    Users.UpdateTx(Double.parseDouble(jtf1.getText()), user.getUser_id(), user1.getUser_id());
                                    Date date = new Date(System.currentTimeMillis());
                                    records.add(user.getUser_id(),user1.getUser_id(),Double.parseDouble(jtf1.getText()),0,"转出",date);
                                    records.add(user1.getUser_id(),user.getUser_id(),Double.parseDouble(jtf1.getText()),0,"收入",date);
                                    jd.dispatchEvent(new WindowEvent(jd, WindowEvent.WINDOW_CLOSING));
                                } else {
                                    JOptionPane.showMessageDialog(null, "账户余额不足");
                                }
                            }
                        }
                        if (b) {
                            JOptionPane.showMessageDialog(null, "目标用户不存在");
                        }

                    } else {
                        JOptionPane.showMessageDialog(null, "银行卡密码错误");
                    }
                }else {
                    JOptionPane.showMessageDialog(null,"信息不能为空");
                }
            }
        });
        jd.add(jb2);


        jd.setVisible(true);
        jd.setLocationRelativeTo(null);
        jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }

}

存款
package view;

import controller.MD5Utils;
import controller.Users;
import controller.records;
import model.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.sql.Date;


/**
 * @author 小绿龙
 * @date 2022/6/22 - 21:46
 */
public class Deposit {
    public Deposit(User user){
        JFrame jf = new JFrame();
        JDialog jd = new JDialog(jf,"存款");
        jd.setBounds(550,200,800,700);
        jd.setResizable(false);
        jd.setLayout(null);

        Font f1 = new Font("华文行楷",Font.BOLD,30);
        Font f2 = new Font("宋体",Font.BOLD,50);
        Font f3 = new Font("黑体",Font.BOLD,30);

        JLabel jl1 = new JLabel("存款金额");
        JLabel jl2 = new JLabel("支付密码");
        JLabel jl3 = new JLabel("存款");

        JTextField jtf1 = new JTextField();
        JPasswordField jp = new JPasswordField();

        JButton jb1 = new JButton("取消");
        JButton jb2 = new JButton("确定");

        jl1.setBounds(130,150,230,40);
        jl1.setFont(f1);
        jd.add(jl1);

        jtf1.setBounds(300,150,350,40);
        jtf1.setFont(f3);
        jd.add(jtf1);

        jl2.setBounds(130,300,230,40);
        jl2.setFont(f1);
        jd.add(jl2);

        jl3.setBounds(300,50,200,50);
        jl3.setFont(f2);
        jd.add(jl3);

        jp.setBounds(300,300,350,40);
        jd.add(jp);

        jb1.setBounds(130,450,150,40);
        jb1.setFont(f1);
        jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //关闭当前窗口
                jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));
            }
        });
        jd.add(jb1);

        jb2.setBounds(450,450,150,40);
        jb2.setFont(f1);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //判断密码是否正确
                if (user.getBank_card_password().
                        //通过MD5加密的方式将用户输入的密码加密,然后进行比较
                        equals(MD5Utils.encryptToMD5(new String(jp.getPassword())))) {
                    //调用修改User表的方法实现存款
                    Users.update(user.getUser_name(),
                            user.getUser_password(),
                            user.getUser_id(),
                            user.getBank_card(),
                            user.getBank_card_password(),
                            user.getPhone_number(),
                            //获取输入的金额 ,将它修改为当前user对象在User表中对应的金额
                            (user.getUser_balance() + Double.parseDouble(jtf1.getText()))
                    );
                    //获取当前的时间戳
                    Date date = new Date(System.currentTimeMillis());
                    //将此条存款记录添加到record表中
                    records.add(user.getUser_id(),"无",Double.parseDouble(jtf1.getText()),0,"存款",date);
                    JOptionPane.showMessageDialog(null,"存款成功");
                    //关闭当前窗口
                    jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));
                }else {
                    JOptionPane.showMessageDialog(null,"密码错误");
                }
            }
        });
        jd.add(jb2);


        jd.setVisible(true);
        jd.setLocationRelativeTo(null);
        jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }

}

取款
package view;

import controller.MD5Utils;
import controller.Users;
import controller.records;
import model.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.sql.Date;

/**
 * @author 小绿龙
 * @date 2022/6/22 - 21:47
 */
public class Withdrawal {
    public Withdrawal(User user){
        JFrame jf = new JFrame();
        JDialog jd = new JDialog(jf,"取款");
        jd.setBounds(550,200,800,700);
        jd.setResizable(false);
        jd.setLayout(null);

        Font f1 = new Font("华文行楷",Font.BOLD,30);
        Font f2 = new Font("宋体",Font.BOLD,50);
        Font f3 = new Font("黑体",Font.BOLD,30);

        JLabel jl1 = new JLabel("取款金额");
        JLabel jl2 = new JLabel("支付密码");
        JLabel jl3 = new JLabel("取款");

        JTextField jtf1 = new JTextField();
        JPasswordField jp = new JPasswordField();

        JButton jb1 = new JButton("取消");
        JButton jb2 = new JButton("确定");

        jl1.setBounds(130,150,230,40);
        jl1.setFont(f1);
        jd.add(jl1);

        jtf1.setBounds(300,150,350,40);
        jtf1.setFont(f3);
        jd.add(jtf1);

        jl2.setBounds(130,300,230,40);
        jl2.setFont(f1);
        jd.add(jl2);

        jl3.setBounds(300,50,200,50);
        jl3.setFont(f2);
        jd.add(jl3);

        jp.setBounds(300,300,350,40);
        jd.add(jp);

        jb1.setBounds(130,450,150,40);
        jb1.setFont(f1);
        jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jd.dispatchEvent(new WindowEvent(jd,WindowEvent.WINDOW_CLOSING));
            }
        });
        jd.add(jb1);

        jb2.setBounds(450,450,150,40);
        jb2.setFont(f1);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //判断输入的信息不能为空
                if (!"".equals(jtf1.getText()) && !"".equals(new String(jp.getPassword()))) {
                    //判断输入的银行卡密码正确
                    if (user.getBank_card_password().equals(MD5Utils.encryptToMD5(new String(jp.getPassword())))) {
                        if (user.getUser_balance() >= Double.parseDouble(jtf1.getText())) {
                            Users.update(user.getUser_name(),
                                    user.getUser_password(),
                                    user.getUser_id(),
                                    user.getBank_card(),
                                    user.getBank_card_password(),
                                    user.getPhone_number(),
                                    (user.getUser_balance() - Double.parseDouble(jtf1.getText()))
                            );
                            Date date = new Date(System.currentTimeMillis());
                            records.add(user.getUser_id(), "无", Double.parseDouble(jtf1.getText()), 0, "取款", date);
                            JOptionPane.showMessageDialog(null, "取款成功");
                            jd.dispatchEvent(new WindowEvent(jd, WindowEvent.WINDOW_CLOSING));
                        } else {
                            JOptionPane.showMessageDialog(null, "账户金额只有:" + user.getUser_balance() + "。取不了那么多!");
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "密码错误");
                    }
                }else {
                    JOptionPane.showMessageDialog(null, "信息不能为空");
                }
            }
        });
        jd.add(jb2);

        jd.setVisible(true);
        jd.setLocationRelativeTo(null);
        jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

查看流水
package view;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.ArrayList;

import controller.records;
import model.record;


/**
 * @author 小绿龙
 * @date 2022/6/10 - 13:13
 */
public class Check {
    public Check(String user_id,String user_name){
        JFrame jf = new JFrame();
        JDialog jd = new JDialog(jf,"查看流水");
        jd.setBounds(550,200,800,700);
        jd.setResizable(false);
        jd.setLayout(null);

        Font f1 = new Font("黑体",Font.BOLD,15);
        //获取record表中所有数据
        ArrayList<record> list = records.getrecord(user_id);
        //设置JTable的表头
        String[] rowData = new String[]{"流水单号","用户","目标用户","金额","服务费","服务类型","交易时间"};
        //设置JTable的内容
        String[][] columnNames = new String[list.size()][7];
        for (int i = 0; i < list.size(); i++) {
            columnNames[i][0] = (i + 1) + "";
            columnNames[i][1] = user_name;
            columnNames[i][2] = list.get(i).getTarget_id();
            columnNames[i][3] = list.get(i).getMoney() + "";
            columnNames[i][4] = list.get(i).getTip() + "";
            columnNames[i][5] = list.get(i).getRecord_type();
            columnNames[i][6] = list.get(i).getTime() + "";
        }
        //创建一个模板将上面两个字符数组添加进来当作规范
        DefaultTableModel model = new DefaultTableModel(columnNames,rowData);
        //将模板添加进JTable
        JTable jt = new JTable(model){
            //设置不可修改表中内容,但是可以选中
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        jt.setFont(f1);
        jt.getTableHeader().setFont(f1);
        jt.setRowHeight(30);
        //设置选中的颜色
        jt.setSelectionBackground(Color.yellow);
        //设置一个可以滑动的模板,将上面的JTable对象添加进去
        JScrollPane scrollPane = new JScrollPane(jt);
        scrollPane.setBounds(16,0,750,450);
        jd.add(scrollPane);

        jd.setVisible(true);
        jd.setLocationRelativeTo(null);
        jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }

}

model

JDBC的工具类
package model;


import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.Properties;

/**
 * @author 小绿龙
 * @date 2022/6/3 - 16:27
 */
public class JDBCUtils {
    //通用的查询操作
    public static  <T> ArrayList<T> getForList(Class<T> clazz,String sql, Object ...args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConnection();
            //预编译sql语句,返回PreparedStatement的实例
            ps = conn.prepareStatement(sql);
            //填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1,args[i]);
            }
            ResultSet rs = ps.executeQuery();

            ResultSetMetaData rsmd = rs.getMetaData();

            int columnCount = rsmd.getColumnCount();

            ArrayList<T> list = new ArrayList<>();
            while (rs.next()){
                T t = clazz.newInstance();
                for (int i = 0; i < columnCount; i++) {
                    //获取列值
                    Object columnValue = rs.getObject(i + 1);
                    //获取每个列名
                    String columnLabel = rsmd.getColumnLabel(i + 1);

                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t,columnValue);
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResource(conn,ps);
        }

        return null;
    }


    public static void update(String sql,Object ...args){
        //获取数据库的连接
        Connection conn= null;
        PreparedStatement ps = null;
        try {
            conn = getConnection();
            //预编译sql语句,返回PreparedStatement的实例
            ps = conn.prepareStatement(sql);
            //填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1,args[i]);
            }
            //执行
            try {
                ps.execute();
            } catch (SQLException e) {
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭资源
            closeResource(conn,ps);
        }


    }

    public static void updateTx(Connection conn,String sql,Object ...args){
        PreparedStatement ps = null;
        try {
            //预编译sql语句,返回PreparedStatement的实例
            ps = conn.prepareStatement(sql);
            //填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1,args[i]);
            }
            //执行
            try {
                ps.execute();
            } catch (SQLException e) {

            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭资源
            closeResource(null,ps);
        }


    }

    public static Connection getConnection() throws Exception {
        //读取配置文件的四个基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");

        Properties pros = new Properties();
        pros.load(is);

        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");

        //加载驱动
        Class.forName(driverClass);

        //获取连接
        Connection conn = DriverManager.getConnection(url,user,password);
        return conn;
    }

    public static void closeResource(Connection conn, Statement ps){
        try {
            if(ps != null){
                ps.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if(conn != null){
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

记录表
package model;

import java.sql.Date;

/**
 * record表对应的所有字段
 * @author 小绿龙
 * @date 2022/6/11 - 14:43
 */
public class record {
    private int record_id;
    private String target_id;
    private double money;
    private double tip;
    private String user_id;
    private String record_type;
    private Date time;



    public record() {
    }

    public String getRecord_type() {
        return record_type;
    }

    public void setRecord_type(String record_type) {
        this.record_type = record_type;
    }

    public record(int record_id, String target_id, double money, double tip, String user_id, String record_type, Date time) {
        this.record_id = record_id;
        this.target_id = target_id;
        this.money = money;
        this.tip = tip;
        this.user_id = user_id;
        this.record_type= record_type;
        this.time = time;
    }

    public int getRecord_id() {
        return record_id;
    }

    public void setRecord_id(int record_id) {
        this.record_id = record_id;
    }

    public String getTarget_id() {
        return target_id;
    }

    public void setTarget_id(String target_id) {
        this.target_id = target_id;
    }

    public double getMoney() {
        return money;
    }

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

    public double getTip() {
        return tip;
    }

    public void setTip(double tip) {
        this.tip = tip;
    }

    public void setUser_name(String user_id) {
        this.user_id = user_id;
    }


    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }
}

用户表
package model;

/**
* User表对应的所有字段
* @author 小绿龙
* @date 2022/6/11 - 14:37
*/
public class User {
   private String user_name;
   private String user_password;
   private String user_id;
   private String bank_card;
   private String bank_card_password;
   private String phone_number;
   private double user_balance;

   public double getUser_balance() {
       return user_balance;
   }

   public void setUser_balance(double user_balance) {
       this.user_balance = user_balance;
   }

   public String getUser_name() {
       return user_name;
   }

   public void setUser_name(String user_name) {
       this.user_name = user_name;
   }

   public String getUser_password() {
       return user_password;
   }

   public void setUser_password(String user_password) {
       this.user_password = user_password;
   }

   public String getUser_id() {
       return user_id;
   }

   public void setUser_id(String user_id) {
       this.user_id = user_id;
   }

   public String getBank_card() {
       return bank_card;
   }

   public void setBank_card(String bank_card) {
       this.bank_card = bank_card;
   }

   public String getBank_card_password() {
       return bank_card_password;
   }

   public void setBank_card_password(String bank_card_password) {
       this.bank_card_password = bank_card_password;
   }

   public String getPhone_number() {
       return phone_number;
   }

   public void setPhone_number(String phone_number) {
       this.phone_number = phone_number;
   }

   public User(String user_name, String user_password, String user_id, String bank_card, String bank_card_password, String phone_number, double user_balance) {
       this.user_name = user_name;
       this.user_password = user_password;
       this.user_id = user_id;
       this.bank_card = bank_card;
       this.bank_card_password = bank_card_password;
       this.phone_number = phone_number;
       this.user_balance = user_balance;
   }

   public User() {
   }
}

controller

MD5
package controller;

import org.apache.commons.codec.digest.DigestUtils;

/**
* @author 小绿龙
* @date 2022/6/24 - 19:51
*/
public class MD5Utils {
   //MD5加密
   public static String encryptToMD5(String str){
       return DigestUtils.md5Hex(str);
   }
}

记录表链接数据库的方法
package controller;

import model.JDBCUtils;
import model.record;

import java.sql.Date;
import java.util.ArrayList;

/**
* @author 小绿龙
* @date 2022/6/11 - 15:41
*
* 转账记录表
*/
public class records {
   /**
    * 专门查询record表的方法
    * @param user_id
    * @return
    */
   public static ArrayList<record> getrecord(String user_id){
       //查询的sql语句
       String sql = "select * from record where user_id = ?";
       //调用通用的查询记录的方法
       ArrayList<record> list = JDBCUtils.getForList(record.class, sql,user_id);
       return list;
   }

   /**
    * 向转账记录表添加一条记录
    * @param user_id
    * @param target_id
    * @param money
    * @param tip
    * @param record_type
    * @param time
    * @return
    */
   public static boolean add(String user_id, String target_id, double money, double tip, String record_type, Date time){
       //添加的sql语句
       String sql = "insert into record(user_id,target_id,money,tip,record_type,time) values(?,?,?,?,?,?)";
       try {
           //调用通用的增删改方法
           JDBCUtils.update(sql,user_id,target_id,money,tip,record_type,time);
       } catch (Exception e) {
           return false;
       }
       return true;
   }

   /**
    * 向record表删除删除一条记录
    * @param user_id
    */
   public static void delete(String user_id){
       //添加sql语句
       String sql = "delete from record where user_id = ?";
       //调用通用的增删改方法
       JDBCUtils.update(sql,user_id);
   }


}

用户表链接数据库的方法
package controller;

import model.JDBCUtils;
import model.User;

import javax.swing.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;

/**
* @author 小绿龙
* @date 2022/6/11 - 15:40
*/
public class Users {
   /**
    * 查询User表
    * @return User表的所有信息
    */
   public static ArrayList<User> getUsers(){
       //添加sql语句
       String sql = "select * from user";
       ArrayList<User> list = JDBCUtils.getForList(User.class, sql);
       return list;
   }

   public static boolean add(String user_name,String user_password,String user_id,String bank_card,String bank_card_password,String phone_number,double user_balance){
       //添加sql语句
       String sql = "insert into user(user_name,user_password,user_id,bank_card,bank_card_password,phone_number,user_balance) values(?,?,?,?,?,?,?)";
       try {
           JDBCUtils.update(sql,user_name,user_password,user_id,bank_card,bank_card_password,phone_number,user_balance);
       } catch (Exception e) {
           JOptionPane.showMessageDialog(null,"身份证不能重复");
           return false;
       }
       return true;
   }

   public static void delete(String user_id){
       //添加sql语句
       String sql = "delete from user where user_id = ?";
       JDBCUtils.update(sql,user_id);
   }

   public static void update(String user_name,String user_password,String user_id,String bank_card,String bank_card_password,String phone_number,double user_balance){
       //添加sql语句
       String sql = "update user set user_name = ?,user_password = ?,bank_card = ?, bank_card_password = ?, phone_number = ? ,user_balance = ? where user_id = ?";
       JDBCUtils.update(sql,user_name,user_password,bank_card,bank_card_password,phone_number,user_balance,user_id);
   }

   public static void UpdateTx(double money,String user_id,String target_id){
           //创建连接
           Connection conn = null;
       try {
           conn = JDBCUtils.getConnection();

           //取消数据自动提交
           conn.setAutoCommit(false);
           //对user扣钱的sql语句
           String sql1 = "update user set user_balance = user_balance - " + money + " where user_id = ?";
           JDBCUtils.updateTx(conn,sql1,user_id);
           //对target加钱的sql语句
           String sql2 = "update user set user_balance = user_balance + " + money + " where user_id = ?";
           JDBCUtils.updateTx(conn,sql2,target_id);
           //手动提交数据
           conn.commit();
           JOptionPane.showMessageDialog(null,"转账成功");
       } catch (Exception e) {
           e.printStackTrace();
           try {
               conn.rollback();
           } catch (SQLException ex) {
               ex.printStackTrace();
           }
       }finally {
           //关闭连接
           JDBCUtils.closeResource(conn,null);
       }


   }
}

需要源码的私信我,创作不易,三连支持一下!

  • 40
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值