Files
ClassManager/frontend/api/check_upgrade.php
2026-05-26 13:47:01 +08:00

104 lines
3.1 KiB
PHP

<?php
/**
* 检查数据库版本是否需要升级
* 返回 JSON: {needs_upgrade: bool, current: string, target: string}
*/
require_once __DIR__ . '/../config.php';
header('Content-Type: application/json; charset=utf-8');
// 只有班主任才能检查升级
if (!isset($_SESSION['user_id']) || $_SESSION['user_type'] !== 'admin') {
echo json_encode(['error' => '未授权']);
exit();
}
$role = $_SESSION['role'] ?? '';
if ($role !== '班主任') {
echo json_encode(['needs_upgrade' => false]);
exit();
}
// 读取后端 .env 获取数据库配置
$envPath = __DIR__ . '/../../backend/.env';
if (!file_exists($envPath)) {
echo json_encode(['error' => '数据库配置文件不存在']);
exit();
}
$lines = file($envPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$dbConfig = [];
foreach ($lines as $line) {
$line = trim($line);
if ($line === '' || strpos($line, '#') === 0) {
continue;
}
if (strpos($line, '=') !== false) {
list($key, $value) = explode('=', $line, 2);
$dbConfig[trim($key)] = trim($value);
}
}
$required = ['DB_HOST', 'DB_PORT', 'DB_USER', 'DB_PASSWORD', 'DB_NAME'];
foreach ($required as $key) {
if (!isset($dbConfig[$key]) || $dbConfig[$key] === '') {
echo json_encode(['error' => "缺少数据库配置: {$key}"]);
exit();
}
}
try {
$dsn = "mysql:host={$dbConfig['DB_HOST']};port={$dbConfig['DB_PORT']};dbname={$dbConfig['DB_NAME']};charset=utf8mb4";
$pdo = new PDO($dsn, $dbConfig['DB_USER'], $dbConfig['DB_PASSWORD'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
// 检测当前版本
$currentVersion = '0.0.0';
try {
$stmt = $pdo->query("SELECT setting_value FROM system_settings WHERE setting_key = 'db_version'");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row) {
$currentVersion = $row['setting_value'];
}
} catch (PDOException $e) {
// 表不存在,使用默认值
}
// 读取目标版本
$versionFile = __DIR__ . '/../../VERSION';
if (!file_exists($versionFile)) {
echo json_encode(['error' => 'VERSION 文件不存在']);
exit();
}
$targetVersion = trim(file_get_contents($versionFile));
$needsUpgrade = version_compare($targetVersion, $currentVersion, '>');
$allVersions = [
'1.7' => 'v1.7.sql',
'1.8' => 'v1.8.sql',
'2.0' => 'v2.0.sql',
'2.0.1' => 'v2.0.1.sql',
'2.1' => 'v2.1.sql',
];
$steps = [];
foreach ($allVersions as $version => $file) {
if (version_compare($version, $currentVersion, '>') &&
version_compare($version, $targetVersion, '<=')) {
$steps[] = ['version' => $version, 'file' => $file];
}
}
usort($steps, function($a, $b) { return version_compare($a['version'], $b['version']); });
echo json_encode([
'needs_upgrade' => $needsUpgrade,
'current' => $currentVersion,
'target' => $targetVersion,
'steps' => $steps
]);
} catch (PDOException $e) {
echo json_encode(['error' => '数据库连接失败: ' . $e->getMessage()]);
}