index.tsx 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. import OHeader from '@/components/o-header'
  2. import { Cell, CellGroup, Grid, GridItem, Image, List, Picker, Popup, Tag } from 'vant'
  3. import { defineComponent, onMounted, reactive } from 'vue'
  4. import { useRoute, useRouter } from 'vue-router'
  5. import styles from './index.module.less'
  6. import iconTeacher from '@common/images/icon_teacher.png'
  7. import iconMessage from '@common/images/icon-muit-message.png'
  8. import { postMessage } from '@/helpers/native-message'
  9. import iconPhoneDefaut from '@/school/orchestra/images/icon-photo-default.png'
  10. import iconChange from './images/icon_change.png'
  11. import request from '@/helpers/request'
  12. import OEmpty from '@/components/o-empty'
  13. export default defineComponent({
  14. name: 'my-orchestra',
  15. setup() {
  16. const router = useRouter()
  17. const route = useRoute()
  18. const state = reactive({
  19. isLoading: false,
  20. list: [] as any,
  21. listState: {
  22. dataShow: true, // 判断是否有数据
  23. loading: false,
  24. finished: false
  25. },
  26. params: {
  27. page: 1,
  28. rows: 20
  29. },
  30. orchestraStatus: false,
  31. orchestraList: [] as any,
  32. selectOrchestra: {} as any
  33. })
  34. const onSearch = () => {
  35. state.params.page = 1
  36. state.list = []
  37. state.listState.dataShow = true // 判断是否有数据
  38. state.listState.loading = false
  39. state.listState.finished = false
  40. getList()
  41. }
  42. // 班级列表
  43. const getList = async () => {
  44. try {
  45. if (state.isLoading) return
  46. state.isLoading = true
  47. const res = await request.post('/api-student/orchestraPhotoAlbum/page', {
  48. data: {
  49. ...state.params,
  50. orchestraId: state.selectOrchestra.orchestraId
  51. }
  52. })
  53. state.listState.loading = false
  54. const result = res.data || {}
  55. // 处理重复请求数据
  56. if (state.list.length > 0 && result.current === 1) {
  57. return
  58. }
  59. const rows = result.rows || []
  60. state.list = state.list.concat(rows)
  61. state.listState.finished = result.current >= result.pages
  62. state.params.page = result.current + 1
  63. state.listState.dataShow = state.list.length > 0
  64. state.isLoading = false
  65. } catch {
  66. state.listState.dataShow = false
  67. state.listState.finished = true
  68. state.isLoading = false
  69. }
  70. }
  71. const onDetail = (item: any) => {
  72. router.push({
  73. path: '/photo-detail',
  74. query: {
  75. photoId: item.id,
  76. name: item.name
  77. }
  78. })
  79. }
  80. const getOrchestras = async () => {
  81. try {
  82. const { data } = await request.post('/api-student/orchestra/studentOrchestra', {})
  83. console.log(data)
  84. state.orchestraList = data || []
  85. if (data && data.length > 0) {
  86. state.selectOrchestra = data[0]
  87. console.log(state.selectOrchestra)
  88. // 判断是否有乐团
  89. await getList()
  90. }
  91. } catch {
  92. //
  93. }
  94. }
  95. const onMessage = async (item: any) => {
  96. console.log(item)
  97. postMessage({
  98. api: 'joinChatGroup',
  99. content: {
  100. type: 'multi', // single 单人 multi 多人
  101. id: item.imGroupId
  102. }
  103. })
  104. }
  105. onMounted(async () => {
  106. await getOrchestras()
  107. })
  108. return () => (
  109. <div class={styles.myOrchestra}>
  110. <OHeader
  111. v-slots={{
  112. right: () => (
  113. <>
  114. {(state.selectOrchestra.status === 'REGISTER' ||
  115. state.selectOrchestra.status === 'LEARNING') && (
  116. <span
  117. onClick={() => {
  118. router.push({
  119. path: '/apply-withdrawal',
  120. query: {
  121. id: state.selectOrchestra.orchestraId
  122. }
  123. })
  124. }}
  125. >
  126. 申请退团
  127. </span>
  128. )}
  129. {state.selectOrchestra.status === 'AUTH' && (
  130. <span style={{ color: 'red' }}>申请退团中</span>
  131. )}
  132. </>
  133. )
  134. }}
  135. />
  136. {state.orchestraList.length > 0 ? (
  137. <>
  138. <CellGroup inset class={styles.oList}>
  139. <Cell center clickable>
  140. {{
  141. title: () => (
  142. <div class={styles.orchestra}>
  143. <i></i>
  144. <span class="van-ellipsis">{state.selectOrchestra.orchestraName}</span>
  145. </div>
  146. ),
  147. value: () =>
  148. state.selectOrchestra.classGroupIdList &&
  149. state.selectOrchestra.classGroupIdList.length > 0 && (
  150. <div
  151. class={styles.iconChange}
  152. onClick={() => {
  153. state.orchestraStatus = true
  154. }}
  155. >
  156. 切换乐团 <Image src={iconChange} class={styles.img} />
  157. </div>
  158. )
  159. }}
  160. </Cell>
  161. </CellGroup>
  162. <div class={[styles.gridContainer, styles.gridClass]}>
  163. {state.selectOrchestra.classGroupIdList &&
  164. state.selectOrchestra.classGroupIdList.map((item: any) => (
  165. <CellGroup class={styles.classCellGroup}>
  166. <Cell
  167. center
  168. titleStyle={{ flex: '0 auto' }}
  169. valueClass={styles.classCheckbox}
  170. border={false}
  171. style={{ paddingBottom: '0' }}
  172. >
  173. {{
  174. icon: () => (
  175. <Image
  176. src={item.teacherAvatar || iconTeacher}
  177. class={styles.img}
  178. fit="cover"
  179. />
  180. ),
  181. title: () => (
  182. <div class={styles.content}>
  183. <div class={styles.teacherName}>
  184. <span class={[styles.name, 'van-ellipsis']}>{item.teacherName}</span>
  185. <Tag type="primary" size="medium">
  186. {item.classGroupName}
  187. </Tag>
  188. </div>
  189. </div>
  190. ),
  191. value: () => (
  192. <Image
  193. class={styles.messageImg}
  194. src={iconMessage}
  195. onClick={() => onMessage(item)}
  196. />
  197. )
  198. }}
  199. </Cell>
  200. <Grid border={false} columnNum={3}>
  201. <GridItem>
  202. <p class={styles.title}>
  203. {item.completeCourseNum || 0}/{item.totalCourseNum || 0}
  204. </p>
  205. <p class={styles.name}>课程</p>
  206. </GridItem>
  207. <GridItem>
  208. <p class={[styles.title]}>
  209. {item.completeTrainingNum || 0}/{item.totalTrainingNum || 0}
  210. </p>
  211. <p class={styles.name}>课后练习</p>
  212. </GridItem>
  213. <GridItem>
  214. <p class={styles.title}>
  215. {item.completeUnitTestNum || 0}/{item.totalUnitTestNum || 0}
  216. </p>
  217. <p class={styles.name}>单元测试</p>
  218. </GridItem>
  219. </Grid>
  220. </CellGroup>
  221. ))}
  222. </div>
  223. <div class={styles.title}>
  224. <i></i>训练照片
  225. </div>
  226. {state.listState.dataShow ? (
  227. <List
  228. v-model:loading={state.listState.loading}
  229. finished={state.listState.finished}
  230. finishedText=" "
  231. onLoad={getList}
  232. immediateCheck={false}
  233. >
  234. <div class={styles.phoneContainer}>
  235. {state.list.map((item: any) => (
  236. <div class={styles.item} onClick={() => onDetail(item)}>
  237. {item.coverUrl ? (
  238. <Image class={styles.img} src={item.coverUrl} fit="cover" />
  239. ) : (
  240. <div class={[styles.img, styles.default]}>
  241. <Image src={iconPhoneDefaut} class={styles.defaultImg} fit="cover" />
  242. </div>
  243. )}
  244. <p class={[styles.name, 'van-ellipsis']}>{item.name}</p>
  245. <p class={styles.num}>{item.photoCount}张</p>
  246. </div>
  247. ))}
  248. </div>
  249. </List>
  250. ) : (
  251. <OEmpty btnStatus={false} tips="暂无训练相片" />
  252. )}
  253. </>
  254. ) : (
  255. <OEmpty btnStatus={false} tips="暂无乐团" />
  256. )}
  257. <Popup v-model:show={state.orchestraStatus} position="bottom" round>
  258. <Picker
  259. columns={state.orchestraList}
  260. columnsFieldNames={{ text: 'orchestraName', value: 'orchestraId' }}
  261. onCancel={() => (state.orchestraStatus = false)}
  262. onConfirm={(val: any) => {
  263. const selectValue = val.selectedValues[0]
  264. if (selectValue === state.selectOrchestra.orchestraId) {
  265. state.orchestraStatus = false
  266. return
  267. }
  268. state.orchestraList.forEach((item: any) => {
  269. if (item.orchestraId === selectValue) {
  270. state.selectOrchestra = item
  271. }
  272. })
  273. state.orchestraStatus = false
  274. onSearch()
  275. }}
  276. />
  277. </Popup>
  278. </div>
  279. )
  280. }
  281. })