酒库管理系统 — 项目 TODO

生成于 2026-06-14 · 真相源 todo/todo.json
47全部
1待开始
0开发中
32待验收
14已验收
重要度
状态
改动等级
平台 / 标签
📋 待开始 1 ▴ 收起
  • iOS 上线 TestFlight 正式分发
    待开始 重要 一级
    路线已定:CI 构建签名 IPA → 上传 TestFlight。前置(用户侧):Apple Developer Program($99/年)+App Store Connect 建 App(com.yanmei.jiu)+三件套凭证(.p12/.mobileprovision/.p8)+7个 Forgejo secrets+TestFlight 公开链接填 version.yaml。代码缺口(我方):compile-ios.sh 需在 flutter build ipa 前向 Release.xcconfig 注入 manual 签名(CODE_SIGN_STYLE/DEVELOPMENT_TEAM/PROVISIONING_PROFILE_SPECIFIER/CODE_SIGN_IDENTITY),否则 archive 阶段因 Automatic 无 team 必失败。详见计划 luminous-hugging-platypus.md。暂不调度。
🔨 开发中 0 ▴ 收起

    暂无条目

🔍 待验收 32 ▴ 收起
  • 入库单新建表单增加产地/保质期/储存方式,选填项默认折叠
    待验收 高优 · 紧急
    新建入库单的商品行增加产地、保质期、储存方式三个字典下拉选项(已有字典数据)。必填项(商品名、数量等)正常显示;选填项默认隐藏,点击展开按钮后在下一行展示。
  • 修复库存扣减 TOCTOU 竞态:SUM 预检纳入事务且在 FOR UPDATE 加锁后执行
    待验收 高优 · 紧急 二级
    stock.go ApproveStockOut 中库存总量 SUM 在 FOR UPDATE 加锁前执行,存在 check-then-act 窗口,高并发下可超扣。需将预检 SUM 也放入事务并在加锁后执行
  • 统一 handler Update 改用白名单字段更新,防止 GORM Save() 跨租户覆盖
    待验收 高优 · 紧急 二级
    partner.go/product_attr.go/warehouse.go 等多处用 db.Save(&object) 更新全字段,若中间件被绕过会造成 shop_id 被覆盖。改为 db.Model(&x).Where("id=? AND shop_id=?").Updates(fields) 白名单模式
  • 添加库存与财务流水定期对账检查,防止事务中断导致不平账
    待验收 高优 · 紧急 二级
    出库审批若 DB 断连,Rollback 后库存正确但财务记录可能未落地。需添加对账脚本:SUM(InventoryLog.quantity by direction) == SUM(Inventories.quantity),及告警机制
  • CheckInventoryAvailability Scan错误未检查导致所有商品误报库存不足
    待验收 高优 · 紧急 三级
    service/stock.go:312 DB查询失败时sums为空,所有商品have=0,合法出库审核被全部拒绝
  • 修复 act_runner→Forgejo 任务状态上报丢失导致构建成功却标失败
    待验收 高优 · 紧急 二级
    v1.0.27~v1.0.32 连续 6 个版本 CI 全部'失败',但日志显示所有 job 实际构建成功(🏁 Job succeeded),是 act_runner 最终状态上报丢失(Failed to write EOT),被 Forgejo 僵尸任务清理标为 failure。生产环境因此停留在 v1.0.26(6/8)。需排查 relay/GOAWAY race 或升级 act_runner/Forgejo。
  • 商品详情页重设计:展示所有字段,内容为公开页超集
    待验收 重要
    当前 product_detail_screen.dart 显示内容过于简单。需先做页面设计(UI 方案),内容要求是公开扫码页的超集:包含商品基本信息、参数(产地/保质期/储存方式)、价格、描述文档、图片、库存批次、入库记录等管理侧专属字段。另:商品公开链接展示为可点击超链接(点击可跳转公开扫码页)。
  • 桌面客户端单实例限制,禁止同时运行多个进程
    待验收 重要
    Windows 和 macOS 客户端启动时检测是否已有实例运行;若有,则激活已有窗口并退出新进程。Flutter desktop 可通过 window_single_instance 或 dart:io 锁文件实现。
  • 迁移 License 激活逻辑到 license_devices 表,废弃 licenses.device_id 字段
    待验收 重要 二级
    licenses.device_id 已标记 deprecated 但激活/解绑逻辑仍在使用它,license_devices 表未被完整采用。需将 Activate/Deactivate 逻辑迁移至 license_devices,并写数据迁移脚本
  • 将 checkInventory 业务逻辑从 StockOutHandler 移到 Service 层
    待验收 重要 二级
    checkInventory 实现在 handler/stock_out.go 中而非 service 层,导致单元测试困难、逻辑无法复用。应移至 StockService 或 InventoryService
  • 统一后端 API 错误响应格式为 {code, message},创建 util/response.go
    待验收 重要 二级
    各 handler 返回格式不一致:有的 {error: err.Error()},有的 {error: 硬编码字符串},有的直接 struct。前端解析困难。需定义 ErrorResponse struct 和 RespondError/RespondSuccess 辅助函数统一调用
  • 生产环境 CORS 强制校验:非 debug 模式禁止 Origin=*
    待验收 重要 三级
    config.go 默认 CORSOrigin="*",注释提示生产需改但无代码强制。应在 main.go 中添加:server.mode!=debug 且 CORSOrigin=="*" 时 log.Fatal 拒绝启动
  • License 私钥未配置时改为 Fatal 而非静默跳过
    待验收 重要 三级
    license.go 中私钥未配置只打 log 并跳过,导致授权功能失效但程序正常运行。应改为 log.Fatal,确保运维人员知晓配置缺失
  • 统一各 handler 的 pageSize 上限校验,创建 util.ValidatePageSize()
    待验收 重要 三级
    inventory.go 限制 pageSize 最大 500,其他 handler 无此限制,前端可传 pageSize=10000 打满 DB。创建 util.ValidatePageSize(n) 统一处理
  • finance ListRecords 和 inventory Logs handler 缺 pageSize 上限
    待验收 重要 三级
    finance.go:36 和 inventory.go:130 漏加 ValidatePageSize,#37 未覆盖这两个 handler,可被任意用户触发全表扫描
  • ReconcileInventory 两条 Scan 错误未检查导致对账误判
    待验收 重要 三级
    admin.go:122-123 invQuery/logQuery Scan错误被丢弃;invQuery失败→差异消失显示全部正常;logQuery失败→所有库存飘红为差异
  • license Info 端点 device_count 统计错误且 ListDevices 错误被吞
    待验收 重要 三级
    handler/license.go:67-70 两个bug:1.devs,_ 错误被_吞掉DB故障时deviceCount=0;2.ListDevices(shopID)包含该店所有license设备而非当前license
  • License model 的 license_key 索引超 InnoDB 3072 字节限制需改用前缀索引
    待验收 重要 三级
    license.go 的 LicenseKey 是 size:2048+uniqueIndex,utf8mb4 下 8192 字节超 MySQL InnoDB 索引上限,全新环境 AutoMigrate 必失败(线上已手动建 license_key(768) 前缀索引绕过)。需在 model 层固化:缩短列或 GORM 指定索引前缀长度,并同步 schema.sql。
  • 备案号为占位假值
    待验收 一般 / 优化
    现为沪ICP备2026000000号(全0),上线前必须替换真实备案号。
  • 授权信息功能方案设计
    待验收 一般 / 优化 8/8 子任务
    完整方案设计,涵盖:界面设计与交互、前端实现方案、后端接口与数据模型、安全策略(防盗用、防滥用、授权校验)等。需产出设计文档后再进入开发阶段。
    子任务 8 / 8 完成
    • 21A 后端:Ed25519 签发验签工具 + GenerateKey 修复
      二级待验收
    • 21B 数据库:license_devices 表 + licenses 表改造
      二级待验收依赖:21A
    • 21C 后端:注册自动签发 30 天 trial license
      二级待验收依赖:21A
    • 21D 后端:LicenseGuard 中间件 + JWT claim 扩展
      二级待验收依赖:21B21C
    • 21E 前端:license model/repository/device_id 采集
      二级待验收依赖:21A
    • 21F 前端:激活与设备管理 UI(授权 Tab 重构)
      二级待验收依赖:21D21E
    • 21G 前端:gating 横幅 + 到期弹窗(app_shell 注入)
      二级待验收依赖:21D21E
    • 21H 端到端验证:phase 切换 + 签名拒绝 + 多设备上限
      二级待验收依赖:21D21F21G
  • 关于我们页文档/更新日志链接更新,Web 新增版本历史页
    待验收 一般 / 优化
    1. 客户端「关于我们」页面的「打开文档」「更新日志」链接指向需更新为正确地址。2. Web 营销站新增版本更新页面(/changelog 或 /download/),从 CHANGELOG.md 自动渲染,展示所有历史版本更新记录。
  • 注册/联系入口「发邮件」升级为「加客服微信」并优化文案
    待验收 一般 / 优化
    当前注册成功页和网站联系支持入口引导用户「发邮件」,体验较弱。升级为扫码加客服微信,同时梳理相关文案措辞,使表达更专业、有亲和力。
  • 服务条款与隐私政策页面
    待验收 一般 / 优化
    在营销网站(jiu.51yanmei.com)补充服务条款(Terms of Service)和隐私政策(Privacy Policy)页面,注册页底部添加链接。最低优先级,待其他功能稳定后处理。
  • 移动端左侧抽屉菜单支持手势侧滑唤出
    待验收 一般 / 优化
    窄屏(手机)模式下,导航 Drawer 当前需点击汉堡按钮打开,需支持从屏幕左边缘向右滑动手势唤出菜单,符合移动端操作习惯。涉及 app_shell.dart 的 Drawer 配置。
  • 入库单详情商品明细改为卡片式竖排布局
    待验收 一般 / 优化
    当前入库单详情的商品明细以横向表格展示,字段多时在窄屏上挤压严重。改为每件商品独占一个卡片区块,字段竖向排列(商品名、规格、数量、单价、产地、保质期等各占一行),信息层次清晰,移动端阅读体验更好。宽屏可保持表格,窄屏自动切换为卡片流(复用 MobileListCard 模式)。
  • 将拼音回填从启动逻辑改为一次性迁移脚本
    待验收 一般 / 优化 三级
    main.go 每次启动执行 backfillPinyin 全表扫描,数据量大后拖慢启动。改为 go run ./cmd/migrate-pinyin 一次性迁移,后续新数据靠写入时自动生成
  • DB 连接池参数(MaxIdleConns/MaxOpenConns)改为可配置项
    待验收 一般 / 优化 三级
    main.go 中硬编码 MaxIdleConns=10, MaxOpenConns=100,无法运维调优。改为读取 config(viper),并在文档中说明推荐值
  • 明确 Inventories 反范式字段语义:是当前值还是入库快照
    待验收 一般 / 优化 二级
    inventories 表存了 product_name/warehouse_name/supplier_name 等,既可能是冗余(与 products JOIN 重复),也可能是历史快照(入库时锁定)。需明确语义并在 model 注释中说明;若是快照,应只在写入时固定,不随主表变化
  • license Activate 幂等路径 Update 错误未检查
    待验收 一般 / 优化 三级
    service/license.go:70 s.db.Model(&existing).Update()失败时仍返回nil error,设备名未更新但调用方不知道
  • license Verify 加载 license 缺 shop_id 过滤(防御纵深)
    待验收 一般 / 优化 三级
    service/license.go:102 WHERE id=? AND is_active=1 应加 AND shop_id=? 防御数据异常时跨租户泄露
  • util/response.go 的 RespondError 等辅助函数从未被调用(#34 实际未完成)
    待验收 一般 / 优化 二级
    #34 只创建了util/response.go,没有将任何handler迁移过去,实际错误格式仍不统一,需完成迁移
  • 清理 ErrDeviceMismatch 死代码(多设备迁移后残留)
    待验收 一般 / 优化 三级
    service/license.go:24 ErrDeviceMismatch定义后从未返回,多设备迁移(#32)后已无单设备约束
✅ 已验收 14 ▾ 展开