소스 검색

用户角色修改

master
WendyYang 1 년 전
부모
커밋
03581dd73f
25개의 변경된 파일153개의 추가작업 그리고 579개의 파일을 삭제
  1. +2
    -10
      pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/InitProcessTask.java
  2. +26
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/sys/contant/RegionConst.java
  3. +0
    -20
      pmapi/src/main/java/com/ningdatech/pmapi/sys/contants/RegionContant.java
  4. +26
    -18
      pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/MenuController.java
  5. +0
    -20
      pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/NdRoleMenuDatascopeController.java
  6. +4
    -5
      pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/RoleController.java
  7. +8
    -30
      pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/Menu.java
  8. +0
    -72
      pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/NdRoleMenuDatascope.java
  9. +6
    -6
      pmapi/src/main/java/com/ningdatech/pmapi/sys/manage/RoleManage.java
  10. +0
    -16
      pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NdRoleMenuDatascopeMapper.java
  11. +0
    -5
      pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NdRoleMenuDatascopeMapper.xml
  12. +0
    -32
      pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/RoleAuthorityMapper.java
  13. +0
    -15
      pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/RoleAuthorityMapper.xml
  14. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IMenuService.java
  15. +0
    -16
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/INdRoleMenuDatascopeService.java
  16. +1
    -9
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IRoleService.java
  17. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IUserRoleService.java
  18. +0
    -71
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/RoleAuthorityService.java
  19. +7
    -6
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/MenuServiceImpl.java
  20. +0
    -20
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/NdRoleMenuDatascopeServiceImpl.java
  21. +0
    -185
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/RoleAuthorityServiceImpl.java
  22. +13
    -19
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/RoleServiceImpl.java
  23. +2
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/UserRoleServiceImpl.java
  24. +19
    -0
      pmapi/src/test/java/com/ningdatech/pmapi/AppTests.java
  25. +37
    -0
      pmapi/src/test/java/com/ningdatech/pmapi/sys/service/IMenuServiceTest.java

+ 2
- 10
pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/InitProcessTask.java 파일 보기

@@ -4,33 +4,25 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.StopWatch;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Maps;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.pmapi.scheduler.contants.TaskContant;
import com.ningdatech.pmapi.sys.contants.RegionContant;
import com.ningdatech.pmapi.sys.contant.RegionConst;
import com.ningdatech.pmapi.sys.entity.Region;
import com.ningdatech.pmapi.sys.service.IRegionService;
import com.wflow.bean.entity.WflowForms;
import com.wflow.bean.entity.WflowModelHistorys;
import com.wflow.bean.entity.WflowModels;
import com.wflow.contants.WflowContant;
import com.wflow.mapper.WflowModelHistorysMapper;
import com.wflow.mapper.WflowModelsMapper;
import com.wflow.workflow.service.ProcessModelService;
import com.wflow.workflow.service.WflowFormsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;

/**
@@ -63,7 +55,7 @@ public class InitProcessTask {
//1.查出丽水市下的 区县 分别去初始化 表单和流程配置数据
List<Region> regions = regionService.list(Wrappers.lambdaQuery(Region.class)
.eq(Region::getDeleted,Boolean.FALSE)
.eq(Region::getParentCode, RegionContant.LS_REGION_CODE));
.eq(Region::getParentCode, RegionConst.LS_REGION_CODE));

if(CollUtil.isEmpty(regions)){
throw new BizException("丽水地区数据为空 任务结束!");


+ 26
- 0
pmapi/src/main/java/com/ningdatech/pmapi/sys/contant/RegionConst.java 파일 보기

@@ -0,0 +1,26 @@
package com.ningdatech.pmapi.sys.contant;

/**
* <p>
* 地区常量
* </p>
*
* @author WendyYang
* @since 18:54 2023/1/28
*/
public interface RegionConst {

Integer FIRST_LEVEL = 1;

Integer SECOND_LEVEL = 2;

Integer THIRD_LEVEL = 3;

Long EMPTY_PARENT_ID = 0L;

/**
* 丽水地区CODE
*/
String LS_REGION_CODE = "331100";

}

+ 0
- 20
pmapi/src/main/java/com/ningdatech/pmapi/sys/contants/RegionContant.java 파일 보기

@@ -1,20 +0,0 @@
package com.ningdatech.pmapi.sys.contants;

/**
* @Classname RegionContant
* @Description
* @Date 2023/1/18 9:37
* @Created by PoffyZhang
*/
public interface RegionContant {

public static final Integer FIRST_LEVEL = 1;

public static final Integer SECOND_LEVEL = 2;

public static final Integer THIRD_LEVEL = 3;

public static final Long EMPTY_PARENT_ID = 0L;
//丽水地区CODE
public static final String LS_REGION_CODE = "331100";
}

+ 26
- 18
pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/MenuController.java 파일 보기

@@ -1,9 +1,12 @@
package com.ningdatech.pmapi.sys.controller;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.basic.auth.AbstractLoginUserUtil;
import com.ningdatech.basic.util.CollUtils;
import com.ningdatech.log.annotation.WebLog;
import com.ningdatech.pmapi.common.model.entity.MenuTreeEntity;
import com.ningdatech.pmapi.common.utils.TreeUtil;
import com.ningdatech.pmapi.sys.entity.Menu;
import com.ningdatech.pmapi.sys.entity.dto.MenuQueryDTO;
@@ -12,7 +15,7 @@ import com.ningdatech.pmapi.sys.entity.dto.MenuUpdateDTO;
import com.ningdatech.pmapi.sys.entity.vo.MenuRoleVO;
import com.ningdatech.pmapi.sys.entity.vo.MenuVO;
import com.ningdatech.pmapi.sys.manage.MenuManage;
import com.ningdatech.pmapi.sys.service.MenuService;
import com.ningdatech.pmapi.sys.service.IMenuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -25,11 +28,10 @@ import java.util.List;

/**
* <p>
* 前端控制器
* 菜单
* 前端控制器-菜单
* </p>
*
* @author PoffyZhang
* @author WendyYang
* @since 2022-09-30
*/
@Slf4j
@@ -40,39 +42,43 @@ import java.util.List;
@Api(value = "Menu", tags = "系统管理-菜单")
public class MenuController {

private final MenuService menuService;
private final IMenuService menuService;
private final MenuManage menuManage;

/**
* 查询系统中所有的的菜单树结构, 不用缓存,因为该接口很少会使用,就算使用,也会管理员维护菜单时使用
*/
@ApiOperation(value = "查询系统所有的菜单", notes = "查询系统所有的菜单")
@ApiOperation("查询系统所有的菜单")
@GetMapping("/list")
public List<Menu> allTree(@Valid @RequestParam(required = false, value = "title") String title) {
List<Menu> list = menuService.list(Wrappers.lambdaQuery(Menu.class).orderByAsc(Menu::getSort));
return TreeUtil.buildTree(list, title);
}

@ApiOperation("查询系统所有数据权限的菜单")
@GetMapping("/listByDataScope")
public List<Menu> allTreeByDataScope() {
LambdaQueryWrapper<Menu> dsQuery = Wrappers.lambdaQuery(Menu.class)
.eq(Menu::getHasDataScope, Boolean.TRUE)
.orderByAsc(Menu::getSort);
List<Menu> list = menuService.list(dsQuery);
if (!list.isEmpty()) {
List<Long> pidList = CollUtils.fieldList(list, MenuTreeEntity::getPid);
list.addAll(menuService.listByIds(pidList));
}
return TreeUtil.buildTree(list);
}

@ApiOperation(value = "查询当前登录用户的菜单", notes = "查询当前登录用户的菜单")
@GetMapping("/current_user_menu")
@GetMapping("/myMenu")
public List<MenuRoleVO> currentUserMenu() {
List<Menu> list = menuService.list(Wrappers.lambdaQuery(Menu.class).orderByAsc(Menu::getSort));
// TODO:登录用户信息
return menuManage.buildUserMenu(list, null);
}

/**
* 查询某个菜单
*
* @param id 主键id
* @return 查询结果
*/
@ApiOperation(value = "查询菜单", notes = "查询菜单")
@GetMapping("/details")
public MenuQueryDTO getDetails(@RequestParam Long id) {
Menu menu = menuService.getById(id);
MenuQueryDTO query = BeanUtil.toBean(menu, MenuQueryDTO.class);
return query;
return BeanUtil.toBean(menu, MenuQueryDTO.class);
}

@ApiOperation(value = "保存新菜单", notes = "保存新菜单")
@@ -86,6 +92,7 @@ public class MenuController {

@ApiOperation(value = "编辑菜单", notes = "编辑菜单")
@PostMapping("/modify")
@WebLog("编辑菜单")
public MenuVO handlerUpdate(@RequestBody MenuUpdateDTO data) {
menuService.update(data, AbstractLoginUserUtil.getUserId());
return BeanUtil.toBean(data, MenuVO.class);
@@ -93,6 +100,7 @@ public class MenuController {

@ApiOperation(value = "删除菜单", notes = "删除菜单")
@PostMapping("/remove")
@WebLog("删除菜单")
public Boolean handlerDelete(@RequestBody List<Long> ids) {
return menuService.removeByIdWithCache(ids);
}


+ 0
- 20
pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/NdRoleMenuDatascopeController.java 파일 보기

@@ -1,20 +0,0 @@
package com.ningdatech.pmapi.sys.controller;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;

/**
* <p>
* 角色菜单数据权限关联表 前端控制器
* </p>
*
* @author WendyYang
* @since 2023-01-28
*/
@Controller
@RequestMapping("/pmapi.sys/nd-role-menu-datascope")
public class NdRoleMenuDatascopeController {

}

+ 4
- 5
pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/RoleController.java 파일 보기

@@ -10,7 +10,7 @@ import com.ningdatech.pmapi.sys.entity.dto.RoleSaveDTO;
import com.ningdatech.pmapi.sys.entity.dto.RoleUpdateDTO;
import com.ningdatech.pmapi.sys.entity.vo.RoleVO;
import com.ningdatech.pmapi.sys.manage.RoleManage;
import com.ningdatech.pmapi.sys.service.RoleService;
import com.ningdatech.pmapi.sys.service.IRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -24,11 +24,10 @@ import java.util.Objects;

/**
* <p>
* 前端控制器
* 角色
* 前端控制器-角色
* </p>
*
* @author PoffyZhang
* @author WendyYang
* @since 2022-09-30
*/
@Slf4j
@@ -39,7 +38,7 @@ import java.util.Objects;
@RequiredArgsConstructor
public class RoleController {

private final RoleService roleService;
private final IRoleService roleService;
private final RoleManage roleManage;




+ 8
- 30
pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/Menu.java 파일 보기

@@ -34,62 +34,40 @@ public class Menu extends MenuTreeEntity<Menu, Long> {

private static final long serialVersionUID = 1L;

/**
* 权限"
*/
@ApiModelProperty(value = "权限")
@Size(max = 200, message = "权限长度不能超过200")
@TableField(value = "permission", condition = LIKE)
private String permission;
/**
* 类型;[0-菜单 1-目录 2-按钮]
*/
@ApiModelProperty(value = "类型")
@TableField(value = "type")
private Integer type;

/**
* 组件
*/
@ApiModelProperty(value = "组件")
@Size(max = 255, message = "组件长度不能超过255")
@TableField(value = "component", condition = LIKE)
private String component;

/**
* 菜单图标
*/
@ApiModelProperty(value = "菜单图标")
@Size(max = 255, message = "菜单图标长度不能超过255")
@TableField(value = "icon", condition = LIKE)
private String icon;

/**
* 子菜单数目
*/
@ApiModelProperty(value = "是否隐藏")
@TableField(value = "hidden")
private Boolean hidden;

/**
* activeMenu
*/
@ApiModelProperty(value = "activeMenu")
@TableField(value = "active_menu")
private String activeMenu;


/**
* 跳转
*/
@ApiModelProperty(value = "跳转")
@TableField(value = "redirect")
private String redirect;

@ApiModelProperty("是否有数据权限")
private Boolean hasDataScope;

@ApiModelProperty("数据权限选项")
private String dataScopeOption;

private Long updateBy;

private Long createBy;

private LocalDateTime updateOn;

private LocalDateTime createOn;

}

+ 0
- 72
pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/NdRoleMenuDatascope.java 파일 보기

@@ -1,72 +0,0 @@
package com.ningdatech.pmapi.sys.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
* <p>
* 角色菜单数据权限关联表
* </p>
*
* @author WendyYang
* @since 2023-01-28
*/
@TableName("nd_role_menu_datascope")
@ApiModel(value = "NdRoleMenuDatascope对象", description = "角色菜单数据权限关联表")
public class NdRoleMenuDatascope implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("主键")
private Long id;

@ApiModelProperty("角色ID")
private Long roleId;

@ApiModelProperty("菜单ID")
private Long menuId;

@ApiModelProperty("数据权限")
private Integer datascope;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}
public Long getRoleId() {
return roleId;
}

public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public Long getMenuId() {
return menuId;
}

public void setMenuId(Long menuId) {
this.menuId = menuId;
}
public Integer getDatascope() {
return datascope;
}

public void setDatascope(Integer datascope) {
this.datascope = datascope;
}

@Override
public String toString() {
return "NdRoleMenuDatascope{" +
"id=" + id +
", roleId=" + roleId +
", menuId=" + menuId +
", datascope=" + datascope +
"}";
}
}

+ 6
- 6
pmapi/src/main/java/com/ningdatech/pmapi/sys/manage/RoleManage.java 파일 보기

@@ -13,8 +13,8 @@ import com.ningdatech.pmapi.sys.entity.dto.RolePageReq;
import com.ningdatech.pmapi.sys.entity.vo.MenuRoleVO;
import com.ningdatech.pmapi.sys.entity.vo.RoleVO;
import com.ningdatech.pmapi.sys.service.IRoleMenuService;
import com.ningdatech.pmapi.sys.service.MenuService;
import com.ningdatech.pmapi.sys.service.RoleService;
import com.ningdatech.pmapi.sys.service.IMenuService;
import com.ningdatech.pmapi.sys.service.IRoleService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
@@ -35,8 +35,8 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class RoleManage {

private final RoleService roleService;
private final MenuService menuService;
private final IRoleService IRoleService;
private final IMenuService IMenuService;

private final IRoleMenuService roleMenuService;

@@ -51,13 +51,13 @@ public class RoleManage {
private void searchList(Page<Role> page, LambdaQueryWrapper<Role> wrapper, RolePageReq rolePageReq) {
wrapper.like(StringUtils.isNotBlank(rolePageReq.getName()), Role::getName, rolePageReq.getName())
.orderByDesc(Role::getUpdateOn);
roleService.page(page, wrapper);
IRoleService.page(page, wrapper);
}


public void buildMenu(RoleVO query) {
//改成直接返回有权限的
List<Menu> list = menuService.list(Wrappers.lambdaQuery(Menu.class).orderByAsc(Menu::getSort));
List<Menu> list = IMenuService.list(Wrappers.lambdaQuery(Menu.class).orderByAsc(Menu::getSort));
List<RoleMenu> roleMenus = roleMenuService.list(Wrappers.lambdaQuery(RoleMenu.class)
.eq(RoleMenu::getRoleId, query.getId()));
List<MenuRoleVO> menus = list.stream().map(menu -> {


+ 0
- 16
pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NdRoleMenuDatascopeMapper.java 파일 보기

@@ -1,16 +0,0 @@
package com.ningdatech.pmapi.sys.mapper;

import com.ningdatech.pmapi.sys.entity.NdRoleMenuDatascope;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
* <p>
* 角色菜单数据权限关联表 Mapper 接口
* </p>
*
* @author WendyYang
* @since 2023-01-28
*/
public interface NdRoleMenuDatascopeMapper extends BaseMapper<NdRoleMenuDatascope> {

}

+ 0
- 5
pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NdRoleMenuDatascopeMapper.xml 파일 보기

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.sys.mapper.NdRoleMenuDatascopeMapper">

</mapper>

+ 0
- 32
pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/RoleAuthorityMapper.java 파일 보기

@@ -1,32 +0,0 @@
package com.ningdatech.pmapi.sys.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ningdatech.pmapi.sys.entity.RoleAuthority;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
* <p>
* Mapper 接口
* 角色的资源
* </p>
*
* @author PoffyZhang
*/
@Repository
public interface RoleAuthorityMapper extends BaseMapper<RoleAuthority> {

/**
* 根据用户-角色-数据权限关系,查询可用的数据权限ID
* <p>
* 角色被禁用后,用户不在拥有此角色的权限
*
* @param userId 用户ID
* @param category 角色类别
* @return /
*/
List<Long> selectDataScopeIdFromRoleByUserId(@Param("userId") Long userId, @Param("category") String category);

}

+ 0
- 15
pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/RoleAuthorityMapper.xml 파일 보기

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.sys.mapper.RoleAuthorityMapper">

<select id="selectDataScopeIdFromRoleByUserId" parameterType="map" resultType="java.lang.Long">
SELECT DISTINCT rrds.authority_id
FROM nd_role_authority rrds
INNER JOIN nd_role r on r.id = rrds.role_id
INNER JOIN nd_user_role er on er.role_id = r.id
WHERE r.category = #{category}
and er.user_id = #{userId}
and r.state = true
</select>

</mapper>

pmapi/src/main/java/com/ningdatech/pmapi/sys/service/MenuService.java → pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IMenuService.java 파일 보기

@@ -16,7 +16,7 @@ import java.util.List;
* @author WendyYang
* @since 2022-09-30
*/
public interface MenuService extends IService<Menu> {
public interface IMenuService extends IService<Menu> {

/**
* 根据ID删除

+ 0
- 16
pmapi/src/main/java/com/ningdatech/pmapi/sys/service/INdRoleMenuDatascopeService.java 파일 보기

@@ -1,16 +0,0 @@
package com.ningdatech.pmapi.sys.service;

import com.ningdatech.pmapi.sys.entity.NdRoleMenuDatascope;
import com.baomidou.mybatisplus.extension.service.IService;

/**
* <p>
* 角色菜单数据权限关联表 服务类
* </p>
*
* @author WendyYang
* @since 2023-01-28
*/
public interface INdRoleMenuDatascopeService extends IService<NdRoleMenuDatascope> {

}

pmapi/src/main/java/com/ningdatech/pmapi/sys/service/RoleService.java → pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IRoleService.java 파일 보기

@@ -16,7 +16,7 @@ import java.util.List;
* @author PoffyZhang
* @since 2022-09-30
*/
public interface RoleService extends IService<Role> {
public interface IRoleService extends IService<Role> {


/**
@@ -28,14 +28,6 @@ public interface RoleService extends IService<Role> {
boolean removeByIdWithCache(List<Long> ids);

/**
* 判断用户是否 租户系统的超级管理员
*
* @param code 角色编码
* @return 是否成功
*/
boolean isPtAdmin(String code);

/**
* 查询用户拥有的角色
*
* @param userId 用户id

pmapi/src/main/java/com/ningdatech/pmapi/sys/service/UserRoleService.java → pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IUserRoleService.java 파일 보기

@@ -12,7 +12,7 @@ import com.ningdatech.pmapi.sys.entity.UserRole;
*
* @author PoffyZhang
*/
public interface UserRoleService extends IService<UserRole> {
public interface IUserRoleService extends IService<UserRole> {
/**
* 初始化超级管理员角色 权限
*

+ 0
- 71
pmapi/src/main/java/com/ningdatech/pmapi/sys/service/RoleAuthorityService.java 파일 보기

@@ -1,71 +0,0 @@
package com.ningdatech.pmapi.sys.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ningdatech.pmapi.sys.entity.RoleAuthority;
import com.ningdatech.pmapi.sys.entity.dto.RoleAuthoritySaveDTO;
import com.ningdatech.pmapi.sys.entity.dto.RoleUserSaveVO;
import com.ningdatech.pmapi.sys.entity.dto.UserRoleSaveDTO;

import java.util.List;

/**
* <p>
* 业务接口
* 角色的资源
* </p>
*
* @author PoffyZhang
*/
public interface RoleAuthorityService extends IService<RoleAuthority> {
/**
* 根据用户-角色-数据权限关系,查询可用的数据权限ID
* <p>
* 角色被禁用后,用户不在拥有此角色的权限
*
* @param userId 用户ID
* @param category 角色类别
* @return
*/
List<Long> selectDataScopeIdFromRoleByUserId(Long userId, String category);

/**
* 给用户分配角色
*
* @param userRole 用于角色
* @return 是否成功
*/
boolean saveUserRole(UserRoleSaveDTO userRole);

/**
* 给角色绑定用户
*
* @param roleUser 用于角色
* @return 是否成功
*/
List<Long> saveRoleUser(RoleUserSaveVO roleUser);

/**
* 根据角色查找用户
*
* @param roleId 角色ID
* @return
*/
List<Long> findUserIdByRoleId(Long roleId);

/**
* 给角色重新分配 权限(资源/菜单)
*
* @param roleAuthoritySaveDTO 角色授权信息
* @return 是否成功
*/
boolean saveRoleAuthority(RoleAuthoritySaveDTO roleAuthoritySaveDTO);

/**
* 根据权限id 删除
*
* @param ids id
* @return 是否成功
*/
boolean removeByAuthorityId(List<Long> ids);

}

+ 7
- 6
pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/MenuServiceImpl.java 파일 보기

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
@@ -16,7 +17,7 @@ import com.ningdatech.pmapi.sys.entity.enumeration.MenuTypeEnum;
import com.ningdatech.pmapi.sys.entity.dto.MenuSaveDTO;
import com.ningdatech.pmapi.sys.entity.dto.MenuUpdateDTO;
import com.ningdatech.pmapi.sys.mapper.MenuMapper;
import com.ningdatech.pmapi.sys.service.MenuService;
import com.ningdatech.pmapi.sys.service.IMenuService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -40,7 +41,7 @@ import static com.ningdatech.basic.util.StrPool.DEF_PARENT_ID;
@Slf4j
@Service
@RequiredArgsConstructor
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {

@Override
@Transactional(rollbackFor = Exception.class)
@@ -55,8 +56,7 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements Me
//子菜单id
subMenus(ids, lastIds);

boolean result = this.removeByIds(lastIds);
return result;
return this.removeByIds(lastIds);
}

private void subMenus(List<Long> ids, List<Long> lastIds) {
@@ -105,8 +105,9 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements Me
}

public Boolean checkTitle(Long id, String title) {
return baseMapper.selectCount(Wrappers.lambdaQuery(Menu.class).ne(Menu::getId, id)
.in(Menu::getType, MenuTypeEnum.MENU.getCode()).eq(Menu::getTitle, title)) > 0;
LambdaQueryWrapper<Menu> wrapper = Wrappers.lambdaQuery(Menu.class)
.ne(Menu::getId, id).eq(Menu::getTitle, title);
return baseMapper.selectCount(wrapper) > 0;
}

@Override


+ 0
- 20
pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/NdRoleMenuDatascopeServiceImpl.java 파일 보기

@@ -1,20 +0,0 @@
package com.ningdatech.pmapi.sys.service.impl;

import com.ningdatech.pmapi.sys.entity.NdRoleMenuDatascope;
import com.ningdatech.pmapi.sys.mapper.NdRoleMenuDatascopeMapper;
import com.ningdatech.pmapi.sys.service.INdRoleMenuDatascopeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
* <p>
* 角色菜单数据权限关联表 服务实现类
* </p>
*
* @author WendyYang
* @since 2023-01-28
*/
@Service
public class NdRoleMenuDatascopeServiceImpl extends ServiceImpl<NdRoleMenuDatascopeMapper, NdRoleMenuDatascope> implements INdRoleMenuDatascopeService {

}

+ 0
- 185
pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/RoleAuthorityServiceImpl.java 파일 보기

@@ -1,185 +0,0 @@
package com.ningdatech.pmapi.sys.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ningdatech.cache.repository.CachePlusOps;
import com.ningdatech.pmapi.sys.entity.RoleAuthority;
import com.ningdatech.pmapi.sys.entity.UserRole;
import com.ningdatech.pmapi.sys.entity.dto.RoleAuthoritySaveDTO;
import com.ningdatech.pmapi.sys.entity.dto.RoleUserSaveVO;
import com.ningdatech.pmapi.sys.entity.dto.UserRoleSaveDTO;
import com.ningdatech.pmapi.sys.entity.enumeration.AuthorizeType;
import com.ningdatech.pmapi.sys.mapper.ResourceMapper;
import com.ningdatech.pmapi.sys.mapper.RoleAuthorityMapper;
import com.ningdatech.pmapi.sys.service.RoleAuthorityService;
import com.ningdatech.pmapi.sys.service.UserRoleService;
import com.ningdatech.pmapi.sys.utils.AuthCacheKeyUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

/**
* <p>
* 业务实现类
* 角色的资源
* </p>
*
* @author PoffyZhang
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class RoleAuthorityServiceImpl extends ServiceImpl<RoleAuthorityMapper, RoleAuthority> implements RoleAuthorityService {

private final UserRoleService userRoleService;
private final ResourceMapper resourceMapper;
private final CachePlusOps cachePlusOps;

@Override
public List<Long> selectDataScopeIdFromRoleByUserId(Long userId, String category) {
return baseMapper.selectDataScopeIdFromRoleByUserId(userId, category);
}

@Override
@Transactional(rollbackFor = Exception.class)
public List<Long> saveRoleUser(RoleUserSaveVO saveVO) {
Assert.notEmpty(saveVO.getUserIdList(), "请选择用户");
if (saveVO.getFlag() == null) {
saveVO.setFlag(true);
}

userRoleService.remove(Wrappers.lambdaQuery(UserRole.class).eq(UserRole::getRoleId, saveVO.getRoleId()).in(UserRole::getUserId, saveVO.getUserIdList()));
if (saveVO.getFlag()) {
List<UserRole> list = saveVO.getUserIdList().stream().map(employeeId ->
UserRole.builder().userId(employeeId).roleId(saveVO.getRoleId()).build()).collect(Collectors.toList());
userRoleService.saveBatch(list);
}
return findUserIdByRoleId(saveVO.getRoleId());
}

@Override
public List<Long> findUserIdByRoleId(Long roleId) {
return userRoleService.listObjs(Wrappers.lambdaQuery(UserRole.class)
.select(UserRole::getUserId).eq(UserRole::getRoleId, roleId),
Convert::toLong);
}

@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveUserRole(UserRoleSaveDTO userRole) {
List<UserRole> oldUserRoleList = userRoleService.list(Wrappers.lambdaQuery(UserRole.class).eq(UserRole::getRoleId, userRole.getRoleId()));
userRoleService.remove(Wrappers.lambdaQuery(UserRole.class).eq(UserRole::getRoleId, userRole.getRoleId()));

Set<Long> delIdList = new HashSet<>();
if (CollUtil.isNotEmpty(userRole.getUserIdList())) {
List<UserRole> list = userRole.getUserIdList()
.stream()
.map(userId -> UserRole.builder()
.userId(userId)
.roleId(userRole.getRoleId())
.build())
.collect(Collectors.toList());
userRoleService.saveBatch(list);
delIdList.addAll(userRole.getUserIdList());
}
if (!oldUserRoleList.isEmpty()) {
delIdList.addAll(oldUserRoleList.stream().map(UserRole::getUserId).collect(Collectors.toSet()));
}
delUserAuthority(delIdList);
return true;
}

@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveRoleAuthority(RoleAuthoritySaveDTO dto) {
Assert.notNull(dto.getRoleId(), "请选择角色");

//删除角色和资源的关联
super.remove(Wrappers.lambdaQuery(RoleAuthority.class).eq(RoleAuthority::getRoleId, dto.getRoleId()));

List<RoleAuthority> list = new ArrayList<>();
if (dto.getResourceIdList() != null && !dto.getResourceIdList().isEmpty()) {
List<Long> menuIdList = resourceMapper.findMenuIdByResourceId(dto.getResourceIdList());
if (dto.getMenuIdList() == null || dto.getMenuIdList().isEmpty()) {
dto.setMenuIdList(menuIdList);
} else {
dto.getMenuIdList().addAll(menuIdList);
}

//保存授予的资源resourceMapper
List<RoleAuthority> resourceList = new HashSet<>(dto.getResourceIdList())
.stream()
.map(resourceId -> RoleAuthority.builder()
.authorityType(AuthorizeType.RESOURCE)
.authorityId(resourceId)
.roleId(dto.getRoleId())
.build())
.collect(Collectors.toList());
list.addAll(resourceList);
}
if (dto.getMenuIdList() != null && !dto.getMenuIdList().isEmpty()) {
//保存授予的菜单
List<RoleAuthority> menuList = new HashSet<>(dto.getMenuIdList())
.stream()
.map(menuId -> RoleAuthority.builder()
.authorityType(AuthorizeType.MENU)
.authorityId(menuId)
.roleId(dto.getRoleId())
.build())
.collect(Collectors.toList());
list.addAll(menuList);
}
super.saveBatch(list);

// 角色下的所有用户
List<Long> userIdList = userRoleService.listObjs(
Wrappers.lambdaQuery(UserRole.class)
.select(UserRole::getUserId)
.eq(UserRole::getRoleId, dto.getRoleId()),
Convert::toLong);

delUserAuthority(userIdList);
cachePlusOps.del(AuthCacheKeyUtils.roleResourceCacheKey(dto.getRoleId()));
cachePlusOps.del(AuthCacheKeyUtils.roleResourceCacheKey((dto.getRoleId())));
return true;
}

@Override
@Transactional(rollbackFor = Exception.class)
public boolean removeByAuthorityId(List<Long> ids) {
List<Long> roleIds = listObjs(
Wrappers.lambdaQuery(RoleAuthority.class)
.select(RoleAuthority::getRoleId)
.in(RoleAuthority::getAuthorityId, ids),
Convert::toLong);

if (!roleIds.isEmpty()) {
remove(Wrappers.lambdaQuery(RoleAuthority.class).in(RoleAuthority::getAuthorityId, ids));
List<Long> userIdList = userRoleService.listObjs(
Wrappers.lambdaQuery(UserRole.class).select(UserRole::getUserId).in(UserRole::getRoleId, roleIds),
Convert::toLong);

delUserAuthority(userIdList);
roleIds.forEach(roleId -> {
cachePlusOps.del(AuthCacheKeyUtils.roleResourceCacheKey(roleId));
cachePlusOps.del(AuthCacheKeyUtils.roleMenuCacheKey(roleId));
});
}
return true;
}

private void delUserAuthority(Collection<Long> collections) {
collections.forEach(userId -> {
cachePlusOps.del(AuthCacheKeyUtils.userResourceCacheKey(userId));
cachePlusOps.del(AuthCacheKeyUtils.userMenuCacheKey(userId));
cachePlusOps.del(AuthCacheKeyUtils.userRoleCacheKey(userId));
});
}
}

+ 13
- 19
pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/RoleServiceImpl.java 파일 보기

@@ -38,10 +38,9 @@ import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {

private final RoleAuthorityService roleAuthorityService;
private final UserRoleService userRoleService;
private final IUserRoleService IUserRoleService;
private final RoleMapper roleMapper;
private final IRoleMenuDatascopeService roleMenuDatascopeService;

@@ -49,15 +48,10 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro

private final IRoleMenuService roleMenuService;

private final MenuService menuService;
private final IMenuService IMenuService;

private static final String SUPER_ADMIN = "SUPER_ADMIN";

@Override
public boolean isPtAdmin(String code) {
return SUPER_ADMIN.equals(code);
}


/**
* 删除角色时,需要级联删除跟角色相关的一切资源:
@@ -74,7 +68,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
return true;
}

if (userRoleService.count(Wrappers.lambdaQuery(UserRole.class).select(UserRole::getUserId)
if (IUserRoleService.count(Wrappers.lambdaQuery(UserRole.class).select(UserRole::getUserId)
.in(UserRole::getRoleId, ids)) > 0) {
throw new BizException(ExceptionCode.OPERATION_EX.getCode(), "该角色下还有用户 不能随意删除!");
}
@@ -83,7 +77,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
boolean removeFlag = removeByIds(ids);

//角色拥有的用户
userRoleService.remove(Wrappers.lambdaQuery(UserRole.class).in(UserRole::getRoleId, ids));
IUserRoleService.remove(Wrappers.lambdaQuery(UserRole.class).in(UserRole::getRoleId, ids));
if (removeFlag) {
// 角色绑定了那些用户
if (roleMenuService.remove(Wrappers.lambdaQuery(RoleMenu.class).in(RoleMenu::getRoleId, ids))) {
@@ -190,14 +184,14 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
roleMenuService.remove(Wrappers.lambdaQuery(RoleMenu.class).eq(RoleMenu::getRoleId, roleId));
Set<RoleMenu> toAddMenus = new HashSet<>();
for (Long menuId : menuIds) {
Menu menu = menuService.getById(menuId);
Menu menu = IMenuService.getById(menuId);
if (Objects.isNull(menu)) {
continue;
}
RoleMenu roleMenu = new RoleMenu(null, menuId, roleId);
toAddMenus.add(roleMenu);
//父级菜单
// addParent(toAddMenus,menu,roleId);
// 父级菜单
// addParent(toAddMenus,menu,roleId);
}
if (CollUtil.isNotEmpty(toAddMenus)) {
roleMenuService.saveBatch(toAddMenus);
@@ -206,15 +200,15 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
}

private void addParent(Set<RoleMenu> toAddMenus, Menu menu, Long roleId) {
if (Objects.isNull(menu.getPid()) || menu.getPid().equals(0)) {
if (Objects.isNull(menu.getPid()) || menu.getPid().equals(0L)) {
return;
}
Menu parant = menuService.getById(menu.getPid());
if (Objects.isNull(parant)) {
Menu parent = IMenuService.getById(menu.getPid());
if (Objects.isNull(parent)) {
return;
}
RoleMenu roleMenu = new RoleMenu(null, parant.getId(), roleId);
RoleMenu roleMenu = new RoleMenu(null, parent.getId(), roleId);
toAddMenus.add(roleMenu);
addParent(toAddMenus, parant, roleId);
addParent(toAddMenus, parent, roleId);
}
}

+ 2
- 2
pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/UserRoleServiceImpl.java 파일 보기

@@ -8,7 +8,7 @@ import com.ningdatech.pmapi.sys.entity.Role;
import com.ningdatech.pmapi.sys.entity.UserRole;
import com.ningdatech.pmapi.sys.mapper.RoleMapper;
import com.ningdatech.pmapi.sys.mapper.UserRoleMapper;
import com.ningdatech.pmapi.sys.service.UserRoleService;
import com.ningdatech.pmapi.sys.service.IUserRoleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -26,7 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
@RequiredArgsConstructor
public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper, UserRole> implements UserRoleService {
public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper, UserRole> implements IUserRoleService {

private static final String INIT_ROLE_CODE = "SUPER_ADMIN";



+ 19
- 0
pmapi/src/test/java/com/ningdatech/pmapi/AppTests.java 파일 보기

@@ -0,0 +1,19 @@
package com.ningdatech.pmapi;

import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
* <p>
* AppRunTests
* </p>
*
* @author WendyYang
* @since 19:27 2022/5/10
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AppTests {

}

+ 37
- 0
pmapi/src/test/java/com/ningdatech/pmapi/sys/service/IMenuServiceTest.java 파일 보기

@@ -0,0 +1,37 @@
package com.ningdatech.pmapi.sys.service;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import com.ningdatech.pmapi.AppTests;
import com.ningdatech.pmapi.sys.entity.Menu;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.sql.SQLException;
import java.util.List;

/**
* <p>
* IMenuServiceTest
* </p>
*
* @author WendyYang
* @since 11:18 2023/1/29
*/
class IMenuServiceTest extends AppTests {

@Autowired
private IMenuService menuService;

@Test
public void test() throws SQLException {
menuService.remove(null);
List<Entity> menu = Db.use().findAll("nd_menu");
menu.forEach(System.out::println);
menu.forEach(w -> {
Menu bean = w.toBean(Menu.class);
menuService.save(bean);
});
}

}

불러오는 중...
취소
저장