query("SHOW TABLES LIKE 'users'"); return $stmt->fetch() !== false; } catch (\Throwable $e) { return false; } } public static function runMigration(): void { $db = Database::getInstance(); $db->exec("CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, role ENUM('admin','user') DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); $db->exec("CREATE TABLE IF NOT EXISTS sessions ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, name VARCHAR(100), provider VARCHAR(50), model VARCHAR(50), system_prompt TEXT, personality_id INT NULL, thinking_mode TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_user_id (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); $db->exec("CREATE TABLE IF NOT EXISTS messages ( id INT AUTO_INCREMENT PRIMARY KEY, session_id INT NOT NULL, role ENUM('user','assistant','system') NOT NULL, content LONGTEXT, file_info JSON, thinking_content LONGTEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_session_id (session_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); $db->exec("CREATE TABLE IF NOT EXISTS config ( id INT AUTO_INCREMENT PRIMARY KEY, config_key VARCHAR(50) UNIQUE NOT NULL, config_value LONGTEXT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); $db->exec("CREATE TABLE IF NOT EXISTS personalities ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, prompt TEXT NOT NULL, description TEXT, icon VARCHAR(50), is_preset TINYINT(1) DEFAULT 0, created_by INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); } public static function seedDefaults(): void { $db = Database::getInstance(); $presets = [ [ 'name' => '智能助手', 'prompt' => '你是一个全能的智能助手,善于回答各种问题,提供准确、有帮助的回答。', 'icon' => 'A', ], [ 'name' => '代码专家', 'prompt' => '你是一个专业的编程专家,精通多种编程语言和技术框架,擅长代码编写、调试和优化。', 'icon' => '', ], [ 'name' => '翻译官', 'prompt' => '你是一个专业的翻译官,精通中文、英文、日文等多种语言,提供准确、流畅的翻译服务。', 'icon' => 'T', ], [ 'name' => '写作助手', 'prompt' => '你是一个专业的写作助手,擅长各类文体的写作,包括文章、报告、邮件、创意写作等。', 'icon' => 'W', ], [ 'name' => '数学家', 'prompt' => '你是一个数学专家,精通各领域的数学知识,善于解答数学问题并提供详细的解题步骤。', 'icon' => 'M', ], ]; $stmt = $db->prepare('INSERT INTO personalities (name, prompt, description, icon, is_preset) VALUES (:name, :prompt, :description, :icon, :is_preset)'); foreach ($presets as $preset) { $stmt->execute([ 'name' => $preset['name'], 'prompt' => $preset['prompt'], 'description' => null, 'icon' => $preset['icon'], 'is_preset' => 1, ]); } $configStmt = $db->prepare('INSERT INTO config (config_key, config_value) VALUES (:config_key, :config_value) ON DUPLICATE KEY UPDATE config_value = VALUES(config_value)'); $configStmt->execute([ 'config_key' => 'providers', 'config_value' => '[]', ]); } }