#46 的登录只有手工输验证码一条路,而会话 24 小时就过期——每天第一次 同步都得有人在场,将来也做不了定时同步。 docs/admin/08 §8 当时写死"不引入 OCR 服务",理由是"多一个必须先启动的 东西"。那条判断基于示例脚本里的 http://127.0.0.1:8000/ocr(本机服务)。 用户提供了托管地址后前提不成立,本工单推翻它——文档里改写并保留原文, 让后来人知道这个决定变过、为什么变。 OCR 优先、手工兜底:识别成功直接登录,失败或服务不可达降级到 #46 已有的 手工弹窗,并在弹窗里说明是"已尝试 N 次"还是"服务不可用"。手工路径不删, 外部服务挂了不该让整个同步功能不可用。 识别失败也是 code:200。实测拿无文字图片探测 https://ocr.ilapage.cn/ocr 返回 {"code":200,"message":"Success","data":""}——不是错误码。所以 Recognize 只负责"这次 HTTP 调用有没有问题",空 data 照常返回 (", nil), 业务校验交给调用方;空 data 和长度不对收敛到同一个 len(code) != 4, 一条规则覆盖两种情况。 不合格的验证码不拿去登录:白费一次尝试,且频繁错误登录可能触发风控。 审查时变异测试发现这条没有测试守着——原测试只断言"重新取图了"和 "最终登录成功",禁用长度校验后依然成立。已补 loginRecorder 记录每次 提交到 /am/auth/login 的 code,断言登录只被调用一次且提交的是合格的那个。 每次重试重新取图(同一张图再识别结果一样,且可能已被上次失败的登录作废); OCR 用独立 HTTP 客户端不带顺运宝 Cookie;验证码图片只在内存里传,不落盘。 OCR 不可达立即降级、不占用重试次数——对着连不上的地址重试 5 次, 操作员要等 50 秒才看到手工输入框,结果注定一样。 测试全部用 httptest,不打真实的 ocr.ilapage.cn 和 shunyunbaoerp.com。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
221 lines
8.5 KiB
Markdown
221 lines
8.5 KiB
Markdown
# 00 Admin 上手指南
|
||
|
||
- 文档状态:基线草案
|
||
- 读者:第一次接手 Admin 的开发者
|
||
- 目标:照着做完,能在自己电脑上把 Admin 跑起来,并知道下一步读哪份文档
|
||
|
||
这份文档只讲"怎么把环境搭好、怎么跑起来"。业务规则不在这里,见 [文档索引](../README.md)。
|
||
遇到不认识的词(货运单、upsert、SKU 映射……),先查 [术语表](00-glossary.md)。
|
||
|
||
## 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. 拉依赖
|
||
|
||
先配国内代理,否则大概率拉不动:
|
||
|
||
```powershell
|
||
go env -w GOPROXY=https://goproxy.cn,direct
|
||
```
|
||
|
||
正常情况下 `go.mod` 和 `go.sum` 已经在仓库里了,直接:
|
||
|
||
```powershell
|
||
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 了。
|
||
|
||
```powershell
|
||
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 的正常行为):
|
||
|
||
```powershell
|
||
go get github.com/xuri/excelize/v2@v2.9.1
|
||
```
|
||
|
||
这三个是**在 Go 1.23.0 下实测能编译通过的最高版本**,
|
||
为什么不能更高见 [admin/AGENTS.md](../../admin/AGENTS.md) 技术栈一节。
|
||
|
||
`[必须]` `go.mod` 和 `go.sum` 都要提交 Git,否则别人拉下来版本对不上。
|
||
|
||
> SQLite 驱动**不要**换成 `mattn/go-sqlite3`,那个需要 cgo,
|
||
> 得装 gcc,还会让 `go build` 出不了单文件 exe。
|
||
|
||
## 3. 跑起来
|
||
|
||
推荐在仓库根目录运行热重载脚本:
|
||
|
||
```powershell
|
||
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` 停止。
|
||
|
||
如果只想临时运行一次、不需要热重载,也可以:
|
||
|
||
```powershell
|
||
cd D:\chengma\cmautobuy\admin
|
||
go run .
|
||
```
|
||
|
||
然后浏览器打开 <http://localhost:8080>。
|
||
|
||
**这个命令是安全的**:Admin 只管理数据,不会连手机、不会下单。放心随便跑。
|
||
|
||
### 配置顺运宝账号(同步货运单需要,其余四个模块不需要)
|
||
|
||
顺运宝数据页的「同步」需要读 `admin/config.yaml`。第一次用要自己建这个文件
|
||
(已在 `.gitignore` 里,不会被提交):
|
||
|
||
```powershell
|
||
cd D:\chengma\cmautobuy\admin
|
||
copy config.example.yaml config.yaml
|
||
```
|
||
|
||
用编辑器打开 `config.yaml`,把 `username` / `password` 改成真实的顺运宝账号密码。
|
||
|
||
`[必须]` 密码要加引号,纯数字密码不加引号会被 YAML 解析成整数,前导 0 也会丢:
|
||
|
||
```yaml
|
||
password: "0012345" # ✓ 正确
|
||
password: 0012345 # ✗ 解析成整数 12345
|
||
```
|
||
|
||
没有这个文件时,点「同步」会提示"没有找到配置文件……请复制
|
||
config.example.yaml",不是一句读不出原因的报错。
|
||
|
||
`config.yaml` 里还有两个和验证码自动识别相关的配置(工单 #47):
|
||
|
||
```yaml
|
||
syb:
|
||
ocr_url: https://ocr.ilapage.cn/ocr # 留空则只用手工输入弹窗,不报错
|
||
ocr_max_attempts: 5 # 识别失败的重试次数上限
|
||
```
|
||
|
||
配了 `ocr_url` 后,会话过期时点「同步」会先自动识别验证码登录,
|
||
无需人在场;识别失败或服务连不上会自动降级到手工输入弹窗,弹窗里
|
||
会说明降级原因。`ocr_url` 留空就和 #46 时一样,一直走手工输入。
|
||
|
||
`[必须]` 验证码图片会被发送到 `ocr_url` 配置的地址,见
|
||
[08 顺运宝接口](08-顺运宝接口.md) §8.1。
|
||
|
||
接口细节和这几个配置项各自的含义见
|
||
[08 顺运宝接口](08-顺运宝接口.md) §8、§8.1。
|
||
|
||
## 4. 你应该看到什么
|
||
|
||
左边(或顶部)是五个模块的导航:
|
||
|
||
| 模块 | 干什么的 |
|
||
|---|---|
|
||
| 蝦皮数据 | 导入蝦皮商品报表,填 PDD 链接,发起采集 |
|
||
| PDD 商品 | 维护拼多多商品档案,发起采集,查看采回来的规格价格。这个页面不依赖蝦皮和顺运宝的任何数据,单独就能跑通"建商品 → 建采集任务 → 领走执行 → 提交结果 → 显示已采集"这条闭环,见 [05 界面规范](05-ui-specification.md) §5 |
|
||
| 顺运宝数据 | 同步货运单(需要先配置 `config.yaml`,见上一节)。规格匹配和生成采购任务是后续工单的范围,本页暂不提供 |
|
||
| 采集采购 | 看采集和采购任务执行到哪一步了 |
|
||
| 客户端列表 | 看哪些客户端在干活 |
|
||
|
||
每个页面都是同一个结构:**上面工具条 / 中间表格 / 下面状态条**。
|
||
五个页面长得像是故意的,见 [05 界面规范](05-ui-specification.md)。
|
||
|
||
## 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](06-quality-security.md) §2 |
|
||
|
||
## 6. 数据库在哪、怎么看
|
||
|
||
跟 Client 一样是**便携模式**——数据都在程序旁边的 `data/` 里:
|
||
|
||
```text
|
||
admin/data/
|
||
├── admin.db 数据库
|
||
├── logs/ 运行日志
|
||
└── uploads/ 上传的 Excel 原件
|
||
```
|
||
|
||
跑源码时在 `admin\data\`;将来打包成 exe 后,在 exe 旁边。
|
||
|
||
用 **DB Browser for SQLite** 打开 `admin.db` 就能看数据。
|
||
每张表什么意思见 [03 数据模型](03-data-model.md)。
|
||
|
||
> 写代码时**不要自己拼这个路径**,用统一的 `DataDir()` 函数,
|
||
> 见 [02 架构](02-architecture.md) §6。
|
||
|
||
## 7. 拿样本数据试一下导入
|
||
|
||
蝦皮的真实报表**不在仓库里**——里面有逐商品的台币销售额,属于商业数据,
|
||
已在 `.gitignore` 里排除。
|
||
|
||
需要的话**找项目负责人要一份**,放到仓库根目录的 `raw_data/` 下:
|
||
|
||
```text
|
||
raw_data/蝦皮数据样本.xlsx
|
||
```
|
||
|
||
参考样本是 11287 行 = 5195 商品汇总行 + 6092 SKU 行,
|
||
导入后应得到 **5195 条商品 + 6092 条 SKU**。数字对不上就是解析有问题。
|
||
|
||
> 写自动化测试**不要**用这份大文件,用 `admin/testdata/` 下已脱敏的小样本,
|
||
> 见 [06 质量与安全](06-quality-security.md) §2.1。
|
||
|
||
解析规则见 [03 数据模型](03-data-model.md) §3.3,那里说明了为什么一个文件要拆成两张表。
|
||
|
||
## 8. 提交代码前的自检
|
||
|
||
```powershell
|
||
cd D:\chengma\cmautobuy\admin
|
||
|
||
go vet ./... # 静态检查,有问题会打印出来
|
||
go build ./... # 能编译
|
||
go test ./... # 测试能过
|
||
```
|
||
|
||
三条都没报错就算通过。完整验证要求见 [admin/AGENTS.md](../../admin/AGENTS.md) §验证。
|
||
|
||
## 9. 接下来读什么
|
||
|
||
| 我要做的事 | 读这份 |
|
||
|---|---|
|
||
| 改页面、加表格列 | [05 界面规范](05-ui-specification.md) |
|
||
| 加字段、改表、写 SQL | [03 数据模型](03-data-model.md) |
|
||
| 改给 Client 的接口 | [04 Client 接口实现](04-client-api.md) + [Client 侧契约](../client/04-admin-api-contract.md) |
|
||
| 改 Excel 导入 | [03 数据模型](03-data-model.md) §3.3 |
|
||
| 搞不清这功能要不要做 | [01 产品需求基线](01-requirements.md) |
|
||
|
||
无论做哪一样,都必须先看一遍 [admin/AGENTS.md](../../admin/AGENTS.md)(技术栈和红线)。
|