[重大更新] 集成 mybatis-plus-join 重构项目代码(实验性功能不稳定)

This commit is contained in:
疯狂的狮子Li
2026-03-19 12:42:06 +08:00
parent e8fc7fb0df
commit 24743c779f
23 changed files with 439 additions and 392 deletions

View File

@@ -4,11 +4,19 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysUserExportVo;
import org.dromara.system.domain.vo.SysUserVo;
@@ -60,7 +68,24 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
@DataColumn(key = "deptName", value = "d.dept_id"),
@DataColumn(key = "userName", value = "u.create_by")
})
List<SysUserExportVo> selectUserExportList(@Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
default List<SysUserExportVo> selectUserExportList(SysUserBo user, List<Long> deptIds) {
MPJLambdaWrapper<SysUser> wrapper = JoinWrappers.lambda("u", SysUser.class)
.selectAll(SysUser.class)
.selectAs(SysDept::getDeptName, SysUserExportVo::getDeptName)
.selectAs("u1", SysUser::getUserName, SysUserExportVo::getLeaderName)
.leftJoin(SysDept.class, "d", SysDept::getDeptId, SysUser::getDeptId)
.leftJoin(SysUser.class, "u1", SysUser::getUserId, SysDept::getLeader)
.eq("u", SysUser::getDelFlag, SystemConstants.NORMAL)
.like(StringUtils.isNotBlank(user.getUserName()), "u", SysUser::getUserName, user.getUserName())
.like(StringUtils.isNotBlank(user.getNickName()), "u", SysUser::getNickName, user.getNickName())
.eq(StringUtils.isNotBlank(user.getStatus()), "u", SysUser::getStatus, user.getStatus())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u", SysUser::getPhonenumber, user.getPhonenumber())
.between(user.getParams().get("beginTime") != null && user.getParams().get("endTime") != null,
"u", SysUser::getCreateTime, user.getParams().get("beginTime"), user.getParams().get("endTime"))
.in(deptIds != null && !deptIds.isEmpty(), "u", SysUser::getDeptId, deptIds)
.orderByAsc("u", SysUser::getUserId);
return this.selectJoinList(SysUserExportVo.class, wrapper);
}
/**
* 根据条件分页查询已配用户角色列表
@@ -73,7 +98,12 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
@DataColumn(key = "deptName", value = "d.dept_id"),
@DataColumn(key = "userName", value = "u.create_by")
})
Page<SysUserVo> selectAllocatedList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
default Page<SysUserVo> selectAllocatedList(Page<SysUserVo> page, SysUserBo user) {
MPJLambdaWrapper<SysUser> wrapper = this.buildUserRoleJoinWrapper(user)
.eq(user.getRoleId() != null, "r", SysRole::getRoleId, user.getRoleId())
.orderByAsc("u", SysUser::getUserId);
return this.selectJoinPage(page, SysUserVo.class, wrapper);
}
/**
* 根据条件分页查询未分配用户角色列表
@@ -85,7 +115,12 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
@DataColumn(key = "deptName", value = "d.dept_id"),
@DataColumn(key = "userName", value = "u.create_by")
})
Page<SysUserVo> selectUnallocatedList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
default Page<SysUserVo> selectUnallocatedList(Page<SysUserVo> page, SysUserBo user, List<Long> userIds) {
MPJLambdaWrapper<SysUser> wrapper = this.buildUserRoleJoinWrapper(user)
.notIn(userIds != null && !userIds.isEmpty(), "u", SysUser::getUserId, userIds)
.orderByAsc("u", SysUser::getUserId);
return this.selectJoinPage(page, SysUserVo.class, wrapper);
}
/**
* 根据用户ID统计用户数量
@@ -128,4 +163,17 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
})
int updateById(@Param(Constants.ENTITY) SysUser user);
private MPJLambdaWrapper<SysUser> buildUserRoleJoinWrapper(SysUserBo user) {
return JoinWrappers.lambda("u", SysUser.class)
.distinct()
.selectAll(SysUser.class)
.leftJoin(SysDept.class, "d", SysDept::getDeptId, SysUser::getDeptId)
.leftJoin(SysUserRole.class, "sur", SysUserRole::getUserId, SysUser::getUserId)
.leftJoin(SysRole.class, "r", SysRole::getRoleId, SysUserRole::getRoleId)
.eq("u", SysUser::getDelFlag, SystemConstants.NORMAL)
.like(StringUtils.isNotBlank(user.getUserName()), "u", SysUser::getUserName, user.getUserName())
.eq(StringUtils.isNotBlank(user.getStatus()), "u", SysUser::getStatus, user.getStatus())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u", SysUser::getPhonenumber, user.getPhonenumber());
}
}

View File

@@ -33,8 +33,8 @@ public interface ISysPermissionService {
* 根据角色列表构建数据权限角色映射
*
* @param roles 角色列表
* @return key 为权限码 value 为命中的角色列表
* @return key 为权限码 value 为命中的角色ID列表
*/
Map<String, List<RoleDTO>> getDataScopeRoleMap(List<RoleDTO> roles);
Map<String, List<Long>> getDataScopeRoleMap(List<RoleDTO> roles);
}

View File

@@ -62,16 +62,15 @@ public class SysPermissionServiceImpl implements ISysPermissionService {
}
@Override
public Map<String, List<RoleDTO>> getDataScopeRoleMap(List<RoleDTO> roles) {
public Map<String, List<Long>> getDataScopeRoleMap(List<RoleDTO> roles) {
if (CollUtil.isEmpty(roles)) {
return Map.of();
}
Map<Long, RoleDTO> roleMap = StreamUtils.toIdentityMap(roles, RoleDTO::getRoleId);
List<Long> roleIds = StreamUtils.toList(roles, RoleDTO::getRoleId);
Map<Long, Set<String>> permsRoleIds = menuService.selectMenuPermsByRoleIds(roleIds);
Map<String, List<RoleDTO>> rolePermsMap = new LinkedHashMap<>();
Map<String, List<Long>> rolePermsMap = new LinkedHashMap<>();
permsRoleIds.forEach((roleId, perms) -> {
perms.forEach(perm -> rolePermsMap.computeIfAbsent(perm, k -> new ArrayList<>()).add(roleMap.get(roleId)));
perms.forEach(perm -> rolePermsMap.computeIfAbsent(perm, key -> new ArrayList<>()).add(roleId));
});
return rolePermsMap;
}

View File

@@ -6,7 +6,6 @@ import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -70,20 +69,8 @@ public class SysUserServiceImpl implements ISysUserService {
*/
@Override
public List<SysUserExportVo> selectUserExportList(SysUserBo user) {
Map<String, Object> params = user.getParams();
QueryWrapper<SysUser> wrapper = Wrappers.query();
wrapper.eq("u.del_flag", SystemConstants.NORMAL)
.like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
.like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName())
.eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
.between(params.get("beginTime") != null && params.get("endTime") != null,
"u.create_time", params.get("beginTime"), params.get("endTime"))
.and(ObjectUtil.isNotNull(user.getDeptId()), w -> {
List<Long> deptIds = deptMapper.selectDeptAndChildById(user.getDeptId());
w.in("u.dept_id", deptIds);
}).orderByAsc("u.user_id");
return baseMapper.selectUserExportList(wrapper);
List<Long> deptIds = ObjectUtil.isNotNull(user.getDeptId()) ? deptMapper.selectDeptAndChildById(user.getDeptId()) : null;
return baseMapper.selectUserExportList(user, deptIds);
}
private Wrapper<SysUser> buildQueryWrapper(SysUserBo user) {
@@ -116,14 +103,7 @@ public class SysUserServiceImpl implements ISysUserService {
*/
@Override
public TableDataInfo<SysUserVo> selectAllocatedList(SysUserBo user, PageQuery pageQuery) {
QueryWrapper<SysUser> wrapper = Wrappers.query();
wrapper.eq("u.del_flag", SystemConstants.NORMAL)
.eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId())
.like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
.eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
.orderByAsc("u.user_id");
Page<SysUserVo> page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper);
Page<SysUserVo> page = baseMapper.selectAllocatedList(pageQuery.build(), user);
return TableDataInfo.build(page);
}
@@ -136,14 +116,7 @@ public class SysUserServiceImpl implements ISysUserService {
@Override
public TableDataInfo<SysUserVo> selectUnallocatedList(SysUserBo user, PageQuery pageQuery) {
List<Long> userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId());
QueryWrapper<SysUser> wrapper = Wrappers.query();
wrapper.eq("u.del_flag", SystemConstants.NORMAL)
.and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id"))
.notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds)
.like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
.orderByAsc("u.user_id");
Page<SysUserVo> page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper);
Page<SysUserVo> page = baseMapper.selectUnallocatedList(pageQuery.build(), user, userIds);
return TableDataInfo.build(page);
}

View File

@@ -4,39 +4,4 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.SysUserMapper">
<resultMap type="org.dromara.system.domain.vo.SysUserVo" id="SysUserResult">
<id property="userId" column="user_id"/>
</resultMap>
<resultMap type="org.dromara.system.domain.vo.SysUserExportVo" id="SysUserExportResult">
<id property="userId" column="user_id"/>
</resultMap>
<select id="selectUserExportList" resultMap="SysUserExportResult">
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
d.dept_name, d.leader, u1.user_name as leaderName
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user u1 on u1.user_id = d.leader
${ew.getCustomSqlSegment}
</select>
<select id="selectAllocatedList" resultMap="SysUserResult">
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user_role sur on u.user_id = sur.user_id
left join sys_role r on r.role_id = sur.role_id
${ew.getCustomSqlSegment}
</select>
<select id="selectUnallocatedList" resultMap="SysUserResult">
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user_role sur on u.user_id = sur.user_id
left join sys_role r on r.role_id = sur.role_id
${ew.getCustomSqlSegment}
</select>
</mapper>