feat: 递归查找树,tencent基本实现
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package com.schisandra.auth.application.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.schisandra.auth.application.convert.SchisandraAuthPermissionDTOConvert;
|
||||
import com.schisandra.auth.application.dto.SchisandraAuthPermissionDTO;
|
||||
@@ -9,12 +10,11 @@ import com.schisandra.auth.domain.bo.SchisandraAuthPermissionBO;
|
||||
import com.schisandra.auth.domain.service.SchisandraAuthPermissionDomainService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* @description: 权限管理
|
||||
* @author: landaiqing
|
||||
@@ -121,6 +121,14 @@ public class SchisandraAuthPermissionController {
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("selectUserPermission")
|
||||
public Result<Object> selectUserPermission(@RequestParam("userId") Long userId) {
|
||||
if (userId == null) {
|
||||
return Result.fail("userId不能为空");
|
||||
}
|
||||
return schisandraAuthPermissionDomainService.selectUserPermissionTree(userId);
|
||||
}
|
||||
|
||||
private void checkRoleInfo(@RequestBody SchisandraAuthPermissionDTO schisandraAuthPermissionDTO) {
|
||||
Preconditions.checkArgument(!StringUtils.isBlank(schisandraAuthPermissionDTO.getId().toString()), "角色名不能为空");
|
||||
Preconditions.checkArgument(!StringUtils.isBlank(schisandraAuthPermissionDTO.getName()), "角色key值不能为空");
|
||||
|
@@ -24,6 +24,7 @@ import com.schisandra.auth.domain.service.SchisandraAuthRolePermissionDomainServ
|
||||
import com.schisandra.auth.domain.service.SchisandraAuthUserDomainService;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthPermission;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthRole;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthRolePermission;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthUser;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -77,6 +78,7 @@ public class SchisandraAuthUserController {
|
||||
@Resource
|
||||
private SchisandraAuthPermissionDomainService schisandraAuthPermissionDomainService;
|
||||
|
||||
|
||||
/**
|
||||
* @description: 注册
|
||||
* @param: [schisandraAuthUserDTO]
|
||||
|
@@ -0,0 +1,24 @@
|
||||
package com.schisandra.auth.common.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@Data
|
||||
public class TreeNode {
|
||||
private Integer id;
|
||||
|
||||
private Integer parentId;
|
||||
|
||||
private List<TreeNode> children;
|
||||
|
||||
public TreeNode(Integer id, Integer parentId) {
|
||||
this.id = id;
|
||||
this.parentId = parentId;
|
||||
this.children = new ArrayList<>();
|
||||
}
|
||||
public TreeNode() {
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -0,0 +1,47 @@
|
||||
package com.schisandra.auth.common.utils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.function.Function;
|
||||
public class TreeUtils {
|
||||
public static <T, R> List<T> buildTree(List<T> nodesList, R pid, String idFieldName, String parentIdFieldName, String childrenFieldName, Function<Stream<T>, Stream<T>> function) {
|
||||
Map<Object, List<T>> map = nodesList.stream().collect(Collectors.groupingBy(a -> {
|
||||
try {
|
||||
Field field = a.getClass().getDeclaredField(parentIdFieldName);
|
||||
field.setAccessible(true);
|
||||
return field.get(a);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
throw new RuntimeException("Error reading id field: " + e.getMessage());
|
||||
}
|
||||
}));
|
||||
|
||||
List<T> roots = new ArrayList<>();
|
||||
// 逐层构建树结构
|
||||
roots.addAll(function.apply(Optional.ofNullable(map.get(pid)).orElse(new ArrayList<>()).stream()).collect(Collectors.toList()));
|
||||
Queue<T> queue = new LinkedList<>(roots);
|
||||
|
||||
while (!queue.isEmpty()) {
|
||||
try {
|
||||
T node = queue.poll();
|
||||
Field idField = node.getClass().getDeclaredField(idFieldName);
|
||||
idField.setAccessible(true);
|
||||
Object nodeId = idField.get(node);
|
||||
|
||||
if (map.containsKey(nodeId)) {
|
||||
Field childrenField = node.getClass().getDeclaredField(childrenFieldName);
|
||||
childrenField.setAccessible(true);
|
||||
List<T> list = function.apply(Optional.ofNullable(map.get(nodeId)).orElse(new ArrayList<>()).stream()).collect(Collectors.toList());
|
||||
childrenField.set(node, list);
|
||||
queue.addAll(list);
|
||||
}
|
||||
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
throw new RuntimeException("Error reading id field: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
return roots;
|
||||
}
|
||||
|
||||
}
|
@@ -4,6 +4,7 @@ import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* (SchisandraAuthPermission)实体类
|
||||
@@ -16,6 +17,7 @@ public class
|
||||
SchisandraAuthPermissionBO implements Serializable {
|
||||
|
||||
|
||||
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
@@ -52,6 +54,6 @@ SchisandraAuthPermissionBO implements Serializable {
|
||||
|
||||
private Integer isDeleted;
|
||||
|
||||
|
||||
private List<Object> routes;
|
||||
}
|
||||
|
||||
|
@@ -1,12 +1,17 @@
|
||||
package com.schisandra.auth.domain.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.schisandra.auth.common.entity.Result;
|
||||
import com.schisandra.auth.domain.bo.SchisandraAuthPermissionBO;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthPermission;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public interface SchisandraAuthPermissionDomainService {
|
||||
|
||||
Result<Object> selectUserPermissionTree(Long userId);
|
||||
int update(SchisandraAuthPermissionBO schisandraAuthPermissionBO);
|
||||
Object delete(SchisandraAuthPermissionBO schisandraAuthPermissionBO);
|
||||
Object insert(SchisandraAuthPermissionBO schisandraAuthPermissionBO);
|
||||
|
@@ -1,12 +1,12 @@
|
||||
package com.schisandra.auth.domain.service;
|
||||
|
||||
|
||||
import cn.dev33.satoken.stp.SaTokenInfo;
|
||||
import com.schisandra.auth.common.entity.Result;
|
||||
import com.schisandra.auth.domain.bo.SchisandraAuthUserBO;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthUser;
|
||||
import me.zhyd.oauth.model.AuthUser;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* 用户领域service
|
||||
@@ -15,6 +15,9 @@ import org.springframework.web.bind.annotation.RequestParam;
|
||||
* @since 2024-05-23 20:00:28
|
||||
*/
|
||||
public interface SchisandraAuthUserDomainService {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @description: 找回密码
|
||||
* @param: [schisandraAuthUserBO]
|
||||
|
@@ -1,22 +1,81 @@
|
||||
package com.schisandra.auth.domain.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.schisandra.auth.common.entity.Result;
|
||||
import com.schisandra.auth.domain.bo.SchisandraAuthPermissionBO;
|
||||
import com.schisandra.auth.domain.convert.SchisandraAuthPermissionBOConverter;
|
||||
import com.schisandra.auth.domain.service.SchisandraAuthPermissionDomainService;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthPermission;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthRolePermission;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthUserRole;
|
||||
import com.schisandra.auth.infra.basic.service.SchisandraAuthPermissionService;
|
||||
import com.schisandra.auth.infra.basic.service.SchisandraAuthRolePermissionService;
|
||||
import com.schisandra.auth.infra.basic.service.SchisandraAuthUserRoleService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class SchisandraAuthPermissionDomainServiceImpl implements SchisandraAuthPermissionDomainService {
|
||||
@Resource
|
||||
SchisandraAuthPermissionService schisandraAuthPermissionService;
|
||||
/**
|
||||
@Resource
|
||||
SchisandraAuthUserRoleService schisandraAuthUserRoleService;
|
||||
@Resource
|
||||
SchisandraAuthRolePermissionService schisandraAuthRolePermissionService;
|
||||
|
||||
public List<Object> selectTree(List<SchisandraAuthPermissionBO> schisandraAuthPermissions,List<SchisandraAuthPermissionBO> schisandraAuthPermissionsParent) {
|
||||
List<Object> selectTreeList1 = new ArrayList<>();
|
||||
schisandraAuthPermissionsParent.forEach(e -> {
|
||||
List<SchisandraAuthPermissionBO> schisandraAuthPermissions1 = new ArrayList<>();
|
||||
schisandraAuthPermissions.forEach(e1 -> {
|
||||
if (e1.getParentId()==e.getId()){
|
||||
schisandraAuthPermissions1.add(e1);
|
||||
}
|
||||
});
|
||||
if (schisandraAuthPermissions1.size()==0){
|
||||
selectTreeList1.add(e);
|
||||
}
|
||||
else {
|
||||
List<Object> list1 = selectTree(schisandraAuthPermissions,schisandraAuthPermissions1);
|
||||
e.setRoutes(list1);
|
||||
selectTreeList1.add(e);
|
||||
}
|
||||
});
|
||||
return selectTreeList1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<Object> selectUserPermissionTree(Long userId) {
|
||||
SchisandraAuthUserRole schisandraAuthRole = schisandraAuthUserRoleService.queryById(userId);
|
||||
if (schisandraAuthRole == null||schisandraAuthRole.getRoleId()==null) {
|
||||
return Result.ok("用户没有角色");
|
||||
}
|
||||
List<SchisandraAuthRolePermission> schisandraAuthRolePermissions = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRole.getRoleId());
|
||||
if (schisandraAuthRolePermissions.size()==0){
|
||||
return Result.ok("当前角色用户没有权限");
|
||||
}
|
||||
List<SchisandraAuthPermissionBO> schisandraAuthPermissions =new ArrayList<>();
|
||||
List<SchisandraAuthPermissionBO> schisandraAuthPermissionParents = new ArrayList<>();
|
||||
schisandraAuthRolePermissions.forEach(e -> {
|
||||
schisandraAuthPermissions.add(SchisandraAuthPermissionBOConverter.INSTANCE.convertEntityToBO(schisandraAuthPermissionService.queryById(e.getPermissionId())));
|
||||
});
|
||||
|
||||
schisandraAuthPermissions.forEach(e -> {
|
||||
if (e.getParentId()==0){
|
||||
schisandraAuthPermissionParents.add(e);
|
||||
}
|
||||
});
|
||||
HashMap<Object,Object>map=new HashMap<>();
|
||||
map.put("path","/");
|
||||
map.put("routes",selectTree(schisandraAuthPermissions,schisandraAuthPermissionParents));
|
||||
return Result.ok(map);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: 更新
|
||||
* @param: [schisandraAuthPermissionBO]
|
||||
* @return: java.lang.Object
|
||||
|
@@ -50,7 +50,7 @@ public class SchisandraAuthRolePermissionDomainServiceImpl implements Schisandra
|
||||
@Override
|
||||
public List<SchisandraAuthRolePermissionBO> queryByRoleId(SchisandraAuthRolePermissionBO schisandraAuthRolePermissionBO) {
|
||||
SchisandraAuthRolePermission schisandraAuthRolePermission = SchisandraAuthRolePermissionBOConverter.INSTANCE.convertBOToEntity(schisandraAuthRolePermissionBO);
|
||||
List<SchisandraAuthRolePermission> schisandraAuthRolePermissions = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRolePermission);
|
||||
List<SchisandraAuthRolePermission> schisandraAuthRolePermissions = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRolePermission.getRoleId());
|
||||
List<SchisandraAuthRolePermissionBO> schisandraAuthRolePermissionBOS = SchisandraAuthRolePermissionBOConverter.INSTANCE.convertEntityToBOList(schisandraAuthRolePermissions);
|
||||
return schisandraAuthRolePermissionBOS;
|
||||
}
|
||||
|
@@ -26,8 +26,7 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -71,6 +70,7 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo
|
||||
@Resource
|
||||
private SchisandraAuthPermissionService schisandraAuthPermissionService;
|
||||
|
||||
|
||||
/**
|
||||
* @description: 找回密码
|
||||
* @param: [schisandraAuthUserBO]
|
||||
@@ -443,7 +443,7 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo
|
||||
// 查询用户权限并存入redis
|
||||
SchisandraAuthRolePermission schisandraAuthRolePermission = new SchisandraAuthRolePermission();
|
||||
schisandraAuthRolePermission.setRoleId(UserRoleEnum.NORMAL_USER.getCode());
|
||||
List<SchisandraAuthRolePermission> rolePermissionList = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRolePermission);
|
||||
List<SchisandraAuthRolePermission> rolePermissionList = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRolePermission.getRoleId());
|
||||
List<Long> permissionIdList = rolePermissionList.stream()
|
||||
.map(SchisandraAuthRolePermission::getPermissionId).collect(Collectors.toList());
|
||||
List<SchisandraAuthPermission> permissionList = schisandraAuthPermissionService.queryListByIds(permissionIdList);
|
||||
|
@@ -45,5 +45,5 @@ public interface SchisandraAuthRolePermissionService {
|
||||
boolean deleteById(Long id);
|
||||
|
||||
|
||||
List<SchisandraAuthRolePermission> queryByRoleId(SchisandraAuthRolePermission schisandraAuthRolePermission);
|
||||
List<SchisandraAuthRolePermission> queryByRoleId(Long roleId);
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package com.schisandra.auth.infra.basic.service;
|
||||
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthRole;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthUserRole;
|
||||
|
||||
/**
|
||||
|
@@ -67,8 +67,8 @@ public class SchisandraAuthRolePermissionServiceImpl implements SchisandraAuthRo
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SchisandraAuthRolePermission> queryByRoleId(SchisandraAuthRolePermission schisandraAuthRolePermission) {
|
||||
return schisandraAuthRolePermissionDao.selectListByCondition(SchisandraAuthRolePermissionTableDef.SCHISANDRA_AUTH_ROLE_PERMISSION.ROLE_ID.eq(schisandraAuthRolePermission.getRoleId()));
|
||||
public List<SchisandraAuthRolePermission> queryByRoleId(Long roleId) {
|
||||
return schisandraAuthRolePermissionDao.selectListByCondition(SchisandraAuthRolePermissionTableDef.SCHISANDRA_AUTH_ROLE_PERMISSION.ROLE_ID.eq(roleId));
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1,8 +1,15 @@
|
||||
package com.schisandra.auth.infra.basic.service.impl;
|
||||
|
||||
|
||||
import com.mybatisflex.core.query.QueryWrapper;
|
||||
import com.schisandra.auth.infra.basic.dao.SchisandraAuthRoleDao;
|
||||
import com.schisandra.auth.infra.basic.dao.SchisandraAuthUserRoleDao;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthRole;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthUser;
|
||||
import com.schisandra.auth.infra.basic.entity.SchisandraAuthUserRole;
|
||||
import com.schisandra.auth.infra.basic.entity.table.SchisandraAuthRoleTableDef;
|
||||
import com.schisandra.auth.infra.basic.entity.table.SchisandraAuthUserRoleTableDef;
|
||||
import com.schisandra.auth.infra.basic.entity.table.SchisandraAuthUserTableDef;
|
||||
import com.schisandra.auth.infra.basic.service.SchisandraAuthUserRoleService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@@ -20,6 +27,9 @@ public class SchisandraAuthUserRoleServiceImpl implements SchisandraAuthUserRole
|
||||
|
||||
@Resource
|
||||
private SchisandraAuthUserRoleDao schisandraAuthUserRoleDao;
|
||||
@Resource
|
||||
private SchisandraAuthRoleDao schisandraAuthRoleDao;
|
||||
|
||||
|
||||
/**
|
||||
* 通过ID查询单条数据
|
||||
@@ -29,7 +39,7 @@ public class SchisandraAuthUserRoleServiceImpl implements SchisandraAuthUserRole
|
||||
*/
|
||||
@Override
|
||||
public SchisandraAuthUserRole queryById(Long id) {
|
||||
return this.schisandraAuthUserRoleDao.selectOneById(id);
|
||||
return this.schisandraAuthUserRoleDao.selectOneByCondition(SchisandraAuthUserRoleTableDef.SCHISANDRA_AUTH_USER_ROLE.USER_ID.eq(id));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user