- Add user management with roles and permissions (RBAC) - Implement OAuth2 service provider supporting 4 grant types: authorization_code, password, client_credentials, refresh_token - Add JWT authentication with 7-day expiry - Add admin API for users, roles and OAuth clients management - Add CLI tool for user management (scripts/user-cli.js) - Add collapsible sidebar layout with login dialog - Add user management page and OAuth client management page - Add server middleware for auth token verification - Add seed script for initial data (admin/admin123)
144 lines
4.2 KiB
TypeScript
144 lines
4.2 KiB
TypeScript
import Database from 'better-sqlite3'
|
|
import { join, dirname } from 'path'
|
|
import { fileURLToPath } from 'url'
|
|
import fs from 'fs'
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
const projectRoot = join(__dirname, '..', '..')
|
|
const dataDir = join(projectRoot, 'data')
|
|
const dbPath = join(dataDir, 'sports.db')
|
|
|
|
if (!fs.existsSync(dataDir)) {
|
|
fs.mkdirSync(dataDir, { recursive: true })
|
|
}
|
|
|
|
const db = new Database(dbPath)
|
|
|
|
// 初始化数据库表
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS events (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
category TEXT NOT NULL,
|
|
event_group TEXT NOT NULL,
|
|
unit TEXT NOT NULL,
|
|
status TEXT DEFAULT 'pending',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS teams (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
team_group TEXT NOT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS results (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
event_id INTEGER NOT NULL,
|
|
team_id INTEGER NOT NULL,
|
|
score TEXT NOT NULL,
|
|
rank INTEGER,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (event_id) REFERENCES events(id),
|
|
FOREIGN KEY (team_id) REFERENCES teams(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS team_scores (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
team_id INTEGER NOT NULL,
|
|
total_score INTEGER DEFAULT 0,
|
|
gold_count INTEGER DEFAULT 0,
|
|
silver_count INTEGER DEFAULT 0,
|
|
bronze_count INTEGER DEFAULT 0,
|
|
FOREIGN KEY (team_id) REFERENCES teams(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS roles (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT UNIQUE NOT NULL,
|
|
description TEXT,
|
|
permissions TEXT DEFAULT '[]',
|
|
is_system INTEGER DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT UNIQUE NOT NULL,
|
|
email TEXT UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
real_name TEXT,
|
|
avatar TEXT,
|
|
role_id INTEGER DEFAULT 2,
|
|
status TEXT DEFAULT 'active',
|
|
last_login DATETIME,
|
|
login_attempts INTEGER DEFAULT 0,
|
|
locked_until DATETIME,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (role_id) REFERENCES roles(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS oauth_clients (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
client_id TEXT UNIQUE NOT NULL,
|
|
client_secret_hash TEXT NOT NULL,
|
|
client_name TEXT NOT NULL,
|
|
redirect_uris TEXT DEFAULT '[]',
|
|
allowed_scopes TEXT DEFAULT '[]',
|
|
grant_types TEXT DEFAULT '[]',
|
|
platform TEXT DEFAULT 'web',
|
|
is_active INTEGER DEFAULT 1,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS oauth_tokens (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER,
|
|
client_id TEXT NOT NULL,
|
|
access_token TEXT UNIQUE NOT NULL,
|
|
refresh_token TEXT UNIQUE,
|
|
token_type TEXT DEFAULT 'Bearer',
|
|
scope TEXT,
|
|
expires_at DATETIME NOT NULL,
|
|
revoked INTEGER DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (client_id) REFERENCES oauth_clients(client_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS oauth_codes (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
code TEXT UNIQUE NOT NULL,
|
|
user_id INTEGER NOT NULL,
|
|
client_id TEXT NOT NULL,
|
|
redirect_uri TEXT NOT NULL,
|
|
scope TEXT,
|
|
code_challenge TEXT,
|
|
code_challenge_method TEXT,
|
|
expires_at DATETIME NOT NULL,
|
|
used INTEGER DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (client_id) REFERENCES oauth_clients(client_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS oauth_sessions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
session_id TEXT UNIQUE NOT NULL,
|
|
user_id INTEGER NOT NULL,
|
|
client_id TEXT NOT NULL,
|
|
device_info TEXT,
|
|
ip_address TEXT,
|
|
last_activity DATETIME,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (client_id) REFERENCES oauth_clients(client_id)
|
|
);
|
|
`)
|
|
|
|
export default db
|