view.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import MHeader from '@/components/m-header';
  2. import MSticky from '@/components/m-sticky';
  3. import { defineComponent, nextTick, 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" poster="https://oss.dayaedu.com/ktqy/1701759849244.png"'
  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. const getMessage = (ev: any) => {
  46. if (ev.data.api === 'parent-notes') {
  47. // console.log(ev.data, 'data');
  48. const data = ev.data.message ? JSON.parse(ev.data.message) : {};
  49. forms.detail = data || {};
  50. forms.detail.intros = forms.detail.intros?.replace(
  51. /<video/gi,
  52. '<video style="width: 100% !important;" controlslist="nodownload" poster="https://oss.dayaedu.com/ktqy/1701759849244.png"'
  53. );
  54. forms.musicList = data.knowledgeWikiResources?.map((item: any) => {
  55. return {
  56. id: item.id,
  57. name: item.name,
  58. url: item.url
  59. };
  60. });
  61. }
  62. };
  63. onMounted(() => {
  64. useEventListener(document, 'scroll', () => {
  65. const { y } = useWindowScroll();
  66. forms.titleOpacity = y.value > 100 ? 1 : y.value / 100;
  67. });
  68. // getDetail();
  69. nextTick(() => {
  70. // 是否加载完成
  71. window.parent &&
  72. window.parent.postMessage(
  73. {
  74. api: 'onLoad',
  75. status: true
  76. },
  77. '*'
  78. );
  79. });
  80. window.addEventListener('message', getMessage);
  81. });
  82. return () => (
  83. <div class={styles.detail}>
  84. <div class={styles.bgSection}>
  85. <img class={styles.bg} src={forms.detail.avatar || banner} />
  86. </div>
  87. <MSticky position="top">
  88. <MHeader
  89. isBack={false}
  90. border={false}
  91. background={`rgba(255,255,255, ${forms.titleOpacity})`}
  92. color={`rgba(51,51,51, ${forms.titleOpacity})`}
  93. title={forms.detail.name || ''}></MHeader>
  94. </MSticky>
  95. <div class={styles.container}>
  96. <div class={styles.instrumentLogo}>
  97. <Image class={styles.logo} fit="cover" src={forms.detail.avatar} />
  98. </div>
  99. <div class={styles.title}>{forms.detail.name}</div>
  100. <div class={styles.content}>
  101. <div class={"only-child-select"} v-html={forms.detail.intros}></div>
  102. </div>
  103. {!forms.loading && !forms.detail.intros && (
  104. <MEmpty description="暂无内容" />
  105. )}
  106. </div>
  107. <MSticky position="bottom">
  108. {forms.musicList.length > 0 && (
  109. <AudioPlayer musicList={forms.musicList} />
  110. )}
  111. </MSticky>
  112. </div>
  113. );
  114. }
  115. });