-- App 可信安装包、版本发布及逐版本灰测名单。适用于 MySQL 5.7/8.0。 -- 选择目标业务库后执行,先备份。此脚本只创建新表与菜单,不发布版本、不改写会员。 -- 重复执行安全。部署顺序为执行脚本、发布 Java、分配菜单权限、发布 PC、重新打原生基座。 CREATE TABLE IF NOT EXISTS `member_app_version_package` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '可信包编号', `app_id` varchar(100) NOT NULL COMMENT 'uni-app AppID', `platform` varchar(64) NOT NULL COMMENT '规范CSV目标平台,android/ios/harmony', `package_type` varchar(8) NOT NULL COMMENT 'apk/wgt', `file_name` varchar(255) NOT NULL COMMENT '原始文件名', `file_size` bigint NOT NULL COMMENT '文件大小,字节', `sha256` char(64) NOT NULL COMMENT '真实文件SHA-256', `md5` char(32) NOT NULL COMMENT '原生运行时文件校验MD5', `download_url` varchar(2048) NOT NULL COMMENT '已有存储生成的地址', `version_code` int NOT NULL COMMENT 'APK原生版本码或WGT资源版本码', `version_name` varchar(100) NOT NULL COMMENT '包清单版本名', `native_version_code` int DEFAULT NULL COMMENT 'APK原生基座版本码', `resource_version_code` int NOT NULL COMMENT '包内资源版本码', `package_name` varchar(200) DEFAULT NULL COMMENT 'APK原生包名', `creator` varchar(64) DEFAULT '', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updater` varchar(64) DEFAULT '', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted` bit(1) NOT NULL DEFAULT b'0', `tenant_id` bigint NOT NULL DEFAULT 0, PRIMARY KEY (`id`), KEY `idx_app_package_tenant` (`tenant_id`, `app_id`, `platform`, `package_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='App可信安装包'; CREATE TABLE IF NOT EXISTS `member_app_version` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '版本发布编号', `package_id` bigint NOT NULL COMMENT '可信包编号', `app_id` varchar(100) NOT NULL COMMENT 'uni-app AppID快照', `platform` varchar(64) NOT NULL COMMENT '规范CSV目标平台,android/ios/harmony', `package_type` varchar(8) NOT NULL COMMENT 'apk/wgt', `version_code` int NOT NULL COMMENT '按包类型比较的版本码', `version_name` varchar(100) NOT NULL COMMENT '展示版本名', `native_version_code` int DEFAULT NULL COMMENT 'APK原生基座版本码', `resource_version_code` int NOT NULL COMMENT '目标资源版本码', `package_name` varchar(200) DEFAULT NULL COMMENT 'APK原生包名', `update_content` text NOT NULL COMMENT '纯文本更新说明', `force_update` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否强制更新', `release_scope` varchar(16) NOT NULL DEFAULT 'all' COMMENT 'all/members', `status` varchar(16) NOT NULL DEFAULT 'draft' COMMENT 'draft/published/offline', `min_native_version_code` int DEFAULT NULL COMMENT 'WGT最低兼容基座,包含边界', `max_native_version_code` int DEFAULT NULL COMMENT 'WGT最高兼容基座,NULL无上限', `publish_time` datetime DEFAULT NULL COMMENT '最近发布时间', `creator` varchar(64) DEFAULT '', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updater` varchar(64) DEFAULT '', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted` bit(1) NOT NULL DEFAULT b'0', `tenant_id` bigint NOT NULL DEFAULT 0, `active_unique_flag` tinyint GENERATED ALWAYS AS (CASE WHEN `deleted` = 0 THEN 1 ELSE NULL END) STORED COMMENT '有效记录唯一标记', `android_active_flag` tinyint GENERATED ALWAYS AS (CASE WHEN `deleted` = 0 AND LOCATE(',android,', CONCAT(',', `platform`, ',')) > 0 THEN 1 ELSE NULL END) STORED COMMENT 'android有效目标唯一标记', `ios_active_flag` tinyint GENERATED ALWAYS AS (CASE WHEN `deleted` = 0 AND LOCATE(',ios,', CONCAT(',', `platform`, ',')) > 0 THEN 1 ELSE NULL END) STORED COMMENT 'ios有效目标唯一标记', `harmony_active_flag` tinyint GENERATED ALWAYS AS (CASE WHEN `deleted` = 0 AND LOCATE(',harmony,', CONCAT(',', `platform`, ',')) > 0 THEN 1 ELSE NULL END) STORED COMMENT 'harmony有效目标唯一标记', PRIMARY KEY (`id`), UNIQUE KEY `uk_app_version_active` (`tenant_id`,`app_id`,`platform`,`package_type`,`version_code`,`active_unique_flag`), UNIQUE KEY `uk_app_version_android_active` (`tenant_id`,`app_id`,`package_type`,`version_code`,`android_active_flag`), UNIQUE KEY `uk_app_version_ios_active` (`tenant_id`,`app_id`,`package_type`,`version_code`,`ios_active_flag`), UNIQUE KEY `uk_app_version_harmony_active` (`tenant_id`,`app_id`,`package_type`,`version_code`,`harmony_active_flag`), KEY `idx_app_version_check` (`tenant_id`,`app_id`,`platform`,`status`,`resource_version_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='App版本发布'; CREATE TABLE IF NOT EXISTS `member_app_version_member` ( `id` bigint NOT NULL AUTO_INCREMENT, `version_id` bigint NOT NULL COMMENT '版本发布编号', `member_id` bigint NOT NULL COMMENT '真实会员主键', `creator` varchar(64) DEFAULT '', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updater` varchar(64) DEFAULT '', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted` bit(1) NOT NULL DEFAULT b'0', `tenant_id` bigint NOT NULL DEFAULT 0, `active_unique_flag` tinyint GENERATED ALWAYS AS (CASE WHEN `deleted` = 0 THEN 1 ELSE NULL END) STORED, PRIMARY KEY (`id`), UNIQUE KEY `uk_app_version_member_active` (`tenant_id`,`version_id`,`member_id`,`active_unique_flag`), KEY `idx_app_version_member_lookup` (`tenant_id`,`member_id`,`version_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='逐版本灰测会员'; -- 优先复用既有 app/version/index 菜单及其父目录,保留已分配角色关系。 SET @app_version_menu_id = (SELECT MIN(id) FROM system_menu WHERE component = 'app/version/index' AND deleted = 0); SET @app_parent_id = (SELECT parent_id FROM system_menu WHERE id = @app_version_menu_id); SET @app_parent_id = COALESCE(@app_parent_id, (SELECT MIN(id) FROM system_menu WHERE type = 1 AND path IN ('app', '/app') AND deleted = 0)); INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, visible, keep_alive, always_show, creator, updater, deleted) SELECT '应用管理', '', 1, 30, 0, 'app', 'ep:iphone', NULL, 0, b'1', b'1', b'1', '1', '1', b'0' WHERE @app_parent_id IS NULL; SET @app_parent_id = COALESCE(@app_parent_id, (SELECT MIN(id) FROM system_menu WHERE type = 1 AND path IN ('app','/app') AND deleted = 0)); INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, updater, deleted) SELECT '版本管理', 'app:version:query', 2, 10, @app_parent_id, 'version', 'ep:upload-filled', 'app/version/index', 'AppVersion', 0, b'1', b'1', b'1', '1', '1', b'0' WHERE @app_version_menu_id IS NULL; SET @app_version_menu_id = (SELECT MIN(id) FROM system_menu WHERE component = 'app/version/index' AND deleted = 0); UPDATE system_menu SET permission = 'app:version:query', component_name = 'AppVersion', update_time = CURRENT_TIMESTAMP WHERE id = @app_version_menu_id; INSERT INTO system_menu (name, permission, type, sort, parent_id, path, status, visible, keep_alive, always_show, creator, updater, deleted) SELECT buttons.name, buttons.permission, 3, buttons.sort, @app_version_menu_id, '', 0, b'1', b'1', b'1', '1', '1', b'0' FROM ( SELECT '版本查询' name, 'app:version:query' permission, 1 sort UNION ALL SELECT '版本新增', 'app:version:create', 2 UNION ALL SELECT '版本编辑', 'app:version:update', 3 UNION ALL SELECT '版本删除', 'app:version:delete', 4 UNION ALL SELECT '版本发布与下架', 'app:version:publish', 5 ) buttons WHERE NOT EXISTS (SELECT 1 FROM system_menu current_menu WHERE current_menu.parent_id = @app_version_menu_id AND current_menu.permission = buttons.permission AND current_menu.deleted = 0);