feat(web): 新增更新日志、服务条款、隐私政策页面;关于页更新日志链接修正

- web/dist/changelog/ 版本历史页,收录 v1.0.0–v1.0.29 全部发版记录
- web/dist/terms/ 服务条款页(付费/授权/数据/免责等)
- web/dist/privacy/ 隐私政策页(数据收集/使用/共享/用户权利等)
- 全站页脚补充 更新日志、服务条款、隐私政策三个链接
- about_screen 「更新日志」按钮链接由 /downloads/ 改为 /changelog/
- 新增 backend/cmd/issue 工具,用于签发指定门店的授权码 token

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-10 22:56:22 +08:00
parent bc85b2c8ad
commit 47b3c89460
16 changed files with 9434 additions and 142 deletions
+128 -128
View File
@@ -224,9 +224,9 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
<div class="header-meta">生成于 2026-06-10 · 真相源 todo/todo.json</div>
<div class="stats">
<div class="stat-pill"><strong>24</strong>全部</div>
<div class="stat-pill"><strong>4</strong>待开始</div>
<div class="stat-pill"><strong>1</strong>开发中</div>
<div class="stat-pill"><strong>5</strong>待验收</div>
<div class="stat-pill"><strong>2</strong>待开始</div>
<div class="stat-pill"><strong>2</strong>开发中</div>
<div class="stat-pill"><strong>6</strong>待验收</div>
<div class="stat-pill"><strong>14</strong>已验收</div>
</div>
</div>
@@ -269,7 +269,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
<div class="section-block" id="section-open">
<div class="section-title st-open" data-toggle="open">
📋 待开始 <span class="s-count">4</span>
📋 待开始 <span class="s-count">2</span>
<span class="s-arrow">▴ 收起</span>
</div>
<div class="section-list-wrap " id="list-wrap-open">
@@ -303,34 +303,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
</div>
</li>
<li class="todo-card s-open"
data-id="22"
data-level="low"
data-status="open"
data-tier=""
data-tags="前端,Web,文档">
<div class="card-header">
<span class="item-title">关于我们页文档/更新日志链接更新,Web 新增版本历史页</span>
<div class="card-badges">
<span class="tag status-badge s-open">待开始</span>
<span class="tag t-low">一般 / 优化</span>
</div>
</div>
<div class="item-desc">1. 客户端「关于我们」页面的「打开文档」「更新日志」链接指向需更新为正确地址。2. Web 营销站新增版本更新页面(/changelog 或 /download/),从 CHANGELOG.md 自动渲染,展示所有历史版本更新记录。</div>
<div class="card-footer">
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="Web">Web</span> <span class="tag t-tag" data-tag="文档">文档</span></div>
<div class="item-meta">
<span class="meta-date">🕐 2026-06-08</span>
</div>
</div>
</li>
<li class="todo-card s-open"
data-id="23"
data-level="low"
@@ -355,20 +327,58 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
<div class="item-meta">
<span class="meta-date">🕐 2026-06-08</span>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class="section-block" id="section-doing">
<div class="section-title st-doing" data-toggle="doing">
🔨 开发中 <span class="s-count">2</span>
<span class="s-arrow">▴ 收起</span>
</div>
<div class="section-list-wrap " id="list-wrap-doing">
<ul class="todo-list" id="list-doing">
<li class="todo-card s-doing"
data-id="22"
data-level="low"
data-status="doing"
data-tier=""
data-tags="前端,Web,文档">
<div class="card-header">
<span class="item-title">关于我们页文档/更新日志链接更新,Web 新增版本历史页</span>
<div class="card-badges">
<span class="tag status-badge s-doing">开发中</span>
<span class="tag t-low">一般 / 优化</span>
</div>
</div>
<div class="item-desc">1. 客户端「关于我们」页面的「打开文档」「更新日志」链接指向需更新为正确地址。2. Web 营销站新增版本更新页面(/changelog 或 /download/),从 CHANGELOG.md 自动渲染,展示所有历史版本更新记录。</div>
<div class="card-footer">
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="Web">Web</span> <span class="tag t-tag" data-tag="文档">文档</span></div>
<div class="item-meta">
<span class="meta-date">🕐 2026-06-08</span>
</div>
</div>
</li>
<li class="todo-card s-open"
<li class="todo-card s-doing"
data-id="24"
data-level="low"
data-status="open"
data-status="doing"
data-tier=""
data-tags="Web,文档">
<div class="card-header">
<span class="item-title">服务条款与隐私政策页面</span>
<div class="card-badges">
<span class="tag status-badge s-open">待开始</span>
<span class="tag status-badge s-doing">开发中</span>
<span class="tag t-low">一般 / 优化</span>
@@ -389,101 +399,9 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
</ul>
</div>
</div>
<div class="section-block" id="section-doing">
<div class="section-title st-doing" data-toggle="doing">
🔨 开发中 <span class="s-count">1</span>
<span class="s-arrow">▴ 收起</span>
</div>
<div class="section-list-wrap " id="list-wrap-doing">
<ul class="todo-list" id="list-doing">
<li class="todo-card s-doing"
data-id="21"
data-level="mid"
data-status="doing"
data-tier=""
data-tags="前端,后端,安全,文档">
<div class="card-header">
<span class="item-title">授权信息功能方案设计</span>
<div class="card-badges">
<span class="tag status-badge s-doing">开发中</span>
<span class="tag t-high">重要</span>
<span class="tag sub-progress-badge">0/8 子任务</span>
</div>
</div>
<div class="item-desc">完整方案设计,涵盖:界面设计与交互、前端实现方案、后端接口与数据模型、安全策略(防盗用、防滥用、授权校验)等。需产出设计文档后再进入开发阶段。</div>
<div class="subtask-block">
<div class="subtask-header">
<span class="subtask-label">子任务</span>
<span class="subtask-progress-text">0 / 8 完成</span>
<div class="subtask-progress-bar"><div class="subtask-progress-fill" style="width:0%"></div></div>
</div>
<ul class="subtask-list"><li class="subtask-item s-open" data-sid="21A">
<span class="sub-icon s-open"></span>
<span class="sub-sid">21A</span>
<span class="sub-title">后端:Ed25519 签发验签工具 + GenerateKey 修复</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span></div>
</li>
<li class="subtask-item s-open" data-sid="21B">
<span class="sub-icon s-open"></span>
<span class="sub-sid">21B</span>
<span class="sub-title">数据库:license_devices 表 + licenses 表改造</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="21A 未完成">21A</span></span></div>
</li>
<li class="subtask-item s-open" data-sid="21C">
<span class="sub-icon s-open"></span>
<span class="sub-sid">21C</span>
<span class="sub-title">后端:注册自动签发 30 天 trial license</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="21A 未完成">21A</span></span></div>
</li>
<li class="subtask-item s-open" data-sid="21D">
<span class="sub-icon s-open"></span>
<span class="sub-sid">21D</span>
<span class="sub-title">后端:LicenseGuard 中间件 + JWT claim 扩展</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="21B 未完成">21B</span><span class="dep-badge dep-pending" title="21C 未完成">21C</span></span></div>
</li>
<li class="subtask-item s-open" data-sid="21E">
<span class="sub-icon s-open"></span>
<span class="sub-sid">21E</span>
<span class="sub-title">前端:license model/repository/device_id 采集</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="21A 未完成">21A</span></span></div>
</li>
<li class="subtask-item s-open" data-sid="21F">
<span class="sub-icon s-open"></span>
<span class="sub-sid">21F</span>
<span class="sub-title">前端:激活与设备管理 UI(授权 Tab 重构)</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="21D 未完成">21D</span><span class="dep-badge dep-pending" title="21E 未完成">21E</span></span></div>
</li>
<li class="subtask-item s-open" data-sid="21G">
<span class="sub-icon s-open"></span>
<span class="sub-sid">21G</span>
<span class="sub-title">前端:gating 横幅 + 到期弹窗(app_shell 注入)</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="21D 未完成">21D</span><span class="dep-badge dep-pending" title="21E 未完成">21E</span></span></div>
</li>
<li class="subtask-item s-open" data-sid="21H">
<span class="sub-icon s-open"></span>
<span class="sub-sid">21H</span>
<span class="sub-title">端到端验证:phase 切换 + 签名拒绝 + 多设备上限</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="21D 未完成">21D</span><span class="dep-badge dep-pending" title="21F 未完成">21F</span><span class="dep-badge dep-pending" title="21G 未完成">21G</span></span></div>
</li></ul>
</div>
<div class="card-footer">
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="后端">后端</span> <span class="tag t-tag" data-tag="安全">安全</span> <span class="tag t-tag" data-tag="文档">文档</span></div>
<div class="item-meta">
<span class="meta-date">🕐 2026-06-08</span>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class="section-block" id="section-done">
<div class="section-title st-done" data-toggle="done">
🔍 待验收 <span class="s-count">5</span>
🔍 待验收 <span class="s-count">6</span>
<span class="s-arrow">▴ 收起</span>
</div>
<div class="section-list-wrap " id="list-wrap-done">
@@ -573,6 +491,88 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
</div>
</li>
<li class="todo-card s-done"
data-id="21"
data-level="low"
data-status="done"
data-tier=""
data-tags="前端,后端,安全,文档">
<div class="card-header">
<span class="item-title">授权信息功能方案设计</span>
<div class="card-badges">
<span class="tag status-badge s-done">待验收</span>
<span class="tag t-low">一般 / 优化</span>
<span class="tag sub-progress-badge">8/8 子任务</span>
<button class="reject-btn" data-id="21" data-title="授权信息功能方案设计">拒绝验收</button>
</div>
</div>
<div class="item-desc">完整方案设计,涵盖:界面设计与交互、前端实现方案、后端接口与数据模型、安全策略(防盗用、防滥用、授权校验)等。需产出设计文档后再进入开发阶段。</div>
<div class="subtask-block">
<div class="subtask-header">
<span class="subtask-label">子任务</span>
<span class="subtask-progress-text">8 / 8 完成</span>
<div class="subtask-progress-bar"><div class="subtask-progress-fill" style="width:100%"></div></div>
</div>
<ul class="subtask-list"><li class="subtask-item s-done" data-sid="21A">
<span class="sub-icon s-done"></span>
<span class="sub-sid">21A</span>
<span class="sub-title">后端:Ed25519 签发验签工具 + GenerateKey 修复</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span></div>
</li>
<li class="subtask-item s-done" data-sid="21B">
<span class="sub-icon s-done"></span>
<span class="sub-sid">21B</span>
<span class="sub-title">数据库:license_devices 表 + licenses 表改造</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-done" title="21A 已完成">21A</span></span></div>
</li>
<li class="subtask-item s-done" data-sid="21C">
<span class="sub-icon s-done"></span>
<span class="sub-sid">21C</span>
<span class="sub-title">后端:注册自动签发 30 天 trial license</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-done" title="21A 已完成">21A</span></span></div>
</li>
<li class="subtask-item s-done" data-sid="21D">
<span class="sub-icon s-done"></span>
<span class="sub-sid">21D</span>
<span class="sub-title">后端:LicenseGuard 中间件 + JWT claim 扩展</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-done" title="21B 已完成">21B</span><span class="dep-badge dep-done" title="21C 已完成">21C</span></span></div>
</li>
<li class="subtask-item s-done" data-sid="21E">
<span class="sub-icon s-done"></span>
<span class="sub-sid">21E</span>
<span class="sub-title">前端:license model/repository/device_id 采集</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-done" title="21A 已完成">21A</span></span></div>
</li>
<li class="subtask-item s-done" data-sid="21F">
<span class="sub-icon s-done"></span>
<span class="sub-sid">21F</span>
<span class="sub-title">前端:激活与设备管理 UI(授权 Tab 重构)</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-done" title="21D 已完成">21D</span><span class="dep-badge dep-done" title="21E 已完成">21E</span></span></div>
</li>
<li class="subtask-item s-done" data-sid="21G">
<span class="sub-icon s-done"></span>
<span class="sub-sid">21G</span>
<span class="sub-title">前端:gating 横幅 + 到期弹窗(app_shell 注入)</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-done" title="21D 已完成">21D</span><span class="dep-badge dep-done" title="21E 已完成">21E</span></span></div>
</li>
<li class="subtask-item s-done" data-sid="21H">
<span class="sub-icon s-done"></span>
<span class="sub-sid">21H</span>
<span class="sub-title">端到端验证:phase 切换 + 签名拒绝 + 多设备上限</span>
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-done" title="21D 已完成">21D</span><span class="dep-badge dep-done" title="21F 已完成">21F</span><span class="dep-badge dep-done" title="21G 已完成">21G</span></span></div>
</li></ul>
</div>
<div class="card-footer">
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="后端">后端</span> <span class="tag t-tag" data-tag="安全">安全</span> <span class="tag t-tag" data-tag="文档">文档</span></div>
<div class="item-meta">
<span class="meta-date">🕐 2026-06-08</span>
</div>
</div>
</li>
<li class="todo-card s-done"
data-id="25"
data-level="low"
+13 -13
View File
@@ -1,7 +1,7 @@
{
"meta": {
"title": "酒库管理系统 — 项目 TODO",
"updated_at": "2026-06-09T16:15:09.789Z"
"updated_at": "2026-06-10T14:49:02.179Z"
},
"seq": 28,
"items": [
@@ -277,7 +277,7 @@
"id": 21,
"title": "授权信息功能方案设计",
"desc": "完整方案设计,涵盖:界面设计与交互、前端实现方案、后端接口与数据模型、安全策略(防盗用、防滥用、授权校验)等。需产出设计文档后再进入开发阶段。",
"level": "mid",
"level": "low",
"tags": [
"前端",
"后端",
@@ -288,14 +288,14 @@
"done": false,
"completed_at": null,
"version": null,
"status": "doing",
"status": "done",
"subtasks": [
{
"sid": "21A",
"title": "后端:Ed25519 签发验签工具 + GenerateKey 修复",
"tier": 2,
"deps": [],
"status": "open",
"status": "done",
"created_at": "2026-06-09T16:14:58.628Z"
},
{
@@ -305,7 +305,7 @@
"deps": [
"21A"
],
"status": "open",
"status": "done",
"created_at": "2026-06-09T16:15:09.490Z"
},
{
@@ -315,7 +315,7 @@
"deps": [
"21A"
],
"status": "open",
"status": "done",
"created_at": "2026-06-09T16:15:09.541Z"
},
{
@@ -326,7 +326,7 @@
"21B",
"21C"
],
"status": "open",
"status": "done",
"created_at": "2026-06-09T16:15:09.590Z"
},
{
@@ -336,7 +336,7 @@
"deps": [
"21A"
],
"status": "open",
"status": "done",
"created_at": "2026-06-09T16:15:09.639Z"
},
{
@@ -347,7 +347,7 @@
"21D",
"21E"
],
"status": "open",
"status": "done",
"created_at": "2026-06-09T16:15:09.689Z"
},
{
@@ -358,7 +358,7 @@
"21D",
"21E"
],
"status": "open",
"status": "done",
"created_at": "2026-06-09T16:15:09.739Z"
},
{
@@ -370,7 +370,7 @@
"21F",
"21G"
],
"status": "open",
"status": "done",
"created_at": "2026-06-09T16:15:09.789Z"
}
]
@@ -389,7 +389,7 @@
"done": false,
"completed_at": null,
"version": null,
"status": "open"
"status": "doing"
},
{
"id": 23,
@@ -419,7 +419,7 @@
"done": false,
"completed_at": null,
"version": null,
"status": "open"
"status": "doing"
},
{
"id": 25,