Commit 505660cfdf1461a1a43bf0563193e35ea213a369

Authored by wxy
1 parent 0c19b627

自定义首页

juvenile-prosecution-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/RoleIndexConfigEnum.java 0 → 100644
  1 +package org.jeecg.common.constant.enums;
  2 +
  3 +import org.jeecg.common.util.oConvertUtils;
  4 +
  5 +import java.util.List;
  6 +
  7 +/**
  8 + * 首页自定义
  9 + * 通过角色编码与首页组件路径配置
  10 + * 枚举的顺序有权限高低权重作用(也就是配置多个角色,在前面的角色首页,会优先生效)
  11 + */
  12 +public enum RoleIndexConfigEnum {
  13 +
  14 + ADMIN("admin", "business/MinorList"),
  15 + //TEST("test", "dashboard/IndexChart"),
  16 + HR("hr", "dashboard/IndexBdc");
  17 + //DM("dm", "dashboard/IndexTask"),
  18 +
  19 + /**
  20 + * 角色编码
  21 + */
  22 + String roleCode;
  23 + /**
  24 + * 路由index
  25 + */
  26 + String componentUrl;
  27 +
  28 + /**
  29 + * 构造器
  30 + *
  31 + * @param roleCode 角色编码
  32 + * @param componentUrl 首页组件路径(规则跟菜单配置一样)
  33 + */
  34 + RoleIndexConfigEnum(String roleCode, String componentUrl) {
  35 + this.roleCode = roleCode;
  36 + this.componentUrl = componentUrl;
  37 + }
  38 + /**
  39 + * 根据code找枚举
  40 + * @param roleCode 角色编码
  41 + * @return
  42 + */
  43 + private static RoleIndexConfigEnum getEnumByCode(String roleCode) {
  44 + for (RoleIndexConfigEnum e : RoleIndexConfigEnum.values()) {
  45 + if (e.roleCode.equals(roleCode)) {
  46 + return e;
  47 + }
  48 + }
  49 + return null;
  50 + }
  51 + /**
  52 + * 根据code找index
  53 + * @param roleCode 角色编码
  54 + * @return
  55 + */
  56 + private static String getIndexByCode(String roleCode) {
  57 + for (RoleIndexConfigEnum e : RoleIndexConfigEnum.values()) {
  58 + if (e.roleCode.equals(roleCode)) {
  59 + return e.componentUrl;
  60 + }
  61 + }
  62 + return null;
  63 + }
  64 +
  65 + public static String getIndexByRoles(List<String> roles) {
  66 + String[] rolesArray = roles.toArray(new String[roles.size()]);
  67 + for (RoleIndexConfigEnum e : RoleIndexConfigEnum.values()) {
  68 + if (oConvertUtils.isIn(e.roleCode,rolesArray)){
  69 + return e.componentUrl;
  70 + }
  71 + }
  72 + return null;
  73 + }
  74 +
  75 + public String getRoleCode() {
  76 + return roleCode;
  77 + }
  78 +
  79 + public void setRoleCode(String roleCode) {
  80 + this.roleCode = roleCode;
  81 + }
  82 +
  83 + public String getComponentUrl() {
  84 + return componentUrl;
  85 + }
  86 +
  87 + public void setComponentUrl(String componentUrl) {
  88 + this.componentUrl = componentUrl;
  89 + }
  90 +}
juvenile-prosecution-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java
@@ -5,11 +5,14 @@ import com.alibaba.fastjson.JSONObject; @@ -5,11 +5,14 @@ import com.alibaba.fastjson.JSONObject;
5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
7 import lombok.extern.slf4j.Slf4j; 7 import lombok.extern.slf4j.Slf4j;
  8 +import org.apache.commons.lang3.StringUtils;
8 import org.apache.shiro.SecurityUtils; 9 import org.apache.shiro.SecurityUtils;
9 import org.apache.shiro.authz.annotation.RequiresRoles; 10 import org.apache.shiro.authz.annotation.RequiresRoles;
10 import org.jeecg.common.api.vo.Result; 11 import org.jeecg.common.api.vo.Result;
11 import org.jeecg.common.constant.CommonConstant; 12 import org.jeecg.common.constant.CommonConstant;
  13 +import org.jeecg.common.constant.enums.RoleIndexConfigEnum;
12 import org.jeecg.common.system.util.JwtUtil; 14 import org.jeecg.common.system.util.JwtUtil;
  15 +import org.jeecg.common.system.vo.DictModel;
13 import org.jeecg.common.system.vo.LoginUser; 16 import org.jeecg.common.system.vo.LoginUser;
14 import org.jeecg.common.util.MD5Util; 17 import org.jeecg.common.util.MD5Util;
15 import org.jeecg.common.util.oConvertUtils; 18 import org.jeecg.common.util.oConvertUtils;
@@ -52,6 +55,13 @@ public class SysPermissionController { @@ -52,6 +55,13 @@ public class SysPermissionController {
52 @Autowired 55 @Autowired
53 private ISysDepartPermissionService sysDepartPermissionService; 56 private ISysDepartPermissionService sysDepartPermissionService;
54 57
  58 + @Autowired
  59 + private ISysDictService sysDictItemService;
  60 +
  61 + @Autowired
  62 + private ISysUserService sysUserService;
  63 +
  64 +
55 /** 65 /**
56 * 加载数据节点 66 * 加载数据节点
57 * 67 *
@@ -214,10 +224,39 @@ public class SysPermissionController { @@ -214,10 +224,39 @@ public class SysPermissionController {
214 SysPermission indexMenu = sysPermissionService.list(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getName,"首页")).get(0); 224 SysPermission indexMenu = sysPermissionService.list(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getName,"首页")).get(0);
215 metaList.add(0,indexMenu); 225 metaList.add(0,indexMenu);
216 } 226 }
  227 + //update-begin--Author:wxy Date:20220727 for:自定义首页地址LOWCOD-1578
  228 + List<String> roles = sysUserService.getRole(loginUser.getUsername());
  229 + //改为字典表内取
  230 + List<DictModel> list=sysDictItemService.queryDictItemsByCode("access_home_page");
  231 + String compUrl="";
  232 + if(list!=null&&list.size()>0){
  233 + for (String role:roles) {
  234 + for (DictModel dictModel:list) {
  235 + if(dictModel.getValue().equals(role)){
  236 + compUrl=dictModel.getText();
  237 + break;
  238 + }
  239 + }
  240 + }
  241 +
  242 + }else {
  243 + compUrl = RoleIndexConfigEnum.getIndexByRoles(roles);
  244 + }
  245 + if("".equals(compUrl)){
  246 + compUrl = RoleIndexConfigEnum.getIndexByRoles(roles);
  247 + }
  248 + if(StringUtils.isNotBlank(compUrl)){
  249 + List<SysPermission> menus = metaList.stream().filter(sysPermission -> "首页".equals(sysPermission.getName())).collect(Collectors.toList());
  250 + menus.get(0).setComponent(compUrl);
  251 + }
  252 + //update-begin--Author:wxy Date:20220727 for:自定义首页地址LOWCOD-1578
217 //update-end-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存 253 //update-end-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存
218 JSONObject json = new JSONObject(); 254 JSONObject json = new JSONObject();
219 JSONArray menujsonArray = new JSONArray(); 255 JSONArray menujsonArray = new JSONArray();
220 this.getPermissionJsonArray(menujsonArray, metaList, null); 256 this.getPermissionJsonArray(menujsonArray, metaList, null);
  257 + //一级菜单下的子菜单全部是隐藏路由,则一级菜单不显示
  258 + this.handleFirstLevelMenuHidden(menujsonArray);
  259 +
221 JSONArray authjsonArray = new JSONArray(); 260 JSONArray authjsonArray = new JSONArray();
222 this.getAuthJsonArray(authjsonArray, metaList); 261 this.getAuthJsonArray(authjsonArray, metaList);
223 //查询所有的权限 262 //查询所有的权限
@@ -244,6 +283,30 @@ public class SysPermissionController { @@ -244,6 +283,30 @@ public class SysPermissionController {
244 } 283 }
245 284
246 /** 285 /**
  286 + * 一级菜单的子菜单全部是隐藏路由,则一级菜单不显示
  287 + * @param jsonArray
  288 + */
  289 + private void handleFirstLevelMenuHidden(JSONArray jsonArray) {
  290 + jsonArray = jsonArray.stream().map(obj -> {
  291 + JSONObject returnObj = new JSONObject();
  292 + JSONObject jsonObj = (JSONObject)obj;
  293 + if(jsonObj.containsKey("children")){
  294 + JSONArray childrens = jsonObj.getJSONArray("children");
  295 + childrens = childrens.stream().filter(arrObj -> !"true".equals(((JSONObject) arrObj).getString("hidden"))).collect(Collectors.toCollection(JSONArray::new));
  296 + if(childrens==null || childrens.size()==0){
  297 + jsonObj.put("hidden",true);
  298 +
  299 + //vue3版本兼容代码
  300 + JSONObject meta = new JSONObject();
  301 + meta.put("hideMenu",true);
  302 + jsonObj.put("meta", meta);
  303 + }
  304 + }
  305 + return returnObj;
  306 + }).collect(Collectors.toCollection(JSONArray::new));
  307 + }
  308 +
  309 + /**
247 * 添加菜单 310 * 添加菜单
248 * @param permission 311 * @param permission
249 * @return 312 * @return
juvenile-prosecution-boot/jeecg-boot-module-system/target/classes/org/jeecg/modules/system/controller/SysPermissionController.class
No preview for this file type
juvenile-prosecution-vue/src/views/system/modules/UserModal.vue
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 <a-form-model-item label="登录密码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="password" > 30 <a-form-model-item label="登录密码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="password" >
31 <a-input type="password" placeholder="请输入登录密码" v-model="model.password" /> 31 <a-input type="password" placeholder="请输入登录密码" v-model="model.password" />
32 </a-form-model-item> 32 </a-form-model-item>
33 - 33 +
34 <a-form-model-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="confirmpassword" > 34 <a-form-model-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="confirmpassword" >
35 <a-input type="password" @blur="handleConfirmBlur" placeholder="请重新输入登录密码" v-model="model.confirmpassword"/> 35 <a-input type="password" @blur="handleConfirmBlur" placeholder="请重新输入登录密码" v-model="model.confirmpassword"/>
36 </a-form-model-item> 36 </a-form-model-item>
@@ -40,14 +40,6 @@ @@ -40,14 +40,6 @@
40 <a-input placeholder="请输入用户姓名" v-model="model.realname" /> 40 <a-input placeholder="请输入用户姓名" v-model="model.realname" />
41 </a-form-model-item> 41 </a-form-model-item>
42 42
43 - <a-form-model-item label="工号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="workNo">  
44 - <a-input placeholder="请输入工号" v-model="model.workNo" />  
45 - </a-form-model-item>  
46 -  
47 - <a-form-model-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">  
48 - <j-select-position placeholder="请选择职务" :multiple="false" v-model="model.post"/>  
49 - </a-form-model-item>  
50 -  
51 <a-form-model-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled" > 43 <a-form-model-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled" >
52 <j-multi-select-tag 44 <j-multi-select-tag
53 :disabled="disableSubmit" 45 :disabled="disableSubmit"
@@ -58,34 +50,11 @@ @@ -58,34 +50,11 @@
58 </a-form-model-item> 50 </a-form-model-item>
59 51
60 <!--部门分配--> 52 <!--部门分配-->
61 - <a-form-model-item label="部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled"> 53 + <a-form-model-item label="单位分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
62 <j-select-depart v-model="model.selecteddeparts" :multi="true" @back="backDepartInfo" :backDepart="true"></j-select-depart> 54 <j-select-depart v-model="model.selecteddeparts" :multi="true" @back="backDepartInfo" :backDepart="true"></j-select-depart>
63 </a-form-model-item> 55 </a-form-model-item>
64 56
65 - <!--租户分配-->  
66 - <a-form-model-item label="租户分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">  
67 - <j-multi-select-tag  
68 - :disabled="disableSubmit"  
69 - v-model="model.relTenantIds"  
70 - :options="tenantsOptions"  
71 - placeholder="请选择租户">  
72 - </j-multi-select-tag>  
73 - </a-form-model-item>  
74 57
75 - <a-form-model-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">  
76 - <a-radio-group v-model="model.userIdentity" @change="identityChange">  
77 - <a-radio :value="1">普通用户</a-radio>  
78 - <a-radio :value="2">上级</a-radio>  
79 - </a-radio-group>  
80 - </a-form-model-item>  
81 - <a-form-model-item label="负责部门" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="departIdShow==true">  
82 - <j-multi-select-tag  
83 - :disabled="disableSubmit"  
84 - v-model="model.departIds"  
85 - :options="nextDepartOptions"  
86 - placeholder="请选择负责部门">  
87 - </j-multi-select-tag>  
88 - </a-form-model-item>  
89 58
90 <a-form-model-item label="头像" :labelCol="labelCol" :wrapperCol="wrapperCol"> 59 <a-form-model-item label="头像" :labelCol="labelCol" :wrapperCol="wrapperCol">
91 <j-image-upload class="avatar-uploader" text="上传" v-model="model.avatar" ></j-image-upload> 60 <j-image-upload class="avatar-uploader" text="上传" v-model="model.avatar" ></j-image-upload>
@@ -99,7 +68,7 @@ @@ -99,7 +68,7 @@
99 :format="dateFormat" 68 :format="dateFormat"
100 :getCalendarContainer="node => node.parentNode"/> 69 :getCalendarContainer="node => node.parentNode"/>
101 </a-form-model-item> 70 </a-form-model-item>
102 - 71 +
103 <a-form-model-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol"> 72 <a-form-model-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
104 <a-select v-model="model.sex" placeholder="请选择性别" :getPopupContainer= "(target) => target.parentNode"> 73 <a-select v-model="model.sex" placeholder="请选择性别" :getPopupContainer= "(target) => target.parentNode">
105 <a-select-option :value="1">男</a-select-option> 74 <a-select-option :value="1">男</a-select-option>
@@ -119,10 +88,6 @@ @@ -119,10 +88,6 @@
119 <a-input placeholder="请输入座机" v-model="model.telephone" /> 88 <a-input placeholder="请输入座机" v-model="model.telephone" />
120 </a-form-model-item> 89 </a-form-model-item>
121 90
122 - <a-form-model-item label="工作流引擎" :labelCol="labelCol" :wrapperCol="wrapperCol">  
123 - <j-dict-select-tag v-model="model.activitiSync" placeholder="请选择是否同步工作流引擎" :type="'radio'" dictCode="activiti_sync"/>  
124 - </a-form-model-item>  
125 -  
126 </a-form-model> 91 </a-form-model>
127 </a-spin> 92 </a-spin>
128 93