index.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. export default defineComponent({
  13. name: 'instrument-detail',
  14. setup() {
  15. const route = useRoute();
  16. const forms = reactive({
  17. titleOpacity: 0,
  18. background: 'transparent',
  19. color: '#fff',
  20. detail: {} as any,
  21. musicList: [] as any
  22. });
  23. const getDetail = async () => {
  24. try {
  25. const { data } = await request.get(
  26. '/edu-app/knowledgeWiki/detail/' + route.query.id
  27. );
  28. data.intros = data.intros.replace(
  29. /<video/gi,
  30. '<video style="width: 100% !important;" controlslist="nodownload"'
  31. );
  32. forms.detail = data || {};
  33. forms.musicList = data.knowledgeWikiResources.map((item: any) => {
  34. return {
  35. id: item.id,
  36. name: item.name,
  37. url: item.url
  38. };
  39. });
  40. } catch {}
  41. };
  42. onMounted(() => {
  43. useEventListener(document, 'scroll', () => {
  44. const { y } = useWindowScroll();
  45. forms.titleOpacity = y.value > 100 ? 1 : y.value / 100;
  46. });
  47. getDetail();
  48. });
  49. return () => (
  50. <div class={styles.detail}>
  51. <div class={styles.bgSection}>
  52. <img class={styles.bg} src={forms.detail.avatar || musicBg} />
  53. </div>
  54. <MSticky position="top">
  55. <MHeader
  56. border={false}
  57. background={`rgba(255,255,255, ${forms.titleOpacity})`}
  58. color={`rgba(51,51,51, ${forms.titleOpacity})`}
  59. title={forms.detail.name || ''}></MHeader>
  60. </MSticky>
  61. <div class={styles.container}>
  62. <div class={styles.musicHeader}>
  63. <div class={styles.imgSection}>
  64. <Image class={styles.img} src={forms.detail.avatar || musicBg} />
  65. <div class={styles.pan}>
  66. <img src={forms.detail.avatar || musicBg} />
  67. </div>
  68. </div>
  69. <div class={styles.musicContent}>
  70. <div class={styles.musicTitle}>{forms.detail.name || '--'}</div>
  71. <div class={styles.musicInto}>
  72. {forms.detail.lyricists && (
  73. <span>作词:{forms.detail.lyricists}</span>
  74. )}
  75. {forms.detail.composers && (
  76. <span>作曲:{forms.detail.composers}</span>
  77. )}
  78. </div>
  79. </div>
  80. </div>
  81. {/* <div class={styles.title}>{forms.detail.name}</div> */}
  82. <div class={styles.content} v-html={forms.detail.intros}></div>
  83. </div>
  84. <MSticky position="bottom">
  85. {forms.musicList.length > 0 && (
  86. <AudioPlayer musicList={forms.musicList} />
  87. )}
  88. </MSticky>
  89. </div>
  90. );
  91. }
  92. });