| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 | 
							- 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
 
- } from 'vant'
 
- import { defineComponent } from 'vue'
 
- import styles from './video-class-detail.module.less'
 
- import { state } from '@/state'
 
- import iconStudent from '@common/images/icon_student.png'
 
- import dayjs from 'dayjs'
 
- import ColResult from '@/components/col-result'
 
- export default defineComponent({
 
-   name: 'VideoClassDetail',
 
-   data() {
 
-     const query = this.$route.query
 
-     return {
 
-       groupId: query.groupId,
 
-       classId: query.classId,
 
-       tabIndex: 1,
 
-       title: '',
 
-       lessonPrice: 0,
 
-       currentClassIndex: 1,
 
-       detailList: [],
 
-       posterUrl: '',
 
-       srcUrl: '',
 
-       message: '',
 
-       navHeight: 0 as any,
 
-       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() {
 
-     this.navHeight = sessionStorage.getItem('navHeight') || 0
 
-     try {
 
-       const res = await request.get(
 
-         '/api-teacher/videoLessonGroup/selectVideoLesson',
 
-         {
 
-           params: {
 
-             groupId: this.groupId
 
-           }
 
-         }
 
-       )
 
-       const result = res.data || {}
 
-       this.title = result.lessonGroup.lessonName
 
-       this.lessonPrice = result.lessonGroup.lessonPrice
 
-       this.detailList = result.detailList || []
 
-       if (state.user.data?.userId !== result.lessonGroup.teacherId) {
 
-         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
 
-         }
 
-       })
 
-       const config = await request.get(
 
-         '/api-student/sysConfig/queryByParamNameList',
 
-         {
 
-           params: {
 
-             paramNames: 'video_lesson_free_rate'
 
-           }
 
-         }
 
-       )
 
-       this.freeRate = config.data[0]?.paramValue || 0
 
-       this.getList()
 
-     } catch {}
 
-   },
 
-   methods: {
 
-     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 || {}
 
-         console.log(result)
 
-         // 处理重复请求数据
 
-         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-teacher/videoLesson/evaluate', {
 
-           data: {
 
-             isTeacher: 1,
 
-             videoId: this.classId,
 
-             content: this.message,
 
-             studentId: state.user.data.userId
 
-           }
 
-         })
 
-         Toast('评论成功')
 
-         this.message = ''
 
-         setTimeout(() => {
 
-           this.onSearch()
 
-         }, 1000)
 
-       } catch {}
 
-     }
 
-   },
 
-   render() {
 
-     return (
 
-       <div class={styles['video-class-detail']}>
 
-         {/* <ColHeader
 
-           v-slots={{
 
-             default: () => (
 
-               <ColVideo
 
-                 src={this.srcUrl}
 
-                 poster={this.posterUrl}
 
-                 freeRate={Number(this.freeRate)}
 
-                 trySee={this.trySee}
 
-                 height={this.videoHeight}
 
-               />
 
-             )
 
-           }}
 
-         /> */}
 
-         <ColVideo
 
-           src={this.srcUrl}
 
-           poster={this.posterUrl}
 
-           freeTitleStatus={this.lessonPrice > 0 ? true : false}
 
-           freeRate={Number(this.freeRate)}
 
-           trySee={this.trySee}
 
-           height={this.videoHeight}
 
-         />
 
-         <Cell
 
-           border={false}
 
-           class={styles.cell}
 
-           title={this.title}
 
-           titleClass={styles.titleInfo}
 
-           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)"
 
-           lineWidth={20}
 
-           sticky
 
-           lazyRender
 
-           offsetTop={this.offsetTop}
 
-         >
 
-           <Tab title="目录" name={1}>
 
-             <div style={{ height: 'calc(100vh - 320px)', overflowY: 'auto' }}>
 
-               <SectionDetail title="课程列表" icon="courseList">
 
-                 {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
 
-                     }
 
-                   })
 
-                   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 (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={{
 
-                 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 || iconStudent}
 
-                             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>
 
-             <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>
 
-           </Tab>
 
-         </Tabs>
 
-       </div>
 
-     )
 
-   }
 
- })
 
 
  |