返回 合体・全栈道途擘画

Java Swing 银行管理系统开发教程

博主
大约 29 分钟

Java Swing 银行管理系统开发教程

1. 系统概述

1.1 项目简介

Java Swing银行管理系统是一个基于Java 8、JDBC、Swing和MySQL技术栈开发的桌面应用程序,旨在提供完整的银行业务处理功能。本系统采用传统的桌面应用架构,支持存款、取款、查询余额、交易历史记录、账户管理、转账等核心功能,同时实现了基于角色的访问控制(RBAC)机制,确保系统安全性和权限管理的有效性。

1.2 技术栈选择

类别技术版本选型理由
开发语言Java8成熟稳定、跨平台、生态完善、无需额外安装
数据库连接JDBC4.xJava标准数据库连接API、无需额外依赖、原生支持
图形界面Swing内置Java内置GUI框架、无需额外安装、跨平台支持
数据库MySQL8.0+可靠性高、性能稳定、适合金融系统
构建工具Maven3.8.x依赖管理、项目构建标准化

1.3 系统架构概览

graph TB
    subgraph 表示层
        A[登录界面 LoginPanel] --> B[主界面 BankMainPanel]
        B --> C[存款面板 DepositPanel]
        B --> D[取款面板 WithdrawPanel]
        B --> E[查询面板 QueryPanel]
        B --> F[交易历史面板 TransactionHistoryPanel]
        B --> G[转账面板 TransferPanel]
        B --> H[账户管理面板 AccountManagementPanel]
        B --> I[报表面板 ReportPanel]
    end
    
    subgraph 业务层
        J[数据访问对象 BankDAO]
    end
    
    subgraph 数据层
        K[(MySQL数据库 bank_db)]
    end
    
    subgraph 工具层
        L[数据库连接 DatabaseConnection]
    end
    
    C --> J
    D --> J
    E --> J
    F --> J
    G --> J
    H --> J
    I --> J
    J --> L
    L --> K
    
    style A fill:#e1f5fe
    style B fill:#e1f5fe
    style K fill:#4caf50
    style L fill:#ff9800
    style J fill:#9c27b0

2. 数据库设计

2.1 数据库模型设计

2.1.1 实体关系图

erDiagram
    ROLE ||--o{ USER : has
    USER ||--o{ ACCOUNT : owns
    ACCOUNT ||--o{ TRANSACTION : generates
    
    ROLE {
        int role_id
        string role_name
        string role_description
        timestamp created_date
    }
    
    USER {
        int user_id
        string username
        string password
        string full_name
        string email
        string phone
        int role_id
        boolean is_active
        timestamp created_date
        timestamp updated_date
    }
    
    ACCOUNT {
        int account_id
        string account_number
        string account_holder
        decimal balance
        int user_id
        timestamp created_date
        timestamp updated_date
    }
    
    TRANSACTION {
        int transaction_id
        string account_number
        string transaction_type
        decimal amount
        timestamp transaction_date
        string description
    }

2.1.2 数据字典

表名字段名数据类型约束描述
rolesrole_idINTPRIMARY KEY, AUTO_INCREMENT角色ID
rolesrole_nameVARCHAR(50)UNIQUE, NOT NULL角色名称
rolesrole_descriptionVARCHAR(255)角色描述
rolescreated_dateTIMESTAMPDEFAULT CURRENT_TIMESTAMP创建时间
usersuser_idINTPRIMARY KEY, AUTO_INCREMENT用户ID
usersusernameVARCHAR(50)UNIQUE, NOT NULL用户名
userspasswordVARCHAR(255)NOT NULL密码(BCrypt加密)
usersfull_nameVARCHAR(100)NOT NULL用户全名
usersemailVARCHAR(100)邮箱
usersphoneVARCHAR(20)电话
usersrole_idINTFOREIGN KEY, NOT NULL关联角色ID
usersis_activeBOOLEANDEFAULT TRUE是否激活
userscreated_dateTIMESTAMPDEFAULT CURRENT_TIMESTAMP创建时间
usersupdated_dateTIMESTAMPDEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP更新时间
accountsaccount_idINTPRIMARY KEY, AUTO_INCREMENT账户ID
accountsaccount_numberVARCHAR(20)UNIQUE, NOT NULL账号
accountsaccount_holderVARCHAR(100)NOT NULL账户持有人
accountsbalanceDECIMAL(10,2)DEFAULT 0.00账户余额
accountsuser_idINTFOREIGN KEY关联用户ID
accountscreated_dateTIMESTAMPDEFAULT CURRENT_TIMESTAMP创建时间
accountsupdated_dateTIMESTAMPDEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP更新时间
transactionstransaction_idINTPRIMARY KEY, AUTO_INCREMENT交易ID
transactionsaccount_numberVARCHAR(20)FOREIGN KEY, NOT NULL关联账号
transactionstransaction_typeENUMNOT NULL交易类型(存款/取款)
transactionsamountDECIMAL(10,2)NOT NULL交易金额
transactionstransaction_dateTIMESTAMPDEFAULT CURRENT_TIMESTAMP交易时间
transactionsdescriptionVARCHAR(255)交易描述

2.2 数据库初始化脚本

-- 银行管理系统数据库初始化脚本
-- 创建数据库和相关表

-- 创建数据库
CREATE DATABASE IF NOT EXISTS bank_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 使用数据库
USE bank_db;

-- 创建角色表
CREATE TABLE IF NOT EXISTS roles (
    role_id INT AUTO_INCREMENT PRIMARY KEY,
    role_name VARCHAR(50) UNIQUE NOT NULL,
    role_description VARCHAR(255),
    created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 创建用户表
CREATE TABLE IF NOT EXISTS users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    full_name VARCHAR(100) NOT NULL,
    email VARCHAR(100),
    phone VARCHAR(20),
    role_id INT NOT NULL,
    is_active BOOLEAN DEFAULT TRUE,
    created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (role_id) REFERENCES roles(role_id)
);

-- 创建账户表
CREATE TABLE IF NOT EXISTS accounts (
    account_id INT AUTO_INCREMENT PRIMARY KEY,
    account_number VARCHAR(20) UNIQUE NOT NULL,
    account_holder VARCHAR(100) NOT NULL,
    balance DECIMAL(10,2) DEFAULT 0.00,
    user_id INT NULL,
    created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

-- 创建交易记录表
CREATE TABLE IF NOT EXISTS transactions (
    transaction_id INT AUTO_INCREMENT PRIMARY KEY,
    account_number VARCHAR(20) NOT NULL,
    transaction_type ENUM('存款', '取款') NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    transaction_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    description VARCHAR(255),
    FOREIGN KEY (account_number) REFERENCES accounts(account_number)
);

-- 插入角色数据
INSERT INTO roles (role_name, role_description) VALUES
('ADMIN', '系统管理员'),
('USER', '普通用户');

-- 插入用户数据(密码:admin123, user123)
INSERT INTO users (username, password, full_name, email, phone, role_id) VALUES
('admin', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '系统管理员', 'admin@bank.com', '13800138000', 1),
('user1', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '张三', 'zhangsan@bank.com', '13800138001', 2),
('user2', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '李四', 'lisi@bank.com', '13800138002', 2);

-- 插入示例账户数据
INSERT INTO accounts (account_number, account_holder, balance, user_id) VALUES
('6222000000001', '张三', 1000.00, 2),
('6222000000002', '李四', 2500.50, 3),
('6222000000003', '王五', 500.00, NULL);

-- 创建索引以提高查询性能
CREATE INDEX idx_username ON users(username);
CREATE INDEX idx_account_number ON accounts(account_number);
CREATE INDEX idx_transaction_date ON transactions(transaction_date);
CREATE INDEX idx_transaction_account ON transactions(account_number);
CREATE INDEX idx_user_role ON users(role_id);

3. 系统架构设计

3.1 分层架构设计

graph LR
    subgraph 表示层
        A[LoginPanel 登录面板]
        B[BankMainPanel 主面板]
        C[DepositPanel 存款面板]
        D[WithdrawPanel 取款面板]
        E[QueryPanel 查询面板]
        F[TransactionHistoryPanel 交易历史面板]
        G[AccountManagementPanel 账户管理面板]
        H[TransferPanel 转账面板]
        I[ReportPanel 报表面板]
    end
    
    subgraph 业务层
        J[BankDAO 数据访问对象]
    end
    
    subgraph 数据层
        K[(MySQL数据库)]
    end
    
    subgraph 工具层
        L[DatabaseConnection 数据库连接]
        M[UIDesignManager UI设计管理器]
    end
    
    A -->|登录成功| B
    B -->|存款操作| C
    B -->|取款操作| D
    B -->|余额查询| E
    B -->|交易历史| F
    B -->|账户管理| G
    B -->|转账操作| H
    B -->|报表生成| I
    
    C --> J
    D --> J
    E --> J
    F --> J
    G --> J
    H --> J
    I --> J
    
    J --> L
    L --> K
    
    M --> A
    M --> B
    M --> C
    M --> D
    M --> E
    M --> F
    M --> G
    M --> H
    M --> I

3.2 组件交互关系图

graph TB
    subgraph 主应用
        APP[BankSystemApp 主应用类]
    end
    
    subgraph 界面组件
        LOGIN[LoginPanel 登录界面]
        MAIN[BankMainPanel 主界面]
        DEPOSIT[DepositPanel 存款]
        WITHDRAW[WithdrawPanel 取款]
        QUERY[QueryPanel 查询]
        HISTORY[TransactionHistoryPanel 交易历史]
        ACCOUNT[AccountManagementPanel 账户管理]
        TRANSFER[TransferPanel 转账]
        REPORT[ReportPanel 报表]
    end
    
    subgraph 数据访问
        DAO[BankDAO 数据访问]
        DB[(MySQL数据库)]
    end
    
    subgraph 工具类
        CONN[DatabaseConnection 连接管理]
    end
    
    APP -->|初始化| LOGIN
    LOGIN -->|登录成功| MAIN
    MAIN -->|包含| DEPOSIT
    MAIN -->|包含| WITHDRAW
    MAIN -->|包含| QUERY
    MAIN -->|包含| HISTORY
    MAIN -->|包含| ACCOUNT
    MAIN -->|包含| TRANSFER
    MAIN -->|包含| REPORT
    
    DEPOSIT --> DAO
    WITHDRAW --> DAO
    QUERY --> DAO
    HISTORY --> DAO
    ACCOUNT --> DAO
    TRANSFER --> DAO
    REPORT --> DAO
    
    DAO --> CONN
    CONN --> DB

4. 核心类详解

4.1 BankSystemApp - 主应用程序类

4.1.1 类功能

BankSystemApp是整个银行管理系统的入口类,负责应用程序的初始化、界面切换和窗口管理。它使用CardLayout实现登录界面和主界面之间的切换,是整个应用程序的容器。

4.1.2 核心属性

属性名类型描述
cardLayoutCardLayout卡片布局管理器,用于界面切换
mainPanelJPanel主面板容器,包含所有子面板
loginPanelLoginPanel登录面板实例
mainFrameBankMainPanel主面板实例(登录成功后创建)

4.1.3 核心方法

方法名参数返回类型描述
BankSystemApp()void构造函数,初始化所有组件
initializeComponents()void初始化界面组件
setupLayout()void设置界面布局
setupWindow()void设置窗口属性
showMainFrame(User user)User对象void显示主界面
showLoginPanel()void显示登录界面
createIcon()Image创建应用图标
main(String[] args)String数组void应用程序入口

4.1.4 使用场景

  • 应用启动:程序启动时创建BankSystemApp实例,初始化登录界面
  • 界面切换:用户登录成功后,调用showMainFrame()方法切换到主界面
  • 退出登录:用户退出时,调用showLoginPanel()方法返回登录界面
  • 窗口管理:设置窗口标题、大小、图标等属性

4.1.5 代码示例

package com.bank.ui;

import com.bank.model.User;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class BankSystemApp extends JFrame {
    
    private CardLayout cardLayout;
    private JPanel mainPanel;
    private LoginPanel loginPanel;
    private BankMainPanel mainFrame;
    
    public BankSystemApp() {
        initializeComponents();
        setupLayout();
        setupWindow();
    }
    
    private void initializeComponents() {
        cardLayout = new CardLayout();
        mainPanel = new JPanel(cardLayout);
        
        loginPanel = new LoginPanel();
        loginPanel.setLoginSuccessListener(new LoginPanel.LoginSuccessListener() {
            @Override
            public void onLoginSuccess(User user) {
                showMainFrame(user);
            }
        });
        
        mainFrame = null;
    }
    
    private void setupLayout() {
        setLayout(new BorderLayout());
        mainPanel.add(loginPanel, "LOGIN");
        add(mainPanel, BorderLayout.CENTER);
    }
    
    private void setupWindow() {
        setTitle("银行管理系统 - 登录");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(900, 700);
        setLocationRelativeTo(null);
        setResizable(true);
        setIconImage(createIcon());
    }
    
    private void showMainFrame(User user) {
        if (mainFrame == null) {
            mainFrame = new BankMainPanel(user);
        }
        mainPanel.add(mainFrame, "MAIN");
        cardLayout.show(mainPanel, "MAIN");
        setTitle("银行管理系统 - 欢迎," + user.getFullName() + " (" + user.getRoleName() + ")");
    }
    
    private void showLoginPanel() {
        cardLayout.show(mainPanel, "LOGIN");
        loginPanel.setInitialFocus();
        setTitle("银行管理系统 - 登录");
    }
    
    private Image createIcon() {
        try {
            BufferedImage icon = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = icon.createGraphics();
            g2d.setColor(new Color(0, 82, 163));
            g2d.fillRect(0, 0, 32, 32);
            g2d.setColor(new Color(255, 215, 0));
            g2d.fillRect(8, 8, 16, 16);
            g2d.setColor(Color.WHITE);
            g2d.fillRect(12, 12, 8, 8);
            g2d.setColor(new Color(139, 69, 19));
            g2d.drawRect(11, 11, 10, 10);
            g2d.dispose();
            return icon;
        } catch (Exception e) {
            return null;
        }
    }
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (Exception e) {
            System.err.println("无法设置系统外观,使用默认外观: " + e.getMessage());
        }
        
        SwingUtilities.invokeLater(() -> {
            try {
                BankSystemApp app = new BankSystemApp();
                app.setVisible(true);
                SwingUtilities.invokeLater(() -> {
                    app.loginPanel.setInitialFocus();
                });
            } catch (Exception e) {
                System.err.println("启动应用程序时发生错误: " + e.getMessage());
                e.printStackTrace();
            }
        });
    }
}

4.2 BankDAO - 数据访问对象类

4.2.1 类功能

BankDAO是数据访问层(DAO)的核心类,负责处理所有与数据库相关的操作。它封装了JDBC操作,提供账户查询、余额更新、存款、取款、转账、交易记录等功能,确保数据操作的安全性和一致性。

4.2.2 核心方法

方法名参数返回类型描述
findAccountByNumber(String accountNumber)账号BankAccount根据账号查找账户
updateAccountBalance(String accountNumber, double newBalance)账号、新余额boolean更新账户余额
deposit(String accountNumber, double amount, String description)账号、金额、描述boolean存款操作(含事务)
withdraw(String accountNumber, double amount, String description)账号、金额、描述boolean取款操作(含事务)
recordTransaction(String accountNumber, String transactionType, double amount, String description)账号、类型、金额、描述boolean记录交易
getTransactionHistory(String accountNumber)账号List<Transaction>获取交易历史
createAccount(String accountNumber, String accountHolder, Integer userId)账号、持有人、用户IDboolean创建新账户
findAccountsByUserId(int userId)用户IDList<BankAccount>根据用户ID查找账户
updateAccountUser(String accountNumber, Integer userId)账号、用户IDboolean更新账户关联用户
transferMoney(String fromAccount, String toAccount, double amount)转出账号、转入账号、金额boolean转账操作(含事务)

4.2.3 使用场景

  • 存款操作:用户存款时,先查询账户,计算新余额,更新余额,记录交易,提交事务
  • 取款操作:用户取款时,先查询账户,检查余额是否足够,计算新余额,更新余额,记录交易,提交事务
  • 转账操作:用户转账时,检查两个账户是否存在,检查转出账户余额是否足够,更新两个账户余额,记录两笔交易,提交事务
  • 查询余额:根据账号查询账户信息,获取当前余额
  • 交易历史:根据账号查询所有交易记录,按时间倒序排列

4.2.4 事务管理

sequenceDiagram
    participant User as 用户
    participant DAO as BankDAO
    participant DB as MySQL数据库
    
    User->>DAO: deposit(accountNumber, amount, description)
    DAO->>DAO: 开启事务
    DAO->>DB: 查找账户
    DB-->>DAO: 返回账户信息
    
    alt 账户存在
        DAO->>DAO: 计算新余额
        DAO->>DB: 更新账户余额
        DB-->>DAO: 更新成功
        DAO->>DB: 记录交易
        DB-->>DAO: 记录成功
        DAO->>DAO: 提交事务
        DAO-->>User: 返回true
    else 账户不存在
        DAO->>DAO: 回滚事务
        DAO-->>User: 返回false
    end

4.3 DatabaseConnection - 数据库连接管理类

4.3.1 类功能

DatabaseConnection是数据库连接的工具类,负责管理与MySQL数据库的连接。它使用单例模式确保连接参数的一致性,提供获取连接和关闭连接的方法,封装了JDBC驱动的加载和连接管理。

4.3.2 核心属性

属性名类型描述
URLString(static final)数据库连接URL
USERNAMEString(static final)数据库用户名
PASSWORDString(static final)数据库密码

4.3.3 核心方法

方法名参数返回类型描述
getConnection()Connection获取数据库连接
closeConnection(Connection connection)Connection对象void关闭数据库连接

4.3.4 使用场景

  • 获取连接:所有需要访问数据库的操作都通过getConnection()方法获取连接
  • 关闭连接:操作完成后,通过closeConnection()方法关闭连接,释放资源
  • 异常处理:连接失败时抛出SQLException,由调用方处理

4.3.5 数据库连接流程图

flowchart TD
    A[开始] --> B[加载MySQL驱动]
    B --> C{驱动加载成功?}
    C -->|是| D[获取数据库连接]
    C -->|否| E[抛出SQLException]
    D --> F{连接成功?}
    F -->|是| G[返回Connection对象]
    F -->|否| E
    H[使用Connection] --> I[操作完成]
    I --> J[关闭Connection]
    J --> K[释放资源]
    K --> L[结束]
    
    style A fill:#4caf50
    style G fill:#4caf50
    style E fill:#f44336
    style K fill:#2196f3

4.4 BankAccount - 账户实体类

4.4.1 类功能

BankAccount是账户的实体类,用于表示银行账户的数据模型。它封装了账户的基本信息,包括账户ID、账号、持有人姓名和余额,提供了标准的getter和setter方法。

4.4.2 核心属性

属性名类型描述
accountIdint账户ID(主键)
accountNumberString账号
accountHolderString账户持有人姓名
balancedouble账户余额

4.4.3 核心方法

方法名参数返回类型描述
BankAccount()void默认构造函数
BankAccount(int accountId, String accountNumber, String accountHolder, double balance)账户ID、账号、持有人、余额void完整构造函数
getAccountId()int获取账户ID
setAccountId(int accountId)账户IDvoid设置账户ID
getAccountNumber()String获取账号
setAccountNumber(String accountNumber)账号void设置账号
getAccountHolder()String获取持有人姓名
setAccountHolder(String accountHolder)持有人姓名void设置持有人姓名
getBalance()double获取余额
setBalance(double balance)余额void设置余额
toString()String返回账户信息字符串

4.4.4 使用场景

  • 数据传输:在数据库操作和界面显示之间传输账户数据
  • 数据封装:封装账户的所有属性,提供统一的访问接口
  • 数据验证:可以在setter方法中添加数据验证逻辑

4.4.5 类图

classDiagram
    class BankAccount {
        -int accountId
        -String accountNumber
        -String accountHolder
        -double balance
        +BankAccount()
        +BankAccount(int, String, String, double)
        +getAccountId() int
        +setAccountId(int) void
        +getAccountNumber() String
        +setAccountNumber(String) void
        +getAccountHolder() String
        +setAccountHolder(String) void
        +getBalance() double
        +setBalance(double) void
        +toString() String
    }
    
    class Transaction {
        -int transactionId
        -String accountNumber
        -String transactionType
        -double amount
        -LocalDateTime transactionDate
        -String description
        +getTransactionId() int
        +setTransactionId(int) void
        +getAccountNumber() String
        +setAccountNumber(String) void
        +getTransactionType() String
        +setTransactionType(String) void
        +getAmount() double
        +setAmount(double) void
        +getTransactionDate() LocalDateTime
        +setTransactionDate(LocalDateTime) void
        +getDescription() String
        +setDescription(String) void
    }
    
    class User {
        -int userId
        -String username
        -String password
        -String fullName
        -String email
        -String phone
        -int roleId
        -boolean isActive
        +getUserId() int
        +setUserId(int) void
        +getUsername() String
        +setUsername(String) void
        +getPassword() String
        +setPassword(String) void
        +getFullName() String
        +setFullName(String) void
        +getEmail() String
        +setEmail(String) void
        +getPhone() String
        +setPhone(String) void
        +getRoleId() int
        +setRoleId(int) void
        +getIsActive() boolean
        +setIsActive(boolean) void
        +getRoleName() String
    }
    
    class Role {
        -int roleId
        -String roleName
        -String roleDescription
        +getRoleId() int
        +setRoleId(int) void
        +getRoleName() String
        +setRoleName(String) void
        +getRoleDescription() String
        +setRoleDescription(String) void
    }
    
    BankAccount "1" --> "*" Transaction : generates
    User "1..*" --> BankAccount : owns
    Role "1" --> User : has

5. 业务流程设计

5.1 登录流程

sequenceDiagram
    participant User as 用户
    participant LoginPanel as 登录界面
    participant UserDAO as 用户DAO
    participant DB as 数据库
    participant BankSystemApp as 主应用
    
    User->>LoginPanel: 输入用户名和密码
    LoginPanel->>UserDAO: 验证用户凭据
    UserDAO->>DB: 查询用户信息
    DB-->>UserDAO: 返回用户数据
    
    alt 用户存在且密码正确
        UserDAO-->>LoginPanel: 返回用户对象
        LoginPanel->>BankSystemApp: 触发登录成功事件
        BankSystemApp->>BankSystemApp: 创建主面板
        BankSystemApp->>BankSystemApp: 切换到主界面
        BankSystemApp-->>User: 显示主界面
    else 用户不存在或密码错误
        UserDAO-->>LoginPanel: 返回null
        LoginPanel-->>User: 显示错误提示
    end

5.2 存款流程

flowchart TD
    A[开始存款] --> B[输入账号和金额]
    B --> C{输入验证}
    C -->|验证失败| D[显示错误提示]
    D --> A
    
    C -->|验证通过| E[调用BankDAO.deposit]
    E --> F[开启数据库事务]
    F --> G[查询账户信息]
    G --> H{账户存在?}
    H -->|否| I[回滚事务]
    I --> J[返回失败]
    J --> K[显示错误提示]
    K --> A
    
    H -->|是| L[计算新余额]
    L --> M[更新账户余额]
    M --> N{更新成功?}
    N -->|否| I
    N -->|是| O[记录交易]
    O --> P{记录成功?}
    P -->|否| I
    P -->|是| Q[提交事务]
    Q --> R[返回成功]
    R --> S[显示成功提示]
    S --> T[刷新界面显示]
    T --> U[结束]
    
    style A fill:#4caf50
    style U fill:#4caf50
    style D fill:#f44336
    style I fill:#f44336
    style J fill:#f44336
    style K fill:#f44336
    style S fill:#2196f3
    style R fill:#2196f3

5.3 取款流程

flowchart TD
    A[开始取款] --> B[输入账号和金额]
    B --> C{输入验证}
    C -->|验证失败| D[显示错误提示]
    D --> A
    
    C -->|验证通过| E[调用BankDAO.withdraw]
    E --> F[开启数据库事务]
    F --> G[查询账户信息]
    G --> H{账户存在?}
    H -->|否| I[回滚事务]
    I --> J[返回失败]
    J --> K[显示账户不存在提示]
    K --> A
    
    H -->|是| L{余额足够?}
    L -->|否| M[回滚事务]
    M --> N[返回失败]
    N --> O[显示余额不足提示]
    O --> A
    
    L -->|是| P[计算新余额]
    P --> Q[更新账户余额]
    Q --> R{更新成功?}
    R -->|否| M
    R -->|是| S[记录交易]
    S --> T{记录成功?}
    T -->|否| M
    T -->|是| U[提交事务]
    U --> V[返回成功]
    V --> W[显示成功提示]
    W --> X[刷新界面显示]
    X --> Y[结束]
    
    style A fill:#4caf50
    style Y fill:#4caf50
    style D fill:#f44336
    style I fill:#f44336
    style J fill:#f44336
    style K fill:#f44336
    style M fill:#f44336
    style N fill:#f44336
    style O fill:#f44336
    style W fill:#2196f3
    style V fill:#2196f3

5.4 转账流程

sequenceDiagram
    participant User as 用户
    participant TransferPanel as 转账面板
    participant BankDAO as 数据访问
    participant DB as 数据库
    
    User->>TransferPanel: 输入转出账号、转入账号和金额
    TransferPanel->>BankDAO: transferMoney(fromAccount, toAccount, amount)
    BankDAO->>BankDAO: 开启数据库事务
    
    BankDAO->>DB: 查询转出账户
    DB-->>BankDAO: 返回转出账户信息
    BankDAO->>BankDAO: 验证转出账户存在
    
    alt 转出账户不存在
        BankDAO->>BankDAO: 回滚事务
        BankDAO-->>TransferPanel: 返回false
        TransferPanel-->>User: 显示转出账户不存在提示
    else 转出账户存在
        BankDAO->>DB: 查询转入账户
        DB-->>BankDAO: 返回转入账户信息
        BankDAO->>BankDAO: 验证转入账户存在
        
        alt 转入账户不存在
            BankDAO->>BankDAO: 回滚事务
            BankDAO-->>TransferPanel: 返回false
            TransferPanel-->>User: 显示转入账户不存在提示
        else 转入账户存在
            BankDAO->>BankDAO: 检查转出账户余额
            
            alt 余额不足
                BankDAO->>BankDAO: 回滚事务
                BankDAO-->>TransferPanel: 返回false
                TransferPanel-->>User: 显示余额不足提示
            else 余额足够
                BankDAO->>DB: 更新转出账户余额
                DB-->>BankDAO: 更新成功
                
                BankDAO->>DB: 更新转入账户余额
                DB-->>BankDAO: 更新成功
                
                BankDAO->>DB: 记录转出交易
                DB-->>BankDAO: 记录成功
                
                BankDAO->>DB: 记录转入交易
                DB-->>BankDAO: 记录成功
                
                BankDAO->>BankDAO: 提交事务
                BankDAO-->>TransferPanel: 返回true
                TransferPanel-->>User: 显示转账成功提示
            end
        end
    end

6. 开发环境搭建

6.1 前置条件

  • JDK 8或更高版本
  • MySQL 8.0或更高版本
  • Maven 3.8或更高版本
  • IDE(推荐IntelliJ IDEA或Eclipse)

6.2 项目结构

bank/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── bank/
│   │   │           ├── dao/          # 数据访问对象
│   │   │           │   ├── BankDAO.java
│   │   │           │   └── UserDAO.java
│   │   │           ├── model/        # 实体类
│   │   │           │   ├── BankAccount.java
│   │   │           │   ├── Transaction.java
│   │   │           │   ├── User.java
│   │   │           │   └── Role.java
│   │   │           ├── ui/           # 用户界面
│   │   │           │   ├── BankSystemApp.java
│   │   │           │   ├── BankMainFrame.java
│   │   │           │   ├── BankMainPanel.java
│   │   │           │   ├── LoginPanel.java
│   │   │           │   ├── DepositPanel.java
│   │   │           │   ├── WithdrawPanel.java
│   │   │           │   ├── QueryPanel.java
│   │   │           │   ├── TransactionHistoryPanel.java
│   │   │           │   ├── AccountManagementPanel.java
│   │   │           │   ├── TransferPanel.java
│   │   │           │   ├── ReportPanel.java
│   │   │           │   └── UIDesignManager.java
│   │   │           └── util/         # 工具类
│   │   │               └── DatabaseConnection.java
│   │   └── resources/
│   │       └── database_init_simple.sql
│   └── test/
│       └── java/
│           └── com/
│               └── bank/
├── pom.xml
├── run.sh
└── README.md

6.3 环境配置步骤

6.3.1 JDK安装与配置

  1. 下载JDK 8+安装包并安装
  2. 配置环境变量:
# macOS/Linux
export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

# Windows
set JAVA_HOME=C:\path\to\jdk
set PATH=%JAVA_HOME%\bin;%PATH%
  1. 验证安装:
java -version
javac -version

6.3.2 MySQL安装与配置

  1. 下载并安装MySQL 8.0+
  2. 启动MySQL服务
  3. 创建数据库:
CREATE DATABASE bank_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  1. 执行初始化脚本:
mysql -u root -p < src/main/resources/database_init_simple.sql

6.3.3 Maven配置

  1. 下载Maven 3.8+并解压
  2. 配置环境变量:
# macOS/Linux
export MAVEN_HOME=/path/to/maven
export PATH=$MAVEN_HOME/bin:$PATH

# Windows
set MAVEN_HOME=C:\path\to\maven
set PATH=%MAVEN_HOME%\bin;%PATH%
  1. 验证安装:
mvn -version

6.4 项目构建

# 进入项目目录
cd /path/to/bank

# 编译项目
mvn clean compile

# 打包项目
mvn package

6.5 运行程序

方式一:使用Maven直接运行

mvn exec:java -Dexec.mainClass="com.bank.ui.BankSystemApp"

方式二:使用启动脚本

./run.sh

7. 系统功能模块

7.1 用户认证模块

7.1.1 功能描述

用户认证模块负责验证用户身份,确保只有授权用户才能访问系统。系统支持两种角色:管理员和普通用户,不同角色拥有不同的功能权限。

7.1.2 认证流程图

stateDiagram-v2
    [*] --> 未登录
    未登录 --> 输入凭据: 用户打开登录界面
    输入凭据 --> 验证中: 用户点击登录按钮
    验证中 --> 登录成功: 用户名和密码正确
    验证中 --> 登录失败: 用户名或密码错误
    登录失败 --> 输入凭据: 显示错误提示
    登录成功 --> 已登录: 切换到主界面
    已登录 --> 权限检查: 根据用户角色加载功能
    权限检查 --> 管理员界面: 角色为ADMIN
    权限检查 --> 普通用户界面: 角色为USER
    管理员界面 --> 已登录
    普通用户界面 --> 已登录
    已登录 --> 未登录: 用户点击退出

7.1.3 示例账户

用户类型用户名密码角色姓名
管理员adminadmin123ADMIN - 系统管理员
普通用户user1user123USER - 张三
普通用户user2user123USER - 李四

7.2 存款模块

7.2.1 功能描述

存款模块允许用户向指定账户存入资金,系统会自动更新账户余额并记录交易历史。

7.2.2 存款状态图

stateDiagram-v2
    [*] --> 等待输入: 用户打开存款面板
    等待输入 --> 验证输入: 用户输入账号和金额
    验证输入 --> 输入错误: 输入验证失败
    输入错误 --> 等待输入: 显示错误提示
    验证输入 --> 处理中: 输入验证通过
    处理中 --> 存款成功: 存款操作成功
    处理中 --> 存款失败: 存款操作失败
    存款失败 --> 等待输入: 显示失败原因
    存款成功 --> 显示结果: 显示成功信息和更新余额
    显示结果 --> [*]: 操作完成

7.3 取款模块

7.3.1 功能描述

取款模块允许用户从指定账户提取资金,系统会检查账户余额是否足够,更新账户余额并记录交易历史。

7.3.2 取款状态图

stateDiagram-v2
    [*] --> 等待输入: 用户打开取款面板
    等待输入 --> 验证输入: 用户输入账号和金额
    验证输入 --> 输入错误: 输入验证失败
    输入错误 --> 等待输入: 显示错误提示
    验证输入 --> 查询账户: 输入验证通过
    查询账户 --> 余额检查: 账户存在
    查询账户 --> 账户不存在: 账户不存在
    账户不存在 --> 等待输入: 显示账户不存在提示
    余额检查 --> 余额不足: 余额不足
    余额不足 --> 等待输入: 显示余额不足提示
    余额检查 --> 处理中: 余额足够
    处理中 --> 取款成功: 取款操作成功
    处理中 --> 取款失败: 取款操作失败
    取款失败 --> 等待输入: 显示失败原因
    取款成功 --> 显示结果: 显示成功信息和更新余额
    显示结果 --> [*]: 操作完成

7.4 交易历史模块

7.4.1 功能描述

交易历史模块允许用户查看指定账户的所有交易记录,包括存款、取款、转账等操作,按时间倒序显示。

7.4.2 交易历史流程图

flowchart LR
    A[用户选择账户] --> B[调用getTransactionHistory]
    B --> C[查询数据库]
    C --> D[获取交易列表]
    D --> E[按时间倒序排列]
    E --> F[限制显示数量]
    F --> G[显示在界面上]
    G --> H[支持分页]
    H --> I[显示交易详情]
    I --> J[支持筛选]
    J --> K[导出功能]
    
    style A fill:#4caf50
    style G fill:#2196f3
    style K fill:#ff9800

7.5 账户管理模块

7.5.1 功能描述

账户管理模块允许管理员创建新账户、查看账户列表、修改账户信息、关联用户等操作。

7.5.2 账户管理流程图

flowchart TD
    A[管理员登录] --> B[打开账户管理面板]
    B --> C{选择操作}
    C -->|创建账户| D[输入账户信息]
    D --> E[验证输入]
    E --> F[调用createAccount]
    F --> G{创建成功?}
    G -->|是| H[显示成功提示]
    G -->|否| I[显示错误提示]
    C -->|查看账户| J[调用findAccountsByUserId]
    J --> K[显示账户列表]
    C -->|修改账户| L[选择账户]
    L --> M[修改账户信息]
    M --> N[调用updateAccount]
    N --> O{更新成功?}
    O -->|是| P[显示成功提示]
    O -->|否| Q[显示错误提示]
    C -->|关联用户| R[选择账户和用户]
    R --> S[调用updateAccountUser]
    S --> T{关联成功?}
    T -->|是| U[显示成功提示]
    T -->|否| V[显示错误提示]
    
    style A fill:#4caf50
    style H fill:#2196f3
    style P fill:#2196f3
    style U fill:#2196f3
    style I fill:#f44336
    style Q fill:#f44336
    style V fill:#f44336

8. 安全特性

8.1 安全机制

graph TB
    subgraph 安全层
        A[用户认证]
        B[RBAC权限管理]
        C[输入验证]
        D[SQL注入防护]
        E[事务管理]
    end
    
    subgraph 实现方式
        F[BCrypt密码加密]
        G[PreparedStatement]
        H[数据库事务]
    end
    
    A --> F
    B --> A
    C --> B
    D --> G
    E --> H
    
    style A fill:#4caf50
    style B fill:#2196f3
    style C fill:#ff9800
    style D fill:#f44336
    style E fill:#9c27b0

8.2 安全特性说明

安全特性实现方式描述
用户认证数据库验证用户名和密码存储在数据库中,登录时验证
RBAC权限管理角色控制不同角色拥有不同的功能权限
密码加密BCrypt使用BCrypt算法加密用户密码
输入验证前端验证防止无效数据输入
SQL注入防护PreparedStatement使用参数化查询防止SQL注入
事务管理JDBC事务确保存款和取款操作的数据一致性

9. 故障排除

9.1 常见问题与解决方案

问题可能原因解决方案
数据库连接失败数据库服务未启动,连接参数错误检查MySQL服务状态,验证连接参数
账户余额不足取款或转账金额超过账户余额检查账户余额,调整操作金额
用户名或密码错误输入错误或用户不存在检查输入内容,确认用户存在
中文乱码数据库字符集设置不当确认MySQL字符集设置为utf8mb4
界面显示异常Swing组件初始化失败检查代码逻辑,查看异常堆栈

9.2 调试流程图

flowchart TD
    A[程序启动失败] --> B{错误类型?}
    B -->|数据库连接错误| C[检查MySQL服务状态]
    C --> D{服务运行?}
    D -->|否| E[启动MySQL服务]
    D -->|是| F[检查连接参数]
    F --> G{参数正确?}
    G -->|否| H[修改DatabaseConnection类]
    G -->|是| I[检查网络连接]
    
    B -->|界面显示错误| J[检查Swing组件初始化]
    J --> K[检查布局管理器]
    K --> L[检查事件监听器]
    
    B -->|业务逻辑错误| M[检查BankDAO方法]
    M --> N[检查SQL语句]
    N --> O[检查事务管理]
    O --> P[检查异常处理]
    
    E --> Q[重新运行程序]
    H --> Q
    I --> Q
    L --> Q
    P --> Q
    
    style A fill:#f44336
    style Q fill:#4caf50
    style C fill:#ff9800
    style J fill:#ff9800
    style M fill:#ff9800

10. 项目总结

10.1 系统功能

  • ✅ 用户认证:基于数据库的用户登录验证,支持管理员和普通用户角色
  • ✅ RBAC权限管理:基于角色的访问控制,不同角色拥有不同功能权限
  • ✅ 存款功能:向指定账户存入资金
  • ✅ 取款功能:从指定账户提取资金
  • ✅ 余额查询:查看账户当前余额
  • ✅ 交易历史:查看账户的交易记录
  • ✅ 账户管理:管理员可创建和管理账户
  • ✅ 转账功能:账户之间资金转账

10.2 技术亮点

  1. 桌面应用架构:采用Swing构建跨平台桌面应用
  2. 分层架构:清晰的表示层、业务层、数据层分离
  3. JDBC数据访问:使用JDBC原生API访问MySQL数据库
  4. 事务管理:确保存款、取款、转账操作的数据一致性
  5. RBAC权限控制:基于角色的访问控制,确保系统安全
  6. 密码加密:使用BCrypt算法加密用户密码

10.3 后续优化方向

  1. 性能优化:优化数据库查询,添加连接池管理
  2. 界面优化:改进UI设计,提升用户体验
  3. 功能扩展:添加更多银行业务功能,如贷款、理财等
  4. 日志管理:添加详细的操作日志记录
  5. 数据备份:实现数据库定期备份功能

11. 附录

11.1 参考文档

11.2 开发工具推荐

工具用途推荐版本
IntelliJ IDEAJava开发IDE2023.1+
EclipseJava开发IDE2023-03+
MySQL Workbench数据库管理工具8.0+
Navicat Premium数据库管理工具16.0+
Maven项目构建工具3.8+

知识点测试

读完文章了?来测试一下你对知识点的掌握程度吧!

评论区

使用 GitHub 账号登录后即可发表评论,支持 Markdown 格式。

如果评论系统无法加载,请确保:

  • 您的网络可以访问 GitHub
  • giscus GitHub App 已安装到仓库
  • 仓库已启用 Discussions 功能