提交 7fa442bf 编写于 作者: H horizons

refactor: 菜单权限重构

上级 eaef2f3b
......@@ -42,5 +42,11 @@
<artifactId>common-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.youlai</groupId>
<artifactId>common-security</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
......@@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
import com.youlai.common.constant.GlobalConstants;
import com.youlai.common.mybatis.annotation.DataPermission;
import com.youlai.common.security.util.SecurityUtils;
import com.youlai.common.web.util.JwtUtils;
import com.youlai.common.web.util.UserUtils;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.*;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
......@@ -18,6 +18,7 @@ import net.sf.jsqlparser.schema.Column;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Set;
/**
* 部门数据权限
......@@ -39,7 +40,7 @@ public class MyDataPermissionHandler implements DataPermissionHandler {
DataPermission annotation = method.getAnnotation(DataPermission.class);
if (ObjectUtils.isNotEmpty(annotation) && (method.getName().equals(methodName) || (method.getName() + "_COUNT").equals(methodName))) {
// 获取当前的用户角色
List<String> roles = UserUtils.getRoles();
Set<String> roles = SecurityUtils.getRoles();
if (!roles.isEmpty() && roles.contains(GlobalConstants.ROOT_ROLE_CODE)) {
// 如果是超级管理员则放行
return where;
......@@ -82,7 +83,7 @@ public class MyDataPermissionHandler implements DataPermissionHandler {
* @return
*/
private static Expression getDeptId() {
LongValue deptId = new LongValue(JwtUtils.getJwtPayload().getLong("deptId"));
LongValue deptId = new LongValue(SecurityUtils.getDeptId());
return deptId;
}
......
......@@ -34,8 +34,6 @@
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -3,6 +3,7 @@ package com.youlai.common.security.dto;
import lombok.Data;
import java.util.List;
import java.util.Set;
/**
* OAuth2 认证用户信息
......@@ -36,7 +37,7 @@ public class UserAuthDTO {
/**
* 用户角色编码集合 ["ROOT","ADMIN"]
*/
private List<String> roles;
private Set<String> roles;
/**
* 部门ID
......@@ -46,6 +47,6 @@ public class UserAuthDTO {
/**
* 用户权限标识集合["sys:user:add"]
*/
private List<String> perms;
private Set<String> perms;
}
......@@ -7,6 +7,7 @@ import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
......@@ -47,4 +48,14 @@ public class SecurityUtils {
return roles;
}
/**
* 是否超级管理员
*
* @return
*/
public static boolean isRoot(){
Set<String> roles = getRoles();
return CollectionUtil.isNotEmpty(roles) && roles.contains("ROOT");
}
}
......@@ -4,6 +4,9 @@ import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.HibernateValidator;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
......@@ -19,6 +22,8 @@ import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.TimeZone;
......@@ -27,20 +32,29 @@ import java.util.TimeZone;
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = converter.getObjectMapper();
// 日期、时区配置
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// 后台Long值传递给前端精度丢失问题(JS最大精度整数是Math.pow(2,53))
// 基础模块配置
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.class, ToStringSerializer.instance); // 后台Long值传递给前端精度丢失问题(JS最大精度整数是Math.pow(2,53))
simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); // 后台Long值传递给前端精度丢失问题(JS最大精度整数是Math.pow(2,53))
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(0, jackson2HttpMessageConverter);
// LocalDateTime
JavaTimeModule timeModule=new JavaTimeModule();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
timeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer(dateTimeFormatter));
timeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(dateTimeFormatter));
objectMapper.registerModules(timeModule);
// 重新加入jackson转换器
converter.setObjectMapper(objectMapper);
converters.add(0,converter);
}
@Bean
......
......@@ -196,6 +196,7 @@ public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(Exception.class)
public <T> Result<T> handleException(Exception e) {
log.error(e.getMessage());
return Result.failed(e.getLocalizedMessage());
}
......
......@@ -31,14 +31,6 @@ import java.util.List;
public class SysMenuController {
private final SysMenuService menuService;
private final SysPermissionService permissionService;
@ApiOperation(value = "资源(菜单+权限)列表")
@GetMapping("/resources")
public Result<List<ResourceVO>> listResources() {
List<ResourceVO> resources = menuService.listResources();
return Result.success(resources);
}
@ApiOperation(value = "菜单列表")
@GetMapping
......@@ -97,9 +89,6 @@ public class SysMenuController {
@ApiParam("菜单ID,多个以英文(,)分割") @PathVariable("ids") String ids
) {
boolean result = menuService.removeByIds(Arrays.asList(ids.split(",")));
if (result) {
permissionService.refreshPermRolesRules();
}
return Result.judge(result);
}
......@@ -114,6 +103,12 @@ public class SysMenuController {
return Result.judge(result);
}
@ApiOperation(value = "资源列表")
@GetMapping("/resources")
public Result<List<ResourceVO>> listResources() {
List<ResourceVO> resources = menuService.listResources();
return Result.success(resources);
}
}
......@@ -77,28 +77,28 @@ public class SysRoleController {
@PutMapping(value = "/{roleId}/status")
public Result updateRoleStatus(
@ApiParam("角色ID") @PathVariable Long roleId,
@ApiParam("角色状态:1-正常;0-禁用") @RequestParam Integer status
@ApiParam("角色状态(1:正常;0:禁用)") @RequestParam Integer status
) {
boolean result = sysRoleService.updateRoleStatus(roleId, status);
return Result.judge(result);
}
@ApiOperation(value = "获取角色的资源ID集合", notes = "资源包括菜单和权限ID")
@GetMapping("/{roleId}/resources")
public Result<RoleResourceForm> getRoleResources(
@GetMapping("/{roleId}/resourceIds")
public Result<List<Long>> getRoleResources(
@ApiParam("角色ID") @PathVariable Long roleId
) {
RoleResourceForm resourceIds = sysRoleService.getRoleResources(roleId);
List<Long> resourceIds = sysRoleService.getRoleResourceIds(roleId);
return Result.success(resourceIds);
}
@ApiOperation(value = "分配角色的资源权限")
@PutMapping("/{roleId}/resources")
@PutMapping("/{roleId}/resourceIds")
public Result updateRoleResource(
@PathVariable Long roleId,
@RequestBody RoleResourceForm roleResourceForm
@RequestBody List<Long> resourceIds
) {
boolean result = sysRoleService.updateRoleResource(roleId,roleResourceForm);
boolean result = sysRoleService.updateRoleResourceIds(roleId,resourceIds);
return Result.judge(result);
}
}
......@@ -2,7 +2,10 @@ package com.youlai.system.converter;
import com.youlai.system.pojo.entity.SysMenu;
import com.youlai.system.pojo.vo.menu.MenuVO;
import com.youlai.system.pojo.vo.menu.ResourceVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
/**
* 菜单对象转换器
......@@ -15,4 +18,10 @@ public interface MenuConverter {
MenuVO entity2VO(SysMenu entity);
@Mappings({
@Mapping(target = "value", source = "id"),
@Mapping(target = "label", source = "name")
})
ResourceVO entity2ResourceVO(SysMenu entity);
}
\ No newline at end of file
package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.pojo.entity.SysRole;
import com.youlai.system.pojo.query.RolePageQuery;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysRoleMapper extends BaseMapper<SysRole> {
/**
* 角色分页列表
*
* @param page
* @param queryParams
* @return
*/
Page<SysRole> listRolePages(Page<SysRole> page, RolePageQuery queryParams);
}
......@@ -5,6 +5,7 @@ import com.youlai.system.pojo.entity.SysRoleMenu;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Set;
/**
* 角色菜单持久层
......@@ -29,5 +30,5 @@ public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
* @param roles
* @return ["sys:user:add"]
*/
List<String> listPerms(List<String> roles);
Set<String> listPerms(Set<String> roles);
}
......@@ -43,6 +43,11 @@ public class SysMenu extends BaseEntity {
private Integer visible;
/**
* 权限标识
*/
private String perm;
private String redirect;
@TableField(exist = false)
......
package com.youlai.system.pojo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.youlai.common.base.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 角色实体类
*
* @author haoxr
* @date 2022/10/6
*/
@Data
public class SysRole extends BaseEntity {
......@@ -24,14 +28,7 @@ public class SysRole extends BaseEntity {
private Integer status;
@ApiModelProperty("逻辑删除标识 0-未删除 1-已删除")
//@TableLogic(value = "0", delval = "1")
@ApiModelProperty("逻辑删除标识(1:已删除;0:未删除)")
@TableLogic(value = "0", delval = "1")
private Integer deleted;
@TableField(exist = false)
private List<Long> menuIds;
@TableField(exist = false)
private List<Long> permissionIds;
}
......@@ -3,6 +3,7 @@ package com.youlai.system.pojo.po;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
/**
......@@ -67,6 +68,5 @@ public class UserPO {
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createTime;
private LocalDateTime createTime;
}
package com.youlai.system.pojo.query;
import com.youlai.common.base.BasePageQuery;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 角色分页查询实体
* 角色分页查询对象
*
* @author haoxr
* @date 2022/6/3
*
*/
@ApiModel
@Data
public class RolePageQuery extends BasePageQuery {
@ApiModelProperty("关键字(角色名称/角色编码)")
private String keywords;
@ApiModelProperty("角色状态")
private Integer status;
}
package com.youlai.system.pojo.vo.menu;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.youlai.common.enums.MenuTypeEnum;
import io.swagger.annotations.ApiModel;
......@@ -33,6 +34,9 @@ public class MenuVO {
private Integer visible;
@ApiModelProperty("权限标识")
private String perm;
private String redirect;
@ApiModelProperty("菜单类型")
......@@ -41,10 +45,10 @@ public class MenuVO {
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private List<MenuVO> children;
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm")
@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
private LocalDateTime createTime;
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm")
@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
private LocalDateTime updateTime;
}
package com.youlai.system.pojo.vo.menu;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.youlai.common.enums.MenuTypeEnum;
import com.youlai.common.web.domain.Option;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -8,7 +9,7 @@ import lombok.Data;
import java.util.List;
@ApiModel("资源(菜单+权限)视图对象")
@ApiModel("资源视图对象")
@Data
public class ResourceVO {
......@@ -18,12 +19,11 @@ public class ResourceVO {
@ApiModelProperty("选项的标签")
private String label;
@ApiModelProperty("资源类型")
private MenuTypeEnum type;
@ApiModelProperty("子菜单")
@JsonInclude(value = JsonInclude.Include.NON_EMPTY)
private List<ResourceVO> children;
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private List<Option> perms;
}
package com.youlai.system.pojo.vo.role;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@ApiModel("角色分页视图对象")
@Data
public class RolePageVO {
......@@ -16,4 +19,16 @@ public class RolePageVO {
@ApiModelProperty("角色编码")
private String code;
@ApiModelProperty("状态")
private Integer status;
@ApiModelProperty("排序")
private Integer sort;
@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
private LocalDateTime updateTime;
}
......@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
/**
......@@ -48,7 +49,7 @@ public class UserVO {
private String roleNames;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private LocalDateTime createTime;
}
......@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.system.pojo.entity.SysRoleMenu;
import java.util.List;
import java.util.Set;
public interface SysRoleMenuService extends IService<SysRoleMenu> {
......@@ -23,5 +24,5 @@ public interface SysRoleMenuService extends IService<SysRoleMenu> {
* @param roles 角色code集合
* @return ["sys:user:add"]
*/
List<String> listPerms(List<String> roles);
Set<String> listPerms(Set<String> roles);
}
......@@ -62,20 +62,20 @@ public interface SysRoleService extends IService<SysRole> {
/**
* 获取角色的资源ID集合,资源包括菜单和权限
* 获取角色的资源ID集合
*
* @param roleId
* @return
*/
RoleResourceForm getRoleResources(Long roleId);
List<Long> getRoleResourceIds(Long roleId);
/**
* 修改角色的资源权限
*
* @param roleId
* @param roleResourceForm
* @param resourceIds
* @return
*/
boolean updateRoleResource(Long roleId, RoleResourceForm roleResourceForm);
boolean updateRoleResourceIds(Long roleId, List<Long> resourceIds);
}
......@@ -6,20 +6,20 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.converter.MenuConverter;
import com.youlai.common.constant.GlobalConstants;
import com.youlai.common.constant.SystemConstants;
import com.youlai.common.enums.MenuTypeEnum;
import com.youlai.common.web.domain.Option;
import com.youlai.system.converter.MenuConverter;
import com.youlai.system.mapper.SysMenuMapper;
import com.youlai.system.pojo.entity.SysMenu;
import com.youlai.system.pojo.entity.SysPermission;
import com.youlai.system.pojo.vo.menu.MenuVO;
import com.youlai.system.pojo.vo.menu.ResourceVO;
import com.youlai.system.pojo.vo.menu.RouteVO;
import com.youlai.system.pojo.vo.menu.MenuVO;
import com.youlai.system.service.SysMenuService;
import com.youlai.system.service.SysPermissionService;
import com.youlai.common.constant.GlobalConstants;
import com.youlai.common.web.domain.Option;
import lombok.RequiredArgsConstructor;
import org.apache.commons.compress.utils.Lists;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
......@@ -39,7 +39,7 @@ import java.util.stream.Collectors;
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
private final SysPermissionService permissionService;
private final MenuConverter menuConverter;
private final MenuConverter menuConverter;
/**
* 菜单表格树形列表
......@@ -51,7 +51,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
.orderByAsc(SysMenu::getSort)
);
Set<Long> menuIds = menuList.stream().map(menu -> menu.getId()).collect(Collectors.toSet());
Set<Long> menuIds = menuList.stream().map(menu -> menu.getId())
.collect(Collectors.toSet());
List<MenuVO> menus = menuList
.stream()
......@@ -173,9 +174,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
List<SysMenu> menuList = this.list(new LambdaQueryWrapper<SysMenu>()
.orderByAsc(SysMenu::getSort));
List<SysPermission> permList = permissionService.list();
List<ResourceVO> resources = recurResources(SystemConstants.ROOT_MENU_ID, menuList, permList);
List<ResourceVO> resources = recurResources(SystemConstants.ROOT_MENU_ID, menuList);
return resources;
}
......@@ -207,7 +206,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
* @return
*/
private List<MenuVO> recurMenuList(Long parentId, List<SysMenu> menuList) {
List<MenuVO> tableMenus = Optional.ofNullable(menuList).orElse(new ArrayList<>())
List<MenuVO> tableMenus = Optional.ofNullable(menuList).orElse(Lists.newArrayList())
.stream()
.filter(menu -> menu.getParentId().equals(parentId))
.map(entity -> {
......@@ -244,24 +243,13 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
* @param menuList 菜单列表
* @return
*/
private static List<ResourceVO> recurResources(Long parentId, List<SysMenu> menuList, List<SysPermission> permList) {
private List<ResourceVO> recurResources(Long parentId, List<SysMenu> menuList) {
List<ResourceVO> menus = Optional.ofNullable(menuList).orElse(new ArrayList<>()).stream()
.filter(menu -> menu.getParentId().equals(parentId))
.map(menu -> {
Long menuId = menu.getId();
ResourceVO resourceVO = new ResourceVO();
resourceVO.setValue(menu.getId());
resourceVO.setLabel(menu.getName());
List<ResourceVO> children = recurResources(menu.getId(), menuList, permList);
ResourceVO resourceVO = menuConverter.entity2ResourceVO(menu);
List<ResourceVO> children = recurResources(menu.getId(), menuList);
resourceVO.setChildren(children);
List<Option> perms = permList.stream().filter(perm -> perm.getMenuId()
.equals(menuId))
.map(item -> new Option<>(item.getId(), item.getName()))
.collect(Collectors.toList());
resourceVO.setPerms(perms);
return resourceVO;
}).collect(Collectors.toList());
return menus;
......
......@@ -7,6 +7,7 @@ import com.youlai.system.service.SysRoleMenuService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
/**
* 角色菜单
......@@ -37,8 +38,8 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
* @return ["sys:user:add"]
*/
@Override
public List<String> listPerms(List<String> roles) {
List<String> perms = this.baseMapper.listPerms(roles);
public Set<String> listPerms(Set<String> roles) {
Set<String> perms = this.baseMapper.listPerms(roles);
return perms;
}
......
......@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.security.util.SecurityUtils;
import com.youlai.system.converter.RoleConverter;
import com.youlai.system.mapper.SysRoleMapper;
import com.youlai.system.pojo.entity.SysRole;
......@@ -57,23 +58,12 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
@Override
public Page<RolePageVO> listRolePages(RolePageQuery queryParams) {
// 查询参数
int pageNum = queryParams.getPageNum();
int pageSize = queryParams.getPageSize();
String keywords = queryParams.getKeywords();
Page<SysRole> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
// 查询数据
Page<SysRole> rolePage = this.page(
new Page<>(pageNum, pageSize),
new LambdaQueryWrapper<SysRole>()
.like(StrUtil.isNotBlank(keywords), SysRole::getName, keywords)
.or()
.like(StrUtil.isNotBlank(keywords), SysRole::getCode, keywords)
.ne(!UserUtils.isRoot(), SysRole::getCode, GlobalConstants.ROOT_ROLE_CODE) // 非超级管理员不显示超级管理员角色
.select(SysRole::getId, SysRole::getName, SysRole::getCode)
);
page = this.baseMapper.listRolePages(page, queryParams);
// 实体转换
Page<RolePageVO> pageResult = roleConverter.entity2Page(rolePage);
Page<RolePageVO> pageResult = roleConverter.entity2Page(page);
return pageResult;
}
......@@ -86,7 +76,9 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
public List<Option> listRoleOptions() {
// 查询数据
List<SysRole> roleList = this.list(new LambdaQueryWrapper<SysRole>()
.ne(!UserUtils.isRoot(), SysRole::getCode, GlobalConstants.ROOT_ROLE_CODE)
// 非超级管理员用户超级管理员角色不可见
.ne(SecurityUtils.isRoot() == false, SysRole::getCode, GlobalConstants.ROOT_ROLE_CODE)
.eq(SysRole::getStatus, GlobalConstants.STATUS_YES)
.select(SysRole::getId, SysRole::getName)
.orderByAsc(SysRole::getSort)
);
......@@ -171,54 +163,38 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
}
/**
* 获取角色的资源ID集合,资源包括菜单和权限
* 获取角色拥有的菜单ID集合
*
* @param roleId
* @return
*/
@Override
public RoleResourceForm getRoleResources(Long roleId) {
RoleResourceForm roleResources = new RoleResourceForm();
// 获取角色拥有的菜单ID集合
public List<Long> getRoleResourceIds(Long roleId) {
List<Long> menuIds = sysRoleMenuService.listMenuIdsByRoleId(roleId);
roleResources.setMenuIds(menuIds);
// 获取角色拥有的权限ID集合
List<Long> permIds = sysRolePermissionService.listPermIdsByRoleId(roleId);
roleResources.setPermIds(permIds);
return roleResources;
return menuIds;
}
/**
* 修改角色的资源权限
*
* @param roleId
* @param roleResourceForm
* @param resourceIds
* @return
*/
@Override
@Transactional
@CacheEvict(cacheNames = "system", key = "'routes'")
public boolean updateRoleResource(Long roleId, RoleResourceForm roleResourceForm) {
public boolean updateRoleResourceIds(Long roleId, List<Long> resourceIds) {
// 删除角色菜单
sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId));
sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>()
.eq(SysRoleMenu::getRoleId, roleId));
// 新增角色菜单
List<Long> menuIds = roleResourceForm.getMenuIds();
if (CollectionUtil.isNotEmpty(menuIds)) {
List<SysRoleMenu> roleMenus = menuIds.stream().map(menuId -> new SysRoleMenu(roleId, menuId)).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(resourceIds)) {
List<SysRoleMenu> roleMenus = resourceIds.stream()
.map(menuId -> new SysRoleMenu(roleId, menuId))
.collect(Collectors.toList());
sysRoleMenuService.saveBatch(roleMenus);
}
// 删除角色权限
sysRolePermissionService.remove(new LambdaQueryWrapper<SysRolePermission>().eq(SysRolePermission::getRoleId, roleId));
// 新增角色权限
List<Long> permIds = roleResourceForm.getPermIds();
if (CollectionUtil.isNotEmpty(permIds)) {
List<SysRolePermission> rolePerms = permIds.stream().map(permId -> new SysRolePermission(roleId, permId)).collect(Collectors.toList());
sysRolePermissionService.saveBatch(rolePerms);
}
return true;
}
......
......@@ -27,7 +27,6 @@ import com.youlai.system.pojo.vo.user.UserDetailVO;
import com.youlai.system.pojo.vo.user.LoginUserVO;
import com.youlai.system.pojo.vo.user.UserExportVO;
import com.youlai.system.pojo.vo.user.UserVO;
import com.youlai.system.service.SysPermissionService;
import com.youlai.system.service.SysRoleMenuService;
import com.youlai.system.service.SysUserRoleService;
import com.youlai.system.service.SysUserService;
......@@ -62,8 +61,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
private final PasswordEncoder passwordEncoder;
private final SysUserRoleService userRoleService;
private final UserImportListener userImportListener;
private final SysPermissionService permissionService;
private final SysRoleMenuService roleMenuService;
private final UserConverter userConverter;
......@@ -82,10 +79,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
Page<UserPO> page = new Page<>(pageNum, pageSize);
// 查询数据
Page<UserPO> userPoPage = this.baseMapper.listUserPages(page, queryParams);
page = this.baseMapper.listUserPages(page, queryParams);
// 实体转换
Page<UserVO> userVoPage = userConverter.po2Vo(userPoPage);
Page<UserVO> userVoPage = userConverter.po2Vo(page);
return userVoPage;
}
......@@ -212,9 +209,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
public UserAuthDTO getAuthInfoByUsername(String username) {
UserAuthDTO userAuthInfo = this.baseMapper.getAuthInfoByUsername(username);
Assert.isTrue(userAuthInfo != null, "用户不存在!");
List<String> roles = userAuthInfo.getRoles();
Set<String> roles = userAuthInfo.getRoles();
if (CollectionUtil.isNotEmpty(roles)) {
List<String> perms = roleMenuService.listPerms(roles);
Set<String> perms = roleMenuService.listPerms(roles);
userAuthInfo.setPerms(perms);
}
return userAuthInfo;
......@@ -348,7 +345,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
loginUserVO.setRoles(roles);
// 用户权限集合
loginUserVO.setPerms(null);
Set<String> perms = roleMenuService.listPerms(roles);
loginUserVO.setPerms(perms);
return loginUserVO;
}
......
<?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.youlai.system.mapper.SysRoleMapper">
<!-- 角色分页列表 -->
<select id="listRolePages" resultType="com.youlai.system.pojo.entity.SysRole">
SELECT
id,
name,
code,
sort,
status,
create_time,
update_time
FROM
sys_role
<where>
deleted = 0
<if test='queryParams.keywords!=null and queryParams.keywords.trim() neq ""'>
AND (
name LIKE CONCAT('%',#{queryParams.keywords},'%')
OR code LIKE CONCAT('%',#{queryParams.keywords},'%')
)
</if>
<if test='queryParams.status!=null'>
AND status = #{queryParams.status}
</if>
<!-- 非超级管理员不显示超级管理员角色 -->
<if test='@com.youlai.common.security.util.SecurityUtils@isRoot()==false'>
AND code != 'ROOT'
</if>
</where>
ORDER BY sort ASC
</select>
</mapper>
......@@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.youlai.system.mapper.SysRoleMenuMapper">
<!-- 获取角色拥有的菜单ID集合(父节点排除) -->
<!-- 获取角色拥有的菜单ID集合 -->
<select id="listMenuIdsByRoleId" resultType="java.lang.Long">
SELECT
rm.menu_id
......@@ -13,7 +13,16 @@
INNER JOIN sys_menu m ON rm.menu_id = m.id
WHERE
rm.role_id = #{roleId}
AND rm.menu_id NOT IN ( SELECT m.parent_id FROM sys_role_menu rm INNER JOIN sys_menu m ON rm.menu_id = m.id WHERE rm.role_id = #{roleId} )
<!-- 父节点id排除,由子节点的勾选状态控制父节点选中 -->
AND rm.menu_id NOT IN
(
SELECT
m.parent_id
FROM
sys_role_menu rm
INNER JOIN sys_menu m ON rm.menu_id = m.id
WHERE rm.role_id = #{roleId}
)
</select>
<!-- 获取角色权限标识集合 -->
......@@ -25,7 +34,9 @@
INNER JOIN `sys_menu` m ON rm.menu_id = m.id
INNER JOIN `sys_role` r ON rm.role_id = r.id
WHERE
r.`code` IN
m.type = 'B'
AND m.perm IS NOT NULL
AND r.`code` IN
<foreach collection="roles" item="role" separator="," open="(" close=")">
#{role}
</foreach>
......
......@@ -83,7 +83,7 @@
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="BOOLEAN"/>
<result property="deptId" column="deptId" jdbcType="BIGINT"></result>
<collection property="roles" ofType="string" javaType="list">
<collection property="roles" ofType="string" javaType="java.util.Set">
<result column="roleCode"></result>
</collection>
</resultMap>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册