docs: 定义 Admin 登录与账号管理基线 (#49)

This commit is contained in:
chengma
2026-08-09 13:12:03 +08:00
parent 6e6e99a5d7
commit fc03388ed4
5 changed files with 161 additions and 5 deletions
+46
View File
@@ -95,6 +95,7 @@ SQLite 同一时刻只允许一个写事务,连接放太开会互相抢锁、
| v3 | 把 PDD 采集数据从 `shopee_products` 拆到独立的 `pdd_products`(本文档 §4 描述的最终结构);重建 `shopee_products`,去掉已经搬走的四个字段;重建 `sku_mappings`,主键改成 `(shopee_sku_id, pdd_goods_id)`(§6.1 的理由)。 |
| v4 | `pdd_products` 增加可空的 `shop_name`;老数据保持 `NULL`。 |
| v5 | 顺运宝货运单同步(工单 #46):新增 `syb_session`(会话缓存)、`syb_sync_state`(同步进度)两张表;`syb_orders` 增加可空的 `product_spec`(规格原文)。三条都是新增,v1–v4 一个字节没改。 |
| v6(规划) | Admin 网页登录:新增 `users` 和 `web_sessions`。正式实现时只能在迁移末尾追加,不得提前改写 v1–v5。 |
**v3 为什么丢弃旧 `sku_mappings` 数据(见 #20):** 新主键需要 `pdd_option_key`,
这是 Go 的 `service.OptionKey()` 用 `json.Marshal` 算出来的规范化键,SQL 语句
@@ -707,3 +708,48 @@ Admin 和 Client **各有一个 SQLite,互不相通**,只通过接口交换
`[必须]` **两边的状态是两套,不要试图同步。**
Admin 只知道"发出去了 / 收到结果了",中间过程看不到,这是有意的设计。
## 12. Admin 用户和 Web Session(v6 规划)
`users` 保存网页登录账号。没有公开注册,第一条管理员记录只能由首次初始化流程创建。
```sql
CREATE TABLE users (
user_id TEXT PRIMARY KEY,
username TEXT NOT NULL COLLATE NOCASE UNIQUE,
password_hash TEXT NOT NULL,
role TEXT NOT NULL CHECK (role IN ('admin', 'purchaser')),
status TEXT NOT NULL CHECK (status IN ('active', 'disabled')),
last_login_at TEXT,
password_changed_at TEXT NOT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
```
- `password_hash` 只保存成熟密码哈希算法的结果,绝不保存或记录明文密码。
- 用户不做物理删除;离职或停用改为 `disabled`,保留任务和操作记录的可追溯性。
- 首次初始化必须在写事务中再次确认 `users` 为空;SQLite 同一时刻只有一个写事务,
并发提交最多一个成功。即使所有账号都被禁用,初始化入口也不能重新开放。
- 系统不能禁用最后一个有效管理员。
`web_sessions` 保存网页登录状态。数据库只保存随机 Session Token 的 SHA-256 哈希,
Cookie 原文不能进入数据库、日志或页面。
```sql
CREATE TABLE web_sessions (
session_hash TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
expires_at TEXT NOT NULL,
created_at TEXT NOT NULL,
last_seen_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
CREATE INDEX idx_web_sessions_user ON web_sessions(user_id);
CREATE INDEX idx_web_sessions_expiry ON web_sessions(expires_at);
```
- Session 使用固定过期时间,MVP 默认 12 小时,不做复杂刷新令牌。
- 退出登录、密码重置或账号禁用时,删除该用户对应的 Session 记录。
- 过期 Session 可以在登录、退出或定期维护时清理,不需要后台常驻线程。