feat(legal): terms and privacy pages, login consent recorded per version, re-consent gate (draft text, placeholders)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-09-30 09:42:11 +08:00
co-authored by Claude Opus 5.5
parent 788a84a4c0
commit 8f58eccecf
25 changed files with 876 additions and 6 deletions
@@ -0,0 +1,35 @@
# PROGRESS · 合规 A:用户协议 / 隐私政策 / 登录同意 · 2026-09-30
> 产品 2026-09-30「合规与法律的前四个你可以帮我做吗」;主体与联系方式先用占位(产品选定)。执行:Claude fork 子代理 A;分支 `codex/legal-consent-20260930`,基线 `codex/compliance-base-20260930`(= origin/staging `5208f19b` + `legal-entity.ts` 占位)。
## 交付
| 项 | 实现 |
|---|---|
| 协议 / 政策页 | `/terms`、`/privacy`(公开、静态),正文在 `lib/legal-documents.ts`,律师定稿只换这一个文件;草稿标识读 `legal-entity.ts` |
| 登录同意 | `components/legal/login-consent.tsx`(勾选框 + 页脚);`email-otp-login.tsx` 在发送验证码 / 密码登录前检查;所有成功路径收成 `enterApp()`,先 `POST /api/account/consent` 再进入 |
| 同意记录 | 表 `user_consents`(`20260930010000_user_consents.sql`,只加不改、用户只能查 / 插自己的行、随账号级联删除);IP 仅在配置 `CONSENT_IP_SALT` 时存加盐哈希 |
| 再次同意 | `components/legal/legal-consent-gate.tsx` 挂在 `(app)` 外壳;草稿阶段(`legalDocumentsDraft: true`)不启用 |
| 入口 | 登录页页脚、账户菜单底部;ICP 号配置后显示在登录页页脚 |
| 生产护栏 | `JYOTISHA_REQUIRE_LEGAL_ENTITY=1` 时测试要求无占位且非草稿(deploy/README.md 记录为发布前手动步骤;未改 workflow) |
## 待确认事实(交律师 / 产品)
见 `pendingLegalConfirmations()`:在线支付是否开放及方式、退款规则与时限、管辖法院、日志是否含 IP 及保存期限、正式站启用的模型服务商与所在地、地点服务商、VedAstro 是否启用、支付服务商名称、出境合规路径、订单流水保存年限、内容安全日志保存期限、服务器日志保存期限、备份与加密范围。
## 既有断言改动(原值 / 新值 / 原因)
| 文件 | 原值 | 新值 | 原因 |
|---|---|---|---|
| `tests/identity-login-provider.test.ts` | `window.location.assign(successPath)` 出现 5 次 | 出现 1 次(在 `enterApp` 内),`await/void enterApp()` 5 次 | 登录成功先记录同意再跳转,落点不变 |
## 验证
| 项 | 结果 |
|---|---|
| tsc | 0 错 |
| lint | 0 error / 126 warning(同基线) |
| npm test 全量(Node 22) | 4,429 / fail 24;失败名单与基线(origin/staging `5208f19b` 的全量结果)逐条相同,新增 11 条、消失 0 条 |
| next build | `/`、`/terms`、`/privacy` 均 `○ Static` |
| 首屏 gzip-9 | 646,480 B → 647,749 B(+0.20%;外壳多了再次同意组件) |
| 数据库 | 未跑 `test:db`(无 Docker),见 BLOCKED.md |
+11
View File
@@ -0,0 +1,11 @@
# 真机清单 · 用户协议 / 隐私政策 / 登录同意(2026-09-30)
| # | 操作 | 应该看到 | 结果 |
|---|---|---|---|
| 1 | 退出登录,打开登录页 | 表单下方有未勾选的「我已阅读并同意《用户协议》和《隐私政策》」;页面最下方有「用户协议 · 隐私政策」 | |
| 2 | 不勾选,输入邮箱点「发送验证码」 | 不发送,框下出现一行红字「请先阅读并勾选同意,再继续。」 | |
| 3 | 点《用户协议》 | 新标签打开协议页,顶部写「草稿 · 版本 2026-09-30-draft,待律师审定」,手机上能正常阅读 | |
| 4 | 勾选后正常登录 | 红字消失,能收到验证码并进入首页 | |
| 5 | 登录后打开账户菜单 | 最底下有「用户协议 · 隐私政策」两个小链接 | |
| 6 | 用管理后台地址登录 | 后台登录页没有勾选框 | |
| 7 | (运营)查数据库 `user_consents` | 第 4 步的账号有 terms、privacy 两行,版本 2026-09-30-draft | |