From ef48923422398906d22130142dad8b3b02fbc7f1 Mon Sep 17 00:00:00 2001 From: lbw <1192299468@qq.com> Date: Sun, 14 Dec 2025 18:35:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(class):=20=E5=AE=9E=E7=8E=B0=E7=8F=AD?= =?UTF-8?q?=E7=BA=A7=E5=88=97=E8=A1=A8=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增班级后端分页接口及相关服务实现 - 实现班级与年级关联数据查询及映射 - 新增分页请求和响应VO类支持前后端数据传输 - 修改前端class.vue,增加班级列表分页展示组件 - 增加前端分页逻辑及状态管理,支持切换页码和页面大小 - 创建GradeClassDO实体及对应Mapper实现关联查询 - 优化数据库Mapper XML,增加分页查询及计数SQL语句 - 调整MyBatis配置生成grade_class表实体类和Mapper接口 --- .../service/controller/ClassController.java | 44 +++++++++++ .../domain/dataobject/GradeClassDO.java | 21 ++++++ .../service/domain/mapper/ClassDOMapper.java | 7 ++ .../domain/mapper/GradeClassDOMapper.java | 10 +++ .../service/domain/mapper/GradeDOMapper.java | 5 ++ .../model/vo/classs/FindClassReqVO.java | 16 ++++ .../model/vo/classs/FindClassRspVO.java | 18 +++++ .../enlish/service/service/ClassService.java | 10 +++ .../service/classs/ClassServiceImpl.java | 54 ++++++++++++++ .../src/main/resources/generatorConfig.xml | 2 +- .../main/resources/mapper/ClassDOMapper.xml | 11 +++ .../resources/mapper/GradeClassDOMapper.xml | 17 +++++ .../main/resources/mapper/GradeDOMapper.xml | 8 ++ enlish-vue/src/api/class.js | 8 ++ enlish-vue/src/pages/class.vue | 73 +++++++++++++++++-- 15 files changed, 296 insertions(+), 8 deletions(-) create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ClassController.java create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/GradeClassDO.java create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/GradeClassDOMapper.java create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/classs/FindClassReqVO.java create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/classs/FindClassRspVO.java create mode 100644 enlish-service/src/main/resources/mapper/GradeClassDOMapper.xml create mode 100644 enlish-vue/src/api/class.js diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ClassController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ClassController.java new file mode 100644 index 0000000..8a7b852 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ClassController.java @@ -0,0 +1,44 @@ +package com.yinlihupo.enlish.service.controller; + +import com.yinlihupo.enlish.service.domain.dataobject.ClassDO; +import com.yinlihupo.enlish.service.domain.dataobject.GradeDO; +import com.yinlihupo.enlish.service.model.vo.classs.FindClassReqVO; +import com.yinlihupo.enlish.service.model.vo.classs.FindClassRspVO; +import com.yinlihupo.enlish.service.service.ClassService; +import com.yinlihupo.framework.biz.operationlog.aspect.ApiOperationLog; +import com.yinlihupo.framework.common.response.PageResponse; +import jakarta.annotation.Resource; +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 java.util.List; +import java.util.Map; + +@RequestMapping("/class/") +@RestController +public class ClassController { + + @Resource + private ClassService classService; + + @PostMapping("list") + @ApiOperationLog(description = "查询班级列表") + public PageResponse findClasses(@RequestBody FindClassReqVO findClassReqVO) { + Integer page = findClassReqVO.getPage(); + Integer pageSize = findClassReqVO.getPageSize(); + int total = classService.getClassCount(); + + List classList = classService.findClassList(page, pageSize); + Map classId2GradeMap = classService.findClassId2GradeMap(classList.stream().map(ClassDO::getId).toList()); + List findClassRspVOS = classList.stream().map(classDO -> FindClassRspVO.builder() + .id(classDO.getId()) + .title(classDO.getTitle()) + .gradeId(classId2GradeMap.get(classDO.getId()) != null ? classId2GradeMap.get(classDO.getId()).getId() : 0) + .gradeName(classId2GradeMap.get(classDO.getId()) != null ? classId2GradeMap.get(classDO.getId()).getTitle() : "") + .build()).toList(); + + return PageResponse.success(findClassRspVOS, page, total, pageSize); + } +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/GradeClassDO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/GradeClassDO.java new file mode 100644 index 0000000..a1119b0 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/GradeClassDO.java @@ -0,0 +1,21 @@ +package com.yinlihupo.enlish.service.domain.dataobject; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class GradeClassDO { + + private Integer id; + + private Integer classId; + + private Integer gradeId; + + +} \ No newline at end of file diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ClassDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ClassDOMapper.java index c0cf631..fcdb936 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ClassDOMapper.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ClassDOMapper.java @@ -1,8 +1,15 @@ package com.yinlihupo.enlish.service.domain.mapper; import com.yinlihupo.enlish.service.domain.dataobject.ClassDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; public interface ClassDOMapper { ClassDO selectClassDOById(Integer id); + + List selectClassDOList(@Param("startIndex") Integer startIndex, @Param("pageSize") Integer pageSize); + + Integer selectClassDOCount(); } \ No newline at end of file diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/GradeClassDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/GradeClassDOMapper.java new file mode 100644 index 0000000..3ff3f68 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/GradeClassDOMapper.java @@ -0,0 +1,10 @@ +package com.yinlihupo.enlish.service.domain.mapper; + +import com.yinlihupo.enlish.service.domain.dataobject.GradeClassDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface GradeClassDOMapper { + List selectByClassIds(@Param("classIds") List classIds); +} \ No newline at end of file diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/GradeDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/GradeDOMapper.java index 0f3b6c0..49e3525 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/GradeDOMapper.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/GradeDOMapper.java @@ -1,8 +1,13 @@ package com.yinlihupo.enlish.service.domain.mapper; import com.yinlihupo.enlish.service.domain.dataobject.GradeDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; public interface GradeDOMapper { GradeDO selectById(Integer id); + + List selectByGradeIds(@Param("gradeIds") List gradeIds); } \ No newline at end of file diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/classs/FindClassReqVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/classs/FindClassReqVO.java new file mode 100644 index 0000000..d2b1995 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/classs/FindClassReqVO.java @@ -0,0 +1,16 @@ +package com.yinlihupo.enlish.service.model.vo.classs; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class FindClassReqVO { + + Integer page; + Integer pageSize; +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/classs/FindClassRspVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/classs/FindClassRspVO.java new file mode 100644 index 0000000..26d586c --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/classs/FindClassRspVO.java @@ -0,0 +1,18 @@ +package com.yinlihupo.enlish.service.model.vo.classs; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class FindClassRspVO { + + private Integer id; + private String title; + private Integer gradeId; + private String gradeName; +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ClassService.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ClassService.java index f2bcd11..51e73de 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ClassService.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ClassService.java @@ -1,8 +1,18 @@ package com.yinlihupo.enlish.service.service; import com.yinlihupo.enlish.service.domain.dataobject.ClassDO; +import com.yinlihupo.enlish.service.domain.dataobject.GradeDO; + +import java.util.List; +import java.util.Map; public interface ClassService { ClassDO findClassById(Integer id); + + List findClassList(Integer page, Integer pageSize); + + int getClassCount(); + + Map findClassId2GradeMap(List classIds); } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/classs/ClassServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/classs/ClassServiceImpl.java index 5c80cef..4994b4e 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/classs/ClassServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/classs/ClassServiceImpl.java @@ -1,19 +1,73 @@ package com.yinlihupo.enlish.service.service.classs; import com.yinlihupo.enlish.service.domain.dataobject.ClassDO; +import com.yinlihupo.enlish.service.domain.dataobject.GradeClassDO; +import com.yinlihupo.enlish.service.domain.dataobject.GradeDO; import com.yinlihupo.enlish.service.domain.mapper.ClassDOMapper; +import com.yinlihupo.enlish.service.domain.mapper.GradeClassDOMapper; +import com.yinlihupo.enlish.service.domain.mapper.GradeDOMapper; import com.yinlihupo.enlish.service.service.ClassService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Service public class ClassServiceImpl implements ClassService { @Resource private ClassDOMapper classDOMapper; + @Resource + private GradeClassDOMapper gradeClassDOMapper; + @Resource + private GradeDOMapper gradeDOMapper; @Override public ClassDO findClassById(Integer id) { return classDOMapper.selectClassDOById(id); } + + @Override + public List findClassList(Integer page, Integer pageSize) { + return classDOMapper.selectClassDOList((page - 1) * pageSize, pageSize); + } + + @Override + public int getClassCount() { + return classDOMapper.selectClassDOCount(); + } + + @Override + public Map findClassId2GradeMap(List classIds) { + + List gradeClassDOS = gradeClassDOMapper.selectByClassIds(classIds); + List gradeDOS = gradeDOMapper.selectByGradeIds(gradeClassDOS.stream().map(GradeClassDO::getGradeId).toList()); + HashMap gradeId2GradeDO = gradeDOS.stream().collect(Collectors.toMap( + GradeDO::getId, + gradeDO -> gradeDO, + (oldValue, newValue) -> newValue, // mergeFunction:处理键冲突(比如重复键时保留新值) + HashMap::new // mapSupplier:指定返回HashMap类型 + )); + + return gradeClassDOS.stream().collect(Collectors.toMap( + GradeClassDO::getClassId, // key:GradeClassDO的classId + // 修正后的valueMapper:lambda表达式处理映射逻辑 + gradeClassDO -> { + // 可选:处理空值,避免返回null(根据业务需求调整) + Integer gradeId = gradeClassDO.getGradeId(); + GradeDO gradeDO = gradeId2GradeDO.get(gradeId); + if (gradeDO == null) { + // 业务上的空值处理,比如抛出异常、返回默认对象等 + throw new IllegalArgumentException("未找到gradeId为" + gradeId + "的GradeDO"); + // 或者:return new GradeDO(); // 返回默认对象 + } + return gradeDO; + }, + (oldValue, newValue) -> newValue, // 键冲突保留新值 + HashMap::new // 指定返回 HashMap + )); + } } diff --git a/enlish-service/src/main/resources/generatorConfig.xml b/enlish-service/src/main/resources/generatorConfig.xml index de0fc67..58211a3 100644 --- a/enlish-service/src/main/resources/generatorConfig.xml +++ b/enlish-service/src/main/resources/generatorConfig.xml @@ -45,7 +45,7 @@ targetProject="src/main/java"/> - + + + + \ No newline at end of file diff --git a/enlish-service/src/main/resources/mapper/GradeClassDOMapper.xml b/enlish-service/src/main/resources/mapper/GradeClassDOMapper.xml new file mode 100644 index 0000000..26027b5 --- /dev/null +++ b/enlish-service/src/main/resources/mapper/GradeClassDOMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/enlish-service/src/main/resources/mapper/GradeDOMapper.xml b/enlish-service/src/main/resources/mapper/GradeDOMapper.xml index 9fa2e03..b73ddef 100644 --- a/enlish-service/src/main/resources/mapper/GradeDOMapper.xml +++ b/enlish-service/src/main/resources/mapper/GradeDOMapper.xml @@ -12,5 +12,13 @@ from grade where id = #{id} + \ No newline at end of file diff --git a/enlish-vue/src/api/class.js b/enlish-vue/src/api/class.js new file mode 100644 index 0000000..67051a4 --- /dev/null +++ b/enlish-vue/src/api/class.js @@ -0,0 +1,8 @@ +import axios from "@/axios"; + +export function getClassList(page, size) { + return axios.post('/class/list', { + page: page, + pageSize: size + }) +} \ No newline at end of file diff --git a/enlish-vue/src/pages/class.vue b/enlish-vue/src/pages/class.vue index 25286d4..8a8720b 100644 --- a/enlish-vue/src/pages/class.vue +++ b/enlish-vue/src/pages/class.vue @@ -5,15 +5,38 @@
- -
-
- 班级 + +
+
+
+
班级列表
+ + + + + + + +
+ +
+ +
+
-
- hellow +
+
右侧卡片
+
内容待完善
+ +
+
左下卡片
+
内容待完善
+
+
@@ -23,4 +46,40 @@ \ No newline at end of file +import { ref, onMounted } from 'vue' +import { getClassList } from '@/api/class' + +const classes = ref([]) +const pageNo = ref(1) +const pageSize = ref(10) +const totalCount = ref(0) +const loading = ref(false) + +async function fetchClasses() { + loading.value = true + try { + const res = await getClassList(pageNo.value, pageSize.value) + const d = res.data + classes.value = Array.isArray(d.data) ? d.data : [] + totalCount.value = d.totalCount || 0 + pageNo.value = d.pageNo || pageNo.value + pageSize.value = d.pageSize || pageSize.value + } finally { + loading.value = false + } +} + +function handlePageChange(p) { + pageNo.value = p + fetchClasses() +} +function handleSizeChange(s) { + pageSize.value = s + pageNo.value = 1 + fetchClasses() +} + +onMounted(() => { + fetchClasses() +}) +