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

news2024/12/30 2:22:16

效果图

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

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

//信访听证 资源前缀
    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;
}

返回值

在这里插入图片描述

效果图

请看最上面

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud中服务间通信(应用间通信)-亲测有效-源码下载-连载2

1、微服务概述 本案例主要解决微服务之间的相互调用问题 如果已经理解什么是微服务&#xff0c;可以直接跳到实战。 本案例采用springBoot3.1.7springCloud2022.0.4版本测试 本案例使用springboot2.7.x版本测试代码相同 1、微服务是分布式架构&#xff0c;那么为什么要需要…

Unity中URP下的SimpleLit的 BlinnPhong高光反射计算

文章目录 前言一、回顾Blinn-Phong光照模型1、Blinn-Phong模型&#xff1a; 二、URP下的SimpleLit的 BlinnPhong1、输入参数2、程序体计算 前言 在上篇文章中&#xff0c;我们分析了 URP下的SimpleLit的 Lambert漫反射计算。 Unity中URP下的SimpleLit的 Lambert漫反射计算 我…

计算机网络自顶向下Wireshark labs1-Intro

Wireshark labs1 实验文档&#xff1a;http://www-net.cs.umass.edu/wireshark-labs/Wireshark_Intro_v8.0.pdf 介绍 加深对网络协议的理解通常可以通过观察协议的运行和不断调试协议来大大加深&#xff0c;具体而言&#xff0c;就是观察两个协议实体之间交换的报文序列&…

DEB方式安装elastic search7以及使用

参考&#xff1a;https://www.cnblogs.com/anech/p/15957607.html 1、安装elastic search7 #手动下载安装 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.1-amd64.deb wget https://artifacts.elastic.co/downloads/elasticsearch/elastics…

R语言简介

1.R语言 R语言是一种数学编程语言&#xff0c;主要用于统计分析、绘图和数据挖掘。 2.R语言特点 免费、开源&#xff0c;兼容性好&#xff08;Windows、MacOS或Linux)。具有多种数据类型&#xff0c;如向量、矩阵、因子、数据集等常用数据结构。多用于交互式数据分析&#x…

Linux配置yum源以及基本yum指令

文章目录 一、yum介绍二、什么是软件包三、配置yum源四、一键配置yum源【三步走】五、yum指令搜索软件安装软件卸载软件 六、其他yum指令更新内核更新软件更新指定软件显示所有可更新的软件清单卸载指定包并自动移除依赖包删除软件包&#xff0c;以及软件包数据和配置文件 一、…

灵眸边缘计算产品学习

EASY EAI灵眸科技 | 让边缘AI落地更简单 (easy-eai.com) 产品简介 支持4路1080P30fps视频流采集&#xff0c;四核CPU1.5GHz与2Tops AI边缘算力能力。集成有以太网、Wi-Fi、4G等网络通信外设&#xff1b;RS232、RS485、UART等本地通信接口。HDMI显示屏接口、音频输入输出等交互…

打造出色的 Prometheus 监控系统,看完后薪资翻倍?

一、监控概念&误区 监控是管理基础设施和业务的核心工具&#xff0c;监控应该和应用程序一起构建和部署&#xff0c;没有监控&#xff0c;将无法了解你的系统运行环境&#xff0c;进行故障诊断&#xff0c;也无法阻止提供系统性的性能、成本和状态等信息。 误区&#xff1…

【江科大】STM32:(超级详细)定时器输出比较

文章目录 输出比较单元特点 高级定时器&#xff1a;均有4个通道 PWM简介PWM&#xff08;Pulse Width Modulation&#xff09;脉冲宽度调制输出比较通道PWM基本结构基本定时器 参数计算捕获/比较通道的输出部分详细介绍如下&#xff1a; 舵机介绍硬件电路 直流电机介绍&#xff…

C# 使用System.Threading.Timer 实现计时器

写在前面 以往一般都是用 System.Timers.Timer 来做计时器&#xff0c;而 System.Threading.Timer 也可以实现计时器功能&#xff0c;并且还可以配置首次执行间隔&#xff0c;在功能上比System.Timers.Timer更加丰富&#xff1b;根据这个特性就可以实现按指定时间间隔对委托进…

JDX图片识别工具1.0版本发布啦

软件介绍 软件核心功能软件界面软件下载软件教程 软件核心功能 工作当中经常处理大量的图片&#xff0c;网上搜索的工具都无法满足需求&#xff0c;因此自己研发批量图片识别工具。 目前还是内测版&#xff0c;1.0版本主要包含如下特性&#xff1a; 批量识别图片&#xff0c…

前端JS加密与Buspsuite的坦诚相待

前端JS加密测试场景下的困惑 在渗透测试过程中经常会遇到JS前端加密的场景&#xff0c;假如不借助任何工具的情况下&#xff0c;我们一般是把JS代码进行扣取&#xff0c;本地进行加解密生成Payload&#xff0c;然后在Burpsuite里进行Payload替换。这种方式就存在一个很明显的问…

自然语言处理--双向匹配算法

自然语言处理作业1--双向匹配算法 一、概述 双向匹配算法是一种用于自然语言处理的算法&#xff0c;用于确定两个文本之间的相似度或匹配程度。该算法通常使用在文本对齐、翻译、语义匹配等任务中。 在双向匹配算法中&#xff0c;首先将两个文本分别进行处理&#xff0c;然后…

使用Docker部署Apache Superset结合内网穿透实现远程访问本地服务

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

操作系统导论-课后作业-ch14

1. 代码如下&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {int *i NULL;free(i);return 0; }执行结果如下&#xff1a; 可见&#xff0c;没有任何报错&#xff0c;执行完成。 2. 执行结果如下&#xff1a; 3. valgrind安装使用参考&a…

决策树的基本构建流程

决策树的基本构建流程 决策树的本质是挖掘有效的分类规则&#xff0c;然后以树的形式呈现。 这里有两个重点&#xff1a; 有效的分类规则&#xff1b;树的形式。 有效的分类规则&#xff1a;叶子节点纯度越高越好&#xff0c;就像我们分红豆和黄豆一样&#xff0c;我们当然…

UI设计中的插画运用优势(下)

6. 插画赋予设计以美学价值&#xff0c;更容易被接受 即使所有人都在分析和争论产品的可用性和易用性&#xff0c;大家在对美的追求上&#xff0c;始终保持着一致的态度。一个设计是否具备可取性&#xff0c;是否能够通过甲方、客户和实际用户&#xff0c;是每个设计人都需要面…

微服务Spring Cloud架构详解

"Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff09;。分布式系统的协调导致了样板模式, 使用Spring Cloud开…

c++QT文件IO

1、QFileDialog文件对话框 与QMessageBox一样&#xff0c;QFileDialog也继承了QDialog类&#xff0c;直接使用静态成员函数弹窗。弹出的结果&#xff08;选择文件的路径&#xff09;通过返回值获取。 1&#xff09;获取一个打开或保存的文件路径 // 获取一个打开或保存的文件路…

快速上手的AI工具-文心辅助学习

前言 大家好晚上好&#xff0c;现在AI技术的发展&#xff0c;它已经渗透到我们生活的各个层面。对于普通人来说&#xff0c;理解并有效利用AI技术不仅能增强个人竞争力&#xff0c;还能在日常生活中带来便利。无论是提高工作效率&#xff0c;还是优化日常任务&#xff0c;AI工…