feat: 实现后端基础架构与 VOD 核心 API(Express + SQLite + JWT)

This commit is contained in:
2026-06-29 17:46:38 +06:00
parent 0192c313f4
commit da06866360
25 changed files with 10525 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
import fs from 'fs';
import path from 'path';
import sqlite3 from 'sqlite3';
import { open, Database } from 'sqlite';
import { config } from './config';
let db: Database<sqlite3.Database, sqlite3.Statement> | null = null;
export async function getDb(): Promise<Database<sqlite3.Database, sqlite3.Statement>> {
if (db) return db;
const dbDir = path.dirname(config.dbPath);
if (!fs.existsSync(dbDir)) {
fs.mkdirSync(dbDir, { recursive: true });
}
db = await open({
filename: config.dbPath,
driver: sqlite3.Database,
});
await initSchema();
return db;
}
async function initSchema(): Promise<void> {
const database = await getDb();
await database.exec(`
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
role TEXT NOT NULL DEFAULT 'admin',
created_at TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS accounts (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
access_key_id TEXT NOT NULL,
access_key_secret TEXT NOT NULL,
region TEXT NOT NULL,
endpoint TEXT,
is_active INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_accounts_active ON accounts(is_active);
CREATE TABLE IF NOT EXISTS operation_logs (
id TEXT PRIMARY KEY,
user_id TEXT,
username TEXT,
action TEXT NOT NULL,
target_type TEXT NOT NULL,
target_ids TEXT,
details TEXT,
created_at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_logs_created ON operation_logs(created_at);
CREATE INDEX IF NOT EXISTS idx_logs_action ON operation_logs(action);
`);
}