index.tsx 6.8 KB

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