teacher-list.tsx 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import OHeader from '@/components/o-header'
  2. import OSticky from '@/components/o-sticky'
  3. import { state } from '@/state'
  4. import { Button, Cell, CellGroup, Field, List, Image, Tag } from 'vant'
  5. import { defineComponent, onMounted, PropType, reactive, watch } from 'vue'
  6. import styles from './teacher-list.module.less'
  7. import iconTeacher from '@common/images/icon_teacher.png'
  8. import OEmpty from '@/components/o-empty'
  9. import request from '@/helpers/request'
  10. import OSearch from '@/components/o-search'
  11. export default defineComponent({
  12. name: 'teacher-list',
  13. props: {
  14. header: {
  15. // 是否显示头部
  16. type: Boolean,
  17. default: true
  18. },
  19. mode: {
  20. type: String as PropType<'fixed' | 'sticky'>,
  21. default: 'fixed'
  22. },
  23. courseType: {
  24. type: String,
  25. default: ''
  26. },
  27. removeTeacherId: {
  28. type: String,
  29. default: ''
  30. },
  31. subjectIdList: {
  32. type: Array,
  33. default: () => []
  34. }
  35. },
  36. emits: ['close', 'select'],
  37. setup(props, { slots, attrs, emit }) {
  38. const forms = reactive({
  39. teacherStatus: false,
  40. isLoad: false,
  41. list: [] as any,
  42. listState: {
  43. dataShow: true, // 判断是否有数据
  44. loading: false,
  45. finished: false
  46. },
  47. params: {
  48. keyword: null,
  49. courseType: props.courseType,
  50. subjectIdList: props.subjectIdList,
  51. page: 1,
  52. rows: 20
  53. }
  54. })
  55. const getList = async () => {
  56. try {
  57. if (forms.isLoad) return
  58. forms.isLoad = true
  59. const res = await request.post('/api-school/teacher/page', {
  60. data: {
  61. ...forms.params,
  62. schoolId: state.user.data.school.id,
  63. removeTeacherId: props.removeTeacherId, // 移除的老师id
  64. delFlag: false // 绑定解绑 false:绑定 true:解绑
  65. }
  66. })
  67. forms.listState.loading = false
  68. const result = res.data || {}
  69. // 处理重复请求数据
  70. if (forms.list.length > 0 && result.current === 1) {
  71. return
  72. }
  73. const rows = result.rows || []
  74. rows.forEach((item: any) => {
  75. item.subjectNames = item.subjectName ? item.subjectName.split(',') : []
  76. })
  77. forms.list = forms.list.concat(rows)
  78. forms.listState.finished = result.current >= result.pages
  79. forms.params.page = result.current + 1
  80. forms.listState.dataShow = forms.list.length > 0
  81. forms.isLoad = false
  82. } catch {
  83. forms.listState.dataShow = false
  84. forms.listState.finished = true
  85. forms.isLoad = false
  86. }
  87. }
  88. // 搜索
  89. const onSearch = () => {
  90. forms.params.page = 1
  91. forms.list = []
  92. forms.listState.dataShow = true // 判断是否有数据
  93. forms.listState.loading = false
  94. forms.listState.finished = false
  95. getList()
  96. }
  97. const onSelect = (item: any) => {
  98. emit('close')
  99. emit('select', item)
  100. }
  101. // 声部变化时重新请求接口
  102. watch(
  103. () => props.courseType,
  104. () => {
  105. forms.params.courseType = props.courseType
  106. onSearch()
  107. }
  108. )
  109. watch(
  110. () => props.subjectIdList,
  111. () => {
  112. forms.params.subjectIdList = props.subjectIdList
  113. onSearch()
  114. }
  115. )
  116. watch(
  117. () => props.removeTeacherId,
  118. () => {
  119. onSearch()
  120. }
  121. )
  122. onMounted(() => {
  123. getList()
  124. })
  125. return () => (
  126. <div
  127. class={!forms.listState.dataShow && 'emptyRootContainer'}
  128. style={{ background: '#F8F8F8', minHeight: '100%' }}
  129. >
  130. <OSticky position="top" mode={props.mode}>
  131. {props.header && <OHeader title="选择伴学老师" border={false} />}
  132. <OSearch
  133. // inputBackground="white"
  134. // background="#F8F8F8"
  135. placeholder="伴学老师名称"
  136. onSearch={(val: any) => {
  137. forms.params.keyword = val
  138. onSearch()
  139. }}
  140. />
  141. </OSticky>
  142. {forms.listState.dataShow ? (
  143. <List
  144. // v-model:loading={forms.listState.loading}
  145. finished={forms.listState.finished}
  146. finishedText=" "
  147. onLoad={getList}
  148. style={{
  149. paddingTop: '12px'
  150. }}
  151. immediateCheck={false}
  152. >
  153. {forms.list.map((item: any) => (
  154. // <Cell center class={styles.cellTeacher} onClick={() => onSelect(item)}>
  155. // {{
  156. // icon: () => <Image class={styles.img} src={item.avatar || iconTeacher} />,
  157. // title: () => (
  158. // <div class={styles.content}>
  159. // <p class={[styles.name, 'van-ellipsis']}>{item.nickname}</p>
  160. // <p class={styles.class}>
  161. // {item.subjectNames &&
  162. // item.subjectNames.map((subject: any) => (
  163. // <Tag type="primary">{subject}</Tag>
  164. // ))}
  165. // </p>
  166. // </div>
  167. // )
  168. // }}
  169. // </Cell>
  170. <CellGroup inset style={{ marginBottom: '12px' }} onClick={() => onSelect(item)}>
  171. <Cell center class={styles.manageCell} clickable={false}>
  172. {{
  173. icon: () => (
  174. <Image
  175. class={styles.img}
  176. src={item.avatar ? item.avatar : iconTeacher}
  177. fit="cover"
  178. />
  179. ),
  180. title: () => (
  181. <div class={styles.teacherContent}>
  182. <div class={styles.content}>
  183. <p class={[styles.name, 'van-ellipsis']}>{item.nickname}</p>
  184. </div>
  185. </div>
  186. )
  187. }}
  188. </Cell>
  189. <Cell center>
  190. {{
  191. title: () => (
  192. <div class={styles.subjectContainer}>
  193. <span>声部:</span>
  194. <div style={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}>
  195. {item.subjectNames &&
  196. item.subjectNames.length > 0 &&
  197. item.subjectNames.map((subject: any) => (
  198. <Tag
  199. type="primary"
  200. class={styles.tagSubject}
  201. color="#FFE7DA"
  202. textColor="#F67146"
  203. >
  204. {subject}
  205. </Tag>
  206. ))}
  207. </div>
  208. </div>
  209. )
  210. }}
  211. </Cell>
  212. </CellGroup>
  213. ))}
  214. </List>
  215. ) : (
  216. <OEmpty btnStatus={false} tips="暂无伴学老师" />
  217. )}
  218. </div>
  219. )
  220. }
  221. })