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

技术细节
1.Controller层
@GetMapping("/page")
@ApiOperation("分页查询问题")
public PageDTO<QuestionVO> queryQuestionPage(QuestionPageQuery query){
return questionService.queryQuestionPage(query);
}
2.Service层:
@Override
public PageDTO<QuestionVO> queryQuestionPage(QuestionPageQuery query) {
//1.参数校验courseId
if (query.getCourseId() == null){
throw new BadRequestException("课程id为空");
}
//2.获取用户id
Long userId = UserContext.getUser();
//3.分页查询互动问题interaction_question 条件:courseId, onlyMine(非必需,出现则传userId), sectionId(非必需), hidden=false,顺序按提问时间倒序
Page<InteractionQuestion> page = this.lambdaQuery()
//指定不查的字段
.select(InteractionQuestion.class, tableFieldInfo -> !tableFieldInfo.getProperty().equals("description"))
.eq(InteractionQuestion::getCourseId, query.getCourseId())
.eq(query.getOnlyMine() != null, InteractionQuestion::getUserId, userId)
.eq(query.getSectionId() != null, InteractionQuestion::getSectionId, query.getSectionId())
.eq(InteractionQuestion::getHidden, false)
.page(query.toMpPage("create.time", true));
List<InteractionQuestion> records = page.getRecords();
if (CollUtils.isEmpty(records)){
return PageDTO.empty(page);
}
//4.根据最新回答id,批量查询问答信息
//4.1获取到最新回答的id
Set<Long> latestAnswerIdSet = new HashSet<>();
//5.1
Set<Long> userIdSet = records.stream().map(InteractionQuestion::getUserId).collect(Collectors.toSet());
for (InteractionQuestion question : records) {
if (!question.getAnonymity()) {//只获取非匿名的用户id
userIdSet.add(question.getUserId());
}
if (question.getLatestAnswerId() != null) {
latestAnswerIdSet.add(question.getLatestAnswerId());
}
}
//4.2调用回答服务批量查询回答信息,如果被hidden则不显示
Map<Long, InteractionReply> replyMap = new HashMap<>();
if (CollUtils.isNotEmpty(latestAnswerIdSet)){
//List<InteractionReply> replyList = replyService.listByIds(latestAnswerIdSet);
List<InteractionReply> replyList = replyService.list(Wrappers.<InteractionReply>lambdaQuery()
.in(InteractionReply::getId, latestAnswerIdSet)
.eq(InteractionReply::getHidden, false));
for (InteractionReply reply : replyList) {
if (!reply.getAnonymity()) {
userIdSet.add(reply.getUserId());//将最新回答的用户id存入用户id集合
}
replyMap.put(reply.getId(), reply);
}
}
//5.远程调用用户服务,获取用户信息 批量
//5.1获取用户id集合
List<UserDTO> userDTOS = userClient.queryUserByIds(userIdSet);
Map<Long, UserDTO> userMap = userDTOS.stream().collect(Collectors.toMap(UserDTO::getId, c -> c));
//6.封装vo返回
ArrayList<QuestionVO> voList = new ArrayList<>();
for (InteractionQuestion record : records) {
QuestionVO vo = BeanUtils.copyBean(record, QuestionVO.class);
if (!vo.getAnonymity()) {
UserDTO userDTO = userMap.get(record.getUserId());
if (userDTO != null) {
vo.setUserName(userDTO.getName());
vo.setUserIcon(userDTO.getIcon());
}
}
InteractionReply reply = replyMap.get(record.getLatestAnswerId());
if (reply != null){
vo.setLatestReplyContent(reply.getContent());
if (!reply.getAnonymity()){
UserDTO userDTO = userMap.get(record.getUserId());
if (userDTO != null){
vo.setLatestReplyUser(userDTO.getName());
}
}
}
voList.add(vo);
}
return PageDTO.of(page, voList);
}
3.Mapper层