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

效果图

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

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

//信访听证 资源前缀
    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>>() {
            @Override
            public 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>() {
            @Override
            public 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和fullOrder
            roleDomainService.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
    @Transient
    public 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和fullOrder
    public 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>>>() {
            @Override
            public Map<String,List<MenuDTO>> logic() {
                AccessTokenUser user = new AccessTokenUserAssembler().getAccessTokenUserFromReq(hreq);
                
                return layoutService.getLayoutMenus(user,fromType);
            }
        });
    }
Service服务+数据组装
@Override
    public 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>>() {
                @Override
                public 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登陆APP
           if(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;
}

返回值

在这里插入图片描述

效果图

请看最上面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/341903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Drools 规则属性讲解(结合代码实例讲解)

目录 一、规则属性总览 1.1 规则总览 二、具体属性讲解 2.1 enabled属性 2.1.1 代码实现 2.1.1.1 编写规则文件 2.1.1.2 编写规则实体对象 2.1.1.3 编写测试类 2.1.1.4 测试结果 2.2 dialect属性 2.3 salience属性 2.3.1 代码实现 2.3.1.1 编写规则文件 2.3.1.2 编…

超简单的OCR模块:cnocr

前言 毫无疑问的是&#xff0c;关于人工智能方向&#xff0c;python真的十分方便和有效。 这里呢&#xff0c;我将介绍python众多OCR模块中一个比较出色的模块&#xff1a;cnocr 模块介绍 cnocr是一个基于PyTorch的开源OCR库&#xff0c;它提供了一系列功能强大的中文OCR模型和…

网络安全的概述

网络空间的概念 2003年美国提出网络空间的概念&#xff1a;一个由信息基础设施组成的互相依赖的网络。 我国官方文件定义&#xff1a;网络空间为继海&#xff0c;陆&#xff0c;空&#xff0c;天以外的第五大人类活动领域 网络安全发展历史 通信保密阶段 --- 计算机安全阶段…

基于 Spring Boot+MySQL实现的在线考试系统源码+数据库,基于不同类型的客观题,进行自动组卷、批卷等功能的考试系统

1. 部署相关 1.1. 介绍 一个 JAVA 实现的在线考试系统,主要实现一套基于不同类型的客观题,进行自动组卷、批卷等功能的考试系统&#xff08;没有主观题&#xff09; 1.2. 系统架构 后端技术栈基于 Spring Boot数据库MySQLORMMyBatis & MyBatis-plus缓存Redis、guava的L…

漏洞复现--Confluence远程代码执行漏洞(CVE-2023-22527)

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

深兰科技陈海波出席“2023浙商年度主题大会”并与知名主持人白岩松对话

1月17日&#xff0c;“2023浙商年度主题大会”在浙江杭州举行。本次大会由浙商总会主办&#xff0c;来自全球的600余名浙商代表汇聚一堂&#xff0c;共叙乡情、共享机遇、共谋发展。在“浙商年度创新样本”发布环节中&#xff0c;深兰科技创始人、董事长陈海波作为人工智能领域…

windows用mingw(g++)编译opencv,opencv_contrib,并install安装

windows下用mingw编译opencv貌似不支持cuda&#xff0c;选cuda会报错&#xff0c;我无法解决&#xff0c;所以没选cuda&#xff0c;下面两种编译方式支持。 如要用msvc编译opencv&#xff0c;参考我另外一篇文章 https://blog.csdn.net/weixin_44733606/article/details/1357…

autosar学习笔记 之SecOC

SecOC 接下来SecOC标准就更复杂一点,它不单单是做了通讯校验。 SecOC是基于对称密钥加密的一套机制,需要对ECU间的通讯作身份认证处理,来更好的防止伪装攻击,谈起对称或非对称加密,就会涉及到密钥的存储和Mac值的计算。 因此SECOC机制对于密钥的硬件存储,也有一定的要求…

[C++] external “C“的作用和使用场景(案例)

C中extern "C"的作用是什么&#xff1f; 在 C 中&#xff0c;extern "C" 的作用是告诉编译器按照 C 语言的规范来处理函数名和变量名。这是因为 C 编译器会对函数名和变量名进行名称修饰(name mangling)&#xff0c;以区分不同的函数和变量。而在 C 语言中…

2024年天津市公务员考试报名开始啦

2024年天津市公务员考试报名开始&#xff0c;详细流程如下&#xff1a; ⭐报名入口&#xff1a;天津市公开招考公务员网上报名信息系统网站 ✅报名时间&#xff1a;2024年1月23日8:30-1月29日18:00 ✅资格审查时间&#xff1a;2024年1月23日8:30-1月30日18:00 ✅打印准考证…

element-ui 打包流程源码解析(下)

目录 目录结构和使用1&#xff0c;npm 安装1.1&#xff0c;完整引入1.2&#xff0c;按需引入 2&#xff0c;CDN3&#xff0c;国际化 接上文&#xff1a;element-ui 打包流程源码解析&#xff08;上&#xff09; 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…

Raspbian安装云台

Raspbian安装云台 1. 源由2. 选型3. 组装4. 调试4.1 python3-print问题4.2 python函数入参类型错误4.3 缺少mjpg-streamer可执行文件4.4 缺失编译头文件和库4.5 python库缺失4.6 图像无法显示&#xff0c;但libcamera-jpeg测试正常4.7 异常IOCTL报错4.8 Git问题 5. 效果5.1 WEB…

ftp连接报错:227 entering passive mode

用阿里的云服务器&#xff0c;宝塔安装的linux环境&#xff0c;ftp连接总包这个错误&#xff1a;227 entering passive mode 原因是云服务器没有放开39000/40000的端口 如果使用的是阿里云服务器&#xff0c;需要在安全组设置中&#xff0c;对22、21端口放行&#xff0c;并且…

layui 自定义日期选择器今日、昨日 、本周、本月、上个月等

1、layui 日期选择器 laydate日期选择器 <div class"layui-input-inline"><input class"layui-input" id"dateTime" placeholder"日期范围"> </div><script> layui.use([laydate], function () {laydate.ren…

从零学习开发一个RISC-V操作系统(四)丨RISC-V汇编语言编程

本篇文章的内容 一、RISC-V汇编语言简介1.1 RISC-V 汇编语言的基本格式1.2 RISC-V 汇编指令操作对象1.3 RISC-V 汇编指令编码格式1.4 RISC-V 汇编指令分类 二、RISC-V汇编语言详解2.1 add 加法指令2.2 sub 减法指令 本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习…

瑞_力扣LeetCode_104. 二叉树的最大深度

文章目录 题目 104. 二叉树的最大深度题解后序遍历 递归实现后序遍历 迭代实现层序遍历 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《刷题》的力扣LeetCode系列&#xff0c;主要以力扣LeetCode网的题进行解析与分享。本文仅供大家交流、学习及研究使用&#xff0c;禁…

关于图像分割项目的可视化脚本

1. 前言 之前实现了目标检测和图像分类任务的可视化脚本&#xff0c;本章将最后一个分割任务的可视化脚本实现 效果展示如下&#xff1a; 代码会在当前目录保存展示好的图片&#xff0c;从左到右依次为&#xff0c;原图、mask图、mask覆盖在原图的掩膜图 关于目标检测的可视化…

最长子字符串的长度(二) - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 给你一个字符串 s&#xff0c;字符串s首尾相连成一个环形 &#xff0c;请你在环中找出’l’、‘o’、‘x’ 字符都恰好出现了偶数次最长子字符串的长度。 输入描…

保护隐私数据:使用Java `transient`关键字

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 保护隐私数据&#xff1a;使用Java transient关键字 前言什么是java对象序列化transient关键字的基础知识序列化与反序列化过程避免transient的陷阱 前言 在数字时代&#xff0c;数据安全至关重要。无…

单片机中MCU跑RTOS相比裸机的优势

经常有读者问关于RTOS的问题&#xff0c;比如&#xff1a;我现在要不要学习RTOS&#xff1f; 学习RTOS有什么好处&#xff1f; 我的项目要不要跑RTOS&#xff1f; 问这些问题&#xff0c;其实归根结底还是对RTOS理解的不够&#xff0c;项目开发的经验还不足等。针对这部分朋友…