list.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import { defineComponent, onMounted, reactive, watch } from "vue";
  2. import styles from "./index.module.less";
  3. import { api_musicSheetPage } from "../../api";
  4. import state, { togglePlay } from "/src/state";
  5. import { List, Image, Field, DropdownMenu, DropdownItem } from "vant";
  6. import { postMessage } from "/src/utils/native-message";
  7. import qs from "query-string";
  8. import searImg from "./imgs/searImg.png"
  9. import huoimg from "./imgs/huo.png"
  10. import emptyImg from "./imgs/empty.png"
  11. import { getQuery } from "/src/utils/queryString";
  12. import dayjs from "dayjs";
  13. import { storeData } from "/src/store"
  14. import { vipShow } from "../vip"
  15. export default defineComponent({
  16. name: "TheMusicList-list",
  17. props: {
  18. recentFlag: {
  19. type: Boolean,
  20. default: false,
  21. },
  22. },
  23. setup(props) {
  24. const query: any = getQuery();
  25. const forms = reactive({
  26. name: "",
  27. page: 1,
  28. rows: 20,
  29. musicalInstrumentId: state.instrumentId,
  30. musicSheetCategoriesId: state.bizMusicCategoryId,
  31. recentFlag: props.recentFlag ? true : null,
  32. excludeMusicId: props.recentFlag ? null : state.examSongId,
  33. });
  34. const data = reactive({
  35. isFocus: false,
  36. list: [] as any[],
  37. finished: false,
  38. loading: false,
  39. hasNext: true,
  40. });
  41. const getList = async () => {
  42. if (!data.hasNext) return;
  43. data.loading = true;
  44. try {
  45. const res = await api_musicSheetPage({
  46. ...forms
  47. });
  48. if (res?.code === 200 && Array.isArray(res.data?.rows)) {
  49. data.list = [...data.list, ...res.data.rows];
  50. }
  51. data.finished = res.data?.rows?.length < forms.rows;
  52. data.hasNext = res.data?.total > data.list.length;
  53. } catch (error) {
  54. console.log(error);
  55. }
  56. data.loading = false;
  57. };
  58. function handleQuery(){
  59. forms.page = 1
  60. forms.rows = 20
  61. data.list = []
  62. data.finished =false
  63. data.loading = false
  64. data.hasNext = true
  65. getList()
  66. }
  67. watch(
  68. () => props.recentFlag,
  69. () => {
  70. data.hasNext = true;
  71. }
  72. );
  73. onMounted(() => {
  74. getList();
  75. });
  76. const openAccomapina = (item: any) => {
  77. if(item.paymentType === "VIP" && state.systemType === "student" && !dayjs().isBefore(dayjs(storeData.user?.membershipEndTime))){
  78. vipShow.value = true
  79. return
  80. }
  81. if(item.paymentType === "VIP" && state.systemType === "web" && state.isSchool){
  82. vipShow.value = true
  83. return
  84. }
  85. if (item.id === state.examSongId) return;
  86. // 暂停播放
  87. togglePlay("paused");
  88. postMessage({
  89. api: "cloudLoading",
  90. content: {
  91. show: true,
  92. type: "fullscreen",
  93. },
  94. });
  95. const queryObj = {
  96. ...query
  97. }
  98. queryObj.id = item.id
  99. queryObj["part-index"] = ""
  100. location.href =
  101. location.origin +
  102. location.pathname +
  103. "?" +
  104. qs.stringify(queryObj);
  105. };
  106. function formatNumber(num:number) {
  107. return num >= 10000
  108. ? (num / 10000).toFixed(1).replace(/\.0$/, '') + "万"
  109. : num.toString();
  110. }
  111. return () => (
  112. <div class={styles.wrap}>
  113. <div class={[styles.searchBox,data.isFocus && styles.isFocus]}>
  114. <img src={searImg} />
  115. <Field placeholder="请输入曲目名称" v-model={forms.name} autocomplete="off" onFocus={()=>{ data.isFocus = true }} onBlur={()=>{ data.isFocus = false }} />
  116. <div class={styles.searchBtn} onClick={handleQuery}>搜索</div>
  117. </div>
  118. <List
  119. loading={data.loading}
  120. finished={data.finished}
  121. immediateCheck={false}
  122. onLoad={() => {
  123. forms.page++;
  124. getList();
  125. }}
  126. >
  127. {data.list.map((item: any) => {
  128. return (
  129. <div class={[styles.item, state.examSongId == item.id && styles.itemActive]} onClick={() => openAccomapina(item)}>
  130. <div class={styles.titleImg}>
  131. <i class={[styles.iconType, styles[item.paymentType]]}></i>
  132. <Image src={item.titleImg} class={styles.img} />
  133. </div>
  134. <div class={styles.content}>
  135. <p class={styles.name}>{item.musicSheetName}</p>
  136. {
  137. item.composer &&
  138. <div class={styles.detail}>
  139. {/* {item.usedNum && <div class={styles.usedNum}><img src={huoimg}/><div>{formatNumber(item.usedNum)}</div></div>} */}
  140. <p class={styles.author}>{item.composer}</p>
  141. </div>
  142. }
  143. </div>
  144. </div>
  145. );
  146. })}
  147. {!data.loading && data.list.length === 0
  148. && <div class={styles.empty}>
  149. <img src={emptyImg}/>
  150. <span>暂无内容</span>
  151. </div>}
  152. </List>
  153. </div>
  154. );
  155. },
  156. });