feat: streamline portfolio UI and support atomic record edits

This commit is contained in:
陈煜 committed 2026-10-02 18:46:25 +08:00
1 parent 932a864ed6
commit 9adf7fdbc5
26 files changed
+988 -112

No files matched your search

+6
View File
@@ -56,3 +56,9 @@
## 2026-10-02 账户分组、计划与日历
本轮 28 项单元测试、类型检查和生产构建通过。浏览器模拟数据验证与实际数据库未验证部分详见 [本轮验收](update-2026-10-02.md)。首轮连接数据库发生 PROTOCOL_CONNECTION_LOST;2026-10-02 17:54 补充验收已完成迁移、31 个图库图标初始化及全部 9 项真实 MySQL 集成检查。前文并发余额不足的旧断言已随允许透支需求调整。
## 2026-10-02 页面精简、记录编辑与补充图库
类型检查、生产构建、28 项单元测试通过。新增真实数据库记录编辑专项涵盖双边余额、历史重放、计划支出更正、日历联动、精确金额、债务回滚及权限边界。13 个迁移已应用;9 张表与 88 个字段均有注释;内置图标扩充至 34 项。浏览器虚构数据检查与限制见 [更新说明](update-2026-10-02.md)。
最终完整真实数据库回归 10 项全部通过;连续测试触发限流后的重启复验与新增记录专项见更新说明。
+2
View File
@@ -41,3 +41,5 @@ Icon 存储 name、ownerId、shared、SHA-256、规范静态 PNG 的 MediumBlob
Transfer 归属于 User,关联转出/转入 Position(启用资产账户)及两条 Revision ID。金额、到账金额和额外手续费使用 Decimal(24,8),记录双方原币和业务分钟;账户关系用于配对展示,Transfer 本身不再次计入总额。服务端 Serializable 事务同时创建配对绝对余额及转账记录;请求 UUID 支持相同内容重试。历史修正限制防止改变已配对转账的基准余额。
User.hiddenMenus 保存受枚举校验的菜单键,settings 不可隐藏;User.showNotes 默认 true,仅控制客户端显示,财务备注和导出保持完整。ZIP v5 新增 transfers.json,追加恢复时映射账户及配对历史 ID,空空间恢复显示偏好,已有空间保留当前设置。
2026-10-02 记录编辑更新:允许更正转账之前的独立余额历史。`replay.ts` 重放涉及项目的历史,绝对余额保留为锚点,配对资金往来与定时支出按增量更新;整笔修改/删除与两侧余额在同一事务提交。单侧配对历史仍禁止直接更正/删除。日历读取保存后的账户历史重算。完整边界见 [更新说明](update-2026-10-02.md)。
+81 -2
View File
@@ -1,6 +1,6 @@
{
"tableCount": 8,
"columnCount": 73,
"tableCount": 9,
"columnCount": 88,
"tables": [
{
"TABLE_NAME": "exchangerate",
@@ -22,6 +22,10 @@
"TABLE_NAME": "revision",
"TABLE_COMMENT": "余额历史:金额为变更后的绝对余额"
},
{
"TABLE_NAME": "schedule",
"TABLE_COMMENT": "按需执行的定时支出或转账计划"
},
{
"TABLE_NAME": "session",
"TABLE_COMMENT": "登录会话与隐藏项目查看授权"
@@ -181,6 +185,11 @@
"COLUMN_NAME": "iconId",
"COLUMN_COMMENT": "关联账户图标标识"
},
{
"TABLE_NAME": "position",
"COLUMN_NAME": "groupName",
"COLUMN_COMMENT": "自定义账户分组"
},
{
"TABLE_NAME": "positionlink",
"COLUMN_NAME": "id",
@@ -241,6 +250,76 @@
"COLUMN_NAME": "sequence",
"COLUMN_COMMENT": "数据库自增唯一顺序,同业务时间按此排序"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "id",
"COLUMN_COMMENT": "唯一标识"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "userId",
"COLUMN_COMMENT": "所属用户标识,用于数据隔离"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "importedFromId",
"COLUMN_COMMENT": "备份来源计划标识,用于重复导入识别"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "name",
"COLUMN_COMMENT": "计划显示名称"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "operation",
"COLUMN_COMMENT": "操作类型:expense 支出或 transfer 转账"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "sourceId",
"COLUMN_COMMENT": "支出或转出资产账户标识"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "targetId",
"COLUMN_COMMENT": "转入账户标识;支出计划为空"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "amount",
"COLUMN_COMMENT": "原币支出或转出金额"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "received",
"COLUMN_COMMENT": "原币到账金额;支出计划为零"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "nextAt",
"COLUMN_COMMENT": "下次到期业务时间对应的 UTC"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "intervalDays",
"COLUMN_COMMENT": "重复间隔天数;零表示仅执行一次"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "enabled",
"COLUMN_COMMENT": "是否启用计划"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "completed",
"COLUMN_COMMENT": "一次性计划是否已执行完毕"
},
{
"TABLE_NAME": "schedule",
"COLUMN_NAME": "notes",
"COLUMN_COMMENT": "用户备注,原文保留"
},
{
"TABLE_NAME": "session",
"COLUMN_NAME": "id",
+22 -1
View File
@@ -51,7 +51,7 @@ pnpm test:integration
- 新增 `test/update-integration.test.ts`,覆盖真实 MySQL 中计划并发执行一次、透支、补记、分组恢复、隐藏账户与日历隔离,纳入 `pnpm test:integration`。
- 首轮连接数据库发生 `PROTOCOL_CONNECTION_LOST` 时,数据库验收暂未执行;该阻塞已在下面的补充验收中解决。
## 数据库恢复后的补充验收(2026-10-02 17:54,香港时间)
## 数据库恢复后的补充验收(2026-10-02 17:54)
- 已确认 MySQL 连接恢复并通过 SELECT 1;增量应用 `20261002000400_groups_schedules` 成功,`pnpm db:status` 确认全部 12 个迁移完成,schema 最新。
- 已生成 Prisma 客户端并编译后端,运行图库初始化;数据库检查确认 31 个固定内置图标 ID 均有图片数据且为共享图标。
@@ -60,3 +60,24 @@ pnpm test:integration
- 修复债务集成测试中仍断言 manifest v6 的旧预期,当前应为 v7。连续重跑触发临时服务的正常登录限流后,重启本次临时测试服务再执行,未修改限流规则。
- 本轮 `pnpm test` 28 项通过,`pnpm typecheck` 通过;后端编译通过,前端生产构建在此前实现验收已通过,本轮未修改前端代码。
- 上一轮遗留的数据库迁移、图标初始化及真实 MySQL 集成验收现已完成。浏览器布局验收仍沿用此前模拟数据结果,没有新增真实浏览器端到端验收。
## 页面精简、记录编辑与补充图库(2026-10-02 18:43)
- 定时计划移到独立菜单页面,支持添加、暂停、删除及执行到期计划。账户页继续按需执行到期计划,计划页面仅点击执行才运行。设置支持隐藏日历与定时计划入口。
- 页面展示文字不可选,输入框与备注保留选字及编辑能力。账户选择弹窗只显示一个切换按钮,文字表示下一种视图。账户/资产/债务卡片缩小间距与图标,总览突出净资产,筛选移入趋势区域,最近记录展示六条,变化归因默认折叠。
- 余额历史可更正和删除;资金往来可修改金额、到账金额、手续费、日期和备注,或整笔删除。账户与操作类型保持原绑定,若需更换请删除后重建。转账及借贷配对记录禁止单侧更正或删除,历史入口可跳转资金往来;删除前有确认。
- `replay.ts` 在 Serializable 事务中按固定顺序锁定相关项目并重放历史。手动余额/估值保留为绝对金额锚点;资金往来按本金与手续费更新双方,定时支出保留原增量。更正定时支出记录时,填写的新金额转为绝对余额锚点。后续真实余额快照不会随更早的转账修改被平移。
- 债务为负、金额溢出或首笔资金操作失去前置余额锚点时,整个修改回滚。隐藏项目须解锁,归档项目须恢复;跨用户操作返回不存在。日历、历史与总览读取保存后的统一记录,成功操作刷新当前页面,进入日历重新查询。
- 日历沿用账户余额差额估算口径,内部转账和借贷本金不作为收支;删除或更正余额历史会改变对应日期估算值。删除定时计划已生成的记录不会回退计划进度或再次执行。
- 新增 ZA BANK 众安银行、大象银行 EleBank、微众银行 WeBank,共 34 个内置图标。ZA 使用官网公开品牌资源,微众从官网页眉资源获取真实 logo,大象使用官方 App Store 当前应用图标。PNG 与来源清单随代码保存,固定 ID 初始化不覆盖上传图标。
- 注释迁移 `20261002000500_schedule_comments` 已应用,补齐 Schedule 表及字段注释,13 个迁移状态最新。新增 `node scripts/check-comments.cjs`(在 apps/api 执行)核验 9 张业务表、88 个字段均有注释,并更新 `docs/database-comments.json`。
### 验证与边界
类型检查、生产构建及 28 项单元测试通过。新增 `test/record-edit.test.ts` 真实数据库专项,覆盖双边余额编辑/删除、早期余额更正、定时支出增量与更正、日期调整、绝对余额锚点、八位小数与负手续费、债务原子回滚、跨用户/隐藏账户隔离、日历联动及起始锚点保护。
浏览器使用本轮专用虚构账号检查卡片、总览层级/对比度、全部/分组的单按钮切换、定时计划独立页面。虚构账号已精确清理;未验证真实手机硬件、外网隧道或正式部署。
沙箱内 Node 系统用户查询返回 ENOMEM;测试、迁移及临时服务在获准的宿主环境运行成功。连续完整验收触发临时服务内存登录限流(429),重启该临时服务后再次执行,不修改限流规则。用户原有 Vite 配置保留,本轮提交不包含该文件;按 update.md 仅做本地提交,不 push。
最终完整数据库回归:2026-10-02 18:44,10 项全部通过。临时服务与预览资源已清理;仅保留本轮新增代码、文档和图库。