review code.

This commit is contained in:
lijiahang
2023-07-19 17:19:38 +08:00
parent 6643597c16
commit 6dd744219b
19 changed files with 253 additions and 58 deletions

View File

@@ -47,6 +47,8 @@ public enum ErrorCode implements CodeInfo {
ROLE_PRESENT(703, "角色 [{}] 不存在"),
DATA_ALTER(704, "数据发生改变, 请刷新后重试"),
// -------------------- 自定义 - 通用 --------------------
NETWORK_FLUCTUATION(900, "当前环境网路波动"),

View File

@@ -17,6 +17,8 @@ public interface ErrorMessage {
String INVALID_PARAM = "参数验证失败";
String DATA_ABSENT = "数据不存在";
String DATA_PRESENT = "数据已存在";
String NAME_PRESENT = "名称已存在";
@@ -33,16 +35,10 @@ public interface ErrorMessage {
String PARENT_MENU_ABSENT = "父菜单不存在";
String DATA_ABSENT = "数据不存在";
String USERNAME_PASSWORD_ERROR = "用户名或密码错误";
String MAX_LOGIN_FAILED = "登陆失败次数已上限";
String USER_ABSENT = "用户不存在";
String USER_DISABLED = "用户已被禁用";
String USER_LOCKED = "用户已被锁定";
}

View File

@@ -2,6 +2,8 @@ package com.orion.ops.framework.mybatis.core.query;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.orion.ops.framework.common.constant.ErrorMessage;
import com.orion.ops.framework.common.utils.Valid;
import java.util.Collection;
@@ -38,16 +40,31 @@ public class Conditions {
}
/**
* id list
* eq
*
* @param idMapping idMapping
* @param ids ids
* @param <T> T
* @param <ID> ID
* @param mapping mapping
* @param e e
* @param <T> T
* @param <E> E
* @return wrapper
*/
public static <T, ID> LambdaQueryWrapper<T> id(SFunction<T, ID> idMapping, Collection<ID> ids) {
return new ValidateLambdaWrapper<T>().in(idMapping, ids);
public static <T, E> LambdaQueryWrapper<T> eq(SFunction<T, E> mapping, E e) {
Valid.notNull(e, ErrorMessage.INVALID_PARAM);
return new LambdaQueryWrapper<T>().eq(mapping, e);
}
/**
* in
*
* @param mapping mapping
* @param es es
* @param <T> T
* @param <E> E
* @return wrapper
*/
public static <T, E> LambdaQueryWrapper<T> in(SFunction<T, E> mapping, Collection<E> es) {
Valid.notEmpty(es, ErrorMessage.INVALID_PARAM);
return new LambdaQueryWrapper<T>().in(mapping, es);
}
}

View File

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.orion.lang.define.wrapper.DataGrid;
import com.orion.lang.define.wrapper.IPageRequest;
import com.orion.lang.define.wrapper.Pager;
import com.orion.lang.utils.Objects1;
import com.orion.lang.utils.Valid;
import com.orion.lang.utils.collect.Lists;
import com.orion.ops.framework.common.constant.Const;
@@ -60,7 +61,7 @@ public class DataQuery<T> {
}
public DataQuery<T> only() {
this.wrapper.last(Const.LIMIT_1);
wrapper.last(Const.LIMIT_1);
return this;
}
@@ -68,29 +69,28 @@ public class DataQuery<T> {
return dao.selectOne(wrapper);
}
public Optional<T> optional() {
return Optional.ofNullable(dao.selectOne(wrapper));
public <R> R get(Function<T, R> mapper) {
Valid.notNull(mapper, "convert function is null");
return Objects1.map(dao.selectOne(wrapper), mapper);
}
public <R> Optional<R> optional(Function<T, R> mapper) {
Valid.notNull(mapper, "convert function is null");
return Optional.ofNullable(dao.selectOne(wrapper))
.map(mapper);
public Optional<T> optional() {
return Optional.ofNullable(dao.selectOne(wrapper));
}
public List<T> list() {
return dao.selectList(wrapper);
}
public Stream<T> stream() {
return dao.selectList(wrapper).stream();
}
public <R> List<R> stream(Function<T, R> mapper) {
public <R> List<R> list(Function<T, R> mapper) {
Valid.notNull(mapper, "convert function is null");
return Lists.map(dao.selectList(wrapper), mapper);
}
public Stream<T> stream() {
return dao.selectList(wrapper).stream();
}
public Long count() {
return dao.selectCount(wrapper);
}

View File

@@ -56,4 +56,6 @@ DELETE {{baseUrl}}/${package.ModuleName}/${typeHyphen}/delete-batch?idList=1,2,3
Authorization: {{token}}
${httpComment}

View File

@@ -1,6 +1,7 @@
package ${package.Controller};
import com.orion.lang.define.wrapper.DataGrid;
import com.orion.ops.framework.common.annotation.IgnoreLog;
import com.orion.ops.framework.common.annotation.RestWrapper;
import ${package.Service}.*;
#foreach($pkg in ${customFilePackages})
@@ -57,6 +58,7 @@ public class ${table.controllerName} {
return ${typeLower}Service.update${type}(request);
}
@IgnoreLog
@GetMapping("/get")
@Operation(summary = "${apiComment.get}")
@Parameter(name = "id", description = "id", required = true)
@@ -65,6 +67,7 @@ public class ${table.controllerName} {
return ${typeLower}Service.get${type}(id);
}
@IgnoreLog
@GetMapping("/list")
@Operation(summary = "${apiComment.list}")
@Parameter(name = "idList", description = "idList", required = true)
@@ -73,6 +76,7 @@ public class ${table.controllerName} {
return ${typeLower}Service.get${type}List(idList);
}
@IgnoreLog
@PostMapping("/query")
@Operation(summary = "${apiComment.query}")
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')")
@@ -80,7 +84,7 @@ public class ${table.controllerName} {
return ${typeLower}Service.get${type}Page(request);
}
@PutMapping("/delete")
@DeleteMapping("/delete")
@Operation(summary = "${apiComment.delete}")
@Parameter(name = "id", description = "id", required = true)
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:delete')")
@@ -88,7 +92,7 @@ public class ${table.controllerName} {
return ${typeLower}Service.delete${type}(id);
}
@PutMapping("/delete-batch")
@DeleteMapping("/delete-batch")
@Operation(summary = "${apiComment.batchDelete}")
@Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:delete')")

View File

@@ -122,7 +122,7 @@ public class GlobalExceptionHandler {
IllegalArgumentException.class
})
public HttpWrapper<?> invalidArgumentExceptionHandler(Exception ex) {
log.error("invalidArgumentExceptionHandler {}", ex.getMessage());
log.error("invalidArgumentExceptionHandler {}", ex.getMessage(), ex);
return ErrorCode.BAD_REQUEST.wrapper().msg(ex.getMessage());
}

View File

@@ -2,12 +2,10 @@ package com.orion.ops.module.infra.controller;
import com.orion.ops.framework.common.annotation.IgnoreLog;
import com.orion.ops.framework.common.annotation.RestWrapper;
import com.orion.ops.module.infra.entity.request.menu.SystemMenuCreateRequest;
import com.orion.ops.module.infra.entity.request.menu.SystemMenuQueryRequest;
import com.orion.ops.module.infra.entity.request.menu.SystemMenuUpdateRequest;
import com.orion.ops.module.infra.entity.request.menu.SystemMenuUpdateStatusRequest;
import com.orion.ops.module.infra.entity.request.menu.*;
import com.orion.ops.module.infra.entity.vo.SystemMenuVO;
import com.orion.ops.module.infra.service.SystemMenuService;
import com.orion.ops.module.infra.service.SystemRoleMenuService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -38,6 +36,9 @@ public class SystemMenuController {
@Resource
private SystemMenuService systemMenuService;
@Resource
private SystemRoleMenuService systemRoleMenuService;
@PostMapping("/create")
@Operation(summary = "创建菜单")
@PreAuthorize("@ss.hasPermission('infra:system-menu:create')")
@@ -59,6 +60,14 @@ public class SystemMenuController {
return systemMenuService.updateSystemMenuStatus(request);
}
@PostMapping("/bind")
@Operation(summary = "绑定角色菜单")
@PreAuthorize("@ss.hasPermission('infra:system-menu:bind')")
public Integer bindRoleMenu(@RequestBody SystemMenuBindRequest request) {
return systemRoleMenuService.bindRoleMenu(request);
}
@IgnoreLog
@GetMapping("/get")
@Operation(summary = "通过 id 查询菜单")
@Parameter(name = "id", description = "id", required = true)
@@ -75,7 +84,7 @@ public class SystemMenuController {
return systemMenuService.getSystemMenuList(request);
}
@PutMapping("/delete")
@DeleteMapping("/delete")
@Operation(summary = "通过 id 级联删除菜单")
@Parameter(name = "id", description = "id", required = true)
@PreAuthorize("@ss.hasPermission('infra:system-menu:delete')")

View File

@@ -1,6 +1,7 @@
package com.orion.ops.module.infra.controller;
import com.orion.lang.define.wrapper.DataGrid;
import com.orion.ops.framework.common.annotation.IgnoreLog;
import com.orion.ops.framework.common.annotation.RestWrapper;
import com.orion.ops.module.infra.entity.request.role.SystemRoleCreateRequest;
import com.orion.ops.module.infra.entity.request.role.SystemRoleQueryRequest;
@@ -59,6 +60,7 @@ public class SystemRoleController {
return systemRoleService.updateRoleStatus(request);
}
@IgnoreLog
@GetMapping("/get")
@Operation(summary = "通过 id 查询角色")
@Parameter(name = "id", description = "id", required = true)
@@ -67,6 +69,7 @@ public class SystemRoleController {
return systemRoleService.getSystemRole(id);
}
@IgnoreLog
@GetMapping("/list")
@Operation(summary = "查询所有角色")
@PreAuthorize("@ss.hasPermission('infra:system-role:query')")
@@ -74,6 +77,7 @@ public class SystemRoleController {
return systemRoleService.getSystemRoleList();
}
@IgnoreLog
@PostMapping("/query")
@Operation(summary = "分页查询角色")
@PreAuthorize("@ss.hasPermission('infra:system-role:query')")
@@ -81,7 +85,7 @@ public class SystemRoleController {
return systemRoleService.getSystemRolePage(request);
}
@PutMapping("/delete")
@DeleteMapping("/delete")
@Operation(summary = "通过 id 删除角色")
@Parameter(name = "id", description = "id", required = true)
@PreAuthorize("@ss.hasPermission('infra:system-role:delete')")

View File

@@ -3,6 +3,7 @@ package com.orion.ops.module.infra.controller;
import com.orion.lang.define.wrapper.DataGrid;
import com.orion.lang.define.wrapper.HttpWrapper;
import com.orion.lang.utils.collect.Lists;
import com.orion.ops.framework.common.annotation.IgnoreLog;
import com.orion.ops.framework.common.annotation.RestWrapper;
import com.orion.ops.module.infra.entity.request.user.*;
import com.orion.ops.module.infra.entity.vo.SystemUserVO;
@@ -85,6 +86,7 @@ public class SystemUserController {
return HttpWrapper.ok();
}
@IgnoreLog
@GetMapping("/get")
@Operation(summary = "通过 id 查询用户")
@Parameter(name = "id", description = "id", required = true)
@@ -93,6 +95,7 @@ public class SystemUserController {
return systemUserService.getSystemUser(id);
}
@IgnoreLog
@GetMapping("/list")
@Operation(summary = "查询所有用户")
@PreAuthorize("@ss.hasPermission('infra:system-user:query')")
@@ -100,6 +103,7 @@ public class SystemUserController {
return systemUserService.getSystemUserList();
}
@IgnoreLog
@PostMapping("/query")
@Operation(summary = "分页查询用户")
@PreAuthorize("@ss.hasPermission('infra:system-user:query')")
@@ -107,7 +111,7 @@ public class SystemUserController {
return systemUserService.getSystemUserPage(request);
}
@PutMapping("/delete")
@DeleteMapping("/delete")
@Operation(summary = "通过 id 删除用户")
@Parameter(name = "id", description = "id", required = true)
@PreAuthorize("@ss.hasPermission('infra:system-user:delete')")

View File

@@ -5,6 +5,8 @@ import com.orion.ops.framework.mybatis.core.mapper.IMapper;
import com.orion.ops.module.infra.entity.domain.SystemRoleMenuDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 角色菜单关联 Mapper 接口
*
@@ -34,10 +36,22 @@ public interface SystemRoleMenuDAO extends IMapper<SystemRoleMenuDO> {
* @param roleId roleId
* @return effect
*/
default Integer deleteByRoleId(Long roleId) {
default int deleteByRoleId(Long roleId) {
LambdaQueryWrapper<SystemRoleMenuDO> wrapper = this.wrapper()
.eq(SystemRoleMenuDO::getRoleId, roleId);
return this.delete(wrapper);
}
/**
* 通过 menuId 删除
*
* @param menuIdList menuIdList
* @return effect
*/
default int deleteByMenuId(List<Long> menuIdList) {
LambdaQueryWrapper<SystemRoleMenuDO> wrapper = this.wrapper()
.in(SystemRoleMenuDO::getMenuId, menuIdList);
return this.delete(wrapper);
}
}

View File

@@ -67,7 +67,7 @@ public interface SystemUserRoleDAO extends IMapper<SystemUserRoleDO> {
* @param userId userId
* @return effect
*/
default Integer deleteByUserId(Long userId) {
default int deleteByUserId(Long userId) {
LambdaQueryWrapper<SystemUserRoleDO> wrapper = this.wrapper()
.eq(SystemUserRoleDO::getUserId, userId);
return this.delete(wrapper);
@@ -79,7 +79,7 @@ public interface SystemUserRoleDAO extends IMapper<SystemUserRoleDO> {
* @param roleId roleId
* @return effect
*/
default Integer deleteByRoleId(Long roleId) {
default int deleteByRoleId(Long roleId) {
LambdaQueryWrapper<SystemUserRoleDO> wrapper = this.wrapper()
.eq(SystemUserRoleDO::getRoleId, roleId);
return this.delete(wrapper);

View File

@@ -0,0 +1,36 @@
package com.orion.ops.module.infra.entity.request.menu;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* 菜单 绑定角色请求对象
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-7-18 10:18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "SystemMenuBindRequest", description = "菜单 绑定角色请求对象")
public class SystemMenuBindRequest implements Serializable {
@NotNull
@Schema(description = "roleId")
private Long roleId;
@NotEmpty
@Schema(description = "菜单id集合")
private List<Long> idList;
}

View File

@@ -1,5 +1,7 @@
package com.orion.ops.module.infra.service;
import com.orion.ops.module.infra.entity.request.menu.SystemMenuBindRequest;
/**
* 角色菜单关联 服务类
*
@@ -9,4 +11,12 @@ package com.orion.ops.module.infra.service;
*/
public interface SystemRoleMenuService {
/**
* 绑定角色菜单
*
* @param request request
* @return effect
*/
Integer bindRoleMenu(SystemMenuBindRequest request);
}

View File

@@ -8,8 +8,8 @@ import com.orion.lang.utils.Exceptions;
import com.orion.lang.utils.collect.Lists;
import com.orion.lang.utils.crypto.Signatures;
import com.orion.ops.framework.common.constant.Const;
import com.orion.ops.framework.common.constant.ErrorCode;
import com.orion.ops.framework.common.constant.ErrorMessage;
import com.orion.ops.framework.common.crypto.ValueCrypto;
import com.orion.ops.framework.common.security.LoginUser;
import com.orion.ops.framework.common.utils.CryptoUtils;
import com.orion.ops.framework.common.utils.IpUtils;
@@ -51,9 +51,6 @@ import java.util.stream.Collectors;
@Service
public class AuthenticationServiceImpl implements AuthenticationService {
@Resource
private ValueCrypto valueCrypto;
@Resource
private SystemUserDAO systemUserDAO;
@@ -250,10 +247,10 @@ public class AuthenticationServiceImpl implements AuthenticationService {
private void checkUserStatus(Integer status) {
if (UserStatusEnum.DISABLED.getStatus().equals(status)) {
// 禁用状态
throw Exceptions.argument(ErrorMessage.USER_DISABLED);
throw ErrorCode.USER_DISABLED.exception();
} else if (UserStatusEnum.LOCKED.getStatus().equals(status)) {
// 锁定状态
throw Exceptions.argument(ErrorMessage.USER_LOCKED);
throw ErrorCode.USER_LOCKED.exception();
}
}

View File

@@ -1,6 +1,7 @@
package com.orion.ops.module.infra.service.impl;
import com.orion.lang.utils.collect.Lists;
import com.orion.ops.framework.common.security.LoginUser;
import com.orion.ops.framework.security.core.utils.SecurityUtils;
import com.orion.ops.module.infra.convert.SystemMenuConvert;
import com.orion.ops.module.infra.convert.SystemUserConvert;
@@ -16,6 +17,7 @@ import com.orion.ops.module.infra.entity.vo.SystemMenuVO;
import com.orion.ops.module.infra.entity.vo.UserBaseInfoVO;
import com.orion.ops.module.infra.entity.vo.UserPermissionVO;
import com.orion.ops.module.infra.enums.MenuStatusEnum;
import com.orion.ops.module.infra.enums.MenuTypeEnum;
import com.orion.ops.module.infra.enums.RoleStatusEnum;
import com.orion.ops.module.infra.service.PermissionService;
import com.orion.ops.module.infra.service.SystemMenuService;
@@ -156,6 +158,8 @@ public class PermissionServiceImpl implements PermissionService {
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.distinct()
.filter(s -> MenuStatusEnum.ENABLED.getStatus().equals(s.getStatus()))
.filter(s -> !MenuTypeEnum.FUNCTION.getType().equals(s.getType()))
.map(SystemMenuConvert.MAPPER::to)
.collect(Collectors.toList());
// 构建菜单树
@@ -177,18 +181,18 @@ public class PermissionServiceImpl implements PermissionService {
.map(roleMenuCache::get)
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.filter(s -> MenuStatusEnum.ENABLED.getStatus().equals(s.getStatus()))
.map(SystemMenuCacheDTO::getPermission)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
}
// 组装数据
UserPermissionVO vo = new UserPermissionVO().builder()
return UserPermissionVO.builder()
.user(user)
.roles(roles)
.permissions(permissions)
.build();
return vo;
}
/**
@@ -198,7 +202,9 @@ public class PermissionServiceImpl implements PermissionService {
*/
private List<String> getUserEnabledRoles() {
// 获取当前用户角色
List<String> roles = SecurityUtils.getLoginUser().getRoles();
List<String> roles = Optional.ofNullable(SecurityUtils.getLoginUser())
.map(LoginUser::getRoles)
.orElse(Lists.empty());
if (Lists.isEmpty(roles)) {
return Lists.empty();
}

View File

@@ -9,6 +9,7 @@ import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.framework.mybatis.core.query.Conditions;
import com.orion.ops.module.infra.convert.SystemMenuConvert;
import com.orion.ops.module.infra.dao.SystemMenuDAO;
import com.orion.ops.module.infra.dao.SystemRoleMenuDAO;
import com.orion.ops.module.infra.entity.domain.SystemMenuDO;
import com.orion.ops.module.infra.entity.dto.SystemMenuCacheDTO;
import com.orion.ops.module.infra.entity.request.menu.SystemMenuCreateRequest;
@@ -23,6 +24,7 @@ import com.orion.ops.module.infra.service.SystemMenuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
@@ -43,6 +45,9 @@ public class SystemMenuServiceImpl implements SystemMenuService {
@Resource
private SystemMenuDAO systemMenuDAO;
@Resource
private SystemRoleMenuDAO systemRoleMenuDAO;
@Resource
private PermissionService permissionService;
@@ -180,19 +185,20 @@ public class SystemMenuServiceImpl implements SystemMenuService {
List<SystemMenuCacheDTO> cache = permissionService.getMenuCache();
// 获取要删除的id
List<Long> updateIdList = this.getChildrenIdList(id, cache, record.getType());
// 修改状态
SystemMenuDO update = new SystemMenuDO();
update.setStatus(status);
int effect = systemMenuDAO.update(update, Conditions.in(SystemMenuDO::getId, updateIdList));
// 修改引用缓存状态
cache.stream()
.filter(s -> updateIdList.contains(s.getId()))
.forEach(s -> s.setStatus(status));
// 修改状态
SystemMenuDO update = new SystemMenuDO();
update.setStatus(status);
int effect = systemMenuDAO.update(update, Conditions.id(SystemMenuDO::getId, updateIdList));
log.info("SystemMenuService-updateSystemMenuStatus updateIdList: {}, effect: {}", JSON.toJSONString(updateIdList), effect);
return effect;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer deleteSystemMenu(Long id) {
// 查询
SystemMenuDO record = systemMenuDAO.selectById(id);
@@ -201,14 +207,16 @@ public class SystemMenuServiceImpl implements SystemMenuService {
List<SystemMenuCacheDTO> cache = permissionService.getMenuCache();
// 获取要删除的id
List<Long> deletedIdList = this.getChildrenIdList(id, cache, record.getType());
// 删除菜单
int effect = systemMenuDAO.deleteBatchIds(deletedIdList);
// 删除角色菜单关联
effect += systemRoleMenuDAO.deleteByMenuId(deletedIdList);
// 删除菜单缓存
cache.removeIf(s -> deletedIdList.contains(s.getId()));
// 删除引用缓存
permissionService.getRoleMenuCache()
.values()
.forEach(roleMenus -> roleMenus.removeIf(s -> deletedIdList.contains(s.getId())));
// 删除
int effect = systemMenuDAO.deleteBatchIds(deletedIdList);
log.info("SystemMenuService-deleteSystemMenu deletedIdList: {}, effect: {}", JSON.toJSONString(deletedIdList), effect);
return effect;
}
@@ -222,7 +230,7 @@ public class SystemMenuServiceImpl implements SystemMenuService {
* @return childrenId
*/
private List<Long> getChildrenIdList(Long id, List<SystemMenuCacheDTO> cache, Integer type) {
// 需要移除的菜单id
// 需要更新的菜单id
List<Long> idList = new ArrayList<>();
idList.add(id);
// 级联查询
@@ -251,8 +259,8 @@ public class SystemMenuServiceImpl implements SystemMenuService {
/**
* 验证创建菜单参数 不进行重复性校验
*
* @param domain domain
* @param record record
* @param domain domain
* @param menuType menuType
*/
private void validateRequest(SystemMenuDO domain, Integer menuType) {
// 父id不能为当前id

View File

@@ -1,11 +1,31 @@
package com.orion.ops.module.infra.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.orion.lang.utils.collect.Lists;
import com.orion.ops.framework.common.constant.ErrorCode;
import com.orion.ops.framework.common.constant.ErrorMessage;
import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.framework.mybatis.core.query.Conditions;
import com.orion.ops.module.infra.convert.SystemMenuConvert;
import com.orion.ops.module.infra.dao.SystemMenuDAO;
import com.orion.ops.module.infra.dao.SystemRoleDAO;
import com.orion.ops.module.infra.dao.SystemRoleMenuDAO;
import com.orion.ops.module.infra.entity.domain.SystemMenuDO;
import com.orion.ops.module.infra.entity.domain.SystemRoleDO;
import com.orion.ops.module.infra.entity.domain.SystemRoleMenuDO;
import com.orion.ops.module.infra.entity.dto.SystemMenuCacheDTO;
import com.orion.ops.module.infra.entity.request.menu.SystemMenuBindRequest;
import com.orion.ops.module.infra.service.PermissionService;
import com.orion.ops.module.infra.service.SystemRoleMenuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 角色菜单关联 服务实现类
@@ -18,7 +38,72 @@ import javax.annotation.Resource;
@Service
public class SystemRoleMenuServiceImpl implements SystemRoleMenuService {
@Resource
private SystemRoleDAO systemRoleDAO;
@Resource
private SystemMenuDAO systemMenuDAO;
@Resource
private SystemRoleMenuDAO systemRoleMenuDAO;
@Resource
private PermissionService permissionService;
@Override
@Transactional(rollbackFor = Exception.class)
public Integer bindRoleMenu(SystemMenuBindRequest request) {
Long roleId = request.getRoleId();
List<Long> menuIdList = request.getIdList();
// 检查角色是否存在
SystemRoleDO role = Valid.notNull(systemRoleDAO.selectById(roleId), ErrorMessage.ROLE_ABSENT);
// 查询菜单列表
List<SystemMenuDO> menuList = systemMenuDAO.selectBatchIds(menuIdList);
if (menuIdList.size() != menuList.size()) {
throw ErrorCode.DATA_ALTER.exception();
}
// 查询角色菜单
List<Long> beforeMenuIdList = systemRoleMenuDAO.of()
.wrapper(Conditions.eq(SystemRoleMenuDO::getRoleId, roleId))
.list(SystemRoleMenuDO::getMenuId);
// 计算需要删除的
List<Long> deleteMenuIdList = beforeMenuIdList.stream()
.filter(s -> !menuIdList.contains(s))
.collect(Collectors.toList());
// 计算需要新增的
List<Long> insertMenuIdList = menuIdList.stream()
.filter(s -> !beforeMenuIdList.contains(s))
.collect(Collectors.toList());
int effect = 0;
// 删除
if (!deleteMenuIdList.isEmpty()) {
LambdaQueryWrapper<SystemRoleMenuDO> deleteWrapper = systemRoleMenuDAO.wrapper()
.eq(SystemRoleMenuDO::getRoleId, roleId)
.in(SystemRoleMenuDO::getMenuId, deleteMenuIdList);
effect += systemRoleMenuDAO.delete(deleteWrapper);
}
// 插入
if (!insertMenuIdList.isEmpty()) {
List<SystemRoleMenuDO> insertRecords = insertMenuIdList.stream()
.map(s -> {
SystemRoleMenuDO record = new SystemRoleMenuDO();
record.setRoleId(roleId);
record.setMenuId(s);
return record;
}).collect(Collectors.toList());
systemRoleMenuDAO.insertBatch(insertRecords);
effect += insertMenuIdList.size();
}
// 更新缓存
Map<String, List<SystemMenuCacheDTO>> cache = permissionService.getRoleMenuCache();
List<SystemMenuCacheDTO> roleCache = cache.get(role.getCode());
if (Lists.isEmpty(roleCache)) {
roleCache = new ArrayList<>();
cache.put(role.getCode(), roleCache);
}
roleCache.clear();
roleCache.addAll(SystemMenuConvert.MAPPER.toCache(menuList));
return effect;
}
}

View File

@@ -50,7 +50,7 @@ public class SystemUserRoleServiceImpl implements SystemUserRoleService {
public Integer deleteUserRoles(SystemUserUpdateRoleRequest request) {
Long userId = request.getId();
// 删除用户关联
Integer effect = systemUserRoleDAO.deleteByUserId(userId);
int effect = systemUserRoleDAO.deleteByUserId(userId);
// 更新缓存中的角色
RedisUtils.<LoginUser>processSetJson(UserCacheKeyDefine.USER_INFO, s -> {
s.setRoles(Lists.empty());
@@ -82,7 +82,7 @@ public class SystemUserRoleServiceImpl implements SystemUserRoleService {
}
}
// 删除用户角色关联
Integer effect = systemUserRoleDAO.deleteByUserId(userId);
int effect = systemUserRoleDAO.deleteByUserId(userId);
// 重新添加用户角色关联
List<SystemUserRoleDO> addUserRoles = userRoles.stream().map(s -> {
SystemUserRoleDO ur = new SystemUserRoleDO();
@@ -91,6 +91,7 @@ public class SystemUserRoleServiceImpl implements SystemUserRoleService {
return ur;
}).collect(Collectors.toList());
systemUserRoleDAO.insertBatch(addUserRoles);
effect += addUserRoles.size();
// 更新缓存中的角色
RedisUtils.<LoginUser>processSetJson(UserCacheKeyDefine.USER_INFO, s -> {
s.setRoles(new ArrayList<>(roleCodeList));