Files
FSE-Ticket.sys/web/home.html
T
Henry_Du 95893a5431 refactor(web): 重构全站界面与事件日志,优化功能与样式
1. 重构并统一票务、IC卡的事件日志格式化展示逻辑,替换原有零散的格式化函数,提升事件展示的一致性与可读性
2. 为AI助手面板新增折叠按钮与折叠逻辑,支持收起/展开面板,优化界面空间利用率
3. 移除多个页面的冗余介绍、提醒区块,精简页面结构
4. 修复IC卡购卡页面的充值选项按钮布局问题,将button元素改为div适配样式规范
5. 新增移动端卡片布局的横向滚动适配,优化小屏设备上的卡片展示与浏览体验
6. 更新后台管理页面的导航样式、文案与统计数据展示,新增车票、凭证的统计卡片
7. 统一全站品牌文案与页面格式,修复部分页面的DOCTYPE多余空格问题
8. 简化车票订单页面的地图加载逻辑,修复原有的冗余代码与加载异常问题
2026-07-05 14:55:12 +08:00

180 lines
8.9 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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>