index.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import OEmpty from '@/components/o-empty'
  2. import OHeader from '@/components/o-header'
  3. import OSearch from '@/components/o-search'
  4. import OSticky from '@/components/o-sticky'
  5. import { ActionSheet, Button, Cell, CellGroup, Icon, Image, List, showToast } from 'vant'
  6. import { defineComponent, onMounted, onUnmounted, reactive, ref } from 'vue'
  7. import styles from './index.module.less'
  8. import iconEdit from '../images/icon-edit.png'
  9. import iconAdd from '@common/images/icon_add.png'
  10. import { useRouter } from 'vue-router'
  11. import UnitListItem from './models/unit-list-item'
  12. import OFullRefresh from '@/components/o-full-refresh'
  13. import { state } from '@/state'
  14. import request from '@/helpers/request'
  15. import { postMessage } from '@/helpers/native-message'
  16. export default defineComponent({
  17. name: 'unit-list',
  18. setup() {
  19. const router = useRouter()
  20. const form = reactive({
  21. oPopover: false,
  22. list: [] as any,
  23. listState: {
  24. dataShow: true, // 判断是否有数据
  25. loading: false,
  26. finished: false
  27. },
  28. statusText: '班级类型',
  29. params: {
  30. keyword: null,
  31. classTypeCode: null,
  32. page: 1,
  33. rows: 20
  34. },
  35. isClick: false
  36. })
  37. const platformApi = state.platformApi
  38. const refreshing = ref(false)
  39. const loading = ref(false)
  40. const getList = async () => {
  41. loading.value = true
  42. try {
  43. if (refreshing.value) {
  44. form.params.page = 1
  45. form.list = []
  46. refreshing.value = false
  47. }
  48. const url =
  49. state.platformType === 'TEACHER'
  50. ? `${platformApi}/studentUnitExamination/queryPageByTeacher`
  51. : `${platformApi}/studentUnitExamination/queryPageByManage`
  52. const res = await request.post(url, {
  53. data: { ...form.params }
  54. })
  55. if (form.list.length > 0 && res.data.pages === 1) {
  56. return
  57. }
  58. form.params.page = res.data.current + 1
  59. //form.list =form.list .concat(res.data.rows || [])
  60. form.list = res.data.rows
  61. form.listState.dataShow = form.list.length > 0
  62. loading.value = false
  63. // form.listState.finished = true
  64. form.listState.finished = res.data.current >= res.data.pages
  65. } catch (e: any) {
  66. // console.log(e, 'e')
  67. const message = e.message
  68. showToast(message)
  69. form.listState.dataShow = false
  70. form.listState.finished = true
  71. }
  72. }
  73. const onRefresh = () => {
  74. form.listState.finished = true
  75. // 重新加载数据
  76. // 将 loading 设置为 true,表示处于加载状态
  77. loading.value = true
  78. getList()
  79. }
  80. const onSearch = () => {
  81. form.params.page = 1
  82. form.list = []
  83. form.listState.dataShow = true // 判断是否有数据
  84. form.listState.loading = false
  85. form.listState.finished = false
  86. getList()
  87. }
  88. onMounted(() => {
  89. getList()
  90. // 处理返回上一页的问题
  91. window.history.pushState(null, '', document.URL)
  92. window.addEventListener('popstate', onBack, false)
  93. })
  94. const onBack = () => {
  95. postMessage({ api: 'back' })
  96. }
  97. onUnmounted(() => {
  98. window.removeEventListener('popstate', onBack)
  99. })
  100. const createUnit = () => {
  101. sessionStorage.removeItem('unit-create')
  102. router.push('/unit-create')
  103. }
  104. return () => (
  105. <div class={styles.unitTest}>
  106. <OSticky position="top">
  107. {/* */}
  108. <OHeader>
  109. {{
  110. right: () =>
  111. platformApi == '/api-teacher' ? (
  112. <Icon name={iconAdd} size={19} onClick={createUnit} />
  113. ) : null
  114. }}
  115. </OHeader>
  116. <OSearch
  117. placeholder="请输入测验名称"
  118. // inputBackground="white"
  119. // background="#f6f8f9"
  120. onSearch={(val: any) => {
  121. form.params.keyword = val
  122. onSearch()
  123. }}
  124. v-slots={{
  125. left: () => (
  126. <div
  127. class={['searchItem-left', form.oPopover ? 'searchItem-active' : '']}
  128. onClick={() => (form.oPopover = true)}
  129. >
  130. <span>{form.statusText} </span>
  131. </div>
  132. )
  133. }}
  134. />
  135. </OSticky>
  136. {form.listState.dataShow ? (
  137. <OFullRefresh
  138. v-model:modelValue={refreshing.value}
  139. onRefresh={onRefresh}
  140. style="min-height: 100vh;"
  141. >
  142. <List
  143. // v-model:loading={form.listState.loading}
  144. finished={form.listState.finished}
  145. finishedText=" "
  146. class={[styles.liveList]}
  147. onLoad={getList}
  148. style={{
  149. paddingTop: '12px'
  150. }}
  151. immediateCheck={false}
  152. >
  153. {form.list.map((item: any) => (
  154. <UnitListItem item={item}></UnitListItem>
  155. ))}
  156. </List>
  157. </OFullRefresh>
  158. ) : (
  159. <OEmpty tips="暂无阶段自测" />
  160. )}
  161. <ActionSheet
  162. v-model:show={form.oPopover}
  163. cancelText="取消"
  164. actions={
  165. [
  166. { name: '班级类型', id: 'ALL' },
  167. { name: '单技班', id: 'SINGLE' },
  168. { name: '乐理班', id: 'MUSIC_THEORY' },
  169. { name: '合奏班', id: 'INSTRUMENTAL_ENSEMBLE' }
  170. ] as any
  171. }
  172. onSelect={(val: any) => {
  173. form.statusText = val.name
  174. form.params.classTypeCode = val.id === 'ALL' ? null : val.id
  175. form.oPopover = false
  176. onSearch()
  177. }}
  178. />
  179. </div>
  180. )
  181. }
  182. })