文件
freeshop/upgrade-staff.php
T
2026-08-16 16:52:43 +08:00

97 行
4.0 KiB
PHP
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
<?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>';
}