133 lines
4.7 KiB
PHP
133 lines
4.7 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Config\Database;
|
|
use App\Models\Personality;
|
|
|
|
class Installer
|
|
{
|
|
public static function isInstalled(): bool
|
|
{
|
|
$configPath = dirname(__DIR__, 2) . '/config/db-config.json';
|
|
|
|
if (!file_exists($configPath)) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
$db = Database::getInstance();
|
|
$stmt = $db->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' => '[]',
|
|
]);
|
|
}
|
|
}
|