学生界面和讲师界面最大的区别是问题列表,学生显示的是自己发布的问题列表,而讲师界面显示的是讲师发布的问题和讲师需要解答的问题列表。
讲师发布的问题的目的是为学生创建经典问题和答案。
- 编写mapper层sql语句
/**
* 查询与老师有关的问题列表,包含老师发布的问题和请老师解决的问题
* @param userId 老师的用户ID
* @return 与老师有关的问题列表
*/
@Select({"select q.* " +
"from question as q " +
"left join user_question as uq on q.id = uq.question_id " +
"where q.user_id=#{userId} or uq.user_id = #{userId} " +
"order by q.modifytime desc"})
public List<Question> findTeachersQuestions(Integer userId);
测试sql语句
@SpringBootTest
@Slf4j
public class QuestionMapperTests {
@Resource
QuestionMapper questionMapper;
@Test
public void findTeachersQuestions(){
Integer userId = 11;
List<Question> questions = questionMapper.findTeachersQuestions(userId);
questions.forEach(question -> log.debug("{}",question));
}
}
- 业务层代码
/**
* 查询老师相关问题
*/
PageInfo<Question> getQuestionsByTeacherName(
String username, Integer pageNum, Integer pageSize
);
@Override
public PageInfo<Question> getQuestionsByTeacherName(String username, Integer pageNum, Integer pageSize) {
if (username == null){
throw ServiceException.notFound("用户名不能为空");
}
if (pageNum == null){
pageNum = 1;
}
if (pageSize == null){
pageSize = 8;
}
User user = userMapper.findUserByUsername(username);
PageHelper.startPage(pageNum,pageSize);
List<Question> questions = questionMapper.findTeachersQuestions(user.getId());
//填充标签列表属性tags,从缓存中填充
for (Question question:questions){
List<Tag> tags = tagNamesToTags(question.getTagNames());
question.setTags(tags);
}
return new PageInfo<>(questions);
}
测试
@Test
public void getQuestionsByTeacherName(){
PageInfo<Question> pageInfo = questionService.getQuestionsByTeacherName("tc2", 1, 8);
log.debug("PageInfo{}",pageInfo);
pageInfo.getList().forEach(question -> log.debug("{}",question));
}
- 编写controller
/**
* 请求 /v1/questions/teacher 分页返回当前老师有关的问题
* @AuthenticationPrincipal 从springSecurity中获取当前登录的用户
* @param user 当前老师
* @param pageNum 页号
* @return 一页数据
*/
@GetMapping("/teacher")
@PreAuthorize("hasRole('TEACHER')")
public R<PageInfo<Question>> teachers(
@AuthenticationPrincipal User user, Integer pageNum){
if (pageNum == null){
pageNum = 1;
}
Integer pageSize = 8;
PageInfo<Question> pageInfo = questionService.getQuestionsByTeacherName(user.getUsername(),pageNum,pageSize);
return R.ok(pageInfo);
}
老师的前端逻辑和学生的前端前端逻辑一致。