TIANYONG 10 달 전
부모
커밋
e7d383a45c

+ 24 - 9
dist/colexiu.html

@@ -2,7 +2,11 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-f2575c3a.js"></script>
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/polyfills-b0c0e255.js"></script>
+=======
+  <script type="module" crossorigin src="./js/polyfills-7c3d5f60.js"></script>
+>>>>>>> feature-wxl-newVersion
 
   <meta charset="UTF-8" />
   <link rel="icon" type="image/svg+xml" href="./vite.svg" />
@@ -40,12 +44,19 @@
       },
     })
   </script>
-  <script type="module" crossorigin src="./js/colexiu-25baf21e.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-be69ca9c.js">
-  <link rel="modulepreload" crossorigin href="./js/index-084a0054.js">
-  <link rel="modulepreload" crossorigin href="./js/index-822e0bf9.js">
-  <link rel="stylesheet" href="./css/index-fe5b862d.css">
-  <link rel="stylesheet" href="./css/colexiu-62f31c4f.css">
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/colexiu-692b1810.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-cb4d4a18.js">
+  <link rel="modulepreload" crossorigin href="./js/index-a9592b3e.js">
+  <link rel="modulepreload" crossorigin href="./js/index-9d1a4475.js">
+=======
+  <script type="module" crossorigin src="./js/colexiu-817dd032.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-763e8b6a.js">
+  <link rel="modulepreload" crossorigin href="./js/index-624d1810.js">
+  <link rel="modulepreload" crossorigin href="./js/index-d6925e45.js">
+>>>>>>> feature-wxl-newVersion
+  <link rel="stylesheet" href="./css/index-ccf6117c.css">
+  <link rel="stylesheet" href="./css/colexiu-e8b419b5.css">
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};window.__vite_is_modern_browser=true;</script>
   <script type="module">!function(){if(window.__vite_is_modern_browser)return;console.warn("vite: loading legacy chunks, syntax error above and the same error below should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}();</script>
 </head>
@@ -55,8 +66,12 @@
   <img id="loading" class="show" src="./loading.svg" alt="loading" />
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-424b5cf2.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/colexiu-legacy-061aa0b8.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-95755a14.js"></script>
+<<<<<<< HEAD
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/colexiu-legacy-7c6a09d5.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/colexiu-legacy-587fa4ae.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> feature-wxl-newVersion
 </body>
 
 </html>

+ 23 - 8
dist/index.html

@@ -2,7 +2,11 @@
 <html lang="ZH-cn">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-f2575c3a.js"></script>
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/polyfills-b0c0e255.js"></script>
+=======
+  <script type="module" crossorigin src="./js/polyfills-7c3d5f60.js"></script>
+>>>>>>> feature-wxl-newVersion
 
   <meta charset="UTF-8">
   <link rel="icon" href="./favicon.ico" />
@@ -75,12 +79,19 @@
       }
     })
   </script>
-  <script type="module" crossorigin src="./js/gym-5e389320.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-be69ca9c.js">
-  <link rel="modulepreload" crossorigin href="./js/index-084a0054.js">
-  <link rel="modulepreload" crossorigin href="./js/index-2c5fcc1f.js">
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/gym-038e069a.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-cb4d4a18.js">
+  <link rel="modulepreload" crossorigin href="./js/index-a9592b3e.js">
+  <link rel="modulepreload" crossorigin href="./js/index-0b73c777.js">
+=======
+  <script type="module" crossorigin src="./js/gym-a1294940.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-763e8b6a.js">
+  <link rel="modulepreload" crossorigin href="./js/index-624d1810.js">
+  <link rel="modulepreload" crossorigin href="./js/index-1dc5c539.js">
+>>>>>>> feature-wxl-newVersion
   <link rel="modulepreload" crossorigin href="./js/plyr.min-c8c2777b.js">
-  <link rel="stylesheet" href="./css/index-fe5b862d.css">
+  <link rel="stylesheet" href="./css/index-ccf6117c.css">
   <link rel="stylesheet" href="./css/index-85f95688.css">
   <link rel="stylesheet" href="./css/plyr-ad8ef5ae.css">
   <link rel="stylesheet" href="./css/index-171cd132.css">
@@ -97,8 +108,12 @@
   <img id="loading" class="show" src="./loading.svg" alt="loading" />
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-424b5cf2.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/gym-legacy-a1b40878.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-95755a14.js"></script>
+<<<<<<< HEAD
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/gym-legacy-9ebb831e.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/gym-legacy-9c45ea39.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> feature-wxl-newVersion
 </body>
 
 </html>

+ 24 - 11
dist/instrument.html

@@ -2,7 +2,11 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-f2575c3a.js"></script>
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/polyfills-b0c0e255.js"></script>
+=======
+  <script type="module" crossorigin src="./js/polyfills-7c3d5f60.js"></script>
+>>>>>>> feature-wxl-newVersion
 
   <meta charset="UTF-8" />
   <meta name="viewport"
@@ -10,7 +14,6 @@
   <title>AI学练</title>
   <link rel="icon" href="./favicon.ico?v=1" />
   <script src="./flexible.js" charset="UTF-8"></script>
-  <script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
   <style>
     #loading {
       position: fixed;
@@ -25,10 +28,6 @@
     }
   </style>
   <script>
-    // VConsole will be exported to `window.VConsole` by default.
-    // var vConsole = new window.VConsole();
-  </script>
-  <script>
     function _postMessage(data, callback) {
       const instance = window.COLEXIU || (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.COLEXIU)
       if (instance) {
@@ -46,9 +45,14 @@
       })
     }
   </script>
-  <script type="module" crossorigin src="./js/instrument-f6b75fd0.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-be69ca9c.js">
-  <link rel="stylesheet" href="./css/index-fe5b862d.css">
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/instrument-8de4db9c.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-cb4d4a18.js">
+=======
+  <script type="module" crossorigin src="./js/instrument-e3875fa3.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-763e8b6a.js">
+>>>>>>> feature-wxl-newVersion
+  <link rel="stylesheet" href="./css/index-ccf6117c.css">
   <link rel="stylesheet" href="./css/instrument-f3d1af9e.css">
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};window.__vite_is_modern_browser=true;</script>
   <script type="module">!function(){if(window.__vite_is_modern_browser)return;console.warn("vite: loading legacy chunks, syntax error above and the same error below should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}();</script>
@@ -66,9 +70,18 @@
   </script>
 
   
+  <script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
+  <script>
+    // VConsole will be exported to `window.VConsole` by default.
+    // var vConsole = new window.VConsole();
+  </script>
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-424b5cf2.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-6ed31d8c.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-95755a14.js"></script>
+<<<<<<< HEAD
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-93a35baf.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-4b1cdc45.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> feature-wxl-newVersion
 </body>
 
 </html>

+ 26 - 10
dist/orchestra.html

@@ -2,7 +2,11 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-f2575c3a.js"></script>
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/polyfills-b0c0e255.js"></script>
+=======
+  <script type="module" crossorigin src="./js/polyfills-7c3d5f60.js"></script>
+>>>>>>> feature-wxl-newVersion
 
   <meta charset="UTF-8" />
   <!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> -->
@@ -41,14 +45,22 @@
       transition: opacity .3s;
     }
   </style>
-  <script type="module" crossorigin src="./js/orchestra-e3d88447.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-be69ca9c.js">
-  <link rel="modulepreload" crossorigin href="./js/index-084a0054.js">
-  <link rel="modulepreload" crossorigin href="./js/index-822e0bf9.js">
-  <link rel="modulepreload" crossorigin href="./js/index-2c5fcc1f.js">
-  <link rel="stylesheet" href="./css/index-fe5b862d.css">
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/orchestra-d46fb4d8.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-cb4d4a18.js">
+  <link rel="modulepreload" crossorigin href="./js/index-a9592b3e.js">
+  <link rel="modulepreload" crossorigin href="./js/index-9d1a4475.js">
+  <link rel="modulepreload" crossorigin href="./js/index-0b73c777.js">
+=======
+  <script type="module" crossorigin src="./js/orchestra-fb7429c2.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-763e8b6a.js">
+  <link rel="modulepreload" crossorigin href="./js/index-624d1810.js">
+  <link rel="modulepreload" crossorigin href="./js/index-d6925e45.js">
+  <link rel="modulepreload" crossorigin href="./js/index-1dc5c539.js">
+>>>>>>> feature-wxl-newVersion
+  <link rel="stylesheet" href="./css/index-ccf6117c.css">
   <link rel="stylesheet" href="./css/index-85f95688.css">
-  <link rel="stylesheet" href="./css/orchestra-8bc1a9c0.css">
+  <link rel="stylesheet" href="./css/orchestra-8e05e751.css">
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};window.__vite_is_modern_browser=true;</script>
   <script type="module">!function(){if(window.__vite_is_modern_browser)return;console.warn("vite: loading legacy chunks, syntax error above and the same error below should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}();</script>
 </head>
@@ -69,8 +81,12 @@
   </script>
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-424b5cf2.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/orchestra-legacy-2a00faa8.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-95755a14.js"></script>
+<<<<<<< HEAD
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/orchestra-legacy-56bade97.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/orchestra-legacy-56a35f49.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> feature-wxl-newVersion
 </body>
 
 </html>

+ 19 - 6
dist/report-share.html

@@ -2,7 +2,11 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-f2575c3a.js"></script>
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/polyfills-b0c0e255.js"></script>
+=======
+  <script type="module" crossorigin src="./js/polyfills-7c3d5f60.js"></script>
+>>>>>>> feature-wxl-newVersion
 
   <meta charset="UTF-8" />
   <!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> -->
@@ -25,10 +29,15 @@
       transition: opacity .3s;
     }
   </style>
-  <script type="module" crossorigin src="./js/report-share-a8cd145c.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-be69ca9c.js">
+<<<<<<< HEAD
+  <script type="module" crossorigin src="./js/report-share-a478b037.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-cb4d4a18.js">
+=======
+  <script type="module" crossorigin src="./js/report-share-ad36c120.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-763e8b6a.js">
+>>>>>>> feature-wxl-newVersion
   <link rel="modulepreload" crossorigin href="./js/plyr.min-c8c2777b.js">
-  <link rel="stylesheet" href="./css/index-fe5b862d.css">
+  <link rel="stylesheet" href="./css/index-ccf6117c.css">
   <link rel="stylesheet" href="./css/plyr-ad8ef5ae.css">
   <link rel="stylesheet" href="./css/report-share-0f4c3151.css">
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};window.__vite_is_modern_browser=true;</script>
@@ -51,8 +60,12 @@
   </script>
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-424b5cf2.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/report-share-legacy-43aa7796.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-95755a14.js"></script>
+<<<<<<< HEAD
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/report-share-legacy-08fa8bd4.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/report-share-legacy-7001a7f7.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> feature-wxl-newVersion
 </body>
 
 </html>

+ 0 - 5
instrument.html

@@ -8,7 +8,6 @@
   <title>AI学练</title>
   <link rel="icon" href="/favicon.ico?v=1" />
   <script src="/flexible.js" charset="UTF-8"></script>
-  <script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
   <style>
     #loading {
       position: fixed;
@@ -23,10 +22,6 @@
     }
   </style>
   <script>
-    // VConsole will be exported to `window.VConsole` by default.
-    // var vConsole = new window.VConsole();
-  </script>
-  <script>
     function _postMessage(data, callback) {
       const instance = window.COLEXIU || (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.COLEXIU)
       if (instance) {

+ 5 - 10
package-lock.json

@@ -7154,8 +7154,7 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
       "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "@octokit/plugin-rest-endpoint-methods": {
       "version": "7.1.2",
@@ -7313,8 +7312,7 @@
     "@vant/use": {
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/@vant/use/-/use-1.5.1.tgz",
-      "integrity": "sha512-Zxd7lDz/LliVYEQi3PR9a8CQa/kGCVzF0u9hqDMaTlgXlbG0wHMFPllrcG0ThR6bfs8xrYVuSFM9pJn6HSoUGQ==",
-      "requires": {}
+      "integrity": "sha512-Zxd7lDz/LliVYEQi3PR9a8CQa/kGCVzF0u9hqDMaTlgXlbG0wHMFPllrcG0ThR6bfs8xrYVuSFM9pJn6HSoUGQ=="
     },
     "@varlet/icons": {
       "version": "2.9.5",
@@ -7377,8 +7375,7 @@
       "version": "4.3.4",
       "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz",
       "integrity": "sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "@vitejs/plugin-vue-jsx": {
       "version": "3.0.1",
@@ -8883,8 +8880,7 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/postcss-pxtorem/-/postcss-pxtorem-6.0.0.tgz",
       "integrity": "sha512-ZRXrD7MLLjLk2RNGV6UA4f5Y7gy+a/j1EqjAfp9NdcNYVjUMvg5HTYduTjSkKBkRkfqbg/iKrjMO70V4g1LZeg==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "proxy-from-env": {
       "version": "1.1.0",
@@ -9693,8 +9689,7 @@
     "ws": {
       "version": "8.13.0",
       "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
-      "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
-      "requires": {}
+      "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA=="
     },
     "y18n": {
       "version": "5.0.8",

+ 1 - 0
src/page-instrument/component/mode-type-mode/index.tsx

@@ -48,6 +48,7 @@ export default defineComponent({
       // console.log("🚀 ~ student:", student);
       if (storeData.user.vipMember) {
         data.showVip = false;
+        state.isVip = false;
         openGuid();
       }
     };

BIN
src/page-instrument/custom-plugins/guide-driver/images/evaluating/e4.png


BIN
src/page-instrument/custom-plugins/guide-driver/images/practise/d10.png


+ 32 - 0
src/page-instrument/custom-plugins/guide-driver/index.less

@@ -184,6 +184,13 @@
     right: 24px;
     bottom: -48px;
   }
+
+  &.popoverClose {
+    .driver-popover-next-btn {
+      bottom: 0;
+      right: 0;
+    }
+  }
 }
 
 .popoverClass9 {
@@ -193,6 +200,19 @@
   background-size: contain;
 }
 
+.popoverClass10 {
+  width: 264px;
+  height: 245px;
+  background: url("./images/practise/d10.png") no-repeat center;
+  background-size: contain;
+
+  .driver-popover-next-btn {
+    right: 24px;
+    bottom: 23px;
+  }
+}
+
+
 .popoverClose {
   .driver-popover-navigation-btns {
     position: absolute;
@@ -253,6 +273,18 @@
   }
 }
 
+.popoverClassE2 {
+  width: 257px;
+  height: 235px;
+  background: url("./images/evaluating/e4.png") no-repeat center;
+  background-size: contain;
+
+  .driver-popover-next-btn {
+    right: 17px;
+    bottom: 22px;
+  }
+}
+
 .popoverClassER1 {
   width: 257px;
   height: 178px;

+ 0 - 0
src/page-instrument/custom-plugins/guide-driver/index.module.less


+ 303 - 185
src/page-instrument/custom-plugins/guide-driver/index.tsx

@@ -1,4 +1,4 @@
-import { Teleport, defineComponent, nextTick, onMounted, ref } from "vue";
+import { PropType, Teleport, defineComponent, nextTick, onMounted, ref } from "vue";
 import { Config, DriveStep, PopoverDOM, State, driver } from "driver.js";
 import "driver.js/dist/driver.css";
 import state from "/src/state";
@@ -12,10 +12,28 @@ const endGuide = (guideInfo: any) => {
   }
 };
 
+/**
+ * 按钮状态
+ */
+type ButtonStatus = {
+  /** 声部状态 */
+  subjectStatus?: Boolean;
+  /** 练习模式 */
+  modelTypeStatus?: Boolean;
+};
+
 /** 练习模式 */
 export const PractiseDriver = defineComponent({
   name: "PractiseDriver",
-  setup() {
+  props: {
+    // 按钮状态
+    statusAll: {
+      type: Object as PropType<ButtonStatus>,
+      default: () => {},
+    },
+  },
+  setup(props) {
+    const driverNextStatus = ref(false);
     // 初始化部分引导位置
     const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }) => {
       options.config.stageRadius = 5;
@@ -27,27 +45,19 @@ export const PractiseDriver = defineComponent({
     };
 
     const driverOptions = (): Config => {
-      let length = state.setting.displayFingering ? 9 : 8;
+      // 指法
+      let length = state.setting.displayFingering ? 10 : 9;
+      // 声部
+      if (!props.statusAll.subjectStatus) {
+        length -= 1;
+      }
+      // 练习模式
+      if(!props.statusAll.modelTypeStatus) {
+        length -= 1;
+      }
+
+      console.log(props.statusAll, 'statusAll', length)
 
-      // 乐器方向不一样引导位置不一样
-      const instrumentDirection: DriveStep = {
-        element: ".driver-7",
-        popover: {
-          title: "",
-          description: "",
-          popoverClass: `popoverClass ${state.fingeringInfo.direction === "transverse" ? "popoverClass7" : "popoverClass7-1"}`,
-          align: state.fingeringInfo.direction === "transverse" ? "start" : "center",
-          side: state.fingeringInfo.direction === "transverse" ? "top" : "left",
-          nextBtnText: "下一步7/" + length,
-          showButtons: ["next"],
-          onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
-            if (state.fingeringInfo.direction === "transverse") driverInitialPosition(popover, options);
-          },
-          onCloseClick: () => {
-            onDriverClose();
-          },
-        },
-      };
       let options: Config = {
         showProgress: false,
         allowClose: false,
@@ -56,6 +66,12 @@ export const PractiseDriver = defineComponent({
         onCloseClick: () => {
           onDriverClose();
         },
+        onHighlightStarted: () => {
+          driverNextStatus.value = true;
+        },
+        onHighlighted: () => {
+          driverNextStatus.value = false;
+        },
         steps: [
           {
             element: ".driver-1",
@@ -133,75 +149,97 @@ export const PractiseDriver = defineComponent({
               },
             },
           },
-          {
-            element: ".driver-6",
-            popover: {
-              title: "",
-              description: "",
-              popoverClass: "popoverClass popoverClass6",
-              align: "start",
-              side: "top",
-              nextBtnText: "下一步6/" + length,
-              showButtons: ["next"],
-              onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
-                driverInitialPosition(popover, options);
-              },
-            },
-          },
         ] as DriveStep[],
       };
+
+
+      if (props.statusAll.subjectStatus) {
+        options.steps?.push({
+          element: ".driver-10",
+          popover: {
+            title: "",
+            description: "",
+            popoverClass: "popoverClass popoverClass10",
+            align: "start",
+            side: "top",
+            nextBtnText: `下一步${options.steps.length + 1}/${length}`,
+            showButtons: ["next"],
+            onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
+              driverInitialPosition(popover, options);
+            },
+          },
+        });
+      }
+
+      options.steps?.push({
+        element: ".driver-6",
+        popover: {
+          title: "",
+          description: "",
+          popoverClass: "popoverClass popoverClass6",
+          align: "start",
+          side: "top",
+          nextBtnText: `下一步${options.steps.length + 1}/${length}`, //"下一步6/" + length,
+          showButtons: ["next"],
+          onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
+            driverInitialPosition(popover, options);
+          },
+        },
+      });
       // 是否有指法图
       if (state.setting.displayFingering) {
+        // 乐器方向不一样引导位置不一样
         options.steps?.push(
-          instrumentDirection,
           {
-            element: ".driver-8",
+            element: ".driver-7",
             popover: {
               title: "",
               description: "",
-              popoverClass: "popoverClass popoverClass8",
-              align: "start",
-              side: "bottom",
-              nextBtnText: "下一步8/" + length,
+              popoverClass: `popoverClass ${state.fingeringInfo.direction === "transverse" ? "popoverClass7" : "popoverClass7-1"}`,
+              align: state.fingeringInfo.direction === "transverse" ? "start" : "center",
+              side: state.fingeringInfo.direction === "transverse" ? "top" : "left",
+              nextBtnText: `下一步${options.steps?.length + 1}/${length}`,
               showButtons: ["next"],
               onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
-                options.config.stageRadius = 1000;
-                options.config.stagePadding = 0;
-                try {
-                  const rect = options.state.activeElement?.getBoundingClientRect();
-                  popover.wrapper.style.marginLeft = (rect?.width || 0) / 2 - 4 + "px";
-                } catch {}
+                if (state.fingeringInfo.direction === "transverse") driverInitialPosition(popover, options);
               },
-            },
-          },
-          {
-            element: ".driver/" + length,
-            popover: {
-              title: "",
-              description: "",
-              popoverClass: "popoverClass popoverClass9 popoverClose",
-              align: "end",
-              side: "bottom",
-              prevBtnText: "再看一遍",
-              doneBtnText: "完成",
-              showButtons: ["next", "previous"],
-              onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
-                options.config.stageRadius = 1000;
-                options.config.stagePadding = 0;
-                try {
-                  const rect = options.state.activeElement?.getBoundingClientRect();
-                  popover.wrapper.style.marginLeft = -((rect?.width || 0) / 2 - 8) + "px";
-                } catch {}
-              },
-              onPrevClick: () => {
-                driverObj.drive(0);
-              },
-              onNextClick: () => {
+              onCloseClick: () => {
                 onDriverClose();
               },
             },
-          }
+          },
+          
         );
+      }
+
+      if(props.statusAll.modelTypeStatus) {
+        options.steps?.push({
+          element: ".driver-8",
+          popover: {
+            title: "",
+            description: "",
+            popoverClass: "popoverClass popoverClass8 popoverClose",
+            align: "start",
+            side: "bottom",
+            prevBtnText: "再看一遍",
+            doneBtnText: "完成",
+            showButtons: ["next", "previous"],
+            onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
+              options.config.stageRadius = 1000;
+              options.config.stagePadding = 0;
+              try {
+                const rect = options.state.activeElement?.getBoundingClientRect();
+                popover.wrapper.style.marginLeft = (rect?.width || 0) / 2 - 4 + "px";
+              } catch {}
+            },
+            onPrevClick: () => {
+              driverObj.drive(0);
+            },
+            onNextClick: () => {
+              onDriverClose();
+            },
+          },
+        });
       } else {
         options.steps?.push(
           {
@@ -212,7 +250,7 @@ export const PractiseDriver = defineComponent({
               popoverClass: "popoverClass popoverClass8",
               align: "start",
               side: "bottom",
-              nextBtnText: "下一步8/9",
+              nextBtnText: `下一步${options.steps.length + 1}/${length}`,
               showButtons: ["next"],
               onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
                 options.config.stageRadius = 1000;
@@ -253,19 +291,22 @@ export const PractiseDriver = defineComponent({
           }
         );
       }
+
       return options;
     };
 
     let driverObj: any;
 
     const handleClickOutside = (event: any) => {
-      if (driverObj.isActive() && (event.target.nodeName === "path" || event.target.classList.contains("driver-popover") || event.target.classList.contains("driver-overlay"))) {
-        if (driverObj.isLastStep()) {
-          onDriverClose();
-        } else {
-          driverObj.moveNext(); // 跳转到下一步
+        // 如果高亮没有结束则下进行下一步
+        if (driverNextStatus.value) return;
+        if (driverObj.isActive() && (event.target.nodeName === "path" || event.target.classList.contains("driver-popover") || event.target.classList.contains("driver-overlay"))) {
+          if (driverObj.isLastStep()) {
+            onDriverClose();
+          } else {
+            driverObj.moveNext(); // 跳转到下一步
+          }
         }
-      }
     };
 
     const guideInfo = ref({} as any);
@@ -287,8 +328,9 @@ export const PractiseDriver = defineComponent({
           document.addEventListener("click", handleClickOutside, true);
           driverObj = driver(driverOptions());
           nextTick(() => {
-            driverObj.drive(0);
+            driverObj.drive(6);
             showCloseBtn.value = true;
+            state.hasDriverPop = true;
           });
         }
       } catch (e) {
@@ -309,6 +351,7 @@ export const PractiseDriver = defineComponent({
       driverObj.destroy();
       document.querySelector(".driver-popover-close-btn-custom")?.remove();
       document.removeEventListener("click", handleClickOutside);
+      state.hasDriverPop = false
     };
 
     return () => (
@@ -329,7 +372,15 @@ export const PractiseDriver = defineComponent({
 /** 跟练模式 */
 export const FollowDriver = defineComponent({
   name: "FollowDriver",
-  setup() {
+  props: {
+    // 按钮状态
+    statusAll: {
+      type: Object as PropType<ButtonStatus>,
+      default: () => {},
+    },
+  },
+  setup(props) {
+    const driverNextStatus = ref(false);
     // 初始化部分引导位置
     const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }) => {
       options.config.stageRadius = 5;
@@ -340,11 +391,22 @@ export const FollowDriver = defineComponent({
       } catch {}
     };
 
+    // 声部
+    let length = props.statusAll.subjectStatus ? 4 : 3;
     const driverOptions: Config = {
       showProgress: false,
       allowClose: false,
       popoverOffset: 3,
       disableActiveInteraction: true,
+      onCloseClick: () => {
+        onDriverClose();
+      },
+      onHighlightStarted: () => {
+        driverNextStatus.value = true;
+      },
+      onHighlighted: () => {
+        driverNextStatus.value = false;
+      },
       steps: [
         {
           element: ".follow-1",
@@ -354,15 +416,12 @@ export const FollowDriver = defineComponent({
             popoverClass: "popoverClass popoverClassF1",
             align: "end",
             side: "top",
-            nextBtnText: "下一步1/3",
+            nextBtnText: `下一步1/${length}`,
             showButtons: ["next"],
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
               options.config.stageRadius = 1000;
               options.config.stagePadding = 0;
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
         {
@@ -373,47 +432,61 @@ export const FollowDriver = defineComponent({
             popoverClass: "popoverClass popoverClass5",
             align: "start",
             side: "top",
-            nextBtnText: "下一步2/3",
+            nextBtnText: `下一步2/${length}`,
             showButtons: ["next"],
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
               driverInitialPosition(popover, options);
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
-          },
-        },
-        {
-          element: ".driver-6",
-          popover: {
-            title: "",
-            description: "",
-            popoverClass: "popoverClass popoverClass6 popoverClose",
-            align: "start",
-            side: "top",
-            prevBtnText: "再看一遍",
-            doneBtnText: "完成",
-            showButtons: ["next", "previous"],
-            onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
-              driverInitialPosition(popover, options);
-            },
-            onPrevClick: () => {
-              driverObj.drive(0);
-            },
-            onNextClick: () => {
-              onDriverClose();
-            },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
       ],
     };
 
+    if (props.statusAll.subjectStatus) {
+      driverOptions.steps?.push({
+        element: ".driver-10",
+        popover: {
+          title: "",
+          description: "",
+          popoverClass: "popoverClass popoverClass10",
+          align: "start",
+          side: "top",
+          nextBtnText: `下一步${driverOptions.steps.length + 1}/${length}`,
+          showButtons: ["next"],
+          onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
+            driverInitialPosition(popover, options);
+          },
+        },
+      });
+    }
+
+    driverOptions.steps?.push({
+      element: ".driver-6",
+      popover: {
+        title: "",
+        description: "",
+        popoverClass: "popoverClass popoverClass6 popoverClose",
+        align: "start",
+        side: "top",
+        prevBtnText: "再看一遍",
+        doneBtnText: "完成",
+        showButtons: ["next", "previous"],
+        onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
+          driverInitialPosition(popover, options);
+        },
+        onPrevClick: () => {
+          driverObj.drive(0);
+        },
+        onNextClick: () => {
+          onDriverClose();
+        },
+      },
+    });
+
     let driverObj: any;
 
     const handleClickOutside = (event: any) => {
+      if (driverNextStatus.value) return;
       if (driverObj.isActive() && (event.target.nodeName === "path" || event.target.classList.contains("driver-popover") || event.target.classList.contains("driver-overlay"))) {
         if (driverObj.isLastStep()) {
           onDriverClose();
@@ -438,10 +511,11 @@ export const FollowDriver = defineComponent({
         }
         if (!(guideInfo.value && guideInfo.value.followDriver)) {
           document.addEventListener("click", handleClickOutside, true);
-          driverObj = driver(driverOptions);
           nextTick(() => {
+            driverObj = driver(driverOptions);
             driverObj.drive(0);
             showCloseBtn.value = true;
+            state.hasDriverPop = true;
           });
         }
       } catch (e) {
@@ -462,6 +536,7 @@ export const FollowDriver = defineComponent({
       driverObj.destroy();
       document.querySelector(".driver-popover-close-btn-custom")?.remove();
       document.removeEventListener("click", handleClickOutside);
+      state.hasDriverPop = false
     };
 
     return () => (
@@ -482,7 +557,15 @@ export const FollowDriver = defineComponent({
 // 评测模式
 export const EvaluatingDriver = defineComponent({
   name: "EvaluatingDriver",
-  setup() {
+  props: {
+    // 按钮状态
+    statusAll: {
+      type: Object as PropType<ButtonStatus>,
+      default: () => {},
+    },
+  },
+  setup(props) {
+    const driverNextStatus = ref(false);
     // 初始化部分引导位置
     const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }) => {
       options.config.stageRadius = 5;
@@ -493,11 +576,23 @@ export const EvaluatingDriver = defineComponent({
       } catch {}
     };
 
+    // 声部
+    let length = props.statusAll.subjectStatus ? 5 : 4;
+
     const driverOptions: Config = {
       showProgress: false,
       allowClose: false,
       popoverOffset: 3,
       disableActiveInteraction: true,
+      onCloseClick: () => {
+        onDriverClose();
+      },
+      onHighlightStarted: () => {
+        driverNextStatus.value = true;
+      },
+      onHighlighted: () => {
+        driverNextStatus.value = false;
+      },
       steps: [
         {
           element: ".evaluting-1",
@@ -507,65 +602,92 @@ export const EvaluatingDriver = defineComponent({
             popoverClass: "popoverClass popoverClassE1",
             align: "end",
             side: "top",
-            nextBtnText: "下一步1/3",
+            nextBtnText: `下一步1/${length}`,
             showButtons: ["next"],
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
               options.config.stageRadius = 1000;
               options.config.stagePadding = 0;
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
         {
-          element: ".driver-5",
+          element: ".driver-4",
           popover: {
             title: "",
             description: "",
-            popoverClass: "popoverClass popoverClass5",
+            popoverClass: "popoverClass popoverClassE2",
             align: "start",
             side: "top",
-            nextBtnText: "下一步2/3",
+            nextBtnText: `下一步2/${length}`,
             showButtons: ["next"],
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
               driverInitialPosition(popover, options);
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
         {
-          element: ".driver-6",
+          element: ".driver-5",
           popover: {
             title: "",
             description: "",
-            popoverClass: "popoverClass popoverClass6 popoverClose",
+            popoverClass: "popoverClass popoverClass5",
             align: "start",
             side: "top",
-            prevBtnText: "再看一遍",
-            doneBtnText: "完成",
-            showButtons: ["next", "previous"],
+            nextBtnText: `下一步3/${length}`,
+            showButtons: ["next"],
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
               driverInitialPosition(popover, options);
             },
-            onPrevClick: () => {
-              driverObj.drive(0);
-            },
-            onNextClick: () => {
-              onDriverClose();
-            },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
-        },
+        }
       ],
     };
+
+    if (props.statusAll.subjectStatus) {
+      driverOptions.steps?.push({
+        element: ".driver-10",
+        popover: {
+          title: "",
+          description: "",
+          popoverClass: "popoverClass popoverClass10",
+          align: "start",
+          side: "top",
+          nextBtnText: `下一步${driverOptions.steps.length + 1}/${length}`,
+          showButtons: ["next"],
+          onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
+            driverInitialPosition(popover, options);
+          },
+        },
+      });
+    }
+
+    driverOptions.steps?.push({
+      element: ".driver-6",
+      popover: {
+        title: "",
+        description: "",
+        popoverClass: "popoverClass popoverClass6 popoverClose",
+        align: "start",
+        side: "top",
+        prevBtnText: "再看一遍",
+        doneBtnText: "完成",
+        showButtons: ["next", "previous"],
+        onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
+          driverInitialPosition(popover, options);
+        },
+        onPrevClick: () => {
+          driverObj.drive(0);
+        },
+        onNextClick: () => {
+          onDriverClose();
+        },
+      },
+    });
+
     let driverObj: any;
 
     const handleClickOutside = (event: any) => {
+      if (driverNextStatus.value) return;
       if (driverObj.isActive() && (event.target.nodeName === "path" || event.target.classList.contains("driver-popover") || event.target.classList.contains("driver-overlay"))) {
         if (driverObj.isLastStep()) {
           onDriverClose();
@@ -591,10 +713,11 @@ export const EvaluatingDriver = defineComponent({
         }
         if (!(guideInfo.value && guideInfo.value.evaluatingDriver)) {
           document.addEventListener("click", handleClickOutside, true);
-          driverObj = driver(driverOptions);
           nextTick(() => {
+            driverObj = driver(driverOptions);
             driverObj.drive(0);
             showCloseBtn.value = true;
+            state.hasDriverPop = true;
           });
         } else {
           driverObj.destroy();
@@ -615,7 +738,9 @@ export const EvaluatingDriver = defineComponent({
       }
       endGuide(guideInfo.value);
       driverObj?.destroy();
+      document.querySelector(".driver-popover-close-btn-custom")?.remove();
       document.removeEventListener("click", handleClickOutside);
+      state.hasDriverPop = false;
     };
 
     return () => (
@@ -637,6 +762,7 @@ export const EvaluatingDriver = defineComponent({
 export const EvaluatingResultDriver = defineComponent({
   name: "EvaluatingResultDriver",
   setup() {
+    const driverNextStatus = ref(false);
     // 初始化部分引导位置
     const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }, position = 1) => {
       options.config.stageRadius = 1000;
@@ -652,6 +778,15 @@ export const EvaluatingResultDriver = defineComponent({
       allowClose: false,
       popoverOffset: 3,
       disableActiveInteraction: true,
+      onCloseClick: () => {
+        onDriverClose();
+      },
+      onHighlightStarted: () => {
+        driverNextStatus.value = true;
+      },
+      onHighlighted: () => {
+        driverNextStatus.value = false;
+      },
       steps: [
         {
           element: ".evaluting-result-1",
@@ -667,9 +802,6 @@ export const EvaluatingResultDriver = defineComponent({
               options.config.stageRadius = 12;
               options.config.stagePadding = 10;
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
         {
@@ -690,9 +822,6 @@ export const EvaluatingResultDriver = defineComponent({
                 popover.wrapper.style.marginLeft = (rect?.width || 0) / 2 - 4 + "px";
               } catch {}
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
         {
@@ -708,9 +837,6 @@ export const EvaluatingResultDriver = defineComponent({
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
               driverInitialPosition(popover, options, -1);
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
         {
@@ -733,9 +859,6 @@ export const EvaluatingResultDriver = defineComponent({
             onNextClick: () => {
               onDriverClose();
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
       ],
@@ -743,6 +866,7 @@ export const EvaluatingResultDriver = defineComponent({
     let driverObj: any;
 
     const handleClickOutside = (event: any) => {
+      if (driverNextStatus.value) return;
       if (driverObj.isActive() && (event.target.nodeName === "path" || event.target.classList.contains("driver-popover") || event.target.classList.contains("driver-overlay"))) {
         if (driverObj.isLastStep()) {
           onDriverClose();
@@ -767,10 +891,11 @@ export const EvaluatingResultDriver = defineComponent({
         }
         if (!(guideInfo.value && guideInfo.value.evaluatingResultDriver)) {
           document.addEventListener("click", handleClickOutside, true);
-          driverObj = driver(driverOptions);
           nextTick(() => {
+            driverObj = driver(driverOptions);
             driverObj.drive(0);
             showCloseBtn.value = true;
+            state.hasDriverPop = true;
           });
         }
       } catch (e) {
@@ -778,7 +903,11 @@ export const EvaluatingResultDriver = defineComponent({
       }
     };
 
-    getAllGuidance();
+    onMounted(() => {
+      nextTick(() => {
+        getAllGuidance();
+      })
+    })
 
     // 结束关闭弹窗
     const onDriverClose = () => {
@@ -791,6 +920,7 @@ export const EvaluatingResultDriver = defineComponent({
       driverObj.destroy();
       document.querySelector(".driver-popover-close-btn-custom")?.remove();
       document.removeEventListener("click", handleClickOutside);
+      state.hasDriverPop = false
     };
 
     return () => (
@@ -819,6 +949,7 @@ export const EvaluatingReportDriver = defineComponent({
     },
   },
   setup(props) {
+    const driverNextStatus = ref(false);
     // state.isPercussion 是否为打击乐
     // 初始化部分引导位置
     const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }, position = 1) => {
@@ -848,9 +979,6 @@ export const EvaluatingReportDriver = defineComponent({
               onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
                 driverInitialPosition(popover, options);
               },
-              onCloseClick: () => {
-                onDriverClose();
-              },
             },
           },
           {
@@ -878,9 +1006,6 @@ export const EvaluatingReportDriver = defineComponent({
               onNextClick: () => {
                 onDriverClose();
               },
-              onCloseClick: () => {
-                onDriverClose();
-              },
             },
           },
         ];
@@ -905,9 +1030,6 @@ export const EvaluatingReportDriver = defineComponent({
               onNextClick: () => {
                 onDriverClose();
               },
-              onCloseClick: () => {
-                onDriverClose();
-              },
             },
           },
         ];
@@ -928,9 +1050,6 @@ export const EvaluatingReportDriver = defineComponent({
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
               driverInitialPosition(popover, options);
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
         {
@@ -946,9 +1065,6 @@ export const EvaluatingReportDriver = defineComponent({
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
               driverInitialPosition(popover, options);
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         },
       ];
@@ -967,9 +1083,6 @@ export const EvaluatingReportDriver = defineComponent({
               onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
                 driverInitialPosition(popover, options);
               },
-              onCloseClick: () => {
-                onDriverClose();
-              },
             },
           },
           {
@@ -997,9 +1110,6 @@ export const EvaluatingReportDriver = defineComponent({
               onNextClick: () => {
                 onDriverClose();
               },
-              onCloseClick: () => {
-                onDriverClose();
-              },
             },
           }
         );
@@ -1024,9 +1134,6 @@ export const EvaluatingReportDriver = defineComponent({
             onNextClick: () => {
               onDriverClose();
             },
-            onCloseClick: () => {
-              onDriverClose();
-            },
           },
         });
       }
@@ -1037,6 +1144,15 @@ export const EvaluatingReportDriver = defineComponent({
       allowClose: false,
       popoverOffset: 3,
       disableActiveInteraction: true,
+      onCloseClick: () => {
+        onDriverClose();
+      },
+      onHighlightStarted: () => {
+        driverNextStatus.value = true;
+      },
+      onHighlighted: () => {
+        driverNextStatus.value = false;
+      },
       steps: steps,
     };
 
@@ -1045,6 +1161,7 @@ export const EvaluatingReportDriver = defineComponent({
     const guideInfo = ref({} as any);
 
     const handleClickOutside = (event: any) => {
+      if (driverNextStatus.value) return;
       if (driverObj.isActive() && (event.target.nodeName === "path" || event.target.classList.contains("driver-popover") || event.target.classList.contains("driver-overlay"))) {
         if (driverObj.isLastStep()) {
           onDriverClose();
@@ -1069,10 +1186,10 @@ export const EvaluatingReportDriver = defineComponent({
         if (!(guideInfo.value && guideInfo.value.evaluatingReportDriver)) {
           // 监听点击事件以实现点击空白区域跳转到下一步
           document.addEventListener("click", handleClickOutside, true);
-          driverObj = driver(driverOptions);
           nextTick(() => {
+            driverObj = driver(driverOptions);
             driverObj.drive();
-
+            state.hasDriverPop = true;
             showCloseBtn.value = true;
           });
         }
@@ -1094,6 +1211,7 @@ export const EvaluatingReportDriver = defineComponent({
       driverObj.destroy();
       document.querySelector(".driver-popover-close-btn-custom")?.remove();
       document.removeEventListener("click", handleClickOutside);
+      state.hasDriverPop = false
     };
 
     return () => (

+ 4 - 0
src/page-instrument/evaluat-model/evaluat-result/index.tsx

@@ -27,6 +27,7 @@ import { browser, getBehaviorId } from "/src/utils";
 import { api_musicPracticeRecordSave } from "../../api";
 import { getAudioDuration } from "/src/view/audio-list";
 import { debounce } from "/src/utils";
+import { EvaluatingResultDriver } from "../../custom-plugins/guide-driver";
 
 export default defineComponent({
   name: "evaluatResult",
@@ -180,6 +181,9 @@ export default defineComponent({
                 <img src={ckzpImg} class={[styles.ctrlsBtn, "evaluting-result-4", data.saveLoading ? styles.disablued : ""]} onClick={() => emit("close", "look")} />
               </div>
             </div>
+
+            {/* 评测模式-结果弹窗 功能引导 加载音频完成 不是会员 */}
+            {evaluatingData.resulstMode && !evaluatingData.hideResultModal && !evaluatingData.earphoneMode && !query.isCbs && state.audioDone && !state.isVip && <EvaluatingResultDriver />}
           </div>
         )}
       </>

+ 6 - 2
src/page-instrument/evaluat-model/index.tsx

@@ -1,4 +1,4 @@
-import { Transition, defineComponent, onMounted, reactive, watch, defineAsyncComponent } from "vue";
+import { Transition, defineComponent, onMounted, reactive, watch, defineAsyncComponent, computed } from "vue";
 import { connectWebsocket, evaluatingData, handleEndBegin, handleStartBegin, handleStartEvaluat, handleViewReport, startCheckDelay, checkUseEarphone, handleCancelEvaluat } from "/src/view/evaluating";
 import Earphone from "./earphone";
 import styles from "./index.module.less";
@@ -404,6 +404,10 @@ export default defineComponent({
       handleEvaluatResult("tryagain");
     };
 
+    const earPhonePopShow = computed(() => {
+			return evaluatingData.earphoneMode && state.audioDone && !state.hasDriverPop;
+		});
+
     onMounted(async () => {
       // 如果打开了延迟检测开关,需要先发送开始检测的消息
       if (state.setting.soundEffect) {
@@ -454,7 +458,7 @@ export default defineComponent({
         {
           evaluatingData.isBeginMask && <div class={styles.beginMask}></div>
         }
-        <Popup teleport="body" closeOnClickOverlay={false} class={["popup-custom", "van-scale"]} transition="van-scale" v-model:show={evaluatingData.earphoneMode}>
+        <Popup teleport="body" closeOnClickOverlay={false} class={["popup-custom", "van-scale"]} transition="van-scale" v-model:show={earPhonePopShow.value}>
           <Earphone
             earphoneType={evaluatingData.earPhoneType}
             onClose={() => {

+ 25 - 58
src/page-instrument/header-top/index.module.less

@@ -6,7 +6,7 @@
     flex-shrink: 0;
     margin-left: calc(-1 * var(--detailDataPaddingLeft));
     padding: 0 30px;
-    background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.6) 100%);
+    background: linear-gradient( 180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.6) 100%);
 }
 .modeWarn{
     position: fixed;
@@ -37,22 +37,18 @@
     left: 30px;
     display: flex;
     align-items: center;
-
-    .img {
+    .img{
         width: 32px;
         height: 32px;
-
-        &:first-child {
+        &:first-child{
             margin-right: 10px;
         }
     }
-
-    .title {
+    .title{
         width: 216px;
-
-        &.isMusicList {
-            :global {
-                .van-notice-bar .van-notice-bar__content::after {
+        &.isMusicList{
+            :global{
+                .van-notice-bar .van-notice-bar__content::after{
                     position: absolute;
                     top: 50%;
                     right: 0;
@@ -61,35 +57,31 @@
                     width: 11px;
                     height: 6px;
                     background: url("./image/sj.png") no-repeat;
-                    background-size: 100% 100%;
+                    background-size: 100% 100%;                         
                 }
             }
         }
-
-        :global {
-            .van-notice-bar {
+        :global{
+            .van-notice-bar{
                 height: 30px;
                 line-height: 30px;
                 padding: 0;
                 font-weight: 600;
                 font-size: 18px;
                 color: #FFFFFF;
-
-                .van-notice-bar__content {
+                .van-notice-bar__content{
                     position: relative;
                     padding-right: 16px;
                 }
             }
         }
     }
-
     .hidenBack {
         opacity: 0;
         pointer-events: none;
     }
 }
-
-.modeChangeBox {
+.modeChangeBox{
     position: fixed;
     top: 20px;
     right: 30px;
@@ -99,47 +91,35 @@
     display: flex;
     align-items: center;
     padding: 0 10px;
-
-    .img {
+    .img{
         width: 18px;
         height: 18px;
     }
-
-    .title {
+    .title{
         margin-left: 6px;
         font-weight: 500;
         font-size: 14px;
         color: #FFFFFF;
     }
 }
-
 .headRight {
     display: flex;
     align-items: center;
     height: 100%;
-
     .btn {
         position: relative;
         display: flex;
         flex-direction: column;
         align-items: center;
         cursor: pointer;
-        padding: 0 8px;
-        margin-right: 14px;
-
-        &:first-child {
-            margin-left: -8px;
-        }
-
-        &:last-child {
+        margin-right: 30px;
+        &:last-child{
             margin-right: 0;
         }
-
         .iconBtn {
             width: 24px;
             height: 24px;
         }
-
         span {
             margin-top: 3px;
             font-weight: 500;
@@ -148,11 +128,9 @@
             line-height: 17px;
         }
     }
-
-    .metronomeBtn {
+    .metronomeBtn{
         position: relative;
-
-        .speedCon {
+        .speedCon{
             transform: scale(0.83);
             transform-origin: left bottom;
             padding: 2px;
@@ -164,13 +142,11 @@
             background: #FFC121;
             border-radius: 120px 120px 120px 1px;
             border: 1px solid #FFFFFF;
-
-            >img {
+            >img{
                 width: 15px;
                 height: 11px;
             }
-
-            >div {
+            >div{
                 margin-left: 1px;
                 font-weight: 600;
                 font-size: 12px;
@@ -191,7 +167,6 @@
     right: 30px;
     bottom: 12px;
     transition: bottom .2s ease;
-
     .btnWrap {
         width: 50px;
         height: 50px;
@@ -202,7 +177,6 @@
             height: 100%;
         }
     }
-
     &.playLeftButton {
         left: 46px !important;
         right: auto !important;
@@ -214,7 +188,7 @@
         left: auto !important;
         bottom: 12px !important;
     }
-
+    
     .progress {
         position: absolute;
         left: 50%;
@@ -276,13 +250,11 @@
     background: url(./image/bg.png) no-repeat;
     background-size: 100% 100%;
     transition: all .3s;
-
-    &.hidden {
+    &.hidden{
         opacity: 0;
         transform: translateY(100%);
         pointer-events: none;
     }
-
     .back {
         position: absolute;
         width: 38px;
@@ -291,7 +263,6 @@
         top: 17px;
         cursor: pointer;
     }
-
     .name {
         position: absolute;
         left: 50%;
@@ -300,23 +271,19 @@
         width: 87px;
         height: 21px;
     }
-
     .modeBox {
         width: 100%;
         margin-top: 90px;
         display: flex;
         justify-content: space-between;
         padding: 0 36px;
-
-        &.twoModeBox {
+        &.twoModeBox{
             justify-content: center;
-
-            >.modeImg+.modeImg {
+            > .modeImg + .modeImg{
                 margin-left: 150px;
             }
         }
-
-        >.modeImg {
+        > .modeImg {
             width: calc((100% - 2*40px)/3);
             max-width: 220px;
         }

+ 54 - 28
src/page-instrument/header-top/index.tsx

@@ -80,7 +80,7 @@ export const headTopData = reactive({
       state.playIngSpeed = state.originSpeed;
       handleStartEvaluat();
       // 开发模式,把此处打开
-      // state.modeType = "evaluating"
+      //state.modeType = "evaluating";
       // evaluatingData.rendered = true;
       // evaluatingData.soundEffectMode = true;
     } else if (value === "follow") {
@@ -604,29 +604,31 @@ export default defineComponent({
           }}
         >
           {/* 返回和标题 */}
-          <div class={styles.headTopLeftBox}>
-            <img src={iconBack} class={["headTopBackBtn", styles.img, !headTopData.showBack && styles.hidenBack]} onClick={handleBack} />
-            {state.modeType === "practise" && smoothAnimationState.isShow.value ? (
-              <div
-                class={[styles.title, "driver-8", isMusicList.value && styles.isMusicList]}
-                onClick={() => {
-                  isMusicList.value && (musicListShow.value = true);
-                }}
-              >
-                <NoticeBar text={state.examSongName} background="none" />
-              </div>
-            ) : (
-              isMusicList.value && (
-                <img
-                  src={listImg}
-                  class={[styles.img, "driver-8"]}
+          {!(state.playState == "play" || followData.start || evaluatingData.startBegin) && (
+            <div class={styles.headTopLeftBox}>
+              <img src={iconBack} class={["headTopBackBtn", styles.img, !headTopData.showBack && styles.hidenBack]} onClick={handleBack} />
+              {smoothAnimationState.isShow.value ? (
+                <div
+                  class={[styles.title, isMusicList.value && styles.isMusicList, "driver-8"]}
                   onClick={() => {
-                    musicListShow.value = true;
+                    isMusicList.value && (musicListShow.value = true);
                   }}
-                />
-              )
-            )}
-          </div>
+                >
+                  <NoticeBar text={state.examSongName} background="none" />
+                </div>
+              ) : (
+                isMusicList.value && (
+                  <img
+                    src={listImg}
+                    class={[styles.img, "driver-8"]}
+                    onClick={() => {
+                      musicListShow.value = true;
+                    }}
+                  />
+                )
+              )}
+            </div>
+          )}
           {/* 模式切换 */}
           {state.playType === "play" && (
             <div
@@ -642,6 +644,13 @@ export default defineComponent({
               <div class={styles.title}>{state.modeType === "practise" ? "练习模式" : state.modeType === "follow" ? "跟练模式" : state.modeType === "evaluating" ? "评测模式" : ""}</div>
             </div>
           )}
+          {/* 模式提醒 */}
+          {state.modeType === "practise" && (
+            <div class={[styles.modeWarn, "practiseModeWarn"]}>
+              <img src={state.playType === "play" ? headImg("perform1.png") : headImg("sing1.png")} />
+              <div>{state.playType === "play" ? "演奏场景" : "演唱场景"}</div>
+            </div>
+          )}
           {/* 功能按钮 */}
           <div
             class={[styles.headRight]}
@@ -776,7 +785,7 @@ export default defineComponent({
             ) : null} */}
             {state.musicRendered && !query.lessonTrainingId && !query.questionId && state.isConcert && (
               <div
-                class={[styles.btn, state.playState === "play" && fingeringBtn.value.disabled && styles.disabled]}
+                class={[styles.btn, state.playState === "play" && fingeringBtn.value.disabled && styles.disabled, "driver-10"]}
                 onClick={() => {
                   toggleMusicSheet.toggle(true);
                 }}
@@ -836,13 +845,30 @@ export default defineComponent({
         {isAllBtnsStudent.value && !query.isCbs && showGuideIndex.value && <StudentTop></StudentTop>} */}
 
         {/* 练习模式功能引导 加载音频完成 不是会员 */}
-        {state.modeType === "practise" && !query.isCbs && state.audioDone && !state.isVip && <PractiseDriver />}
+        {state.modeType === "practise" && headTopData.modeType !== "init" && !query.isCbs && state.audioDone && !state.isVip && (
+          <PractiseDriver
+            statusAll={{
+              subjectStatus: state.musicRendered && !query.lessonTrainingId && !query.questionId && state.isConcert,
+              modelTypeStatus: toggleBtn.value.display
+            }}
+          />
+        )}
         {/* 跟练模式功能引导 加载音频完成 不是会员 */}
-        {state.modeType === "follow" && !query.isCbs && state.audioDone && !state.isVip && <FollowDriver />}
+        {state.modeType === "follow" && headTopData.modeType !== "init" && !query.isCbs && state.audioDone && !state.isVip && (
+          <FollowDriver
+            statusAll={{
+              subjectStatus: state.musicRendered && !query.lessonTrainingId && !query.questionId && state.isConcert,
+            }}
+          />
+        )}
         {/* 评测模式功能引导 加载音频完成 不是会员 */}
-        {state.modeType === "evaluating" && !evaluatingData.earphoneMode && !query.isCbs && state.audioDone && !state.isVip && <EvaluatingDriver />}
-        {/* 评测模式-结果弹窗 功能引导 加载音频完成 不是会员 */}
-        {state.modeType === "evaluating" && evaluatingData.resulstMode && !evaluatingData.earphoneMode && !query.isCbs && state.audioDone && !state.isVip && <EvaluatingResultDriver />}
+        {state.modeType === "evaluating" && headTopData.modeType !== "init" && !evaluatingData.earphoneMode && !query.isCbs && state.audioDone && !state.isVip && evaluatingData.websocketState && !evaluatingData.startBegin && evaluatingData.checkEnd && (
+          <EvaluatingDriver
+            statusAll={{
+              subjectStatus: state.musicRendered && !query.lessonTrainingId && !query.questionId && state.isConcert,
+            }}
+          />
+        )}
       </>
     );
   },

+ 3 - 1
src/page-instrument/header-top/modeView.tsx

@@ -39,9 +39,11 @@ export default defineComponent({
         } else {
           // vip
           data.showVip = true;
+          state.isVip = true;
         }
       }
     };
+
     const getUserInfo = async () => {
       const res = await studentQueryUserInfo();
       const student = res?.data || {};
@@ -49,10 +51,10 @@ export default defineComponent({
       // console.log("🚀 ~ student:", student);
       if (storeData.user.vipMember) {
         data.showVip = false;
+        state.isVip = false;
         openGuid();
       }
     };
-
     const pageVisible = usePageVisibility();
     watch(
       () => pageVisible.value,

+ 1 - 0
src/page-instrument/header-top/speed/index.module.less

@@ -93,6 +93,7 @@
                             background: #94ACC4;
                             box-shadow: inset 0px 2px 3px 0px #647F98;
                             .van-slider__bar{
+                                max-width: 100%;
                                 background: linear-gradient( 270deg, #7ADEFF 0%, #29A9FF 100%);
                                 box-shadow: inset 1px 0px 5px 0px rgba(150,254,255,0.79);
                                 border: 1px solid #4A91D4;

+ 8 - 3
src/page-instrument/header-top/speed/index.tsx

@@ -12,16 +12,21 @@ export default defineComponent({
 		const speed = ref(state.speed);
 
 		const minusSpeed = () => {
-			speed.value = Math.max(speed.value - 1, 45);
+			let canSpeed = Math.max(speed.value - 1, 45);
+			canSpeed = Math.min(canSpeed, 270);
+			speed.value = canSpeed;
 		};
 
 		const plusSpeed = () => {
-			speed.value = Math.min(speed.value + 1, 270);
+			let canSpeed = Math.min(speed.value + 1, 270);
+			canSpeed = Math.max(canSpeed, 45);
+			speed.value = canSpeed;
 		};
 		watch(
 			() => speed.value,
 			() => {
-				handleSetSpeed(speed.value);
+				// handleSetSpeed(speed.value);
+				state.speed = speed.value;
 			}
 		);
 		watch(

+ 1 - 1
src/page-instrument/header-top/title/index.module.less

@@ -25,4 +25,4 @@
 .status {
   margin-left: auto;
   flex-shrink: 0;
-}
+}

+ 14 - 6
src/state.ts

@@ -509,6 +509,8 @@ const state = reactive({
   originAudioPlayRate: 1,  
   /** 开始播放时,记录的mp3播放倍率,用户当前设置的速度/当前小节的速度 */
   basePlayRate: 1,
+  /** 引导页显示状态 */
+  hasDriverPop: false,
 });
 const browserInfo = browser();
 let offset_duration = 0;
@@ -588,8 +590,8 @@ export const onEnded = () => {
 const dynamicShowPlaySpeed = (index: number) => {
   const item: any = state.times[index];
   if (item && item.measureSpeed ) {
-    state.playIngSpeed = Math.floor(state.basePlayRate * item.measureSpeed)
-    state.speed = state.playIngSpeed
+    // console.log('速度1',item.measureSpeed)
+    state.speed = Math.floor(state.basePlayRate * item.measureSpeed)
   }
 }
 
@@ -608,6 +610,7 @@ export const initSetPlayRate = () => {
 export const resetBaseRate = () => {
   const currentItem: any = state.times[0];
   const currentSpeed = currentItem?.measureSpeed ? currentItem.measureSpeed : state.originSpeed;
+  // console.log('速度2',currentSpeed)
   state.speed = currentSpeed
   //state.activeNoteIndex = 0
   state.basePlayRate = 1;
@@ -622,7 +625,6 @@ const handlePlaying = () => {
   state.playProgress = (currentTime / duration) * 100;
   let item = getNote(currentTime);
   if (item) {
-    dynamicShowPlaySpeed(item.i);
     // 选段状态下
     if (state.sectionStatus && state.section.length === 2) {
       // 如果开启了预备拍
@@ -675,6 +677,7 @@ const handlePlaying = () => {
       }
     }
     gotoNext(item);
+    dynamicShowPlaySpeed(item.i);
   }
 
   // 评测不播放叮咚节拍器
@@ -763,7 +766,8 @@ export const togglePlay = async (playState?: "play" | "paused", sourceType?: str
     closeTick()
   }
   // 设置为开始播放时, 如果需要节拍,先播放节拍器   只有在当前播放时间不为0的时候开启节拍器
-  if (state.playState === "play" && getAudioCurrentTime() === 0 && ((state.playType === "play" && state.needTick) || (state.playType === "sing" && state.needSingTick))) {
+  const isOneMeasureNumberXML = state.section.length === 2 && state.section[0].MeasureNumberXML === 2 //当是选段模式 并且开始小节是第二小节 就不播节拍器(这种情况有预选小节,currentTime是0)
+  if (state.playState === "play" && getAudioCurrentTime() === 0 && !isOneMeasureNumberXML && ((state.playType === "play" && state.needTick) || (state.playType === "sing" && state.needSingTick))) {
     // 如果是系统节拍器 等系统节拍器播完了再播,如果是mp3节拍器 直接播
     if ((state.playType === "play" && !state.isOpenMetronome) || (state.playType === "sing" && !state.isSingOpenMetronome)) {
       const tickend = await handleStartTick();
@@ -950,7 +954,7 @@ export const gotoNext = (note: any, skipNote?: boolean) => {
   let prev = state.activeNoteIndex;
   state.activeNoteIndex = num;
   state.activeMeasureIndex = note.MeasureNumberXML;
-
+  dynamicShowPlaySpeed(state.activeNoteIndex);
   if (prev && num - prev === 1) {
     // console.log('跳转音符',11111,osmd.cursor)
     // if (!note.id && note.multipleRestMeasures === 0) {
@@ -1220,6 +1224,7 @@ export const handleRessetState = () => {
   // 切换模式,清除选段
   clearSelection();
   skipNotePlay(0, true);
+  resetBaseRate();
   // midi 重置播放进度
   if (state.isAppPlay) {
     audioData.progress = 0;
@@ -1238,7 +1243,9 @@ export default state;
 export const evaluatCreateMusicPlayer = () => {
   return api_createMusicPlayer({
     musicSrc: state.accompany || state.music, // 曲谱音频url
-    tuneSrc: "https://oss.dayaedu.com/cloud-coach/1686725501654check_music1_(1).mp3", //效音音频url
+    // tuneSrc: "https://oss.dayaedu.com/cloud-coach/1686725501654check_music1_(1).mp3", //效音音频url
+    tuneSrc: "https://oss.dayaedu.com/MECMP/1722336027096.mp3", //效音音频url
+    checkFrequence: 787,
   });
 };
 
@@ -1754,6 +1761,7 @@ watch(
 
 /** 刷新谱面 */
 export const refreshMusicSvg = () => {
+  resetBaseRate();
   state.loadingText = '正在加载中,请稍等…'
   // 销毁旋律线
   destroySmoothAnimation()

+ 131 - 133
src/view/evaluating/index.tsx

@@ -62,52 +62,52 @@ export const popImgs = {
 };
 
 export const evaluatingData = reactive({
-  /** 评测数据 */
-  contentData: {} as any,
-  /** 评测模块是否加载完成 */
-  rendered: false,
-  earphone: false, // 是否插入耳机
-  soundEffect: false, // 是否效音
-  soundEffectFrequency: 0, // 效音频率
-  checkStep: 0, // 执行步骤
-  checkEnd: false, // 检测结束
-  earphoneMode: false, // 耳机弹窗
-  earPhoneType: "" as "" | "有线耳机" | "蓝牙耳机", // 耳机类型
-  soundEffectMode: false, // 效音弹窗
-  websocketState: false, // websocket连接状态
-  /**是否开始播放 */
-  startBegin: false, // 开始
-  backtime: 0, // 延迟时间
-  /** 已经评测的数据 */
-  evaluatings: {} as IEvaluatings,
-  /** 评测结果 */
-  resultData: {} as any,
-  /** 评测结果弹窗 */
-  resulstMode: false,
-  /** 是否是完整评测 */
-  isComplete: false,
-  /**  */
-  isDisabledPlayMusic: false,
-  /** socket异常状态弹窗 */
-  socketErrorPop: false,
-  /** 异常提示 */
-  errorContents: "",
-  /** socket异常状态弹窗的状态值 */
-  socketErrorStatus: 0,
-  /** 延迟检测,socket状态异常 */
-  delayCheckSocketError: false,
-  /** 异常状态,不生成评测记录,不调用保存接口 */
-  isErrorState: false,
-  /** accompanyError,错误类型 */
-  accompanyErrorType: "",
-  /** app播放结束状态,重新评测需要重置为 */
-  isAudioPlayEnd: false,
-  preloadJson: true, // 预加载延迟检测的资源
-  jsonLoading: true, // 延迟检测的资源加载中状态
-  jsonLoadDone: true, // 延迟检测的动画dom加载完成状态
-  hideResultModal: false, // 评测作业,如果不是完整评测,需要隐藏评测结果弹窗
-  oneselfCancleEvaluating: false, // 是否是自主取消评测,自主取消评测,不生产评测记录
-  isBeginMask: false, // 倒计时和系统节拍器时候的遮罩,防止用户点击
+	/** 评测数据 */
+	contentData: {} as any,
+	/** 评测模块是否加载完成 */
+	rendered: false,
+	earphone: false, // 是否插入耳机
+	soundEffect: false, // 是否效音
+	soundEffectFrequency: 0, // 效音频率
+	checkStep: 0, // 执行步骤
+	checkEnd: false, // 检测结束
+	earphoneMode: false, // 耳机弹窗
+	earPhoneType: "" as "" | "有线耳机" | "蓝牙耳机", // 耳机类型
+	soundEffectMode: false, // 效音弹窗
+	websocketState: false, // websocket连接状态
+	/**是否开始播放 */
+	startBegin: false, // 开始
+	backtime: 0, // 延迟时间
+	/** 已经评测的数据 */
+	evaluatings: {} as IEvaluatings,
+	/** 评测结果 */
+	resultData: {} as any,
+	/** 评测结果弹窗 */
+	resulstMode: false,
+	/** 是否是完整评测 */
+	isComplete: false,
+	/**  */
+	isDisabledPlayMusic: false,
+	/** socket异常状态弹窗 */
+	socketErrorPop: false,
+	/** 异常提示 */
+	errorContents: '',
+	/** socket异常状态弹窗的状态值 */
+	socketErrorStatus: 0,
+	/** 延迟检测,socket状态异常 */
+	delayCheckSocketError: false,
+	/** 异常状态,不生成评测记录,不调用保存接口 */
+	isErrorState: false,
+	/** accompanyError,错误类型 */
+	accompanyErrorType: '',	
+	/** app播放结束状态,重新评测需要重置为 */
+	isAudioPlayEnd: false,
+	preloadJson: true, // 预加载延迟检测的资源
+	jsonLoading: true, // 延迟检测的资源加载中状态
+	jsonLoadDone: true, // 延迟检测的动画dom加载完成状态
+	hideResultModal: false, // 评测作业,如果不是完整评测,需要隐藏评测结果弹窗
+	oneselfCancleEvaluating: false, // 是否是自主取消评测,自主取消评测,不生产评测记录
+	isBeginMask: false // 倒计时和系统节拍器时候的遮罩,防止用户点击
 });
 
 const sendOffsetTime = async (offsetTime: number) => {
@@ -341,93 +341,91 @@ const handleScoreResult = (res?: IPostMessage) => {
 
 /** 开始评测 */
 export const handleStartBegin = async (preTimes?: number) => {
-  if (state.isAppPlay) {
-    await api_cloudSetCurrentTime({
-      currentTime: 0,
-      songID: state.examSongId,
-    });
-  }
-  evaluatingData.isComplete = false;
-  evaluatingData.evaluatings = {};
-  evaluatingData.resultData = {};
-  evaluatingData.backtime = 0;
-  resetPlaybackToStart();
-  evaluatingData.isAudioPlayEnd = false;
-  const res = await startEvaluating(evaluatingData.contentData);
-  if (res?.api !== "startEvaluating") {
-    Snackbar.error("请在APP端进行评测");
-    evaluatingData.startBegin = false;
-    return;
-  }
-  if (res?.content?.reson) {
-    showToast(res.content?.des);
-    evaluatingData.startBegin = false;
-    return;
-  }
-  evaluatingData.startBegin = true;
-  if (evaluatingData.isDisabledPlayMusic) {
-    evaluatingData.isBeginMask = true;
-    // 先播放倒计时
-    await startCountdown();
-    state.playState = state.playState === "paused" ? "play" : "paused";
-    // 设置为开始播放时, 如果需要节拍,先播放节拍器
-    if ((state.playState === "play" && state.playType === "play" && state.needTick) || (state.playType === "sing" && state.needSingTick)) {
-      // 如果是系统节拍器 等系统节拍器播完了再播,如果是mp3节拍器 直接播
-      if ((state.playType === "play" && !state.isOpenMetronome) || (state.playType === "sing" && !state.isSingOpenMetronome)) {
-        const tickend = await handleStartTick();
-        console.log("🚀 ~ tickend:", tickend);
-        // 节拍器返回false, 取消播放
-        if (!tickend) {
-          state.playState = "paused";
-          evaluatingData.startBegin = false;
-          evaluatingData.isBeginMask = false;
-          return;
-        }
-      } else {
-        handleStartTick();
-      }
-    }
-    evaluatingData.isBeginMask = false;
-    onPlay();
-  }
-  if (evaluatingData.isErrorState) return;
-  //开始录音
-  // await api_startRecording({
-  // 	accompanimentState: state.setting.enableAccompaniment ? 1 : 0,
-  // 	firstNoteTime: preTimes || 0,
-  // });
-  let rate = state.speed / state.originSpeed;
-  rate = parseFloat(rate.toFixed(2));
-  await api_startRecordingCb(
-    {
-      accompanimentState: state.setting.enableAccompaniment ? 1 : 0,
-      firstNoteTime: preTimes || 0,
-      speedRate: rate, // 播放倍率
-    },
-    () => {
-      if (state.isAppPlay) {
-        setTimeout(() => {
-          sendOffsetTime(0);
-        }, 300);
-      }
-    }
-  );
-  // 如果开启了摄像头, 开启录制视频
-  if (state.setting.camera) {
-    console.log("开始录制视频");
-    await api_startCapture();
-  }
-  // 如果是midi音频评测,需要调用cloudPlay
-  if (state.isAppPlay) {
-    await api_cloudChangeSpeed({
-      speed: state.originSpeed,
-      originalSpeed: state.originSpeed,
-      songID: state.examSongId,
-    });
-    audioData.progress = 0;
-    audioListStart(state.playState);
-  }
-  evaluatingData.oneselfCancleEvaluating = false;
+	if (state.isAppPlay) {
+		await api_cloudSetCurrentTime({
+			currentTime: 0,
+			songID: state.examSongId,
+		})
+	}
+	evaluatingData.isComplete = false;
+	evaluatingData.evaluatings = {};
+	evaluatingData.resultData = {};
+	evaluatingData.backtime = 0;
+	resetPlaybackToStart();
+	evaluatingData.isAudioPlayEnd = false;
+	const res = await startEvaluating(evaluatingData.contentData);
+	if (res?.api !== "startEvaluating") {
+		Snackbar.error("请在APP端进行评测");
+		evaluatingData.startBegin = false;
+		return;
+	}
+	if (res?.content?.reson) {
+		showToast(res.content?.des);
+		evaluatingData.startBegin = false;
+		return;
+	}
+	evaluatingData.startBegin = true;
+	if (evaluatingData.isDisabledPlayMusic) {
+		evaluatingData.isBeginMask = true
+		// 先播放倒计时
+		await startCountdown()
+		state.playState = state.playState === "paused" ? "play" : "paused";
+		// 设置为开始播放时, 如果需要节拍,先播放节拍器
+		if (state.playState === "play" && (state.playType==="play"&&state.needTick)||(state.playType==="sing"&&state.needSingTick)) {
+			// 如果是系统节拍器 等系统节拍器播完了再播,如果是mp3节拍器 直接播
+			if((state.playType==="play" && !state.isOpenMetronome)||(state.playType==="sing" && !state.isSingOpenMetronome)){
+				const tickend = await handleStartTick();
+				console.log("🚀 ~ tickend:", tickend)
+				// 节拍器返回false, 取消播放
+				if (!tickend) {
+					state.playState = "paused";
+					evaluatingData.startBegin = false;
+					evaluatingData.isBeginMask = false
+					return;
+				}
+			}else{
+				handleStartTick()
+			}
+		}
+		evaluatingData.isBeginMask = false
+		onPlay();
+	}
+	if (evaluatingData.isErrorState) return
+	//开始录音
+	// await api_startRecording({
+	// 	accompanimentState: state.setting.enableAccompaniment ? 1 : 0,
+	// 	firstNoteTime: preTimes || 0,
+	// });
+	let rate = state.speed / state.originSpeed;
+	rate = parseFloat(rate.toFixed(2));
+	await api_startRecordingCb({
+		// accompanimentState: state.setting.enableAccompaniment ? 1 : 0,
+		accompanimentState: !state.accompany ? 0 : 1, // 评测没有伴奏时,静音播放
+		firstNoteTime: preTimes || 0,
+		speedRate: rate, // 播放倍率
+	}, () => {
+		if (state.isAppPlay) {
+			setTimeout(() => {
+				sendOffsetTime(0)
+			}, 300);
+		}
+	})
+	// 如果开启了摄像头, 开启录制视频
+	if (state.setting.camera) {
+		console.log("开始录制视频");
+		await api_startCapture();
+	}
+	// 如果是midi音频评测,需要调用cloudPlay
+	if (state.isAppPlay) {
+		await api_cloudChangeSpeed({
+			speed: state.originSpeed,
+			originalSpeed: state.originSpeed,
+			songID: state.examSongId,
+		});
+		audioData.progress = 0
+		audioListStart(state.playState);
+	}
+	evaluatingData.oneselfCancleEvaluating = false;
 };
 
 /** 播放音乐 */

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
stats.html


+ 2 - 3
vite.config.ts

@@ -76,9 +76,8 @@ export default defineConfig({
         // target: "https://kt.colexiu.com",
         // target: "https://test.lexiaoya.cn",
         // target: "https://kt.colexiu.com",
-        target: "https://dev.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
-        //target: "https://dev.resource.colexiu.com",
-        // target: "https://test.kt.colexiu.com",
+        // target: "https://dev.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
+        target: "https://dev.kt.colexiu.com",
         //target: "https://mec.colexiu.com",
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/instrument/, ""),

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 314 - 314
yarn.lock


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.