初始化仓库及v1.0.0提交

This commit is contained in:
2026-05-05 03:21:58 +08:00
commit 813bb02672
67 changed files with 5263 additions and 0 deletions

132
app/Services/Installer.php Normal file
View File

@@ -0,0 +1,132 @@
<?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' => '🤖',
],
[
'name' => '代码专家',
'prompt' => '你是一个专业的编程专家,精通多种编程语言和技术框架,擅长代码编写、调试和优化。',
'icon' => '💻',
],
[
'name' => '翻译官',
'prompt' => '你是一个专业的翻译官,精通中文、英文、日文等多种语言,提供准确、流畅的翻译服务。',
'icon' => '🌐',
],
[
'name' => '写作助手',
'prompt' => '你是一个专业的写作助手,擅长各类文体的写作,包括文章、报告、邮件、创意写作等。',
'icon' => '✍️',
],
[
'name' => '数学家',
'prompt' => '你是一个数学专家,精通各领域的数学知识,善于解答数学问题并提供详细的解题步骤。',
'icon' => '🔢',
],
];
$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' => '[]',
]);
}
}