Commit 6d36c7a6f71b92b71abab06683321f312e4f08bd

Authored by 芋道源码
Committed by Gitee
2 parents b5821b4b c7036289

!133 【新增】菜单新增是否缓存、是否隐藏的字段

Merge pull request !133 from 芋道源码/feature/1.6.2
sql/ruoyi-vue-pro.sql
No preview for this file type
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthMenuRespVO.java
... ... @@ -34,6 +34,12 @@ public class AuthMenuRespVO {
34 34 @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传")
35 35 private String icon;
36 36  
  37 + @ApiModelProperty(value = "是否可见", required = true, example = "false")
  38 + private Boolean visible;
  39 +
  40 + @ApiModelProperty(value = "是否缓存", required = true, example = "false")
  41 + private Boolean keepAlive;
  42 +
37 43 /**
38 44 * 子路由
39 45 */
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java
... ... @@ -50,4 +50,10 @@ public class MenuBaseVO {
50 50 @NotNull(message = "状态不能为空")
51 51 private Integer status;
52 52  
  53 + @ApiModelProperty(value = "是否可见", example = "false")
  54 + private Boolean visible;
  55 +
  56 + @ApiModelProperty(value = "是否缓存", example = "false")
  57 + private Boolean keepAlive;
  58 +
53 59 }
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java
... ... @@ -24,7 +24,6 @@ public class MenuSimpleRespVO {
24 24 private Long parentId;
25 25  
26 26 @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 MenuTypeEnum 枚举类")
27   - @NotNull(message = "菜单类型不能为空")
28 27 private Integer type;
29 28  
30 29 }
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java
... ... @@ -72,5 +72,19 @@ public class MenuDO extends BaseDO {
72 72 * 枚举 {@link CommonStatusEnum}
73 73 */
74 74 private Integer status;
  75 + /**
  76 + * 是否可见
  77 + *
  78 + * 只有菜单、目录使用
  79 + * 当设置为 true 时,该菜单不会展示在侧边栏,但是路由还是存在。例如说,一些独立的编辑页面 /edit/1024 等等
  80 + */
  81 + private Boolean visible;
  82 + /**
  83 + * 是否缓存
  84 + *
  85 + * 只有菜单、目录使用
  86 + * 是否使用 Vue 路由的 keep-alive 特性
  87 + */
  88 + private Boolean keepAlive;
75 89  
76 90 }
... ...
yudao-ui-admin/src/store/modules/permission.js
... ... @@ -53,8 +53,10 @@ function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
53 53 // 处理 meta 属性
54 54 route.meta = {
55 55 title: route.name,
56   - icon: route.icon
  56 + icon: route.icon,
  57 + noCache: !route.keepAlive,
57 58 }
  59 + route.hidden = !route.visible
58 60 // 处理 component 属性
59 61 if (route.children) { // 父节点
60 62 if (route.parentId === 0) {
... ...
yudao-ui-admin/src/views/system/menu/index.vue
... ... @@ -61,8 +61,8 @@
61 61 </el-table>
62 62  
63 63 <!-- 添加或修改菜单对话框 -->
64   - <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
65   - <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  64 + <el-dialog :title="title" :visible.sync="open" width="680px" append-to-body>
  65 + <el-form ref="form" :model="form" :rules="rules" label-width="100px">
66 66 <el-row>
67 67 <el-col :span="24">
68 68 <el-form-item label="上级菜单">
... ... @@ -79,7 +79,7 @@
79 79 </el-form-item>
80 80 </el-col>
81 81 <el-col :span="24">
82   - <el-form-item v-if="form.type != '3'" label="菜单图标">
  82 + <el-form-item v-if="form.type !== 3" label="菜单图标">
83 83 <el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['iconSelect'].reset()">
84 84 <IconSelect ref="iconSelect" @selected="selected" />
85 85 <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly>
... ... @@ -101,28 +101,74 @@
101 101 </el-form-item>
102 102 </el-col>
103 103 <el-col :span="12">
104   - <el-form-item v-if="form.type != '3'" label="路由地址" prop="path">
  104 + <el-form-item v-if="form.type !== 3" label="路由地址" prop="path">
  105 + <span slot="label">
  106 + <el-tooltip content="访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头" placement="top">
  107 + <i class="el-icon-question" />
  108 + </el-tooltip>
  109 + 路由地址
  110 + </span>
105 111 <el-input v-model="form.path" placeholder="请输入路由地址" />
106 112 </el-form-item>
107 113 </el-col>
108   - <el-col :span="12" v-if="form.type == '2'">
  114 + <el-col :span="12" v-if="form.type === 2">
109 115 <el-form-item label="组件路径" prop="component">
110 116 <el-input v-model="form.component" placeholder="请输入组件路径" />
111 117 </el-form-item>
112 118 </el-col>
113 119 <el-col :span="12">
114   - <el-form-item v-if="form.type != '1'" label="权限标识">
  120 + <el-form-item v-if="form.type !== 1" label="权限标识">
  121 + <span slot="label">
  122 + <el-tooltip content="Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)" placement="top">
  123 + <i class="el-icon-question" />
  124 + </el-tooltip>
  125 + 权限字符
  126 + </span>
115 127 <el-input v-model="form.permission" placeholder="请权限标识" maxlength="50" />
116 128 </el-form-item>
117 129 </el-col>
118 130 <el-col :span="12">
119   - <el-form-item label="菜单状态">
  131 + <el-form-item label="菜单状态" prop="status">
  132 + <span slot="label">
  133 + <el-tooltip content="选择停用时,路由将不会出现在侧边栏,也不能被访问" placement="top">
  134 + <i class="el-icon-question" />
  135 + </el-tooltip>
  136 + 菜单状态
  137 + </span>
120 138 <el-radio-group v-model="form.status">
121 139 <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
122 140 :key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio>
123 141 </el-radio-group>
124 142 </el-form-item>
125 143 </el-col>
  144 + <el-col :span="12">
  145 + <el-form-item v-if="form.type !== 3" label="显示状态">
  146 + <span slot="label">
  147 + <el-tooltip content="选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问" placement="top">
  148 + <i class="el-icon-question" />
  149 + </el-tooltip>
  150 + 是否显示
  151 + </span>
  152 + <el-radio-group v-model="form.visible">
  153 + <el-radio :key="true" :label="true">显示</el-radio>
  154 + <el-radio :key="false" :label="false">隐藏</el-radio>
  155 + </el-radio-group>
  156 + </el-form-item>
  157 + </el-col>
  158 + <el-col :span="12">
  159 + <el-form-item v-if="form.type === 2" label="显示状态">
  160 + <span slot="label">
  161 + <el-tooltip content="选择缓存时,则会被 `keep-alive` 缓存,需要匹配组件的 `name` 和路由地址保持一致" placement="top">
  162 + <i class="el-icon-question" />
  163 + </el-tooltip>
  164 + 是否缓存
  165 + </span>
  166 + <el-radio-group v-model="form.keepAlive">
  167 + <el-radio :key="true" :label="true">缓存</el-radio>
  168 + <el-radio :key="false" :label="false">不缓存</el-radio>
  169 + </el-radio-group>
  170 + </el-form-item>
  171 + </el-col>
126 172 </el-row>
127 173 </el-form>
128 174 <div slot="footer" class="dialog-footer">
... ... @@ -244,7 +290,9 @@ export default {
244 290 icon: undefined,
245 291 type: SystemMenuTypeEnum.DIR,
246 292 sort: undefined,
247   - status: CommonStatusEnum.ENABLE
  293 + status: CommonStatusEnum.ENABLE,
  294 + visible: true,
  295 + keepAlive: true,
248 296 };
249 297 this.resetForm("form");
250 298 },
... ...