提交 36d20ed9 authored 作者: 王鹏飞's avatar 王鹏飞

知识点修改

上级 e4609e8c
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
{{subItem.name}} {{subItem.name}}
<template v-if="subItem.free">(免费)</template> <template v-if="subItem.free">(免费)</template>
</div> </div>
<!-- <div class="progress">{{subItem.video_progress | progressText}}</div> --> <div class="progress" v-if="showProgress">{{ progressText(subItem.video_progress) }}</div>
</li> </li>
</ul> </ul>
</van-collapse-item> </van-collapse-item>
...@@ -22,10 +22,8 @@ ...@@ -22,10 +22,8 @@
export default { export default {
props: { props: {
courseId: String, courseId: String,
data: { data: { type: Array, default: () => [] },
type: Array, showProgress: { type: Boolean, default: false }
default: () => []
}
}, },
data() { data() {
return { return {
...@@ -35,20 +33,30 @@ export default { ...@@ -35,20 +33,30 @@ export default {
computed: { computed: {
isWeapp() { isWeapp() {
return this.$store.state.isWeapp return this.$store.state.isWeapp
},
isVip() {
return this.$store.state.isVip
} }
}, },
filters: { methods: {
progressText(value) { progressText(value) {
value = parseInt(value) value = parseInt(value)
return value === 100 ? '已学完' : `${value}%` if (value === 0) {
return this.isVip ? '未开始' : '未开通'
} }
if (value === 100) {
return '已学完'
}
return `已学${value}%`
}, },
methods: {
onClick(data) { onClick(data) {
if (this.isWeapp) { if (this.isWeapp) {
wx.miniProgram.navigateTo({ let url = `/pages/course/item?id=${this.courseId}&chapter_id=${data.id}`
url: `/pages/course/item?id=${this.courseId}&chapter_id=${data.id}` // 未开通
}) if (!data.free && !this.isVip) {
url = `/pages/web/index?src=${window.location.origin}/pay`
}
wx.miniProgram.navigateTo({ url })
} else { } else {
window.alert('请在微信小程序中打开') window.alert('请在微信小程序中打开')
} }
......
<template> <template>
<div class="course-item" @click="onClick(data)"> <div class="course-item custom-class" :style="isOpen ? 'padding-bottom:0;' : ''">
<div class="course-item-pic" v-if="curriculum.curriculum_picture"> <div class="course-item-top" @click="toggleChild">
<img :src="curriculum.curriculum_picture" /> <div class="course-arrow" :class="isOpen ? 'course-arrow__up' : 'course-arrow__down'"></div>
</div> <img class="course-item-pic" :src="data.photo" v-if="data.photo" />
<div class="course-item-content"> <div class="course-item-content">
<h3 class="course-item__title">{{data.course_name}}</h3> <div class="course-item__title">{{ data.title }}</div>
<div class="course-item__text" v-html="curriculum.curriculum_represent"></div> <div class="course-item__tools">
<div>
<div
class="course-item__text course-item__text__freevideo"
>{{ data.free_video_num }}个免费视频</div>
</div>
<div class="course-item__text course-item__text__video">{{ data.video_num }}节视频课</div>
<div class="course-item__text course-item__text__course">{{ data.course_num }}节课</div>
</div>
</div>
</div>
<div class="course-item-bottom" v-show="isOpen">
<div class="course-child" v-for="item in data.child" :key="item.id" @click="onClick(item)">
<div class="name">{{item.course_name}}</div>
<div class="progress" v-if="showProgress">{{item.video_progress | progressText}}</div>
</div>
</div> </div>
</div> </div>
</template> </template>
...@@ -13,28 +28,30 @@ ...@@ -13,28 +28,30 @@
<script> <script>
export default { export default {
name: 'CourseItem', name: 'CourseItem',
props: { props: { data: Object, showProgress: { type: Boolean, default: false } },
data: { type: Object, required: true } data() {
}, return {
computed: { isOpen: false
curriculum() { }
return this.data.curriculum
}, },
isWeapp() { filters: {
return this.$store.state.isWeapp progressText(value) {
value = parseInt(value)
if (value === 0) {
return '未开始'
}
if (value === 100) {
return '已学完'
}
return `已学${value}%`
} }
}, },
methods: { methods: {
toggleChild() {
this.isOpen = !this.isOpen
},
onClick(data) { onClick(data) {
if (this.isWeapp) { this.$emit('on-click', data)
const url = `/pages/web/index?src=${window.location.origin}/course/learn/${data.course_id}`
wx.miniProgram.navigateTo({ url })
} else {
this.$router.push({
name: 'courseLearnItem',
params: { id: data.course_id }
})
}
} }
} }
} }
...@@ -42,9 +59,32 @@ export default { ...@@ -42,9 +59,32 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.course-item { .course-item {
padding: 0.3rem 0;
border-bottom: 1px solid #ccc;
}
.course-arrow {
width: 0.6rem;
height: 2rem;
}
.course-arrow__up {
background: url('https://zws-imgs-pub.ezijing.com/transport/weapp/icon_arrow_up.png') no-repeat left center;
background-size: 0.3rem 0.3rem;
}
.course-arrow__down {
background: url('https://zws-imgs-pub.ezijing.com/transport/weapp/icon_arrow_down.png') no-repeat left center;
background-size: 0.3rem 0.3rem;
}
.course-item-top {
display: flex; display: flex;
padding: 0.4rem 0; }
border-bottom: 1px solid #f1f1f1; .course-item-bottom {
padding-left: 0.6rem;
}
.course-item-pic {
width: 3.15rem;
height: 2rem;
margin-right: 0.15rem;
overflow: hidden;
} }
.course-item-content { .course-item-content {
flex: 1; flex: 1;
...@@ -53,40 +93,61 @@ export default { ...@@ -53,40 +93,61 @@ export default {
justify-content: space-between; justify-content: space-between;
overflow: hidden; overflow: hidden;
} }
.course-item-pic {
width: 2.4rem;
height: 1.35rem;
margin-right: 10px;
border-radius: 6px;
overflow: hidden;
margin-right: 0.2rem;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.course-item__title { .course-item__title {
margin: 0; font-size: 0.26rem;
font-size: 0.3rem; color: #666;
font-weight: 400;
color: #222;
display: -webkit-box; display: -webkit-box;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
overflow: hidden; overflow: hidden;
} }
.course-item__text { .course-item__text {
max-height: 0.34rem; display: inline-block;
font-size: 0.26rem; height: 0.48rem;
padding: 0 0.2rem;
font-size: 0.24rem;
line-height: 0.48rem;
text-align: center;
box-sizing: border-box;
}
.course-item__text + .course-item__text {
margin-left: 0.1rem;
}
.course-item__text__course {
color: #fff;
background-color: #75b0ff;
}
.course-item__text__video {
min-width: 1.8rem;
color: #fff;
background-color: #5ad0b2;
}
.course-item__text__freevideo {
min-width: 1.8rem;
margin-bottom: 0.1rem;
color: #fff;
background-color: #d05a5a;
}
.course-child {
display: flex;
align-items: center;
padding: 15px 15px 15px 0;
border-bottom: 1px solid #eee;
background: url('https://zws-imgs-pub.ezijing.com/transport/weapp/icon_arrow.png') no-repeat right center;
background-size: 5px 10px;
.name {
flex: 1;
font-size: 13px;
color: #666;
}
.progress {
margin-left: 20px;
font-size: 12px;
color: #999; color: #999;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
::v-deep p {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
} }
} }
.course-child:last-child {
border-bottom: 0;
}
</style> </style>
<template>
<div class="course-item custom-class" :style="isOpen ? 'padding-bottom:0;' : ''">
<div class="course-item-top" @click="toggleChild">
<div class="course-arrow" :class="isOpen ? 'course-arrow__up' : 'course-arrow__down'"></div>
<img class="course-item-pic" :src="data.photo" v-if="data.photo" />
<div class="course-item-content">
<div class="course-item__title">{{ data.title }}</div>
<div class="course-item__tools">
<div>
<div
class="course-item__text course-item__text__freevideo"
>{{ data.free_video_num }}个免费视频</div>
</div>
<div class="course-item__text course-item__text__video">{{ data.video_num }}节视频课</div>
<div class="course-item__text course-item__text__course">{{ data.course_num }}节课</div>
</div>
</div>
</div>
<div class="course-item-bottom" v-show="isOpen">
<div
class="course-child"
v-for="item in data.child"
:key="item.id"
@click="onClick(item)"
>{{ item.course_name }}</div>
</div>
</div>
</template>
<script>
export default {
name: 'CourseItem',
props: { data: Object },
data() {
return {
isOpen: false
}
},
methods: {
toggleChild() {
this.isOpen = !this.isOpen
},
onClick(data) {
this.$emit('on-click', data)
}
}
}
</script>
<style lang="scss" scoped>
.course-item {
padding: 0.3rem 0;
border-bottom: 1px solid #ccc;
}
.course-arrow {
width: 0.6rem;
height: 2rem;
}
.course-arrow__up {
background: url('https://zws-imgs-pub.ezijing.com/transport/weapp/icon_arrow_up.png') no-repeat left center;
background-size: 0.3rem 0.3rem;
}
.course-arrow__down {
background: url('https://zws-imgs-pub.ezijing.com/transport/weapp/icon_arrow_down.png') no-repeat left center;
background-size: 0.3rem 0.3rem;
}
.course-item-top {
display: flex;
}
.course-item-bottom {
padding-left: 0.6rem;
}
.course-item-pic {
width: 3.15rem;
height: 2rem;
margin-right: 0.15rem;
overflow: hidden;
}
.course-item-content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
overflow: hidden;
}
.course-item__title {
font-size: 0.26rem;
color: #666;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.course-item__text {
display: inline-block;
height: 0.48rem;
padding: 0 0.2rem;
font-size: 0.24rem;
line-height: 0.48rem;
text-align: center;
box-sizing: border-box;
}
.course-item__text + .course-item__text {
margin-left: 0.1rem;
}
.course-item__text__course {
color: #fff;
background-color: #75b0ff;
}
.course-item__text__video {
min-width: 1.8rem;
color: #fff;
background-color: #5ad0b2;
}
.course-item__text__freevideo {
min-width: 1.8rem;
margin-bottom: 0.1rem;
color: #fff;
background-color: #d05a5a;
}
.course-child {
font-size: 13px;
color: #666;
padding: 15px 15px 15px 0;
border-bottom: 1px solid #eee;
background: url('https://zws-imgs-pub.ezijing.com/transport/weapp/icon_arrow.png') no-repeat right center;
background-size: 5px 10px;
}
.course-child:last-child {
border-bottom: 0;
}
</style>
<template> <template>
<div class="main-container" v-show="loaded" style="margin:0 0.15rem"> <div class="main-container" v-show="loaded" style="margin:0 0.15rem">
<template v-if="list.length"> <template v-if="list.length">
<course-item v-for="item in list" :data="item" :key="item.course_id" @on-click="handleClick" /> <course-item v-for="item in list" :data="item" :key="item.id" @on-click="handleClick" />
</template> </template>
<van-empty description="暂无内容" v-else /> <van-empty description="暂无内容" v-else />
</div> </div>
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<script> <script>
import * as api from './api' import * as api from './api'
import CourseItem from '@/components/CourseItem2.vue' import CourseItem from '@/components/CourseItem.vue'
export default { export default {
name: 'Course', name: 'Course',
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
</template> </template>
<script> <script>
import CourseChapter from './components/courseChapter.vue' import CourseChapter from '@/components/CourseChapter.vue'
import CourseTag from '../tag/index.vue' import CourseTag from '../tag/index.vue'
import * as api from '@/api/course.js' import * as api from '@/api/course.js'
export default { export default {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<div class="course-tag-message-hd"> <div class="course-tag-message-hd">
<div class="course-tag-message__title">{{data.name}}</div> <div class="course-tag-message__title">{{data.name}}</div>
<div class="course-tag-message__more" @click="viewMore" v-if="hasMore"> <div class="course-tag-message__more" @click="viewMore" v-if="hasMore">
<span>更多</span> <span>{{moreText}}</span>
<van-icon name="arrow" /> <van-icon name="arrow" />
</div> </div>
</div> </div>
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
</template> </template>
<script> <script>
import { mapState } from 'vuex'
export default { export default {
name: 'CourseTagMessage', name: 'CourseTagMessage',
props: { props: {
...@@ -33,15 +34,26 @@ export default { ...@@ -33,15 +34,26 @@ export default {
} }
}, },
computed: { computed: {
...mapState(['isWeapp', 'isAndroid', 'isIos', 'isVip']),
hasMore() { hasMore() {
return this.data.tag ? this.data.tag.length > this.maxCount : false return this.data.tag ? this.data.tag.length > this.maxCount : false
}, },
isWeapp() { // 最多显示8条
return this.$store.state.isWeapp
},
// 最多现实8条
dataList() { dataList() {
return this.data.tag ? this.data.tag.slice(0, this.maxCount) : [] let list = this.data.tag || []
if (!this.isVip) {
list = list.filter(item => item.free)
}
return list.slice(0, this.maxCount)
},
moreText() {
if (this.isVip) {
return '更多'
}
if (this.isIos) {
return '更多请开通'
}
return '更多请购买'
} }
}, },
methods: { methods: {
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<script> <script>
import * as api from './api' import * as api from './api'
import CourseItem from '@/components/CourseItem2.vue' import CourseItem from '@/components/CourseItem.vue'
export default { export default {
name: 'Course', name: 'Course',
......
...@@ -99,9 +99,7 @@ export default { ...@@ -99,9 +99,7 @@ export default {
.then(response => { .then(response => {
const { code, msg: message } = response const { code, msg: message } = response
if (code === 0) { if (code === 0) {
this.bindVisitor(() => { this.bindVisitor(this.loginSuccess(response))
this.loginSuccess(response)
})
} else if (code === 1007) { } else if (code === 1007) {
this.$dialog({ this.$dialog({
confirmButtonText: '知道了', confirmButtonText: '知道了',
...@@ -138,15 +136,13 @@ export default { ...@@ -138,15 +136,13 @@ export default {
this.$toast(response.msg) this.$toast(response.msg)
} }
}, },
bindVisitor(callback) { // 绑定游客用户
const userId = window.localStorage.userId async bindVisitor(callback) {
const userId = this.$store.state.guestUser.user_id
if (userId) { if (userId) {
api.bindVisitor({ user_id: userId }).then(res => { await api.bindVisitor({ user_id: userId })
callback()
})
} else {
callback()
} }
callback && callback()
}, },
wechatLogin() { wechatLogin() {
const appId = 'wxc6044475caf2805a' const appId = 'wxc6044475caf2805a'
......
...@@ -2,16 +2,9 @@ import BaseAPI from '@/api/base_api' ...@@ -2,16 +2,9 @@ import BaseAPI from '@/api/base_api'
const httpRequest = new BaseAPI(webConf) const httpRequest = new BaseAPI(webConf)
/**
* 获取免费课程列表
*/
export function getFreeCourseList() {
return httpRequest.get('/zy/v2/education/freecourse')
}
/** /**
* 获取课程列表 * 获取课程列表
*/ */
export function getCourseList() { export function getCourseList() {
return httpRequest.get('/zy/v2/education/courses/list') return httpRequest.get('/zy/v2/education/mokuai')
} }
<template>
<div class="main-list" v-show="loaded">
<ul v-if="list.length && hasLearned">
<li v-for="item in list" :key="item.course_id" @click="onClick(item)">
<div class="name">{{item.course_name}}</div>
<div class="progress">{{item.video_progress | progressText}}</div>
</li>
</ul>
<van-empty description="您还没有学习课程,快快开始学习吧!" v-else />
</div>
</template>
<script>
import * as api from '../api'
export default {
name: 'BuyCourseList',
data() {
return {
loaded: false,
list: []
}
},
computed: {
isWeapp() {
return this.$store.state.isWeapp
},
// 是否学习过
hasLearned() {
return !!this.list.find(item => item.video_progress)
}
},
filters: {
progressText(value) {
value = parseInt(value)
if (value === 0) {
return '未开始'
}
if (value === 100) {
return '已学完'
}
return `已学${value}%`
}
},
methods: {
getList() {
api
.getCourseList()
.then(response => {
this.list = response
})
.finally(() => {
this.loaded = true
})
},
onClick(data) {
if (this.isWeapp) {
wx.miniProgram.navigateTo({
url: `/pages/web/index?src=${window.location.origin}/course/learn/${data.course_id}`
})
} else {
this.$router.push({ name: 'courseLearnItem', params: { id: data.course_id } })
}
}
},
beforeMount() {
this.getList()
}
}
</script>
<style lang="scss" scoped>
.main-list li {
display: flex;
align-items: center;
padding: 20px 0;
border-bottom: 1px solid #f1f1f1;
&:last-child {
border-bottom: 0;
}
.name {
flex: 1;
font-size: 15px;
color: #222;
}
.progress {
margin-left: 20px;
font-size: 12px;
color: #999;
}
}
</style>
<template>
<div class="main-list" v-show="loaded">
<ul v-if="list.length && hasLearned">
<li v-for="item in list" :key="item.course_id" @click="onClick(item)">
<div class="pic" v-if="item.picture">
<img :src="item.picture" />
</div>
<div class="name">{{item.course_name}}</div>
<div class="progress">{{item.video_progress | progressText}}</div>
</li>
</ul>
<van-empty description="您还没有学习课程,快快开始学习吧!" v-else />
</div>
</template>
<script>
import * as api from '../api'
export default {
name: 'BuyCourseList',
data() {
return {
loaded: false,
list: []
}
},
computed: {
isWeapp() {
return this.$store.state.isWeapp
},
// 是否学习过
hasLearned() {
return !!this.list.find(item => item.video_progress)
}
},
filters: {
progressText(value) {
value = parseInt(value)
if (value === 0) {
return '未开始'
}
if (value === 100) {
return '已学完'
}
return `已学${value}%`
}
},
methods: {
getList() {
api
.getFreeCourseList()
.then(response => {
this.list = response
})
.finally(() => {
this.loaded = true
})
},
onClick(data) {
if (this.isWeapp) {
wx.miniProgram.navigateTo({
url: `/pages/course/free?id=${data.course_id}`
})
} else {
window.alert('请在微信小程序中打开')
}
}
},
beforeMount() {
this.getList()
}
}
</script>
<style lang="scss" scoped>
.main-list li {
display: flex;
align-items: center;
padding: 20px 0;
border-bottom: 1px solid #f1f1f1;
&:last-child {
border-bottom: 0;
}
.pic {
width: 100px;
height: 64px;
margin-right: 10px;
border-radius: 6px;
overflow: hidden;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.name {
flex: 1;
align-self: flex-start;
font-size: 15px;
color: #222;
}
.progress {
margin-left: 20px;
font-size: 12px;
color: #999;
}
}
</style>
<template> <template>
<div class="main-container"> <div class="main-container" v-show="loaded" style="margin:0 0.15rem">
<div class="learn-choose"> <template v-if="list.length && hasLearned">
<van-cell title="选择已学课程:" :value="selectedItem.name" is-link @click="popupVisible = true" /> <course-item
</div> v-for="item in list"
<!-- 已学课程 --> :data="item"
<template v-if="selectedItem.type === 1"> :key="item.id"
<buy-course-list v-if="isVip" /> :show-progress="true"
<template v-else> @on-click="handleClick"
<van-empty
image="https://zws-imgs-pub.ezijing.com/transport/weapp/empty.png"
description="快去开启全部考试服务,一起加油考证吧!"
class="custom-empty"
/> />
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="toCourse">学更多课程</div>
</div>
</div>
</template> </template>
</template> <van-empty description="您还没有学习课程,快快开始学习吧!" v-else />
<!-- 试题课程 -->
<free-course-list v-else />
<van-popup
v-model="popupVisible"
position="bottom"
:safe-area-inset-bottom="true"
@open="popupOpen"
>
<ul class="popup-list">
<li
:class="item.selected ? 'is-active' : ''"
v-for="item in chooseList"
:key="item.type"
@click="changeSelected(item)"
>{{ item.name }}</li>
</ul>
<div class="popup-buttons">
<van-button type="primary" @click="popupVisible = false">取消</van-button>
<van-button type="primary" @click="primaryChangeFilterType">确定</van-button>
</div>
</van-popup>
</div> </div>
</template> </template>
<script> <script>
import BuyCourseList from './components/buyCourseList.vue' import * as api from './api'
import FreeCourseList from './components/freeCourseList.vue' import CourseItem from '@/components/CourseItem.vue'
export default { export default {
metaInfo: { title: '已学课程' }, name: 'Course',
components: { BuyCourseList, FreeCourseList }, components: { CourseItem },
metaInfo: {
title: '已学课程'
},
data() { data() {
return { return {
popupVisible: false, loaded: false,
chooseList: [ list: []
{ type: 1, name: '课程学习', selected: true },
{ type: 2, name: '试听课程', selected: false }
],
selectedItem: { type: 1, name: '课程学习' }
} }
}, },
computed: { computed: {
isWeapp() { isWeapp() {
return this.$store.state.isWeapp return this.$store.state.isWeapp
}, },
isVip() { // 是否学习过
return this.$store.state.isVip hasLearned() {
for (const item of this.list) {
const found = item.child.find(item => item.course_progress)
if (found) {
return true
}
}
return false
} }
}, },
methods: { methods: {
popupOpen() { getCourseList() {
this.changeSelected(this.selectedItem) api
}, .getCourseList()
changeSelected(data) { .then(response => {
this.chooseList = this.chooseList.map(item => { this.list = response
item.selected = item.type === data.type })
return item .finally(() => {
this.loaded = true
}) })
}, },
// 确定选择 handleClick(data) {
primaryChangeFilterType() {
const found = this.chooseList.find(item => item.selected)
this.selectedItem = found
this.popupVisible = false
},
toCourse(data) {
if (this.isWeapp) { if (this.isWeapp) {
const url = `/pages/web/index?src=${window.location.origin}/payPage` const url = `/pages/web/index?src=${window.location.origin}/my/learn/${data.id}`
wx.miniProgram.navigateTo({ url }) wx.miniProgram.navigateTo({ url })
} else { } else {
this.$router.push({ name: 'courseLearn' }) this.$router.push({
name: 'myLearnItem',
params: { id: data.id }
})
} }
} }
}, },
beforeMount() { beforeMount() {
// 检测是否是付费用户 this.getCourseList()
this.$store.dispatch('checkIsVip')
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss">
.learn-choose { .course-item:last-child {
border-bottom: 1px solid #f1f1f1; border-bottom: 0;
}
::v-deep .van-cell {
padding: 20px 0;
font-size: 15px;
font-weight: bold;
color: #222;
.van-cell__value {
color: #222;
}
.van-cell__right-icon {
color: #222;
}
}
.popup-list {
padding: 20px 0;
li {
padding: 20px 0;
font-size: 15px;
color: #000;
line-height: 1;
text-align: center;
&.is-active {
color: #c62245;
}
}
}
.popup-buttons {
display: flex;
padding: 10px 0;
::v-deep .van-button {
flex: 1;
height: 35px;
margin: 0 20px;
font-size: 15px;
background-color: #c62245;
border-radius: 6px;
border: 0;
}
} }
</style> </style>
<template>
<div class="main-container" v-if="loaded">
<course-chapter
:courseId="courseId"
:data="detail.chapters"
:show-progress="true"
v-if="detail.chapters && detail.chapters.length"
></course-chapter>
<van-empty description="暂无内容" v-else />
</div>
</template>
<script>
import CourseChapter from '@/components/CourseChapter.vue'
import * as api from '@/api/course.js'
export default {
name: 'CourseLearnItem',
components: { CourseChapter },
metaInfo() {
return {
title: this.detail.course_name || ''
}
},
data() {
return {
tabActive: 0,
loaded: false,
detail: {}
}
},
computed: {
courseId() {
return this.$route.params.id
}
},
methods: {
// 课程学习
getCourse() {
this.loaded = false
api.getCourse(this.courseId).then(response => {
this.loaded = true
response.chapters = response.chapters.filter(item => {
item.children = item.children.filter(
child => child.type === 2 && child.resource_id && child.resource_id !== '6684350363920760832'
)
return item.children.length
})
this.detail = response
})
}
},
beforeMount() {
this.getCourse()
}
}
</script>
<style lang="scss" scoped>
.course-title {
font-size: 15px;
font-weight: 600;
color: #222;
padding: 20px 0 10px;
}
.tab-content {
margin-left: -0.4rem;
margin-right: -0.4rem;
min-height: 100vh;
background: #eee;
padding: 0.4rem;
}
</style>
...@@ -81,12 +81,6 @@ export default [ ...@@ -81,12 +81,6 @@ export default [
name: 'courseLearnItem', name: 'courseLearnItem',
component: () => import('../pages/course/learn/item.vue') component: () => import('../pages/course/learn/item.vue')
}, },
// 课程学习详情
{
path: '/course/learn/:id/tag',
name: 'courseLearnTag',
component: () => import('../pages/course/tag/index.vue')
},
// 课程知识点 // 课程知识点
{ {
path: '/course/learn/:courseId/tag/:chapterId', path: '/course/learn/:courseId/tag/:chapterId',
...@@ -94,12 +88,6 @@ export default [ ...@@ -94,12 +88,6 @@ export default [
component: () => import('../pages/course/tag/list.vue') component: () => import('../pages/course/tag/list.vue')
}, },
// 课程知识点详情 // 课程知识点详情
{
path: '/course/tag',
name: 'courseTag',
component: () => import('../pages/course/tag/home.vue')
},
// 课程知识点详情
{ {
path: '/course/tag/:id', path: '/course/tag/:id',
name: 'courseTagItem', name: 'courseTagItem',
...@@ -209,7 +197,12 @@ export default [ ...@@ -209,7 +197,12 @@ export default [
{ {
path: '/my/learn', path: '/my/learn',
name: 'MyLearn', name: 'MyLearn',
component: () => import('../pages/my/learn/index.vue'), component: () => import('../pages/my/learn/index.vue')
meta: { requiredLogin: true } },
// 课程学习详情
{
path: '/my/learn/:id',
name: 'myLearnItem',
component: () => import('../pages/my/learn/item.vue')
} }
] ]
...@@ -11,6 +11,8 @@ const store = new Vuex.Store({ ...@@ -11,6 +11,8 @@ const store = new Vuex.Store({
token: '', token: '',
isVip: false, isVip: false,
isLogin: false, isLogin: false,
isIos: /iOS/.test(navigator.userAgent),
isAndroid: /Android/.test(navigator.userAgent),
isWeapp: /miniProgram/.test(navigator.userAgent), isWeapp: /miniProgram/.test(navigator.userAgent),
guestUser: { user_id: '', student_id: '' } guestUser: { user_id: '', student_id: '' }
}, },
...@@ -105,4 +107,7 @@ export default store ...@@ -105,4 +107,7 @@ export default store
// 获取环境 // 获取环境
store.dispatch('getEnv') store.dispatch('getEnv')
// 加载本地游客用户
store.dispatch('loadGuestUser') store.dispatch('loadGuestUser')
// 检测是否付费
store.dispatch('checkIsVip')
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论