Commit 9ee501d845a2c52f7c4914ebb659d17350b3da56

Authored by YunaiV
2 parents 09103f31 6d36c7a6

Merge remote-tracking branch 'origin/master'

sql/ruoyi-vue-pro.sql
No preview for this file type
yudao-module-system/yudao-module-system-biz/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-biz/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-biz/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-biz/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 },