# 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` 有输出 | | MySQL Client | 8.4 | 用于连接独立的 MySQL 8.4 开发/测试库 | 版本已定为 **go1.23.0**,写在 `admin/go.mod` 里。低于这个版本可能编译不过。 **不需要装 gcc。** 生产 MySQL 驱动和历史 SQLite 迁移驱动都是纯 Go; `go build` 不依赖 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 get github.com/go-sql-driver/mysql@v1.9.2 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,否则别人拉下来版本对不上。 > `go-sql-driver/mysql` v1.9.3 起要求 Go 1.24,本项目固定 v1.9.2。 > SQLite 驱动只用于历史库迁移,仍不要换成需要 cgo 的 `mattn/go-sqlite3`。 ## 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 . ``` 然后浏览器打开 。 **这个命令是安全的**:Admin 只管理数据,不会连手机、不会下单。放心随便跑。 ### 配置 MySQL 和顺运宝账号 顺运宝数据页的「同步」需要读 `admin/config.yaml`。第一次用要自己建这个文件 (已在 `.gitignore` 里,不会被提交): ```powershell cd D:\chengma\cmautobuy\admin copy config.example.yaml config.yaml ``` 用编辑器打开 `config.yaml`: - `database:` 填 MySQL 8 的地址、数据库名、账号和密码,Admin 启动必须使用; - `syb:` 填顺运宝账号密码,只在同步货运单时使用。 两个密码都是明文,只允许保存在这份被 Git 忽略的本机文件里,不得提交、打包、 截图或粘贴到日志和工单。 `[必须]` 密码要加引号,纯数字密码不加引号会被 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. 数据库在哪里、怎样配置 生产数据在 MySQL 8.4 中。Windows 本地运行可以直接在被 Git 忽略的 `admin/config.yaml` 中配置: ```yaml database: host: 127.0.0.1 port: "3307" name: autobuy user: buy tls_mode: disabled tls_ca: certs/mysql84-ca.pem password: "从安全渠道取得" ``` Admin 本地开发连接线上 MySQL 时优先通过 SSH 隧道,把 `port` 改为隧道的本地 端口。项目负责人已于 2026-08-11 批准生产 3307 接受所有公网来源;公网直连仍只能 使用限定 `autobuy` 库权限、`REQUIRE SSL` 的专用业务账号,root 只允许服务器本机 登录。公网暴露风险高于固定 `/32`,恢复固定出口 IP 后应优先收紧白名单。 - 同机或 SSH 隧道:`tls_mode: disabled`; - 公网直连:`tls_mode: verify_ca`,`tls_ca` 指向服务器公开 CA。客户端要求 TLS 1.2+ 并校验证书链,失败时不会回退明文。CA 证书可以公开,私钥绝不能复制到客户端。 线上 systemd 部署继续使用环境变量: ```text CMAUTOBUY_DB_HOST=127.0.0.1 CMAUTOBUY_DB_PORT=3307 CMAUTOBUY_DB_NAME=<独立数据库名> CMAUTOBUY_DB_USER=<最小权限账号> CMAUTOBUY_DB_PASSWORD=<从安全渠道取得> CMAUTOBUY_DB_TLS_MODE=disabled CMAUTOBUY_DB_TLS_CA= ``` 环境变量按字段覆盖 `config.yaml`,所以现有线上部署方式不受影响。生产环境文件和 本地 `config.yaml` 都不得进入仓库、日志或工单;本地自动化测试仍通过 SSH 隧道 连接独立的 `_test` 数据库,不得对生产 `autobuy` 执行清理测试。 程序旁边的 `data/` 只保留日志、上传文件和迁移前的 SQLite 只读备份: ```text admin/data/ ├── backup/ 迁移前的 admin.db 只读备份 ├── logs/ 运行日志 └── uploads/ 上传的 Excel 原件 ``` 跑源码时在 `admin\data\`;将来打包成 exe 后,在 exe 旁边。 每张表什么意思见 [03 数据模型](03-data-model.md)。旧 `admin.db` 只能通过 单向迁移命令读取,生产 Admin 不再直接打开它。具体操作见 [09 SQLite 单向迁移到 MySQL 8](09-sqlite迁移到mysql.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)(技术栈和红线)。