0
点赞
收藏
分享

微信扫一扫

ProjectDay08

钟罗敏 2022-03-15 阅读 22

续 讲师首页复用模板

复用用户信息面板

复用用户信息面板是第一次执行

1.定义模板

2.调用模板

3.引用模板

在js文件夹中定义一个模板文件user_info_temp.js

Vue.component("user-app",{
    props:["user"],
    template:`
    <div class="container-fluid font-weight-light">
        <div class="card">
          <h5 class="card-header"
            v-text="user.nickname">陈某</h5>
          <div class="card-body">
            <div class="list-inline mb-1 ">
                <a class="list-inline-item mx-3 my-1 text-center">
                  <div><strong>10</strong></div>
                  <div>回答</div>
                </a>
                <a class="list-inline-item mx-3 my-1 text-center" href="personal/myQuestion.html">
                  <div>
                    <strong v-text="user.questions">10</strong>
                  </div>
                  <div>提问</div>
                </a>
                <a class="list-inline-item mx-3 my-1 text-center" href="personal/collect.html">
                  <div>
                    <strong v-text="user.collections">10</strong>
                  </div>
                  <div>收藏</div>
                </a>
                <a class="list-inline-item mx-3 my-1 text-center" href="personal/task.html">
                  <div><strong>10</strong></div>
                  <div>任务</div>
                </a>
            </div>
          </div>
        </div>
      </div>
    `
})

调用模板

哪里需要哪里调用

删除之前的html代码

使用我们定义的标签替换

<!--个人信息-->
<user-app id="userApp" :user="user"></user-app>

引用模板

页面尾部,在引用的列表中添加

<script src="js/user_info_temp.js"></script>
<script src="js/user_info.js"></script>

重启服务,登录讲师,显示讲师首页

正确的情况是能显示所有标签和当前登录讲师的用户信息面板

开发讲师任务列表

讲师任务列表业务分析

学生首页显示学生的问题列表

讲师首页显示讲师的任务列表

任务列表的含义是:显示哪些问题问了当前登录的讲师

也就是我们需要编写一个sql语句

实现查询哪些问题问了当前登录讲师,当然讲师如果有提问也要显示出来

确定任务列表的sql

SELECT q.* FROM question q
LEFT JOIN user_question uq ON q.id=uq.question_id
WHERE uq.user_id=3 OR q.user_id=3
ORDER BY q.createtime DESC 

编写查询任务列表的数据访问层

QuestionMapper参照上面sql语句完成数据访问层查询方法的编写:

// 根据讲师id查询讲师任务列表
@Select("SELECT q.* FROM question q\n" +
        "LEFT JOIN user_question uq ON q.id=uq.question_id\n" +
        "WHERE uq.user_id=#{id} OR q.user_id=#{id}\n" +
        "ORDER BY q.createtime DESC ")
List<Question> findTeacherQuestions(Integer userId);

编写业务逻辑层代码

学生问题列表有分页的设置

讲师任务列表也要实现分页的查询

所以IQuestionService业务逻辑层接口声明为:

// 分页查询讲师任务列表
PageInfo<Question> getTeacherQuestions(String username,
                         Integer pageNum,Integer pageSize);

QuestionServiceImpl实现代码如下

@Override
public PageInfo<Question> getTeacherQuestions(String username, Integer pageNum, Integer pageSize) {
    // 根据用户名获得用户信息
    User user=userMapper.findUserByUsername(username);
    // 设置分页条件
    PageHelper.startPage(pageNum,pageSize);
    // 查询任务列表
    List<Question> list=questionMapper
            .findTeacherQuestions(user.getId());
    // 遍历当前查询出的任务列表,将问题的tags属性赋值
    for(Question question:list){
        List<Tag> tags=tagNamesToTags(question.getTagNames());
        question.setTags(tags);
    }
    // 别忘了返回pageInfo
    return new PageInfo<>(list);
}

开发控制层代码

QuestionController类添加查询讲师任务列表的控制层方法

代码如下

// 查询讲师任务列表
@GetMapping("/teacher")
// 我们需要限制当前登录用户必须是讲师身份,才能查询任务列表
// 使用Spring-Security提供的权限\角色的验证功能,实现限制效果
// @PreAuthorize注解设置当前用户必须包含ROLE_TEACHER角色
// 否则会发生没有权限访问的错误(403错误)
@PreAuthorize("hasRole('ROLE_TEACHER')")
public PageInfo<Question> teacher(
        @AuthenticationPrincipal UserDetails user,
        Integer pageNum){
    Integer pageSize=8;
    if(pageNum==null){
        pageNum=1;
    }
    // 调用业务逻辑层
    PageInfo<Question> pageInfo=questionService
      .getTeacherQuestions(user.getUsername(),pageNum,pageSize);
    return pageInfo;
}

重启服务

发送同步测试localhost:8080/v1/questions/teacher

注意分别测试登录讲师和学生

验证我们的@PreAuthorize注解是否生效

编写讲师任务列表的Vue和js代码

讲师任务列表显示问题的内容和学生问题列表是一样的

我们可以直接复制学生问题列表的内容,到讲师任务列表

index_student.html的id为questionsApp的div直接复制到index_teacher.html页面的相同位置

学生首页的js文件也和讲师首页的js文件基本一致

复制index.js更名为index_teacher.js文件

在index_teacher.js文件中axios的路径修改为

16行附近

axios({
    //                   ↓↓↓↓↓↓
    url: '/v1/questions/teacher',
    method: "GET",
    params:{
        pageNum:pageNum
    }
})

最后讲师首页末尾添加index_teacher.js文件的引用即可

<script src="js/index_teacher.js"></script>

重启复习,登录讲师,观察首页任务列表

显示任务列表则一切正常

显示问题详情

讲师要想进行回答\回复

必须在问题详情页中进行

但是现在任务列表中点击问题的标题链接,报404错误,原因是连接的地址根本不存在

我们必须将它指定为存在的页面

跳转讲师问题详情页

我们需要修改讲师首页中显示问题标签的超链接

链接地址修改为显示讲师问题详情的页面

index_teacher.html的212行附近

<a class="text-dark" href="question/detail.html"
   v-text="question.title"
   :href="'/question/detail_teacher.html?'+question.id">
    <!-- ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -->
  eclipse 如何导入项目?
</a>

这样我们就实现了页面的正确跳转

而且还传递了当前点击问题的id

这样就可以在问题详情页获得这个id来查询这个问题的内容来显示在页面上了

开发业务逻辑层

我们要根据id查询当前问题的详情并显示在页面上

但是根据id查询对象的方法由MybatisPlus提供了

我们只需从业务逻辑层开始编写查询即可

IQuestionService接口添加根据id查询问题对象的方法

// 根据问题id 查询问题详情
Question getQuestionById(Integer id);

QuestionServiceImpl实现代码如下

@Override
public Question getQuestionById(Integer id) {
    // 根据MybatisPlus提供的方法来查询Question对象
    Question question=questionMapper.selectById(id);
    List<Tag> tags=tagNamesToTags(question.getTagNames());
    question.setTags(tags);
    // 别忘了返回question
    return question;
}

开发控制层代码

QuestionController完成调用业务逻辑层查询根据id返回Question对象的控制层方法

// 根据id查询问题详情的控制器方法
// "/{id}"是SpringMvc框架支持的一种占位符赋值的写法
// 它可以匹配路径赋值的内容
// localhost:8080/v1/questions/149
// 那么这个{id}就会被149赋值
@GetMapping("/{id}")
// 使用控制器方法参数的特殊写法获得路径中的149
public Question question(
        // 要想获得路径中{id}占位符的值
        // 1.必须编写 @PathVariable注解
        // 2.参数的名称必须和{}中的内容一致
        @PathVariable Integer id
){
    Question question=questionService.getQuestionById(id);
    return question;
}
举报

相关推荐

ProjectDay02

ProjectDay15

ProjectDay20

08前秦....

Python笔记08

08-Ajax

08—指针(全)

0 条评论