update: 表改动 主页改动
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
victo
2026-04-14 18:58:33 +08:00
parent 0981d6ee1b
commit 3d6f31433a
37 changed files with 2594 additions and 699 deletions

View File

@@ -0,0 +1,5 @@
CREATE TABLE IF NOT EXISTS schema_migrations (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
applied_at TEXT NOT NULL
);

View File

@@ -0,0 +1,16 @@
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
token_version INTEGER NOT NULL DEFAULT 1,
display_name TEXT NOT NULL,
login_provider TEXT NOT NULL DEFAULT 'password',
account_status TEXT NOT NULL DEFAULT 'active',
phone_number TEXT,
phone_verified_at TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS users_phone_number_unique_idx
ON users (phone_number);

View File

@@ -0,0 +1,10 @@
CREATE TABLE IF NOT EXISTS save_snapshots (
user_id TEXT PRIMARY KEY,
version INTEGER NOT NULL,
saved_at TEXT NOT NULL,
bottom_tab TEXT NOT NULL,
game_state_json JSONB NOT NULL,
current_story_json JSONB,
updated_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

View File

@@ -0,0 +1,6 @@
CREATE TABLE IF NOT EXISTS runtime_settings (
user_id TEXT PRIMARY KEY,
music_volume REAL NOT NULL,
updated_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

View File

@@ -0,0 +1,24 @@
CREATE TABLE IF NOT EXISTS custom_world_profiles (
user_id TEXT NOT NULL,
profile_id TEXT NOT NULL,
payload_json JSONB NOT NULL,
visibility TEXT NOT NULL DEFAULT 'draft',
published_at TEXT,
author_display_name TEXT NOT NULL DEFAULT '玩家',
world_name TEXT NOT NULL DEFAULT '',
subtitle TEXT NOT NULL DEFAULT '',
summary_text TEXT NOT NULL DEFAULT '',
cover_image_src TEXT,
theme_mode TEXT NOT NULL DEFAULT 'mythic',
playable_npc_count INTEGER NOT NULL DEFAULT 0,
landmark_count INTEGER NOT NULL DEFAULT 0,
updated_at TEXT NOT NULL,
PRIMARY KEY (user_id, profile_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS custom_world_profiles_user_updated_idx
ON custom_world_profiles (user_id, updated_at DESC);
CREATE INDEX IF NOT EXISTS custom_world_profiles_published_idx
ON custom_world_profiles (visibility, published_at DESC, updated_at DESC);

View File

@@ -0,0 +1,24 @@
CREATE TABLE IF NOT EXISTS auth_identities (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
provider TEXT NOT NULL,
provider_uid TEXT NOT NULL,
provider_unionid TEXT,
display_name TEXT,
avatar_url TEXT,
is_verified BOOLEAN NOT NULL DEFAULT TRUE,
meta_json JSONB,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE UNIQUE INDEX IF NOT EXISTS auth_identities_provider_uid_unique_idx
ON auth_identities (provider, provider_uid);
CREATE UNIQUE INDEX IF NOT EXISTS auth_identities_provider_unionid_unique_idx
ON auth_identities (provider, provider_unionid)
WHERE provider_unionid IS NOT NULL;
CREATE INDEX IF NOT EXISTS auth_identities_user_idx
ON auth_identities (user_id, provider);

View File

@@ -0,0 +1,17 @@
CREATE TABLE IF NOT EXISTS user_sessions (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
refresh_token_hash TEXT NOT NULL UNIQUE,
client_type TEXT NOT NULL,
user_agent TEXT,
ip TEXT,
expires_at TEXT NOT NULL,
revoked_at TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
last_seen_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS user_sessions_user_idx
ON user_sessions (user_id, expires_at DESC);

View File

@@ -0,0 +1,14 @@
CREATE TABLE IF NOT EXISTS auth_audit_logs (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
event_type TEXT NOT NULL,
detail TEXT NOT NULL,
ip TEXT,
user_agent TEXT,
meta_json JSONB,
created_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS auth_audit_logs_user_created_idx
ON auth_audit_logs (user_id, created_at DESC);

View File

@@ -0,0 +1,16 @@
CREATE TABLE IF NOT EXISTS sms_auth_events (
id TEXT PRIMARY KEY,
phone_number TEXT NOT NULL,
scene TEXT NOT NULL,
action TEXT NOT NULL,
success BOOLEAN NOT NULL,
ip TEXT,
user_agent TEXT,
created_at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS sms_auth_events_phone_created_idx
ON sms_auth_events (phone_number, created_at DESC);
CREATE INDEX IF NOT EXISTS sms_auth_events_ip_created_idx
ON sms_auth_events (ip, created_at DESC);

View File

@@ -0,0 +1,13 @@
CREATE TABLE IF NOT EXISTS auth_risk_blocks (
id TEXT PRIMARY KEY,
scope_type TEXT NOT NULL,
scope_key TEXT NOT NULL,
reason TEXT NOT NULL,
expires_at TEXT NOT NULL,
lifted_at TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS auth_risk_blocks_scope_idx
ON auth_risk_blocks (scope_type, scope_key, expires_at DESC);

View File

@@ -0,0 +1,8 @@
# Final Schema SQL
This folder contains the final PostgreSQL table definitions, one table per file.
Notes:
- These files keep only the final schema shape.
- They do not preserve historical migration steps.
- The current runtime migration logic in `server-node/src/db/migrations.ts` is unchanged.