菜单配置即代码与批量导入
这页是高级用法,适合插件安装、CI/CD、应用升级或配置文件一次性导入完整菜单。
如果你正在做普通后台管理页面,优先使用逐项方法:menus.configs/items/views/loadApis/actions/responses。那条路径更直观,见管理菜单。如果你只是想理解 load、actions 和 response 分别做什么,见接口与响应字段。
什么时候用 MenuConfigInput
MenuConfigInput 表示“我已经准备好一整套菜单配置,现在要整体保存”。它不适合普通表单每改一个字段就调用一次。
完整配置示例
一份完整配置可以同时声明菜单、页面、页面加载接口、按钮和响应字段:
字段说明
这份配置表达这些事:
load.resource 必须是 api: 资源,例如 api:GET:/api/orders。这样 Vext 路由守卫、角色菜单授权和响应字段投影才能使用同一份资源 ID。actions[].resource 可以是后端接口,也可以是纯 UI 资源;如果是接口,同样建议使用 api:。
响应字段写法
在 MenuConfigInput 里,响应字段支持数组,也支持对象形式:
数组形式适合接口直接返回一条对象或对象数组。字段名支持点路径,例如 buyer.name。
如果接口返回分页结构,使用对象形式:
target 表示要裁剪的数组字段,preserve 表示保留但不参与字段授权的外层字段。上例会裁剪 items 中每一行,只保留 total 作为分页信息。
注意:数组形式只适用于 MenuConfigInput 的内联配置。如果你用逐项方法 menus.responses.set(),即使没有 target,也要写成 response: { fields: [...] }。
预览并保存完整配置
menus.config.preview(config) 只计算影响,不写数据库;menus.config.save(config, options) 才会写入完整配置。
执行时必须带上预览返回的 expected 和 previewToken,避免管理员保存一份已经过期的菜单模型。
修改、删除和批量变更
读取、删除和批量变更都走 menus.config 高级入口:
单次保存适合导入一套完整菜单;menus.config.previewChanges() / menus.config.applyChanges() 适合一次提交多个模块菜单,例如插件安装、应用升级或导入配置包。
保存配置后,角色仍然没有权限。如果还没理解页面接口、按钮接口和响应字段,先看接口与响应字段;下一步通常是进入角色菜单授权,把页面、接口、按钮和响应字段分配给角色。