index.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /* eslint-disable jsx-a11y/iframe-has-title */
  2. import { useEffect, useRef, useState } from "react";
  3. import musicImg from "@/assets/img/music.png";
  4. import musicImgAc from "@/assets/img/musicAc.png";
  5. import styles from "./index.module.scss";
  6. import { baseURL } from "@/utils/http";
  7. import { useLocation } from "react-router-dom";
  8. import { useDispatch, useSelector } from "react-redux";
  9. import { getModelInfo } from "@/store/action/home";
  10. import { RootState } from "@/store";
  11. export default function Model() {
  12. const location = useLocation();
  13. const dispatch = useDispatch();
  14. // 发送请求获取信息,存到仓库
  15. useEffect(() => {
  16. const arr = location.search.split("=");
  17. const id = arr[1];
  18. dispatch(getModelInfo(id));
  19. }, [dispatch, location.search]);
  20. // 从仓库获取信息
  21. const info = useSelector((state: RootState) => state.homeStore.qrModel);
  22. // 控制模型放大缩小和复位
  23. const ifrBoxRef = useRef<any>(null);
  24. const modelChangeFu = (val: number) => {
  25. const dom = ifrBoxRef.current;
  26. if (dom && dom.contentWindow && dom.contentWindow.webview) {
  27. if (val === 1) dom.contentWindow.webview.zoomIn(); // 放大
  28. else if (val === 2) dom.contentWindow.webview.zoomOut(); // 缩小
  29. else dom.contentWindow.webview.resetView(); // 复位
  30. }
  31. };
  32. // 控制音乐播放暂停
  33. const musicRef = useRef<HTMLAudioElement>(null);
  34. const [music, setMusic] = useState(false);
  35. const musicPlayFu = (flag: boolean) => {
  36. const dom = musicRef.current;
  37. if (dom) {
  38. if (flag) {
  39. // 打开音乐
  40. setMusic(true);
  41. dom.play();
  42. dom.addEventListener(
  43. "ended",
  44. function () {
  45. setMusic(false);
  46. },
  47. false
  48. );
  49. } else {
  50. // 关闭音乐
  51. setMusic(false);
  52. dom.pause();
  53. }
  54. }
  55. };
  56. return (
  57. <div className={styles.Model}>
  58. {/* 音频 */}
  59. {info.audioPath ? (
  60. <audio src={baseURL + info.audioPath} ref={musicRef}></audio>
  61. ) : null}
  62. {/* 模型盒子 */}
  63. <div className="ifrBox">
  64. {info.fileName ? (
  65. <iframe
  66. ref={ifrBoxRef}
  67. src={`model.html?m=${info.fileName}`}
  68. frameBorder="no"
  69. ></iframe>
  70. ) : null}
  71. </div>
  72. {/* 右边介绍 */}
  73. <div className="rightTxt">
  74. <div className="model_title">{info.name}</div>
  75. {info.description ? (
  76. <div
  77. className="model_txt"
  78. dangerouslySetInnerHTML={{ __html: info.description }}
  79. ></div>
  80. ) : (
  81. <div className="model_txt">暂无信息</div>
  82. )}
  83. <div className="model_floo">
  84. <div className="model_sortRow">
  85. 类别:
  86. <p>{info.dictTextureName ? info.dictTextureName : "(空)"}</p>
  87. </div>
  88. <div className="model_ageRow">
  89. 年代:
  90. <p>{info.dictAgeName ? info.dictAgeName : "(空)"}</p>
  91. </div>
  92. </div>
  93. {
  94. <div className="model_size">
  95. 尺寸:
  96. <p title={info.sizeLength}>
  97. {info.sizeLength ? info.sizeLength : "(空)"}
  98. </p>
  99. </div>
  100. }
  101. </div>
  102. {/* 底部按钮 */}
  103. <div className="flootBtnBox">
  104. <div
  105. className="flootRow flootRow1"
  106. title="放大"
  107. onClick={() => modelChangeFu(1)}
  108. ></div>
  109. <div
  110. className="flootRow flootRow2"
  111. title="缩小"
  112. onClick={() => modelChangeFu(2)}
  113. ></div>
  114. {info.audioPath ? (
  115. <div
  116. className="flootRow flootRowM"
  117. title={music ? "暂停音频" : "播放音频"}
  118. >
  119. {music ? (
  120. <img src={musicImgAc} alt="" onClick={() => musicPlayFu(false)} />
  121. ) : (
  122. <img src={musicImg} alt="" onClick={() => musicPlayFu(true)} />
  123. )}
  124. </div>
  125. ) : null}
  126. <div
  127. className="flootRow flootRow4"
  128. title="重置"
  129. onClick={() => modelChangeFu(3)}
  130. ></div>
  131. </div>
  132. </div>
  133. );
  134. }