1. 重构并统一票务、IC卡的事件日志格式化展示逻辑,替换原有零散的格式化函数,提升事件展示的一致性与可读性 2. 为AI助手面板新增折叠按钮与折叠逻辑,支持收起/展开面板,优化界面空间利用率 3. 移除多个页面的冗余介绍、提醒区块,精简页面结构 4. 修复IC卡购卡页面的充值选项按钮布局问题,将button元素改为div适配样式规范 5. 新增移动端卡片布局的横向滚动适配,优化小屏设备上的卡片展示与浏览体验 6. 更新后台管理页面的导航样式、文案与统计数据展示,新增车票、凭证的统计卡片 7. 统一全站品牌文案与页面格式,修复部分页面的DOCTYPE多余空格问题 8. 简化车票订单页面的地图加载逻辑,修复原有的冗余代码与加载异常问题
180 lines
8.9 KiB
HTML
180 lines
8.9 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>FSE 铁路票务系统 - 首页</title>
|
||
<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">
|
||
<link rel="stylesheet" href="/style.css?v=13">
|
||
</head>
|
||
<body class="public-search jr-public-page">
|
||
<div class="jr-public-shell">
|
||
<header class="jr-topbar">
|
||
<div class="jr-topbar-inner">
|
||
<a href="https://ticket.fse-media.group" class="jr-top-link" id="homeTopLink">
|
||
<i class="fas fa-train"></i>
|
||
<span>FSE铁路运输票务系统</span>
|
||
</a>
|
||
<div class="jr-top-status is-checking" data-server-status-root>
|
||
<span class="jr-top-status-label">服务器状态</span>
|
||
<span class="jr-top-status-dot"></span>
|
||
<span class="jr-top-status-value" data-server-status-value>检测中</span>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<div class="jr-brandbar">
|
||
<div class="jr-brandbar-inner">
|
||
<a href="https://ticket.fse-media.group" class="jr-brand" id="brandLink">
|
||
<img src="/FSE-ticket.png" alt="FSE Railway" class="jr-brand-logo" />
|
||
<div class="jr-brand-copy">
|
||
<strong>FarSight-T.N.E铁路运输</strong>
|
||
<span>票务服务</span>
|
||
</div>
|
||
</a>
|
||
<nav class="jr-nav" aria-label="站点导航">
|
||
<a href="https://ticket.fse-media.group/home.html" data-link="home" class="is-active">首页</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>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<main class="jr-public-main">
|
||
<section class="jr-home-service-grid">
|
||
<a href="https://ticket.fse-media.group/order" data-link="order" class="jr-home-service-card jr-home-service-primary">
|
||
<span class="jr-feature-icon"><i class="fas fa-ticket-alt"></i></span>
|
||
<span class="jr-feature-copy">
|
||
<strong>线上预定</strong>
|
||
<span>在线选择区间、车型与乘次,并生成兑票凭证。</span>
|
||
</span>
|
||
</a>
|
||
<a href="https://ticket.fse-media.group/search" data-link="search" class="jr-home-service-card">
|
||
<span class="jr-feature-icon"><i class="fas fa-search"></i></span>
|
||
<span class="jr-feature-copy">
|
||
<strong>车票查询</strong>
|
||
<span>输入票号、站点或日期,快速查看票据详情和流转记录。</span>
|
||
</span>
|
||
</a>
|
||
<a href="https://ticket.fse-media.group/search" data-link="search" class="jr-home-service-card">
|
||
<span class="jr-feature-icon"><i class="fas fa-receipt"></i></span>
|
||
<span class="jr-feature-copy">
|
||
<strong>凭证核验</strong>
|
||
<span>查询订单凭证状态,确认是否已被使用或仍可兑票。</span>
|
||
</span>
|
||
</a>
|
||
<a href="https://ticket.fse-media.group/ic-card/order" data-link="ic-card-order" class="jr-home-service-card">
|
||
<span class="jr-feature-icon"><i class="fas fa-credit-card"></i></span>
|
||
<span class="jr-feature-copy">
|
||
<strong>线上购卡</strong>
|
||
<span>在线填写购卡信息,生成IC卡订单号与领卡卡号。</span>
|
||
</span>
|
||
</a>
|
||
<a href="https://ticket.fse-media.group/ic-card/search" data-link="ic-card-search" class="jr-home-service-card">
|
||
<span class="jr-feature-icon"><i class="fas fa-wallet"></i></span>
|
||
<span class="jr-feature-copy">
|
||
<strong>IC 卡查询</strong>
|
||
<span>输入卡号或订单号,查看卡状态、余额与最近记录。</span>
|
||
</span>
|
||
</a>
|
||
</section>
|
||
|
||
<section class="jr-home-assets">
|
||
<article class="jr-panel-card">
|
||
<div class="jr-panel-headline">
|
||
<h3>票价图</h3>
|
||
<span class="jr-panel-note">Fare Map</span>
|
||
</div>
|
||
<div id="fareMapBox" class="jr-asset-frame">
|
||
<div class="text-muted">加载中...</div>
|
||
</div>
|
||
</article>
|
||
|
||
<article class="jr-panel-card">
|
||
<div class="jr-panel-headline">
|
||
<h3>线路图</h3>
|
||
<span class="jr-panel-note">Route Map</span>
|
||
</div>
|
||
<div id="routeMapBox" class="jr-asset-frame">
|
||
<div class="text-muted">加载中...</div>
|
||
</div>
|
||
</article>
|
||
</section>
|
||
|
||
<footer class="site-footer jr-footer-space">
|
||
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">粤ICP备2025450093号</a>
|
||
<span class="version">v1.0.12</span>
|
||
</footer>
|
||
</main>
|
||
</div>
|
||
<script src="/custom-dialog.js?v=12"></script>
|
||
<script src="/public-status.js?v=13"></script>
|
||
<script src="/ai-assistant.js?v=6"></script>
|
||
<script>
|
||
const loadPublicAssets = async () => {
|
||
const fareMapBox = document.getElementById('fareMapBox');
|
||
const routeMapBox = document.getElementById('routeMapBox');
|
||
|
||
try {
|
||
const v = String(Date.now());
|
||
|
||
try {
|
||
const r2 = await fetch(`/api/public/fares/map/light?t=${encodeURIComponent(v)}`, { cache: 'no-store' });
|
||
const svg = await r2.text();
|
||
fareMapBox.innerHTML = `<div class="jr-asset-frame">${svg}</div>`;
|
||
} catch (e) {
|
||
fareMapBox.innerHTML = '<div class="text-muted">票价图加载失败</div>';
|
||
}
|
||
|
||
const r = await fetch('/api/assets/manifest', { cache: 'no-store' });
|
||
const m = await r.json();
|
||
const mv = (m && m.updatedAt) ? String(m.updatedAt) : v;
|
||
|
||
if (m && m.routeMap) {
|
||
const img = document.createElement('img');
|
||
img.alt = '线路图';
|
||
img.src = `/assets/${encodeURIComponent(m.routeMap)}?v=${encodeURIComponent(mv)}`;
|
||
routeMapBox.innerHTML = '<div class="jr-asset-frame"></div>';
|
||
routeMapBox.firstElementChild.appendChild(img);
|
||
} else {
|
||
routeMapBox.innerHTML = '<div class="text-muted">暂无线路图</div>';
|
||
}
|
||
} catch (e) {
|
||
fareMapBox.innerHTML = '<div class="text-muted">票价图加载失败</div>';
|
||
routeMapBox.innerHTML = '<div class="text-muted">线路图加载失败</div>';
|
||
}
|
||
};
|
||
|
||
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'
|
||
};
|
||
|
||
const homeTopLink = document.getElementById('homeTopLink');
|
||
const brandLink = document.getElementById('brandLink');
|
||
if (homeTopLink) homeTopLink.href = links.home;
|
||
if (brandLink) brandLink.href = links.home;
|
||
|
||
document.querySelectorAll('[data-link]').forEach((el) => {
|
||
const key = el.getAttribute('data-link');
|
||
if (links[key]) el.href = links[key];
|
||
});
|
||
|
||
loadPublicAssets();
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|
||
|
||
|
||
|
||
|