member-record.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. import ColHeader from '@/components/col-header'
  2. import { defineComponent } from 'vue'
  3. import styles from './member-record.module.less'
  4. import {
  5. Cell,
  6. CellGroup,
  7. DatetimePicker,
  8. Grid,
  9. GridItem,
  10. Icon,
  11. Image,
  12. List,
  13. Popup,
  14. Sticky
  15. } from 'vant'
  16. import { levelMember } from '@/constant'
  17. import request from '@/helpers/request'
  18. import { formatterDate } from '@/helpers/utils'
  19. import dayjs from 'dayjs'
  20. import ColResult from '@/components/col-result'
  21. import { postMessage } from '@/helpers/native-message'
  22. import { useEventTracking } from '@/helpers/hooks'
  23. export const getAssetsHomeFile = (fileName: string) => {
  24. const path = `./images/${fileName}`
  25. const modules = import.meta.globEager('./images/*')
  26. return modules[path].default
  27. }
  28. export default defineComponent({
  29. name: 'memberRecord',
  30. data() {
  31. return {
  32. userTrainOverView: {
  33. trainDays: 0,
  34. trainNum: 0,
  35. trainTime: 0
  36. },
  37. timeStatus: false,
  38. currentDate: new Date(),
  39. list: [],
  40. dataShow: true, // 判断是否有数据
  41. loading: false,
  42. finished: false,
  43. params: {
  44. page: 1,
  45. rows: 20
  46. }
  47. }
  48. },
  49. async mounted() {
  50. this.getList()
  51. useEventTracking('评测记录')
  52. },
  53. methods: {
  54. onSearch() {
  55. this.timeStatus = false
  56. this.dataShow = true
  57. this.loading = false
  58. this.finished = false
  59. this.list = []
  60. this.params.page = 1
  61. this.getList()
  62. },
  63. async getList() {
  64. try {
  65. const params = this.params
  66. const res = await request.get(
  67. '/api-student/sysMusicRecord/studentTrainData',
  68. {
  69. params: {
  70. ...params,
  71. startTime: dayjs(this.currentDate).format('YYYY-MM')
  72. }
  73. }
  74. )
  75. this.loading = false
  76. const result = res.data || {}
  77. // 在第一页的时候才处理数据显示
  78. if (result.detail.pageNo === 1) {
  79. this.userTrainOverView = result.userTrainOverView
  80. }
  81. // 处理重复请求数据
  82. if (this.list.length > 0 && result.detail.pageNo === 1) {
  83. return
  84. }
  85. this.list = this.list.concat(result.detail.rows || [])
  86. this.finished = result.detail.pageNo >= result.detail.totalPage
  87. this.params.page = result.detail.pageNo + 1
  88. this.dataShow = this.list.length > 0
  89. } catch {
  90. this.dataShow = false
  91. this.finished = true
  92. }
  93. }
  94. },
  95. render() {
  96. return (
  97. <div class={styles['member-record']}>
  98. {/* <Sticky position="top" offsetTop={0}> */}
  99. <ColHeader
  100. class={styles.memberHeader}
  101. background="#00d1a1"
  102. backIconColor="white"
  103. border={false}
  104. color="#fff"
  105. // isFixed={false}
  106. v-slots={{
  107. default: () => (
  108. <div class={styles.headerContent}>
  109. <Image
  110. class={styles.headerImg}
  111. src={getAssetsHomeFile('record_bg.png')}
  112. />
  113. <div class={styles.headerCount}>
  114. <div class={styles.headerItem}>
  115. <span class={styles.num}>
  116. {this.userTrainOverView.trainDays}天
  117. </span>
  118. <span>累计训练天数</span>
  119. </div>
  120. <div class={styles.headerItem}>
  121. <span class={styles.num}>
  122. {this.userTrainOverView.trainTime}分钟
  123. </span>
  124. <span>累计训练时长</span>
  125. </div>
  126. <div class={styles.headerItem}>
  127. <span class={styles.num}>
  128. {this.userTrainOverView.trainNum}次
  129. </span>
  130. <span>累计训练次数</span>
  131. </div>
  132. </div>
  133. </div>
  134. // <div class={[styles.certHeader, this.headStatus ? styles.certWhite : null]}>
  135. // 老师认证
  136. // </div>
  137. )
  138. }}
  139. />
  140. {/* </Sticky> */}
  141. <div style={{ overflow: 'hidden', paddingBottom: '12px' }}>
  142. <Cell
  143. class={styles.memberCell}
  144. v-slots={{
  145. title: () => (
  146. <div class={styles.rTitle}>
  147. <span>评测记录</span>
  148. </div>
  149. ),
  150. default: () => (
  151. <div
  152. class={styles.dataItem}
  153. onClick={() => (this.timeStatus = true)}
  154. >
  155. {dayjs(this.currentDate).format('YYYY年MM月')}
  156. <Icon
  157. classPrefix="iconfont"
  158. name="down"
  159. size={14}
  160. color="var(--van-primary)"
  161. />
  162. </div>
  163. )
  164. }}
  165. ></Cell>
  166. <Popup
  167. v-model:show={this.timeStatus}
  168. position="bottom"
  169. round
  170. closeOnPopstate
  171. >
  172. <DatetimePicker
  173. type="year-month"
  174. v-model={this.currentDate}
  175. formatter={formatterDate}
  176. onCancel={() => {
  177. this.timeStatus = false
  178. }}
  179. onConfirm={this.onSearch}
  180. />
  181. </Popup>
  182. {this.dataShow ? (
  183. <List
  184. v-model:loading={this.loading}
  185. finished={this.finished}
  186. finishedText=" "
  187. immediateCheck={false}
  188. class={[styles.liveList, 'mb12']}
  189. onLoad={this.getList}
  190. >
  191. {this.list.map((item: any) => (
  192. <CellGroup
  193. class={styles['data-content']}
  194. border={false}
  195. onClick={() => {
  196. const behaviorId = +new Date()
  197. //dev.colexiu.com/accompany/colexiu-report.html?id=817&behaviorId=165699355934918269&Authorization=bearer%20aea0b4c1-423c-4466-902a-17dc7ac8938a#/
  198. postMessage({
  199. api: 'openAccompanyWebView',
  200. content: {
  201. url:
  202. location.origin +
  203. '/accompany/colexiu-report.html?id=' +
  204. item.id +
  205. '&behaviorId=' +
  206. behaviorId,
  207. orientation: 0,
  208. isHideTitle: true,
  209. statusBarTextColor: false,
  210. isOpenLight: true
  211. }
  212. })
  213. return
  214. }}
  215. >
  216. <Cell
  217. center
  218. v-slots={{
  219. title: () => (
  220. <div class={styles.dataTitle}>
  221. <span>{item.sysMusicScoreName}</span>
  222. {item.videoFilePath && (
  223. <Icon
  224. name={getAssetsHomeFile('icon_video.png')}
  225. size={20}
  226. />
  227. )}
  228. </div>
  229. ),
  230. default: () => (
  231. <div class={styles.dataItem}>
  232. {dayjs(item.createTime).format('YYYY/MM/DD HH:mm')}
  233. </div>
  234. )
  235. }}
  236. ></Cell>
  237. <Cell
  238. center
  239. style={{ paddingLeft: '5px', paddingRight: '5px' }}
  240. v-slots={{
  241. title: () => (
  242. <Grid border={false} columnNum={5}>
  243. <GridItem
  244. text="评测难度"
  245. v-slots={{
  246. icon: () => (
  247. <span style={{ color: '#000000' }}>
  248. {levelMember[item.heardLevel]}
  249. </span>
  250. )
  251. }}
  252. ></GridItem>
  253. <GridItem
  254. text="评测分数"
  255. v-slots={{
  256. icon: () => (
  257. <span style={{ color: '#000000' }}>
  258. {item.score}分
  259. </span>
  260. )
  261. }}
  262. ></GridItem>
  263. <GridItem
  264. text="音准"
  265. v-slots={{
  266. icon: () => (
  267. <span style={{ color: '#01C1B5' }}>
  268. {item.intonation}分
  269. </span>
  270. )
  271. }}
  272. ></GridItem>
  273. <GridItem
  274. text="节奏"
  275. v-slots={{
  276. icon: () => (
  277. <span style={{ color: '#FF802C' }}>
  278. {item.cadence}分
  279. </span>
  280. )
  281. }}
  282. ></GridItem>
  283. <GridItem
  284. text="完成度"
  285. v-slots={{
  286. icon: () => (
  287. <span style={{ color: '#F79C00' }}>
  288. {item.integrity}分
  289. </span>
  290. )
  291. }}
  292. ></GridItem>
  293. </Grid>
  294. )
  295. }}
  296. ></Cell>
  297. </CellGroup>
  298. ))}
  299. </List>
  300. ) : (
  301. <ColResult btnStatus={false} classImgSize="SMALL" tips="暂无记录" />
  302. )}
  303. </div>
  304. </div>
  305. )
  306. }
  307. })