文章目录
-
- 概要
- 整体架构流程
- 技术细节
- 小结
概要
需求分析以及接口设计

技术细节
1.Controller层
package com.tianji.learning.controller;import com.tianji.common.domain.dto.PageDTO;
import com.tianji.learning.domain.query.QuestionAdminPageQuery;
import com.tianji.learning.domain.vo.QuestionAdminVO;
import com.tianji.learning.service.IInteractionQuestionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** <p>* 互动提问的问题表 前端控制器* </p>** @author cjh* @since 2025-03-18*/
@RestController
@Api(tags = "互动问题相关结构---管理端")
@RequiredArgsConstructor
@RequestMapping("/admin/questions")
public class InteractionQuestionAdminController {private final IInteractionQuestionService questionService;@GetMapping("/page")@ApiOperation("分页查询互动问题")public PageDTO<QuestionAdminVO> queryQuestionPageAdmin(QuestionAdminPageQuery query){return questionService.queryQuestionPageAdmin(query);}}
2.Service层:
@Overridepublic PageDTO<QuestionAdminVO> queryQuestionPageAdmin(QuestionAdminPageQuery query) {//1.处理课程名称,调用es搜索服务获取到课程id集合List<Long> cIds = null;if (StringUtils.isNotBlank(query.getCourseName())) {cIds = searchClient.queryCoursesIdByName(query.getCourseName());if (CollUtils.isEmpty(cIds)) {return PageDTO.empty(0L, 0L);}}//2.分页查询Page<InteractionQuestion> page = this.lambdaQuery().in(CollUtils.isNotEmpty(cIds), InteractionQuestion::getCourseId, cIds).eq(query.getStatus() != null, InteractionQuestion::getSectionId, query.getStatus()).between(query.getBeginTime() != null && query.getEndTime() != null,InteractionQuestion::getCreateTime, query.getBeginTime(), query.getEndTime()).page(query.toMpPageDefaultSortByCreateTimeDesc());List<InteractionQuestion> records = page.getRecords();if (CollUtils.isEmpty(records)) {return PageDTO.empty(page);}//3.准备vo所需数据HashSet<Long> courseIds = new HashSet<>();HashSet<Long> userIds = new HashSet<>();HashSet<Long> chapterAndSectionIds = new HashSet<>();for (InteractionQuestion record : records) {courseIds.add(record.getCourseId());userIds.add(record.getUserId());chapterAndSectionIds.add(record.getChapterId());chapterAndSectionIds.add(record.getSectionId());}//3.1调用课程服务获取课程信息List<CourseSimpleInfoDTO> cInfoList = courseClient.getSimpleInfoList(courseIds);Map<Long, CourseSimpleInfoDTO> cInfoMap = new HashMap<>(cInfoList.size());if (CollUtils.isNotEmpty(cInfoList)) {cInfoMap = cInfoList.stream().collect(Collectors.toMap(CourseSimpleInfoDTO::getId, c -> c));}//3.2调用用户服务获取用户信息List<UserDTO> userDTOList = userClient.queryUserByIds(userIds);Map<Long, UserDTO> userDTOMap = userDTOList.stream().collect(Collectors.toMap(UserDTO::getId, c -> c));//3.3.根据id查询章节List<CataSimpleInfoDTO> cataSimpleInfoDTOList = catalogueClient.batchQueryCatalogue(chapterAndSectionIds);Map<Long, String> cataMap = cataSimpleInfoDTOList.stream().collect(Collectors.toMap(CataSimpleInfoDTO::getId, CataSimpleInfoDTO::getName));//4.封装voArrayList<QuestionAdminVO> voList = new ArrayList<>();for (InteractionQuestion record : records) {QuestionAdminVO vo = BeanUtils.copyBean(record, QuestionAdminVO.class);UserDTO userDTO = userDTOMap.get(record.getUserId());if (userDTO != null){vo.setUserName(userDTO.getName());}CourseSimpleInfoDTO courseSimpleInfoDTO = cInfoMap.get(record.getCourseId());if (courseSimpleInfoDTO != null){vo.setCourseName(courseSimpleInfoDTO.getName());//获取一二三级分类名称String categoryNames = categoryCache.getCategoryNames(courseSimpleInfoDTO.getCategoryIds());vo.setCategoryName(categoryNames);}vo.setChapterName(cataMap.get(record.getChapterId()));vo.setSectionName(cataMap.get(record.getSectionId()));voList.add(vo);}return PageDTO.of(page, voList);}
3.Mapper层