feat: 实现 Admin 首次初始化与网页登录 (#50)
This commit is contained in:
+36
-1
@@ -264,7 +264,7 @@ var migrations = [][]string{
|
||||
// 背景见 #20:v1 曾经被原地改写而不是新增版本,导致已经建过库的机器
|
||||
// (user_version 已经越过 v1)永远不会重跑改写后的语句,程序拿着一个
|
||||
// 和代码对不上的库静默启动。
|
||||
const schemaVersion = 5
|
||||
const schemaVersion = 6
|
||||
|
||||
// migrationV4 给 PDD 商品增加店铺名。
|
||||
//
|
||||
@@ -300,6 +300,32 @@ var migrationV5 = []string{
|
||||
`ALTER TABLE syb_orders ADD COLUMN product_spec TEXT;`,
|
||||
}
|
||||
|
||||
// migrationV6 增加 Admin 网页账号和 Session。只追加新表和索引,
|
||||
// v1-v5 的任何语句都不修改,见工单 #50。
|
||||
var migrationV6 = []string{
|
||||
`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
|
||||
);`,
|
||||
`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);`,
|
||||
}
|
||||
|
||||
// Migrate 把数据库升到最新版本。
|
||||
// 已经是最新的就什么都不做,可以重复调用。
|
||||
func Migrate(db *sql.DB) error {
|
||||
@@ -362,6 +388,14 @@ func Migrate(db *sql.DB) error {
|
||||
if err := runSQLMigration(db, 5, migrationV5); err != nil {
|
||||
return err
|
||||
}
|
||||
reached = 5
|
||||
}
|
||||
|
||||
// v6 是纯追加的用户和 Web Session 表。
|
||||
if reached < 6 {
|
||||
if err := runSQLMigration(db, 6, migrationV6); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -823,6 +857,7 @@ var requiredTables = []string{
|
||||
"syb_orders", "sku_mappings", "tasks", "clients",
|
||||
"idempotency_keys", "task_claims",
|
||||
"syb_session", "syb_sync_state",
|
||||
"users", "web_sessions",
|
||||
}
|
||||
|
||||
// requiredColumns 只列出不能靠“表存在”发现的关键追加列。
|
||||
|
||||
Reference in New Issue
Block a user