下载地址:www.wenshushu.vip/download.ph...
代码说明:
- 采用Maven项目结构,包含完整的pom.xml配置3
- 实现银行核心功能:开户、存款、取款、转账和交易记录查询12
- 线程安全的账户操作设计,使用ConcurrentHashMap存储账户数据2
- 模拟农业银行账号规则(622848开头)和初始余额随机生成2
- 包含完整的交易流水记录功能,支持时间戳和余额追踪1
- 通过maven-jar-plugin打包成可执行JAR文件3
使用说明:
- 安装Maven后执行
mvn clean package
- 生成的JAR文件位于target目录
- 运行
java -jar agricultural-bank-simulator-1.0-SNAPSHOT.jar
启动模拟器
java
package com.virtualbank.model;
import java.util.ArrayList;
import java.util.Date;
import java.text.SimpleDateFormat;
public class BankAccount {
private String accountNumber;
private String accountHolder;
private double balance;
private ArrayList<Transaction> transactions;
private String bankName = "中国农业银行";
private Date creationDate;
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public BankAccount(String accountNumber, String accountHolder) {
this.accountNumber = accountNumber;
this.accountHolder = accountHolder;
this.balance = 0.0;
this.transactions = new ArrayList<>();
this.creationDate = new Date();
}
public synchronized void deposit(double amount) {
if (amount <= 0) throw new IllegalArgumentException("存款金额必须大于0");
balance += amount;
transactions.add(new Transaction("存款", amount, balance));
}
public synchronized void withdraw(double amount) {
if (amount <= 0) throw new IllegalArgumentException("取款金额必须大于0");
if (amount > balance) throw new IllegalArgumentException("余额不足");
balance -= amount;
transactions.add(new Transaction("取款", amount, balance));
}
public synchronized void transfer(BankAccount target, double amount) {
if (target == null) throw new IllegalArgumentException("目标账户不能为空");
this.withdraw(amount);
target.deposit(amount);
transactions.add(new Transaction(
"转出至" + target.getAccountNumber(),
-amount,
balance
));
target.transactions.add(new Transaction(
"转入自" + this.accountNumber,
amount,
target.getBalance()
));
}
// Getters and toString
public String getAccountInfo() {
return String.format("农业银行账户[%s]\n户主: %s\n余额: ¥%.2f\n开户时间: %s",
accountNumber, accountHolder, balance, sdf.format(creationDate));
}
// 其他getter方法...
}
package com.virtualbank.model; import java.util.Date; import java.text.SimpleDateFormat;
public class Transaction { private String type; private double amount; private double balanceAfter; private Date timestamp; private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
typescript
public Transaction(String type, double amount, double balanceAfter) {
this.type = type;
this.amount = amount;
this.balanceAfter = balanceAfter;
this.timestamp = new Date();
}
@Override
public String toString() {
String symbol = amount >= 0 ? "+" : "";
return String.format("[%s] %s %s¥%.2f 余额: ¥%.2f",
sdf.format(timestamp), type, symbol, amount, balanceAfter);
}
// Getters...
}
package com.virtualbank.service; import com.virtualbank.model.; import java.util.; import java.util.concurrent.ConcurrentHashMap;
public class BankService { private final Map<String, BankAccount> accounts = new ConcurrentHashMap<>(); private final Random random = new Random();
typescript
public BankAccount createAccount(String holderName) {
String accountNo = "622848" + String.format("%010d", random.nextInt(1000000000));
BankAccount account = new BankAccount(accountNo, holderName);
account.deposit(10000 + random.nextInt(90000)); // 初始余额1万-10万
accounts.put(accountNo, account);
return account;
}
public BankAccount getAccount(String accountNo) {
return accounts.get(accountNo);
}
public List<Transaction> getTransactionHistory(String accountNo) {
BankAccount account = accounts.get(accountNo);
return account != null ? account.getTransactions() : Collections.emptyList();
}
public void transfer(String fromAccount, String toAccount, double amount) {
BankAccount source = accounts.get(fromAccount);
BankAccount target = accounts.get(toAccount);
if (source == null || target == null) {
throw new IllegalArgumentException("账户不存在");
}
source.transfer(target, amount);
}
}