index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import MHeader from '@/components/m-header';
  2. import MSticky from '@/components/m-sticky';
  3. import { defineComponent, onMounted, reactive } from 'vue';
  4. import { useEventListener, useWindowScroll } from '@vueuse/core';
  5. import styles from './index.module.less';
  6. import { Image } from 'vant';
  7. import request from '@/helpers/request';
  8. import { useRoute } from 'vue-router';
  9. import AudioPlayer from '../components/audio-player';
  10. import banner from '../images/banner1.png';
  11. import musicBg from '../images/music_bg.png';
  12. import MEmpty from '@/components/m-empty';
  13. export default defineComponent({
  14. name: 'instrument-detail',
  15. setup() {
  16. const route = useRoute();
  17. const forms = reactive({
  18. titleOpacity: 0,
  19. background: 'transparent',
  20. color: '#fff',
  21. detail: {} as any,
  22. musicList: [] as any,
  23. loading: false
  24. });
  25. const getDetail = async () => {
  26. forms.loading = true;
  27. try {
  28. const { data } = await request.get(
  29. '/edu-app/knowledgeWiki/detail/' + route.query.id
  30. );
  31. data.intros = data.intros.replace(
  32. /<video/gi,
  33. '<video style="width: 100% !important;" controlslist="nodownload" poster="https://oss.dayaedu.com/ktqy/1701759849244.png"'
  34. );
  35. forms.detail = data || {};
  36. forms.musicList = data.knowledgeWikiResources.map((item: any) => {
  37. return {
  38. id: item.id,
  39. name: item.name,
  40. url: item.url
  41. };
  42. });
  43. } catch {}
  44. forms.loading = false;
  45. };
  46. onMounted(() => {
  47. useEventListener(document, 'scroll', () => {
  48. const { y } = useWindowScroll();
  49. forms.titleOpacity = y.value > 100 ? 1 : y.value / 100;
  50. });
  51. getDetail();
  52. });
  53. return () => (
  54. <div class={styles.detail}>
  55. <div class={styles.bgSection}>
  56. <img class={styles.bg} src={forms.detail.avatar || musicBg} />
  57. </div>
  58. <MSticky position="top">
  59. <MHeader
  60. border={false}
  61. background={`rgba(255,255,255, ${forms.titleOpacity})`}
  62. color={`rgba(51,51,51, ${forms.titleOpacity})`}
  63. title={forms.detail.name || ''}></MHeader>
  64. </MSticky>
  65. <div class={styles.container}>
  66. <div class={styles.musicHeader}>
  67. <div class={styles.imgSection}>
  68. <Image
  69. class={styles.img}
  70. src={forms.detail.avatar || musicBg}
  71. fit="cover"
  72. />
  73. <div class={styles.pan}>
  74. <img src={forms.detail.avatar || musicBg} />
  75. </div>
  76. </div>
  77. <div class={styles.musicContent}>
  78. <div class={[styles.musicTitle, 'van-multi-ellipsis--l2']}>
  79. {forms.detail.name || '--'}
  80. </div>
  81. <div class={styles.musicInto}>
  82. {forms.detail.lyricists && (
  83. <span>作词:{forms.detail.lyricists}</span>
  84. )}
  85. {forms.detail.composers && (
  86. <span>作曲:{forms.detail.composers}</span>
  87. )}
  88. </div>
  89. </div>
  90. </div>
  91. {/* <div class={styles.title}>{forms.detail.name}</div> */}
  92. {forms.detail.intros ? (
  93. <div class={styles.content} v-html={forms.detail.intros}></div>
  94. ) : (
  95. ''
  96. )}
  97. {!forms.loading && !forms.detail.intros && (
  98. <div class={styles.content}>
  99. <MEmpty description="暂无内容" />
  100. </div>
  101. )}
  102. </div>
  103. <MSticky position="bottom">
  104. {forms.musicList.length > 0 && (
  105. <AudioPlayer musicList={forms.musicList} />
  106. )}
  107. </MSticky>
  108. </div>
  109. );
  110. }
  111. });