97 行
4.0 KiB
PHP
97 行
4.0 KiB
PHP
<?php
|
||
error_reporting(E_ALL);
|
||
ini_set('display_errors', '1');
|
||
define('IN_APP', true);
|
||
$root = __DIR__;
|
||
$configFile = $root . '/config.php';
|
||
if (!file_exists($configFile)) {
|
||
die("未找到 config.php,请在商城根目录(含 config.php 的目录)下运行本脚本。\n");
|
||
}
|
||
require_once $configFile;
|
||
require_once $root . '/includes/db.php';
|
||
$pdo = db();
|
||
$prefix = defined('DB_PREFIX') ? DB_PREFIX : '';
|
||
$steps = [];
|
||
function upLog(&$arr, $msg, $ok = true) { $arr[] = ['msg' => $msg, 'ok' => $ok]; }
|
||
function colExists($pdo, $table, $col)
|
||
{
|
||
$stmt = $pdo->prepare(
|
||
'SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND COLUMN_NAME = ?'
|
||
);
|
||
$stmt->execute([DB_NAME, $table, $col]);
|
||
return (bool) $stmt->fetchColumn();
|
||
}
|
||
function tableExists($pdo, $table)
|
||
{
|
||
$stmt = $pdo->prepare(
|
||
'SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?'
|
||
);
|
||
$stmt->execute([DB_NAME, $table]);
|
||
return (bool) $stmt->fetchColumn();
|
||
}
|
||
$tUsers = $prefix . 'users';
|
||
if (!colExists($pdo, $tUsers, 'role')) {
|
||
$pdo->exec(
|
||
"ALTER TABLE `{$tUsers}` ADD COLUMN `role` VARCHAR(10) NOT NULL DEFAULT 'user' "
|
||
. "COMMENT 'admin管理员 cs客服 user普通用户' AFTER `is_admin`"
|
||
);
|
||
upLog($steps, "已为 users 表新增 role 字段(默认 user)");
|
||
} else {
|
||
upLog($steps, "users.role 字段已存在,跳过");
|
||
}
|
||
$affected = $pdo->exec(
|
||
"UPDATE `{$tUsers}` SET role='admin' WHERE is_admin=1 AND (role IS NULL OR role='' OR role='user')"
|
||
);
|
||
upLog($steps, "已将 {$affected} 个 is_admin=1 的账号的 role 置为 admin(客服/普通用户不受影响)");
|
||
$tTickets = $prefix . 'tickets';
|
||
if (!colExists($pdo, $tTickets, 'assignee_id')) {
|
||
$pdo->exec(
|
||
"ALTER TABLE `{$tTickets}` ADD COLUMN `assignee_id` INT UNSIGNED DEFAULT NULL "
|
||
. "COMMENT '负责人(客服/管理员)用户ID,NULL=未分配'"
|
||
);
|
||
$pdo->exec("ALTER TABLE `{$tTickets}` ADD KEY `idx_assignee` (`assignee_id`)");
|
||
upLog($steps, "已为 tickets 表新增 assignee_id 字段及索引");
|
||
} else {
|
||
upLog($steps, "tickets.assignee_id 字段已存在,跳过");
|
||
}
|
||
$tReplies = $prefix . 'ticket_replies';
|
||
if (!tableExists($pdo, $tReplies)) {
|
||
$pdo->exec(
|
||
"CREATE TABLE `{$tReplies}` (
|
||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||
`ticket_id` INT UNSIGNED NOT NULL,
|
||
`user_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '回复人 user_id(管理员/客服回复时填其 id)',
|
||
`is_admin` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1=管理员/客服回复 0=用户回复',
|
||
`message` TEXT NOT NULL,
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_ticket` (`ticket_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
|
||
);
|
||
upLog($steps, "已创建 ticket_replies 表");
|
||
} else {
|
||
upLog($steps, "ticket_replies 表已存在,跳过");
|
||
}
|
||
if (PHP_SAPI === 'cli') {
|
||
foreach ($steps as $s) {
|
||
echo ($s['ok'] ? '[OK] ' : '[!!] ') . $s['msg'] . "\n";
|
||
}
|
||
echo "升级完成。\n";
|
||
} else {
|
||
header('Content-Type: text/html; charset=utf-8');
|
||
echo '<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8">'
|
||
. '<meta name="viewport" content="width=device-width, initial-scale=1">'
|
||
. '<title>数据库升级</title><style>'
|
||
. 'body{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;max-width:760px;margin:40px auto;padding:0 16px;color:
|
||
. 'h1{color:
|
||
. '.step b{color:
|
||
. '</style></head><body>';
|
||
echo '<h1>数据库结构升级</h1>';
|
||
foreach ($steps as $s) {
|
||
echo '<div class="step"><b>✓</b>' . htmlspecialchars($s['msg'], ENT_QUOTES) . '</div>';
|
||
}
|
||
echo '<div class="tip"><strong>升级完成,建议立即删除本文件(upgrade-staff.php)</strong>,避免被他人重复访问。'
|
||
. '若结构已是最新,重复运行同样安全。</div>';
|
||
echo '</body></html>';
|
||
}
|