一、后端实现

1、定义搜索对象

CourseQuery

  1. package com.guli.edu.query;
  2. @ApiModel(value = "Course查询对象", description = "课程查询对象封装")
  3. @Data
  4. public class CourseQuery implements Serializable {
  5. private static final long serialVersionUID = 1L;
  6. @ApiModelProperty(value = "课程名称")
  7. private String title;
  8. @ApiModelProperty(value = "讲师id")
  9. private String teacherId;
  10. @ApiModelProperty(value = "一级类别id")
  11. private String subjectParentId;
  12. @ApiModelProperty(value = "二级类别id")
  13. private String subjectId;
  14. }

2、定义service方法

接口

  1. void pageQuery(Page<Course> pageParam, CourseQuery courseQuery);

实现

  1. @Override
  2. public void pageQuery(Page<Course> pageParam, CourseQuery courseQuery) {
  3. QueryWrapper<Course> queryWrapper = new QueryWrapper<>();
  4. queryWrapper.orderByDesc("gmt_create");
  5. if (courseQuery == null){
  6. baseMapper.selectPage(pageParam, queryWrapper);
  7. return;
  8. }
  9. String title = courseQuery.getTitle();
  10. String teacherId = courseQuery.getTeacherId();
  11. String subjectParentId = courseQuery.getSubjectParentId();
  12. String subjectId = courseQuery.getSubjectId();
  13. if (!StringUtils.isEmpty(title)) {
  14. queryWrapper.like("title", title);
  15. }
  16. if (!StringUtils.isEmpty(teacherId) ) {
  17. queryWrapper.eq("teacher_id", teacherId);
  18. }
  19. if (!StringUtils.isEmpty(subjectParentId)) {
  20. queryWrapper.ge("subject_parent_id", subjectParentId);
  21. }
  22. if (!StringUtils.isEmpty(subjectId)) {
  23. queryWrapper.ge("subject_id", subjectId);
  24. }
  25. baseMapper.selectPage(pageParam, queryWrapper);
  26. }

3、定义web层方法

  1. @ApiOperation(value = "分页课程列表")
  2. @GetMapping("{page}/{limit}")
  3. public R pageQuery(
  4. @ApiParam(name = "page", value = "当前页码", required = true)
  5. @PathVariable Long page,
  6. @ApiParam(name = "limit", value = "每页记录数", required = true)
  7. @PathVariable Long limit,
  8. @ApiParam(name = "courseQuery", value = "查询对象", required = false)
  9. CourseQuery courseQuery){
  10. Page<Course> pageParam = new Page<>(page, limit);
  11. courseService.pageQuery(pageParam, courseQuery);
  12. List<Course> records = pageParam.getRecords();
  13. long total = pageParam.getTotal();
  14. return R.ok().data("total", total).data("rows", records);
  15. }

二、前端分页查询列表

1、定义api

course.js

  1. getPageList(page, limit, searchObj) {
  2. return request({
  3. url: `${api_name}/${page}/${limit}`,
  4. method: 'get',
  5. params: searchObj
  6. })
  7. },

2、组件中的js

src/views/edu/list.vue

<script>
import course from '@/api/edu/course'
import teacher from '@/api/edu/teacher'
import subject from '@/api/edu/subject'

export default {


data() {
  return {
    listLoading: true, // 是否显示loading信息
    list: null, // 数据列表
    total: 0, // 总记录数
    page: 1, // 页码
    limit: 10, // 每页记录数
    searchObj: {
      subjectParentId: '',
      subjectId: '',
      title: '',
      teacherId: ''
    }, // 查询条件
    teacherList: [], // 讲师列表
    subjectNestedList: [], // 一级分类列表
    subSubjectList: [] // 二级分类列表,
  }
},


created() { // 当页面加载时获取数据
  this.fetchData()
  // 初始化分类列表
  this.initSubjectList()
  // 获取讲师列表
  this.initTeacherList()
},



  methods: {
  fetchData(page = 1) { // 调用api层获取数据库中的数据
    console.log('加载列表')
    // 当点击分页组件的切换按钮的时候,会传输一个当前页码的参数page
    // 解决分页无效问题
    this.page = page
    this.listLoading = true
    course.getPageList(this.page, this.limit, this.searchObj).then(response => {
      // debugger 设置断点调试
      if (response.success === true) {
        this.list = response.data.rows
        this.total = response.data.total
      }
      this.listLoading = false
    })
  },


  initTeacherList() {
    teacher.getList().then(response => {
      this.teacherList = response.data.items
    })
  },


  initSubjectList() {
    subject.getNestedTreeList().then(response => {
      this.subjectNestedList = response.data.items
    })
  },


  subjectLevelOneChanged(value) {
    for (let i = 0; i < this.subjectNestedList.length; i++) {
      if (this.subjectNestedList[i].id === value) {
        this.subSubjectList = this.subjectNestedList[i].children
        this.searchObj.subjectId = ''
      }
    }
  },


  resetData() {
    this.searchObj = {}
    this.subSubjectList = [] // 二级分类列表
    this.fetchData()
  }
}

}
80
</script>

3、组件模板

查询表单

<!--查询表单-->
<el-form :inline="true" class="demo-form-inline">

  <!-- 所属分类:级联下拉列表 -->
  <!-- 一级分类 -->
  <el-form-item label="课程类别">
    <el-select
v-model="searchObj.subjectParentId"
placeholder="请选择"
@change="subjectLevelOneChanged">
  <el-option
v-for="subject in subjectNestedList"
:key="subject.id"
:label="subject.title"
:value="subject.id"/>
  </el-select>


<!-- 二级分类 -->
<el-select v-model="searchObj.subjectId" placeholder="请选择">
  <el-option
v-for="subject in subSubjectList"
:key="subject.id"
:label="subject.title"
:value="subject.id"/>
  </el-select>
</el-form-item>


<!-- 标题 -->
<el-form-item>
  <el-input v-model="searchObj.title" placeholder="课程标题"/>
    </el-form-item>
<!-- 讲师 -->
<el-form-item>
    <el-select
v-model="searchObj.teacherId"
placeholder="请选择讲师">
  <el-option
v-for="teacher in teacherList"
:key="teacher.id"
:label="teacher.name"
:value="teacher.id"/>
  </el-select>
</el-form-item>


<el-button type="primary" icon="el-icon-search" @click="fetchData()">查询</el-button>
<el-button type="default" @click="resetData()">清空</el-button>

</el-form>

表格和分页
表格添加了 row-class-name=”myClassList” 样式定义

<!-- 表格 -->
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="数据加载中"
border
fit
highlight-current-row
row-class-name="myClassList">


  <el-table-column
label="序号"
width="70"
align="center">
  <template slot-scope="scope">
    {{ (page - 1) * limit + scope.$index + 1 }}
      </template>
</el-table-column>


<el-table-column label="课程信息" width="470" align="center">
  <template slot-scope="scope">
    <div class="info">
      <div class="pic">
        <img :src="scope.row.cover" alt="scope.row.title" width="150px">
          </div>
<div class="title">
  <a href="">{{ scope.row.title }}</a>
<p>{{ scope.row.lessonNum }}课时</p>
</div>
</div>


</template>
</el-table-column>


<el-table-column label="创建时间" align="center">
  <template slot-scope="scope">
    {{ scope.row.gmtCreate.substr(0, 10) }}
      </template>
</el-table-column>
<el-table-column label="发布时间" align="center">
  <template slot-scope="scope">
    {{ scope.row.gmtModified.substr(0, 10) }}
      </template>
</el-table-column>
<el-table-column label="价格" width="100" align="center" >
  <template slot-scope="scope">
    {{ Number(scope.row.price) === 0 ? '免费' :
    '¥' + scope.row.price.toFixed(2) }}
      </template>
</el-table-column>
<el-table-column prop="buyCount" label="付费学员" width="100" align="center" >
  <template slot-scope="scope">
    {{ scope.row.buyCount }}人
      </template>
</el-table-column>


<el-table-column label="操作" width="150" align="center">
  <template slot-scope="scope">
    <router-link :to="'/edu/course/info/'+scope.row.id">
      <el-button type="text" size="mini" icon="el-icon-edit">编辑课程信息</el-button>
</router-link>
<router-link :to="'/edu/course/chapter/'+scope.row.id">
  <el-button type="text" size="mini" icon="el-icon-edit">编辑课程大纲</el-button>
</router-link>
<el-button type="text" size="mini" icon="el-icon-delete">删除</el-button>
</template>
</el-table-column>

</el-table>

<!-- 分页 -->
<el-pagination
:current-page="page"
:page-size="limit"
:total="total"
style="padding: 30px 0; text-align: center;"
layout="total, prev, pager, next, jumper"
@current-change="fetchData"
/>

4、css的定义

<style scoped>
.myClassList .info {

   width: 450px;

   overflow: hidden;

}
.myClassList .info .pic {

  width: 150px;

  height: 90px;

  overflow: hidden;

  float: left;

}
.myClassList .info .pic a {

  display: block;

  width: 100%;

  height: 100%;

  margin: 0;

  padding: 0;

}
.myClassList .info .pic img {

  display: block;

  width: 100%;

}
.myClassList td .info .title {

  width: 280px;

  float: right;

  height: 90px;

}
.myClassList td .info .title a {

  display: block;

  height: 48px;

  line-height: 24px;

  overflow: hidden;

  color: #00baf2;

  margin-bottom: 12px;

}
.myClassList td .info .title p {

  line-height: 20px;

  margin-top: 5px;

  color: #818181;

}
</style>