wangjia
|
2ed0010c67
|
fix(backend): 补全多处 Scan/Count 错误未检查,私钥缺失改为 Fatal
- stock.go: ApproveStockIn 入库前库存 Scan 加错误检查
- license.go: Activate 阶段 Count 设备数加错误检查;createTrialLicense
私钥未配置由静默跳过改为 log.Fatalf,防止生产环境新注册门店无 license
- inventory.go: List 接口两处 Raw Scan 加错误检查并返回 500
- finance.go: ArBalance 汇总 Raw Scan 加错误检查并返回 500
|
2026-06-14 08:12:57 +08:00 |
|
wangjia
|
f251953dbc
|
chore: release v1.0.36
|
2026-06-13 22:33:30 +08:00 |
|
wangjia
|
2a75b3a8b6
|
ci: 新增仅构建 Windows 的 workflow (build-windows.yml)
Build Windows Only / build-windows (push) Successful in 1m53s
手动 workflow_dispatch 或推 winbuild* tag 触发,复用 provision/compile-windows.sh,
产物经 upload-artifact 传到 Forgejo,不触发完整 deploy。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
winbuild1
|
2026-06-13 20:46:55 +08:00 |
|
wangjia
|
0714fb8a1b
|
feat(client): 标签 TSPL 裸发支持 Windows(winspool WritePrinter)
- 抽出 _findThermalPrinter(macOS: lpstat -e;Windows: Printing.listPrinters)
与 _sendRaw(macOS/Linux: lp -o raw;Windows: winspool WritePrinter RAW)
- 新增 _winRawPrint:OpenPrinter/StartDocPrinter(RAW)/WritePrinter 直送裸字节
- 位图渲染与 TSPL 生成跨平台复用;macOS 行为不变
- 依赖新增 win32/ffi(仅 Windows 运行时调用,已 Platform.isWindows 守卫)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-13 20:42:49 +08:00 |
|
wangjia
|
d966951b6b
|
feat(client): 标签打印改为热敏机 TSPL 裸发 + 自适应扁平版式
- 桌面端(macOS)检测到得力 DL-888B 等热敏机时,用 dart:ui 直接把标签绘制成
单色位图,经 TSPL BITMAP 命令 lp -o raw 裸发;系统打印走 CUPS 通用驱动会
多走纸/空白,故对热敏机绕过系统打印
- 新版式(无字段名标签):酒行名 / 商品名 / 度数(系列)+规格同行 / 生产日期,
右侧二维码 + 下方居中"扫码溯源";左侧各行按高度等比铺满、字号自适应
- 二维码用后端 PNG 解码后绘制(避免 PDF 光栅丢图);生产日期仅在有值时显示
(商品库无该字段,入库/库存才有)
- 修复 macOS printing 包 layoutPdf 主线程死锁(dynamicLayout: false)
- macOS 关闭 app-sandbox 以允许调用 lp 裸发
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-13 20:26:30 +08:00 |
|
wangjia
|
c5a72ecbdf
|
merge: maestro/tsk_Qmk4wT_dkqRR [License license_key 前缀索引修复]
|
2026-06-13 14:38:03 +08:00 |
|
wangjia
|
c553237f15
|
fix(db): 缩短 license_key 列至 VARCHAR(768) 避免 InnoDB 索引超限 [tsk_Qmk4wT_dkqRR]
原 size:2048 在 utf8mb4 下产生 8192 字节索引,超过 InnoDB 3072 字节上限,
全新环境 AutoMigrate 必失败。改为 VARCHAR(768)(768×4=3072 字节,恰好
在上限内),schema.sql 同步更新列类型并将 uk_license_key 改为全列索引(无
需前缀)。新增测试 TestLicenseTokenFitsColumnLimit 验证最坏情况 token 长度
确实在 768 字符以内。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-13 12:01:30 +08:00 |
|
wangjia
|
02082df525
|
chore: release v1.0.35
Deploy / build-linux-web (push) Successful in 52s
Deploy / build-windows (push) Successful in 1m48s
Deploy / build-macos (push) Successful in 1m26s
Deploy / build-android (push) Successful in 1m32s
Deploy / build-ios (push) Successful in 7s
Deploy / release-deploy (push) Successful in 1m51s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v1.0.35
|
2026-06-12 23:51:22 +08:00 |
|
wangjia
|
4c75f328c7
|
chore: release v1.0.34
Deploy / build-linux-web (push) Successful in 46s
Deploy / build-windows (push) Successful in 1m47s
Deploy / build-macos (push) Successful in 1m22s
Deploy / build-android (push) Successful in 59s
Deploy / build-ios (push) Successful in 6s
Deploy / release-deploy (push) Successful in 1m47s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v1.0.34
|
2026-06-12 01:28:01 +08:00 |
|
wangjia
|
8628df5848
|
chore: release v1.0.33
Deploy / build-linux-web (push) Successful in 49s
Deploy / build-windows (push) Successful in 1m48s
Deploy / build-macos (push) Successful in 1m28s
Deploy / build-android (push) Successful in 1m9s
Deploy / build-ios (push) Successful in 6s
Deploy / release-deploy (push) Successful in 1m50s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v1.0.33
|
2026-06-12 00:10:58 +08:00 |
|
wangjia
|
85cd262525
|
chore: release v1.0.32
Deploy / build-linux-web (push) Successful in 51s
Deploy / build-windows (push) Successful in 1m51s
Deploy / build-macos (push) Successful in 1m24s
Deploy / build-android (push) Successful in 1m28s
Deploy / build-ios (push) Successful in 6s
Deploy / release-deploy (push) Failing after 2m58s
v1.0.32
|
2026-06-11 18:09:49 +08:00 |
|
wangjia
|
e0bee00ff4
|
fix: 批量改进 (#2/#23/#38/#39/#40/#47)
- Web: 隐藏 ICP 备案号(条件渲染),联系入口改为微信咨询(条件渲染,配置 wechat 字段后生效)
- backend: 拼音回填抽取为独立 cmd/backfill-pinyin 工具,不再在启动时运行
- backend: DB 连接池参数(max_idle_conns/max_open_conns)改为配置可控,默认 10/100
- backend: Inventory 反范式字段添加注释说明快照语义
- backend: 全量 handler 采用 util.RespondSuccess/RespondCreated 统一响应格式(51 处)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-11 09:33:43 +08:00 |
|
wangjia
|
d28aba863e
|
fix(backend): license service 小修 (#45-46-48)
- #45 Activate 幂等路径 Update 加错误检查,失败时返回 error 而非静默成功
- #46 Verify 加载 license 加 shop_id 过滤(防御纵深)
- #48 删除 ErrDeviceMismatch 死代码(多设备迁移后已无单设备约束)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-11 09:06:15 +08:00 |
|
wangjia
|
f928d5c6a3
|
fix(backend): 架构质量改进批次三 (#41-44)
- #41 CheckInventoryAvailability Scan 加错误检查,DB 故障不再误报库存不足
- #42 finance ListRecords 和 inventory Logs 补加 pageSize 上限(500)
- #43 ReconcileInventory 两条 Scan 加错误检查,DB 故障返回 500 而非误导性空结果
- #44 license Info 改用 CountDevices(licenseID) 统计当前 license 绑定数,修复跨 license 计数偏差
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-11 08:21:42 +08:00 |
|
wangjia
|
3ab78dbf7a
|
fix(backend): 架构质量改进批次二 (#32-37)
- #32 License 激活迁移到 license_devices 表:Activate/Verify/Deactivate 全部改用
license_devices,新增 max_devices 校验和 GET /license/devices 端点;
Activate 现在校验 shop_id 防跨租户激活
- #33 checkInventory 从 StockOutHandler 移到 StockService.CheckInventoryAvailability
- #34 新增 util/response.go 统一错误响应工具(RespondError/RespondSuccess/RespondCreated)
- #35 生产模式 CORS Origin='*' 启动时 Fatal
- #36 生产模式 License 私钥未配置启动时 Fatal
- #37 新增 util/page.go ValidatePageSize,应用到 partner/product/stock_in/stock_out handler
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-11 00:38:49 +08:00 |
|
wangjia
|
51cfe5fc6d
|
fix(backend): 修复库存 TOCTOU 竞态 + handler 白名单更新 + 对账接口
#29 ApproveStockOut:FOR UPDATE 锁定批次后再内存汇总总量,
消除预检 SUM 与加锁之间的竞态窗口,减少一次 DB 往返
#30 partner/warehouse/user/product_attr/product_option Update 方法:
- 绑定到独立 req struct,防止请求体覆盖记录 ID
- 改用 db.Model.Where("shop_id=?").Updates(map) 白名单更新,
数据库层强制 shop_id 隔离约束
#31 新增 GET /api/v1/admin/reconcile:对比 inventories 当前库存
与 inventory_logs 流水净量,返回差异行,用于发现不平账异常
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-11 00:21:48 +08:00 |
|
wangjia
|
666bf56933
|
chore: release v1.0.31
Deploy / build-linux-web (push) Successful in 51s
Deploy / build-macos (push) Successful in 1m25s
Deploy / build-android (push) Failing after 4m56s
Deploy / build-windows (push) Failing after 9m7s
Deploy / build-ios (push) Has been skipped
Deploy / release-deploy (push) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.31
|
2026-06-10 23:53:32 +08:00 |
|
wangjia
|
1a0a7bd5ef
|
fix(client): 将 _buildLicenseBanner/_showLicenseExpiryDialog 移回 _AppShellState
两个方法误放入 _StatusItem 类,导致 Windows CI 编译报错:
- _buildLicenseBanner/showLicenseExpiryDialog 对 _AppShellState 未定义
- _StatusItem 内 context.go() 调用找不到 context getter
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-10 23:50:55 +08:00 |
|
wangjia
|
8a62b5e174
|
chore: release v1.0.30
Deploy / build-windows (push) Failing after 48s
Deploy / build-macos (push) Has been cancelled
Deploy / build-android (push) Has been cancelled
Deploy / build-ios (push) Has been cancelled
Deploy / release-deploy (push) Has been cancelled
Deploy / build-linux-web (push) Has been cancelled
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.30
|
2026-06-10 23:06:32 +08:00 |
|
wangjia
|
47b3c89460
|
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>
|
2026-06-10 22:56:22 +08:00 |
|
wangjia
|
bc85b2c8ad
|
fix(backend): license/info 返回 phase 字段,前端横幅/弹窗依赖此字段
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-10 09:30:25 +08:00 |
|
wangjia
|
13fc9b7aaf
|
test(backend): 授权系统端到端验证测试 (21H)
util/license_key_test.go:
- TestLicenseKeyRoundTrip: 签发→验签完整流程
- TestVerifyLicenseToken_TamperedPayload: 签名被篡改后被拒绝
- TestVerifyLicenseToken_WrongKey: 用错误公钥验签失败
- TestVerifyLicenseToken_InvalidFormat: 格式非法被拒绝
middleware/license_guard_test.go:
- TestCalcLicensePhase: 覆盖全部 phase 边界
(perpetual→normal / future→normal / <7d→grace /
7-15d→readonly / >15d→locked)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-10 07:10:15 +08:00 |
|
wangjia
|
97ebb18fd7
|
feat(client): 授权 Tab 激活 UI + 到期横幅/弹窗 (21F+21G)
21F — 激活与设备管理 UI:
- settings_screen: 重构授权 Tab,按 phase 展示色阶状态
(normal=绿/grace=橙/readonly|locked=红)
- 新增「激活授权码」卡片:文本框 + 激活按钮,调用 LicenseRepository.activate
- 显示设备上限字段 (maxDevices)
21G — gating 横幅 + 到期弹窗:
- app_shell: 引入 licenseProvider,needsAttention 时展示顶部横幅
(grace=深橙/readonly=深红/locked=红),横幅含「去激活」快捷入口
- 每 session 首次进入时弹出到期提醒 dialog(postFrameCallback 模式)
内容随 phase 调整文案,提供「稍后处理」/「立即前往设置」两个按钮
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-10 07:08:35 +08:00 |
|
wangjia
|
ebf79d0355
|
feat: LicenseGuard 中间件 + Flutter license model/repo (21D+21E)
21D — 后端:
- Claims 新增 LicenseExpiresAt (*int64 unix 秒),写入 JWT 避免每次查库
- middleware/license_guard.go: CalcLicensePhase / LicenseGuard / GetLicensePhase
- grace(0-7d): 允许通行
- readonly(7-15d): 拦截非 GET 写操作 → 403
- locked(15d+): 全部拦截 → 403
- auth.go: issueTokens 在 JWT 中嵌入 license expires_at;Login 检查 locked 拒绝登录
- router: license/* 路由豁免 LicenseGuard(锁定时仍可激活/查状态)
21E — Flutter 前端:
- models/license.dart: 新 LicenseInfo,含 phase/maxDevices,去掉旧 activatedAt
- core/device/device_id.dart: 持久化 UUID-v4 作为设备 ID(SharedPreferences)
- repositories/license_repository.dart: getInfo/activate/deactivate,激活时携带设备信息
- providers/license_provider.dart: 改接 LicenseRepository
- settings_screen.dart: activatedAt 改为显示 maxDevices
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-10 00:52:07 +08:00 |
|
wangjia
|
c402ea0070
|
feat(backend): license_devices 表 + 注册自动签发 trial (21B+21C)
21B — DB & model:
- licenses: 扩展 license_key 为 2048 字节(容纳 Ed25519 JWT),
新增 max_devices INT DEFAULT 3,device_id/activated_at 标为 deprecated
- 新增 license_devices 表(license_id+device_id 唯一索引)
- model/license_device.go:LicenseDevice struct
- main.go AutoMigrate 加入 LicenseDevice
- testutil/setup.go 同步 SQLite DDL
21C — trial at register:
- config: 新增 Ed25519PrivateKey 配置项(LICENSE_ED25519_PRIVATE_KEY 环境变量)
- service/license.go: createTrialLicense(tx, shopID) — 签发 30d trial,
私钥未配置时静默跳过(开发/测试不影响)
- service/auth.go: Register 事务末尾调用 createTrialLicense
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-10 00:42:56 +08:00 |
|
wangjia
|
40a80467ce
|
feat(backend): Ed25519 license signing utilities (21A)
- util/license_key.go: LicensePayload struct, GenerateEd25519KeyPair,
IssueLicenseToken (sign), VerifyLicenseToken (verify offline)
- cmd/genkey: one-shot keypair generator with demo sign+verify
- config: add Ed25519PublicKey field (LICENSE_ED25519_PUBLIC_KEY env)
Token format: base64url(header).base64url(payload).base64url(ed25519-sig)
Private key stored in Bitwarden; public key embedded in config/client.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-10 00:28:55 +08:00 |
|
wangjia
|
18cd2497c1
|
feat(todo): 子任务系统 — 复杂任务支持子任务拆解与依赖追踪
- 新增 `sub add <parent_id>` / `sub status <sid>` CLI 命令
- SID 格式 {parentId}{Letter},支持依赖声明(deps)与校验
- HTML 新增子任务展开块、进度徽章、依赖色标(绿=完成/红=未完成)
- 父任务全部子任务完成时自动转为「待验收」;手动设 done 时检查子任务
- 更新 /todo 命令文档补充 sub 子命令说明
- #21 已录入 8 个实现子任务(21A–21H),含完整依赖链
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-10 00:16:10 +08:00 |
|
wangjia
|
8925646eef
|
docs(architecture): 授权信息功能完整方案设计文档
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-09 23:53:35 +08:00 |
|
wangjia
|
afa1a0bcd2
|
feat(client): 商品详情页展示所有字段,补全分类/库存预警/备注/自定义字段/描述文档
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-09 22:50:47 +08:00 |
|
wangjia
|
0ec609255c
|
chore: release v1.0.29
Deploy / build-linux-web (push) Failing after 10m44s
Deploy / build-windows (push) Failing after 10m45s
Deploy / build-macos (push) Has been skipped
Deploy / build-android (push) Has been skipped
Deploy / build-ios (push) Has been skipped
Deploy / release-deploy (push) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.29
|
2026-06-09 12:12:26 +08:00 |
|
wangjia
|
5ad1289419
|
chore: release v1.0.28
Deploy / build-windows (push) Successful in 1m54s
Deploy / build-linux-web (push) Failing after 13m1s
Deploy / build-macos (push) Has been skipped
Deploy / build-android (push) Has been skipped
Deploy / build-ios (push) Has been skipped
Deploy / release-deploy (push) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.28
|
2026-06-09 09:35:01 +08:00 |
|
wangjia
|
daa83bd408
|
chore: release v1.0.27
Deploy / build-windows (push) Successful in 1m56s
Deploy / build-android (push) Has been cancelled
Deploy / build-ios (push) Has been cancelled
Deploy / release-deploy (push) Has been cancelled
Deploy / build-linux-web (push) Successful in 53s
Deploy / build-macos (push) Failing after 1m16s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.27
|
2026-06-09 00:15:46 +08:00 |
|
wangjia
|
65d6b12a21
|
fix(ci): macOS 打包改用 ditto 保留 symlink 和文件权限,修复解压失败
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 22:51:18 +08:00 |
|
wangjia
|
b0a74f3607
|
chore: release v1.0.26
Deploy / build-linux-web (push) Successful in 55s
Deploy / build-windows (push) Successful in 2m2s
Deploy / build-macos (push) Successful in 1m17s
Deploy / build-android (push) Successful in 1m30s
Deploy / build-ios (push) Successful in 6s
Deploy / release-deploy (push) Successful in 1m43s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.26
|
2026-06-08 22:40:54 +08:00 |
|
wangjia
|
543bd2712f
|
chore: update todo list
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 22:40:17 +08:00 |
|
wangjia
|
fab7bd21dd
|
feat: #13 公开商品 API 补充 code/barcode/batch.quantity,报错反馈携带商品和门店信息
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 22:39:59 +08:00 |
|
wangjia
|
3b2ebc0202
|
fix(web): 注册页 API URL 改用 site.appBaseUrl,修正成功提示导航路径
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 22:33:16 +08:00 |
|
wangjia
|
ff32c8a845
|
fix(client): 公开页页脚「关于岩美」链接改为 AppConfig.aboutUrl 配置项
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 22:27:38 +08:00 |
|
wangjia
|
af64e29459
|
fix(client): 公开页页脚「关于岩美」链接修正为 jiu.51yanmei.com
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 09:19:33 +08:00 |
|
wangjia
|
f788a7ab74
|
chore: release v1.0.25
Deploy / build-windows (push) Successful in 1m56s
Deploy / build-linux-web (push) Failing after 13m56s
Deploy / build-macos (push) Has been skipped
Deploy / build-android (push) Has been skipped
Deploy / build-ios (push) Has been skipped
Deploy / release-deploy (push) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.25
|
2026-06-08 08:20:48 +08:00 |
|
wangjia
|
8a87d4a82c
|
feat(client): #14/#18 产地/保质期/储存方式/描述文档 provider & repo 及公开页意见反馈
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 08:20:00 +08:00 |
|
wangjia
|
0d17533120
|
feat(client): 基础数据管理新增产地/保质期/储存方式/描述文档 4 个字典维护 Tab
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 08:06:21 +08:00 |
|
wangjia
|
4e64e5eb47
|
feat: 入库单/商品详情展示产地保质期储存方式,商品详情显示建议零售价
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 07:57:10 +08:00 |
|
wangjia
|
1ec1d4209a
|
chore: release v1.0.24
Deploy / build-linux-web (push) Successful in 59s
Deploy / build-windows (push) Successful in 1m50s
Deploy / build-macos (push) Successful in 1m22s
Deploy / build-android (push) Successful in 1m26s
Deploy / build-ios (push) Successful in 7s
Deploy / release-deploy (push) Successful in 1m39s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.24
|
2026-06-08 07:31:55 +08:00 |
|
wangjia
|
22f07ed805
|
feat(client): 入库表单关联商品属性字典(产地/保质期/储存方式/描述文档)
- product_option.dart: 新增 4 个字典 model(Origin/ShelfLife/Storage/DescriptionDoc)
- product_option_repository.dart: 新增 4 个 list 方法(listOrigins/ShelfLives/Storages/DescriptionDocs)
- product_option_provider.dart: 新增 4 个 FutureProvider 供表单使用
- product_repository.dart: findOrCreate 加 originId/shelfLifeId/storageId/descriptionDocId 可选参数
- stock_in_form_screen.dart: _ItemRow 加 4 个可选 ID 字段;新增 4 个 SearchableOptionField 方法;移动端卡片视图增加 4 个可选字段;提交时传入属性 ID
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 07:03:07 +08:00 |
|
wangjia
|
45b6ec832b
|
feat(client): 公开商品页改读真实数据,移除茅台 mock 硬编码
- _DescriptionSection: 接受 title/body/keywords 三参数,移除 _mockBody/_mockKeywords 和茅台专属文案
- _ParamsCard: 新增 origin/shelfLife/storage 参数;产地空时不显示,生产日期无时不显示,保质期/储存方式用后端返回值(含默认话术)
- 数据提取段:新增 origin/shelfLife/storage/descriptionTitle/descriptionKeywords 从 API 响应读取
- 删除未使用的 _extractKeywords 方法
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 06:58:28 +08:00 |
|
wangjia
|
ba127826b2
|
feat(backend): 新增商品属性字典表(产地/保质期/储存方式/描述文档)
- model/product_attr.go: 新增 4 张字典表 struct(TenantBase 范式)
- model/product.go: Product 增加 4 个可空外键 + belongs-to 关联
- handler/product_attr.go: 4 组 16 个 CRUD handler(shop_id 隔离)
- handler/product.go: FindOrCreate/Update 支持写入 4 个属性 ID
- handler/public.go: Preload 4 表 + 三级回退介绍 + 默认话术常量
- router/router.go: /product-options/{origins,shelf-lives,storages,description-docs} 路由
- main.go: AutoMigrate 注册 4 个新 model
- testutil/setup.go: SQLite 测试库补齐新列与新表
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 06:56:16 +08:00 |
|
wangjia
|
0e2a4086e1
|
chore(todo): 补录 product 公开页 6 条待办(价格展示、硬编码清理、死交互等)
|
2026-06-08 02:12:54 +08:00 |
|
wangjia
|
99f34a6223
|
chore(web): 删除 scan.html,清理 /scan/ nginx 路由和文档
scan.html 从未被实际触发——二维码 URL 格式为 /product/<uuid>,
由 Flutter Web PublicProductScreen 处理,scan.html 是孤立死页。
- 删除 web/scan.html
- 移除 nginx-jiu.conf 中 /scan/ location 块
- 更新文档路由表(/scan/<id> → /product/<uuid>)
- 标记 todo #4 完成
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-08 02:07:19 +08:00 |
|
wangjia
|
ce92d619ed
|
chore(todo): 标记 #1 两套 CSS 设计令牌问题已完成(v1.0.23)
|
2026-06-08 01:48:41 +08:00 |
|