diff --git a/demo/web/static/index.html b/demo/web/static/index.html
index fad328c..ca6269c 100644
--- a/demo/web/static/index.html
+++ b/demo/web/static/index.html
@@ -299,19 +299,41 @@ const intentLabels = {high: '高意向', medium: '中意向', low: '低意向'};
const dealStatusLabels = {closed: '已成交', pending: '待确认', cancelled: '已取消'};
// --- 路由 ---
+const ROUTES = {
+ 'dashboard': () => loadDashboard(),
+ 'products': () => loadProducts(),
+ 'product-form': () => {},
+ 'salespersons': () => loadSalespersons(),
+ 'customers': () => loadCustomers(),
+ 'customer-detail': () => {},
+ 'deals': () => loadDeals(),
+ 'analysis': () => loadAnalysis(),
+ 'deal-form': () => loadDealForm(),
+};
+
+/** 导航到指定页面,更新 URL hash */
function showPanel(name) {
+ location.hash = name;
+}
+
+/** 根据 hash 路由渲染对应面板 */
+function handleRoute() {
+ const hash = location.hash.slice(1) || 'dashboard';
+ const parts = hash.split('/');
+ const name = parts[0];
document.querySelectorAll('.panel').forEach(p => p.classList.add('hidden'));
const panel = document.getElementById(name + '-panel');
if (panel) panel.classList.remove('hidden');
- if (name === 'dashboard') loadDashboard();
- if (name === 'products') loadProducts();
- if (name === 'salespersons') loadSalespersons();
- if (name === 'customers') loadCustomers();
- if (name === 'deals') loadDeals();
- if (name === 'analysis') loadAnalysis();
- if (name === 'deal-form') loadDealForm();
+ // 执行路由对应的加载函数
+ if (ROUTES[name]) ROUTES[name]();
+ // 客户详情带 ID:#customer-detail/15
+ if (name === 'customer-detail' && parts[1]) {
+ showCustomerDetail(parseInt(parts[1]));
+ }
}
+window.addEventListener('hashchange', handleRoute);
+
// --- API 封装 ---
async function api(path, options) {
const res = await fetch(API + path, options);
@@ -635,7 +657,12 @@ function toggleSummary() {
async function showCustomerDetail(id) {
currentCustomerId = id;
currentMsgPage = 1;
- showPanel('customer-detail');
+ // 如果 hash 已经是 customer-detail/id 则直接渲染,否则更新 hash 触发路由
+ const expectedHash = `customer-detail/${id}`;
+ if (location.hash.slice(1) !== expectedHash) {
+ location.hash = expectedHash;
+ return;
+ }
const customer = await api(`/customers/${id}`);
const info = document.getElementById('detail-info');
@@ -1068,7 +1095,7 @@ function escapeHtml(s) {
}
// --- 初始化 ---
-showPanel('dashboard');
+handleRoute();