feat: 递归查找树,tencent基本实现

This commit is contained in:
zlg
2024-07-03 14:07:31 +08:00
parent d2863ccf71
commit ac72f4ed82
24 changed files with 803 additions and 49 deletions

View File

@@ -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值不能为空");

View File

@@ -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]

View File

@@ -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() {
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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]

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -45,5 +45,5 @@ public interface SchisandraAuthRolePermissionService {
boolean deleteById(Long id);
List<SchisandraAuthRolePermission> queryByRoleId(SchisandraAuthRolePermission schisandraAuthRolePermission);
List<SchisandraAuthRolePermission> queryByRoleId(Long roleId);
}

View File

@@ -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;
/**

View File

@@ -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));
}

View File

@@ -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));
}
/**