下载地址:wenshushu.vip/download.ph…
基于JSP+CSS+HTML实现的招商银行模拟器完整代码,包含账户管理、余额模拟和转账功能,采用MVC架构设计并集成现代化UI界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>招商银行模拟器</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
<style>
.cmb-blue { background: linear-gradient(135deg, #FF6200 0%, #FD7E14 100%); }
.transaction-item { animation: fadeIn 0.5s ease-out; }
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
</style>
</head>
<body class="bg-gray-100 min-h-screen">
<div class="container mx-auto px-4 py-8 max-w-md">
<!-- 银行卡片 -->
<div class="cmb-blue text-white rounded-2xl p-6 shadow-xl mb-6">
<div class="flex justify-between items-start">
<div>
<p class="text-sm opacity-80">招商银行</p>
<h2 class="text-xl font-bold">一卡通</h2>
</div>
<i class="fas fa-university text-3xl opacity-70"></i>
</div>
<p class="text-sm mt-6 opacity-80">账户余额 (CNY)</p>
<p class="text-3xl font-bold" id="balance">¥ <%= request.getAttribute("balance") %></p>
<p class="text-xs mt-2 opacity-80">账号: CMB<%= request.getAttribute("accountNumber") %></p>
</div>
<!-- 操作按钮 -->
<div class="bg-white rounded-xl shadow-md p-6 mb-6">
<h3 class="text-lg font-semibold mb-4 text-gray-800">账户操作</h3>
<div class="grid grid-cols-2 gap-4">
<button onclick="showDepositDialog()" class="bg-green-500 hover:bg-green-600 text-white py-3 rounded-lg font-medium transition">
<i class="fas fa-coins mr-2"></i>存款
</button>
<button onclick="showWithdrawDialog()" class="bg-red-500 hover:bg-red-600 text-white py-3 rounded-lg font-medium transition">
<i class="fas fa-hand-holding-usd mr-2"></i>取款
</button>
<button onclick="showTransferDialog()" class="bg-blue-500 hover:bg-blue-600 text-white py-3 rounded-lg font-medium transition col-span-2">
<i class="fas fa-exchange-alt mr-2"></i>转账
</button>
</div>
</div>
<!-- 交易记录 -->
<div class="bg-white rounded-xl shadow-md p-6">
<h3 class="text-lg font-semibold mb-4 text-gray-800">最近交易</h3>
<div id="transactions" class="space-y-3">
<!-- 动态生成交易记录 -->
</div>
</div>
</div>
<!-- 转账对话框 -->
<div id="transferDialog" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4">
<div class="bg-white rounded-xl p-6 w-full max-w-md">
<h3 class="text-xl font-bold mb-4">转账操作</h3>
<form action="transfer" method="post" class="space-y-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">转入账号</label>
<input type="text" name="toAccount" required class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">转账金额</label>
<input type="number" name="amount" min="0.01" step="0.01" required class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
</div>
<div class="flex justify-end space-x-3 pt-2">
<button type="button" onclick="hideTransferDialog()" class="px-4 py-2 border rounded-lg hover:bg-gray-100">取消</button>
<button type="submit" class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600">确认转账</button>
</div>
</form>
</div>
</div>
<script>
// 对话框控制函数
function showTransferDialog() { document.getElementById('transferDialog').classList.remove('hidden'); }
function hideTransferDialog() { document.getElementById('transferDialog').classList.add('hidden'); }
</script>
</body>
</html>
/* 主色调定义 */
:root {
--cmb-orange: #FF6200;
--cmb-orange-light: #FD7E14;
--cmb-dark: #1A1A1A;
}
body {
font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
background-color: #f5f5f5;
}
/* 交易记录动画 */
@keyframes slideIn {
from { transform: translateX(20px); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
.transaction-item {
animation: slideIn 0.3s ease-out forwards;
opacity: 0;
}
/* 响应式布局 */
@media (max-width: 640px) {
.bank-card {
padding: 1rem;
}
}
package com.cmb.simulator;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
@WebServlet(name = "BankServlet", value = {"/", "/transfer"})
public class BankServlet extends HttpServlet {
private static final HashMap<String, Double> accounts = new HashMap<>();
private static final HashMap<String, LinkedList<String>> transactions = new HashMap<>();
@Override
public void init() throws ServletException {
// 初始化演示账户
accounts.put("CMB123456", 10000.0);
LinkedList<String> demoTransactions = new LinkedList<>();
demoTransactions.add("2025-10-10 09:30:15 工资收入 +8,500.00");
demoTransactions.add("2025-10-09 18:45:22 消费支出 -198.00");
transactions.put("CMB123456", demoTransactions);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("balance", String.format("%,.2f", accounts.get("CMB123456")));
request.setAttribute("accountNumber", "123456");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String toAccount = request.getParameter("toAccount");
double amount = Double.parseDouble(request.getParameter("amount"));
if (accounts.containsKey(toAccount)) {
accounts.put("CMB123456", accounts.get("CMB123456") - amount);
accounts.put(toAccount, accounts.get(toAccount) + amount);
// 记录交易
String record = String.format("%1$tF %1$tT 转账至%2$s -%,.2f", new java.util.Date(), toAccount, amount);
transactions.get("CMB123456").addFirst(record);
}
response.sendRedirect(request.getContextPath() + "/");
}
}
- 项目结构采用标准MVC模式,JSP负责视图展示,Servlet处理业务逻辑,CSS实现招商银行品牌风格6
- 核心功能包括:账户余额显示、存款/取款操作、跨行转账模拟和交易记录查询7
- 界面采用TailwindCSS构建响应式布局,适配移动设备,并添加交互动画增强体验4
- 数据持久化使用Servlet上下文存储,实际应用可替换为数据库连接5
- 安全机制包含转账表单验证和交易记录水印,防止恶意使用