课程列表前端整合

1、api定义课程接口

在api目录下创建course.js文件。

java 复制代码
import request from '@/utils/request'
export default {
  //带条件分页查询课程列表
  getTeacherPageVo(current,limit,courseQueryVo){
    return request({
      url: `/eduservice/courseapi/getFrontCourseList/${current}/${limit}`,
      method: 'post',
      data:courseQueryVo
    })
  },
  //根据id查询课程详情
  getCourseInfo(id){
    return request({
      url: `/eduservice/courseapi/getCourseInfo/${id}`,
      method: 'get'
    })
  }
}

2、初始化实现

(1)在pages/course/index.vue中实现js

java 复制代码
<script>
import course from "@/api/course"
export default {
  data () {
    return {
      page:1,
      data:{},
      subjectNestedList: [], // 一级分类列表
      subSubjectList: [], // 二级分类列表
      searchObj: {}, // 查询表单对象
      oneIndex:-1,
      twoIndex:-1,
      buyCountSort:"",
      gmtCreateSort:"",
      priceSort:""
    }
  },
  created () {
    this.getListCourse()
  },
  methods: {
    //查询课程列表方法
    getListCourse(){
      course.getFrontCourseList(1,8,this.searchObj)
      .then(response=>{
        this.data = response.data.data
      })
    }
  }

};
</script>

(2)pages/course/index.vue页面实现

java 复制代码
<template>
  <div id="aCoursesList" class="bg-fa of">
    <!-- /课程列表 开始 -->
    <section class="container">
      <header class="comm-title">
        <h2 class="fl tac">
          <span class="c-333">全部课程</span>
        </h2>
      </header>
      <section class="c-sort-box">
        <section class="c-s-dl">
          <dl>
            <dt>
              <span class="c-999 fsize14">课程类别</span>
            </dt>
            <dd class="c-s-dl-li">
              <ul class="clearfix">
                <li>
                  <a title="全部" href="javascript:void(0);" @click="searchOne('')">全部</a>
                </li>
                <li v-for="(item,index) in subjectNestedList" :key="index" :class="{active:oneIndex==index}">
                  <a :title="item.title" href="javascript:void(0);" @click="searchOne(item.id, index)">{{ item.title }}</a>
                </li>
              </ul>
            </dd>
          </dl>
          <dl>
            <dt>
              <span class="c-999 fsize14"/>
            </dt>
            <dd class="c-s-dl-li">
              <ul class="clearfix">
                <li v-for="(item,index) in subSubjectList" :key="index" :class="{active:twoIndex==index}">
                  <a :title="item.title" href="javascript:void(0);" @click="searchTwo(item.id, index)">{{ item.title }}</a>
                </li>
              </ul>
            </dd>
          </dl>
          <div class="clear"/>
        </section>
        <div class="js-wrap">
          <section class="fr">
            <span class="c-ccc">
              <i class="c-master f-fM">1</i>/
              <i class="c-666 f-fM">1</i>
            </span>
          </section>
          <section class="fl">
            <ol class="js-tap clearfix">
              <li :class="{'current bg-orange':buyCountSort!=''}">
                <a title="销量" href="javascript:void(0);" @click="searchBuyCount()">销量
                  <span :class="{hide:buyCountSort==''}">↓</span>
                </a>
              </li>
              <li :class="{'current bg-orange':gmtCreateSort!=''}">
                <a title="最新" href="javascript:void(0);" @click="searchGmtCreate()">最新
                  <span :class="{hide:gmtCreateSort==''}">↓</span>
                </a>
              </li>
              <li :class="{'current bg-orange':priceSort!=''}">
                <a title="价格" href="javascript:void(0);" @click="searchPrice()">价格&nbsp;
                  <span :class="{hide:priceSort==''}">↓</span>
                </a>
              </li>
            </ol>
          </section>
        </div>
        <div class="mt40">
          <!-- /无数据提示 开始-->
          <section v-if="data.total==0" class="no-data-wrap">
            <em class="icon30 no-data-ico">&nbsp;</em>
            <span class="c-666 fsize14 ml10 vam">没有相关数据,小编正在努力整理中...</span>
          </section>
          <!-- /无数据提示 结束-->
          <!-- 数据列表 开始-->
          <article v-if="data.total>0" class="comm-course-list">
            <ul id="bna" class="of">
              <li v-for="item in data.items" :key="item.id">
                <div class="cc-l-wrap">
                  <section class="course-img">
                    <img :src="item.cover" class="img-responsive" alt="item.title">
                    <div class="cc-mask">
                      <a :href="'/course/'+item.id" title="开始学习" class="comm-btn c-btn-1">开始学习</a>
                    </div>
                  </section>
                  <h3 class="hLh30 txtOf mt10">
                    <a :href="'/course/'+item.id" :title="item.title" class="course-title fsize18 c-333">{{ item.title }}</a>
                  </h3>
                  <section class="mt10 hLh20 of">
                    <span v-if="Number(item.price) === 0" class="fr jgTag bg-green">
                      <i class="c-fff fsize12 f-fA">免费</i>
                    </span>
                    <span v-else class="fr jgTag bg-green">
                      <i class="c-fff fsize12 f-fA">{{ item.price }}</i>
                    </span>
                    <span class="fl jgAttr c-ccc f-fA">
                      <i class="c-999 f-fA">{{ item.buyCount }}人学习</i>
                      <i class="c-999 f-fA">{{ item.viewCount }}人评论</i>
                    </span>
                  </section>
                </div>
              </li>
            </ul>
            <div class="clear"/>
          </article>
          <!-- /数据列表 结束-->
        </div>
        <!-- 公共分页 开始 -->
        <div>
          <div class="paging">
            <!-- undisable这个class是否存在,取决于数据属性hasPrevious -->
            <a
              :class="{undisable: !data.hasPrevious}"
              href="#"
              title="首页"
              @click.prevent="gotoPage(1)">首</a>
            <a
              :class="{undisable: !data.hasPrevious}"
              href="#"
              title="前一页"
              @click.prevent="gotoPage(data.current-1)">&lt;</a>
            <a
              v-for="page in data.pages"
              :key="page"
              :class="{current: data.current == page, undisable: data.current == page}"
              :title="'第'+page+'页'"
              href="#"
              @click.prevent="gotoPage(page)">{{ page }}</a>
            <a
              :class="{undisable: !data.hasNext}"
              href="#"
              title="后一页"
              @click.prevent="gotoPage(data.current+1)">&gt;</a>
            <a
              :class="{undisable: !data.hasNext}"
              href="#"
              title="末页"
              @click.prevent="gotoPage(data.pages)">末</a>
            <div class="clear"/>
          </div>
        </div>
        <!-- 公共分页 结束 -->
      </section>
    </section>
    <!-- /课程列表 结束 -->
  </div>
</template>
<script>
import course from '@/api/course'

export default {

  data() {
    return {
      page: 1,
      data: {},
      subjectNestedList: [], // 一级分类列表
      subSubjectList: [], // 二级分类列表
      searchObj: {}, // 查询表单对象
      oneIndex: -1,
      twoIndex: -1,
      buyCountSort: '',
      gmtCreateSort: '',
      priceSort: ''
    }
  },

  // 加载完渲染时
  created() {
    // 获取课程列表
    this.initCourse()

    // 获取分类
    this.initSubject()
  },

  methods: {
    // 查询课程列表
    initCourse() {
      course.getPageList(1, 8, this.searchObj).then(response => {
        this.data = response.data.data
      })
    },
    // 查询所有一级分类
    initSubject() {
      // debugger
      course.getNestedTreeList2().then(response => {
        this.subjectNestedList = response.data.data.allSubject
      })
    },

    // 点击一级分类,显示对应的二级分类,查询数据
    searchOne(subjectParentId, index) {
      // debugger
      this.oneIndex = index
      this.twoIndex = -1

      this.searchObj.subjectId = ''
      this.subSubjectList = []

      this.searchObj.subjectParentId = subjectParentId
      this.gotoPage(this.page)

      for (let i = 0; i < this.subjectNestedList.length; i++) {
        if (this.subjectNestedList[i].id === subjectParentId) {
          this.subSubjectList = this.subjectNestedList[i].children
        }
      }
    },

    // 点击二级分类,查询数据
    searchTwo(subjectId, index) {
      this.twoIndex = index
      this.searchObj.subjectId = subjectId
      this.gotoPage(this.page)
    },
    // 购买量查询
    searchBuyCount() {
      this.buyCountSort = '1' // 购买数量
      this.gmtCreateSort = '' // 更新时间
      this.priceSort = '' //  价格
      // 赋值查询条件
      this.searchObj.buyCountSort = this.buyCountSort
      this.searchObj.gmtCreateSort = this.gmtCreateSort
      this.searchObj.priceSort = this.priceSort
      // 调用分页查询
      this.gotoPage(this.page)
    },
    // 更新时间查询
    searchGmtCreate() {
      this.buyCountSort = '' // 购买数量
      this.gmtCreateSort = '1' // 更新时间
      this.priceSort = '' // 价格
      // 赋值查询条件
      this.searchObj.buyCountSort = this.buyCountSort
      this.searchObj.gmtCreateSort = this.gmtCreateSort
      this.searchObj.priceSort = this.priceSort
      // 调用分页查询
      this.gotoPage(this.page)
    },
    // 价格查询
    searchPrice() {
      this.buyCountSort = '' // 购买数量
      this.gmtCreateSort = '' // 更新时间
      this.priceSort = '1' // 价格
      // 赋值查询条件
      this.searchObj.buyCountSort = this.buyCountSort
      this.searchObj.gmtCreateSort = this.gmtCreateSort
      this.searchObj.priceSort = this.priceSort
      // 调用分页查询
      this.gotoPage(this.page)
    },
    // 分页查询
    gotoPage(page) {
      this.page = page
      course.getPageList(page, 8, this.searchObj).then(response => {
        this.data = response.data.data
      })
    }
  }
}
</script>
<style scoped>
  .active {
    background: #bdbdbd;
  }
  .hide {
    display: none;
  }
  .show {
    display: block;
  }
</style>

3、实现课程分类条件查询

(1)实现目标

(2)创建查询课程分类的api接口 在api目录下创建subject.js文件。

java 复制代码
import request from '@/utils/request'
export default {
  //查询课程分类
  getAllSubject() {
    return request({
      url: `/eduservice/edusubject`,
      method: 'get'
    })
  }

}

(3)pages/course/index.vue页面js方法实现

java 复制代码
export default {
  data () {
    return {
      page:1,
      data:{},
      subjectNestedList: [], // 一级分类列表
      subSubjectList: [], // 二级分类列表
      searchObj: {}, // 查询表单对象
      oneIndex:-1,
      twoIndex:-1,
      buyCountSort:"",
      gmtCreateSort:"",
      priceSort:""
    }
  },
  created () {
    this.getListCourse()
    this.getOneAllSubject()
  },
  methods: {
    //查询课程列表方法
    getListCourse(){
      //清空查询条件
      this.searchObj ={}
      //清空二级分类
      this.subSubjectList = []

      course.getFrontCourseList(1,8,this.searchObj)
      .then(response=>{
        this.data = response.data.data
      })
    },
    //分页方法
    gotoPage(page=1){
      this.page=page
      course.getFrontCourseList(this.page,8,this.searchObj)
      .then(response=>{
        this.data = response.data.data
      })
    },

    //查询所有一级分类信息
    getOneAllSubject(){
      subject.getAllSubject().then(response=>{
        this.subjectNestedList=response.data.data.allSubject
      })
    },
    //根据一级分类显示对应二级分类
     showTwoByOne(oneId){
       console.log(oneId)
       //点击一级分类赋值给条件查询对象searchObj,进行查询
       this.searchObj.subjectParentId = oneId
       this.searchObj.subjectId = ""
        this.gotoPage(1)
      //当前点击一级分类id,和所有一级分类id进行比较
      //如果id相同,把id对应的二级分类信息取出来
      for(let i=0;i<this.subjectNestedList.length;i++){
        let oneSubject = this.subjectNestedList[i]
        if(oneId === oneSubject.id){
          this.subSubjectList = oneSubject.children
        }
      }

     },
     //根据二级分类查询数据
     getDataByTwo(twoId){
       //设置查询条件
       this.searchObj.subjectId = twoId
       //调用分页查询
        this.gotoPage(1)

     }

  }

};
</script>

(4)pages/course/index.vue页面改造

java 复制代码
<dt>
              <span class="c-999 fsize14">课程类别</span>
            </dt>
            <dd class="c-s-dl-li">
              <ul class="clearfix">
                <li>
                  <a title="全部" href="#" @click="getListCourse()">全部</a>
                </li>
                <li v-for="(item,index) in subjectNestedList" :key="index">
                  <a :title="item.title" href="#" @click="showTwoByOne(item.id)">{{item.title}}</a>
                </li>
               
              </ul>
            </dd>
          </dl>
          <dl>
            <dt>
              <span class="c-999 fsize14"></span>
            </dt>
            <dd class="c-s-dl-li">
              <ul class="clearfix">
                <li v-for="(item,index) in subSubjectList" :key="index">
                  <a :title="item.title" href="#" @click="getDataByTwo(item.id)">{{item.title}}</a>
                </li>
               
              </ul>
            </dd>
          </dl>
          <div class="clear"></div>
        </section>

4、实现不同维度排序

(1)pages/course/index.vue实现js方法

java 复制代码
//关注度排序
    searchBuyCount() {
      //关注度设置值,清空另外两个
      this.buyCountSort = "1"; //关注度
      this.gmtCreateSort = ""; //时间
      this.priceSort = ""; //价格
      //赋值给查询条件
      this.searchObj.buyCountSort = this.buyCountSort;
      this.searchObj.gmtCreateSort = this.gmtCreateSort;
      this.searchObj.priceSort = this.priceSort;
      //调用分页查询
      this.gotoPage(1);
    },
    //最新排序
    searchGmtCreate() {
      //关注度设置值,清空另外两个
      this.buyCountSort = ""; //关注度
      this.gmtCreateSort = "1"; //时间
      this.priceSort = ""; //价格
      //赋值给查询条件
      this.searchObj.buyCountSort = this.buyCountSort;
      this.searchObj.gmtCreateSort = this.gmtCreateSort;
      this.searchObj.priceSort = this.priceSort;
      //调用分页查询
      this.gotoPage(1);
    },
    //价格排序
    searchPrice() {
      //关注度设置值,清空另外两个
      this.buyCountSort = ""; //关注度
      this.gmtCreateSort = ""; //时间
      this.priceSort = "1"; //价格
      //赋值给查询条件
      this.searchObj.buyCountSort = this.buyCountSort;
      this.searchObj.gmtCreateSort = this.gmtCreateSort;
      this.searchObj.priceSort = this.priceSort;
      //调用分页查询
      this.gotoPage(1);
    }

(2)pages/course/index.vue页面改造

java 复制代码
<section class="fl">
            <ol class="js-tap clearfix">
              <li>
                <a title="关注度" href="#" @click="searchBuyCount()">关注度</a>
              </li>
              <li>
                <a title="最新" href="#" @click="searchGmtCreate()">最新</a>
              </li>
              <li class="current bg-orange">
                <a title="价格" href="#" @click="searchPrice()">
                  价格&nbsp;
                  <span>↓</span>
                </a>
              </li>
            </ol>
          </section>

5、实现分页

java 复制代码
<div>
          <div class="paging">
            <!-- undisable这个class是否存在,取决于数据属性hasPrevious -->
            <a
              :class="{undisable: !data.hasPrevious}"
              href="#"
              title="首页"
              @click.prevent="gotoPage(1)"
            >首</a>
            <a
              :class="{undisable: !data.hasPrevious}"
              href="#"
              title="前一页"
              @click.prevent="gotoPage(data.current-1)"
            >&lt;</a>
            <a
              v-for="page in data.pages"
              :key="page"
              :class="{current: data.current == page, undisable: data.current == page}"
              :title="'第'+page+'页'"
              href="#"
              @click.prevent="gotoPage(page)"
            >{{ page }}</a>
            <a
              :class="{undisable: !data.hasNext}"
              href="#"
              title="后一页"
              @click.prevent="gotoPage(data.current+1)"
            >&gt;</a>
            <a
              :class="{undisable: !data.hasNext}"
              href="#"
              title="末页"
              @click.prevent="gotoPage(data.pages)"
            >末</a>
            <div class="clear"/>
          </div>
        </div>
相关推荐
也无晴也无风雨36 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang1 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤5 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui