Explorar el Código

fix:多表关联的分页案例

wangzaijun hace 7 meses
padre
commit
2448b5c06d

+ 16 - 0
service-base/src/main/java/com/simuwang/base/common/support/BaseMultiJoinService.java

@@ -0,0 +1,16 @@
+package com.simuwang.base.common.support;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/13 16:02
+ * @description 多表关联时的接口对象
+ */
+public interface BaseMultiJoinService<VO extends BaseVO> {
+    /**
+     * 多表关联的分页方法
+     *
+     * @param query 查询条件
+     * @return 分页对象
+     */
+    <Q extends PageQuery> MybatisPage<VO> findMultiPage(Q query);
+}

+ 10 - 0
service-base/src/main/java/com/simuwang/base/common/support/BaseMultiJoinVO.java

@@ -0,0 +1,10 @@
+package com.simuwang.base.common.support;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/13 13:55
+ * @description 多表关联的返回对象抽象
+ */
+public abstract class BaseMultiJoinVO extends BaseVO {
+
+}

+ 29 - 24
service-base/src/main/java/com/simuwang/base/common/support/BaseService.java

@@ -30,27 +30,7 @@ public interface BaseService<VO extends BaseVO, T extends BaseEntity<VO>> {
         return newColumns;
     }
 
-    /**
-     * 分页方法
-     *
-     * @param query 分页查询对象
-     * @return /
-     */
-    default <Q extends PageQuery> MybatisPage<VO> findPage(Q query) {
-        Page<T> page = new Page<>(query.getCurrent(), query.getPageSize());
-        page.setOrders(query.getOrderItems());
-        QueryWrapper<T> wrapper = Wrappers.<T>query().select(this.selectColumns());
-        this.wrapQuery(wrapper, query);
-        if (StrUtil.isAllNotBlank(query.getBeginTime(), query.getEndTime())) {
-            wrapper.between("createtime", query.getBeginTime(), query.getEndTime());
-        }
-        if (query.getOrderItems() != null) {
-            query.getOrderItems().forEach(e -> wrapper.orderBy(true, e.isAsc(), e.getColumn()));
-        } else {
-            wrapper.orderByDesc("createtime");
-        }
-        return this.convertPage(page, wrapper);
-    }
+    // ------------------------ 提供的可重现的查询扩展函数 start  ------------------------------------------
 
     /**
      * 获取查询列,默认只获取 {@see DEFAULT_SELECT_COLUMNS} 列字段
@@ -68,7 +48,7 @@ public interface BaseService<VO extends BaseVO, T extends BaseEntity<VO>> {
      * @param query   待处理条件
      */
     default <Q extends PageQuery> void wrapQuery(QueryWrapper<T> wrapper, Q query) {
-        throw new APIException("not impl.");
+
     }
 
     /**
@@ -80,13 +60,38 @@ public interface BaseService<VO extends BaseVO, T extends BaseEntity<VO>> {
      */
     MybatisPage<VO> convertPage(Page<T> page, QueryWrapper<T> wrapper);
 
+    // ------------------------ 提供的可重现的查询扩展函数 end  ------------------------------------------
+
+
+    /**
+     * 分页方法,仅支持单表分页
+     *
+     * @param query 分页查询对象
+     * @return /
+     */
+    default <Q extends PageQuery> MybatisPage<VO> findPage(Q query) {
+        Page<T> page = new Page<>(query.getCurrent(), query.getPageSize());
+        page.setOrders(query.getOrderItems());
+        QueryWrapper<T> wrapper = Wrappers.<T>query().select(this.selectColumns());
+        this.wrapQuery(wrapper, query);
+        if (StrUtil.isAllNotBlank(query.getBeginTime(), query.getEndTime())) {
+            wrapper.between("createtime", query.getBeginTime(), query.getEndTime());
+        }
+        if (query.getOrderItems() != null) {
+            query.getOrderItems().forEach(e -> wrapper.orderBy(true, e.isAsc(), e.getColumn()));
+        } else {
+            wrapper.orderByDesc("createtime");
+        }
+        return this.convertPage(page, wrapper);
+    }
+
     /**
      * 根据id更新状态
      *
      * @param command /
      */
     default <BSC extends BaseIdStatusCmd> void updateStatus(BSC command) {
-        throw new APIException("not impl.");
+        throw new APIException("方法updateStatus未实现");
     }
 
     /**
@@ -95,6 +100,6 @@ public interface BaseService<VO extends BaseVO, T extends BaseEntity<VO>> {
      * @param command /
      */
     default <BIC extends BaseIdCmd> void delete(BIC command) {
-        throw new APIException("not impl.");
+        throw new APIException("方法delete未实现");
     }
 }

+ 8 - 0
service-base/src/main/java/com/simuwang/base/common/support/PageQuery.java

@@ -19,6 +19,10 @@ public class PageQuery extends BaseQuery {
      */
     private Long pageSize;
     /**
+     * 当前页记录开始
+     */
+    private Long offset;
+    /**
      * 排序字段
      */
     private List<OrderItem> orderItems;
@@ -51,4 +55,8 @@ public class PageQuery extends BaseQuery {
     public void setOrderItems(List<OrderItem> orderItems) {
         this.orderItems = orderItems;
     }
+
+    public Long getOffset() {
+        return (current - 1) * pageSize;
+    }
 }

+ 18 - 0
service-base/src/main/java/com/simuwang/base/mapper/SysUserMapper.java

@@ -3,7 +3,9 @@ package com.simuwang.base.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.simuwang.base.pojo.dos.SysMenuDO;
 import com.simuwang.base.pojo.dos.SysRoleDO;
+import com.simuwang.base.pojo.dos.SysRoleUserDO;
 import com.simuwang.base.pojo.dos.SysUserDO;
+import com.simuwang.base.pojo.dto.query.RoleUserPageQuery;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -39,4 +41,20 @@ public interface SysUserMapper extends BaseMapper<SysUserDO> {
      * @return /
      */
     List<SysMenuDO> selectAllMenu();
+
+    /**
+     * 角色用户关联的分页
+     *
+     * @param query 分页参数
+     * @return /
+     */
+    List<SysRoleUserDO> roleUserPage(RoleUserPageQuery query);
+
+    /**
+     * 角色用户关联的总数
+     *
+     * @param query 查询参数
+     * @return /
+     */
+    long countRoleUser(RoleUserPageQuery query);
 }

+ 5 - 3
service-base/src/main/java/com/simuwang/base/pojo/dos/SysRoleDO.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.simuwang.base.common.support.BaseEntity;
+import com.simuwang.base.common.support.BaseVO;
 import com.simuwang.base.pojo.vo.SysRoleVO;
 import lombok.Getter;
 import lombok.Setter;
@@ -17,7 +18,7 @@ import lombok.Setter;
 @Setter
 @Getter
 @TableName("sys_role")
-public class SysRoleDO extends BaseEntity<SysRoleVO> {
+public class SysRoleDO<VO extends BaseVO> extends BaseEntity<VO> {
     /**
      * 角色ID
      */
@@ -59,7 +60,8 @@ public class SysRoleDO extends BaseEntity<SysRoleVO> {
     private String remark;
 
     @Override
-    public SysRoleVO toVo() {
+    @SuppressWarnings("unchecked")
+    public VO toVo() {
         SysRoleVO vo = new SysRoleVO();
         vo.setRoleId(this.roleId);
         vo.setRoleName(this.roleName);
@@ -69,6 +71,6 @@ public class SysRoleDO extends BaseEntity<SysRoleVO> {
         vo.setStatus(this.status);
         vo.setCreatorId(this.getCreatorId());
         vo.setCreateTime(this.getCreateTime());
-        return vo;
+        return (VO) vo;
     }
 }

+ 41 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/SysRoleUserDO.java

@@ -0,0 +1,41 @@
+package com.simuwang.base.pojo.dos;
+
+import com.simuwang.base.pojo.vo.SysRoleUserVO;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class SysRoleUserDO extends SysRoleDO<SysRoleUserVO> {
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 用户名称
+     */
+    private String userName;
+    /**
+     * 用户邮箱
+     */
+    private String email;
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private Integer userStatus;
+
+    @Override
+    public SysRoleUserVO toVo() {
+        SysRoleUserVO roleUserVO = super.toVo();
+        roleUserVO.setUserId(this.userId);
+        roleUserVO.setUserName(this.userName);
+        roleUserVO.setEmail(this.email);
+        roleUserVO.setPhonenumber(this.phonenumber);
+        roleUserVO.setUserStatus(this.userStatus);
+        return roleUserVO;
+    }
+}

+ 12 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/query/RoleUserPageQuery.java

@@ -0,0 +1,12 @@
+package com.simuwang.base.pojo.dto.query;
+
+import com.simuwang.base.common.support.PageQuery;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/13 13:38
+ * @description 角色用户关联的分页接口请求参数
+ */
+public class RoleUserPageQuery extends PageQuery {
+
+}

+ 34 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/SysRoleUserVO.java

@@ -0,0 +1,34 @@
+package com.simuwang.base.pojo.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/13 15:57
+ * @description 角色用户数据分页结果
+ */
+@Setter
+@Getter
+public class SysRoleUserVO extends SysRoleVO {
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 用户名称
+     */
+    private String userName;
+    /**
+     * 用户邮箱
+     */
+    private String email;
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private Integer userStatus;
+}

+ 74 - 0
service-base/src/main/resources/mapper/SysUserMapper.xml

@@ -92,4 +92,78 @@
         where sm.isvalid = 1
         order by sm.menu_id
     </select>
+
+    <select id="roleUserPage" resultType="com.simuwang.base.pojo.dos.SysRoleUserDO"
+            parameterType="com.simuwang.base.pojo.dto.query.RoleUserPageQuery">
+        select t.role_id    as roleId,
+               t.role_name  as roleName,
+               t.role_key   as roleKey,
+               t.role_sort  as roleSort,
+               t.status     as status,
+               t.data_scope as dataScope,
+               t.remark,
+               t.creatorid  as creatorId,
+               t.createtime as createTime,
+               t.updaterid  as updaterId,
+               t.updatetime as updateTime,
+               t2.user_id   as userId,
+               t2.user_name as userName,
+               t2.email,
+               t2.phonenumber,
+               t2.status    as userStatus
+        from sys_role t
+                 join sys_user_role t1 on t.role_id = t1.role_id
+                 join sys_user t2 on t1.user_id = t2.user_id and t2.isvalid = 1
+        where t.isvalid = 1
+        <if test="keyword != null and keyword != ''">
+            and (
+                t.role_name like concat('%', #{keyword}, '%')
+                or
+                t.role_key like concat('%', #{keyword}, '%')
+                or
+                t2.user_name like concat('%', #{keyword}, '%')
+                or
+                t2.email like concat('%', #{keyword}, '%')
+                or
+                t2.phonenumber like concat('%', #{keyword}, '%')
+            )
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            and t.createtime between #{beginTime} and #{endTime}
+        </if>
+        <choose>
+            <when test="orderItems != null and !orderItems.isEmpty()">
+                order by
+                <foreach collection="orderItems" item="item" separator=",">
+                    ${item.column} ${item.asc}
+                </foreach>
+            </when>
+            <otherwise>order by t.createtime</otherwise>
+        </choose>
+        limit #{offset}, #{pageSize}
+    </select>
+
+    <select id="countRoleUser" parameterType="com.simuwang.base.pojo.dto.query.RoleUserPageQuery">
+        select count(t.role_id)
+        from sys_role t
+                 join sys_user_role t1 on t.role_id = t1.role_id
+                 join sys_user t2 on t1.user_id = t2.user_id and t2.isvalid = 1
+        where t.isvalid = 1
+        <if test="keyword != null and keyword != ''">
+            and (
+            t.role_name like concat('%', #{keyword}, '%')
+            or
+            t.role_key like concat('%', #{keyword}, '%')
+            or
+            t2.user_name like concat('%', #{keyword}, '%')
+            or
+            t2.email like concat('%', #{keyword}, '%')
+            or
+            t2.phonenumber like concat('%', #{keyword}, '%')
+            )
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            and t.createtime between #{beginTime} and #{endTime}
+        </if>
+    </select>
 </mapper>

+ 12 - 0
service-manage/src/main/java/com/simuwang/manage/api/system/SysUserController.java

@@ -5,6 +5,7 @@ import com.simuwang.base.pojo.dto.command.DeleteByIdCmd;
 import com.simuwang.base.pojo.dto.command.UpdateStatusCmd;
 import com.simuwang.base.pojo.dto.query.UserPageQuery;
 import com.simuwang.base.pojo.vo.SysUserVO;
+import com.simuwang.base.pojo.vo.SysRoleUserVO;
 import com.simuwang.manage.service.system.SysUserService;
 import org.springframework.web.bind.annotation.*;
 
@@ -34,6 +35,17 @@ public class SysUserController {
     }
 
     /**
+     * 分页接口
+     *
+     * @param query 用户列表分页请求参数
+     * @return /
+     */
+    @GetMapping("multi-join-page")
+    public MybatisPage<SysRoleUserVO> multiJoinPage(UserPageQuery query) {
+        return this.service.findMultiPage(query);
+    }
+
+    /**
      * 更新用户状态接口
      *
      * @param command 用户id+状态对象

+ 15 - 0
service-manage/src/main/java/com/simuwang/manage/service/impl/system/SysUserServiceImpl.java

@@ -6,12 +6,18 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.simuwang.base.common.support.*;
 import com.simuwang.base.mapper.SysUserMapper;
+import com.simuwang.base.pojo.dos.SysRoleUserDO;
 import com.simuwang.base.pojo.dos.SysUserDO;
+import com.simuwang.base.pojo.dto.query.RoleUserPageQuery;
 import com.simuwang.base.pojo.dto.query.UserPageQuery;
+import com.simuwang.base.pojo.vo.SysRoleUserVO;
 import com.simuwang.base.pojo.vo.SysUserVO;
 import com.simuwang.manage.service.system.SysUserService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 @Service
 public class SysUserServiceImpl implements SysUserService {
     private final SysUserMapper mapper;
@@ -46,6 +52,15 @@ public class SysUserServiceImpl implements SysUserService {
     }
 
     @Override
+    public <Q extends PageQuery> MybatisPage<SysRoleUserVO> findMultiPage(Q query) {
+        RoleUserPageQuery params = (RoleUserPageQuery) query;
+        List<SysRoleUserDO> dataList = this.mapper.roleUserPage(params);
+        List<SysRoleUserVO> records = dataList.stream().map(SysRoleUserDO::toVo).collect(Collectors.toList());
+        long count = this.mapper.countRoleUser(params);
+        return MybatisPage.of(count, records);
+    }
+
+    @Override
     public <BSC extends BaseIdStatusCmd> void updateStatus(BSC command) {
         SysUserDO user = new SysUserDO();
         user.setUserId(command.getId());

+ 3 - 1
service-manage/src/main/java/com/simuwang/manage/service/system/SysUserService.java

@@ -1,13 +1,15 @@
 package com.simuwang.manage.service.system;
 
+import com.simuwang.base.common.support.BaseMultiJoinService;
 import com.simuwang.base.common.support.BaseService;
 import com.simuwang.base.pojo.dos.SysUserDO;
 import com.simuwang.base.pojo.vo.SysUserVO;
+import com.simuwang.base.pojo.vo.SysRoleUserVO;
 
 /**
  * @author wangzaijun
  * @date 2024/9/13 14:14
  * @description 用户服务
  */
-public interface SysUserService extends BaseService<SysUserVO, SysUserDO> {
+public interface SysUserService extends BaseService<SysUserVO, SysUserDO>, BaseMultiJoinService<SysRoleUserVO> {
 }