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()">价格
<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"> </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)"><</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)">></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()">
价格
<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)"
><</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)"
>></a>
<a
:class="{undisable: !data.hasNext}"
href="#"
title="末页"
@click.prevent="gotoPage(data.pages)"
>末</a>
<div class="clear"/>
</div>
</div>