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