feat: 公共表更名 common/member 前缀 + 插件命令自动加载 + 版本 1.1.1
- 18 张公共表更名(addon/attachment/configure/links/spider_log/spider_stat/sms/notice/ad/task/prop/medal/help/card -> common_*,member_wallets->member_wallet,score_rule/score_log -> member_*,addon_config->common_addonconf),模型全部对齐新表名,Db 直引用清零 - Attachment 模型补 表名绑定,修复富文本上传查 wxapp_attachment 1146 隐患 - install.sql + 迁移 SQL:backend_admin/backend_role delete_at 默认 0,修复软删除(NULL != 0)误过滤导致后台菜单为空 - AppService::boot() 支持插件 info.php 声明 commands 自动注册插件命令(psr-4 自动加载,坏类名自动跳过) - 各插件(haonav/mqttbroker/wxchat/articles/blog/forum 等)字段与配置同步调整 - 框架版本 1.1.0 -> 1.1.1
This commit is contained in:
@@ -1334,7 +1334,7 @@ class AddonService
|
||||
if ($config === null || !empty($changed)) {
|
||||
self::ensureConfigTable();
|
||||
// 从统一配置表读取「独立项」(addon + name 唯一,每行一个配置项)
|
||||
$rows = Db::name('addon_config')->where('addon', $name)->column('value', 'name');
|
||||
$rows = Db::name('common_addonconf')->where('addon', $name)->column('value', 'name');
|
||||
$config = $rows ?: [];
|
||||
// 平滑迁移:若该插件此前用 .addonrc 文件存过配置,则一次性导入数据库
|
||||
if (empty($config)) {
|
||||
@@ -1372,14 +1372,14 @@ class AddonService
|
||||
|
||||
/**
|
||||
* 自愈建表:确保统一插件配置表存在(CREATE TABLE IF NOT EXISTS)
|
||||
* 表结构:wxapp_addon_config,每个配置项独立成行(addon + name 唯一)
|
||||
* 表结构:{prefix}common_addonconf,每个配置项独立成行(addon + name 唯一)
|
||||
*/
|
||||
private static function ensureConfigTable(): void
|
||||
{
|
||||
try {
|
||||
$defaultDb = Config::get('database.default');
|
||||
$prefix = Config::get("database.connections.{$defaultDb}.prefix");
|
||||
$table = $prefix . 'addon_config';
|
||||
$table = $prefix . 'common_addonconf';
|
||||
$exists = Db::query("SHOW TABLES LIKE '{$table}'");
|
||||
if (empty($exists)) {
|
||||
Db::execute("CREATE TABLE IF NOT EXISTS `{$table}` (
|
||||
@@ -1407,7 +1407,7 @@ class AddonService
|
||||
{
|
||||
$defaultDb = Config::get('database.default');
|
||||
$prefix = Config::get("database.connections.{$defaultDb}.prefix");
|
||||
$table = $prefix . 'addon_config';
|
||||
$table = $prefix . 'common_addonconf';
|
||||
$time = time();
|
||||
foreach ($values as $key => $val) {
|
||||
$val = is_array($val) ? json_encode($val, JSON_UNESCAPED_UNICODE) : (string) $val;
|
||||
@@ -1508,7 +1508,7 @@ class AddonService
|
||||
public function upgrade(string $currentVersion = ''): bool
|
||||
{
|
||||
if ($currentVersion === '') {
|
||||
$installed = \ywxapp\model\AddonModel::where('name', $this->addon)->value('version');
|
||||
$installed = \ywxapp\model\CommonAddon::where('name', $this->addon)->value('version');
|
||||
$currentVersion = $installed ?: '';
|
||||
}
|
||||
$this->callAddonHook('upgrade', [$currentVersion]);
|
||||
@@ -1951,6 +1951,13 @@ class AddonService
|
||||
} catch (\PDOException $e) {
|
||||
Log::error("Addon {$operation} error (Database): " . $e->getMessage());
|
||||
throw new Exception(lang('数据库操作失败'));
|
||||
} catch (\Error $e) {
|
||||
Log::error("Addon {$operation} error (Error): " . $e->getMessage());
|
||||
// 开发环境透传原始错误信息便于定位;生产环境统一返回通用提示,避免泄露路径等内部细节
|
||||
if (Env::get('app_debug')) {
|
||||
throw new Exception('插件操作失败:' . $e->getMessage());
|
||||
}
|
||||
throw new Exception('插件操作失败,请稍后重试或联系管理员');
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Addon {$operation} error: " . $e->getMessage());
|
||||
// 开发环境透传原始异常信息(如 Addon already exists / version incorrect)便于定位;
|
||||
@@ -1958,7 +1965,7 @@ class AddonService
|
||||
if (Env::get('app_debug')) {
|
||||
throw new Exception('插件操作失败:' . $e->getMessage());
|
||||
}
|
||||
throw new Exception('插件操作失败,请稍后重试或联系管理员' . $e->getMessage());
|
||||
throw new Exception('插件操作失败,请稍后重试或联系管理员');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2565,8 +2572,9 @@ class AddonService
|
||||
// 不存在(即未指定可用顶级菜单)则回退到「以插件名为标题的顶级菜单」。
|
||||
// 2) menu.json 未声明 superior:直接生成一个以插件名为标题的顶级菜单(pid=0),
|
||||
// 所有菜单都注入到这个插件名顶级菜单下。
|
||||
$superior = $menu['superior'] ?? '';
|
||||
if ($superior !== '') {
|
||||
$superior = $menu['parent'] ?? 'app';
|
||||
$isRoot = $menu['is_root'] ?? false;
|
||||
if ($isRoot== false) {
|
||||
$appPid = $this->getOrCreateAppMenuId($superior);
|
||||
if ($appPid > 0) {
|
||||
// 指定顶级菜单存在:在其下挂「插件名分组」,子项再挂该分组下
|
||||
|
||||
Reference in New Issue
Block a user