practice-item.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { Cell, Icon, Image, Rate } from 'vant'
  2. import { defineComponent } from 'vue'
  3. import styles from './practice-item.module.less'
  4. import iconEdu from './images/icon_edu.png'
  5. import iconMusicMan from './images/icon_music_man.png'
  6. import iconNew from './images/icon_new.png'
  7. import iconTeacher from '@/common/images/icon_teacher.png'
  8. export default defineComponent({
  9. name: 'practiceItem',
  10. props: {
  11. item: {
  12. type: Object,
  13. default: {}
  14. },
  15. onClick: {
  16. type: Function,
  17. default: (item: any) => {}
  18. }
  19. },
  20. computed: {
  21. subjectNameList() {
  22. const { configSubject } = this.item
  23. return configSubject ? configSubject.split(',') : []
  24. },
  25. starGrade() {
  26. const { starGrade } = this.item
  27. return Number(starGrade) || 0
  28. }
  29. },
  30. render() {
  31. return (
  32. <Cell
  33. center
  34. border={false}
  35. class={styles.practiceItem}
  36. onClick={() => {
  37. this.onClick(this.item)
  38. }}
  39. v-slots={{
  40. icon: () => (
  41. <div class={styles.piCoverContainer}>
  42. <Image
  43. class={styles.piCover}
  44. fit="cover"
  45. src={this.item.avatar || iconTeacher}
  46. />
  47. {/* <Image src={iconMusicMan} class={styles.tag} /> */}
  48. {/* <Image src={iconNew} class={styles.tag} /> */}
  49. </div>
  50. ),
  51. title: () => (
  52. <div>
  53. <div class={[styles.piTitle, 'van-ellipsis']}>
  54. <p class={styles.piNameSubject}>
  55. <span class={styles.piName}>
  56. {this.item.userName || `游客${this.item.teacherId || ''}`}
  57. </span>
  58. {/* {this.subjectNameList.map(
  59. (item: string, index: number) =>
  60. index <= 1 && <span class={styles.subject}>{item}</span>
  61. )} */}
  62. </p>
  63. {this.starGrade ? (
  64. <Rate
  65. readonly
  66. modelValue={this.starGrade}
  67. iconPrefix="iconfont"
  68. color="#FFC459"
  69. void-icon="star_default"
  70. icon="star_active"
  71. size={11}
  72. />
  73. ) : (
  74. <span style={{ fontSize: '12px', color: '#999999' }}>
  75. 暂无评分
  76. </span>
  77. )}
  78. </div>
  79. <div class={styles.piContent}>
  80. {this.item.schoolSubject && (
  81. <p class={styles.edu}>
  82. <Icon
  83. size={14}
  84. name={iconEdu}
  85. style={{ paddingRight: '5px' }}
  86. />
  87. <span>{this.item.schoolSubject}</span>
  88. </p>
  89. )}
  90. <p class={styles.courseInfo}>
  91. <span class={styles.classNum}>
  92. 已上课程
  93. <i>{this.item.expTime}</i>节
  94. </span>
  95. <span class={styles.priceTime}>
  96. {this.item.subjectPrice > 0 && (
  97. <>
  98. <i>¥{this.item.subjectPrice}</i>/
  99. </>
  100. )}
  101. {this.item.courseMinutes}
  102. 分钟
  103. </span>
  104. </p>
  105. </div>
  106. </div>
  107. )
  108. }}
  109. />
  110. )
  111. }
  112. })