index.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 MEmpty from '@/components/m-empty';
  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. loading: false
  23. });
  24. const getDetail = async () => {
  25. forms.loading = true;
  26. try {
  27. const { data } = await request.get(
  28. '/edu-app/knowledgeWiki/detail/' + route.query.id
  29. );
  30. data.intros = data.intros.replace(
  31. /<video/gi,
  32. '<video style="width: 100% !important;" controlslist="nodownload"'
  33. );
  34. forms.detail = data || {};
  35. forms.musicList = data.knowledgeWikiResources.map((item: any) => {
  36. return {
  37. id: item.id,
  38. name: item.name,
  39. url: item.url
  40. };
  41. });
  42. } catch {}
  43. forms.loading = false;
  44. };
  45. onMounted(() => {
  46. useEventListener(document, 'scroll', () => {
  47. const { y } = useWindowScroll();
  48. forms.titleOpacity = y.value > 100 ? 1 : y.value / 100;
  49. });
  50. getDetail();
  51. });
  52. return () => (
  53. <div class={styles.detail}>
  54. <div class={styles.bgSection}>
  55. <img class={styles.bg} src={forms.detail.avatar || banner} />
  56. </div>
  57. <MSticky position="top">
  58. <MHeader
  59. border={false}
  60. background={`rgba(255,255,255, ${forms.titleOpacity})`}
  61. color={`rgba(51,51,51, ${forms.titleOpacity})`}
  62. title={forms.detail.name || ''}></MHeader>
  63. </MSticky>
  64. <div class={styles.container}>
  65. <div class={styles.instrumentLogo}>
  66. <Image class={styles.logo} fit="cover" src={forms.detail.avatar} />
  67. </div>
  68. <div class={styles.title}>{forms.detail.name}</div>
  69. <div class={styles.content} v-html={forms.detail.intros}></div>
  70. {!forms.loading && !forms.detail.intros && (
  71. <MEmpty description="暂无内容" />
  72. )}
  73. </div>
  74. <MSticky position="bottom">
  75. {forms.musicList.length > 0 && (
  76. <AudioPlayer musicList={forms.musicList} />
  77. )}
  78. </MSticky>
  79. </div>
  80. );
  81. }
  82. });