 QiuSWandClaude Opus 5
|
c8ce79f886
|
fix: 修正历史脏值并改进店铺刷新入口 (#10 #11)
负责人反馈「下拉选择缺少视频筛不出数据」,查库发现 5305 条商品的
video_diagnosis 全是 unknown,product_diagnoses 表 0 条。
根因是我中途取消 Codex 造成的:第一版按三态实现时,负责人的
wails dev 正开着,Codex 一存文件就自动重编译重启,把带
DEFAULT 'unknown' 的迁移真正执行进了数据库。随后我回滚了源码,
但数据库已升到 schema_version=10,那几条迁移不会再跑,
于是库里留下当前代码不认识的 unknown。
三处修改:
1. 追加自愈迁移,把非 missing/ok 的历史值统一收敛为 ok。
已在负责人真实数据库上验证:5305 条 unknown 全部变为 ok,
版本升到 11。下次「下载数据」会写入真实诊断值。
2. 去掉「刷新店铺」按钮,改为展开店铺下拉时按需刷新。
带 5 分钟间隔,避免每次点下拉都要等一次货憨憨登录;
自动刷新失败不弹窗,下拉框继续用缓存,旁边的「更新于 …」
会显示旧时间,看得出数据不是最新的。启动时的刷新失败仍然弹窗,
那是需要立刻知道的。
3. 修掉三个绕过 Wails 生成绑定的 window.go.main.App 调用。
Codex 这样写是因为 frontend/wailsjs 在禁改清单里,做法自洽,
但绕过类型包装且会被后来者照抄。已重新生成绑定并改为正常 import。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 21:13:12 +08:00 |
|
 QiuSWandClaude Opus 5
|
393c942762
|
feat: 解析商品质量诊断并支持按「缺少视频」筛选 (#11)
由 Codex (gpt-5.6-sol) 实施,Claude 审核。
货憨憨 getPage 响应里带有商品质量诊断,其中「缺少视频」直接标出了
哪些商品才需要去淘宝找视频,能把工作量从全店商品缩小到真正需要处理的那部分。
此前这个字段被完全丢弃。
字段名是 diagnosisInfo(不是 diagnoses),结构比表面看到的多一层:
{itemId, qualityLevel, diagnoses:[{field, diagnosisResults:[{type, solution}]}]}
判定规则(负责人 2026-09-02 决定,见工单评论):
- missing:诊断明确报了「缺少视频」
- ok:其余全部情况,含 diagnosisInfo 为 null
只有明确报缺少视频才算缺少,其它一律当作有视频。
500 条样本里 293 条 diagnosisInfo 为 null,按此规则归入 ok。
我曾建议保留 unknown 三态以区分「尚未诊断」,负责人已知悉并选择两态,
措辞为「初定」;顾虑与重新评估条件记录在工单 #11 评论中。
- internal/store:products 加 video_diagnosis、quality_level 两列;
新增 product_diagnoses 表保存全部 6 种诊断类型(缺少尺寸表、缺少标准变体、
缺少品牌信息、所需属性过少、缺少视频、合格级属性数量不足)。
只存「缺少视频」的话,另外 5 种将来要用就得重新全量拉一遍,而采集成本为零。
迁移全部在 migrations 末尾追加,未改动任何已有条目。
- internal/huohanhan:ProductRecord.DiagnosisInfo 用指针以区分 null;
转换时按上述规则算出 video_diagnosis。
- 前端:工具栏加诊断筛选(全部 / 缺少视频 / 有视频);
「视频」列改为显示诊断结果。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 21:02:58 +08:00 |
|
 QiuSWandClaude Opus 5
|
d34846e26e
|
feat: 店铺列表缓存到 SQLite 并在启动时后台刷新 (#10)
由 Codex (gpt-5.6-sol) 实施,Claude 审核。
以前每次打开商品列表都要现调 erp/shop/all,而这条链路要先完成
货憨憨登录(CID/CST → 验证码 → OCR → 登录 → 验证 token),
任何一环失败下拉框就是空的,连店铺名都看不到。
internal/store/shop.go(新建)
- shops 表在 migrations 末尾追加,未改动任何已有迁移条目
- ReplaceShops 是全量替换:同一事务内先 DELETE 再批量插入。
只做 upsert 会让货憨憨那边已删除的店铺永远留在下拉框里,
选中后拉不到任何数据
- 缓存字段是白名单,不含 accessToken、refreshToken、createUser
app.go
- ListShops 改为只读缓存;新增 GetCachedShops、GetShopsUpdatedAt、
RefreshShops
- startup 里用协程后台刷新,不阻塞窗口显示;且仅在账号密码都已配置时
才刷新——同事第一次安装还没填账号就启动时,刷新必然失败,
一开机弹「登录失败」体验很差
- 成功发 shops:refreshed 事件,失败发 shops:refresh-failed 并带上
失败原因、缓存时间和缓存条数
前端
- 启动先读缓存立即填充下拉框,再由后台刷新更新
- 刷新失败时弹窗同时说明失败原因和缓存时间,只说「更新失败」
使用者无法判断该不该继续用
- 下拉框旁常驻显示缓存更新时间,并提供手动刷新
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 18:00:11 +08:00 |
|
 QiuSWandClaude Opus 5
|
f568cd1061
|
feat: 商品表格补上操作列(详情 / 目录)
原型里每行末尾有「详情 / 目录」两个操作,实现时漏掉了整个操作列。
- 详情:按店铺地区拼 Shopee 商品页地址并用系统浏览器打开。
地区来自 erp/shop/all 的 region 字段,在前端建 平台店铺ID -> 地区
的映射表;认不出地区时置灰,不拼一个打不开的地址。
各站点域名集中在 shopeeDomains 里,不要在别处硬编码。
- 目录:打开本地视频所在文件夹。视频尚未下载,先置灰并提示
「下载视频后可用」,等 R4(#5 MVP2)实现下载后解开禁用即可,
届时不用再动表格结构。
app.go 新增 OpenInBrowser,只允许 http/https,避免变成可以
启动任意程序的入口。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 17:48:51 +08:00 |
|
 QiuSWandClaude Opus 5
|
d5e32f4d2b
|
fix: 下载数据点击后无反馈,且大店铺会被分页上限截断 (#8)
负责人反馈「点击下载数据没反应」。用真实登录态做只读诊断后确认
后端正常:ListShops 返回 19 个店铺,getPage 返回 total=4304。
问题有两个,都在前端反馈和分页参数上。
1. 前端没有任何运行状态
downloadProductData 是个纯 await,期间按钮不禁用、不转圈、不提示。
商品多的店铺要跑几十秒到几分钟,看起来就像点了没用。
改为:未选店铺时先给出提示不发请求;开始时提示「进度见运行日志」;
按钮显示 loading 并互斥禁用;失败用 error 而不是 warning。
下载视频、上传数据两个按钮同样处理。
2. 每页 20 条导致大店铺超出 200 页上限被截断
实测同一店铺不同 size 的表现:
size=20 216 页 506ms/页 约 108 秒
size=200 22 页 836ms/页 约 18 秒
size=500 9 页 1.48s/页 约 13 秒
4304 个商品按 20 条一页是 216 页,超过 maximumProductPages=200,
会在 4000 条处截断并只记一条警告。
改为每页 200 条:耗时降到约六分之一,且上限对应 4 万商品,
远超实际店铺规模。选 200 而非 500 是响应体积与速度的平衡。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 17:43:25 +08:00 |
|
 QiuSWandClaude Opus 5
|
406fb80e46
|
fix: 补回缺失的 DownloadProductData 导入 (#8)
点击「下载数据」报 ReferenceError: DownloadProductData is not defined。
这是审核阶段我自己引入的回归:Codex 原先绕过 Wails 生成的绑定,
直接调 window.go.main.App.DownloadProductData,同时把该函数从 import
列表里删掉了。我把调用改回正规写法时忘了把 import 加回去。
顺带核对了三个前端文件的全部绑定调用,确认没有其它「调用了但没导入」
的情况;移除 ProductListView 中未使用的 CountProducts 导入。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 17:38:04 +08:00 |
|
 QiuSWandClaude Opus 5
|
51977e4dc1
|
fix: 开发模式下配置和数据库写错位置 (#8)
负责人在设置页保存了货憨憨账号,但项目根目录的 config.yaml 仍是空的,
以为保存没生效。实际是写到了 build\bin\config.yaml。
原因:DefaultPath 用 os.Executable() 定位。打包后双击 exe 时这是对的,
但 wails dev 跑的是 build\bin\cmsp-dev.exe,配置和数据库就落在那里,
开发的人在项目根目录怎么找都找不到。
改为按「exe 目录已有 → 工作目录已有 → 新建在 exe 目录」的顺序查找,
配置文件和数据库共用同一套规则(config.ResolveDataPath)。
这样打包后仍在 exe 旁边,开发模式则命中项目根目录那一份。
补两个测试:已存在的文件优先命中;目录不算文件。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 17:20:44 +08:00 |
|
 QiuSWandClaude Opus 5
|
56467d3ca4
|
chore: 忽略临时截图,保留 build/appicon.png
验收证据请贴到 Gitea 工单,不要放进仓库。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 17:16:41 +08:00 |
|
 QiuSWandClaude Opus 5
|
5524fe958c
|
feat: 店铺列表与商品数据下载 (#8)
由 Codex (gpt-5.6-sol) 实施,Claude 审核。
实现以真实抓包为准,纠正了 Python 参考实现与接口文档的三处错误:
1. erp/shop/all 请求体是 userId=(空值),不是文档写的 type=1
2. product/shop/getPage 用 form 编码,不是 JSON
3. 两个接口的响应都没有 {type, message, code, bean} 包裹:
shop/all 返回裸数组,getPage 直接返回分页对象
internal/huohanhan/shop.go
- ListShops 解析裸数组,只保留 platform=="0" 的 Shopee 店铺,
店铺名去首尾空格后按名称排序
- Shop 结构体只声明界面需要的 8 个字段。货憨憨返回的
accessToken、refreshToken 是 Shopee OAuth 凭据,createUser 是手机号,
一律不解析、不记录、不存储、不返回前端;有测试用反射与 JSON
序列化双重断言
internal/huohanhan/product.go
- GetProductPage 发送完整表单,自定义 UnmarshalJSON 兼容
total/size/current/pages 既可能是数字也可能是字符串
- DownloadAllProducts 按页拉全量,带 200 页上限保护防止 pages
异常导致死循环,达上限记警告而非静默截断
app.go
- ListShops、DownloadProductData 换成真实实现
- 未选店铺时返回「请先选择店铺」。该账号有 19 个店铺,
单店铺 1256 个商品 63 页,默认拉全部会非常慢
前端
- 店铺加载失败不再静默吞掉,改为可见提示
- 「下载数据」传当前店铺 ID,完成后刷新列表
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 17:16:41 +08:00 |
|
 QiuSWandClaude Opus 5
|
d8e90789a2
|
fix: 界面无法正常显示的两个问题 (#4)
由负责人实机运行后发现,均为骨架工单遗留缺陷。
1. Naive UI 组件从未注册
main.js 少了 app.use(naive),模板里的 n-button / n-input /
n-select / n-data-table / n-modal 全被 Vue 当成未知元素:
按钮渲染成纯文本、输入框和表格不显示、日志弹窗不受 v-model:show
控制直接常驻页面。侧边栏因为是手写 HTML+CSS 所以正常,
这正是定位问题的线索。
修复后打包产物由 258 KB 增至 1.46 MB,可反证此前确实没打进去。
2. 窗口比屏幕高,标题栏被顶到屏幕外
Width/Height 是逻辑像素,Windows 按系统缩放放大。1440x900
在 125% 缩放下变成 1800x1125 物理像素,超过工作区高度 1030,
窗口居中后标题栏与最大化/关闭按钮移出屏幕。
改为 WindowStartState: options.Maximised,还原尺寸降到 1280x760,
最小尺寸降到 1024x600,并在代码中写明这个坑。
顺带给工具栏加 flex-wrap,窄窗口下筛选控件换行而不是挤在一起。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 16:55:12 +08:00 |
|
 QiuSWandClaude Opus 5
|
8f62508dc4
|
docs: 记录三段交付节奏与 R5 排序 (#2)
MVP1 商品同步 → MVP2 本地拿到视频 → MVP3 回传货憨憨。
R5 排最后是硬约束:唯一缺接口契约、唯一写真实数据、
且货憨憨图片空间仅剩约 26 GB。
Q1、Q2 的解决时机定为 MVP2 交付后使用者手动上传时抓包。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 16:45:02 +08:00 |
|
 QiuSWandClaude Opus 5
|
080a77ab5d
|
chore: 增加 run_dev.bat 与 build.bat 启动打包脚本
面向初级维护者:每个检查失败都写明「怎么修」而不只是报错。
- run_dev.bat:检查 Go/Node/Wails/配置/前端依赖后启动开发模式,
缺 config.yaml 时自动从 config.example.yaml 复制
- build.bat:打包前先跑单元测试,测试不过拒绝打包(可用 skiptest 强制);
打包成功后提示不要把 config.yaml 和 cmsp.db 一起发给同事
两个脚本必须是 GBK 编码 + CRLF 行尾:cmd 用系统 ANSI 代码页解析 .bat,
存成 UTF-8 会让中文注释把命令行拆坏(实测报「不是内部命令」);
UTF-8 带 BOM 则会让 @echo off 失效。.gitattributes 用 *.bat -text
让 Git 原样存取,已验证磁盘字节与 Git 存储字节一致。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 16:45:02 +08:00 |
|
 QiuSWandClaude Opus 5
|
d257752441
|
feat: 货憨憨登录与认证复用 (#7)
由 Codex (gpt-5.6-sol) 实施,Claude 审核。
internal/huohanhan/auth.go
- 六步登录:取 CID/CST 作 Basic 认证 → getCltConf 取 clientId →
下载验证码 → OCR 识别 → 提交登录 → app-version/info 在线验证
- OCR 响应递归查找 4~8 位验证码,优先 text/result/data/content/captcha/code
- 错误分支:invalid_verify_code 换图重试(上限可配,默认 3);
invalid_credentials 与 disabled_credentials 直接报中文错误不重试
- 认证复用改用 SQLite kv 表 + sync.Mutex,不照搬 Python 版的 Redis
- GetValidAuth 按「内存 → SQLite 在线验证 → 重新登录」顺序取认证
internal/huohanhan/client.go
- 统一请求方法,自动带 Authorization 与 cookies
- 认证失败时清状态、重登、最多重试一次;超时、500、普通业务错误不重试
app.go
- 新增 TestHuohanhanLogin,供设置页「测试连接」调用
测试全部使用 httptest 假服务,不需要真实账号即可运行。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 16:45:02 +08:00 |
|
 QiuSWandClaude Opus 5
|
9415c20c9e
|
chore: 删除淘宝流程设计规范文档 (#4)
由项目负责人于 2026-09-02 决定删除。其中的稳定结论已并入 Wiki
「业务规则与术语」的「淘宝登录」与「淘宝以图搜」两节,三处引用
已在上一提交改为指向该页。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 16:00:08 +08:00 |
|
 QiuSWandClaude Opus 5
|
5c5c6825b0
|
docs: 记录原型确认结果并移除已删除设计规范的引用 (#4)
- 原型确认记录填入线上链接、版本 v4、确认日期与覆盖范围
- 新增「已确认的界面决定」:侧栏形式与宽度、登录状态唯一显示位置、
两行工具栏、四个搜索条件到 getPage 参数的映射、店铺来源、
运行日志独立窗口、路径选择框类型、表格列
- R6 状态改为「原型已确认,未实现」
- 负责人于 2026-09-02 删除了 Wails专属Chrome登录与淘宝以图搜流程.md,
三处 Wiki 引用改指向业务规则与术语页,并留一句说明避免后人再引用
- 架构页「当前事实」更新为已有 Go 骨架
- README 补充目录说明与当前状态
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 15:59:54 +08:00 |
|
 QiuSWandClaude Opus 5
|
2cefa67001
|
feat: 初始化 Wails v2 + Vue3 骨架与 SQLite 存储 (#4)
建立可运行、可构建的 Go 骨架,供后续 R1~R5 在其上叠加。
后端:
- main.go / app.go:Wails v2 窗口与 14 个前端可调方法。Wails 专有 API
只出现在这两个文件,internal/ 对 Wails 零依赖,便于将来迁移 v3
- internal/config:config.yaml 的读写、校验、脱敏。保存时按固定模板
渲染以保留注释,不用 yaml.Marshal
- internal/store:SQLite(modernc.org/sqlite,无需 CGO)。建表迁移、
商品仓储、KV。重复同步不会覆盖本地下载与上传状态
- internal/logx:9 条脱敏规则,覆盖淘宝 token、Cookie、Authorization、
密码和图片 base64;并发安全的内存日志缓冲
前端(Vue 3 + Naive UI,按已确认原型 v4):
- Sidebar:176px 可折叠,仅商品列表与参数设置两项,底部是登录状态的
唯一显示位置
- ProductListView:两行工具栏(四项筛选 + 重置搜索 / 四个操作按钮)、
商品表格、分页
- SettingsView:四张卡片,路径用文件与目录选择框
- LogWindow:运行日志子窗口,按级别过滤、自动滚动、导出
配置改用 YAML:分 huohanhan / taobao / download 三段。taobao 段刻意
没有账号密码字段,并有单元测试挡住后续加入。
构建相关:
- .gitignore 只忽略 build/bin/,不忽略 build/。Wails 把 build/ 当源码
目录(图标、manifest),忽略掉会让别人克隆后构建失败
- .gitignore 忽略 config.yaml、payloads/ 和 *.har(含真实手机号与凭据)
未实现的下载数据、下载视频、上传数据三个方法返回明确的「还没实现」,
不静默失败。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 15:59:54 +08:00 |
|
 QiuSWandClaude Opus 5
|
c5c47f98f9
|
docs: 同步语言规范与 PowerShell 约束的 Wiki 镜像 (#1)
- Development-Workflow:整页取上游新版,新增「语言与术语」
- Local-Development-and-Verification:新增「PowerShell 语法与外部命令」
子节,本项目原有内容保留
- Project-Profile:运行环境补充 PowerShell 7 pwsh;DevHarness 基线提交
更新为 40b99387adc184274c43fda5f7efb3746642e27a
check --strict 通过,55 项单元测试全部通过。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 15:26:23 +08:00 |
|
 QiuSWandClaude Opus 5
|
0e5a17fe88
|
chore: 升级 DevHarness 基线到 40b9938 (#1)
同步上游两个提交,均为通用 Agent 工作规则:
- 90938be #31 语言与术语:默认中文协作,标识符、命令、路径、API 名、
日志与错误原文保持原样不翻译
- 40b9938 #28 Windows PowerShell 命令约束:禁止套用 Bash heredoc 与
转义规则,正则引号处理,here-string 传多行 Python,rg 用 -g/--glob
AGENTS.md 以上游新版重建,逐字保留本项目第 10 节「项目专用规则」。
dev_scripts/ 与 tests/ 本项目未定制,整体替换为上游版本。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 15:26:23 +08:00 |
|
 QiuSWandClaude Opus 5
|
0ac1345005
|
docs: 对齐轻量模式固定措辞并同步需求总览镜像
Harness 自测要求需求总览包含「局部样式或布局」与「可直接实施」的固定
措辞。已在 Wiki 侧修正原型门禁条目并回读同步镜像。
修正后 53 项 Harness 自测全部通过,check --strict 通过。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 11:58:18 +08:00 |
|
 QiuSWandClaude Opus 5
|
ea7371a25f
|
docs: 同步 chengma/cmsp Wiki 核心页面镜像
从线上 Wiki 回读 15 个核心页面并写入镜像头(页面名、地址、revision、
同步时间)。`python dev_scripts/harness.py sync --verify` 通过,
新项目 Wiki 初始化门禁完成。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 11:57:44 +08:00 |
|
 QiuSWandClaude Opus 5
|
93f4c94522
|
chore: 接入 DevHarness 并建立项目文档基线
从 D:/OPC/dev_harness (c13f6adb76c2ffbcae080dabf1df869a241e8f63) 接入
DevHarness 工作流,治理模式选择轻量。
- 复制 Harness 骨架:AGENTS.md、CLAUDE.md、工单模板、dev_scripts、tests
- 编写 cmsp 专属文档:Home、项目档案、架构与代码地图、业务规则与术语、
本地开发与验证、常见修改、故障排查、需求总览
- AGENTS.md 填入项目专用红线:凭据边界、淘宝登录不可自动化、
登录失效全局停止门、货憨憨写操作显式确认
- wiki-docs.json 指向 chengma/cmsp,登记 15 个核心页面映射
本提交为 DevHarness 允许的一次性引导提交,只包含仓库骨架与文档,
不含产品功能代码。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
|
2026-09-02 11:57:18 +08:00 |
|