141 行
4.8 KiB
PHP
141 行
4.8 KiB
PHP
<?php
|
||
/**
|
||
* 手动执行 Shopro 菜单/功能升级
|
||
*
|
||
* 用法(在项目根目录):
|
||
* php addons/shopro/upgrade_distribution.php
|
||
*/
|
||
|
||
if (PHP_SAPI !== 'cli') {
|
||
http_response_code(403);
|
||
exit("请通过命令行运行:php addons/shopro/upgrade_distribution.php\n");
|
||
}
|
||
|
||
define('APP_PATH', __DIR__ . '/../../application/');
|
||
define('ROOT_PATH', __DIR__ . '/../../');
|
||
|
||
if (!is_file(APP_PATH . 'admin/command/Install/install.lock')) {
|
||
fwrite(STDERR, "项目未安装,无法执行。\n");
|
||
exit(1);
|
||
}
|
||
|
||
require ROOT_PATH . 'thinkphp/base.php';
|
||
// common.php 已由 Composer autoload 自动加载,切勿重复 require
|
||
|
||
\think\App::initCommon();
|
||
|
||
echo "=== Shopro 分销功能升级脚本 ===\n\n";
|
||
|
||
$menuFile = ROOT_PATH . 'addons/shopro/config/menu.php';
|
||
$menuContent = is_file($menuFile) ? file_get_contents($menuFile) : '';
|
||
$hasRegionalInFile = strpos($menuContent, 'regional_agent') !== false;
|
||
|
||
echo $hasRegionalInFile
|
||
? "[OK] menu.php 包含 regional_agent 配置\n"
|
||
: "[FAIL] menu.php 不含 regional_agent,请重新上传最新 menu.php\n";
|
||
|
||
// 1. 标准升级
|
||
try {
|
||
$addon = new \addons\shopro\Shopro();
|
||
$addon->upgrade();
|
||
echo "[OK] Shopro::upgrade() 执行完成\n";
|
||
} catch (\Exception $e) {
|
||
echo "[WARN] Shopro::upgrade() 异常: " . $e->getMessage() . "\n";
|
||
}
|
||
|
||
// 2. 若仍未写入,使用 menuCreateOrUpdate 强制补写
|
||
$menus = \think\Db::name('auth_rule')
|
||
->where('name', 'like', 'shopro/regional_agent%')
|
||
->column('name');
|
||
|
||
if (!$menus && $hasRegionalInFile) {
|
||
echo "[INFO] 尝试强制补写菜单...\n";
|
||
try {
|
||
$reflection = new ReflectionClass(\addons\shopro\Shopro::class);
|
||
$getMenu = $reflection->getMethod('getMenu');
|
||
$getMenu->setAccessible(true);
|
||
$menuData = $getMenu->invoke(null);
|
||
|
||
$menuCreateOrUpdate = $reflection->getMethod('menuCreateOrUpdate');
|
||
$menuCreateOrUpdate->setAccessible(true);
|
||
$menuCreateOrUpdate->invoke(null, $menuData['new'], $menuData['old']);
|
||
|
||
$menus = \think\Db::name('auth_rule')
|
||
->where('name', 'like', 'shopro/regional_agent%')
|
||
->column('name');
|
||
echo $menus ? "[OK] 强制补写成功\n" : "[FAIL] 强制补写后仍未找到菜单\n";
|
||
} catch (\Exception $e) {
|
||
echo "[FAIL] 强制补写失败: " . $e->getMessage() . "\n";
|
||
}
|
||
}
|
||
|
||
// 3. 最终检查
|
||
$menus = \think\Db::name('auth_rule')
|
||
->where('name', 'like', 'shopro/regional_agent%')
|
||
->column('name');
|
||
|
||
if ($menus) {
|
||
echo "[OK] 区域代理菜单已存在 (" . count($menus) . " 条):\n";
|
||
foreach ($menus as $name) {
|
||
echo " - {$name}\n";
|
||
}
|
||
} else {
|
||
echo "[WARN] 数据库中仍未找到 shopro/regional_agent 菜单\n";
|
||
echo " 请执行 SQL: addons/shopro/upgrade_regional_agent_menu.sql\n";
|
||
}
|
||
|
||
// 3.1 修正 pid:与「分销中心」挂在同一父级(避免挂在隐藏的 shopro 根节点下)
|
||
$commission = \think\Db::name('auth_rule')->where('name', 'shopro/commission')->find();
|
||
$regional = \think\Db::name('auth_rule')->where('name', 'shopro/regional_agent')->find();
|
||
if ($commission && $regional) {
|
||
if ((int) $regional['pid'] !== (int) $commission['pid']) {
|
||
\think\Db::name('auth_rule')->where('id', $regional['id'])->update([
|
||
'pid' => $commission['pid'],
|
||
'ismenu' => 1,
|
||
'status' => 'normal',
|
||
'weigh' => 5,
|
||
]);
|
||
echo "[OK] 已将区域代理 pid 修正为 {$commission['pid']}(与分销中心同级)\n";
|
||
} else {
|
||
echo "[OK] 区域代理 pid={$regional['pid']} 已与分销中心一致\n";
|
||
}
|
||
}
|
||
|
||
// 3.2 清除菜单缓存
|
||
\think\Cache::rm('__menu__');
|
||
echo "[OK] 已清除菜单缓存 __menu__\n";
|
||
|
||
// 4. 文件检查
|
||
$files = [
|
||
'addons/shopro/config/menu.php',
|
||
'addons/shopro/listener/regional_agent/RegionalAgentHook.php',
|
||
'application/admin/controller/shopro/regional_agent/Agent.php',
|
||
'public/assets/js/backend/shopro/regional_agent/agent.js',
|
||
];
|
||
echo "\n文件检查:\n";
|
||
foreach ($files as $f) {
|
||
$path = ROOT_PATH . $f;
|
||
echo file_exists($path) ? "[OK] {$f}\n" : "[MISS] {$f} 未上传\n";
|
||
}
|
||
|
||
// 5. 分配超级管理员权限
|
||
$newRuleIds = \think\Db::name('auth_rule')
|
||
->where('name', 'like', 'shopro/regional_agent%')
|
||
->column('id');
|
||
|
||
if ($newRuleIds) {
|
||
$group = \think\Db::name('auth_group')->where('id', 1)->find();
|
||
if ($group) {
|
||
$rules = $group['rules'] === '*' ? '*' : ($group['rules'] ? explode(',', $group['rules']) : []);
|
||
if ($rules !== '*') {
|
||
$merged = array_unique(array_merge($rules, $newRuleIds));
|
||
\think\Db::name('auth_group')->where('id', 1)->update([
|
||
'rules' => implode(',', $merged),
|
||
]);
|
||
}
|
||
echo "\n[OK] 已为超级管理员组(id=1)分配区域代理菜单权限\n";
|
||
}
|
||
}
|
||
|
||
echo "\n=== 完成。请退出后台重新登录 ===\n";
|