123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- import CourseVideoItem from '@/business-components/course-video-item'
- import SectionDetail from '@/business-components/section-detail'
- import ColHeader from '@/components/col-header'
- import ColVideo from '@/components/col-video'
- import request from '@/helpers/request'
- import {
- Cell,
- Icon,
- Rate,
- Tab,
- Tabs,
- Image,
- Button,
- Sticky,
- Field,
- List,
- Toast,
- Dialog
- } from 'vant'
- import { defineComponent } from 'vue'
- import styles from './video-class-detail.module.less'
- import { state } from '@/state'
- import iconTeacher from '@common/images/icon_teacher.png'
- import ColResult from '@/components/col-result'
- import dayjs from 'dayjs'
- import { onSubmitZero, orderStatus } from '@/views/order-detail/orderStatus'
- export default defineComponent({
- name: 'VideoClassDetail',
- data() {
- const query = this.$route.query
- return {
- groupId: query.groupId,
- classId: query.classId,
- tabIndex: 1,
- title: '',
- lessonPrice: 0,
- useRelationType: '',
- alreadyBuy: false,
- videoDetail: {} as any,
- detailList: [],
- posterUrl: '',
- srcUrl: '',
- message: '',
- navHeight: 0 as any,
- currentClassIndex: 1,
- reload: false,
- videoContent: '',
- list: [],
- dataShow: true, // 判断是否有数据
- loading: false,
- finished: false,
- params: {
- page: 1,
- rows: 20
- },
- freeRate: 0, // 试看百分比
- trySee: false, // 是否试看
- videoHeight: '212px'
- }
- },
- computed: {
- users() {
- return state.user.data
- },
- offsetTop() {
- const navHeight: number = this.navHeight
- const top = Number(navHeight) + 44
- return top + 'px'
- }
- },
- async mounted() {
- // 处理视频显示
- const width = document.body.clientWidth || document.body.offsetWidth
- this.videoHeight = (width / 16) * 9 + 'px'
- this.navHeight = sessionStorage.getItem('navHeight') || 0
- try {
- //
- await this.__init()
- const config = await request.get(
- '/api-student/sysConfig/queryByParamNameList',
- {
- params: {
- paramNames: 'video_lesson_free_rate'
- }
- }
- )
- this.freeRate = config.data[0]?.paramValue || 0
- } catch {}
- this.getList()
- },
- methods: {
- async __init() {
- this.reload = true
- try {
- const res = await request.get(
- '/api-student/videoLesson/selectVideoLesson',
- {
- params: {
- groupId: this.groupId
- }
- }
- )
- const result = res.data || {}
- this.videoDetail = result.lessonGroup
- this.title = result.lessonGroup.lessonName
- this.lessonPrice = result.lessonGroup.lessonPrice
- this.useRelationType = result.lessonGroup.relationType
- this.alreadyBuy = result.alreadyBuy
- this.detailList = result.detailList || []
- this.trySee = !result.alreadyBuy
- this.detailList.forEach((item: any, index: number) => {
- if (item.id === Number(this.classId)) {
- this.posterUrl = item.coverUrl
- this.srcUrl = item.videoUrl
- this.title = item.videoTitle
- this.currentClassIndex = index + 1
- this.videoContent = item.videoContent
- }
- })
- } catch {
- //
- }
- this.reload = false
- },
- onSearch() {
- this.params.page = 1
- this.list = []
- this.dataShow = true // 判断是否有数据
- this.loading = false
- this.finished = false
- this.getList()
- },
- async getList() {
- try {
- const params = this.params
- const res = await request.post('/api-student/videoLesson/page', {
- data: {
- ...params,
- videoId: this.classId
- }
- })
- this.loading = false
- const result = res.data || {}
- // 处理重复请求数据
- if (this.list.length > 0 && result.pageNo === 1) {
- return
- }
- this.list = this.list.concat(result.rows || [])
- this.finished = result.pageNo >= result.totalPage
- this.params.page = result.pageNo + 1
- this.dataShow = this.list.length > 0
- } catch {
- this.dataShow = false
- this.finished = true
- }
- },
- onPlay(item: any) {
- // 判断是否点击的是当前播放的视频
- if (item.id === Number(this.classId)) {
- return
- }
- this.reload = true
- this.posterUrl = item.imgUrl
- this.srcUrl = item.videoUrl
- this.title = item.title
- this.currentClassIndex = item.index
- this.videoContent = item.content
- this.classId = item.id
- this.onSearch()
- setTimeout(() => {
- this.reload = false
- }, 0)
- },
- async onSubmit() {
- try {
- await request.post('/api-student/videoLesson/evaluate', {
- data: {
- isTeacher: 0,
- videoId: this.classId,
- content: this.message,
- studentId: state.user.data.userId
- }
- })
- Toast('评论成功')
- this.message = ''
- setTimeout(() => {
- this.onSearch()
- }, 500)
- } catch {}
- }
- },
- render() {
- return (
- <div class={styles['video-class-detail']}>
- {/* <Sticky offsetTop={0} position="top"> */}
- <ColHeader
- v-slots={{
- default: () =>
- !this.reload && (
- <ColVideo
- freeRate={Number(this.freeRate)}
- freeTitleStatus={this.lessonPrice > 0 ? true : false}
- trySee={this.trySee}
- src={this.srcUrl}
- poster={this.posterUrl}
- height={this.videoHeight}
- isBuy
- onBuyEmit={async () => {
- if (this.lessonPrice > 0) {
- this.$router.back()
- return
- }
- try {
- const userInfo = this.videoDetail
- orderStatus.orderObject.orderType = 'VIDEO'
- orderStatus.orderObject.orderName = '视频课购买'
- orderStatus.orderObject.orderDesc = '视频课购买'
- orderStatus.orderObject.actualPrice = userInfo.lessonPrice
- orderStatus.orderObject.recomUserId = ''
- orderStatus.orderObject.orderNo = ''
- orderStatus.orderObject.orderList = [
- {
- orderType: 'VIDEO',
- goodsName: '视频课购买',
- courseGroupId: userInfo.id,
- courseGroupName: userInfo.lessonName,
- coursePrice: userInfo.lessonPrice,
- teacherName:
- userInfo.username ||
- `游客${userInfo.teacherId || ''}`,
- teacherId: userInfo.teacherId,
- avatar: userInfo.headUrl,
- relationType: userInfo.relationType,
- courseInfo: this.detailList,
- recomUserId: ''
- }
- ]
- await onSubmitZero(() => {
- Dialog.alert({
- message: '领取成功',
- confirmButtonText: '确定',
- confirmButtonColor: '#2dc7aa'
- }).then(() => {
- this.__init()
- })
- })
- } catch {
- //
- }
- }}
- />
- )
- }}
- />
- {/* </Sticky> */}
- <Cell
- border={false}
- class={styles.cell}
- title={this.title}
- titleClass={[styles.titleInfo, 'van-ellipsis']}
- v-slots={{
- icon: () => (
- <Icon
- name="video"
- size={18}
- color="var(--van-primary)"
- style={{ display: 'flex', alignItems: 'center' }}
- />
- ),
- value: () => (
- <div class={styles.label}>
- <span>{this.currentClassIndex}</span>/{this.detailList.length}
- 课时
- </div>
- )
- }}
- ></Cell>
- <div class={styles.videoDesc}>{this.videoContent}</div>
- <Tabs
- v-model:active={this.tabIndex}
- class={styles.infoField}
- color="var(--van-primary)"
- sticky
- offsetTop={this.offsetTop}
- lineWidth={20}
- >
- <Tab title="目录" name={1}>
- <div
- style={{
- // height: `calc(100vh - 320px - ${this.navHeight}px)`,
- overflowY: 'auto'
- }}
- >
- <SectionDetail title="课程列表" icon="courseList" border>
- {this.detailList.map((item: any, index: number) => {
- const musicAlbumInfos = item.musicAlbumInfos || []
- const temp = musicAlbumInfos.map((info: any) => {
- return {
- relationMusicAlbum: info.relationType,
- musicAlbumName: info.name,
- musicAlbumId: info.musicAlbumId,
- status: info.status,
- useRelationType: this.useRelationType
- }
- })
- return (
- <CourseVideoItem
- musicAlbumInfos={temp}
- playId={Number(this.classId)}
- detail={{
- id: item.id,
- title: item.videoTitle,
- content: item.videoContent,
- imgUrl: item.coverUrl,
- videoUrl: item.videoUrl,
- index: index + 1
- }}
- onPlay={this.onPlay}
- onMusicAlbumDetail={(item: any) => {
- if (!this.alreadyBuy && !item.status) {
- Toast('数据正在更新,请稍后再试')
- return
- }
- if (item.relationMusicAlbum === 'MUSIC') {
- this.$router.push({
- path: '/music-detail',
- query: {
- id: item.musicAlbumId
- }
- })
- } else if (item.relationMusicAlbum === 'ALBUM') {
- this.$router.push({
- path: '/music-album-detail/' + item.musicAlbumId
- })
- }
- }}
- />
- )
- })}
- </SectionDetail>
- </div>
- </Tab>
- <Tab title="讨论" name={3}>
- <div
- style={{
- // height: `calc(100vh - 380px - ${this.navHeight}px)`,
- overflowY: 'auto',
- marginBottom:
- 'calc(var(--van-cell-vertical-padding) * 2 + var( --van-cell-line-height))'
- }}
- >
- {this.dataShow ? (
- <List
- v-model:loading={this.loading}
- finished={this.finished}
- finishedText=" "
- immediateCheck={false}
- onLoad={this.getList}
- >
- {this.list.map((item: any) => (
- <Cell
- class={[
- styles['message-list'],
- item.isTeacher === 1 && styles['message-active']
- ]}
- valueClass={styles['message-time']}
- v-slots={{
- icon: () => (
- <Image
- class={styles.userLogo}
- src={item.avatar || iconTeacher}
- fit="cover"
- />
- ),
- title: () => (
- <div class={styles.title}>
- <div class={styles['message-name']}>
- {item.userName}
- </div>
- <div class={styles['message-time']}>
- {dayjs(item.evaluateTime).format(
- 'YYYY年MM月DD日'
- )}
- </div>
- </div>
- ),
- label: () => (
- <div class={styles.label}>{item.content}</div>
- )
- }}
- />
- ))}
- </List>
- ) : (
- <ColResult btnStatus={false} tips="暂无讨论" />
- )}
- </div>
- {/* <Sticky offsetBottom={0} position="bottom"> */}
- <div class={styles.messageContainer}>
- <Field
- placeholder="快来讨论吧~"
- v-model={this.message}
- v-slots={{
- button: () => (
- <Button
- type="primary"
- disabled={!this.message}
- style={{ padding: '0 20px' }}
- size="small"
- round
- onClick={this.onSubmit}
- >
- 发布
- </Button>
- )
- }}
- />
- </div>
- {/* </Sticky> */}
- </Tab>
- </Tabs>
- </div>
- )
- }
- })
|