index.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import { state } from '@/state'
  2. import { ElIcon, ElImage } from 'element-plus'
  3. import { defineComponent } from 'vue'
  4. import { createState } from '../createState'
  5. import styles from './index.module.less'
  6. import defaultIcon from '@common/images/icon_teacher.png'
  7. import iconIn from '../images/icon_course_introduction.png'
  8. import iconList from '../images/icon_course_list.png'
  9. import videoStop from '../images/icon_video_stop.png'
  10. import iconAlbum from '@common/images/icon_album_active.png'
  11. import iconMusic from '@common/images/icon_music_active.png'
  12. import { ArrowRight } from '@element-plus/icons-vue'
  13. export default defineComponent({
  14. name: 'course-preview',
  15. computed: {
  16. userInfo() {
  17. const videoDetail = createState.lessonGroup
  18. const users = state.user.data || {}
  19. console.log(users)
  20. return {
  21. id: users.userId,
  22. username: users.username || `游客${users.userId || ''}`,
  23. headUrl: users.heardUrl,
  24. lessonName: videoDetail.lessonName,
  25. buyNum: 0,
  26. payType: videoDetail.payType,
  27. lessonDesc: videoDetail.lessonDesc,
  28. lessonPrice: videoDetail.lessonPrice,
  29. lessonCoverUrl:
  30. videoDetail.lessonCoverTemplateUrl || videoDetail.lessonCoverUrl,
  31. lessonNum: createState.lessonList.length
  32. }
  33. },
  34. lessonList() {
  35. return createState.lessonList || []
  36. }
  37. },
  38. render() {
  39. console.log(this.userInfo)
  40. return (
  41. <div class={[styles['course-preview'], 'pb-3']}>
  42. <div class={styles.userDetail}>
  43. <ElImage
  44. class={[styles.banner]}
  45. src={this.userInfo.lessonCoverUrl}
  46. fit="cover"
  47. />
  48. <div class="bg-white">
  49. <div class="p-[14px] text-lg text-[#1a1a1a] font-semibold leading-none">
  50. {this.userInfo.lessonName}
  51. </div>
  52. <div class={[styles.userInfo, 'mx-[14px] py-[14px]']}>
  53. <div class="flex" style={{ alignItems: 'center' }}>
  54. <ElImage
  55. class={styles.avatar}
  56. src={this.userInfo.headUrl || defaultIcon}
  57. fit=""
  58. />
  59. <div class={styles.name}>
  60. <div class={styles.userName}>
  61. {this.userInfo.username || `游客${this.userInfo.id || ''}`}
  62. </div>
  63. </div>
  64. </div>
  65. {this.userInfo.payType === 'VIP' ? (
  66. <div class={[styles.info]}>
  67. <div>
  68. <span class={styles.memberIcon}>会员</span>/
  69. {this.userInfo.lessonNum}
  70. 课时
  71. </div>
  72. <div class={styles.buyNum}>
  73. {this.userInfo.buyNum}人已学习
  74. </div>
  75. </div>
  76. ) : (
  77. <div class={styles.info}>
  78. <div>
  79. ¥{this.userInfo.lessonPrice}/{this.userInfo.lessonNum}
  80. 课时
  81. </div>
  82. <div class={styles.buyNum}>
  83. {this.userInfo.buyNum}人已学习
  84. </div>
  85. </div>
  86. )}
  87. </div>
  88. </div>
  89. </div>
  90. <div
  91. class={[
  92. styles['section-detail'],
  93. 'mt-[10px] mx-[14px] rounded-lg bg-white'
  94. ]}
  95. >
  96. <div class="flex items-center py-3 px-[10px] text-[#333333] text-base">
  97. <ElIcon size={18} class="mr-2">
  98. <img src={iconIn} />
  99. </ElIcon>
  100. 课程介绍
  101. </div>
  102. <div class="mx-[10px] pt-[10px] pb-4 text-sm text-[#7A7A7A] border-t border-t-[#EBEBEB]">
  103. {this.userInfo.lessonDesc}
  104. </div>
  105. </div>
  106. <div
  107. class={[
  108. styles['section-detail'],
  109. 'mt-[10px] mx-[14px] rounded-lg bg-white'
  110. ]}
  111. >
  112. <div class="flex items-center py-3 px-[10px] text-[#333333] text-base">
  113. <ElIcon size={18} class="mr-2">
  114. <img src={iconList} />
  115. </ElIcon>
  116. 课程列表
  117. </div>
  118. <div class="mx-[10px] pt-[10px] pb-4 text-sm text-[#7A7A7A] border-t border-t-[#EBEBEB] flex flex-col">
  119. {createState.lessonList.map((item: any) => (
  120. <>
  121. <div class="flex">
  122. <div class={styles.videoImg}>
  123. <ElImage
  124. class="align-middle h-[70px] w-[100px] rounded overflow-hidden"
  125. src={item.coverUrl}
  126. fit="cover"
  127. />
  128. <ElIcon class={styles.videoStop} size={26}>
  129. <img src={videoStop} />
  130. </ElIcon>
  131. </div>
  132. <div class={[styles.videoTitle, '!h-[70px]']}>
  133. <p
  134. class={[
  135. styles.videoTitleText,
  136. 'whitespace-nowrap overflow-hidden text-ellipsis'
  137. ]}
  138. >
  139. {item.videoTitle}
  140. </p>
  141. <p class={[styles.videoTitleContent]}>
  142. {item.videoContent}
  143. </p>
  144. </div>
  145. </div>
  146. {item.relationList &&
  147. item.relationList.map((info: any) => (
  148. <div
  149. class={[
  150. styles.infoVideo,
  151. info.relationMusicAlbum === 'ALBUM'
  152. ? styles.albumInfo
  153. : styles.musicInfo
  154. ]}
  155. >
  156. <div>
  157. <img
  158. src={
  159. info.relationMusicAlbum === 'ALBUM'
  160. ? iconAlbum
  161. : iconMusic
  162. }
  163. />
  164. {info.relationMusicAlbum === 'ALBUM' ? (
  165. <span>专辑:{info.musicAlbumName}</span>
  166. ) : (
  167. <span>曲目:{info.musicAlbumName}</span>
  168. )}
  169. </div>
  170. <ElIcon>
  171. <ArrowRight />
  172. </ElIcon>
  173. </div>
  174. ))}
  175. </>
  176. ))}
  177. </div>
  178. </div>
  179. </div>
  180. )
  181. }
  182. })