index.tsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. import request from '@/helpers/request'
  2. import { state } from '@/state'
  3. import { Tab, Tabs, DropdownMenu, DropdownItem, List } from 'vant'
  4. import {
  5. computed,
  6. defineComponent,
  7. onMounted,
  8. reactive,
  9. Transition,
  10. ref
  11. } from 'vue'
  12. import styles from './index.module.less'
  13. import { useRouter, useRoute } from 'vue-router'
  14. import ColHeader from '@/components/col-header'
  15. import TheSticky from '@/components/the-sticky'
  16. import bgImg from '../../images/bg.png'
  17. import Search from '@/components/col-search'
  18. import CourseItem from './component/CourseItem'
  19. import ColResult from '@/components/col-result'
  20. export default defineComponent({
  21. name: 'lessonCourseware',
  22. setup() {
  23. const router = useRouter()
  24. const route = useRoute()
  25. const params = reactive<{
  26. keyword: string
  27. albumId: string
  28. subjectList: any[]
  29. page: number
  30. }>({
  31. keyword: (route.query.search as string) || '',
  32. albumId: route.query.albumId as string,
  33. subjectList: [],
  34. page: 1
  35. })
  36. const loading = ref(false)
  37. const finished = ref(false)
  38. const isError = ref(false)
  39. const subjectOptValue = ref('')
  40. const subjectOpt = ref<any[]>([])
  41. enum courseEmnu {
  42. PERCUSSION_SINGLE = '打击乐',
  43. FLUTE_SINGLE = '长笛',
  44. SAX_SINGLE = '萨克斯',
  45. CLARINET_SINGLE = '单簧管',
  46. TRUMPET_SINGLE = '小号',
  47. TROMBONE_SINGLE = '长号',
  48. HORN_SINGLE = '圆号',
  49. BARITONE_TUBA_SINGLE = '上低音号-大号',
  50. MUSIC_THEORY = '乐理',
  51. INSTRUMENTAL_ENSEMBLE = '合奏',
  52. EUPHONIUM_SINGLE = '上低音号',
  53. TUBA_SINGLE = '大号'
  54. }
  55. const getSelectCondition = async () => {
  56. try {
  57. const res = await request.post(
  58. `/api-student/tenantAlbumMusic/selectCondition`,
  59. {
  60. data: {
  61. subjectType: 'COURSEWARE',
  62. tenantAlbumId: params.albumId
  63. }
  64. }
  65. )
  66. if (res.code === 200) {
  67. subjectOpt.value = [
  68. {
  69. text: '全部教材',
  70. value: ''
  71. },
  72. ...(res.data?.courseTypeList || []).map(item => {
  73. return {
  74. text: courseEmnu[item],
  75. value: item
  76. }
  77. })
  78. ]
  79. }
  80. } catch {
  81. //
  82. }
  83. }
  84. function onSearch(value: string) {
  85. params.page = 1
  86. params.keyword = value
  87. params.subjectList = []
  88. FetchList()
  89. }
  90. function handleOnRefresh() {
  91. params.page = 1
  92. params.subjectList = []
  93. FetchList()
  94. }
  95. const FetchList = async () => {
  96. loading.value = true
  97. isError.value = false
  98. try {
  99. const res = await request.post(`/api-student/tenantAlbumMusic/page`, {
  100. data: {
  101. courseTypeCode: subjectOptValue.value,
  102. keyword: params.keyword,
  103. albumId: params.albumId,
  104. subjectType: 'COURSEWARE',
  105. page: params.page,
  106. rows: 20
  107. }
  108. })
  109. if (params.subjectList?.length > 0 && res.data.pageNo === 1) {
  110. return
  111. }
  112. const result = (params.subjectList || []).concat(res.data?.rows || [])
  113. params.subjectList = result
  114. params.page = res.data.pageNo + 1
  115. finished.value = res.data.pageNo >= res.data.totalPage
  116. } catch (error) {
  117. isError.value = true
  118. }
  119. loading.value = false
  120. }
  121. onMounted(async () => {
  122. loading.value = true
  123. await getSelectCondition()
  124. if (params.albumId) {
  125. await FetchList()
  126. } else {
  127. loading.value = false
  128. }
  129. })
  130. return () => {
  131. return (
  132. <>
  133. <div class={styles.sticky}>
  134. <TheSticky>
  135. <ColHeader
  136. hideHeader={false}
  137. background="transparent"
  138. isFixed={false}
  139. border={false}
  140. title={'云教程'}
  141. color="#131415"
  142. ></ColHeader>
  143. <Search
  144. class={styles.search}
  145. onSearch={onSearch}
  146. type="tenant"
  147. placeholder={'请输入教材关键词'}
  148. background="transparent"
  149. inputBackground="transparent"
  150. // leftIcon={iconSearch}
  151. v-slots={{
  152. left: () =>
  153. subjectOpt.value.length > 1 && (
  154. <DropdownMenu class={styles.dropdownMenuSub}>
  155. <DropdownItem
  156. titleClass={styles.titleActive}
  157. v-model={subjectOptValue.value}
  158. options={subjectOpt.value}
  159. onChange={handleOnRefresh}
  160. >
  161. <div></div>
  162. </DropdownItem>
  163. </DropdownMenu>
  164. )
  165. }}
  166. />
  167. </TheSticky>
  168. <img class={styles.bgImg} src={bgImg} />
  169. </div>
  170. <div class={styles.alumnList}>
  171. <List
  172. loading={loading.value}
  173. finished={finished.value}
  174. finished-text={''}
  175. onLoad={FetchList}
  176. error={isError.value}
  177. immediateCheck={false}
  178. >
  179. {params.subjectList.length ? (
  180. <CourseItem
  181. class={[styles.courseItem]}
  182. list={params.subjectList.map(item => {
  183. return {
  184. name: item.musicSheetName,
  185. coverImg: item.titleImg,
  186. id: item.id
  187. }
  188. })}
  189. onItemClick={row => {
  190. router.push({
  191. path: '/courseList',
  192. query: {
  193. id: row.id,
  194. albumId: params.albumId
  195. }
  196. })
  197. }}
  198. />
  199. ) : (
  200. !loading.value && (
  201. <ColResult
  202. tips="暂无教程"
  203. classImgSize="CERT"
  204. btnStatus={false}
  205. />
  206. )
  207. )}
  208. </List>
  209. </div>
  210. </>
  211. )
  212. }
  213. }
  214. })