Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
8.2 KiB
PROGRESS · 设置弹窗重排与账户与点数入弹窗(2026-09-06)
工作树:.worktrees/settings-dialog-and-billing-pane-20260906
分支:codex/settings-dialog-and-billing-pane-20260906
基线:任务书写 origin/staging @ 985c3258;开工时 origin/staging 已到 9ce7a374(含 composer 与会话列表),以当时远端为准。
page.tsx 开工 2035 行,收尾 1976 行(净减 59,上限 1995)。未改迁移、未 bump Skill、未改支付 API。
| 任务 | 状态 | BUG |
|---|---|---|
| 5.1 弹窗壳固定尺寸 + 四分区 | 完成 | BUG-554 |
5.2 个人资料搬出 page.tsx |
完成 | — |
5.4 账户与点数入弹窗,删除 /membership |
完成 | BUG-554 |
| 5.3 星盘资料列表→详情 | 完成 | BUG-554 |
| 5.5 BUG_HISTORY / CHANGELOG / DESIGN / VOICE | 完成 | — |
实现要点
.settings-modal:桌面width: min(100vw - 32px, 880px); height: min(84dvh, 640px);四分区共用;退出仍是 400pxlogout-modal。AccountDialog增加"billing"。导航顺序:个人资料 → 星盘资料 → 账户与点数 → 通用设置。profile-panel.tsx:48px 头像一行;删除「管理星盘资料」。chart-library-panel.tsx:内部视图list | self | other | add;列表条可点 + chevron;合盘操作只在其他人详情。billing-panel.tsx+use-billing-panel.ts:next/dynamic{ ssr: false }。页签含订单;兑换码行内表单。无 spinner / 「正在加载」。- 删除
frontend/src/app/membership/page.tsx与orders/page.tsx。next.config.ts临时重定向到/?settings=billing。 settings-url.ts在 hydrate / popstate 解析后history.replaceState抹掉参数;/不用useSearchParams。- 七处入口改为
openAccountDialog("billing", { source, plan, tab })。生时校正 402 不再window.location.assign。
既有断言改动
| 文件 | 原值 | 新值 | 原因 |
|---|---|---|---|
account-dialog-overlay |
openRedeem;profile-modal / chart-library-modal |
renderBilling;四导航;.settings-modal 同时有 width 与 height |
5.1 固定尺寸四分区 |
page.tsx renderProfile |
约 50 行 JSX + 「管理星盘资料」 | <ProfilePanel />,头像 48px |
5.2 净减行;去掉重复入口 |
chart-library-panel |
无条件 <form;setEditingSelfChart(true) |
列表默认;setView({ kind: "add" }) 后才出表单 |
决策 4 |
| 本人详情标题 | 编辑本人资料 | 编辑本人星盘 | 详情视图文案 |
| 合盘 pending 文案 | synastryPendingId === record.id |
selectedOther.id |
操作只在详情 |
membership-page 26 条支付/兑换/订单 |
读 app/membership/page.tsx |
读 billing-panel.tsx + use-billing-panel.ts |
页面删除 |
| 会员页存在 / Suspense / loading | 页面必须存在 | 页面不存在;无 spinner | 决策 6、8 |
| 兑换码 | redeemOpen 子弹窗 |
value="redeem" 页签 |
决策 5 |
goBack / history.back |
整页返回 | 无;stripSettingsQuery |
账单在首页 |
| 订单 | 独立页 + 「正在加载订单…」 | 页签 idle/ready/unavailable,无加载句 | AGENTS §6 |
| 页签「点数充值」 | 点数充值 | 点数包 | VOICE |
| 主标题「套餐与会员」 | <h1 className="membership-title"> |
弹窗标题「账户与点数」+ billing-summary |
不再是整页 |
.membership-page / .membership-shell / .membership-hero |
整页壳 CSS | 删除;卡片/页签 CSS 保留 | 只删整页 chrome |
membershipHref |
/membership?source= |
/?settings=billing&source= |
深链接 |
chat-navigation 4 条软跳 |
router.push(membershipHref(...)) |
openAccountDialog("billing", { source }) |
决策 7 |
| 校正 402 | window.location.assign(membershipHref("rectification")) |
onOpenBilling({ source: "rectification" }) |
硬跳转清单缩小 1 |
| 会员 401 | membership 页 3 次 + 订单页 1 次 | billing hook 4 次 assign("/login") |
认证仍硬跳 |
test_api_server_security app_routes |
含 membership、membership/orders |
去掉这两条 | BUG-143 路由集合 |
| 付费墙 | <Link href={membershipHref("onboarding-paywall")}> |
onOpenBilling 按钮 |
关掉墙后打开 billing |
beam-avatar |
头像编辑 JSX 在 page.tsx |
读 profile-panel.tsx;page.tsx 只挂 ProfilePanel |
5.2 搬出 |
knownUnstyled |
允许 membership-orders / membership-segment |
从白名单删除 | 整页删除后不再渲染 |
git grep -n "/membership" frontend/src 还会命中 @/lib/membership 模块 import,不是路由。路由字符串只出现在 next.config.ts 重定向。
测试
| 命令 | 结果 |
|---|---|
| 任务书收尾 tsx 合同(overlay / chart-library / membership / billing / settings-url / profile-panel / chat-navigation / epay / redeem-orders / starter / settings-mvp / consultation / rectification-surface) | 168 pass / 0 fail |
beam-avatar + class-name-definition-contract + profile-panel |
10 pass / 0 fail |
./node_modules/.bin/tsc --noEmit |
0 错 |
改动文件 eslint --quiet;npm run lint |
0 error(全仓 79 条既有 warning) |
page.tsx |
1976 行(开工 2035,净减 59) |
/opt/anaconda3/bin/python3.12 -m pytest tests/test_api_server_security.py -k capability_audit |
2 passed |
npm run build -- --webpack |
/ 为 ○ Static;产物无 /membership 页面;routes-manifest 有两条 307 重定向。首页 page-*.js gzip 181103 字节;账单文案在按需 chunk 773.*.js(gzip 4994),未打进首屏合同路径。 |
默认 npm run build(Turbopack) |
本工作树 frontend/node_modules 是指向主仓的 symlink,Turbopack 报 points out of the filesystem root。验收用 webpack 构建。 |
npm test 全量 |
产品合同已绿。其余失败均走 startPostgresFixture / docker compose up postgres,本机 compose 起不来,与本单无关。 |
Next.js 16 typed routes 不允许 route.ts 额外 export。dossierResponse 去掉 export(仍只给同文件 GET 用),否则 next build --webpack 的生成类型检查失败。不是产品改动。
分支相对当前 origin/staging 落后 2 个提交(BUG-555/556)。未在脏树上合并,避免和本单的 CHANGELOG / BUG_HISTORY 撞车。
浏览器走查见 docs/testing/settings-dialog-and-billing-pane-20260906.md。本机未起登录会话,真实四分区切换留给 staging 验收。
验收(Claude,2026-09-06,对照 TASK-settings-dialog-and-billing-pane-20260906.md)
共用门禁见 PROGRESS-session-list-title-and-order-20260906.md 验收段(e2f4b55c:tsc 0 错、lint 0 error、2770 项测试 29 条环境失败、next build / Static、首屏 gzip +0.61%)。
| 项 | 结论 | 依据 |
|---|---|---|
| 5.1 弹窗壳固定尺寸 + 四分区 | 通过 | .settings-modal { width: min(100vw − 32px, 880px); height: min(84dvh, 640px) };chart-library-modal / profile-modal 已无;导航 个人资料 → 星盘资料 → 账户与点数 → 通用设置 |
5.2 个人资料搬出 page.tsx,无「管理星盘资料」 |
通过 | profile-panel.tsx;page.tsx 2035 → 1976 行(净减 59 ≥ 40) |
| 5.3 星盘资料列表 → 详情 | 通过 | chart-library-panel.tsx 内部视图 list / self / other / add,默认列表,无无条件 <form |
5.4 「账户与点数」入弹窗;删 /membership 与 /membership/orders;307 重定向;七处入口改回调;/ 不用 useSearchParams 保持 Static |
通过 | src/app/membership 已删;next.config.ts 两条 redirects;git grep "/membership" frontend/src 只剩 next.config.ts;settings-url.ts 用 window.location 解析后 replaceState 抹参 |
5.4 测试迁移(26 条进 billing-panel.test.ts)、settings-url.test.ts、chat-navigation-a11y 三栏表、Python app_routes 去掉两条 |
通过 | 三栏表完整;tests/test_api_server_security.py 已去 membership / membership/orders |
| 5.5 BUG-554、CHANGELOG、DESIGN、VOICE | 通过 | — |
结论:通过。修复 SHA dc6598d7。四分区真实切换、移动端弹窗、/membership 深链回落留 docs/testing/settings-dialog-and-billing-pane-20260906.md 真人走查。