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:
@@ -0,0 +1,61 @@
|
||||
-- ============================================================
|
||||
-- 积分规则表 score_rule:name → title 字段重命名升级脚本
|
||||
-- 作用:按「禁用裸 name 业务字段」命名规范(name 是浏览器/layui/TP
|
||||
-- 保留语义),把积分规则表的 name 列(规则名称)改名为 title,
|
||||
-- 与 install.sql / create_operate_tables.sql 的新定义保持一致。
|
||||
-- 适用范围:已部署老库(新装库直接使用新定义,无需执行本脚本)。
|
||||
-- 特性:
|
||||
-- 1) 自动探测表前缀——无需手工替换,匹配任意 `<前缀>_score_rule` 表
|
||||
-- (如 wxapp_、ywx_、yourown_)。
|
||||
-- 2) 幂等:仅当「name 列存在 && title 列不存在」时才执行 CHANGE;
|
||||
-- 重复执行安全。
|
||||
-- 执行:
|
||||
-- mysql -u<user> -p <database> < rename_score_rule_name_to_title.sql
|
||||
-- 或 phpMyAdmin / Navicat 直接导入。
|
||||
-- ============================================================
|
||||
|
||||
DELIMITER //
|
||||
|
||||
DROP PROCEDURE IF EXISTS `__migrate_score_rule_name`//
|
||||
|
||||
CREATE PROCEDURE `__migrate_score_rule_name`()
|
||||
BEGIN
|
||||
DECLARE done INT DEFAULT 0;
|
||||
DECLARE tbl VARCHAR(64);
|
||||
DECLARE cur CURSOR FOR
|
||||
SELECT c1.TABLE_NAME
|
||||
FROM information_schema.COLUMNS c1
|
||||
WHERE c1.TABLE_SCHEMA = DATABASE()
|
||||
AND c1.TABLE_NAME LIKE '%\_score\_rule'
|
||||
AND c1.COLUMN_NAME = 'name'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.COLUMNS c2
|
||||
WHERE c2.TABLE_SCHEMA = c1.TABLE_SCHEMA
|
||||
AND c2.TABLE_NAME = c1.TABLE_NAME
|
||||
AND c2.COLUMN_NAME = 'title'
|
||||
);
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
||||
|
||||
OPEN cur;
|
||||
read_loop: LOOP
|
||||
FETCH cur INTO tbl;
|
||||
IF done = 1 THEN
|
||||
LEAVE read_loop;
|
||||
END IF;
|
||||
-- 与 install.sql 中 score_rule.name 的列定义保持一致,仅换列名
|
||||
SET @sql = CONCAT(
|
||||
'ALTER TABLE `', tbl, '` CHANGE COLUMN `name` `title` ',
|
||||
'varchar(100) NOT NULL DEFAULT '''' COMMENT ''规则名称'''
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END LOOP;
|
||||
CLOSE cur;
|
||||
END//
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
CALL __migrate_score_rule_name();
|
||||
|
||||
DROP PROCEDURE IF EXISTS `__migrate_score_rule_name`;
|
||||
@@ -0,0 +1,147 @@
|
||||
-- ============================================================
|
||||
-- 表名规范化迁移 v2:通用表加 common_ / 会员相关表加 member_ 前缀
|
||||
-- 作用:将老库中无前缀的业务表重命名为带前缀的新表名,
|
||||
-- 与 public/install/install.sql 最新定义保持一致。
|
||||
-- 覆盖映射(前缀自动探测,任意数据库前缀通用):
|
||||
-- addon -> common_addon
|
||||
-- attachment -> common_attachment
|
||||
-- configure -> common_configure
|
||||
-- links -> common_links
|
||||
-- spider_log -> common_spider_log
|
||||
-- spider_stat -> common_spider_stat
|
||||
-- sms -> common_sms
|
||||
-- member_wallets-> member_wallet (去复数,不加前缀)
|
||||
-- notice -> common_notice
|
||||
-- ad -> common_ad
|
||||
-- task -> common_task
|
||||
-- prop -> common_prop
|
||||
-- medal -> common_medal
|
||||
-- help -> common_help
|
||||
-- card -> common_card
|
||||
-- score_rule -> member_score_rule
|
||||
-- score_log -> member_score_log
|
||||
-- addon_config -> common_addonconf (框架统一插件配置表)
|
||||
-- 字段变更:
|
||||
-- common_nav_menu 新增 app varchar(30) NOT NULL DEFAULT ''(url 之后)
|
||||
-- 说明:
|
||||
-- 1) 自动从框架核心表 backend_admin 反推表前缀(如 wxapp_),
|
||||
-- 无需手工替换前缀。
|
||||
-- 2) 幂等:仅当「旧表存在 && 新表不存在」才 RENAME,重复执行安全。
|
||||
-- 3) RENAME TABLE 是原子操作,不影响列定义与数据。
|
||||
-- 4) 若库中同时存在旧表与新表(数据分裂),旧表将被跳过、不合并,
|
||||
-- 请先人工核对处理再执行。
|
||||
-- 5) 列级变更(nav_menu.app)通过 information_schema 检查,已存在则跳过。
|
||||
-- ============================================================
|
||||
|
||||
DELIMITER //
|
||||
|
||||
-- 单表重命名:旧表存在且新表不存在时才执行
|
||||
DROP PROCEDURE IF EXISTS `__rename_if`//
|
||||
CREATE PROCEDURE `__rename_if`(IN p_old VARCHAR(64), IN p_new VARCHAR(64))
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_old
|
||||
) AND NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_new
|
||||
) THEN
|
||||
SET @sql = CONCAT('RENAME TABLE `', p_old, '` TO `', p_new, '`');
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END IF;
|
||||
END//
|
||||
|
||||
-- 加列:列不存在时才加(幂等)
|
||||
DROP PROCEDURE IF EXISTS `__add_col_if_missing`//
|
||||
CREATE PROCEDURE `__add_col_if_missing`(IN p_table VARCHAR(64), IN p_column VARCHAR(64), IN p_definition TEXT)
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = p_table
|
||||
AND COLUMN_NAME = p_column
|
||||
) AND EXISTS (
|
||||
SELECT 1 FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_table
|
||||
) THEN
|
||||
SET @sql = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN `', p_column, '` ', p_definition);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END IF;
|
||||
END//
|
||||
|
||||
-- 主流程:探测前缀 + 批量重命名 + 加列
|
||||
DROP PROCEDURE IF EXISTS `__migrate_table_prefix`//
|
||||
CREATE PROCEDURE `__migrate_table_prefix`()
|
||||
BEGIN
|
||||
DECLARE v_prefix VARCHAR(64) DEFAULT '';
|
||||
DECLARE v_p VARCHAR(70) DEFAULT '';
|
||||
|
||||
-- 1) 反推表前缀:wxapp_backend_admin -> wxapp(不含尾部下划线)
|
||||
SELECT SUBSTRING_INDEX(TABLE_NAME, '_backend_admin', 1) INTO v_prefix
|
||||
FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME LIKE '%\_backend\_admin'
|
||||
LIMIT 1;
|
||||
|
||||
-- 2) 兜底:无 backend_admin 的库尝试用导航表反推
|
||||
IF v_prefix = '' THEN
|
||||
SELECT SUBSTRING_INDEX(TABLE_NAME, '_common_nav_menu', 1) INTO v_prefix
|
||||
FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME LIKE '%\_common\_nav\_menu'
|
||||
LIMIT 1;
|
||||
END IF;
|
||||
|
||||
-- 3) 无法探测则输出提示并终止
|
||||
IF v_prefix = '' THEN
|
||||
SELECT '无法自动探测表前缀,请将脚本中 CONCAT(v_prefix,...) 替换为真实前缀(如 wxapp_)后执行' AS notice;
|
||||
ELSE
|
||||
SET v_p = CONCAT(v_prefix, '_');
|
||||
|
||||
-- 表重命名(17 张)
|
||||
CALL __rename_if(CONCAT(v_p, 'addon'), CONCAT(v_p, 'common_addon'));
|
||||
CALL __rename_if(CONCAT(v_p, 'attachment'), CONCAT(v_p, 'common_attachment'));
|
||||
CALL __rename_if(CONCAT(v_p, 'configure'), CONCAT(v_p, 'common_configure'));
|
||||
CALL __rename_if(CONCAT(v_p, 'links'), CONCAT(v_p, 'common_links'));
|
||||
CALL __rename_if(CONCAT(v_p, 'spider_log'), CONCAT(v_p, 'common_spider_log'));
|
||||
CALL __rename_if(CONCAT(v_p, 'spider_stat'), CONCAT(v_p, 'common_spider_stat'));
|
||||
CALL __rename_if(CONCAT(v_p, 'sms'), CONCAT(v_p, 'common_sms'));
|
||||
CALL __rename_if(CONCAT(v_p, 'member_wallets'),CONCAT(v_p, 'member_wallet'));
|
||||
CALL __rename_if(CONCAT(v_p, 'notice'), CONCAT(v_p, 'common_notice'));
|
||||
CALL __rename_if(CONCAT(v_p, 'ad'), CONCAT(v_p, 'common_ad'));
|
||||
CALL __rename_if(CONCAT(v_p, 'task'), CONCAT(v_p, 'common_task'));
|
||||
CALL __rename_if(CONCAT(v_p, 'prop'), CONCAT(v_p, 'common_prop'));
|
||||
CALL __rename_if(CONCAT(v_p, 'medal'), CONCAT(v_p, 'common_medal'));
|
||||
CALL __rename_if(CONCAT(v_p, 'help'), CONCAT(v_p, 'common_help'));
|
||||
CALL __rename_if(CONCAT(v_p, 'card'), CONCAT(v_p, 'common_card'));
|
||||
CALL __rename_if(CONCAT(v_p, 'score_rule'), CONCAT(v_p, 'member_score_rule'));
|
||||
CALL __rename_if(CONCAT(v_p, 'score_log'), CONCAT(v_p, 'member_score_log'));
|
||||
CALL __rename_if(CONCAT(v_p, 'addon_config'), CONCAT(v_p, 'common_addonconf'));
|
||||
|
||||
-- 字段变更:导航菜单新增 app 列(url 之后)
|
||||
CALL __add_col_if_missing(
|
||||
CONCAT(v_p, 'common_nav_menu'),
|
||||
'app',
|
||||
"varchar(30) NOT NULL DEFAULT '' COMMENT '所属应用(跨应用链接用,空=当前应用)' AFTER `url`"
|
||||
);
|
||||
|
||||
-- 数据修复:软删除字段值为 NULL/空 的行(defaultSoftDelete=0 的表会被误过滤,导致角色/菜单查不到)
|
||||
-- 幂等:已修复为 0 的行不受影响,可重复执行
|
||||
SET @sql := CONCAT('UPDATE `', v_p, 'backend_role` SET `delete_at` = 0 WHERE `delete_at` IS NULL OR `delete_at` = ''''');
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END IF;
|
||||
END//
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
CALL __migrate_table_prefix();
|
||||
|
||||
DROP PROCEDURE IF EXISTS `__rename_if`;
|
||||
DROP PROCEDURE IF EXISTS `__add_col_if_missing`;
|
||||
DROP PROCEDURE IF EXISTS `__migrate_table_prefix`;
|
||||
Reference in New Issue
Block a user