上次课,我们完成了tagNames转换为List
转换代码编写完毕
要在QuestionServiceImpl类中查询学生问题列表的getMyQuestions方法中调用才行
具体代码如下
@Override public ListgetMyQuestions(String username) { // 先根据用户名查询用户信息(用户对象) User user=userMapper.findUserByUsername(username); // 再使用QueryWrapper完成该用户的问题列表的查询 QueryWrapper query=new QueryWrapper<>(); query.eq("user_id",user.getId()); query.eq("delete_status",0); query.orderByDesc("createtime"); // 执行查询 List list=questionMapper.selectList(query); // 遍历当前查询到的所有问题对象 // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ for(Question question:list){ // 将当前问题对象的tagNames转换为List List tags=tagNamesToTags(question.getTagNames()); // 将转换结果得到的list赋值给当前question对象的tags属性 question.setTags(tags); } // 别忘了返回list return list; }
因为业务逻辑层的修改
我们现在返回的Question对象就都包含tags集合属性了
为了测试,我们再次发送同步请求测试
localhost:8080/v1/questions/my
观察页面中json格式的tags属性是否有值
最后要想在页面上也显示标签信息
需要在index_student.html页面中
215行附近修改为
Java基础
再重启服务,直接访问学生首页即可
显示当前问题的配图question表中,没有对每个问题设置配图的信息
我们需要根据当前问题的标签来决定配图
我们设计使用当前问题所有标签中的第一个标签的id作为配图的依据
我们在静态资源文件中img文件夹下的tags文件夹内确实保存了1~20号图片
我们需要做的就是提取当前问题的第一个标签的id然后去确定显示对应的图片路径即可
实际上这个方法也在index.js文件中给大家写好了
我们只需要编写绑定即可
index_student.html的238行附近
重启服务,观察图片变化
分页显示问题列表 分页的优势所谓分页显示就是将查询结果按页显示在浏览器,而不是全部一次性显示
分页的好处:
相对于一次性全查所有信息,查询一页信息,服务器压力比较小对客户端来说,一次性显示所有信息会消耗较多流量,加载页面的时间也更长用户体验上,一般情况下最有价值的信息都会在前几页显示,后面的数据被浏览的几率很低 PageHelper简介
mysql数据库实现分页查询是通过limit关键字
SELECT * FROM question WHERe user_id=11 ORDER BY createtime DESC LIMIT 0,8
上面的分页可以看出,分页操作就是添加limt关键字
页码的变化就是变化limit关键字之后的数字
PageHelper框架就可以替我们完成limit关键字的编写和页码变化的设置
下面我们就是用pageHelper实现分页效果
添加PageHelper依赖PageHelper和MybatisPlus一样,也要我们自己定义版本
父项目pom.xml文件添加版本设定
1.3.0 com.github.pagehelper pagehelper-spring-boot-starter ${pagehelper.starter.version}
portal子项目pom.xml文件添加具体依赖
PageHelper基本使用com.github.pagehelper pagehelper-spring-boot-starter
PageHelper框架的分页实现原理非常简单
就是在执行要分页的查询之前,设置分页的参数
PageHelper框架会在这次查询的sql语句后自动按照查询需求添加limit关键字和正确的页面参数(例如limit 8,limit 8,8 limit 16,8等)
QuestionServiceImpl类中的getMyQuestions方法中添加代码:
//PageHelper.startPage就是设置分页查询的方法 // 在查询执行之前设置,设置后,这次查询就会自动分页 // startPage([页码],[每页条数]) // 页码从1开始,第二页就写2即可 PageHelper.startPage(2,8); // 执行查询 Listlist=questionMapper.selectList(query);
我们重启服务,访问学生首页,就会显示指定页码的问题了
重构学生问题列表代码为了实现分页的效果
我们需要重构学生问题列表的部分代码
首先我们要知道,分页查询除了页码和每页条数,还需要很多其它信息
尤其是在需要进行上一页或下一页操作时,需要知道相关分页信息
它们包括
总页数,总条数,有没有上一页(是不是第一页),有没有下一页(是不是最后一页)
当前第几页等各种信息
也就是说,我们在进行分页查询的业务时,上面的这些信息,也要进行查询
PageHelper框架的另一个能够帮助我们的功能,就是计算这些数据
利用PageInfo的类型可以保存
原有的分页问题列表(list)当前分页的信息(总页数总条数,当前页数等)
所以我们要将业务逻辑层和控制层的方法返回值都修改为PageInfo类型
以便于页面既能接收list又能接收分页信息
重构从业务逻辑层的接口开始
IQuestionService接口修改代码如下
public interface IQuestionService extends IService{ // 根据登录用户的用户名查询问题列表 // 返回值修改为PageInfo既能包含list,又能包含分页信息 // 添加分页参数pageNum页码,和PageSize每页条数,用于分页查询 PageInfo getMyQuestions(String username, Integer pageNum,Integer pageSize); }
QuestionServiceImpl实现方法也随之修改
@Override // ↓↓↓↓↓↓↓↓ public PageInfogetMyQuestions(String username, Integer pageNum,Integer pageSize) { //↑↑↑↑↑↑↑↑↑↑ // 先根据用户名查询用户信息(用户对象) User user=userMapper.findUserByUsername(username); // 再使用QueryWrapper完成该用户的问题列表的查询 QueryWrapper query=new QueryWrapper<>(); query.eq("user_id",user.getId()); query.eq("delete_status",0); query.orderByDesc("createtime"); //PageHelper.startPage就是设置分页查询的方法 // 在查询执行之前设置,设置后,这次查询就会自动分页 // startPage([页码],[每页条数]) // 页码从1开始,第二页就写2即可 // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ PageHelper.startPage(pageNum,pageSize); // 执行查询 List list=questionMapper.selectList(query); // 遍历当前查询到的所有问题对象 for(Question question:list){ // 将当前问题对象的tagNames转换为List List tags=tagNamesToTags(question.getTagNames()); // 将转换结果得到的list赋值给当前question对象的tags属性 question.setTags(tags); } // 别忘了返回PageInfo // ↓↓↓↓↓↓↓↓ return new PageInfo<>(list); }
最后修改控制层的调用
QuestionController的my方法修改为
@GetMapping("/my")
// ↓↓↓↓↓↓↓↓↓
public PageInfo my(
//@AuthenticationPrincipal注解效果
// 从Spring-Security框架获得当前登录用户的UserDetails对象
// 赋值给注解之后的参数
@AuthenticationPrincipal UserDetails user,
// ↓↓↓↓↓↓↓↓↓
Integer pageNum
){
// ↓↓↓↓↓↓↓↓↓
Integer pageSize=8;
if(pageNum==null){
pageNum=1;
}
// ↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓
PageInfo pageInfo=questionService
.getMyQuestions(user.getUsername(),pageNum,pageSize);
// ↓↓↓↓↓↓↓↓↓
return pageInfo;
}
修改完之后可以再发一个同步请求
localhost:8080/v1/questions/my
我们会发现,除了之前的list信息之外
现在还包含了分页信息,具体内容见笔记末尾文档
最后别忘了修改js文件
因为返回值类型的变化
Vuejs代码的赋值也修改
index.js的25行附近修改为
if(r.status == OK){
questionsApp.questions = r.data.list;
questionsApp.pageinfo = r.data;
//为question对象添加持续时间属性
questionsApp.updateDuration();
questionsApp.updateTagImage();
}
在重启服务,就恢复显示了!!!
实现页面分页导航条后端(java代码)已经编写完成,要想实现上一页下一页效果
实际上就是调用QuestionController中的控制器方法,区别就是页码的不同而已
所以我们只需要修改页面上的代码,在上一页和下一页连接的位置
请求正确的页码,就可以实现翻页了
我们直接修改index_student.html页面244行附近的导航条就可以实现
重启服务测试翻页功能
开发学生发布问题的功能 达内知道问题流程达内知道问答流程概述
- 学生登录系统后,可以在发布问题页面进行提问,问题状态为"未回复"讲师登录系统后,可以对学生的提问进行回复,回答后问题状态为"已回复"学生可以对讲师的回复进行追问或问题补充也就是讨论,讲师也可以对追问进行回复直到学生问题解决,学生可以采纳讲师的回复,将问题标记为"已解决"状态
在完成实际的学生提问操作前
学生提问页面和表单中有一些信息需要先准备一下
复用全部标签列表我们在学生首页的开发过程中已经完成了显示所有标签列表的功能
如果再次编写就是代码冗余,会造成维护困难
我们可以使用Vue模板,复用之前已经编写完成的代码
减少代码冗余,用于本次以及之后的显示所有标签列表的需求
Vue模板的使用分为3个步骤
1.定义模板
2.调用模板
3.引用模板
定义模板所谓定义模板就是在js文件夹中定义一个js文件
这个文件中编写固定格式的代码,形成一个Vue模板的过程
在js文件夹中创建tags_nav_temp.js
Vue.component("tags-app",{
props:["tags"],
template:`
`
})
一定要删除原有代码中id的属性!!!
调用模板调用模板的原则是哪里需要,哪里调用
现在是question/create.html页面中需要这个模板的内容
就在这个页面的对应位置编写下面调用模板的代码
183行
引用模板
所谓引用模板就是需要将当前业务能够运行模板内容的所有支持的js都引用过来
1.由于是第一次在create.html页面中发送axios请求
所以先添加axios的引用
2.页面尾部添加所有可能需要的js文件和模板js文件的引用
顺序必须是先添加模板再添加模板依赖的js文件


