下载地址:www.wenshushu.vip/download.ph…
代码功能说明:
- 支持六大银行账户管理,包括工商、农业、建设、邮政、招商、中国银行14
- 完整交易记录功能,包含存款、取款、转账操作16
- 自动生成逼真银行界面截图,包含账户信息、余额和交易记录46
- 采用面向对象设计,包含银行账户、交易记录等核心类1
- 提供命令行交互界面,支持账户创建和操作
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
// 银行枚举类型
enum BankType {
ICBC("工商银行", Color.RED),
ABC("农业银行", Color.GREEN),
CCB("建设银行", Color.BLUE),
PSBC("邮政储蓄", Color.MAGENTA),
CMB("招商银行", Color.ORANGE),
BOC("中国银行", Color.CYAN);
final String name;
final Color themeColor;
BankType(String name, Color color) {
this.name = name;
this.themeColor = color;
}
}
// 交易记录类
class Transaction {
String type;
double amount;
Date timestamp;
String targetAccount;
public Transaction(String type, double amount, String target) {
this.type = type;
this.amount = amount;
this.timestamp = new Date();
this.targetAccount = target;
}
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return String.format("[%s] %s: %.2f %s",
sdf.format(timestamp), type, amount,
targetAccount != null ? "->" + targetAccount : "");
}
}
// 银行账户类
class BankAccount {
private final String accountNumber;
private final String accountName;
private double balance;
private final BankType bankType;
private final List<Transaction> transactions = new ArrayList<>();
public BankAccount(String number, String name, BankType type) {
this.accountNumber = number;
this.accountName = name;
this.balance = 0.0;
this.bankType = type;
}
public synchronized void deposit(double amount) {
if (amount > 0) {
balance += amount;
transactions.add(new Transaction("存款", amount, null));
}
}
public synchronized boolean withdraw(double amount) {
if (amount > 0 && balance >= amount) {
balance -= amount;
transactions.add(new Transaction("取款", -amount, null));
return true;
}
return false;
}
public synchronized boolean transferTo(BankAccount target, double amount) {
if (this.withdraw(amount)) {
target.deposit(amount);
transactions.add(new Transaction("转出", -amount, target.accountNumber));
target.transactions.add(new Transaction("转入", amount, this.accountNumber));
return true;
}
return false;
}
// 生成账户余额截图
public BufferedImage generateBalanceScreenshot() {
int width = 400;
int height = 600;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
// 绘制银行主题背景
g.setColor(bankType.themeColor);
g.fillRect(0, 0, width, 100);
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑", Font.BOLD, 20));
g.drawString(bankType.name + "手机银行", 20, 40);
// 账户信息区域
g.setColor(Color.WHITE);
g.fillRect(20, 80, width - 40, height - 180);
g.setColor(Color.BLACK);
g.setFont(new Font("宋体", Font.PLAIN, 14));
g.drawString("账户名称: " + accountName, 30, 120);
g.drawString("账号: " + accountNumber, 30, 150);
// 余额显示
g.setColor(bankType.themeColor);
g.setFont(new Font("微软雅黑", Font.BOLD, 28));
g.drawString(String.format("¥ %.2f", balance), 30, 200);
// 交易记录
g.setColor(Color.GRAY);
g.drawLine(30, 220, width - 30, 220);
g.setColor(Color.BLACK);
g.setFont(new Font("宋体", Font.BOLD, 16));
g.drawString("最近交易记录", 30, 250);
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");
int yPos = 280;
for (int i = Math.max(0, transactions.size() - 5); i < transactions.size(); i++) {
Transaction t = transactions.get(i);
g.setFont(new Font("宋体", Font.PLAIN, 12));
g.drawString(sdf.format(t.timestamp), 30, yPos);
g.drawString(t.type, 120, yPos);
g.drawString(String.format("%.2f", t.amount), 250, yPos);
yPos += 30;
}
// 底部时间戳
g.setColor(Color.LIGHT_GRAY);
g.setFont(new Font("宋体", Font.PLAIN, 10));
g.drawString("生成时间: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),
20, height - 20);
g.dispose();
return image;
}
}
// 主系统类
public class BankSimulator {
private static final Map<String, BankAccount> accounts = new HashMap<>();
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
initSampleAccounts();
while (true) {
System.out.println("\n===== 银行模拟系统 =====");
System.out.println("1. 创建账户");
System.out.println("2. 账户操作");
System.out.println("3. 生成余额截图");
System.out.println("4. 退出");
System.out.print("请选择: ");
int choice = scanner.nextInt();
scanner.nextLine(); // 清除换行符
switch (choice) {
case 1:
createAccount();
break;
case 2:
accountOperations();
break;
case 3:
generateScreenshot();
break;
case 4:
System.exit(0);
default:
System.out.println("无效选择");
}
}
}
private static void initSampleAccounts() {
accounts.put("6222021234567890",
new BankAccount("6222021234567890", "张三", BankType.ICBC));
accounts.put("6228481234567890",
new BankAccount("6228481234567890", "李四", BankType.ABC));
accounts.put("6227001234567890",
new BankAccount("6227001234567890", "王五", BankType.CCB));
}
private static void createAccount() {
System.out.println("\n选择银行类型:");
for (BankType type : BankType.values()) {
System.out.println((type.ordinal() + 1) + ". " + type.name);
}
System.out.print("请输入银行编号: ");
int bankIdx = scanner.nextInt() - 1;
scanner.nextLine();
if (bankIdx < 0 || bankIdx >= BankType.values().length) {
System.out.println("无效银行类型");
return;
}
System.out.print("输入账户名称: ");
String name = scanner.nextLine();
// 生成随机账号
String prefix = "";
switch (BankType.values()[bankIdx]) {
case ICBC: prefix = "622202"; break;
case ABC: prefix = "622848"; break;
case CCB: prefix = "622700"; break;
case PSBC: prefix = "622188"; break;
case CMB: prefix = "622588"; break;
case BOC: prefix = "622760"; break;
}
String accountNum = prefix + String.format("%010d", new Random().nextInt(1000000000));
BankAccount account = new BankAccount(accountNum, name, BankType.values()[bankIdx]);
accounts.put(accountNum, account);
System.out.println("账户创建成功!");
System.out.println("账号: " + accountNum);
System.out.println("银行: " + account.bankType.name);
}
private static void accountOperations() {
System.out.print("\n输入账号: ");
String accNum = scanner.nextLine();
BankAccount account = accounts.get(accNum);
if (account == null) {
System.out.println("账户不存在");
return;
}
while (true) {
System.out.println("\n===== 账户操作 =====");
System.out.println("1. 存款");
System.out.println("2. 取款");
System.out.println("3. 转账");
System.out.println("4. 查看余额");
System.out.println("5. 查看交易记录");
System.out.println("6. 返回主菜单");
System.out.print("请选择: ");
int choice = scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1:
System.out.print("输入存款金额: ");
double depositAmt = scanner.nextDouble();
account.deposit(depositAmt);
System.out.println("存款成功");
break;
case 2:
System.out.print("输入取款金额: ");
double withdrawAmt = scanner.nextDouble();
if (account.withdraw(withdrawAmt)) {
System.out.println("取款成功");
} else {
System.out.println("取款失败,余额不足");
}
break;
case 3:
System.out.print("输入目标账号: ");
String targetNum = scanner.nextLine();
BankAccount target = accounts.get(targetNum);
if (target == null) {
System.out.println("目标账户不存在");
break;
}
System.out.print("输入转账金额: ");
double transferAmt = scanner.nextDouble();
if (account.transferTo(target, transferAmt)) {
System.out.println("转账成功");
} else {
System.out.println("转账失败,余额不足");
}
break;
case 4:
System.out.printf("当前余额: %.2f\n", account.balance);
break;
case 5:
System.out.println("\n交易记录:");
for (Transaction t : account.transactions) {
System.out.println(t);
}
break;
case 6:
return;
default:
System.out.println("无效选择");
}
}
}
private static void generateScreenshot() {
System.out.print("\n输入账号: ");
String accNum = scanner.nextLine();
BankAccount account = accounts.get(accNum);
if (account == null) {
System.out.println("账户不存在");
return;
}
try {
BufferedImage screenshot = account.generateBalanceScreenshot();
String fileName = "bank_screenshot_" + accNum + "_" +
new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".png";
ImageIO.write(screenshot, "png", new File(fileName));
System.out.println("截图已保存为: " + fileName);
} catch (Exception e) {
System.out.println("生成截图失败: " + e.getMessage());
}
}
}