顺运宝模块此前是骨架,「同步」点了提示"待接入"。5195 个蝦皮商品已经 进系统,但货运单(真实订单)一条都没有,后面的规格匹配无从谈起。 按接口契约(docs/admin/08,从 4 份 HAR 还原)实现:配置、登录(界面 手工输验证码)、会话缓存到 SQLite、按日期范围增量同步、落 syb_orders。 shopee_sku_id 绝不被同步覆盖。它是规格匹配的结果,顺运宝那边根本没有 这个值(只给 11 位商品ID,蝦皮規格ID 是 12 位)。同步写进去就是写空, 把人工攒的匹配成果洗掉且不报错。它只出现在 INSERT 列清单里,不在 DO UPDATE SET 里;repository 层和 service 端到端各有一个测试守着。 增量从「上次同步日期当天」重拉,不是第二天。created 筛选粒度是日期而 last_synced_at 精确到秒,从第二天拉会漏掉当天晚些时候创建的单且不报错。 宁可重复拉(upsert 幂等)也不能漏。中途失败不更新 last_synced_at, 否则下次跳过这段区间,漏的单永远补不回来。 日期运算用 UTC+8,不是 UTC。审查时从 HAR 确认 created 是当地时间: 抓包于 2026-07-28T03:31:45Z(= 11:31 UTC+8),同一响应里 created 是 "2026-07-28 10:37:59";若它是 UTC 则等于 18:37 UTC+8,比抓包晚 7 小时, 订单创建于未来,不成立。用 UTC 算会在本地 00:00-08:00 把"今天"算成昨天, 当天早晨的单这轮拉不到。用 time.FixedZone 写死,不用 LoadLocation—— 那要读系统 tzdata,Windows 默认没有,打包成 exe 会失败。 金额一律取 detail/listByStock 的值:08 §5.1 实测同一响应里 amtOrder 在列表接口是分、escrowAmount 却不是,单位不统一,取错差 100 倍。 迁移 v5 纯追加(syb_session、syb_sync_state、syb_orders.product_spec), v1-v4 逐字未动,CheckSchema 覆盖新表新列。 会话有效性判断把「网络故障」和「明确未登录」的分类集中在 Client.do() 一处——网络抖一下就判定登出的话,验证码会弹个不停,还会丢掉有效会话。 测试全部用 httptest 假服务端,不打真实站点。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7.8 KiB
00 Admin 上手指南
- 文档状态:基线草案
- 读者:第一次接手 Admin 的开发者
- 目标:照着做完,能在自己电脑上把 Admin 跑起来,并知道下一步读哪份文档
这份文档只讲"怎么把环境搭好、怎么跑起来"。业务规则不在这里,见 文档索引。 遇到不认识的词(货运单、upsert、SKU 映射……),先查 术语表。
1. 准备电脑环境
| 需要什么 | 版本 | 怎么确认装好了 |
|---|---|---|
| Go | 1.23.0 | go version 输出 go version go1.23.0 windows/amd64 |
| Git | 任意较新版本 | git --version 有输出 |
| DB Browser for SQLite | 任意 | 用来看数据库,可选但强烈建议装 |
版本已定为 go1.23.0,写在 admin/go.mod 里。低于这个版本可能编译不过。
不需要装 gcc。 本项目的 SQLite 驱动是纯 Go 实现的
(modernc.org/sqlite),不依赖 cgo,这也是选它的原因——
go build 直接出单个 exe,不用配 C 编译器。
2. 拉依赖
先配国内代理,否则大概率拉不动:
go env -w GOPROXY=https://goproxy.cn,direct
正常情况下 go.mod 和 go.sum 已经在仓库里了,直接:
cd D:\chengma\cmautobuy\admin
go mod download
预期没有输出——Go 的惯例,成功时不打印东西。
万一需要重新拉依赖
[必须] 命令必须带版本号。 直接 go get github.com/gin-gonic/gin
会拉到最新版,然后报 requires go >= 1.25.0——因为这几个库的新版本
都已经不支持 Go 1.23.0 了。
go get github.com/gin-gonic/gin@v1.11.0
go get modernc.org/sqlite@v1.38.0
go mod tidy
写 Excel 导入功能时再把 excelize 加进来(现在没有代码 import 它,
go mod tidy 会把它去掉,这是 Go 的正常行为):
go get github.com/xuri/excelize/v2@v2.9.1
这三个是在 Go 1.23.0 下实测能编译通过的最高版本, 为什么不能更高见 admin/AGENTS.md 技术栈一节。
[必须] go.mod 和 go.sum 都要提交 Git,否则别人拉下来版本对不上。
SQLite 驱动不要换成
mattn/go-sqlite3,那个需要 cgo, 得装 gcc,还会让go build出不了单文件 exe。
3. 跑起来
推荐在仓库根目录运行热重载脚本:
cd D:\chengma\cmautobuy
.\run_admin.bat
脚本第一次运行时会自动安装与 Go 1.23 兼容的
github.com/air-verse/air@v1.61.7,以后会直接使用已安装的固定版本。
保存 Go、HTML、CSS 或 JavaScript 文件后,Air 会自动重新编译并重启 Admin;
按 Ctrl+C 停止。
如果只想临时运行一次、不需要热重载,也可以:
cd D:\chengma\cmautobuy\admin
go run .
然后浏览器打开 http://localhost:8080。
这个命令是安全的:Admin 只管理数据,不会连手机、不会下单。放心随便跑。
配置顺运宝账号(同步货运单需要,其余四个模块不需要)
顺运宝数据页的「同步」需要读 admin/config.yaml。第一次用要自己建这个文件
(已在 .gitignore 里,不会被提交):
cd D:\chengma\cmautobuy\admin
copy config.example.yaml config.yaml
用编辑器打开 config.yaml,把 username / password 改成真实的顺运宝账号密码。
[必须] 密码要加引号,纯数字密码不加引号会被 YAML 解析成整数,前导 0 也会丢:
password: "0012345" # ✓ 正确
password: 0012345 # ✗ 解析成整数 12345
没有这个文件时,点「同步」会提示"没有找到配置文件……请复制 config.example.yaml",不是一句读不出原因的报错。
接口细节和这几个配置项各自的含义见 08 顺运宝接口 §8。
4. 你应该看到什么
左边(或顶部)是五个模块的导航:
| 模块 | 干什么的 |
|---|---|
| 蝦皮数据 | 导入蝦皮商品报表,填 PDD 链接,发起采集 |
| PDD 商品 | 维护拼多多商品档案,发起采集,查看采回来的规格价格。这个页面不依赖蝦皮和顺运宝的任何数据,单独就能跑通"建商品 → 建采集任务 → 领走执行 → 提交结果 → 显示已采集"这条闭环,见 05 界面规范 §5 |
| 顺运宝数据 | 同步货运单(需要先配置 config.yaml,见上一节)。规格匹配和生成采购任务是后续工单的范围,本页暂不提供 |
| 采集采购 | 看采集和采购任务执行到哪一步了 |
| 客户端列表 | 看哪些客户端在干活 |
每个页面都是同一个结构:上面工具条 / 中间表格 / 下面状态条。 五个页面长得像是故意的,见 05 界面规范。
5. 常见报错
| 报错 | 原因 | 怎么办 |
|---|---|---|
go: command not found |
Go 没装或不在 PATH | 装 Go,重开 PowerShell |
dial tcp ... i/o timeout |
拉不到模块 | 配 GOPROXY,见第 2 步 |
no required module provides package |
依赖没装 | 回第 2 步跑那三条 go get |
listen tcp :8080: bind: ... |
8080 端口被占了 | 换端口:go run . -port 8081,或关掉占用的程序 |
| 页面全是没样式的白底黑字 | 静态文件没加载到 | 确认是从 admin/ 目录启动的,静态文件路径是相对的 |
database is locked |
有别的程序占着数据库 | 关掉 DB Browser 再试;程序运行时只读打开是可以的 |
| 导入 Excel 报错但没说哪一行 | 解析器没带行号 | 这是 bug,报错必须带行号,见 06 §2 |
6. 数据库在哪、怎么看
跟 Client 一样是便携模式——数据都在程序旁边的 data/ 里:
admin/data/
├── admin.db 数据库
├── logs/ 运行日志
└── uploads/ 上传的 Excel 原件
跑源码时在 admin\data\;将来打包成 exe 后,在 exe 旁边。
用 DB Browser for SQLite 打开 admin.db 就能看数据。
每张表什么意思见 03 数据模型。
写代码时不要自己拼这个路径,用统一的
DataDir()函数, 见 02 架构 §6。
7. 拿样本数据试一下导入
蝦皮的真实报表不在仓库里——里面有逐商品的台币销售额,属于商业数据,
已在 .gitignore 里排除。
需要的话找项目负责人要一份,放到仓库根目录的 raw_data/ 下:
raw_data/蝦皮数据样本.xlsx
参考样本是 11287 行 = 5195 商品汇总行 + 6092 SKU 行, 导入后应得到 5195 条商品 + 6092 条 SKU。数字对不上就是解析有问题。
写自动化测试不要用这份大文件,用
admin/testdata/下已脱敏的小样本, 见 06 质量与安全 §2.1。
解析规则见 03 数据模型 §3.3,那里说明了为什么一个文件要拆成两张表。
8. 提交代码前的自检
cd D:\chengma\cmautobuy\admin
go vet ./... # 静态检查,有问题会打印出来
go build ./... # 能编译
go test ./... # 测试能过
三条都没报错就算通过。完整验证要求见 admin/AGENTS.md §验证。
9. 接下来读什么
| 我要做的事 | 读这份 |
|---|---|
| 改页面、加表格列 | 05 界面规范 |
| 加字段、改表、写 SQL | 03 数据模型 |
| 改给 Client 的接口 | 04 Client 接口实现 + Client 侧契约 |
| 改 Excel 导入 | 03 数据模型 §3.3 |
| 搞不清这功能要不要做 | 01 产品需求基线 |
无论做哪一样,都必须先看一遍 admin/AGENTS.md(技术栈和红线)。