serv\web- 多租户修改

This commit is contained in:
2025-10-29 19:08:22 +08:00
parent c5c134fbb3
commit 82b6f14e64
86 changed files with 4446 additions and 2730 deletions

View File

@@ -15,7 +15,7 @@ import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.dept.TbSysDept;
import org.xyzh.common.dto.dept.TbSysDeptRole;
import org.xyzh.common.dto.role.TbSysRole;
import org.xyzh.common.vo.DeptRoleVO;
import org.xyzh.common.vo.UserDeptRoleVO;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -110,14 +110,13 @@ public class DeptController {
}
/**
* @description 查询部门绑定角色
* @param dept 部门信息
* @return ResultDomain<TbSysRole> 角色信息
* @description 查询部门绑定角色列表(包含名称)
* @return ResultDomain<UserDeptRoleVO> 部门角色信息
* @author yslg
* @since 2025-10-06
*/
@PostMapping("/role/list")
public ResultDomain<TbSysDeptRole> getDeptByRoleList() {
public ResultDomain<UserDeptRoleVO> getDeptByRoleList() {
return deptService.getDeptByRoleList();
}
@@ -129,7 +128,7 @@ public class DeptController {
* @since 2025-10-06
*/
@PostMapping("/bind/role")
public ResultDomain<TbSysDeptRole> bindDeptRole(@RequestBody DeptRoleVO deptRole) {
public ResultDomain<TbSysDeptRole> bindDeptRole(@RequestBody UserDeptRoleVO deptRole) {
List<String> deptIDs = deptRole.getDepts().stream().map(TbSysDept::getDeptID).collect(Collectors.toList());
List<String> roleIDs = deptRole.getRoles().stream().map(TbSysRole::getRoleID).collect(Collectors.toList());
return deptService.bindDeptRole(deptIDs, roleIDs);
@@ -143,7 +142,7 @@ public class DeptController {
* @since 2025-10-06
*/
@PostMapping("/unbind/role")
public ResultDomain<TbSysDeptRole> unbindDeptRole(@RequestBody DeptRoleVO deptRole) {
public ResultDomain<TbSysDeptRole> unbindDeptRole(@RequestBody UserDeptRoleVO deptRole) {
List<String> deptIDs = deptRole.getDepts().stream().map(TbSysDept::getDeptID).collect(Collectors.toList());
List<String> roleIDs = deptRole.getRoles().stream().map(TbSysRole::getRoleID).collect(Collectors.toList());
return deptService.unbindDeptRole(deptIDs, roleIDs);

View File

@@ -14,7 +14,7 @@ import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.permission.TbSysPermission;
import org.xyzh.common.dto.role.TbSysRole;
import org.xyzh.common.dto.role.TbSysRolePermission;
import org.xyzh.common.vo.DeptRoleVO;
import org.xyzh.common.vo.UserDeptRoleVO;
/**
* @description RoleController.java文件描述 角色控制器

View File

@@ -116,7 +116,7 @@ public class UserController {
* @since 2025-10-09
*/
@PostMapping("/bind/deptrole/list")
public ResultDomain<TbSysUserDeptRole> getBindUserDeptRoleList(@RequestBody TbSysUserDeptRole filter) {
public ResultDomain<UserDeptRoleVO> getBindUserDeptRoleList(@RequestBody TbSysUserDeptRole filter) {
return userService.getBindUserDeptRoleList(filter);
}

View File

@@ -4,12 +4,18 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.xyzh.api.system.permission.ResourcePermissionService;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.enums.ResourceType;
import org.xyzh.common.dto.dept.TbSysDept;
import org.xyzh.common.dto.dept.TbSysDeptRole;
import org.xyzh.common.dto.permission.TbResourcePermission;
import org.xyzh.common.dto.role.TbSysRole;
import org.xyzh.common.dto.user.TbSysUser;
import org.xyzh.common.dto.user.TbSysUserDeptRole;
import org.xyzh.common.vo.UserDeptRoleVO;
import org.xyzh.common.utils.IDUtils;
import org.xyzh.system.department.service.SysDepartmentService;
import org.xyzh.system.mapper.DepartmentMapper;
@@ -38,6 +44,9 @@ public class SysDepartmentServiceImpl implements SysDepartmentService {
@Autowired
private DeptRoleMapper deptRoleMapper;
@Autowired
private ResourcePermissionService resourcePermissionService;
@Override
public ResultDomain<TbSysDept> getAllDepartments() {
ResultDomain<TbSysDept> resultDomain = new ResultDomain<>();
@@ -46,7 +55,9 @@ public class SysDepartmentServiceImpl implements SysDepartmentService {
logger.info("开始查询所有部门");
TbSysDept filter = new TbSysDept();
filter.setDeleted(false);
List<TbSysDept> departments = departmentMapper.selectDepts(filter);
// 获取当前用户的部门角色
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
List<TbSysDept> departments = departmentMapper.selectDepts(filter, userDeptRoles);
logger.info("查询所有部门完成,共找到{}个部门", departments.size());
resultDomain.success("查询成功", departments);
@@ -65,7 +76,9 @@ public class SysDepartmentServiceImpl implements SysDepartmentService {
ResultDomain<TbSysDept> resultDomain = new ResultDomain<>();
try {
logger.info("开始查询部门列表");
List<TbSysDept> departments = departmentMapper.selectDepts(filter);
// 获取当前用户的部门角色
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
List<TbSysDept> departments = departmentMapper.selectDepts(filter, userDeptRoles);
if (departments.isEmpty()) {
resultDomain.fail("未找到部门");
return resultDomain;
@@ -80,11 +93,19 @@ public class SysDepartmentServiceImpl implements SysDepartmentService {
}
@Override
public ResultDomain<TbSysDeptRole> getDeptByRoleList() {
ResultDomain<TbSysDeptRole> resultDomain = new ResultDomain<>();
List<TbSysDeptRole> deptRoles = deptRoleMapper.selectDeptRoleList();
resultDomain.success("查询成功", deptRoles);
return resultDomain;
public ResultDomain<UserDeptRoleVO> getDeptByRoleList() {
ResultDomain<UserDeptRoleVO> resultDomain = new ResultDomain<>();
try {
logger.info("开始查询部门角色关联列表");
List<UserDeptRoleVO> deptRoles = deptRoleMapper.selectDeptRoleList();
logger.info("查询部门角色关联列表完成,共找到{}条记录", deptRoles.size());
resultDomain.success("查询成功", deptRoles);
return resultDomain;
} catch (Exception e) {
logger.error("查询部门角色关联列表失败", e);
resultDomain.fail("查询部门角色关联列表失败:" + e.getMessage());
return resultDomain;
}
}
@Override
@@ -100,7 +121,9 @@ public class SysDepartmentServiceImpl implements SysDepartmentService {
TbSysDept filter = new TbSysDept();
filter.setDeptID(deptId);
List<TbSysDept> departments = departmentMapper.selectDepts(filter);
// 获取当前用户的部门角色
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
List<TbSysDept> departments = departmentMapper.selectDepts(filter, userDeptRoles);
TbSysDept department = departments.isEmpty() ? null : departments.get(0);
if (department == null) {
@@ -140,6 +163,7 @@ public class SysDepartmentServiceImpl implements SysDepartmentService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultDomain<TbSysDept> createDepartment(TbSysDept department) {
ResultDomain<TbSysDept> resultDomain = new ResultDomain<>();
try {
@@ -162,9 +186,17 @@ public class SysDepartmentServiceImpl implements SysDepartmentService {
return resultDomain;
}
// 获取当前用户
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser == null) {
resultDomain.fail("请先登录");
return resultDomain;
}
// 设置基础信息
department.setID(IDUtils.generateID());
department.setDeptID(IDUtils.generateID());
department.setCreator(currentUser.getID());
department.setCreateTime(new Date());
department.setDeleted(false);
@@ -173,6 +205,24 @@ public class SysDepartmentServiceImpl implements SysDepartmentService {
if (result > 0) {
logger.info("创建部门成功:{}", department.getName());
// 创建资源权限
try {
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
if (userDeptRoles != null && !userDeptRoles.isEmpty()) {
ResultDomain<TbResourcePermission> permissionResult = resourcePermissionService.createResourcePermission(
ResourceType.DEPT.getCode(),
department.getDeptID(),
userDeptRoles.get(0)
);
if (!permissionResult.isSuccess()) {
logger.warn("创建部门权限失败:{}", permissionResult.getMessage());
}
}
} catch (Exception e) {
logger.error("创建部门权限异常", e);
}
resultDomain.success("创建部门成功", department);
return resultDomain;
} else {

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.dto.dept.TbSysDept;
import org.xyzh.common.vo.UserDeptRoleVO;
import java.util.List;
@@ -20,11 +21,12 @@ public interface DepartmentMapper extends BaseMapper<TbSysDept> {
/**
* @description 查询部门列表
* @param filter 过滤条件
* @param userDeptRoles 用户部门角色列表
* @return List<TbSysDept> 部门列表
* @author yslg
* @since 2025-10-06
*/
List<TbSysDept> selectDepts(TbSysDept filter);
List<TbSysDept> selectDepts(@Param("filter") TbSysDept filter, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);
/**
* @description 根据父部门ID查询子部门列表

View File

@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.dto.dept.TbSysDeptRole;
import org.xyzh.common.dto.role.TbSysRole;
import org.xyzh.common.vo.UserDeptRoleVO;
@Mapper
public interface DeptRoleMapper extends BaseMapper<TbSysDeptRole> {
@@ -22,12 +23,12 @@ public interface DeptRoleMapper extends BaseMapper<TbSysDeptRole> {
List<TbSysRole> selectDeptRole(String deptId);
/**
* @description 查询部门绑定角色
* @return List<TbSysDeptRole> 部门角色列表
* @description 查询部门绑定角色列表(包含名称)
* @return List<UserDeptRoleVO> 部门角色列表
* @author yslg
* @since 2025-10-06
*/
List<TbSysDeptRole> selectDeptRoleList();
List<UserDeptRoleVO> selectDeptRoleList();
/**
* @description 批量绑定部门角色
@@ -39,4 +40,8 @@ public interface DeptRoleMapper extends BaseMapper<TbSysDeptRole> {
int batchBindDeptRole(@Param("deptRoles") List<TbSysDeptRole> deptRoles);
int batchUnbindDeptRole(@Param("deptRoles") List<TbSysDeptRole> deptRoles);
List<TbSysDeptRole> selectParentDeptAdmin(UserDeptRoleVO userDeptRole);
List<TbSysDeptRole> selectChildDeptRole(UserDeptRoleVO userDeptRole);
}

View File

@@ -0,0 +1,40 @@
package org.xyzh.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.dto.permission.TbResourcePermission;
import org.xyzh.common.vo.ResourcePermissionVO;
import java.util.List;
/**
* @description 资源权限Mapper接口
* @filename ResourcePermissionMapper.java
* @author yslg
* @copyright xyzh
* @since 2025-10-29
*/
@Mapper
public interface ResourcePermissionMapper extends BaseMapper<TbResourcePermission> {
/**
* @description 插入资源权限
* @param permission 资源权限对象
* @return int 插入结果
* @author yslg
* @since 2025-10-29
*/
int insertResourcePermission(TbResourcePermission permission);
/**
* @description 批量插入资源权限
* @param permissions 资源权限列表
* @return int 插入结果
* @author yslg
* @since 2025-10-29
*/
int batchInsertResourcePermission(@Param("list") List<TbResourcePermission> permissions);
}

View File

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.dto.role.TbSysRole;
import org.xyzh.common.vo.DeptRoleVO;
import org.xyzh.common.vo.UserDeptRoleVO;
import java.util.List;
@@ -65,11 +65,11 @@ public interface RoleMapper extends BaseMapper<TbSysRole> {
/**
* @description 根据用户ID查询角色列表
* @param userId 用户ID
* @return List<DeptRoleVO> 部门角色列表
* @return List<UserDeptRoleVO> 部门角色列表
* @author yslg
* @since 2025-09-28
*/
List<DeptRoleVO> selectDeptRolesByUserId(@Param("userId") String userId);
List<UserDeptRoleVO> selectDeptRolesByUserId(@Param("userId") String userId);
/**
* @description 根据角色编码查询角色

View File

@@ -5,19 +5,38 @@ import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.dto.user.TbSysUserDeptRole;
import org.xyzh.common.vo.UserDeptRoleVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Mapper
public interface UserDeptRoleMapper extends BaseMapper<TbSysUserDeptRole> {
/**
* @description 查询用户部门角色
* @param userId 用户ID
* @return List<TbSysUserDeptRole> 用户部门角色列表
* @description 查询用户部门角色(包含名称)
* @param filter 过滤条件
* @return List<UserDeptRoleVO> 用户部门角色列表
* @author yslg
* @since 2025-10-09
*/
List<TbSysUserDeptRole> selectByFilter(TbSysUserDeptRole filter);
List<UserDeptRoleVO> selectByFilter(TbSysUserDeptRole filter);
/**
* @description 删除指定用户的所有部门角色绑定
* @param userID 用户ID
* @return int 影响行数
* @author yslg
* @since 2025-10-09
*/
int deleteUserDeptRole(String userID);
/**
* @description 批量删除多个用户的部门角色绑定
* @param userIds 用户ID列表
* @return int 影响行数
* @author yslg
* @since 2025-10-29
*/
int deleteUserDeptRoleByUserIds(@Param("userIds") List<String> userIds);
/**
* @description 绑定用户

View File

@@ -0,0 +1,173 @@
package org.xyzh.system.permission.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.xyzh.api.system.permission.ResourcePermissionService;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.dept.TbSysDeptRole;
import org.xyzh.common.dto.permission.TbResourcePermission;
import org.xyzh.common.vo.UserDeptRoleVO;
import org.xyzh.system.mapper.DeptRoleMapper;
import org.xyzh.system.mapper.ResourcePermissionMapper;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @description 资源权限控制服务实现类
* @filename SysResourcePermissionServiceImpl.java
* @author yslg
* @copyright xyzh
* @since 2025-10-29
*/
@Service
public class SysResourcePermissionServiceImpl implements ResourcePermissionService {
private static final Logger logger = LoggerFactory.getLogger(SysResourcePermissionServiceImpl.class);
@Autowired
private ResourcePermissionMapper resourcePermissionMapper;
@Autowired
private DeptRoleMapper deptRoleMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public ResultDomain<TbResourcePermission> createResourcePermission(Integer resource_type, String resource_id,
UserDeptRoleVO userDeptRole) {
ResultDomain<TbResourcePermission> resultDomain = new ResultDomain<>();
Set<TbResourcePermission> resourcePermissions = new HashSet<>();
Date now = new Date();
// 判断是否为root_department的superadmin
if (isRootSuperAdmin(userDeptRole)) {
// root_department的superadmin创建资源创建全局读权限
logger.info("用户为root_department的superadmin创建全局读权限所有用户包括未来新增的部门/角色)都能访问");
// 1. 创建全局读权限(所有人可读,包括未来新增的部门/角色)
TbResourcePermission globalReadPermission = createGlobalReadPermission(resource_type, resource_id, userDeptRole.getUserID());
globalReadPermission.setCreateTime(now);
resourcePermissions.add(globalReadPermission);
// 2. 为superadmin创建全权限读写执行
TbResourcePermission superAdminPermission = createSuperAdminPermission(resource_type, resource_id, userDeptRole.getUserID());
superAdminPermission.setCreateTime(now);
resourcePermissions.add(superAdminPermission);
} else {
// 普通用户创建资源:为父部门管理员+当前部门创建权限
logger.info("普通用户创建资源,为父部门管理员和当前部门创建权限(子部门通过递归查询自动继承)");
// 1. 为父部门的管理员角色创建精确权限dept + admin role
List<TbSysDeptRole> parentDeptRoles = deptRoleMapper.selectParentDeptAdmin(userDeptRole);
for (TbSysDeptRole deptRole : parentDeptRoles) {
TbResourcePermission temp = createResourcePermission(resource_type, resource_id, deptRole.getDeptID(), deptRole.getRoleID());
temp.setCreateTime(now);
resourcePermissions.add(temp);
}
// 2. 为当前用户所在部门创建部门级权限dept + NULL
// 所有角色都能访问(包括未来新增的角色)
// 所有子部门都能访问(包括未来新增的子部门,通过查询时递归实现)
TbResourcePermission deptPermission = createDeptLevelPermission(resource_type, resource_id, userDeptRole.getDeptID());
deptPermission.setCreateTime(now);
resourcePermissions.add(deptPermission);
// 3. 为superadmin创建全权限确保超级管理员始终可以管理所有资源
TbResourcePermission superAdminPermission = createSuperAdminPermission(resource_type, resource_id, userDeptRole.getUserID());
superAdminPermission.setCreateTime(now);
resourcePermissions.add(superAdminPermission);
}
List<TbResourcePermission> resourcePermissionsList = new ArrayList<>(resourcePermissions);
int result = resourcePermissionMapper.batchInsertResourcePermission(resourcePermissionsList);
if (result > 0) {
resultDomain.success("创建资源权限成功", resourcePermissionsList);
return resultDomain;
} else {
resultDomain.fail("创建资源权限失败");
return resultDomain;
}
}
/**
* 判断是否为root_department的superadmin
*/
private boolean isRootSuperAdmin(UserDeptRoleVO userDeptRole) {
return "root_department".equals(userDeptRole.getDeptID())
&& "superadmin".equals(userDeptRole.getRoleID());
}
/**
* 创建全局读权限(所有人可读,包括未来新增的部门/角色)
*/
private TbResourcePermission createGlobalReadPermission(Integer resource_type, String resource_id, String creatorID) {
TbResourcePermission resourcePermission = new TbResourcePermission();
resourcePermission.setResourceType(resource_type);
resourcePermission.setResourceID(resource_id);
resourcePermission.setCreator(creatorID);
resourcePermission.setDeptID(null); // NULL表示不限制部门
resourcePermission.setRoleID(null); // NULL表示不限制角色
resourcePermission.setCanRead(true);
resourcePermission.setCanWrite(false);
resourcePermission.setCanExecute(false);
return resourcePermission;
}
/**
* 创建精确部门角色权限dept + role读权限
*/
private TbResourcePermission createResourcePermission(Integer resource_type, String resource_id, String deptID, String roleID) {
TbResourcePermission resourcePermission = new TbResourcePermission();
resourcePermission.setResourceType(resource_type);
resourcePermission.setResourceID(resource_id);
resourcePermission.setDeptID(deptID);
resourcePermission.setRoleID(roleID);
resourcePermission.setCanRead(true);
resourcePermission.setCanWrite(false);
resourcePermission.setCanExecute(false);
return resourcePermission;
}
/**
* 创建部门级权限dept + NULL该部门所有角色可读包括未来新增的角色
*/
private TbResourcePermission createDeptLevelPermission(Integer resource_type, String resource_id, String deptID) {
TbResourcePermission resourcePermission = new TbResourcePermission();
resourcePermission.setResourceType(resource_type);
resourcePermission.setResourceID(resource_id);
resourcePermission.setDeptID(deptID);
resourcePermission.setRoleID(null); // NULL表示该部门所有角色都能访问
resourcePermission.setCanRead(true);
resourcePermission.setCanWrite(false);
resourcePermission.setCanExecute(false);
return resourcePermission;
}
/**
* 创建超级管理员全权限(读写执行)
*/
private TbResourcePermission createSuperAdminPermission(Integer resource_type, String resource_id, String creatorID) {
TbResourcePermission resourcePermission = new TbResourcePermission();
resourcePermission.setResourceType(resource_type);
resourcePermission.setResourceID(resource_id);
resourcePermission.setCreator(creatorID);
resourcePermission.setDeptID("root_department");
resourcePermission.setRoleID("superadmin");
resourcePermission.setCanRead(true);
resourcePermission.setCanWrite(true);
resourcePermission.setCanExecute(true);
return resourcePermission;
}
}

View File

@@ -9,7 +9,7 @@ import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.permission.TbSysPermission;
import org.xyzh.common.dto.role.TbSysRole;
import org.xyzh.common.utils.IDUtils;
import org.xyzh.common.vo.DeptRoleVO;
import org.xyzh.common.vo.UserDeptRoleVO;
import org.xyzh.system.mapper.RolePermissionMapper;
import org.xyzh.system.mapper.RoleMapper;
import org.xyzh.system.mapper.UserDeptRoleMapper;
@@ -257,8 +257,8 @@ public class SysRoleServiceImpl implements SysRoleService {
}
@Override
public ResultDomain<DeptRoleVO> getDeptRolesByUserId(String userId) {
ResultDomain<DeptRoleVO> resultDomain = new ResultDomain<>();
public ResultDomain<UserDeptRoleVO> getDeptRolesByUserId(String userId) {
ResultDomain<UserDeptRoleVO> resultDomain = new ResultDomain<>();
try {
logger.info("开始根据用户ID查询部门角色列表{}", userId);
@@ -267,7 +267,7 @@ public class SysRoleServiceImpl implements SysRoleService {
return resultDomain;
}
List<DeptRoleVO> roles = roleMapper.selectDeptRolesByUserId(userId);
List<UserDeptRoleVO> roles = roleMapper.selectDeptRolesByUserId(userId);
logger.info("根据用户ID查询部门角色列表完成共找到{}个部门角色", roles.size());
resultDomain.success("查询成功", roles);

View File

@@ -3,6 +3,7 @@ package org.xyzh.system.user.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
@@ -46,6 +47,8 @@ public class SysUserServiceImpl implements SysUserService {
@Autowired
private UserDeptRoleMapper userDeptRoleMapper;
@Autowired
private PasswordEncoder passwordEncoder;
@Transactional
@Override
@@ -69,18 +72,18 @@ public class SysUserServiceImpl implements SysUserService {
userInfo.setUserID(user.getID());
userInfo.setCreateTime(now);
userInfo.setAvatar("default");
TbSysUserDeptRole userDeptRole = new TbSysUserDeptRole();
userDeptRole.setUserID(user.getID());
userDeptRole.setDeptID("-1");
userDeptRole.setDeptID("default_department");
userDeptRole.setRoleID("freedom");
userDeptRole.setCreateTime(now);
user.setPassword(passwordEncoder.encode(user.getPassword()));
userMapper.insertUser(user);
userInfoMapper.insertUserInfo(userInfo);
userDeptRoleMapper.bindUser(Arrays.asList(userDeptRole));
resultDomain.success("注册用户成功", user);
return resultDomain;
return resultDomain;
} catch (Exception e) {
logger.error("注册用户失败:{}", user.getUsername(), e);
resultDomain.fail("注册用户失败:" + e.getMessage());
@@ -94,7 +97,7 @@ public class SysUserServiceImpl implements SysUserService {
try {
logger.info("开始检查用户是否已存在:{}", user.getUsername());
} catch (Exception e) {
logger.error("检查用户是否已存在失败:{}", user.getUsername(), e);
resultDomain.fail("检查用户是否已存在失败:" + e.getMessage());
@@ -109,14 +112,14 @@ public class SysUserServiceImpl implements SysUserService {
try {
logger.info("开始查询所有用户");
TbSysUser filter = new TbSysUser();
List<TbSysUser> users = userMapper.selectByFilter(filter);
logger.info("查询所有用户完成,共找到{}个用户", users.size());
resultDomain.success("查询成功", users);
return resultDomain;
} catch (Exception e) {
logger.error("查询所有用户失败", e);
resultDomain.fail("查询用户失败:" + e.getMessage());
@@ -129,28 +132,28 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
try {
logger.info("开始根据ID查询用户{}", userId);
if (!StringUtils.hasText(userId)) {
resultDomain.fail("用户ID不能为空");
return resultDomain;
}
TbSysUser filter = new TbSysUser();
filter.setID(userId);
filter.setDeleted(false);
List<TbSysUser> users = userMapper.selectByFilter(filter);
if (users.isEmpty()) {
logger.warn("未找到用户:{}", userId);
resultDomain.fail("未找到指定用户");
return resultDomain;
}
logger.info("根据ID查询用户完成{}", userId);
resultDomain.success("查询成功", users.get(0));
return resultDomain;
} catch (Exception e) {
logger.error("根据ID查询用户失败{}", userId, e);
resultDomain.fail("查询用户失败:" + e.getMessage());
@@ -163,24 +166,24 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
try {
logger.info("开始根据用户名查询用户:{}", username);
if (!StringUtils.hasText(username)) {
resultDomain.fail("用户名不能为空");
return resultDomain;
}
TbSysUser user = userMapper.selectByUsername(username);
if (user == null) {
logger.warn("未找到用户:{}", username);
resultDomain.fail("未找到指定用户");
return resultDomain;
}
logger.info("根据用户名查询用户完成:{}", username);
resultDomain.success("查询成功", user);
return resultDomain;
} catch (Exception e) {
logger.error("根据用户名查询用户失败:{}", username, e);
resultDomain.fail("查询用户失败:" + e.getMessage());
@@ -193,35 +196,35 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
try {
logger.info("开始根据过滤条件查询用户:{}", filter);
if (filter == null) {
resultDomain.fail("过滤条件不能为空");
return resultDomain;
}
// 检查至少有一个查询条件
// boolean hasFilter = StringUtils.hasText(filter.getID()) ||
// StringUtils.hasText(filter.getUsername()) ||
// StringUtils.hasText(filter.getEmail()) ||
// StringUtils.hasText(filter.getPhone());
// StringUtils.hasText(filter.getUsername()) ||
// StringUtils.hasText(filter.getEmail()) ||
// StringUtils.hasText(filter.getPhone());
// if (!hasFilter) {
// resultDomain.fail("至少需要提供一个查询条件");
// return resultDomain;
// resultDomain.fail("至少需要提供一个查询条件");
// return resultDomain;
// }
List<TbSysUser> users = userMapper.selectByFilter(filter);
if (users.isEmpty()) {
logger.warn("未找到符合条件的用户:{}", filter);
resultDomain.fail("未找到指定用户");
return resultDomain;
}
logger.info("根据过滤条件查询用户完成:{}", filter);
resultDomain.success("查询成功", users);
return resultDomain;
} catch (Exception e) {
logger.error("根据过滤条件查询用户失败:{}", filter, e);
resultDomain.fail("查询用户失败:" + e.getMessage());
@@ -246,13 +249,13 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
try {
logger.info("开始创建用户:{}", user.getUsername());
// 参数校验
if (!StringUtils.hasText(user.getUsername())) {
resultDomain.fail("用户名不能为空");
return resultDomain;
}
// 检查用户名是否已存在
ResultDomain<Boolean> checkResult = checkUsernameExists(user.getUsername(), null);
if (!checkResult.isSuccess()) {
@@ -263,7 +266,7 @@ public class SysUserServiceImpl implements SysUserService {
resultDomain.fail("用户名已存在");
return resultDomain;
}
// 检查邮箱是否已存在
if (StringUtils.hasText(user.getEmail())) {
ResultDomain<Boolean> emailCheckResult = checkEmailExists(user.getEmail(), null);
@@ -276,7 +279,7 @@ public class SysUserServiceImpl implements SysUserService {
return resultDomain;
}
}
// 设置基础信息
user.setID(IDUtils.generateID());
user.setCreateTime(new Date());
@@ -284,10 +287,9 @@ public class SysUserServiceImpl implements SysUserService {
if (user.getStatus() == null) {
user.setStatus(1); // 默认启用状态
}
// 插入数据库
ResultDomain<TbSysUser> result = registerUser(user);
if (result.isSuccess()) {
logger.info("创建用户成功:{}", user.getUsername());
resultDomain.success("创建用户成功", result.getData());
@@ -296,7 +298,7 @@ public class SysUserServiceImpl implements SysUserService {
logger.warn("创建用户失败:{}", user.getUsername());
resultDomain.fail("创建用户失败:" + result.getMessage());
}
return resultDomain;
} catch (Exception e) {
logger.error("创建用户异常:{}", user.getUsername(), e);
@@ -308,150 +310,159 @@ public class SysUserServiceImpl implements SysUserService {
@Override
public ResultDomain<TbSysUser> updateUser(TbSysUser user) {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
try {
logger.info("开始更新用户:{}", user.getID());
// 参数校验
if (!StringUtils.hasText(user.getID())) {
resultDomain.fail("用户ID不能为空");
return resultDomain;
}
if (!StringUtils.hasText(user.getUsername())) {
resultDomain.fail("用户名不能为空");
return resultDomain;
}
// 检查用户是否存在
ResultDomain<TbSysUser> existResult = getUserById(user.getID());
if (!existResult.isSuccess()) {
resultDomain.fail(existResult.getMessage());
return resultDomain;
}
// 检查用户名是否已存在(排除自身)
ResultDomain<Boolean> checkResult = checkUsernameExists(user.getUsername(), user.getID());
if (!checkResult.isSuccess()) {
resultDomain.fail(checkResult.getMessage());
return resultDomain;
}
if (checkResult.getData()) {
resultDomain.fail("用户名已存在");
return resultDomain;
}
// 检查邮箱是否已存在(排除自身)
if (StringUtils.hasText(user.getEmail())) {
ResultDomain<Boolean> emailCheckResult = checkEmailExists(user.getEmail(), user.getID());
if (!emailCheckResult.isSuccess()) {
resultDomain.fail(emailCheckResult.getMessage());
return resultDomain;
}
if (emailCheckResult.getData()) {
resultDomain.fail("邮箱已存在");
return resultDomain;
}
}
// 设置更新时间
user.setUpdateTime(new Date());
// 更新数据库
int result = userMapper.updateUser(user);
if (result > 0) {
logger.info("更新用户成功:{}", user.getID());
resultDomain.success("更新用户成功", user);
return resultDomain;
} else {
logger.warn("更新用户失败:{}", user.getID());
resultDomain.fail("更新用户失败");
return resultDomain;
}
} catch (Exception e) {
logger.error("更新用户异常:{}", user.getID(), e);
resultDomain.fail("更新用户失败:" + e.getMessage());
logger.info("开始更新用户:{}", user.getID());
// 参数校验
if (!StringUtils.hasText(user.getID())) {
resultDomain.fail("用户ID不能为空");
return resultDomain;
}
// 检查用户是否存在
ResultDomain<TbSysUser> existResult = getUserById(user.getID());
if (!existResult.isSuccess()) {
resultDomain.fail(existResult.getMessage());
return resultDomain;
}
// 检查邮箱是否已存在(排除自身)
if (StringUtils.hasText(user.getEmail())) {
ResultDomain<Boolean> emailCheckResult = checkEmailExists(user.getEmail(), user.getID());
if (!emailCheckResult.isSuccess()) {
resultDomain.fail(emailCheckResult.getMessage());
return resultDomain;
}
if (emailCheckResult.getData()) {
resultDomain.fail("邮箱已存在");
return resultDomain;
}
}
// 设置更新时间
user.setUpdateTime(new Date());
// 更新数据库
int result = userMapper.updateUser(user);
if (result > 0) {
logger.info("更新用户成功:{}", user.getID());
resultDomain.success("更新用户成功", user);
return resultDomain;
} else {
logger.warn("更新用户失败:{}", user.getID());
resultDomain.fail("更新用户失败");
return resultDomain;
}
}
@Override
public ResultDomain<TbSysUser> deleteUser(String userId) {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
logger.info("开始删除用户:{}", userId);
if (!StringUtils.hasText(userId)) {
resultDomain.fail("用户ID不能为空");
return resultDomain;
}
// 检查用户是否存在
ResultDomain<TbSysUser> existResult = getUserById(userId);
if (!existResult.isSuccess()) {
resultDomain.fail(existResult.getMessage());
return resultDomain;
}
// 逻辑删除
// TbSysUser user = existResult.getData();
// user.setDeleted(true);
// user.setDeleteTime(new Date());
// int result = userMapper.updateUser(user);
int result = userMapper.deleteUser(userId);
if (result > 0) {
logger.info("删除用户成功:{}", userId);
resultDomain.success("删除用户成功", new TbSysUser());
return resultDomain;
} else {
logger.warn("删除用户失败:{}", userId);
resultDomain.fail("删除用户失败");
return resultDomain;
}
}
@Override
public ResultDomain<UserDeptRoleVO> getBindUserDeptRoleList(TbSysUserDeptRole filter) {
ResultDomain<UserDeptRoleVO> resultDomain = new ResultDomain<>();
try {
logger.info("开始删除用户:{}", userId);
if (!StringUtils.hasText(userId)) {
resultDomain.fail("用户ID不能为空");
return resultDomain;
}
// 检查用户是否存在
ResultDomain<TbSysUser> existResult = getUserById(userId);
if (!existResult.isSuccess()) {
resultDomain.fail(existResult.getMessage());
return resultDomain;
}
// 逻辑删除
TbSysUser user = existResult.getData();
user.setDeleted(true);
user.setDeleteTime(new Date());
int result = userMapper.updateUser(user);
if (result > 0) {
logger.info("删除用户成功:{}", userId);
resultDomain.success("删除用户成功", user);
return resultDomain;
} else {
logger.warn("删除用户失败:{}", userId);
resultDomain.fail("删除用户失败");
return resultDomain;
}
logger.info("开始查询用户部门角色绑定列表");
List<UserDeptRoleVO> userDeptRoles = userDeptRoleMapper.selectByFilter(filter);
logger.info("查询用户部门角色绑定列表完成,共找到{}条记录", userDeptRoles.size());
resultDomain.success("查询成功", userDeptRoles);
return resultDomain;
} catch (Exception e) {
logger.error("删除用户异常:{}", userId, e);
resultDomain.fail("删除用户失败:" + e.getMessage());
logger.error("查询用户部门角色绑定列表失败", e);
resultDomain.fail("查询用户部门角色绑定列表失败:" + e.getMessage());
return resultDomain;
}
}
@Override
public ResultDomain<TbSysUserDeptRole> getBindUserDeptRoleList(TbSysUserDeptRole filter) {
ResultDomain<TbSysUserDeptRole> resultDomain = new ResultDomain<>();
List<TbSysUserDeptRole> userDeptRoles = userDeptRoleMapper.selectByFilter(filter);
resultDomain.success("查询成功", userDeptRoles);
return resultDomain;
}
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public ResultDomain<UserDeptRoleVO> bindUserDeptRole(UserDeptRoleVO userDeptRoleVO) {
ResultDomain<UserDeptRoleVO> resultDomain = new ResultDomain<>();
TbSysUser currentUser = LoginUtil.getCurrentUser();
try {
// 收集所有用户ID
List<String> userIds = new ArrayList<>();
for (TbSysUser user : userDeptRoleVO.getUsers()) {
userIds.add(user.getID());
}
logger.info("准备为 {} 个用户绑定部门角色", userIds.size());
// 批量删除所有涉及用户的旧绑定关系(物理删除,包括软删除的记录)
int deleteCount = userDeptRoleMapper.deleteUserDeptRoleByUserIds(userIds);
if (deleteCount <= 0) {
resultDomain.fail("批量删除旧绑定记录失败:没有记录被删除");
return resultDomain;
}
// 准备新的绑定数据
List<TbSysUserDeptRole> userDeptRoles = new ArrayList<>();
logger.info("开始绑定用户部门角色:{}", userDeptRoleVO.getID());
Date now = new Date();
for (TbSysUser user : userDeptRoleVO.getUsers()) {
for(TbSysUserDeptRole userDeptRole : userDeptRoleVO.getUserDeptRoles()) {
userDeptRole.setID(IDUtils.generateID());
userDeptRole.setUserID(user.getID());
userDeptRole.setCreateTime(now);
userDeptRole.setCreator(currentUser.getID());
userDeptRoles.add(userDeptRole);
for (TbSysUserDeptRole userDeptRole : userDeptRoleVO.getUserDeptRoles()) {
TbSysUserDeptRole newUserDeptRole = new TbSysUserDeptRole();
newUserDeptRole.setID(IDUtils.generateID());
newUserDeptRole.setUserID(user.getID());
newUserDeptRole.setDeptID(userDeptRole.getDeptID());
newUserDeptRole.setRoleID(userDeptRole.getRoleID());
newUserDeptRole.setCreateTime(now);
newUserDeptRole.setCreator(currentUser.getID());
userDeptRoles.add(newUserDeptRole);
}
}
userDeptRoleMapper.bindUser(userDeptRoles);
} catch (Exception e) {
logger.error("绑定用户部门角色异常:{}", userDeptRoleVO.getID(), e);
resultDomain.fail("绑定用户部门角色失败:" + e.getMessage());
logger.info("准备插入 {} 条新绑定记录", userDeptRoles.size());
// 插入新的绑定关系
int result = userDeptRoleMapper.bindUser(userDeptRoles);
logger.info("成功插入 {} 条绑定记录", result);
if (result > 0) {
resultDomain.success("绑定用户部门角色成功", userDeptRoleVO);
} else {
resultDomain.fail("绑定用户部门角色失败:没有记录被插入");
}
return resultDomain;
}
return resultDomain;
}
@Transactional
@@ -459,30 +470,26 @@ public class SysUserServiceImpl implements SysUserService {
public ResultDomain<UserDeptRoleVO> unbindUserDeptRole(UserDeptRoleVO userDeptRoleVO) {
ResultDomain<UserDeptRoleVO> resultDomain = new ResultDomain<>();
TbSysUser currentUser = LoginUtil.getCurrentUser();
try {
List<TbSysUserDeptRole> userDeptRoles = new ArrayList<>();
logger.info("开始解绑用户部门角色:{}", userDeptRoleVO.getID());
Date now = new Date();
for(TbSysUser user:userDeptRoleVO.getUsers()) {
for(TbSysUserDeptRole userDeptRole : userDeptRoleVO.getUserDeptRoles()) {
userDeptRole.setUserID(user.getID());
userDeptRoles.add(userDeptRole);
}
List<TbSysUserDeptRole> userDeptRoles = new ArrayList<>();
logger.info("开始解绑用户部门角色:{}", userDeptRoleVO.getDeptID());
Date now = new Date();
for (TbSysUser user : userDeptRoleVO.getUsers()) {
for (TbSysUserDeptRole userDeptRole : userDeptRoleVO.getUserDeptRoles()) {
userDeptRole.setUserID(user.getID());
userDeptRoles.add(userDeptRole);
}
int result = userDeptRoleMapper.unbindUser(userDeptRoles);
if(result > 0) {
logger.info("解绑用户部门角色成功:{}", userDeptRoleVO.getID());
resultDomain.success("解绑用户部门角色成功", userDeptRoleVO);
} else {
logger.warn("解绑用户部门角色失败:{}", userDeptRoleVO.getID());
resultDomain.fail("解绑用户部门角色失败");
}
return resultDomain;
} catch (Exception e) {
logger.error("解绑用户部门角色异常:{}", userDeptRoleVO.getID(), e);
resultDomain.fail("解绑用户部门角色失败:" + e.getMessage());
}
int result = userDeptRoleMapper.unbindUser(userDeptRoles);
if (result > 0) {
logger.info("解绑用户部门角色成功{}", userDeptRoleVO.getDeptID());
resultDomain.success("解绑用户部门角色成功", userDeptRoleVO);
} else {
logger.warn("解绑用户部门角色失败{}", userDeptRoleVO.getDeptID());
resultDomain.fail("解绑用户部门角色失败");
}
return resultDomain;
}
@Override
@@ -490,7 +497,7 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
try {
logger.info("检查用户名是否存在:{}", username);
if (!StringUtils.hasText(username)) {
resultDomain.fail("用户名不能为空");
return resultDomain;
@@ -502,14 +509,14 @@ public class SysUserServiceImpl implements SysUserService {
}
filter.setUsername(username);
filter.setDeleted(false);
long count = userMapper.selectByFilter(filter).size();
boolean exists = count > 0;
logger.info("用户名存在性检查完成:{},存在:{}", username, exists);
resultDomain.success("检查完成", exists);
return resultDomain;
} catch (Exception e) {
logger.error("检查用户名存在性失败:{}", username, e);
resultDomain.fail("检查失败:" + e.getMessage());
@@ -522,27 +529,27 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
try {
logger.info("检查邮箱是否存在:{}", email);
if (!StringUtils.hasText(email)) {
resultDomain.fail("邮箱不能为空");
return resultDomain;
}
TbSysUser filter = new TbSysUser();
filter.setEmail(email);
filter.setDeleted(false);
if (StringUtils.hasText(excludeId)) {
filter.setID(excludeId);
}
long count = userMapper.selectByFilter(filter).size();
boolean exists = count > 0;
logger.info("邮箱存在性检查完成:{},存在:{}", email, exists);
resultDomain.success("检查完成", exists);
return resultDomain;
} catch (Exception e) {
logger.error("检查邮箱存在性失败:{}", email, e);
resultDomain.fail("检查失败:" + e.getMessage());
@@ -555,13 +562,13 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
try {
logger.info("开始搜索用户,用户名:{},邮箱:{},状态:{}", username, email, status);
List<TbSysUser> users = userMapper.selectUserList(username, email, status);
logger.info("搜索用户完成,共找到{}个用户", users.size());
resultDomain.success("搜索成功", users);
return resultDomain;
} catch (Exception e) {
logger.error("搜索用户失败", e);
resultDomain.fail("搜索用户失败:" + e.getMessage());
@@ -574,30 +581,30 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
try {
logger.info("开始修改用户状态:{},状态:{}", userId, status);
if (!StringUtils.hasText(userId)) {
resultDomain.fail("用户ID不能为空");
return resultDomain;
}
if (status == null) {
resultDomain.fail("用户状态不能为空");
return resultDomain;
}
// 检查用户是否存在
ResultDomain<TbSysUser> existResult = getUserById(userId);
if (!existResult.isSuccess()) {
resultDomain.fail(existResult.getMessage());
return resultDomain;
}
TbSysUser user = existResult.getData();
user.setStatus(status);
user.setUpdateTime(new Date());
int result = userMapper.updateUser(user);
if (result > 0) {
logger.info("修改用户状态成功:{}", userId);
resultDomain.success("修改用户状态成功", user);
@@ -607,7 +614,7 @@ public class SysUserServiceImpl implements SysUserService {
resultDomain.fail("修改用户状态失败");
return resultDomain;
}
} catch (Exception e) {
logger.error("修改用户状态异常:{}", userId, e);
resultDomain.fail("修改用户状态失败:" + e.getMessage());
@@ -620,31 +627,31 @@ public class SysUserServiceImpl implements SysUserService {
ResultDomain<TbSysUser> resultDomain = new ResultDomain<>();
try {
logger.info("开始重置用户密码:{}", userId);
if (!StringUtils.hasText(userId)) {
resultDomain.fail("用户ID不能为空");
return resultDomain;
}
if (!StringUtils.hasText(newPassword)) {
resultDomain.fail("新密码不能为空");
return resultDomain;
}
// 检查用户是否存在
ResultDomain<TbSysUser> existResult = getUserById(userId);
if (!existResult.isSuccess()) {
resultDomain.fail(existResult.getMessage());
return resultDomain;
}
TbSysUser user = existResult.getData();
// TODO: 这里应该对密码进行加密处理
user.setPassword(newPassword);
user.setUpdateTime(new Date());
int result = userMapper.updateUser(user);
if (result > 0) {
logger.info("重置用户密码成功:{}", userId);
resultDomain.success("重置密码成功", user);
@@ -654,7 +661,7 @@ public class SysUserServiceImpl implements SysUserService {
resultDomain.fail("重置密码失败");
return resultDomain;
}
} catch (Exception e) {
logger.error("重置用户密码异常:{}", userId, e);
resultDomain.fail("重置密码失败:" + e.getMessage());
@@ -662,7 +669,6 @@ public class SysUserServiceImpl implements SysUserService {
}
}
// ----------------用户信息相关--------------------------------
@Override
@@ -682,11 +688,11 @@ public class SysUserServiceImpl implements SysUserService {
resultDomain.fail("未找到指定用户信息");
return resultDomain;
}
logger.info("根据ID查询用户信息完成{}", userId);
resultDomain.success("查询成功", userInfo);
return resultDomain;
} catch (Exception e) {
logger.error("根据ID查询用户信息失败{}", userId, e);
resultDomain.fail("查询用户信息失败:" + e.getMessage());
@@ -705,9 +711,9 @@ public class SysUserServiceImpl implements SysUserService {
return resultDomain;
}
userInfo.setUpdateTime(new Date());
int result = userMapper.updateUserInfo(userInfo);
if (result > 0) {
logger.info("更新用户信息成功:{}", userInfo.getUserID());
TbSysUserInfo newUserInfo = userMapper.selectUserInfoById(userInfo.getUserID());
@@ -718,7 +724,7 @@ public class SysUserServiceImpl implements SysUserService {
resultDomain.fail("更新用户信息失败");
return resultDomain;
}
} catch (Exception e) {
logger.error("更新用户信息异常:{}", userInfo.getUserID(), e);
resultDomain.fail("更新用户信息失败:" + e.getMessage());
@@ -726,7 +732,6 @@ public class SysUserServiceImpl implements SysUserService {
}
}
@Override
public ResultDomain<UserVO> getUserInfoTotal(String userId) {
ResultDomain<UserVO> resultDomain = new ResultDomain<>();

View File

@@ -1,5 +1,8 @@
package org.xyzh.system.utils;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.xyzh.common.core.domain.LoginDomain;
@@ -9,6 +12,7 @@ import org.xyzh.common.dto.user.TbSysUserInfo;
import org.xyzh.common.redis.service.RedisService;
import org.xyzh.common.utils.NonUtils;
import org.xyzh.common.utils.ServletUtil;
import org.xyzh.common.vo.UserDeptRoleVO;
/**
* @description LoginUtil.java文件描述 登录信息工具类
@@ -72,6 +76,26 @@ public class LoginUtil {
}
}
/**
* 获取当前用户的部门角色列表(扁平化)
* UserDeptRoleVO已包含deptPath字段用于高效的权限继承判断
* @return 部门角色列表
*/
public static List<UserDeptRoleVO> getCurrentDeptRole() {
LoginDomain loginDomain = getCurrentLoginDomain();
List<UserDeptRoleVO> roles = loginDomain.getRoles();
// UserDeptRoleVO应该在登录时就已经扁平化填充好了
// 这里只需要确保userID被设置如果还没设置的话
String userId = loginDomain.getUser().getID();
return roles.stream().map(item -> {
if (item.getUserID() == null) {
item.setUserID(userId);
}
return item;
}).collect(Collectors.toList());
}
/**
* @description 获取当前登录用户
* @return TbSysUser 当前登录用户未登录返回null

View File

@@ -8,6 +8,7 @@
<result column="dept_id" property="deptID" jdbcType="VARCHAR"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="parent_id" property="parentID" jdbcType="VARCHAR"/>
<result column="dept_path" property="deptPath" jdbcType="VARCHAR"/>
<result column="description" property="description" jdbcType="VARCHAR"/>
<result column="creator" property="creator" jdbcType="VARCHAR"/>
<result column="updater" property="updater" jdbcType="VARCHAR"/>
@@ -19,7 +20,7 @@
<!-- 基础字段 -->
<sql id="Base_Column_List">
id, dept_id, name, parent_id, description, creator, updater,
id, dept_id, name, parent_id, dept_path, description, creator, updater,
create_time, update_time, delete_time, deleted
</sql>
@@ -39,14 +40,54 @@
</where>
</sql>
<!-- selectDepts -->
<!-- 权限过滤条件基于dept_path的高效继承 -->
<sql id="Permission_Filter">
INNER JOIN tb_resource_permission rp ON d.dept_id = rp.resource_id
AND rp.resource_type = 4
AND rp.deleted = 0
AND rp.can_read = 1
AND (
-- 全局权限:所有用户可访问
(rp.dept_id IS NULL AND rp.role_id IS NULL)
<if test="userDeptRoles != null and userDeptRoles.size() > 0">
OR EXISTS (
SELECT 1
FROM (
<foreach collection="userDeptRoles" item="udr" separator=" UNION ALL ">
SELECT #{udr.deptID} AS dept_id, #{udr.deptPath} AS dept_path, #{udr.roleID} AS role_id
</foreach>
) user_roles
LEFT JOIN tb_sys_dept perm_dept ON perm_dept.dept_id = rp.dept_id AND perm_dept.deleted = 0
WHERE
-- 部门级权限当前部门或父部门通过dept_path判断继承关系
(rp.role_id IS NULL AND rp.dept_id IS NOT NULL
AND user_roles.dept_path LIKE CONCAT(perm_dept.dept_path, '%'))
-- 角色级权限:跨部门的角色权限
OR (rp.dept_id IS NULL AND rp.role_id = user_roles.role_id)
-- 精确权限:特定部门的特定角色
OR (rp.dept_id = user_roles.dept_id AND rp.role_id = user_roles.role_id)
)
</if>
)
</sql>
<!-- selectDepts - 添加权限过滤 -->
<select id="selectDepts">
SELECT
<include refid="Base_Column_List"/>
FROM tb_sys_dept
<include refid="Where_Clause"/>
ORDER BY dept_id,create_time DESC
SELECT DISTINCT d.*
FROM tb_sys_dept d
<include refid="Permission_Filter"/>
WHERE d.deleted = 0
<if test="filter.deptID != null and filter.deptID != ''">
AND d.dept_id = #{filter.deptID}
</if>
<if test="filter.parentID != null and filter.parentID != ''">
AND d.parent_id = #{filter.parentID}
</if>
<if test="filter.name != null and filter.name != ''">
AND d.name LIKE CONCAT('%', #{filter.name}, '%')
</if>
ORDER BY d.dept_id, d.create_time DESC
</select>
<!-- 根据父部门ID查询子部门列表 -->
@@ -95,64 +136,63 @@
create_time ASC
</select>
<!-- 批量删除部门(逻辑删除) -->
<update id="batchDeleteByIds">
UPDATE tb_sys_dept
SET deleted = 1,
delete_time = NOW(),
updater = #{updater}
WHERE deleted = 0
AND dept_id IN
<foreach collection="deptIds" item="deptId" open="(" separator="," close=")">
#{deptId}
</foreach>
</update>
<!-- 插入部门 -->
<insert id="insert" parameterType="org.xyzh.common.dto.dept.TbSysDept">
INSERT INTO tb_sys_dept
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="deptID != null">dept_id,</if>
<if test="parentID != null">parent_id,</if>
<if test="name != null">name,</if>
<if test="description != null">description,</if>
<if test="creator != null">creator,</if>
<if test="createTime != null">create_time,</if>
<!-- insertDept -->
<insert id="insertDept" parameterType="org.xyzh.common.dto.dept.TbSysDept">
INSERT INTO tb_sys_dept (
id,
dept_id,
name,
parent_id,
dept_path,
description,
creator,
create_time,
deleted
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="deptID != null">#{deptID},</if>
<if test="parentID != null">#{parentID},</if>
<if test="name != null">#{name},</if>
<if test="description != null">#{description},</if>
<if test="creator != null">#{creator},</if>
<if test="createTime != null">#{createTime},</if>
0
</trim>
) VALUES (
#{id},
#{deptID},
#{name},
#{parentID},
#{deptPath},
#{description},
#{creator},
#{createTime},
#{deleted}
)
</insert>
<!-- 更新部门 -->
<update id="updateById" parameterType="org.xyzh.common.dto.dept.TbSysDept">
<!-- updateDept -->
<update id="updateDept" parameterType="org.xyzh.common.dto.dept.TbSysDept">
UPDATE tb_sys_dept
<set>
<if test="deptID != null">dept_id = #{deptID},</if>
<if test="parentID != null">parent_id = #{parentID},</if>
<if test="name != null">name = #{name},</if>
<if test="description != null">description = #{description},</if>
<if test="updater != null">updater = #{updater},</if>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="parentID != null">
parent_id = #{parentID},
</if>
<if test="deptPath != null">
dept_path = #{deptPath},
</if>
<if test="description != null">
description = #{description},
</if>
<if test="updater != null">
updater = #{updater},
</if>
update_time = NOW()
</set>
WHERE dept_id = #{deptID} AND deleted = 0
</update>
<!-- 根据ID删除逻辑删除 -->
<update id="deleteById">
UPDATE tb_sys_dept
<!-- deleteDept - 逻辑删除 -->
<update id="deleteDept" parameterType="org.xyzh.common.dto.dept.TbSysDept">
UPDATE tb_sys_dept
SET deleted = 1,
delete_time = NOW()
<if test="updater != null">
, updater = #{updater}
</if>
WHERE dept_id = #{deptID} AND deleted = 0
</update>
</mapper>

View File

@@ -39,11 +39,29 @@
ORDER BY create_time DESC
</select>
<select id="selectDeptRoleList">
<!-- 部门角色VO结果映射 -->
<resultMap id="DeptRoleVOResultMap" type="org.xyzh.common.vo.UserDeptRoleVO">
<result column="dept_id" property="deptID" jdbcType="VARCHAR"/>
<result column="dept_name" property="deptName" jdbcType="VARCHAR"/>
<result column="dept_description" property="deptDescription" jdbcType="VARCHAR"/>
<result column="role_id" property="roleID" jdbcType="VARCHAR"/>
<result column="role_name" property="roleName" jdbcType="VARCHAR"/>
<result column="role_description" property="roleDescription" jdbcType="VARCHAR"/>
</resultMap>
<select id="selectDeptRoleList" resultMap="DeptRoleVOResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM tb_sys_dept_role
ORDER BY dept_id, role_id, create_time DESC
dr.dept_id,
d.name AS dept_name,
d.description AS dept_description,
dr.role_id,
r.name AS role_name,
r.description AS role_description
FROM tb_sys_dept_role dr
LEFT JOIN tb_sys_dept d ON dr.dept_id = d.dept_id AND d.deleted = 0
LEFT JOIN tb_sys_role r ON dr.role_id = r.role_id AND r.deleted = 0
WHERE dr.deleted = 0
ORDER BY dr.dept_id, dr.role_id, dr.create_time DESC
</select>
<!-- batchBindDeptRole -->
@@ -65,4 +83,81 @@
(#{deptRole.deptID}, #{deptRole.roleID})
</foreach>
</delete>
<!-- selectParentDeptAdmin -->
<select id="selectParentDeptAdmin">
WITH RECURSIVE dept_hierarchy AS (
-- 基础查询:查询起始部门
SELECT
dept_id,
parent_id,
name,
description,
1 AS level
FROM tb_sys_dept
WHERE dept_id = #{deptID}
AND deleted = 0
UNION ALL
-- 递归查询:查询父级部门
SELECT
d.dept_id,
d.parent_id,
d.name,
d.description,
dh.level + 1 AS level
FROM tb_sys_dept d
INNER JOIN dept_hierarchy dh ON d.dept_id = dh.parent_id
WHERE d.deleted = 0
AND d.parent_id IS NOT NULL
)
SELECT
dh.dept_id AS deptID,
tsdr.role_id
FROM dept_hierarchy dh
INNER JOIN tb_sys_dept_role tsdr ON dh.dept_id = tsdr.dept_id
WHERE tsdr.role_id = 'admin'
AND tsdr.deleted = 0
ORDER BY level DESC
</select>
<!-- selectChildDeptRole -->
<select id="selectChildDeptRole">
WITH RECURSIVE dept_hierarchy AS (
-- 基础查询:查询起始部门
SELECT
dept_id,
parent_id,
name,
description,
1 AS level
FROM tb_sys_dept
WHERE dept_id = #{deptID}
AND deleted = 0
UNION ALL
-- 递归查询:查询子级部门
SELECT
d.dept_id,
d.parent_id,
d.name,
d.description,
dh.level + 1 AS level
FROM tb_sys_dept d
INNER JOIN dept_hierarchy dh ON d.parent_id = dh.dept_id
WHERE d.deleted = 0
AND d.parent_id IS NOT NULL
)
SELECT
dh.dept_id AS deptID,
tsdr.role_id
FROM dept_hierarchy dh
INNER JOIN tb_sys_dept_role tsdr ON dh.dept_id = tsdr.dept_id
AND tsdr.deleted = 0
ORDER BY level DESC
</select>
</mapper>

View File

@@ -0,0 +1,80 @@
<?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="org.xyzh.system.mapper.ResourcePermissionMapper">
<!-- 基础结果映射 -->
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.permission.TbResourcePermission">
<id column="id" property="id" jdbcType="VARCHAR"/>
<result column="resource_type" property="resourceType" jdbcType="INTEGER"/>
<result column="resource_id" property="resourceID" jdbcType="VARCHAR"/>
<result column="dept_id" property="deptID" jdbcType="VARCHAR"/>
<result column="role_id" property="roleID" jdbcType="VARCHAR"/>
<result column="can_read" property="canRead" jdbcType="TINYINT"/>
<result column="can_write" property="canWrite" jdbcType="TINYINT"/>
<result column="can_execute" property="canExecute" jdbcType="TINYINT"/>
<result column="creator" property="creator" jdbcType="VARCHAR"/>
<result column="updater" property="updater" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
<result column="delete_time" property="deleteTime" jdbcType="TIMESTAMP"/>
<result column="deleted" property="deleted" jdbcType="TINYINT"/>
</resultMap>
<!-- 视图对象映射 -->
<resultMap id="ResourcePermissionVO" type="org.xyzh.common.vo.ResourcePermissionVO">
<id column="id" property="id" jdbcType="VARCHAR"/>
<result column="resource_type" property="resourceType" jdbcType="INTEGER"/>
<result column="resource_id" property="resourceID" jdbcType="VARCHAR"/>
<result column="dept_id" property="deptID" jdbcType="VARCHAR"/>
<result column="role_id" property="roleID" jdbcType="VARCHAR"/>
<result column="can_read" property="canRead" jdbcType="TINYINT"/>
<result column="can_write" property="canWrite" jdbcType="TINYINT"/>
<result column="can_execute" property="canExecute" jdbcType="TINYINT"/>
<result column="creator" property="creator" jdbcType="VARCHAR"/>
<result column="updater" property="updater" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
<result column="delete_time" property="deleteTime" jdbcType="TIMESTAMP"/>
<result column="deleted" property="deleted" jdbcType="TINYINT"/>
<result column="dept_name" property="deptName" jdbcType="VARCHAR"/>
<result column="role_name" property="roleName" jdbcType="VARCHAR"/>
<result column="resource_title" property="resourceTitle" jdbcType="VARCHAR"/>
</resultMap>
<!-- 基础字段 -->
<sql id="Base_Column_List">
id, resource_type, resource_id, dept_id, role_id,
can_read, can_write, can_execute,
creator, updater, create_time, update_time, delete_time, deleted
</sql>
<!-- 插入资源权限 -->
<insert id="insertResourcePermission" parameterType="org.xyzh.common.dto.permission.TbResourcePermission">
INSERT INTO tb_resource_permission (
id, resource_type, resource_id, dept_id, role_id,
can_read, can_write, can_execute,
creator, create_time, deleted
) VALUES (
#{id}, #{resourceType}, #{resourceID}, #{deptID}, #{roleID},
#{canRead}, #{canWrite}, #{canExecute},
#{creator}, #{createTime}, #{deleted}
)
</insert>
<!-- 批量插入资源权限 -->
<insert id="batchInsertResourcePermission" parameterType="java.util.List">
INSERT INTO tb_resource_permission (
id, resource_type, resource_id, dept_id, role_id,
can_read, can_write, can_execute,
creator, create_time, deleted
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.id}, #{item.resourceType}, #{item.resourceID}, #{item.deptID}, #{item.roleID},
#{item.canRead}, #{item.canWrite}, #{item.canExecute},
#{item.creator}, #{item.createTime}, #{item.deleted}
)
</foreach>
</insert>
</mapper>

View File

@@ -17,42 +17,22 @@
<result column="deleted" property="deleted" jdbcType="BOOLEAN"/>
</resultMap>
<resultMap id="deptRoleVOResultMap" type="org.xyzh.common.vo.DeptRoleVO">
<result column="dept_id" property="dept.deptID" jdbcType="VARCHAR"/>
<result column="dept_name" property="dept.name" jdbcType="VARCHAR"/>
<result column="dept_description" property="dept.description" jdbcType="VARCHAR"/>
<result column="dept_creator" property="dept.creator" jdbcType="VARCHAR"/>
<result column="dept_updater" property="dept.updater" jdbcType="VARCHAR"/>
<result column="dept_create_time" property="dept.createTime" jdbcType="TIMESTAMP"/>
<result column="dept_update_time" property="dept.updateTime" jdbcType="TIMESTAMP"/>
<result column="dept_delete_time" property="dept.deleteTime" jdbcType="TIMESTAMP"/>
<result column="dept_deleted" property="dept.deleted" jdbcType="BOOLEAN"/>
<result column="role_id" property="role.roleID" jdbcType="VARCHAR"/>
<result column="role_name" property="role.name" jdbcType="VARCHAR"/>
<result column="role_description" property="role.description" jdbcType="VARCHAR"/>
<result column="role_creator" property="role.creator" jdbcType="VARCHAR"/>
<result column="role_updater" property="role.updater" jdbcType="VARCHAR"/>
<result column="role_create_time" property="role.createTime" jdbcType="TIMESTAMP"/>
<result column="role_update_time" property="role.updateTime" jdbcType="TIMESTAMP"/>
<result column="role_delete_time" property="role.deleteTime" jdbcType="TIMESTAMP"/>
<result column="role_deleted" property="role.deleted" jdbcType="BOOLEAN"/>
<resultMap id="deptRoleVOResultMap" type="org.xyzh.common.vo.UserDeptRoleVO">
<result column="user_id" property="userID" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
<result column="dept_id" property="deptID" jdbcType="VARCHAR"/>
<result column="dept_name" property="deptName" jdbcType="VARCHAR"/>
<result column="dept_description" property="deptDescription" jdbcType="VARCHAR"/>
<result column="dept_path" property="deptPath" jdbcType="VARCHAR"/>
<result column="role_id" property="roleID" jdbcType="VARCHAR"/>
<result column="role_name" property="roleName" jdbcType="VARCHAR"/>
<result column="role_description" property="roleDescription" jdbcType="VARCHAR"/>
</resultMap>
<!-- 基础字段 -->
<sql id="TbSysRole_Column_List">
id, role_id, name, description, creator, updater,
create_time, update_time, delete_time, deleted
</sql>
<sql id="TbSysDeptRole_Column_List">
dr.id, dr.dept_id, dr.role_id,
r.name as role_name, d.name as dept_name,
r.description as role_description, d.description as dept_description,
r.creator as role_creator, d.creator as dept_creator,
r.updater as role_updater, d.updater as dept_updater,
r.create_time as role_create_time, d.create_time as dept_create_time,
r.update_time as role_update_time, d.update_time as dept_update_time,
r.delete_time as role_delete_time, d.delete_time as dept_delete_time,
r.deleted as role_deleted, d.deleted as dept_deleted
</sql>
<!-- 通用条件 -->
<sql id="Where_Clause">
@@ -110,10 +90,19 @@
<!-- 根据用户ID查询角色列表 -->
<select id="selectDeptRolesByUserId" resultMap="deptRoleVOResultMap">
SELECT
<include refid="TbSysDeptRole_Column_List"/>
dr.user_id,
u.username,
dr.dept_id,
d.name AS dept_name,
d.description AS dept_description,
d.dept_path,
dr.role_id,
r.name AS role_name,
r.description AS role_description
FROM tb_sys_user_dept_role dr
INNER JOIN tb_sys_role r ON r.role_id = dr.role_id
INNER JOIN tb_sys_dept d ON d.dept_id = dr.dept_id
LEFT JOIN tb_sys_user u ON dr.user_id = u.id AND u.deleted = 0
LEFT JOIN tb_sys_role r ON dr.role_id = r.role_id AND r.deleted = 0
LEFT JOIN tb_sys_dept d ON dr.dept_id = d.dept_id AND d.deleted = 0
WHERE dr.deleted = 0
AND dr.user_id = #{userId}
ORDER BY dr.create_time ASC

View File

@@ -44,14 +44,47 @@
</where>
</sql>
<!-- 用户部门角色VO结果映射 -->
<resultMap id="UserDeptRoleVOResultMap" type="org.xyzh.common.vo.UserDeptRoleVO">
<result column="user_id" property="userID" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
<result column="dept_id" property="deptID" jdbcType="VARCHAR"/>
<result column="dept_name" property="deptName" jdbcType="VARCHAR"/>
<result column="dept_description" property="deptDescription" jdbcType="VARCHAR"/>
<result column="role_id" property="roleID" jdbcType="VARCHAR"/>
<result column="role_name" property="roleName" jdbcType="VARCHAR"/>
<result column="role_description" property="roleDescription" jdbcType="VARCHAR"/>
</resultMap>
<!-- selectByFilter -->
<select id="selectByFilter">
<select id="selectByFilter" resultMap="UserDeptRoleVOResultMap">
SELECT
<include refid="UserDeptRole_Column_List"/>
FROM tb_sys_user_dept_role
<include refid="Where_Clause"/>
ORDER BY user_id, dept_id, role_id, create_time DESC
udr.user_id,
u.username AS username,
udr.dept_id,
d.name AS dept_name,
d.description AS dept_description,
udr.role_id,
r.name AS role_name,
r.description AS role_description
FROM tb_sys_user_dept_role udr
LEFT JOIN tb_sys_user u ON udr.user_id = u.id AND u.deleted = 0
LEFT JOIN tb_sys_dept d ON udr.dept_id = d.dept_id AND d.deleted = 0
LEFT JOIN tb_sys_role r ON udr.role_id = r.role_id AND r.deleted = 0
<where>
udr.deleted = 0
<if test="userID != null">
AND udr.user_id = #{userID}
</if>
<if test="deptID != null">
AND udr.dept_id = #{deptID}
</if>
<if test="roleID != null">
AND udr.role_id = #{roleID}
</if>
</where>
ORDER BY udr.user_id, udr.dept_id, udr.role_id, udr.create_time DESC
</select>
<insert id="bindUser" parameterType="TbSysUserDeptRole">
@@ -70,4 +103,20 @@
</foreach>
</delete>
<!-- deleteUserDeptRole - 物理删除所有记录(包括软删除的) -->
<delete id="deleteUserDeptRole">
DELETE FROM tb_sys_user_dept_role
WHERE user_id = #{userID}
</delete>
<!-- deleteUserDeptRoleByUserIds - 批量删除多个用户的绑定 -->
<delete id="deleteUserDeptRoleByUserIds">
DELETE FROM tb_sys_user_dept_role
WHERE user_id IN
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
</delete>
</mapper>

View File

@@ -242,12 +242,10 @@
</update>
<!-- 根据ID删除逻辑删除 -->
<update id="deleteUser">
UPDATE tb_sys_user
SET deleted = 1,
delete_time = NOW()
WHERE id = #{id} AND deleted = 0
</update>
<delete id="deleteUser">
DELETE FROM tb_sys_user
WHERE id = #{userID} AND deleted = 0
</delete>
<!-- 用户信息相关 -->
@@ -293,10 +291,7 @@
INNER JOIN tb_sys_user_dept_role tsudr ON tsui.user_id = tsudr.user_id
INNER JOIN tb_sys_dept tsd ON tsudr.dept_id = tsd.dept_id
WHERE tsui.user_id = #{userId} AND tsui.deleted = 0
UNION ALL
-- 递归查询:向上查找父部门
SELECT
p.dept_id,
p.name,
@@ -304,12 +299,12 @@
CONCAT(p.name, '/', dh.dept_path) as dept_path,
dh.level + 1 as level
FROM tb_sys_dept p
INNER JOIN dept_hierarchy dh ON p.dept_id = dh.parent_id
INNER JOIN dept_hierarchy dh ON dh.parent_id = p.dept_id
WHERE p.deleted = 0
)
SELECT dh.dept_path
FROM dept_hierarchy dh
WHERE dh.parent_id IS NULL -- 只取最顶层的部门路径
WHERE dh.parent_id IS NULL
LIMIT 1
</select>
@@ -317,7 +312,6 @@
<select id="selectUserInfoTotal" resultMap="UserInfoTotalResultMap">
WITH RECURSIVE dept_hierarchy AS (
-- 基础查询:获取用户直接所属的部门
SELECT
tsd.dept_id,
tsd.name,
@@ -328,10 +322,7 @@
INNER JOIN tb_sys_user_dept_role tsudr ON tsui.user_id = tsudr.user_id
INNER JOIN tb_sys_dept tsd ON tsudr.dept_id = tsd.dept_id
WHERE tsui.user_id = #{userId} AND tsui.deleted = 0
UNION ALL
-- 递归查询:向上查找父部门
SELECT
p.dept_id,
p.name,
@@ -339,7 +330,7 @@
CONCAT(p.name, '/', dh.dept_path) as dept_path,
dh.level + 1 as level
FROM tb_sys_dept p
INNER JOIN dept_hierarchy dh ON p.dept_id = dh.parent_id
INNER JOIN dept_hierarchy dh ON dh.parent_id = p.dept_id
WHERE p.deleted = 0
)
SELECT
@@ -349,7 +340,7 @@
tus.email,
tsui.avatar,
tsui.gender,
dh.dept_path as dept_name,
(SELECT dept_path FROM dept_hierarchy WHERE parent_id IS NULL LIMIT 1) as dept_name,
tsr.name as role_name,
tsui.level,
tsui.id_card,
@@ -357,10 +348,8 @@
FROM tb_sys_user_info tsui
INNER JOIN tb_sys_user tus ON tsui.user_id = tus.id
INNER JOIN tb_sys_user_dept_role tsudr ON tsui.user_id = tsudr.user_id
INNER JOIN dept_hierarchy dh ON tsudr.dept_id = dh.dept_id
INNER JOIN tb_sys_role tsr ON tsudr.role_id = tsr.role_id
INNER JOIN tb_sys_role tsr ON tsudr.role_id = tsr.role_id
WHERE tsui.user_id = #{userId}
AND tsui.deleted = 0
AND dh.parent_id IS NULL -- 只取最顶层的部门路径
</select>
</mapper>