feat: OPC 社区运营公共服务平台 Demo v1.3

一人公司/超级个体产业社区公共服务基础设施 Demo,包含:
- 18 个角色页面(运营商/OPC/企业/个人/学员/培训机构/服务机构/政府/审计/金融)
- 暖橙活力主题 UI(渐变毛玻璃 + 暖色侧栏)
- 五步运营闭环(选方向→育人才→建平台→立SOP→聚产业)
- 华强北硬件供应链接入
- 蜂群式交付 + 产业集聚效应展示
- 需求文档(REQ-001~118 全覆盖)

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
2026-09-13 09:07:23 +08:00
co-authored by Devin
commit f307e877c9
30 changed files with 11397 additions and 0 deletions
+164
View File
@@ -0,0 +1,164 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>门户首页 · OPC 公共服务平台 Demo</title>
<link rel="stylesheet" href="assets/style.css">
</head>
<body data-page="index">
<header class="topnav" id="topnav"></header>
<div class="container">
<!-- REQ-001/002 统一门户与三类行动入口 -->
<div class="hero">
<h1>一人公司 · 超级个体产业社区</h1>
<p>以真实订单为牵引,连接政策服务、能力认证、企业需求、任务协同、质量交付、结算评价和绩效监管的产业公共服务基础设施。</p>
<div style="margin-top:18px" id="hero-login">
<a class="btn" href="login.html">登录 / 选择角色进入系统</a>
<a class="btn ghost" href="showcase.html" target="_blank">查看社区大屏</a>
<a class="btn ghost" href="req-doc.html" target="_blank">帮助 / 需求文档</a>
</div>
</div>
<div class="entry-cards">
<div class="entry-card">
<h3>我要接订单</h3>
<p>OPC 注册建档、能力认证、进入订单池承接任务</p>
<a class="btn" href="login.html">登录进入 OPC 工作台</a>
</div>
<div class="entry-card">
<h3>我要找服务</h3>
<p>企业/个人发布需求、浏览服务产品、咨询询价</p>
<a class="btn" href="login.html">登录发布需求</a>
</div>
<div class="entry-card">
<h3>我要看成效</h3>
<p>政府主管部门查看订单、就业、收入与资金绩效</p>
<a class="btn" href="login.html">登录进入政府驾驶舱</a>
</div>
</div>
<!-- REQ-009 服务目录(按服务结果组织) -->
<div class="section">
<h2>服务目录 <span class="req">REQ-009 · 按"服务结果"组织</span>
<span style="margin-left:auto"><a class="btn sm ghost" href="market.html">OPC橙果商城 →</a></span>
</h2>
<div class="grid grid-4" id="products"></div>
</div>
<!-- REQ-003/006 优秀案例与能力名片 -->
<div class="section">
<h2>优秀 OPC 与交付案例 <span class="req">REQ-003~007 · 经授权脱敏、运营商审核发布,AI 生成内容须标注</span></h2>
<div class="grid grid-3" id="cases"></div>
</div>
<!-- REQ-005 示范场景专区 -->
<div class="section">
<h2>示范场景专区 <span class="req">REQ-005</span></h2>
<div class="card"><table id="scenes"></table></div>
</div>
<!-- REQ-008/095 活动日历 + REQ-010 投诉建议 -->
<div class="section">
<div class="two-col">
<div class="card">
<h3>活动日历 <span class="req">REQ-008/095</span></h3>
<ul class="list" id="acts"></ul>
<p class="muted" style="margin-top:8px">每场活动关联后续线索与订单转化(REQ-096/097)。</p>
</div>
<div class="card">
<h3>帮助与投诉 <span class="req">REQ-010</span></h3>
<ul class="list">
<li><span>帮助中心 / 常见问题</span><a class="btn sm ghost" href="req-doc.html" target="_blank">查看</a></li>
<li><span>投诉建议通道(工单可追溯)</span><button class="btn sm" onclick="complaint()">提交</button></li>
<li><span>政策公告</span><a class="btn sm ghost" href="policy.html">查看</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="footer">OPC 公共服务平台 Demo · 静态原型 · 数据 assets/mock.json</div>
<script src="assets/app.js"></script>
<script src="assets/store.js"></script>
<script>
function renderPage(DB) {
const P = DB.portal;
// 已登录用户:hero 区登录按钮改为"进入工作台"
const role = currentRole();
if (role) {
document.getElementById('hero-login').innerHTML =
`<a class="btn" href="${ROLES[role].home}">进入 ${ROLES[role].name} 工作台</a>
<a class="btn ghost" href="showcase.html" target="_blank">查看社区大屏</a>
<a class="btn ghost" href="req-doc.html" target="_blank">帮助 / 需求文档</a>`;
}
document.getElementById('products').innerHTML = P.products.map(p => `
<div class="card"><h3>${p.name}</h3><div class="sub">${p.cat}</div><p class="muted">${p.brief}</p>
<button class="btn sm" onclick="productDetail('${p.name}')">查看详情</button>
<button class="btn sm ghost" onclick="toast('已提交咨询,运营商将在 4 小时内联系您')">咨询询价</button></div>
`).join('');
document.getElementById('cases').innerHTML = P.cases.map(c => `
<div class="card"><h3>${c.name} <span class="badge pri">${c.level}</span></h3>
<p class="muted">${c.tags}</p><p class="muted">${c.stats}</p>${B(c.status)}</div>
`).join('');
document.getElementById('scenes').innerHTML =
`<tr><th>示范场景</th><th>委托方</th><th>交付成果</th><th>验收结论</th><th>复制推广</th></tr>` +
P.demoScenes.map(s => `<tr><td>${s.scene}</td><td>${s.client}</td><td>${s.result}</td><td>${B(s.accept)}</td><td>${s.spread}</td></tr>`).join('');
document.getElementById('acts').innerHTML = P.activities.map(a => `<li><span>${a.name}</span><span>${
a.action === 'signup'
? `<button class="btn sm" onclick="signup(this,'${a.name}')">报名</button>`
: `<button class="btn sm ghost" onclick="toast('活动尚未开放报名,已为您设置提醒')">提醒</button>`
}</span></li>`).join('');
}
function productDetail(name) {
const p = DB.portal.products.find(x => x.name === name);
openModal({
title: name,
body: `<table>
<tr><th>产品编码</th><td>${p.code}</td></tr>
<tr><th>适用场景</th><td>${p.scene}</td></tr>
<tr><th>交付物</th><td>${p.items}</td></tr>
<tr><th>交付周期</th><td>${p.cycle}</td></tr>
<tr><th>价格区间</th><td>${p.price}</td></tr>
<tr><th>验收规则</th><td>${p.accept}</td></tr>
<tr><th>修改次数</th><td>${p.revise}</td></tr>
<tr><th>版权说明</th><td>交付即转移使用权,素材来源记录归档备查</td></tr>
</table>`,
actions: [
{ label: '关闭', cls: 'ghost' },
{ label: '发起采购', onClick: m => { m.remove(); toast('已转入采购流程:请登录企业工作台完善需求'); location.href = 'enterprise.html'; } },
],
});
}
function signup(btn, name) {
confirmDlg('活动报名', `确认报名「${name}」?报名成功后将短信通知签到码。`, '确认报名', () => {
btn.outerHTML = '<span class="badge ok">已报名</span>';
toast('报名成功,签到码已发送');
});
}
function complaint() {
openModal({
title: '投诉建议',
body: `
<div class="field"><label>类型</label><select id="cp-type"><option>服务质量投诉</option><option>交付争议</option><option>机构/课程投诉</option><option>功能建议</option></select></div>
<div class="field"><label>关联单号(选填)</label><input id="cp-order" placeholder="ORDER_/SVC_/CERT_ 编号"></div>
<div class="field"><label>问题描述</label><textarea id="cp-desc" placeholder="请描述问题经过与诉求"></textarea></div>`,
actions: [
{ label: '取消', cls: 'ghost' },
{ label: '提交工单', onClick: m => {
const d = document.getElementById('cp-desc').value.trim();
if (!d) { toast('请填写问题描述', 'warn'); return; }
m.remove();
toast('工单 CP_2026091201 已提交,处理进度可在工单中心跟踪');
} },
],
});
}
</script>
</body>
</html>