CHG-006 抢单订单池:OPC 工作台加抢单池(REQ-128/129) CHG-004 政策落地:OPC 加算力券申领/核销+贷款+租金,运营商加政策跟踪(REQ-124/125/126) CHG-001 组队模块:新增 team.html 组队协同页(REQ-119/120/121) CHG-003 活动管理:运营工作台加活动创建/发布/报名管理(REQ-122/123) CHG-005 OPC 财务分析:OPC 工作台加财务看板(REQ-127) CHG-008 平台撮合归集:运营工作台加录入入口(REQ-130) CHG-002 入口跳转:确认已正确(OPC→opc.html) CHG-007 服务中心定位:明确为运营商服务资源管理 Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
64 lines
2.1 KiB
JavaScript
64 lines
2.1 KiB
JavaScript
/**
|
||
* Demo 数据层:统一加载 assets/mock.json
|
||
* 页面定义 window.renderPage(DB) 后由本文件回调渲染;
|
||
* 交互函数直接修改 DB 并调用对应 renderPage 重渲染。
|
||
* 交互产生的数据变更通过 localStorage 持久化,跨页面/刷新保留;
|
||
* mock.json 结构升级时提升 SCHEMA_VER 使旧存档失效。
|
||
*/
|
||
|
||
const SCHEMA_VER = 5;
|
||
const DB_KEY = 'opc_demo_db';
|
||
|
||
let DB = null;
|
||
|
||
/** 徽章 */
|
||
const B = (pair) => pair ? `<span class="badge ${pair[1]}">${pair[0]}</span>` : '—';
|
||
/** 进度条 */
|
||
const BAR = (w, cls = '') => `<div class="bar"><i class="${cls}" style="width:${w}%"></i></div>`;
|
||
/** 步骤条 */
|
||
const STEPS = (steps) => `<div class="steps">` + steps
|
||
.map((s, i) => `${i ? '<span class="arrow">→</span>' : ''}<span class="step ${s[1]}">${s[0]}</span>`)
|
||
.join('') + `</div>`;
|
||
/** 标签 */
|
||
const TAG = (t) => `<span class="tag">${t}</span>`;
|
||
/** 列表行(key-value) */
|
||
const LI = (l, r) => `<li><span>${l}</span><span>${r}</span></li>`;
|
||
|
||
/** 将当前 DB 持久化到 localStorage */
|
||
function saveDB() {
|
||
if (!DB) return;
|
||
try {
|
||
localStorage.setItem(DB_KEY, JSON.stringify({ v: SCHEMA_VER, data: DB }));
|
||
} catch (e) { /* 存储满或隐私模式下静默降级 */ }
|
||
}
|
||
|
||
/** 清除演示存档,恢复 mock.json 初始数据 */
|
||
function resetDemo() {
|
||
localStorage.removeItem(DB_KEY);
|
||
location.reload();
|
||
}
|
||
|
||
async function loadMock() {
|
||
let fresh = {};
|
||
try {
|
||
const res = await fetch('assets/mock.json');
|
||
fresh = await res.json();
|
||
} catch (e) {
|
||
console.error('mock.json 加载失败(请通过 http 服务访问,勿用 file:// 直开)', e);
|
||
}
|
||
let saved = null;
|
||
try {
|
||
const raw = localStorage.getItem(DB_KEY);
|
||
if (raw) {
|
||
const pack = JSON.parse(raw);
|
||
if (pack.v === SCHEMA_VER) saved = pack.data;
|
||
}
|
||
} catch (e) { /* 存档损坏时回退到初始数据 */ }
|
||
// 存档优先,但用 fresh 补齐新增加的业务域
|
||
DB = saved ? Object.assign({}, fresh, saved) : fresh;
|
||
window.addEventListener('beforeunload', saveDB);
|
||
if (typeof window.renderPage === 'function') window.renderPage(DB);
|
||
}
|
||
|
||
document.addEventListener('DOMContentLoaded', loadMock);
|