searchAlbum.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. console.log(val, 'onSearchonSearchonSearch')
  27. data.value.rows = []
  28. params.name = val
  29. params.page = 1
  30. FetchList()
  31. }
  32. const params = reactive({
  33. name: (route.query.search as string) || '',
  34. rows: 20,
  35. page: 1
  36. })
  37. const data = ref<any>(null)
  38. const loading = ref(false)
  39. const finished = ref(false)
  40. const isError = ref(false)
  41. const FetchList = async () => {
  42. if (loading.value) {
  43. return
  44. }
  45. loading.value = true
  46. isError.value = false
  47. try {
  48. const res = await request.post(
  49. `/api-student/music/sheet/searchTenant`,
  50. {
  51. data: params
  52. }
  53. )
  54. if (data.value) {
  55. const result = (data.value?.rows || []).concat(
  56. res.data.music.rows || []
  57. )
  58. data.value.rows = result
  59. }
  60. data.value = data.value || res.data.music
  61. const temp = data.value.rows || []
  62. temp.forEach((item: any) => {
  63. if (keyword.value) {
  64. item.musicSheetName = item.musicSheetName.replace(
  65. keyword.value,
  66. `<span style="color: #FE2451">${keyword.value}</span>`
  67. )
  68. }
  69. })
  70. data.value.rows = temp
  71. params.page = res.data.music.pageNo + 1
  72. finished.value = res.data.music.pageNo >= res.data.music.totalPage
  73. } catch (error) {
  74. isError.value = true
  75. }
  76. loading.value = false
  77. }
  78. onMounted(() => {
  79. mitter.on('search', onSearch)
  80. })
  81. onUnmounted(() => {
  82. mitter.off('search', onSearch)
  83. })
  84. return () => {
  85. return (
  86. <div class={[styles.search, styles.searchAlbum]}>
  87. <List
  88. // loading={loading.value}
  89. finished={finished.value}
  90. finished-text={data.value && data.value.rows.length ? '' : ''}
  91. onLoad={FetchList}
  92. error={isError.value}
  93. >
  94. {data.value && data.value.rows.length && (
  95. <Song
  96. showTitleImg
  97. list={data.value.rows}
  98. onDetail={(item: any) => {
  99. const url =
  100. location.origin +
  101. location.pathname +
  102. '#/music-detail?id=' +
  103. item.id
  104. openDefaultWebView(url, () => {
  105. router.push({
  106. path: '/music-detail',
  107. query: {
  108. id: item.id
  109. }
  110. })
  111. })
  112. }}
  113. />
  114. )}
  115. </List>
  116. {!loading.value && <ColResult tips="暂无曲目" btnStatus={false} />}
  117. </div>
  118. )
  119. }
  120. }
  121. })