Commit 6d36c7a6f71b92b71abab06683321f312e4f08bd
Committed by
Gitee
!133 【新增】菜单新增是否缓存、是否隐藏的字段
Merge pull request !133 from 芋道源码/feature/1.6.2
Showing
7 changed files
with
6209 additions
and
418 deletions
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,6 +34,12 @@ public class AuthMenuRespVO { | ||
| 34 | @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传") | 34 | @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传") |
| 35 | private String icon; | 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,4 +50,10 @@ public class MenuBaseVO { | ||
| 50 | @NotNull(message = "状态不能为空") | 50 | @NotNull(message = "状态不能为空") |
| 51 | private Integer status; | 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,7 +24,6 @@ public class MenuSimpleRespVO { | ||
| 24 | private Long parentId; | 24 | private Long parentId; |
| 25 | 25 | ||
| 26 | @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 MenuTypeEnum 枚举类") | 26 | @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 MenuTypeEnum 枚举类") |
| 27 | - @NotNull(message = "菜单类型不能为空") | ||
| 28 | private Integer type; | 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,5 +72,19 @@ public class MenuDO extends BaseDO { | ||
| 72 | * 枚举 {@link CommonStatusEnum} | 72 | * 枚举 {@link CommonStatusEnum} |
| 73 | */ | 73 | */ |
| 74 | private Integer status; | 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,8 +53,10 @@ function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { | ||
| 53 | // 处理 meta 属性 | 53 | // 处理 meta 属性 |
| 54 | route.meta = { | 54 | route.meta = { |
| 55 | title: route.name, | 55 | title: route.name, |
| 56 | - icon: route.icon | 56 | + icon: route.icon, |
| 57 | + noCache: !route.keepAlive, | ||
| 57 | } | 58 | } |
| 59 | + route.hidden = !route.visible | ||
| 58 | // 处理 component 属性 | 60 | // 处理 component 属性 |
| 59 | if (route.children) { // 父节点 | 61 | if (route.children) { // 父节点 |
| 60 | if (route.parentId === 0) { | 62 | if (route.parentId === 0) { |
yudao-ui-admin/src/views/system/menu/index.vue
| @@ -61,8 +61,8 @@ | @@ -61,8 +61,8 @@ | ||
| 61 | </el-table> | 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 | <el-row> | 66 | <el-row> |
| 67 | <el-col :span="24"> | 67 | <el-col :span="24"> |
| 68 | <el-form-item label="上级菜单"> | 68 | <el-form-item label="上级菜单"> |
| @@ -79,7 +79,7 @@ | @@ -79,7 +79,7 @@ | ||
| 79 | </el-form-item> | 79 | </el-form-item> |
| 80 | </el-col> | 80 | </el-col> |
| 81 | <el-col :span="24"> | 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 | <el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['iconSelect'].reset()"> | 83 | <el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['iconSelect'].reset()"> |
| 84 | <IconSelect ref="iconSelect" @selected="selected" /> | 84 | <IconSelect ref="iconSelect" @selected="selected" /> |
| 85 | <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly> | 85 | <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly> |
| @@ -101,28 +101,74 @@ | @@ -101,28 +101,74 @@ | ||
| 101 | </el-form-item> | 101 | </el-form-item> |
| 102 | </el-col> | 102 | </el-col> |
| 103 | <el-col :span="12"> | 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 | <el-input v-model="form.path" placeholder="请输入路由地址" /> | 111 | <el-input v-model="form.path" placeholder="请输入路由地址" /> |
| 106 | </el-form-item> | 112 | </el-form-item> |
| 107 | </el-col> | 113 | </el-col> |
| 108 | - <el-col :span="12" v-if="form.type == '2'"> | 114 | + <el-col :span="12" v-if="form.type === 2"> |
| 109 | <el-form-item label="组件路径" prop="component"> | 115 | <el-form-item label="组件路径" prop="component"> |
| 110 | <el-input v-model="form.component" placeholder="请输入组件路径" /> | 116 | <el-input v-model="form.component" placeholder="请输入组件路径" /> |
| 111 | </el-form-item> | 117 | </el-form-item> |
| 112 | </el-col> | 118 | </el-col> |
| 113 | <el-col :span="12"> | 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 | <el-input v-model="form.permission" placeholder="请权限标识" maxlength="50" /> | 127 | <el-input v-model="form.permission" placeholder="请权限标识" maxlength="50" /> |
| 116 | </el-form-item> | 128 | </el-form-item> |
| 117 | </el-col> | 129 | </el-col> |
| 118 | <el-col :span="12"> | 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 | <el-radio-group v-model="form.status"> | 138 | <el-radio-group v-model="form.status"> |
| 121 | <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)" | 139 | <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)" |
| 122 | :key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio> | 140 | :key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio> |
| 123 | </el-radio-group> | 141 | </el-radio-group> |
| 124 | </el-form-item> | 142 | </el-form-item> |
| 125 | </el-col> | 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 | </el-row> | 172 | </el-row> |
| 127 | </el-form> | 173 | </el-form> |
| 128 | <div slot="footer" class="dialog-footer"> | 174 | <div slot="footer" class="dialog-footer"> |
| @@ -244,7 +290,9 @@ export default { | @@ -244,7 +290,9 @@ export default { | ||
| 244 | icon: undefined, | 290 | icon: undefined, |
| 245 | type: SystemMenuTypeEnum.DIR, | 291 | type: SystemMenuTypeEnum.DIR, |
| 246 | sort: undefined, | 292 | sort: undefined, |
| 247 | - status: CommonStatusEnum.ENABLE | 293 | + status: CommonStatusEnum.ENABLE, |
| 294 | + visible: true, | ||
| 295 | + keepAlive: true, | ||
| 248 | }; | 296 | }; |
| 249 | this.resetForm("form"); | 297 | this.resetForm("form"); |
| 250 | }, | 298 | }, |