下载地址:https://www.pan38.com/yun/share.php?code=JCnzE 提取密码:6689
这个银行模拟系统包含三个主要模块:核心银行账户逻辑、图形用户界面和REST API接口。系统支持五大银行的账户模拟,包括虚拟余额生成功能,可以预测未来30天的账户余额变化。
import random
import time
import hashlib
from datetime import datetime
class BankAccount:
def init(self, bank_name, account_type="储蓄卡"):
self.bank_name = bank_name
self.account_type = account_type
self.account_number = self._generate_account_number()
self.balance = 0.0
self.transaction_history = []
self.credit_limit = 10000 if account_type == "信用卡" else 0
self.creation_date = datetime.now()
def _generate_account_number(self):
prefix = {
"农业银行": "622848",
"工商银行": "622202",
"建设银行": "622700",
"邮政储蓄": "622188",
"中国银行": "456351"
}.get(self.bank_name, "622588")
return prefix + ''.join([str(random.randint(0,9)) for _ in range(13)])
def deposit(self, amount):
self.balance += amount
self._record_transaction("存款", amount)
return f"成功存入 {amount:.2f} 元,当前余额: {self.balance:.2f} 元"
def withdraw(self, amount):
if amount > self.balance + self.credit_limit:
return "余额不足"
self.balance -= amount
self._record_transaction("取款", -amount)
return f"成功取出 {amount:.2f} 元,当前余额: {self.balance:.2f} 元"
def _record_transaction(self, trans_type, amount):
transaction = {
"type": trans_type,
"amount": amount,
"balance": self.balance,
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.transaction_history.append(transaction)
def get_balance(self):
return self.balance
def get_transaction_history(self):
return self.transaction_history
def generate_virtual_balance(self, days=30):
virtual_balance = []
current_balance = self.balance
for day in range(days):
daily_change = random.uniform(-500, 1000)
current_balance += daily_change
if current_balance < -self.credit_limit:
current_balance = -self.credit_limit
virtual_balance.append({
"date": (datetime.now() + timedelta(days=day)).strftime("%Y-%m-%d"),
"balance": round(current_balance, 2)
})
return virtual_balance
from bank_simulator import BankAccount
import tkinter as tk
from tkinter import ttk, messagebox
class BankApp:
def init(self, root):
self.root = root
self.root.title("银行模拟系统")
self.accounts = {}
self.current_account = None
self.setup_ui()
def setup_ui(self):
# 银行选择区域
bank_frame = ttk.LabelFrame(self.root, text="选择银行")
bank_frame.pack(padx=10, pady=5, fill="x")
self.bank_var = tk.StringVar()
banks = ["农业银行", "工商银行", "建设银行", "邮政储蓄", "中国银行"]
for bank in banks:
ttk.Radiobutton(bank_frame, text=bank, variable=self.bank_var, value=bank).pack(side="left", padx=5)
# 账户类型选择
type_frame = ttk.LabelFrame(self.root, text="账户类型")
type_frame.pack(padx=10, pady=5, fill="x")
self.type_var = tk.StringVar(value="储蓄卡")
ttk.Radiobutton(type_frame, text="储蓄卡", variable=self.type_var, value="储蓄卡").pack(side="left", padx=5)
ttk.Radiobutton(type_frame, text="信用卡", variable=self.type_var, value="信用卡").pack(side="left", padx=5)
# 账户操作按钮
btn_frame = ttk.Frame(self.root)
btn_frame.pack(padx=10, pady=5, fill="x")
ttk.Button(btn_frame, text="开户", command=self.open_account).pack(side="left", padx=5)
ttk.Button(btn_frame, text="存款", command=self.deposit).pack(side="left", padx=5)
ttk.Button(btn_frame, text="取款", command=self.withdraw).pack(side="left", padx=5)
ttk.Button(btn_frame, text="查询余额", command=self.check_balance).pack(side="left", padx=5)
ttk.Button(btn_frame, text="交易记录", command=self.show_transactions).pack(side="left", padx=5)
ttk.Button(btn_frame, text="虚拟余额", command=self.generate_virtual).pack(side="left", padx=5)
# 账户信息显示
self.info_text = tk.Text(self.root, height=10, state="disabled")
self.info_text.pack(padx=10, pady=5, fill="both", expand=True)
def open_account(self):
bank = self.bank_var.get()
if not bank:
messagebox.showerror("错误", "请选择银行")
return
account = BankAccount(bank, self.type_var.get())
self.accounts[account.account_number] = account
self.current_account = account
self.info_text.config(state="normal")
self.info_text.delete(1.0, tk.END)
self.info_text.insert(tk.END, f"开户成功!\n银行: {bank}\n")
self.info_text.insert(tk.END, f"账号: {account.account_number}\n")
self.info_text.insert(tk.END, f"类型: {self.type_var.get()}\n")
self.info_text.insert(tk.END, f"初始余额: 0.00 元\n")
if self.type_var.get() == "信用卡":
self.info_text.insert(tk.END, f"信用额度: {account.credit_limit} 元\n")
self.info_text.config(state="disabled")
def deposit(self):
if not self.current_account:
messagebox.showerror("错误", "请先开户")
return
amount = self.get_amount("存款金额")
if amount:
result = self.current_account.deposit(amount)
self.show_info(result)
def withdraw(self):
if not self.current_account:
messagebox.showerror("错误", "请先开户")
return
amount = self.get_amount("取款金额")
if amount:
result = self.current_account.withdraw(amount)
self.show_info(result)
def check_balance(self):
if not self.current_account:
messagebox.showerror("错误", "请先开户")
return
balance = self.current_account.get_balance()
credit = self.current_account.credit_limit if self.current_account.account_type == "信用卡" else 0
self.show_info(f"当前余额: {balance:.2f} 元\n可用额度: {credit + balance:.2f} 元")
def show_transactions(self):
if not self.current_account:
messagebox.showerror("错误", "请先开户")
return
transactions = self.current_account.get_transaction_history()
if not transactions:
self.show_info("暂无交易记录")
return
info = "交易记录:\n"
for trans in transactions:
info += f"{trans['time']} {trans['type']}: {trans['amount']:.2f} 余额: {trans['balance']:.2f}\n"
self.show_info(info)
def generate_virtual(self):
if not self.current_account:
messagebox.showerror("错误", "请先开户")
return
virtual = self.current_account.generate_virtual_balance()
info = "未来30天虚拟余额预测:\n"
for day in virtual:
info += f"{day['date']}: {day['balance']:.2f} 元\n"
self.show_info(info)
def get_amount(self, title):
amount = tk.simpledialog.askfloat(title, "请输入金额:")
if amount and amount > 0:
return amount
elif amount:
messagebox.showerror("错误", "金额必须大于0")
return None
def show_info(self, message):
self.info_text.config(state="normal")
self.info_text.delete(1.0, tk.END)
self.info_text.insert(tk.END, message)
self.info_text.config(state="disabled")
if name == "main":
root = tk.Tk()
app = BankApp(root)
root.mainloop()
from flask import Flask, jsonify, request
from bank_simulator import BankAccount
import json
app = Flask(name)
@app.route('/api/account/create', methods=['POST'])
def create_account():
data = request.json
bank = data.get('bank')
account_type = data.get('type', '储蓄卡')
if not bank or bank not in ["农业银行", "工商银行", "建设银行", "邮政储蓄", "中国银行"]:
return jsonify({"error": "无效银行"}), 400
account = BankAccount(bank, account_type)
return jsonify({
"bank": bank,
"account_number": account.account_number,
"type": account_type,
"balance": account.balance,
"credit_limit": account.credit_limit,
"creation_date": account.creation_date.strftime("%Y-%m-%d")
})
@app.route('/api/account//balance', methods=['GET'])
def get_balance(account_number):
account = BankAccount.get_account(account_number)
if not account:
return jsonify({"error": "账户不存在"}), 404
return jsonify({
"balance": account.balance,
"available": account.balance + account.credit_limit
})
@app.route('/api/account//virtual', methods=['GET'])
def generate_virtual(account_number):
account = BankAccount.get_account(account_number)
if not account:
return jsonify({"error": "账户不存在"}), 404
days = request.args.get('days', default=30, type=int)
virtual = account.generate_virtual_balance(days)
return jsonify(virtual)
@app.route('/api/account//transaction', methods=['POST'])
def make_transaction(account_number):
account = BankAccount.get_account(account_number)
if not account:
return jsonify({"error": "账户不存在"}), 404
data = request.json
trans_type = data.get('type')
amount = data.get('amount')
if not trans_type or not amount:
return jsonify({"error": "缺少参数"}), 400
if trans_type == 'deposit':
result = account.deposit(amount)
elif trans_type == 'withdraw':
result = account.withdraw(amount)
else:
return jsonify({"error": "无效交易类型"}), 400
return jsonify({
"message": result,
"new_balance": account.balance
})
if name == 'main':
app.run(debug=True)