searchAlbum.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { defineComponent, onMounted, onUnmounted, reactive, ref } from 'vue'
  2. import { useLocalStorage } from '@vueuse/core'
  3. import styles from './index.module.less'
  4. import { useRoute, useRouter } from 'vue-router'
  5. import { getRandomKey } from '../music'
  6. import { mitter } from './header'
  7. import { SubjectEnum, useSubjectId } from '@/helpers/hooks'
  8. import { List } from 'vant'
  9. import Song from '../component/song'
  10. import ColResult from '@/components/col-result'
  11. import { openDefaultWebView, state } from '@/state'
  12. import request from '@/helpers/request'
  13. export default defineComponent({
  14. name: 'MusicSearch',
  15. emits: ['confirm'],
  16. setup() {
  17. localStorage.setItem('behaviorId', getRandomKey())
  18. const route = useRoute()
  19. const router = useRouter()
  20. const keyword = ref(route.query.keyword || '')
  21. const subject = ref()
  22. const getSubject: any = useSubjectId(SubjectEnum.SEARCH)
  23. subject.value = getSubject.id
  24. const onSearch = val => {
  25. keyword.value = val
  26. if (data.value) {
  27. data.value.rows = []
  28. }
  29. params.name = val
  30. params.page = 1
  31. FetchList()
  32. }
  33. const params = reactive({
  34. name: (route.query.search as string) || '',
  35. rows: 20,
  36. page: 1
  37. })
  38. const data = ref<any>(null)
  39. const loading = ref(false)
  40. const finished = ref(false)
  41. const isError = ref(false)
  42. const FetchList = async () => {
  43. if (loading.value) {
  44. return
  45. }
  46. loading.value = true
  47. isError.value = false
  48. try {
  49. const res = await request.post(
  50. `/api-student/music/sheet/searchTenant`,
  51. {
  52. data: params
  53. }
  54. )
  55. if (data.value) {
  56. const result = (data.value?.rows || []).concat(
  57. res.data.music.rows || []
  58. )
  59. data.value.rows = result
  60. }
  61. data.value = data.value || res.data.music
  62. const temp = data.value.rows || []
  63. temp.forEach((item: any) => {
  64. if (keyword.value) {
  65. item.musicSheetName = item.musicSheetName.replace(
  66. keyword.value,
  67. `<span style="color: #FE2451">${keyword.value}</span>`
  68. )
  69. }
  70. })
  71. data.value.rows = temp
  72. params.page = res.data.music.pageNo + 1
  73. finished.value = res.data.music.pageNo >= res.data.music.totalPage
  74. } catch (error) {
  75. isError.value = true
  76. }
  77. loading.value = false
  78. }
  79. onMounted(() => {
  80. mitter.on('search', onSearch)
  81. FetchList()
  82. })
  83. onUnmounted(() => {
  84. mitter.off('search', onSearch)
  85. })
  86. return () => {
  87. return (
  88. <div class={[styles.search, styles.searchAlbum]}>
  89. {data.value && data.value.rows.length ? (
  90. <List
  91. // loading={loading.value}
  92. finished={finished.value}
  93. finished-text={data.value && data.value.rows.length ? '' : ''}
  94. onLoad={FetchList}
  95. error={isError.value}
  96. immediateCheck={false}
  97. >
  98. <Song
  99. showTitleImg
  100. list={data.value.rows}
  101. onDetail={(item: any) => {
  102. const url =
  103. location.origin +
  104. location.pathname +
  105. '#/music-detail?id=' +
  106. item.id +
  107. '&tenantAlbumId=' +
  108. item.tenantAlbumId
  109. openDefaultWebView(url, () => {
  110. router.push({
  111. path: '/music-detail',
  112. query: {
  113. id: item.id,
  114. tenantAlbumId: item.tenantAlbumId
  115. }
  116. })
  117. })
  118. }}
  119. />
  120. </List>
  121. ) : (
  122. !loading.value && <ColResult tips="暂无曲目" btnStatus={false} />
  123. )}
  124. </div>
  125. )
  126. }
  127. }
  128. })