当前位置: 首页 > news >正文

用户资源(菜单)控制学习使用

效果图

在这里插入图片描述
在这里插入图片描述

第一步 需要再定义常量资源

//信访听证 资源前缀public static final String RESPREFIX_MODULE_XINFTZ_="module_xinftz_";//听证专家库public static final ConstantItem RES_MODULE_XINFTZ_TINGZZJK = new ConstantItem(RESPREFIX_MODULE_XINFTZ_ + "tingzzjk","听证专家库");//听证模板库public static final ConstantItem RES_MODULE_XINFTZ_TINGZMBK = new ConstantItem(RESPREFIX_MODULE_XINFTZ_ + "tingzmbk","听证模板库");//听证模板库public static final String RESPREFIX_MODULE_XINFTZMBK_="module_xinftzmbk_";//听证模板库public static final ConstantItem RES_MODULE_XINFTZ_TINGZMBK_PILDRMB = new ConstantItem(RESPREFIX_MODULE_XINFTZMBK_+"pildrmb","批量导入模板");public static final ConstantItem RES_MODULE_XINFTZ_TINGZMBK_DAORMB = new ConstantItem(RESPREFIX_MODULE_XINFTZMBK_+"daormb","导入模板");public static final ConstantItem RES_MODULE_XINFTZ_TINGZMBK_BIANJ = new ConstantItem(RESPREFIX_MODULE_XINFTZMBK_+"bianj","编辑");public static final ConstantItem RES_MODULE_XINFTZ_TINGZMBK_SHANC = new ConstantItem(RESPREFIX_MODULE_XINFTZMBK_+"shanc","删除");public static final ConstantItem RES_MODULE_XINFTZ_TINGZMBK_TUODBS = new ConstantItem(RESPREFIX_MODULE_XINFTZMBK_+"tuodbs","拖动标识");

第二部组装数据

    private static final String RESCATEGORY_MODULE_XINFTZ=XysdSysConstants.RESPREFIX_MODULE_XINFTZ_;//信访听证private static final String RESCATEGORY_MODULE_XINFTZ_TINGZZJK=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZZJK.getId();//听证专家库private static final String RESCATEGORY_MODULE_XINFTZ_TINGZMBK=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZMBK.getId();//听证模板库private static final String RESPREFIX_MODULE_XINFTZMBK=(String)XysdSysConstants.RESPREFIX_MODULE_XINFTZMBK_;//听证模板库private static final String RESCATEGORY_MODULE_XINFTZ_TINGZDJ=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZDJ.getId();//听证登记private static final String RESCATEGORY_MODULE_XINFTZ_BENDWTZCX=(String)XysdSysConstants.RES_MODULE_XINFTZ_BENDWTZCX.getId();//本单位听证查询private static final String RESCATEGORY_MODULE_XINFTZ_ZERDWTZCX=(String)XysdSysConstants.RES_MODULE_XINFTZ_ZERDWTZCX.getId();//责任单位听证查询private static final String RESCATEGORY_MODULE_XINFTZ_BENDWCYTZCX=(String)XysdSysConstants.RES_MODULE_XINFTZ_BENDWCYTZCX.getId();//本单位参与听证查询private static final String RESCATEGORY_MODULE_XINFTZ_TINGZTJ=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZTJ.getId();//听证统计private static final String RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_PILDRMB=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZMBK_PILDRMB.getId();//批量导入模板private static final String RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_DAORMB=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZMBK_DAORMB.getId();//导入模板private static final String RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_BIANJ=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZMBK_BIANJ.getId();//编辑private static final String RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_SHANC=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZMBK_SHANC.getId();//删除private static final String RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_TUODBS=(String)XysdSysConstants.RES_MODULE_XINFTZ_TINGZMBK_TUODBS.getId();//拖动标识
private List<TreeNode> buildTreeNodes(List<SysDataSimpleDTO> resList) {List<TreeNode> nodes=new ArrayList<>();List<TreeNode> xinftzResList=new ArrayList<>();//信访听证xinftzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ,"信访听证",null,"root",false,"Category",false));List<TreeNode> xinftmbkzResList=new ArrayList<>();//信访听证xinftmbkzResList.add(new TreeNode(RESPREFIX_MODULE_XINFTZMBK,"听证模板库",null,"root",false,"Category",false));
}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZZJK)){//信访听证-听证专家库if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZZJK)) {xinftzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZZJK,"听证专家库",null,RESCATEGORY_MODULE_XINFTZ,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZZJK, new SysDataSimpleDTO());}continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZDJ)){//信访听证-听证登记if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZDJ)) {xinftzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZDJ,"听证登记",null,RESCATEGORY_MODULE_XINFTZ,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZDJ, new SysDataSimpleDTO());}continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_BENDWTZCX)){//信访听证-本单位听证查询if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_BENDWTZCX)) {xinftzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_BENDWTZCX,"本单位听证查询",null,RESCATEGORY_MODULE_XINFTZ,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_BENDWTZCX, new SysDataSimpleDTO());}continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_ZERDWTZCX)){//信访听证-责任单位听证查询if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_ZERDWTZCX)) {xinftzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_ZERDWTZCX,"责任单位听证查询",null,RESCATEGORY_MODULE_XINFTZ,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_ZERDWTZCX, new SysDataSimpleDTO());}continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_BENDWCYTZCX)){//信访听证-本单位参与听证查询if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_BENDWCYTZCX)) {xinftzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_BENDWCYTZCX,"本单位参与听证查询",null,RESCATEGORY_MODULE_XINFTZ,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_BENDWCYTZCX, new SysDataSimpleDTO());}continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZTJ)){//信访听证-听证统计if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZTJ)) {xinftzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZTJ,"听证统计",null,RESCATEGORY_MODULE_XINFTZ,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZTJ, new SysDataSimpleDTO());}continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZMBK)){//信访听证-听证模板库if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZMBK)) {xinftzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZMBK,"听证模板库",null,RESCATEGORY_MODULE_XINFTZ,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZMBK, new SysDataSimpleDTO());}xinftzResList.add(new TreeNode(res.getId(),res.getName(),null,RESCATEGORY_MODULE_XINFTZ_TINGZMBK,false,"Res",false));continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_PILDRMB)){//信访听证-听证模板库批量导入if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_PILDRMB)) {xinftmbkzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_PILDRMB,"批量导入模板",null,RESPREFIX_MODULE_XINFTZMBK,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_PILDRMB, new SysDataSimpleDTO());}xinftmbkzResList.add(new TreeNode(res.getId(),res.getName(),null,RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_PILDRMB,false,"Res",false));continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_DAORMB)){//信访听证-听证模板库导入模板if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_DAORMB)) {xinftmbkzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_DAORMB,"导入模板",null,RESPREFIX_MODULE_XINFTZMBK,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_DAORMB, new SysDataSimpleDTO());}xinftmbkzResList.add(new TreeNode(res.getId(),res.getName(),null,RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_DAORMB,false,"Res",false));continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_BIANJ)){//信访听证-听证模板库编辑if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_BIANJ)) {xinftmbkzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_BIANJ,"编辑",null,RESPREFIX_MODULE_XINFTZMBK,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_BIANJ, new SysDataSimpleDTO());}xinftmbkzResList.add(new TreeNode(res.getId(),res.getName(),null,RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_BIANJ,false,"Res",false));continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_SHANC)){//信访听证-听证模板库删除if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_SHANC)) {xinftmbkzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_SHANC,"删除",null,RESPREFIX_MODULE_XINFTZMBK,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_SHANC, new SysDataSimpleDTO());}xinftmbkzResList.add(new TreeNode(res.getId(),res.getName(),null,RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_SHANC,false,"Res",false));continue;}if(res.getId().startsWith(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_TUODBS)){//信访听证-听证模板库拖动标识if(!handledRes.containsKey(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_TUODBS)) {xinftmbkzResList.add(new TreeNode(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_TUODBS,"拖动标识",null,RESPREFIX_MODULE_XINFTZMBK,false,"Category",false));handledRes.put(RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_TUODBS, new SysDataSimpleDTO());}xinftmbkzResList.add(new TreeNode(res.getId(),res.getName(),null,RESCATEGORY_MODULE_XINFTZ_TINGZMBKT_TUODBS,false,"Res",false));continue;}//信访听证资源nodes.addAll(xinftzResList);
//信访听证模板库资源
nodes.addAll(xinftmbkzResList); return nodes;

第三步 定义接口

@ApiOperation(value="树-获取所有节点", httpMethod="POST")@ApiImplicitParam(name="params", value="参数集合", dataType="Map<String,String>")@RequestMapping(value="/allnodes/get",method=RequestMethod.POST)public ApiResultDTO<List<TreeNode>> getAllTreeNodes(@RequestBody Map<String,String> params,HttpServletRequest hreq){return RestAPITemplate.restapi(new IMyLogic<List<TreeNode>>() {@Overridepublic List<TreeNode> logic() {AccessTokenUser user=new AccessTokenUserAssembler().getAccessTokenUserFromReq(hreq);String treeType=params.get("treeType");ITreeService treeService=getTreeServiceByTreeType(treeType);return treeService.getAllTreeNodes(user, params);}});}public List<TreeNode> getAllTreeNodes(AccessTokenUser user,Map<String, String> params) {List<SysDataSimpleDTO> resList=systemGatewayService.findAllResList();List<TreeNode> nodes=this.buildTreeNodes(resList);return nodes;}

返回值模型

ApiModel(value="MenuDTO ",description="菜单模型")
@JsonIgnoreProperties(ignoreUnknown=true)
public class MenuDTO {@ApiModelProperty(value="菜单标识")private String id;@ApiModelProperty(value="菜单名称")private String name;@ApiModelProperty(value="菜单名称简称")private String simpleName;@ApiModelProperty(value="菜单打开的链接地址")private String url;@ApiModelProperty(value="菜单描述")private String description;@ApiModelProperty(value="是否显示")private Boolean isShow = false;@ApiModelProperty(value="子菜单")private List<MenuDTO> submenus = new ArrayList<MenuDTO>();public String getId() {return id;}public String getName() {return name;}public String getSimpleName() {return simpleName;}public String getUrl() {return url;}public String getDescription() {return description;}public void setSubmenus(List<MenuDTO> submenus) {this.submenus = submenus;}public List<MenuDTO> getSubmenus() {return submenus;}public Boolean getShow() {return isShow;}public void setShow(Boolean show) {isShow = show;}public MenuDTO() {super();}public MenuDTO(String id, String name, String simpleName) {super();this.id = id;this.name = name;this.simpleName=simpleName;if(StringUtils.isNotBlank(name) && StringUtils.isBlank(simpleName)){this.simpleName=name.substring(0,2);}}public MenuDTO(String id, String name, String simpleName, String url, String description) {super();this.id = id; this.name = name;this.simpleName=simpleName;if(StringUtils.isNotBlank(name) && StringUtils.isBlank(simpleName)){this.simpleName=name.substring(0,2);}this.url = url;this.description = description;}/**************************************************************开始格式化数据方法**************************************************************//*** 是否有子菜单* @return*/public boolean isHasSubMenus() {return this.submenus.size()>0;}}

请求参数

{"treeType": "resourceTree"
}

返回值

在这里插入图片描述

效果图

在这里插入图片描述

将用户与资源关联

@AuditLogEnregistor(module="角色管理",action="保存")@ApiOperation(value="保存角色", httpMethod="POST")@ApiImplicitParam(name="roleDTO", value="角色详情", required=true)@RequestMapping(value="/save", method=RequestMethod.POST)public ApiResultDTO<RoleDTO> saveRole(@RequestBody RoleDTO roleDTO,HttpServletRequest hreq) {return RestAPITemplate.restapi(new IMyLogic<RoleDTO>() {@Overridepublic RoleDTO logic() {AccessTokenUser user=new AccessTokenUserAssembler().getAccessTokenUserFromReq(hreq);roleService.saveRole(user,null,roleDTO);return roleDTO;}});}public void saveRole(AccessTokenUser user, Date operateTime, RoleDTO roleDTO) {if(roleDTO.getParent()==null||StringUtils.isBlank(roleDTO.getParent().getId())){throw new RuntimeException("请选择上级节点!");}//this.checkRoleCanEditByRoleName(roleDTO.getName());//检查可编辑权限RoleDTOAssembler roleDTOAssembler=new RoleDTOAssembler(this.beansFactoryService);String roleId=roleDTO.getId();String parentId=roleDTO.getParent().getId();Role role=null;Role parent=this.roleRepository.getRoleById(parentId);if(parent==null){throw new RuntimeException("未找到上级节点!");}String oldParentId=null;Integer oldOrderNo=null;if(StringUtils.isBlank(roleId)){role = roleDTOAssembler.fromRoleDTO(roleDTO);role.updateCreateInfo(user, operateTime, parent);}else{role=this.roleRepository.getRoleById(roleId);if(role==null){throw new RuntimeException("根据角色id未找到相应的角色!");}//this.checkRoleCanEditByRoleName(role.getName());//检查可编辑权限oldParentId=role.getParent().getId();oldOrderNo=role.getOrderNo();String name=roleDTO.getName();String visibleLevel=roleDTO.getVisibleLevel();String resourceCodes = roleDTO.obtainResourceCodes();String comments=roleDTO.getComments();int orderNo=roleDTO.getOrderNo();role.updateRole(user, operateTime, parent, name, visibleLevel, resourceCodes,comments, orderNo);}roleRepository.createOrUpdateRole(role);if (oldParentId==null || oldOrderNo==null || oldOrderNo!=role.getOrderNo() ||!oldParentId.equals(role.getParent().getId())){//更新fullId和fullOrderroleDomainService.updateRoleFullIdAndFullOrder(user, operateTime,role);roleRepository.createOrUpdateRole(role);}//更新角色 用户关系roleDomainService.updateRoleUsers(user, operateTime,roleDTO.getUsers(),role);if (StringUtils.isBlank(roleDTO.getId())){roleDTO.setId(role.getId());}}

实体模型

@Entity
@Table(name = "T_ROLE")
public class Role extends ExBizEntity {public static final String NODETYPE_ROOT = "Root";public static final String NODETYPE_CATEGORY = "Category";public static final String NODETYPE_ROLE = "Role";@Column(length=200)private String name;//角色名称@Column(length=20)private String nodeType;//节点类型@Column(length=100)private String visibleLevel;//可见级别@Column(columnDefinition="text")private String resourceCodes;//拥有的资源的资源编码@OneToMany(mappedBy="roleId")@OrderBy("createTime,id")private Set<RoleUser> roleUsers = new LinkedHashSet<RoleUser>();//拥有此角色的用户@Column(length = 500)private String fullId;//增强树,全路径@Column(length = 500)private String fullOrder;//增强树排序@Column(length = 1000)private String comments;//说明private int orderNo = 0;//归口顺序号@ManyToOne(fetch = FetchType.LAZY)private Role parent;//父节点@OneToMany(mappedBy = "parent")@OrderBy("orderNo")private Set<Role> children = new HashSet<Role>();//子节点//todo 省略get方法public Role() {super();}public Role(String nodeType,String visibleLevel, String name, String resourceCodes,String comments, int orderNo) {super();this.nodeType = nodeType;this.visibleLevel = visibleLevel;this.name = name;this.resourceCodes = resourceCodes;this.comments = comments;this.orderNo = orderNo;}//为跟节点构造private Role(AccessTokenUser user, Date operateTime, String name){this.setCreateInfo(new OperateInfo(user));this.id = getRoleRootId();this.nodeType = NODETYPE_ROOT;this.name = name;this.orderNo = 1;this.fullId = this.id+"-";this.fullOrder = 1+"-";}//获取角色跟节点id@Transientpublic static String getRoleRootId(){return "rootRole";}//创建角色跟节点public static Role createRoleRoot( AccessTokenUser user,Date operateTime){Role root=new Role(user, operateTime, "角色管理");return root;}public void updateCreateInfo(AccessTokenUser user,Date operateTime, Role parent) {this.setCreateInfo(new OperateInfo(user));this.parent = parent;}public void updateRole(AccessTokenUser user, Date operateTime, Role parent,String name, String visibleLevel,String resourceCodes,String comments, int orderNo) {if(operateTime==null){operateTime = new Date();}this.lastUpdateDate = operateTime;this.name = name;this.visibleLevel = visibleLevel;this.parent = parent;this.orderNo = orderNo;this.resourceCodes = resourceCodes;this.comments = comments;}//更新角色fullId和fullOrderpublic void updateRoleFullIdAndFullOrder(AccessTokenUser user, Date operateTime,String oldFullId,String oldFullOrder) {if(this.parent!=null){this.fullId = this.parent.getFullId()+this.id+"-";this.fullOrder = this.parent.getFullOrder()+Utils.lpadStr(this.orderNo+"",10,'0')+"-";}else{this.fullId = this.id+"-";this.fullOrder = Utils.lpadStr(this.orderNo+"",10,'0')+"-";}//如果fullId或者fullOrder发生改变if(!fullId.equals(oldFullId)||!fullOrder.equals(oldFullOrder)){if(operateTime==null){operateTime = new Date();}this.lastUpdateDate = operateTime;}}
}
@Entity
@Table(name = "T_USER_ROLE")
public class RoleUser extends ValueObjectEntity {@Column(length=100)private String roleId;//角色id@Column(length=200)private String roleName;//角色名称@Column(length=100)private String userId;//用户id@Column(length=200)private String userName;//用户名称//todo 省略get方法public RoleUser() {super();}public RoleUser(String roleId, String roleName, String userId,String userName) {super();this.roleId = roleId;this.roleName = roleName;this.userId = userId;this.userName = userName;}//创建角色用户关系public void createRoleUser(AccessTokenUser user,Date operateTime) {this.setCreateInfo(new OperateInfo(user));this.id = this.userId+"_"+this.roleId;}}

数据库表数据

在这里插入图片描述

系统显示用户拥有的菜单

定义接口
@ApiOperation(value="获取框架菜单", httpMethod="GET")@RequestMapping(value="/menus/get", method=RequestMethod.GET)public ApiResultDTO<Map<String,List<MenuDTO>>> getHomePageMenus(@RequestParam(value = "fromType",required = false) String fromType, HttpServletRequest hreq,HttpServletResponse hrep){return RestAPITemplate.restapi(new IMyLogic<Map<String,List<MenuDTO>>>() {@Overridepublic Map<String,List<MenuDTO>> logic() {AccessTokenUser user = new AccessTokenUserAssembler().getAccessTokenUserFromReq(hreq);return layoutService.getLayoutMenus(user,fromType);}});}
Service服务+数据组装
@Overridepublic Map<String,List<MenuDTO>> getLayoutMenus(AccessTokenUser user,String fromType) {Map<String,List<MenuDTO>> result=new HashMap<String, List<MenuDTO>>();PrivilegesUser puser = ThreadLocalCache.fetchAPIData("PrivilegesUser."+user.getUserId(),new IDataFetch<ApiResultDTO<PrivilegesUser>>() {@Overridepublic ApiResultDTO<PrivilegesUser> fetchData() {return systGatewayService.getPrivilegesUserById(user.getUserId());}});puser.getOtherData().put("accessToken", user.getAccessToken());UserLayoutSetDTO layoutSet=this.getNotNullUserLayoutSet(user,fromType);Map<String,List<MenuDTO>> allMenus=this.getMyAllMenus(user,fromType);List<MenuDTO> leftTop = new ArrayList<MenuDTO>();//左菜单 上半部分result.put("leftTop", leftTop);List<WorkReminderDTO> gongztxq = layoutSet.getGongztxq();for (int i = 0; i < gongztxq.size(); i++) {for (MenuDTO menuDto : allMenus.get("gongztxq")) {if(menuDto==null) continue;if(menuDto.getId().equals(gongztxq.get(i).getMenuId()) && gongztxq.get(i).getShow()){leftTop.add(menuDto);break;}}}List<MenuDTO> leftBottom = new ArrayList<MenuDTO>();//左菜单 下半部分result.put("leftBottom", leftBottom);
//        Map<String,MenuDTO> changygnqMap=allMenus.get("changygnq").stream().collect(
//            Collectors.toMap(d->d.getId(), d->d)
//        );if(layoutSet.getChangygnq() != null){for (int i = 0; i < layoutSet.getChangygnq().size(); i++) {for (MenuDTO menuDto : allMenus.get("changygnq")) {if(menuDto==null) continue;if(menuDto.getSubmenus().size() > 0){for (MenuDTO submenu : menuDto.getSubmenus()) {if(submenu.getId().equals(layoutSet.getChangygnq().get(i))){leftBottom.add(submenu);break;}}}else{if(menuDto.getId().equals(layoutSet.getChangygnq().get(i))){leftBottom.add(menuDto);}}}}}if (leftTop.size()==0){List<MenuDTO> leftBottom1 = result.get("leftBottom");result.put("leftTop",leftBottom1);result.put("leftBottom",new ArrayList<MenuDTO>());}return result;}
public Map<String,List<MenuDTO>> getMyAllMenus(AccessTokenUser user,String fromType) {List<MenuDTO> gongztxq = new ArrayList<>();//工作提醒区String quyName="gongztxq";result.put(quyName, gongztxq);//待办if(puser.hasAppointPrefixResource((String)XysdSysConstants.RES_MODULE_SHOUY_DAIB_.getId())) {gongztxq.add(new MenuDTO(quyName+"_daib", "待办", "待办", "/xf/waitTodo", "待处理工作,需及时处理"));}//提醒if(puser.hasResource((String)XysdSysConstants.RES_MODULE_SHOUY_TIX.getId())) {gongztxq.add(new MenuDTO(quyName+"_tix", "提醒", "提醒", "/xf/remind", "新件、催办、退办等提醒"));}//预警 海淀 HDXF-21069 增加 预警飘窗,去掉这个 工作人员app,公交集团 还是需要if (ValueObjectEntity.SYSCODE_GJJTXF.equals(BaseConstants.getProperty("syscode", null))|| XysdConstants.TOKEN_FORMTYPE_APP.equals(user.obtainFromType())||"gzapp".equals(fromType)){//处理PC登陆APPif(puser.hasAppointPrefixResource((String)XysdSysConstants.RES_MODULE_SHOUY_YUJ_.getId())) {gongztxq.add(new MenuDTO(quyName+"_yuj", "预警", "预警", "/xf/earlyWarn", "信访三率预警"));}}//监控if(puser.hasAppointPrefixResource((String)XysdSysConstants.RES_MODULE_SHOUY_JIANK_.getId())) {gongztxq.add(new MenuDTO(quyName+"_jiank", "监控", "监控", "/xf/monitor", "未结件跟进办理"));}//看板if(puser.hasResource((String)XysdSysConstants.RES_MODULE_SHOUY_KANB.getId())) {gongztxq.add(new MenuDTO(quyName+"_kanb", "看板", "看板", "/xf/bulletinBoard", "全区信访统计分析"));}//数据分析if(puser.hasResource((String)XysdSysConstants.RES_MODULE_SHOUY_SHUJFX.getId())) {gongztxq.add(new MenuDTO(quyName+"_shujfx", "数据分析", "数据分析", "/xf/dataAnalysis", "数据分析"));}List<MenuDTO> defaultChangygnq = new ArrayList<MenuDTO>();//默认常用功能区List<MenuDTO> changygnq = new ArrayList<MenuDTO>();//常用功能区quyName="changygnq";result.put(quyName, changygnq);result.put("defaultChangygnq", defaultChangygnq);
//查询统计menuDTO = new MenuDTO(quyName+"_chaxtj", "查询统计", "查询统计");//查询统计-查询if(puser.hasAppointPrefixResource(XysdSysConstants.RESPREFIX_MODULE_XINF_CHAX_)) {MenuDTO cxMuDTO = new MenuDTO(quyName+"_chaxtj_xinfcx", "查询", "查询", "/xf/query", "办理查询");menuDTO.getSubmenus().add(cxMuDTO);defaultChangygnq.add(cxMuDTO);}//查询统计-统计if(puser.hasAppointPrefixResource(XysdSysConstants.RESPREFIX_MODULE_TONGJBB_)) {MenuDTO tjMuDTO = new MenuDTO(quyName+"_chaxtj_tongj", "统计", "统计", "/xf/statistics", "统计中心,进行各类统计");menuDTO.getSubmenus().add(tjMuDTO);defaultChangygnq.add(tjMuDTO);}
//信访库menuDTO = new MenuDTO(quyName+"_xinfk", "信访库", "信访库");//信访库-查询if(puser.hasAppointPrefixResource(XysdSysConstants.RESPREFIX_MODULE_XINFK_CHAX_)) {menuDTO.getSubmenus().add(new MenuDTO(quyName+"_xinfk_chax", "信访库", "信访库", "/xf/infoLibrary", "信访人、信访件等集中查询"));}//信访库-整理if(puser.hasAppointPrefixResource(XysdSysConstants.RESPREFIX_MODULE_XINFK_ZHENGL_)) {menuDTO.getSubmenus().add(new MenuDTO(quyName+"_xinfk_zhengl", "信访库整理", "信访库整理", "/xf/infoArrange", "信访库整理"));}if(menuDTO.isHasSubMenus()) {changygnq.add(menuDTO);}return result;
}

返回值

在这里插入图片描述

效果图

请看最上面

相关文章:

用户资源(菜单)控制学习使用

效果图 第一步 需要再定义常量资源 //信访听证 资源前缀public static final String RESPREFIX_MODULE_XINFTZ_"module_xinftz_";//听证专家库public static final ConstantItem RES_MODULE_XINFTZ_TINGZZJK new ConstantItem(RESPREFIX_MODULE_XINFTZ_ "tin…...

邦芒支招:十大秘诀助你轻松进名企

找到一份理想的工作是大学毕业生们最大的心愿,而进入那些知名的大企业更是广大毕业生的梦想。如何应付这些企业的面试成为了毕业生们最为关注的话题。 这些名企的面试往往有一定的程序,绝非草草而就。因此,一定要有所准备才能“百战不殆”。而要在面试前得到有关信息,常常采用…...

5G_射频测试_参考规范(一)

参考规范&#xff1a; • Base Station (BS) conformance testing&#xff08;重点limitation&#xff09;Directory Listing /ftp/Specs/archive/38_series/38.104 (3gpp.org) • Conducted conformance testing&#xff08;传导测试&#xff09;3GPP 38.141-1 6.7 Tran…...

幻读是什么,用什么隔离级别可以防止幻读?

幻读指的是&#xff0c;在同一个事务中&#xff0c;以同样的条件执行的两次查询&#xff0c;第二次查询查到了第一次查询所没查到的数据。 在mysql的四种隔离级别中&#xff0c;可重复读和串行化两种隔离级别没有幻读问题。那么它们是如何解决幻读问题的呢&#xff1f; 先说串行…...

UE5 C++学习笔记 FString FName FText相互转换

1.FString 是UE里的String。最接近std::string, 唯一可以修改的字符串类型。性能更低 TEXT(string) TEXT宏&#xff0c;作用是将字符串转换成Unicode&#xff0c;切记UE中使用字符串输出要使用该宏 2. FName 是UE里特有的类型。它更注重于表示名称不区分大小写&#xff0c;不…...

【ASOC全解析(三)】machine原理和实战

【ASOC全解析&#xff08;三&#xff09;】machine原理和实战 一、machine概述与原理1.1 machine的主要职责1.2 本文的主要内容 二、machine程序示例完整的machine驱动代码示例扩展知识&#xff1a;SND_SOC_DAILINK_DEFS使用方法说明总结与其它说明 /*************************…...

matlab appdesigner系列-常用15-滑块、微调器

滑块&#xff0c;以左右拖动的方式在一定范围内改变数值 此示例&#xff0c;滑块显示微调器的数值&#xff0c;微调器也可以显示滑块的数值 操作步骤为&#xff1a; 1&#xff09;将滑块和微调器拖拽到画布上 2&#xff09;分别设置这两个组件的回调函数 回调函数有两个选项…...

google翻译相机报错 请安装最新的Google应用,以便使用相机翻译功能

修复&#xff1a;google翻译相机报错 背景&#xff1a;解决方法 背景&#xff1a; 国内手机使用google翻译的相机时报错&#xff1a; 请安装最新的Google应用&#xff0c;以便使用相机翻译功能点击报错的“确定”后转到了国内空白的软件商店页面 解决方法 Google Play搜索 …...

openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert

文章目录 openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert概述笔记END openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 这个例子有不同的地方, 发证书时, 指定了CA. 看实验注释, 是…...

linux中用户及用户组信息

1&#xff0c;linux通过用户名和口令来验证用户的身份。 2&#xff0c;几个用户可以组成一个用户组。 3&#xff0c;useradd工具添加用户&#xff0c;groupadd命令添加用户组。 4&#xff0c;history 命令查看用户在Shell中执行命令的历史记录。 5&#xff0c;userdel命令删…...

用Go plan9汇编实现斐波那契数列计算

斐波那契数列是一个满足递推关系的数列&#xff0c;如&#xff1a;1 1 2 3 5 8 ... 其前两项为1&#xff0c;第3项开始&#xff0c;每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 func fib(n int) int {if n 1 || n 2 {return 1}return fib(n-1) fib(n-2) …...

Message queue 消息队列--RabbitMQ 【基础入门】

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…...

【汇编】 13.3 对int iret和栈的深入理解

书中示例 assume cs:codecode segment start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb ;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*42],0 ;设置7c表项…...

Git提交大文件报错“remote: Please remove the file from history and try again. ”

如在使用Git过程中不小心将较大的二进制文件加入仓库&#xff0c;那么仓库大小很快就会超过规定的配额&#xff0c;在Push的时候会报下面的错误&#xff1a; remote: Powered by GITEE.COM [GNK-6.4] remote: error: File: c91e5de4f55bedd0669db01036fc131ea8e516ce 130.66 MB…...

接口测试 03 -- 接口自动化思维 Requests库应用

1. 接口自动化思维梳理 1.1接口自动化的优点 接口测试自动化&#xff0c;简单来讲就是功能测试用例脚本化然后执行脚本&#xff0c;产生一份可视化测试报告。不管什么样的测试方式&#xff0c;都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢&#xff1f;一句话概括…...

SpringBoot:Bean生命周期自定义初始化和销毁

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、Bean注解指…...

Git--基本操作介绍(2)

Git 常用的是以下 6 个命令&#xff1a;git clone、git push、git add 、git commit、git checkout、git pull. 说明&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xf…...

第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)

文章目录 第08章_面向对象编程(高级)本章专题与脉络1. 关键字&#xff1a;static1.1 类属性、类方法的设计思想1.2 static关键字1.3 静态变量1.3.1 语法格式1.3.2 静态变量的特点1.3.3 举例1.3.4 内存解析 1.4 静态方法1.4.1 语法格式1.4.2 静态方法的特点1.4.3 举例 1.5 练习 …...

Java中Map接口常用的方法

java.util.Map接口中常用的方法&#xff1a; 1.Map和Collection没有继承关系 2.Map集合以key和value的方式存储数据&#xff1a;键值对 key和value都是引用数据类型 key和value都是存储对象的内存地址 key起到主导的地位&#xff0c;value是key的一个附属品 3.Map接口中常用的方…...

Linux软件包管理器yum

文章目录 前言概述Linux下载软件的三种方式源代码安装rpm安装yum安装 关于yum的相关操作查看软件包软件安装卸载软件 yum源问题 前言 在Windows系统中&#xff0c;如果我们要去下载软件&#xff0c;我们可以在该软件的官网中进行下载&#xff0c;或者在微软的额软件商店进行下…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...