2026-06-28 10:53:45 +08:00
|
|
|
<!DOCTYPE html>
|
2026-06-21 10:00:13 +08:00
|
|
|
<html lang="zh-CN">
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8">
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
2026-06-28 10:53:45 +08:00
|
|
|
<title>FSE 铁路票务系统 - IC 卡管理</title>
|
2026-06-21 10:00:13 +08:00
|
|
|
<link rel="icon" type="image/png" href="/FSE-ticket.png">
|
|
|
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
2026-06-21 10:37:25 +08:00
|
|
|
<link rel="stylesheet" href="/style.css?v=13">
|
2026-06-21 10:00:13 +08:00
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body class="jr-admin-page jr-admin-ic-page jr-public-page">
|
|
|
|
|
<div class="jr-public-shell">
|
|
|
|
|
<header class="jr-topbar">
|
|
|
|
|
<div class="jr-topbar-inner">
|
|
|
|
|
<a href="/" class="jr-top-link" id="icTopLink">
|
|
|
|
|
<i class="fas fa-train"></i>
|
2026-06-28 10:53:45 +08:00
|
|
|
<span>FSE 铁路运输后台系统</span>
|
2026-06-21 10:00:13 +08:00
|
|
|
</a>
|
|
|
|
|
<div class="jr-top-status is-checking" data-server-status-root>
|
2026-06-28 10:53:45 +08:00
|
|
|
<span class="jr-top-status-label">服务器状态</span>
|
2026-06-21 10:00:13 +08:00
|
|
|
<span class="jr-top-status-dot"></span>
|
2026-06-28 10:53:45 +08:00
|
|
|
<span class="jr-top-status-value" data-server-status-value>检测中</span>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</header>
|
|
|
|
|
<div class="jr-brandbar">
|
|
|
|
|
<div class="jr-brandbar-inner">
|
|
|
|
|
<a href="/" class="jr-brand" id="icBrandLink">
|
|
|
|
|
<img src="/FSE-ticket.png" alt="FSE Railway" class="jr-brand-logo" />
|
|
|
|
|
<div class="jr-brand-copy">
|
2026-06-28 11:02:32 +08:00
|
|
|
<strong>FarSight-T.N.E铁路运输</strong>
|
2026-06-28 10:53:45 +08:00
|
|
|
<span>IC 卡管理后台</span>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</a>
|
2026-06-28 10:53:45 +08:00
|
|
|
<nav class="jr-nav" aria-label="站点导航">
|
|
|
|
|
<a href="https://ticket.fse-media.group/home.html" data-link="home">首页</a>
|
|
|
|
|
<a href="https://ticket.fse-media.group/order" data-link="order">线上预定</a>
|
|
|
|
|
<a href="https://ticket.fse-media.group/search" data-link="search">车票查询</a>
|
|
|
|
|
<a href="https://ticket.fse-media.group/ic-card/search" data-link="card-search">IC 卡查询</a>
|
|
|
|
|
<a href="https://ticket.fse-media.group/ic-card/order" data-link="card-order">线上购卡</a>
|
2026-06-21 10:00:13 +08:00
|
|
|
</nav>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<main class="jr-public-main jr-admin-main-shell">
|
|
|
|
|
<div id="app" class="jr-admin-app">
|
|
|
|
|
<div class="sidebar">
|
|
|
|
|
<div class="jr-admin-sidebar-head">
|
|
|
|
|
<span class="jr-kicker">IC CARD CONSOLE</span>
|
2026-06-28 10:53:45 +08:00
|
|
|
<div class="brand">FSE 铁路票务系统控制台</div>
|
|
|
|
|
<p class="jr-admin-sidebar-copy">统一管理 IC 卡发卡、充值、持卡人信息以及历史操作记录。</p>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
<div class="nav">
|
|
|
|
|
<a href="/" class="nav-item" style="text-decoration:none;">
|
2026-06-28 10:53:45 +08:00
|
|
|
<span class="nav-icon"><i class="fas fa-home"></i></span>
|
|
|
|
|
返回首页
|
2026-06-21 10:00:13 +08:00
|
|
|
</a>
|
|
|
|
|
<a href="/admin" class="nav-item" style="text-decoration:none;">
|
2026-06-28 10:53:45 +08:00
|
|
|
<span class="nav-icon"><i class="fas fa-chart-pie"></i></span>
|
|
|
|
|
主控制台
|
2026-06-21 10:00:13 +08:00
|
|
|
</a>
|
|
|
|
|
<a href="/admin/ic-card" class="nav-item active" style="text-decoration:none;">
|
2026-06-28 10:53:45 +08:00
|
|
|
<span class="nav-icon"><i class="fas fa-credit-card"></i></span>
|
|
|
|
|
IC 卡管理
|
|
|
|
|
</a>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
<div class="sidebar-footer jr-admin-sidebar-status">
|
|
|
|
|
<div>IC Card Console</div>
|
2026-06-28 10:53:45 +08:00
|
|
|
<div id="serverStatusText" style="margin-top:6px;">正在检测服务状态...</div>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="main">
|
|
|
|
|
<div class="header">
|
|
|
|
|
<div class="jr-admin-header-copy">
|
|
|
|
|
<div class="flex" style="gap: 12px;">
|
|
|
|
|
<div>
|
|
|
|
|
<span class="jr-kicker">JR STYLE ADMIN</span>
|
2026-06-28 10:53:45 +08:00
|
|
|
<h3 style="margin: 0;">IC 卡管理</h3>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="flex">
|
2026-06-28 10:53:45 +08:00
|
|
|
<button id="refreshBtn"><i class="fas fa-sync-alt"></i> 刷新</button>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="content">
|
|
|
|
|
<section class="jr-page-intro jr-admin-intro">
|
|
|
|
|
<span class="jr-kicker">IC MANAGEMENT</span>
|
2026-06-28 10:53:45 +08:00
|
|
|
<h1>IC 卡发行与状态管理</h1>
|
|
|
|
|
<p>延续公共页面的白底门户风格,让发卡、储值与事件记录在同一块工作区域中保持清晰易读。</p>
|
2026-06-21 10:00:13 +08:00
|
|
|
</section>
|
|
|
|
|
<section class="jr-home-alert jr-admin-alert">
|
|
|
|
|
<div class="jr-alert-title">
|
|
|
|
|
<i class="fas fa-circle-info"></i>
|
2026-06-28 10:53:45 +08:00
|
|
|
<span>业务范围</span>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
2026-06-28 10:53:45 +08:00
|
|
|
<p>当前页面用于处理 IC 卡创建、余额管理、持卡人资料和事件流查看,适合作为后台卡务管理的单独入口。</p>
|
2026-06-21 10:00:13 +08:00
|
|
|
</section>
|
|
|
|
|
<div class="grid">
|
|
|
|
|
<div class="card">
|
2026-06-28 10:53:45 +08:00
|
|
|
<div class="stat-label">IC 卡总数</div>
|
2026-06-21 10:00:13 +08:00
|
|
|
<div class="stat-value" id="statTotal">0</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="card">
|
2026-06-28 10:53:45 +08:00
|
|
|
<div class="stat-label">待领卡</div>
|
2026-06-21 10:00:13 +08:00
|
|
|
<div class="stat-value" id="statPending">0</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="card">
|
2026-06-28 10:53:45 +08:00
|
|
|
<div class="stat-label">正常启用</div>
|
2026-06-21 10:00:13 +08:00
|
|
|
<div class="stat-value" id="statActive">0</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="card">
|
2026-06-28 10:53:45 +08:00
|
|
|
<div class="stat-label">储值总额</div>
|
2026-06-21 10:00:13 +08:00
|
|
|
<div class="stat-value" id="statBalance">0</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="management-container ic-admin-layout">
|
|
|
|
|
<div class="management-sidebar">
|
|
|
|
|
<div class="card">
|
|
|
|
|
<div class="flex between mb-4">
|
2026-06-28 10:53:45 +08:00
|
|
|
<h4>快速建卡</h4>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
<div class="ic-form-grid">
|
2026-06-28 10:53:45 +08:00
|
|
|
<input id="createHolder" placeholder="持卡人姓名,仅支持英文与常用符号">
|
|
|
|
|
<input id="createBalance" type="number" min="0" step="1" value="50" placeholder="初始余额">
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
2026-06-28 10:53:45 +08:00
|
|
|
<div class="text-muted" style="margin-top:12px;">后台建卡统一创建为 IC 储值卡,持卡人姓名仅支持英文与常用符号。</div>
|
2026-06-21 10:00:13 +08:00
|
|
|
<div class="toolbar" style="margin-top: 14px;">
|
2026-06-28 10:53:45 +08:00
|
|
|
<button id="createBtn" class="btn primary"><i class="fas fa-plus"></i> 创建 IC 卡</button>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-06-28 10:53:45 +08:00
|
|
|
<div class="card" style="margin-bottom:0; display:flex; flex-direction:column; min-height: 520px;">
|
2026-06-21 10:00:13 +08:00
|
|
|
<div class="flex between mb-4">
|
2026-06-28 10:53:45 +08:00
|
|
|
<h4>卡片列表</h4>
|
2026-06-21 10:00:13 +08:00
|
|
|
<span class="badge" id="listCountBadge">0</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="flex mb-4" style="flex-wrap:wrap;">
|
2026-06-28 10:53:45 +08:00
|
|
|
<input id="searchInput" placeholder="搜索卡号 / 订单号 / 姓名" style="flex:1;">
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
<div id="cardList" class="list-lines" style="flex:1; overflow-y:auto;"></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="management-main">
|
|
|
|
|
<div class="card">
|
|
|
|
|
<div class="flex between mb-4">
|
2026-06-28 10:53:45 +08:00
|
|
|
<h4>卡片详情</h4>
|
2026-06-21 10:00:13 +08:00
|
|
|
<div class="flex" style="gap:8px;">
|
2026-06-28 10:53:45 +08:00
|
|
|
<button id="topupBtn" class="btn"><i class="fas fa-wallet"></i> 充值</button>
|
|
|
|
|
<button id="saveBtn" class="btn primary"><i class="fas fa-save"></i> 保存</button>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div id="detailPanel" class="empty-state">
|
|
|
|
|
<i class="fas fa-credit-card" style="font-size:48px; opacity:0.3;"></i>
|
2026-06-28 10:53:45 +08:00
|
|
|
<p>从左侧选择一张 IC 卡以查看详情。</p>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="card" style="margin-bottom:0;">
|
|
|
|
|
<div class="flex between mb-4">
|
2026-06-28 10:53:45 +08:00
|
|
|
<h4>操作记录</h4>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
<div id="eventList" class="timeline">
|
2026-06-28 10:53:45 +08:00
|
|
|
<div class="loading">选择卡片后显示事件流。</div>
|
2026-06-21 10:00:13 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<footer class="site-footer">
|
2026-06-28 10:53:45 +08:00
|
|
|
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">粤ICP备2025450093号</a>
|
2026-06-21 10:00:13 +08:00
|
|
|
<span class="version">v1.0.12</span>
|
|
|
|
|
</footer>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</main>
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-06-21 10:37:25 +08:00
|
|
|
<script src="/custom-dialog.js?v=12"></script>
|
2026-06-21 10:00:13 +08:00
|
|
|
<script src="/public-status.js?v=13"></script>
|
|
|
|
|
<script src="/ic-card-admin.js?v=2"></script>
|
|
|
|
|
<script>
|
|
|
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
|
|
|
const isDomain = location.hostname.includes('fse-media.group');
|
|
|
|
|
const links = {
|
|
|
|
|
home: isDomain ? 'https://ticket.fse-media.group' : '/home.html',
|
|
|
|
|
order: isDomain ? 'https://ticket.fse-media.group/order' : '/ticket-order.html',
|
|
|
|
|
search: isDomain ? 'https://ticket.fse-media.group/search' : '/ticket-search.html',
|
|
|
|
|
'card-search': isDomain ? 'https://ticket.fse-media.group/ic-card/search' : '/ic-card-search.html',
|
|
|
|
|
'card-order': isDomain ? 'https://ticket.fse-media.group/ic-card/order' : '/ic-card-order.html'
|
|
|
|
|
};
|
|
|
|
|
|
2026-06-28 10:53:45 +08:00
|
|
|
const topLink = document.getElementById('icTopLink');
|
|
|
|
|
const brandLink = document.getElementById('icBrandLink');
|
|
|
|
|
|
|
|
|
|
if (topLink) topLink.href = links.home;
|
|
|
|
|
if (brandLink) brandLink.href = links.home;
|
2026-06-21 10:00:13 +08:00
|
|
|
|
|
|
|
|
document.querySelectorAll('[data-link]').forEach((el) => {
|
|
|
|
|
const key = el.getAttribute('data-link');
|
|
|
|
|
if (links[key]) el.href = links[key];
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
</body>
|
|
|
|
|
|
|
|
|
|
</html>
|
2026-06-21 10:37:25 +08:00
|
|
|
|