消费阶段二已落的 AdminGenConfigController(/admin-api/aigc/config 十四端点),把受治理生成配置变得可视可操作、有权限边界;不改一行后端契约。 - api/aigc/config/index.ts:14 端点封装 + VO 逐字对齐 TS 类型;三个 @RequestParam POST(archive/recover-activating/rebroadcast)走 params 位防真机 400;全走标准 CommonResult request(排除 genMonitor 裸 axios 范式) - views/wanxiang/config:配置集列表+新建+归档;详情抽屉三区——草稿编辑(prompt 大文本域 + JsonEditor code 模式,解析→改叶子→原样回序列化保 routeA/routeB 信封 round-trip + routeA sanity 前端预校验)/ 版本历史+全量查看+与上一版 diff / 激活·回滚·恢复卡激活+漂移对账三态+一键重推;写按钮全 v-hasPermi 收敛(save/freeze/archive/activate) - game-module-aigc/sql/aigc_config_menu.sql:自建父菜单(id 7120,component=wanxiang/config/index)+ 5 权限点(7121-7125:query/save/archive/freeze/activate)INSERT IGNORE 幂等,id 段避撞 biz(7100-07)/trade(7110-12) - 契约核实:状态枚举实为 AigcConfigStatusEnum 五态(补工单漏的 ACTIVATING=15)/ verdict 五态 / changeType 三态逐字对源;version/get 参数是 versionId、version/diff 参数是 versionAId+versionBId - 验收:vite build 绿(exit 0)+ eslint 干净(exit 0)+ vue-tsc 我方文件零类型错误(总数持平基线 55,均上游 yudao);真后端 e2e 走查待 staging 部署窗口(诚实口径:本地只到 build 绿) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
42 lines
3.6 KiB
SQL
42 lines
3.6 KiB
SQL
-- =============================================================================
|
||
-- aigc 生成配置治理 admin 权限点登记 SQL(配置控制面阶段三 · 配置控制台 UI 鉴权所需 system_menu 种子)
|
||
-- 文件:game-cloud/game-module-aigc/sql/aigc_config_menu.sql
|
||
-- 设计依据:docs/plans/2026-07-04-配置控制面阶段三-game-admin配置控制台UI-plan.md §3.3
|
||
-- + AdminGenConfigController @PreAuthorize('aigc:config:{query,save,archive,freeze,activate}')。
|
||
--
|
||
-- ⚠️ 为什么走独立 SQL 而非 Flyway:
|
||
-- huijing 菜单 seed 一贯走独立 SQL(sql/mysql/ruoyi-vue-pro.sql / game-module-biz/sql/biz_menu.sql /
|
||
-- game-module-trade/sql/trade_menu.sql 同范式),权限点不属 Flyway 业务表迁移范畴;塞进业务表迁移会破坏
|
||
-- contracts/db-schemas 与 server 迁移副本的字节一致性、触发 flyway validate 崩。故照既有单独菜单初始化 SQL 方式登记。
|
||
--
|
||
-- 执行方式(mini-desktop staging,幂等可重复执行;INSERT IGNORE 撞 id 即跳过):
|
||
-- mysql --default-character-set=utf8mb4 -h<host> -u<user> -p<pwd> <db> < game-cloud/game-module-aigc/sql/aigc_config_menu.sql
|
||
-- (含中文,务必 --default-character-set=utf8mb4 防乱码。)
|
||
--
|
||
-- 放行说明:
|
||
-- huijing 超级管理员角色(system_role.code='super_admin',type=1)对 @ss.hasPermission 全量放行(*:*:*),
|
||
-- 登记菜单行后超管即可访问配置控制台;分配给普通运营角色由运营在 game-admin「角色管理」按需勾选(不在本 SQL)。
|
||
-- ⚠️ 权限门验证不能用超管(*:*:* 全放行、证不出收敛):须建一个只勾 aigc:config:query 的运营角色断言写按钮全隐藏。
|
||
-- id 取 7120~7125(biz_menu.sql 已占 7100~7107、trade_menu.sql 已占 7110~7112,7120+ 区间未占用,避免碰撞)。
|
||
-- 范围:本 SQL 仅登记生成配置治理 1 菜单 + 5 权限点(NO-MERGE 范围)。
|
||
-- =============================================================================
|
||
|
||
-- 父菜单:生成配置治理(type=2 可路由菜单,parent_id=0 顶级;component=wanxiang/config/index 对应前端配置控制台页)
|
||
INSERT IGNORE INTO `system_menu`
|
||
(`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`,
|
||
`status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
|
||
VALUES
|
||
(7120, '生成配置治理', '', 2, 120, 0, 'aigc-config', 'ep:set-up', 'wanxiang/config/index', 'AigcConfig',
|
||
0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
|
||
|
||
-- 5 个按钮权限点(type=3 按钮,parent_id=7120,对齐 AdminGenConfigController @PreAuthorize 五权限)
|
||
INSERT IGNORE INTO `system_menu`
|
||
(`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`,
|
||
`status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
|
||
VALUES
|
||
(7121, '查询', 'aigc:config:query', 3, 1, 7120, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
|
||
(7122, '保存草稿', 'aigc:config:save', 3, 2, 7120, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
|
||
(7123, '归档', 'aigc:config:archive', 3, 3, 7120, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
|
||
(7124, '定版', 'aigc:config:freeze', 3, 4, 7120, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
|
||
(7125, '激活', 'aigc:config:activate', 3, 5, 7120, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
|