teacher-elegant.tsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import ColHeader from '@/components/col-header'
  2. import ColResult from '@/components/col-result'
  3. import ColSearch from '@/components/col-search'
  4. import request from '@/helpers/request'
  5. import { state } from '@/state'
  6. import { List, Popup, Sticky, Image, Icon } from 'vant'
  7. import { defineComponent } from 'vue'
  8. import OrganSearch from '../practice-class/model/organ-search'
  9. import styles from './teacher-elegant.module.less'
  10. import iconTeacher from '@common/images/icon_teacher.png'
  11. import bars from '@common/svg/bars.svg'
  12. export default defineComponent({
  13. data() {
  14. return {
  15. searchStatus: false,
  16. openStatus: false,
  17. subjectList: [],
  18. params: {
  19. username: '',
  20. page: 1,
  21. subjectId: null as any,
  22. subjectName: ''
  23. },
  24. dataShow: true, // 判断是否有数据
  25. loading: false,
  26. finished: false,
  27. list: []
  28. }
  29. },
  30. async mounted() {
  31. const sessionSubjectId = sessionStorage.getItem('elegantSubjectId')
  32. sessionStorage.removeItem('teacherHomeTabs')
  33. sessionStorage.removeItem('elegantSubjectId')
  34. this.params.subjectId =
  35. sessionSubjectId || state.user.data?.subjectId || null
  36. this.params.subjectName = state.user.data?.subjectName || ''
  37. try {
  38. const res = await request.get('/api-student/subject/subjectSelect')
  39. this.subjectList = res.data || []
  40. } catch {}
  41. await this.getList()
  42. },
  43. computed: {
  44. filterDot() {
  45. const subjectId: any = this.params.subjectId
  46. return !!subjectId
  47. }
  48. },
  49. methods: {
  50. async getList() {
  51. try {
  52. const params = this.params
  53. const res = await request.post('/api-student/teacher/stylePage', {
  54. data: {
  55. ...params
  56. }
  57. })
  58. console.log(res)
  59. this.loading = false
  60. const result = res.data || {}
  61. // 处理重复请求数据
  62. if (this.list.length > 0 && result.pageNo === 1) {
  63. return
  64. }
  65. this.list = this.list.concat(result.rows || [])
  66. this.finished = result.pageNo >= result.totalPage
  67. this.params.page = result.pageNo + 1
  68. this.dataShow = this.list.length > 0
  69. console.log(this.list)
  70. } catch {
  71. this.dataShow = false
  72. this.finished = true
  73. }
  74. },
  75. onSort() {
  76. this.params.page = 1
  77. this.list = []
  78. this.dataShow = true // 判断是否有数据
  79. this.loading = false
  80. this.finished = false
  81. this.searchStatus = false
  82. this.getList()
  83. sessionStorage.setItem('elegantSubjectId', this.params.subjectId)
  84. },
  85. onSearch(_search?: any) {
  86. this.params.username = _search
  87. this.onSort()
  88. },
  89. onDetail(item: any) {
  90. this.$router.push({
  91. path: '/teacherHome',
  92. query: {
  93. teacherId: item.userId
  94. }
  95. })
  96. }
  97. },
  98. render() {
  99. return (
  100. <div class={styles['teacher-elegant']}>
  101. <Sticky offsetTop={0} position="top">
  102. <ColHeader
  103. class={styles.classHeader}
  104. border={false}
  105. background="transparent"
  106. isFixed={false}
  107. />
  108. <ColSearch
  109. placeholder="请输入老师名称"
  110. showAction
  111. filterDot={this.filterDot}
  112. onSearch={this.onSearch}
  113. onFilter={() => {
  114. this.searchStatus = !this.searchStatus
  115. this.openStatus = !this.openStatus
  116. }}
  117. />
  118. {/* <div class={styles.searchContainer}>
  119. <div class={styles.item}>
  120. <div
  121. class={[styles.searchItem, styles.searchFollow, styles.active]}
  122. >
  123. <p class={styles.title}>我的关注</p>
  124. <p class={styles.content}>老师最新动态</p>
  125. </div>
  126. <div
  127. class={[styles.searchItem, styles.searchLive, styles.active2]}
  128. >
  129. <p class={styles.title}>直播中</p>
  130. <p class={styles.content}>互动直播间</p>
  131. </div>
  132. </div>
  133. <div class={styles.searchDefault}>
  134. <Icon
  135. classPrefix="iconfont"
  136. class={styles.star}
  137. color="#FFC459"
  138. name="star_active"
  139. />
  140. 默认排序
  141. </div>
  142. </div> */}
  143. </Sticky>
  144. {this.dataShow ? (
  145. <List
  146. v-model:loading={this.loading}
  147. finished={this.finished}
  148. finishedText=" "
  149. immediateCheck={false}
  150. class={[styles.elegant]}
  151. onLoad={this.getList}
  152. >
  153. {this.list.map((item: any) => (
  154. <div class={styles.tedeoItem}>
  155. <div
  156. class={styles.itemBg}
  157. onClick={() => {
  158. this.onDetail(item)
  159. }}
  160. ></div>
  161. {/* <Image class={styles.teCover} fit="cover" src={item.videoUrl} /> */}
  162. <div class={styles.teCover}>
  163. <video width="100%" class={styles.video}>
  164. <source src={item.videoUrl + '#t=1,3'} type="video/mp4" />
  165. </video>
  166. {item.living === 1 && (
  167. <div class={styles.living}>
  168. <Image src={bars} class={styles.animation} />
  169. <span>播放中</span>
  170. </div>
  171. )}
  172. </div>
  173. <div class={styles.teSection}>
  174. <div class={[styles.teTitle, 'van-ellipsis']}>
  175. {item.lessonName}
  176. </div>
  177. <div class={styles.info}>
  178. <div class={styles.teUserInfo}>
  179. <Image
  180. src={item.avatar || iconTeacher}
  181. class={styles.teUserLogo}
  182. />
  183. <span class={[styles.teUserName, 'van-hairline--right']}>
  184. {item?.username || `游客${item?.userId || ''}`}
  185. </span>
  186. </div>
  187. <span class={styles.teUserNum}>{item.browse}浏览</span>
  188. </div>
  189. </div>
  190. </div>
  191. ))}
  192. </List>
  193. ) : (
  194. <ColResult
  195. btnStatus={false}
  196. classImgSize="SMALL"
  197. tips="暂无老师风采"
  198. />
  199. )}
  200. <Popup
  201. show={this.searchStatus}
  202. position="bottom"
  203. round
  204. closeable
  205. safe-area-inset-bottom
  206. onClose={() => (this.searchStatus = false)}
  207. onClosed={() => (this.openStatus = false)}
  208. >
  209. {this.openStatus && (
  210. <OrganSearch
  211. subjectList={this.subjectList}
  212. onSort={this.onSort}
  213. v-model={this.params.subjectId}
  214. v-model:subjectName={this.params.subjectName}
  215. />
  216. )}
  217. </Popup>
  218. </div>
  219. )
  220. }
  221. })