feat: M0-M2 骨架落地(服务端/前端/宿主/数据库/积分引擎)
- server: Go 单二进制骨架,embed 内嵌前端,配置/迁移/HTTP 路由 - store: system.db + event.db 两套迁移,业务表 + 种子数据 - domain: 积分引擎(并列三口径/计分通道/流水/排名/破纪录)+ 68 个测试 - web: Vite + Vue 三入口骨架 + shared 层(类型/API/WebSocket 客户端) - console: Electron 宿主骨架(选屏/防熄屏/进程守护/托盘)
This commit is contained in:
1 parent
a61d793d79
commit
7d5d94f815
76 files changed
+10131
No files matched your search
@@ -0,0 +1,6 @@
|
||||
-- 系统级配置:键值对
|
||||
CREATE TABLE IF NOT EXISTS settings (
|
||||
key TEXT PRIMARY KEY,
|
||||
value TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
@@ -0,0 +1,16 @@
|
||||
-- 登录用户。
|
||||
-- role 不含 guest:guest 是「未登录」的默认身份,不落库(见 08-安全与可靠性 第 2 节)。
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT NOT NULL UNIQUE,
|
||||
password_hash TEXT NOT NULL,
|
||||
display_name TEXT NOT NULL DEFAULT '',
|
||||
role TEXT NOT NULL DEFAULT 'recorder' CHECK (role IN ('recorder', 'admin')),
|
||||
active INTEGER NOT NULL DEFAULT 1 CHECK (active IN (0, 1)),
|
||||
must_change_password INTEGER NOT NULL DEFAULT 1 CHECK (must_change_password IN (0, 1)),
|
||||
last_login_at TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_users_active ON users(active);
|
||||
@@ -0,0 +1,14 @@
|
||||
-- 服务端会话;id 为随机字符串,token 只存哈希,便于强制下线。
|
||||
CREATE TABLE IF NOT EXISTS sessions (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id),
|
||||
token_hash TEXT NOT NULL UNIQUE,
|
||||
expires_at TEXT NOT NULL,
|
||||
ip TEXT,
|
||||
user_agent TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
last_seen_at TEXT
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at);
|
||||
@@ -0,0 +1,11 @@
|
||||
-- 最近打开的赛事项目;启动时取 last_opened_at 最新的一条自动打开。
|
||||
CREATE TABLE IF NOT EXISTS recent_projects (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
project TEXT NOT NULL UNIQUE, -- data/event_projs/<项目名>
|
||||
name TEXT NOT NULL DEFAULT '', -- 展示名,冗余自赛事库 settings
|
||||
db_path TEXT NOT NULL, -- 相对数据根目录的 event.db 路径
|
||||
open_count INTEGER NOT NULL DEFAULT 1,
|
||||
last_opened_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_recent_projects_last_opened ON recent_projects(last_opened_at DESC);
|
||||
@@ -0,0 +1,8 @@
|
||||
-- 系统级默认配置;赛事级配置在 event.db 的 settings 里,两者不共用。
|
||||
INSERT OR IGNORE INTO settings (key, value) VALUES
|
||||
('app.name', '赛事积分榜系统'),
|
||||
('app.locale', 'zh-CN'),
|
||||
('security.session_hours', '12'),
|
||||
('security.login_rate_per_minute', '5'),
|
||||
('backup.interval_minutes', '5'),
|
||||
('backup.keep', '20');
|
||||
Reference in new issue
Block a user