Pārlūkot izejas kodu

Merge branch 'ktyq-online-1.8.7' of http://git.dayaedu.com/liushengqiang/music-score into feature-1.8.7

TIANYONG 1 gadu atpakaļ
vecāks
revīzija
821fe36d14
82 mainītis faili ar 3125 papildinājumiem un 395 dzēšanām
  1. 0 1
      .gitignore
  2. 8 8
      dist/colexiu.html
  3. 9 9
      dist/index.html
  4. 11 11
      dist/instrument.html
  5. 10 10
      dist/orchestra.html
  6. 5 5
      dist/report-share.html
  7. 1 1
      instrument.html
  8. BIN
      public/soundfonts/whistling/A4.mp3
  9. BIN
      public/soundfonts/whistling/A5.mp3
  10. BIN
      public/soundfonts/whistling/Ab5.mp3
  11. BIN
      public/soundfonts/whistling/B4.mp3
  12. BIN
      public/soundfonts/whistling/B5.mp3
  13. BIN
      public/soundfonts/whistling/Bb4.mp3
  14. BIN
      public/soundfonts/whistling/Bb5.mp3
  15. BIN
      public/soundfonts/whistling/C5.mp3
  16. BIN
      public/soundfonts/whistling/C6.mp3
  17. BIN
      public/soundfonts/whistling/D5.mp3
  18. BIN
      public/soundfonts/whistling/D6.mp3
  19. BIN
      public/soundfonts/whistling/Db5.mp3
  20. BIN
      public/soundfonts/whistling/Db6.mp3
  21. BIN
      public/soundfonts/whistling/E5.mp3
  22. BIN
      public/soundfonts/whistling/E6.mp3
  23. BIN
      public/soundfonts/whistling/Eb5.mp3
  24. BIN
      public/soundfonts/whistling/Eb6.mp3
  25. BIN
      public/soundfonts/whistling/F5.mp3
  26. BIN
      public/soundfonts/whistling/F6.mp3
  27. BIN
      public/soundfonts/whistling/G5.mp3
  28. BIN
      public/soundfonts/whistling/Gb5.mp3
  29. 6 3
      src/helpers/formateMusic.ts
  30. 15 3
      src/page-instrument/App.tsx
  31. 19 2
      src/page-instrument/api.ts
  32. 81 96
      src/page-instrument/component/mode-type-mode/index.tsx
  33. 0 1
      src/page-instrument/custom-plugins/helper-model/recommendation/index.module.less
  34. 0 1
      src/page-instrument/custom-plugins/helper-model/recommendation/index.tsx
  35. 2 2
      src/page-instrument/custom-plugins/the-vip/index.module.less
  36. 1 1
      src/page-instrument/custom-plugins/work-index/index.tsx
  37. 0 0
      src/page-instrument/evaluat-model/delay-check/json/bg_new.json
  38. 9 13
      src/page-instrument/evaluat-model/evaluat-result/img/icon_expression0.svg
  39. 9 13
      src/page-instrument/evaluat-model/evaluat-result/img/icon_expression1.svg
  40. 9 13
      src/page-instrument/evaluat-model/evaluat-result/img/icon_expression2.svg
  41. 11 11
      src/page-instrument/evaluat-model/evaluat-result/img/icon_expression3.svg
  42. 13 13
      src/page-instrument/evaluat-model/evaluat-result/img/icon_expression4.svg
  43. 1 1
      src/page-instrument/evaluat-model/evaluat-result/index.module.less
  44. 1 0
      src/page-instrument/evaluat-model/evaluat-result/index.tsx
  45. 1 1
      src/page-instrument/view-detail/index.tsx
  46. 13 0
      src/page-instrument/view-evaluat-report/index.module.less
  47. 1 1
      src/page-instrument/view-evaluat-report/index.tsx
  48. 103 0
      src/page-instrument/view-figner/change-subject/index.module.less
  49. 92 0
      src/page-instrument/view-figner/change-subject/index.tsx
  50. BIN
      src/page-instrument/view-figner/image/icon_action_cancel.png
  51. BIN
      src/page-instrument/view-figner/image/icon_action_confirm.png
  52. BIN
      src/page-instrument/view-figner/image/icon_bg_t.png
  53. BIN
      src/page-instrument/view-figner/image/icon_bg_v.png
  54. BIN
      src/page-instrument/view-figner/image/icon_shuo_h.png
  55. BIN
      src/page-instrument/view-figner/image/icon_shuo_v.png
  56. 56 4
      src/page-instrument/view-figner/index.module.less
  57. 244 131
      src/page-instrument/view-figner/index.tsx
  58. 1 0
      src/store.ts
  59. 2305 0
      src/view/figner-preview/index.ts
  60. 84 38
      src/view/fingering/fingering-config.ts
  61. 0 0
      src/view/fingering/fingering-img/ocarina/index.json
  62. 0 0
      src/view/fingering/fingering-img/ocarina1/index.json
  63. 0 0
      src/view/fingering/fingering-img/ocarina2/index.json
  64. BIN
      src/view/fingering/fingering-img/whistling/1.png
  65. BIN
      src/view/fingering/fingering-img/whistling/10.png
  66. BIN
      src/view/fingering/fingering-img/whistling/11.png
  67. BIN
      src/view/fingering/fingering-img/whistling/12.png
  68. BIN
      src/view/fingering/fingering-img/whistling/2.png
  69. BIN
      src/view/fingering/fingering-img/whistling/3.png
  70. BIN
      src/view/fingering/fingering-img/whistling/4.png
  71. BIN
      src/view/fingering/fingering-img/whistling/5.png
  72. BIN
      src/view/fingering/fingering-img/whistling/6.png
  73. BIN
      src/view/fingering/fingering-img/whistling/7.png
  74. BIN
      src/view/fingering/fingering-img/whistling/8.png
  75. BIN
      src/view/fingering/fingering-img/whistling/9.png
  76. BIN
      src/view/fingering/fingering-img/whistling/full.png
  77. 1 0
      src/view/fingering/fingering-img/whistling/index.json
  78. 1 0
      src/view/fingering/fingering-img/whistling1/index.json
  79. 1 0
      src/view/fingering/fingering-img/whistling2/index.json
  80. 0 1
      src/view/selection/index.tsx
  81. 0 0
      stats.html
  82. 1 1
      vite.config.ts

+ 0 - 1
.gitignore

@@ -22,4 +22,3 @@ dist-ssr
 *.njsproj
 *.sln
 *.sw?
-

+ 8 - 8
dist/colexiu.html

@@ -2,7 +2,7 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-6a06cf8f.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-ca45d81b.js"></script>
 
   <meta charset="UTF-8" />
   <link rel="icon" type="image/svg+xml" href="./vite.svg" />
@@ -40,11 +40,11 @@
       },
     })
   </script>
-  <script type="module" crossorigin src="./js/colexiu-4ad36b94.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-36c21154.js">
-  <link rel="modulepreload" crossorigin href="./js/index-c34f2749.js">
-  <link rel="modulepreload" crossorigin href="./js/index-eb907c89.js">
-  <link rel="modulepreload" crossorigin href="./js/index-2a98ea9a.js">
+  <script type="module" crossorigin src="./js/colexiu-2404c3f0.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-7fa3864d.js">
+  <link rel="modulepreload" crossorigin href="./js/index-c82a77d7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-74accf7a.js">
+  <link rel="modulepreload" crossorigin href="./js/index-f5441714.js">
   <link rel="stylesheet" href="./css/index-5cdcded6.css">
   <link rel="stylesheet" href="./css/index-d42b0794.css">
   <link rel="stylesheet" href="./css/colexiu-62f31c4f.css">
@@ -57,8 +57,8 @@
   <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-8891b9b0.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/colexiu-legacy-296b9ce1.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-a2ca5f88.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/colexiu-legacy-1e5002bc.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

+ 9 - 9
dist/index.html

@@ -2,7 +2,7 @@
 <html lang="ZH-cn">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-6a06cf8f.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-ca45d81b.js"></script>
 
   <meta charset="UTF-8">
   <link rel="icon" href="./favicon.ico" />
@@ -75,12 +75,12 @@
       }
     })
   </script>
-  <script type="module" crossorigin src="./js/gym-751de644.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-36c21154.js">
-  <link rel="modulepreload" crossorigin href="./js/index-c34f2749.js">
-  <link rel="modulepreload" crossorigin href="./js/instruments-1bf29df6.js">
-  <link rel="modulepreload" crossorigin href="./js/index-f3ed3f75.js">
-  <link rel="modulepreload" crossorigin href="./js/index-2a98ea9a.js">
+  <script type="module" crossorigin src="./js/gym-fd251339.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-7fa3864d.js">
+  <link rel="modulepreload" crossorigin href="./js/index-c82a77d7.js">
+  <link rel="modulepreload" crossorigin href="./js/instruments-cb07e5d7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-7981bdb9.js">
+  <link rel="modulepreload" crossorigin href="./js/index-f5441714.js">
   <link rel="modulepreload" crossorigin href="./js/plyr.min-c8c2777b.js">
   <link rel="stylesheet" href="./css/index-5cdcded6.css">
   <link rel="stylesheet" href="./css/index-d42b0794.css">
@@ -100,8 +100,8 @@
   <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-8891b9b0.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/gym-legacy-aa3f12b5.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-a2ca5f88.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/gym-legacy-f26a3750.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

+ 11 - 11
dist/instrument.html

@@ -2,7 +2,7 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-6a06cf8f.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-ca45d81b.js"></script>
 
   <meta charset="UTF-8" />
   <meta name="viewport"
@@ -40,15 +40,15 @@
       })
     }
   </script>
-  <script type="module" crossorigin src="./js/instrument-c493d833.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-36c21154.js">
-  <link rel="modulepreload" crossorigin href="./js/index-c34f2749.js">
-  <link rel="modulepreload" crossorigin href="./js/index-eb907c89.js">
-  <link rel="modulepreload" crossorigin href="./js/instruments-1bf29df6.js">
-  <link rel="modulepreload" crossorigin href="./js/index-9c36c3f8.js">
+  <script type="module" crossorigin src="./js/instrument-d541df92.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-7fa3864d.js">
+  <link rel="modulepreload" crossorigin href="./js/index-c82a77d7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-74accf7a.js">
+  <link rel="modulepreload" crossorigin href="./js/instruments-cb07e5d7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-f12d04aa.js">
   <link rel="stylesheet" href="./css/index-5cdcded6.css">
   <link rel="stylesheet" href="./css/index-d42b0794.css">
-  <link rel="stylesheet" href="./css/instrument-de51af75.css">
+  <link rel="stylesheet" href="./css/instrument-c4bf8181.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>
@@ -58,7 +58,7 @@
   <img id="loading" class="show" src="./loading.svg" alt="loading" />
   <script>
     // 处理课堂乐器老师端打开听音练习时去掉加载动画
-    if (location.href.indexOf('view-figner') >= 0 && location.href.indexOf('platform=pc') >= 0) {
+    if (location.href.indexOf('view-figner') >= 0 && location.href.indexOf('platform=pc') >= 0 && location.href.indexOf('linkSource=class') < 0) {
       var _loading = document.getElementById("loading");
       _loading && document.body.removeChild(_loading);
     }
@@ -66,8 +66,8 @@
 
   
   <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-8891b9b0.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-9334cb46.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-a2ca5f88.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-27ac3a95.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

+ 10 - 10
dist/orchestra.html

@@ -2,7 +2,7 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-6a06cf8f.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-ca45d81b.js"></script>
 
   <meta charset="UTF-8" />
   <!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> -->
@@ -41,13 +41,13 @@
       transition: opacity .3s;
     }
   </style>
-  <script type="module" crossorigin src="./js/orchestra-90a3200b.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-36c21154.js">
-  <link rel="modulepreload" crossorigin href="./js/index-c34f2749.js">
-  <link rel="modulepreload" crossorigin href="./js/index-eb907c89.js">
-  <link rel="modulepreload" crossorigin href="./js/index-f3ed3f75.js">
-  <link rel="modulepreload" crossorigin href="./js/index-2a98ea9a.js">
-  <link rel="modulepreload" crossorigin href="./js/index-9c36c3f8.js">
+  <script type="module" crossorigin src="./js/orchestra-2c238eef.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-7fa3864d.js">
+  <link rel="modulepreload" crossorigin href="./js/index-c82a77d7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-74accf7a.js">
+  <link rel="modulepreload" crossorigin href="./js/index-7981bdb9.js">
+  <link rel="modulepreload" crossorigin href="./js/index-f5441714.js">
+  <link rel="modulepreload" crossorigin href="./js/index-f12d04aa.js">
   <link rel="stylesheet" href="./css/index-5cdcded6.css">
   <link rel="stylesheet" href="./css/index-d42b0794.css">
   <link rel="stylesheet" href="./css/index-85f95688.css">
@@ -72,8 +72,8 @@
   </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-8891b9b0.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/orchestra-legacy-f750f2ee.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-a2ca5f88.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/orchestra-legacy-b879e7f9.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

+ 5 - 5
dist/report-share.html

@@ -2,7 +2,7 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-6a06cf8f.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-ca45d81b.js"></script>
 
   <meta charset="UTF-8" />
   <!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> -->
@@ -25,8 +25,8 @@
       transition: opacity .3s;
     }
   </style>
-  <script type="module" crossorigin src="./js/report-share-8c637aa4.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-36c21154.js">
+  <script type="module" crossorigin src="./js/report-share-4a82a9fe.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-7fa3864d.js">
   <link rel="modulepreload" crossorigin href="./js/plyr.min-c8c2777b.js">
   <link rel="stylesheet" href="./css/index-5cdcded6.css">
   <link rel="stylesheet" href="./css/plyr-ad8ef5ae.css">
@@ -51,8 +51,8 @@
   </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-8891b9b0.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/report-share-legacy-4564a547.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-a2ca5f88.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/report-share-legacy-d6c4fde5.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

+ 1 - 1
instrument.html

@@ -45,7 +45,7 @@
   <img id="loading" class="show" src="/loading.svg" alt="loading" />
   <script>
     // 处理课堂乐器老师端打开听音练习时去掉加载动画
-    if (location.href.indexOf('view-figner') >= 0 && location.href.indexOf('platform=pc') >= 0) {
+    if (location.href.indexOf('view-figner') >= 0 && location.href.indexOf('platform=pc') >= 0 && location.href.indexOf('linkSource=class') < 0) {
       var _loading = document.getElementById("loading");
       _loading && document.body.removeChild(_loading);
     }

BIN
public/soundfonts/whistling/A4.mp3


BIN
public/soundfonts/whistling/A5.mp3


BIN
public/soundfonts/whistling/Ab5.mp3


BIN
public/soundfonts/whistling/B4.mp3


BIN
public/soundfonts/whistling/B5.mp3


BIN
public/soundfonts/whistling/Bb4.mp3


BIN
public/soundfonts/whistling/Bb5.mp3


BIN
public/soundfonts/whistling/C5.mp3


BIN
public/soundfonts/whistling/C6.mp3


BIN
public/soundfonts/whistling/D5.mp3


BIN
public/soundfonts/whistling/D6.mp3


BIN
public/soundfonts/whistling/Db5.mp3


BIN
public/soundfonts/whistling/Db6.mp3


BIN
public/soundfonts/whistling/E5.mp3


BIN
public/soundfonts/whistling/E6.mp3


BIN
public/soundfonts/whistling/Eb5.mp3


BIN
public/soundfonts/whistling/Eb6.mp3


BIN
public/soundfonts/whistling/F5.mp3


BIN
public/soundfonts/whistling/F6.mp3


BIN
public/soundfonts/whistling/G5.mp3


BIN
public/soundfonts/whistling/Gb5.mp3


+ 6 - 3
src/helpers/formateMusic.ts

@@ -909,7 +909,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// 管乐迷,按自定义按读取到的音符时值
 			if (customNoteCurrentTime) {
 				if (isMutileSubject && currentTimes[i + 1] > 0 && NoteRealValue > currentTimes[i + 1]) {
-					console.log(NoteRealValue, currentTimes[i + 1])
+					// console.log(NoteRealValue, currentTimes[i + 1])
 					NoteRealValue = currentTimes[i + 1];
 				}
 			}
@@ -1268,7 +1268,7 @@ export const compatibleXmlPitchVoice = (xmlParse: any) => {
 		const instrumentNames = Array.from(xmlParse.getElementsByTagName('instrument-name')) || [];
 		// @ts-ignore
 		const instrumentName = instrumentNames[0]?.textContent?.trim()?.toLocaleLowerCase() || ''
-		// console.log('ins名称',instrumentName)
+		// console.log('instrument名称',instrumentName)
 		// 是否需要程序处理移调
 		let xmlNeedAdjustVoice = false;
 		switch (state.musicalCodeId) {
@@ -1284,7 +1284,10 @@ export const compatibleXmlPitchVoice = (xmlParse: any) => {
 				break;
 			case 35:
 				xmlNeedAdjustVoice = !instrumentName || instrumentName.includes('solo') || instrumentName.includes('woodwind') ? true : false
-				break;				
+				break;		
+			case 39:
+				xmlNeedAdjustVoice = !instrumentName || instrumentName.includes('solo') || instrumentName.includes('whistling') ? true : false
+				break;						
 			default:
 				xmlNeedAdjustVoice = !instrumentName || instrumentName.includes('solo') ? true : false
 				break;

+ 15 - 3
src/page-instrument/App.tsx

@@ -18,7 +18,7 @@ export default defineComponent({
     };
     const setUser = async () => {
       try {
-        const res = query.isCbs ? {code:200,data:{}} : await getUserInfo();
+        const res = query.isCbs ? { code: 200, data: {} } : await getUserInfo();
         if (res?.code === 5000) {
           const browserInfo = browser();
           showToast(res.message);
@@ -36,8 +36,8 @@ export default defineComponent({
               "*"
             );
             setTimeout(() => {
-              window.location.href = `${location.origin}/classroom`
-            }, 500)
+              window.location.href = `${location.origin}/classroom`;
+            }, 500);
           }
           return;
         }
@@ -94,6 +94,18 @@ export default defineComponent({
       _loading && document.body.removeChild(_loading);
       // console.log(query);
       if (query.platform == "pc") document.body.addEventListener("keyup", (e: KeyboardEvent) => onKeyBoard(e));
+
+      // 禁用右键菜单
+      document.addEventListener("contextmenu", function (event) {
+        event.preventDefault();
+      });
+      // 禁用浏览器快捷键
+      document.addEventListener("keydown", function (event) {
+        // 屏蔽 F12 和 Ctrl+Shift+I
+        if (event.key === "F12" || (event.ctrlKey && event.shiftKey && event.key === "I") || (event.metaKey && event.altKey && event.key === "I")) {
+          event.preventDefault();
+        }
+      });
     });
 
     onUnmounted(() => {

+ 19 - 2
src/page-instrument/api.ts

@@ -39,6 +39,23 @@ export const sysSuggestionAdd = (data: any) => {
 export const api_musicPracticeRecordDetail = (recordId: string) => {
   return request.get("/musicPracticeRecord/detail/" + recordId);
 };
+
+/** 获取声部 */
+export const api_subjectList = (params: any) => {
+  return request.post("/subject/list", {
+    data: params,
+    requestType: "json",
+  });
+};
+
+/** 获取乐器列表 */
+export const api_musicalInstrumentList = (params: any) => {
+  return request.post("/musicalInstrument/list", {
+    data: params,
+    requestType: "json",
+  });
+};
+
 /** 获取曲谱列表 */
 export const api_musicSheetPage = (data: any) => {
   return request.post("/musicSheet/page", {
@@ -61,8 +78,8 @@ export const getSubjectList = (data: any) => {
  * 获取意见类型
  */
 export const getSuggestionList = (params: any) => {
-  return request.post('/sysSuggestionType/page', {
+  return request.post("/sysSuggestionType/page", {
     data: params,
     requestType: "json",
   });
-};
+};

+ 81 - 96
src/page-instrument/component/mode-type-mode/index.tsx

@@ -12,102 +12,87 @@ import { usePageVisibility } from "@vant/use";
 import GuideIndex from "../../view-figner/guide/guide-index";
 import { getQuery } from "/src/utils/queryString";
 export default defineComponent({
-	name: "modelWraper",
+  name: "modelWraper",
 
-	setup() {
-		const query = getQuery();
-		const data = reactive({
-			showPC: false,
-			showStudent: false,
-			showVip: false,
-			showTip: false,
-		});
-		const openGuid = () => {
-			// 加载后 判断 端口号 加载对应的引导
-			if (storeData.platformType !== "STUDENT" || storeData.user.clientType !== "STUDENT") {
-				// PC
-				data.showPC = true;
-			} else {
-				if (storeData.user.vipMember) {
-					// 学生端
-					data.showStudent = true;
-				} else {
-					// vip
-					data.showVip = true;
-				}
-			}
-		};
+  setup() {
+    const query = getQuery();
+    const data = reactive({
+      showPC: false,
+      showStudent: false,
+      showVip: false,
+      showTip: false,
+    });
+    const openGuid = () => {
+      // 加载后 判断 端口号 加载对应的引导
+      if (storeData.platformType !== "STUDENT" || storeData.user.clientType !== "STUDENT") {
+        // PC
+        data.showPC = true;
+      } else {
+        // 添加学校上设置【课件解锁】,判断逻辑
+        const schoolInfos = storeData.user.schoolInfos;
+        const schoolLock = schoolInfos && schoolInfos.length > 0 ? schoolInfos[0].needVipLock : true;
+        if (storeData.user.vipMember || !schoolLock) {
+          // 学生端
+          data.showStudent = true;
+        } else {
+          // vip
+          data.showVip = true;
+        }
+      }
+    };
 
-		const getUserInfo = async () => {
-			const res = await studentQueryUserInfo();
-			const student = res?.data || {};
-			storeData.user.vipMember = student.vipMember;
-			// console.log("🚀 ~ student:", student);
-			if (storeData.user.vipMember) {
-				data.showVip = false;
-				openGuid();
-			}
-		};
-		const pageVisible = usePageVisibility();
-		watch(
-			() => pageVisible.value,
-			(val) => {
-				if (val === "visible") {
-					if (storeData.user.vipMember) return;
-					console.log("页面显示");
-					getUserInfo();
-				}
-			}
-		);
-		watch(
-			() => headTopData.modeType,
-			(val) => {
-				if (val === "init") {
-					nextTick(() => {
-						nextTick(() => {
-							setTimeout(() => {
-								data.showTip = true;
-							}, 500);
-						});
-					});
-				}
-			}
-		);
-		onMounted(() => {
-			openGuid();
-		});
-		return () => (
-			<>
-				<div class={[styles.wrap, headTopData.modeType === "init" ? "" : styles.hidden]}>
-					<div id="modeType-box" class={styles.infoWrap}>
-						<img
-							id="modeType-0"
-							onClick={() => headTopData.handleChangeModeType("practise")}
-							src={icons.icon_1}
-						/>
-						<img
-							id="modeType-1"
-							style={{ cursor: state.isPercussion ? "not-allowed" : "pointer" }}
-							onClick={() => headTopData.handleChangeModeType("follow")}
-							src={state.isPercussion ? icons.icon_5 : icons.icon_2}
-						/>
-						<img
-							id="modeType-2"
-							style={{ cursor: state.enableEvaluation ? "pointer" : "not-allowed" }}
-							onClick={() => headTopData.handleChangeModeType("evaluating")}
-							src={state.enableEvaluation ? icons.icon_3 : icons.icon_4}
-						/>
-					</div>
-					{data.showPC && data.showTip && !query.isCbs ? <TeacherBootom></TeacherBootom> : null}
-					{data.showStudent && data.showTip && !query.isCbs ? <StudentBottom></StudentBottom> : null}
-					{data.showVip && <TheVip />}
-				</div>
-				{headTopData.modeType &&
-					headTopData.modeType !== "init" &&
-					state.modeType == "practise" &&
-					state.fingeringInfo?.name &&
-					state.setting.displayFingering && <GuideIndex list={["detail"]} />}
-			</>
-		);
-	},
+    const getUserInfo = async () => {
+      const res = await studentQueryUserInfo();
+      const student = res?.data || {};
+      storeData.user.vipMember = student.vipMember;
+      // console.log("🚀 ~ student:", student);
+      if (storeData.user.vipMember) {
+        data.showVip = false;
+        openGuid();
+      }
+    };
+    const pageVisible = usePageVisibility();
+    watch(
+      () => pageVisible.value,
+      (val) => {
+        if (val === "visible") {
+          if (storeData.user.vipMember) return;
+          console.log("页面显示");
+          getUserInfo();
+        }
+      }
+    );
+    watch(
+      () => headTopData.modeType,
+      (val) => {
+        if (val === "init") {
+          nextTick(() => {
+            nextTick(() => {
+              setTimeout(() => {
+                data.showTip = true;
+              }, 500);
+            });
+          });
+        }
+      }
+    );
+    onMounted(() => {
+      openGuid();
+    });
+    return () => (
+      <>
+        <div class={[styles.wrap, headTopData.modeType === "init" ? "" : styles.hidden]}>
+          <div id="modeType-box" class={styles.infoWrap}>
+            <img id="modeType-0" onClick={() => headTopData.handleChangeModeType("practise")} src={icons.icon_1} />
+            <img id="modeType-1" style={{ cursor: state.isPercussion ? "not-allowed" : "pointer" }} onClick={() => headTopData.handleChangeModeType("follow")} src={state.isPercussion ? icons.icon_5 : icons.icon_2} />
+            <img id="modeType-2" style={{ cursor: state.enableEvaluation ? "pointer" : "not-allowed" }} onClick={() => headTopData.handleChangeModeType("evaluating")} src={state.enableEvaluation ? icons.icon_3 : icons.icon_4} />
+          </div>
+          {data.showPC && data.showTip && !query.isCbs ? <TeacherBootom></TeacherBootom> : null}
+          {data.showStudent && data.showTip && !query.isCbs ? <StudentBottom></StudentBottom> : null}
+          {data.showVip && <TheVip />}
+        </div>
+        {headTopData.modeType && headTopData.modeType !== "init" && state.modeType == "practise" && state.fingeringInfo?.name && state.setting.displayFingering && <GuideIndex list={["detail"]} />}
+      </>
+    );
+  },
 });

+ 0 - 1
src/page-instrument/custom-plugins/helper-model/recommendation/index.module.less

@@ -56,7 +56,6 @@
 
 .tags {
     display: flex;
-    justify-content: space-between;
     text-align: center;
     flex-wrap: wrap;
     padding: 0 var(--van-cell-horizontal-padding) var(--van-cell-vertical-padding) var(--van-cell-horizontal-padding);

+ 0 - 1
src/page-instrument/custom-plugins/helper-model/recommendation/index.tsx

@@ -56,7 +56,6 @@ export default defineComponent({
 			} catch (error) {}
 			recommenData.loading = false;
 		};
-
 		onMounted(() => {
 			getTypeList();
 		});

+ 2 - 2
src/page-instrument/custom-plugins/the-vip/index.module.less

@@ -26,10 +26,10 @@
 .content {
     position: relative;
     padding: 33px 13px 20px 13px;
-    font-size: 13px;
+    font-size: 14px;
     font-weight: 400;
     color: #333333;
-    line-height: 18px;
+    line-height: 22px;
     z-index: 10;
 }
 

+ 1 - 1
src/page-instrument/custom-plugins/work-index/index.tsx

@@ -46,7 +46,7 @@ export default defineComponent({
 					headTopData.handleChangeModeType('evaluating');
 				}
 			}
-		);
+		);		
 		onMounted(() => {
 			getWorkDetail();
 		});

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/page-instrument/evaluat-model/delay-check/json/bg_new.json


+ 9 - 13
src/page-instrument/evaluat-model/evaluat-result/img/icon_expression0.svg

@@ -192,16 +192,16 @@
                 <feMergeNode in="shadowMatrixInner2"></feMergeNode>
             </feMerge>
         </filter>
-        <linearGradient x1="76.9945329%" y1="0%" x2="40.4500795%" y2="99.4213184%" id="linearGradient-59">
+        <linearGradient x1="58.2441752%" y1="0%" x2="47.0834384%" y2="99.4213184%" id="linearGradient-59">
             <stop stop-color="#FF8C6E" offset="0%"></stop>
             <stop stop-color="#FF5D10" offset="100%"></stop>
         </linearGradient>
-        <linearGradient x1="58.2441752%" y1="0%" x2="47.0834384%" y2="99.4213184%" id="linearGradient-60">
+        <linearGradient x1="76.9945329%" y1="0%" x2="40.4500795%" y2="99.4213184%" id="linearGradient-60">
             <stop stop-color="#FF8C6E" offset="0%"></stop>
             <stop stop-color="#FF5D10" offset="100%"></stop>
         </linearGradient>
     </defs>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="蓝色" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
         <g id="测评备份-4" transform="translate(-450.000000, -12.000000)">
             <g id="编组-8" transform="translate(450.393105, 12.000000)">
                 <g id="真棒备份-5" transform="translate(17.097398, 3.548901)">
@@ -296,7 +296,7 @@
                                 <use fill="black" fill-opacity="1" filter="url(#filter-31)" xlink:href="#path-29"></use>
                             </g>
                             <path d="M11.1484324,-2.33308697 L12.2158113,0.360305293 C12.2158113,0.360305293 13.7568943,4.33786676 11.9488853,7.20365702 C10.1405511,10.0694473 6.14478943,14.3189927 6.11260225,17.8133174 C6.08008995,21.307642 7.6949759,25.976428 11.5106195,26.9709816 C11.5106195,26.9709816 6.12235594,26.434197 5.28126273,19.2228669 C4.44049465,12.0115369 10.9179202,8.33763099 11.6432696,6.55945009 C12.3689442,4.78126919 13.1635448,2.42842829 11.1484324,-2.33308697" id="Fill-116" fill="#F6FFFD" opacity="0.487753005" mask="url(#mask-30)"></path>
-                            <path d="M15.6296678,9.23351288 C15.6127614,9.01638282 15.1387321,15.8473271 12.5227924,18.544964 C10.1357393,21.0062067 6.24791844,25.999545 11.5106845,26.9709163 C16.7741008,27.9419611 8.70974982,24.2471585 11.9414725,22.1754439 C16.5201797,19.2407597 16.0194903,14.2023628 15.6296678,9.23351288" id="Fill-114" fill="#4AD7BC" mask="url(#mask-30)"></path>
+                            <path d="M15.6296678,9.23351288 C15.6127614,9.01638282 15.1387321,15.8473271 12.5227924,18.544964 C10.1357393,21.0062067 6.24791844,25.999545 11.5106845,26.9709163 C16.7741008,27.9419611 8.70974982,24.2471585 11.9414725,22.1754439 C16.5201797,19.2407597 16.0194903,14.2023628 15.6296678,9.23351288" id="Fill-114" fill="#73E2F0" mask="url(#mask-30)"></path>
                         </g>
                     </g>
                     <g id="右翅膀备份-5" transform="translate(29.292397, 85.406164) scale(-1, -1) rotate(71.000000) translate(-29.292397, -85.406164) translate(5.742631, 62.534754)">
@@ -364,19 +364,15 @@
                         </g>
                     </g>
                 </g>
-                <g id="编组-17" transform="translate(77.294111, 59.492933) rotate(2.000000) translate(-77.294111, -59.492933) translate(4.281298, 35.996986)" fill-rule="nonzero">
-                    <g id="编组" transform="translate(10.803609, 35.373768) rotate(-9.000000) translate(-10.803609, -35.373768) translate(1.494884, 25.085177)" fill="url(#linearGradient-59)">
-                        <path d="M17.3886882,0.0850624029 L5.70084641,1.93438018 C5.66296042,1.94006238 5.62754471,1.95068666 5.59321289,1.96310155 L5.17102225,1.96310155 C4.88313407,1.96310155 4.65443173,2.1811978 4.65443173,2.450028 L4.65443173,15.1050781 C4.19838821,14.8553239 3.66808512,14.7127436 3.10292087,14.7127436 C1.38932954,14.7127436 -2.27373675e-13,16.0254276 -2.27373675e-13,17.6449982 C-2.27373675e-13,19.2646882 1.38930434,20.5771812 3.10292087,20.5771812 C4.81646178,20.5771812 6.20581655,19.2646643 6.20581655,17.6449982 C6.20581655,17.5262927 6.19827967,17.4096644 6.18408818,17.2958293 C6.19827967,17.2507776 6.20581655,17.203983 6.20581655,17.1542279 L6.20581655,6.86228117 L17.0660396,5.04839361 L17.0660396,12.1718446 C16.6099709,11.9230454 16.0797182,11.779534 15.5145288,11.779534 C13.8009374,11.779534 12.4116331,13.0930775 12.4116331,14.7127436 C12.4116331,16.3314786 13.8009122,17.6449982 15.5145288,17.6449982 C17.2281453,17.6449982 18.6174497,16.3314548 18.6174497,14.7127436 C18.6174497,14.5940859 18.6098876,14.4774575 18.5957465,14.3626198 C18.6099128,14.317568 18.6174497,14.2707496 18.6174497,14.2210422 L18.6174497,0.537609148 C18.6174497,0.298359834 18.4341198,0.0984800359 18.1927383,0.0582510045 C18.108396,0.00854366917 18.0023505,-0.011606648 17.8856677,0.00660982946 L17.6109375,0.0506349606 L17.5826302,0.0506349606 C17.5139665,0.050658805 17.4482521,0.0630737166 17.3886882,0.0850624029 L17.3886882,0.0850624029 Z" id="路径"></path>
-                    </g>
-                    <g id="编组" transform="translate(139.016582, 13.108827) rotate(-9.000000) translate(-139.016582, -13.108827) translate(133.627321, 2.330304)" fill="url(#linearGradient-60)">
+                <g id="编组-17" transform="translate(81.816884, 43.497494) rotate(2.000000) translate(-81.816884, -43.497494) translate(12.765857, 26.252188)" fill-rule="nonzero">
+                    <g id="编组" transform="translate(131.093012, 23.001724) rotate(-9.000000) translate(-131.093012, -23.001724) translate(125.703750, 12.223201)" fill="url(#linearGradient-59)">
                         <path d="M9.1963554,0.158528744 C8.91075429,0.534884597 7.36850835,1.18006604 6.05474331,1.44889164 C4.39825694,1.77148237 3.54145363,2.04030797 2.68465033,2.47042894 C1.54224594,3.11561041 0.913923523,3.92208721 1.02816396,4.67479892 C1.08528417,4.83609427 2.45616946,6.71787352 4.05553561,8.86847838 C5.71202198,11.0190832 7.08290727,12.8470973 7.14002748,12.9008625 C7.1971477,13.0083927 6.96866683,13.0083927 6.16898374,12.9546276 C3.65569407,12.7933322 1.37088528,14.02993 0.342721327,15.9654744 C0.0571202173,16.5568907 -2.27373675e-13,16.8794814 -2.27373675e-13,17.578428 C-2.27373675e-13,19.1913816 0.913923523,20.4817446 2.62753011,21.2344562 C3.31297274,21.5032819 3.54145363,21.557047 4.96945913,21.557047 C6.51170507,21.557047 6.56882529,21.557047 7.59698925,21.0731609 C10.3387598,19.8365631 11.4811642,17.4171326 10.3387598,15.2127627 C10.1102789,14.7288766 8.68227342,12.4169764 7.14002748,10.051311 L4.3411367,5.69633622 L4.79809846,5.69633622 C6.62594551,5.58880598 7.88259033,5.05115477 8.73939364,4.13714771 C9.48195649,3.33067088 9.71043738,2.52419408 9.65331716,1.23383116 C9.59619694,0.0509985062 9.48195651,-0.217827109 9.1963554,0.158528744 L9.1963554,0.158528744 Z" id="路径"></path>
                     </g>
-                    <g id="编组" transform="translate(123.828663, 8.699431) rotate(-8.000000) translate(-123.828663, -8.699431) translate(117.954232, 0.740103)" fill="#FFCF00">
+                    <g id="编组" transform="translate(115.905092, 18.592328) rotate(-8.000000) translate(-115.905092, -18.592328) translate(110.030661, 10.633000)" fill="#FFCF00">
                         <path d="M5.96876548,0.610334892 C5.10331258,4.8157963 5.08773443,6.91577113 0.975102253,8.65748254 C4.10977265,9.76166879 5.24178504,11.1102091 6.08819798,15.3083215 C6.55900436,10.4120547 8.82822186,9.71757483 10.77376,8.40026778 C6.84806562,7.15093892 6.20243776,3.64914362 5.96876548,0.610334892 Z" id="路径" transform="translate(5.874431, 7.959328) rotate(8.000000) translate(-5.874431, -7.959328) "></path>
                     </g>
-                    <g id="编组备份-2" transform="translate(8.353945, 11.367056)" fill="#FFD256">
-                        <path d="M3.99493058,0 C3.30256826,3.08400503 3.29010574,4.62398658 0,5.90124161 C2.50773632,6.71097819 3.41334623,7.69990772 4.09047658,10.7785235 C4.46712168,7.18792785 6.28249568,6.67864262 7.83892617,5.71261745 C4.6983707,4.79644295 4.18186841,2.22845973 3.99493058,0 Z" id="路径"></path>
-                    </g>
+                    <path d="M17.3886882,13.7405467 L5.70084641,15.5898645 C5.66296042,15.5955467 5.62754471,15.606171 5.59321289,15.6185859 L5.17102225,15.6185859 C4.88313407,15.6185859 4.65443173,15.8366821 4.65443173,16.1055123 L4.65443173,28.7605624 C4.19838821,28.5108082 3.66808512,28.3682279 3.10292087,28.3682279 C1.38932954,28.3682279 4.54747351e-13,29.6809119 4.54747351e-13,31.3004825 C4.54747351e-13,32.9201725 1.38930434,34.2326655 3.10292087,34.2326655 C4.81646178,34.2326655 6.20581655,32.9201487 6.20581655,31.3004825 C6.20581655,31.1817771 6.19827967,31.0651487 6.18408818,30.9513137 C6.19827967,30.9062619 6.20581655,30.8594673 6.20581655,30.8097123 L6.20581655,20.5177655 L17.0660396,18.7038779 L17.0660396,25.827329 C16.6099709,25.5785297 16.0797182,25.4350183 15.5145288,25.4350183 C13.8009374,25.4350183 12.4116331,26.7485618 12.4116331,28.3682279 C12.4116331,29.986963 13.8009122,31.3004826 15.5145288,31.3004826 C17.2281453,31.3004826 18.6174497,29.9869391 18.6174497,28.3682279 C18.6174497,28.2495702 18.6098876,28.1329418 18.5957465,28.0181041 C18.6099128,27.9730523 18.6174497,27.9262339 18.6174497,27.8765265 L18.6174497,14.1930935 C18.6174497,13.9538442 18.4341198,13.7539644 18.1927383,13.7137353 C18.108396,13.664028 18.0023505,13.6438777 17.8856677,13.6620942 L17.6109375,13.7061193 L17.5826302,13.7061193 C17.5139665,13.7061431 17.4482521,13.718558 17.3886882,13.7405467 L17.3886882,13.7405467 Z" id="路径" fill="url(#linearGradient-60)"></path>
+                    <path d="M11.5028352,0 C10.8104729,3.08400503 10.7980104,4.62398658 7.50790466,5.90124161 C10.015641,6.71097819 10.9212509,7.69990772 11.5983812,10.7785235 C11.9750263,7.18792785 13.7904003,6.67864262 15.3468308,5.71261745 C12.2062754,4.79644295 11.6897731,2.22845973 11.5028352,0 Z" id="路径" fill="#FFD256"></path>
                 </g>
             </g>
         </g>

+ 9 - 13
src/page-instrument/evaluat-model/evaluat-result/img/icon_expression1.svg

@@ -168,16 +168,16 @@
             <feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
             <feColorMatrix values="0 0 0 0 0.963654435   0 0 0 0 1   0 0 0 0 0.817785942  0 0 0 0.5 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
         </filter>
-        <linearGradient x1="76.9945329%" y1="0%" x2="40.4500795%" y2="99.4213184%" id="linearGradient-49">
+        <linearGradient x1="58.2441752%" y1="0%" x2="47.0834384%" y2="99.4213184%" id="linearGradient-49">
             <stop stop-color="#FF8C6E" offset="0%"></stop>
             <stop stop-color="#FF5D10" offset="100%"></stop>
         </linearGradient>
-        <linearGradient x1="58.2441752%" y1="0%" x2="47.0834384%" y2="99.4213184%" id="linearGradient-50">
+        <linearGradient x1="76.9945329%" y1="0%" x2="40.4500795%" y2="99.4213184%" id="linearGradient-50">
             <stop stop-color="#FF8C6E" offset="0%"></stop>
             <stop stop-color="#FF5D10" offset="100%"></stop>
         </linearGradient>
     </defs>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="蓝色" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
         <g id="测评备份-3" transform="translate(-450.000000, -12.000000)">
             <g id="编组-2" transform="translate(450.393105, 12.000000)">
                 <g id="真棒备份-5" transform="translate(27.907426, 6.548901)">
@@ -304,23 +304,19 @@
                                 <use fill="black" fill-opacity="1" filter="url(#filter-48)" xlink:href="#path-46"></use>
                             </g>
                             <path d="M11.1484324,-2.33308697 L12.2158113,0.360305293 C12.2158113,0.360305293 13.7568943,4.33786676 11.9488853,7.20365702 C10.1405511,10.0694473 6.14478943,14.3189927 6.11260225,17.8133174 C6.08008995,21.307642 7.6949759,25.976428 11.5106195,26.9709816 C11.5106195,26.9709816 6.12235594,26.434197 5.28126273,19.2228669 C4.44049465,12.0115369 10.9179202,8.33763099 11.6432696,6.55945009 C12.3689442,4.78126919 13.1635448,2.42842829 11.1484324,-2.33308697" id="Fill-116" fill="#F6FFFD" opacity="0.487753005" mask="url(#mask-47)"></path>
-                            <path d="M15.6296678,9.23351288 C15.6127614,9.01638282 15.1387321,15.8473271 12.5227924,18.544964 C10.1357393,21.0062067 6.24791844,25.999545 11.5106845,26.9709163 C16.7741008,27.9419611 8.70974982,24.2471585 11.9414725,22.1754439 C16.5201797,19.2407597 16.0194903,14.2023628 15.6296678,9.23351288" id="Fill-114" fill="#4AD7BC" mask="url(#mask-47)"></path>
+                            <path d="M15.6296678,9.23351288 C15.6127614,9.01638282 15.1387321,15.8473271 12.5227924,18.544964 C10.1357393,21.0062067 6.24791844,25.999545 11.5106845,26.9709163 C16.7741008,27.9419611 8.70974982,24.2471585 11.9414725,22.1754439 C16.5201797,19.2407597 16.0194903,14.2023628 15.6296678,9.23351288" id="Fill-114" fill="#73E2F0" mask="url(#mask-47)"></path>
                         </g>
                     </g>
                 </g>
-                <g id="编组-17" transform="translate(77.294111, 59.492933) rotate(2.000000) translate(-77.294111, -59.492933) translate(4.281298, 35.996986)" fill-rule="nonzero">
-                    <g id="编组" transform="translate(10.803609, 35.373768) rotate(-9.000000) translate(-10.803609, -35.373768) translate(1.494884, 25.085177)" fill="url(#linearGradient-49)">
-                        <path d="M17.3886882,0.0850624029 L5.70084641,1.93438018 C5.66296042,1.94006238 5.62754471,1.95068666 5.59321289,1.96310155 L5.17102225,1.96310155 C4.88313407,1.96310155 4.65443173,2.1811978 4.65443173,2.450028 L4.65443173,15.1050781 C4.19838821,14.8553239 3.66808512,14.7127436 3.10292087,14.7127436 C1.38932954,14.7127436 -2.27373675e-13,16.0254276 -2.27373675e-13,17.6449982 C-2.27373675e-13,19.2646882 1.38930434,20.5771812 3.10292087,20.5771812 C4.81646178,20.5771812 6.20581655,19.2646643 6.20581655,17.6449982 C6.20581655,17.5262927 6.19827967,17.4096644 6.18408818,17.2958293 C6.19827967,17.2507776 6.20581655,17.203983 6.20581655,17.1542279 L6.20581655,6.86228117 L17.0660396,5.04839361 L17.0660396,12.1718446 C16.6099709,11.9230454 16.0797182,11.779534 15.5145288,11.779534 C13.8009374,11.779534 12.4116331,13.0930775 12.4116331,14.7127436 C12.4116331,16.3314786 13.8009122,17.6449982 15.5145288,17.6449982 C17.2281453,17.6449982 18.6174497,16.3314548 18.6174497,14.7127436 C18.6174497,14.5940859 18.6098876,14.4774575 18.5957465,14.3626198 C18.6099128,14.317568 18.6174497,14.2707496 18.6174497,14.2210422 L18.6174497,0.537609148 C18.6174497,0.298359834 18.4341198,0.0984800359 18.1927383,0.0582510045 C18.108396,0.00854366917 18.0023505,-0.011606648 17.8856677,0.00660982946 L17.6109375,0.0506349606 L17.5826302,0.0506349606 C17.5139665,0.050658805 17.4482521,0.0630737166 17.3886882,0.0850624029 L17.3886882,0.0850624029 Z" id="路径"></path>
-                    </g>
-                    <g id="编组" transform="translate(139.016582, 13.108827) rotate(-9.000000) translate(-139.016582, -13.108827) translate(133.627321, 2.330304)" fill="url(#linearGradient-50)">
+                <g id="编组-17" transform="translate(81.816884, 43.497494) rotate(2.000000) translate(-81.816884, -43.497494) translate(12.765857, 26.252188)" fill-rule="nonzero">
+                    <g id="编组" transform="translate(131.093012, 23.001724) rotate(-9.000000) translate(-131.093012, -23.001724) translate(125.703750, 12.223201)" fill="url(#linearGradient-49)">
                         <path d="M9.1963554,0.158528744 C8.91075429,0.534884597 7.36850835,1.18006604 6.05474331,1.44889164 C4.39825694,1.77148237 3.54145363,2.04030797 2.68465033,2.47042894 C1.54224594,3.11561041 0.913923523,3.92208721 1.02816396,4.67479892 C1.08528417,4.83609427 2.45616946,6.71787352 4.05553561,8.86847838 C5.71202198,11.0190832 7.08290727,12.8470973 7.14002748,12.9008625 C7.1971477,13.0083927 6.96866683,13.0083927 6.16898374,12.9546276 C3.65569407,12.7933322 1.37088528,14.02993 0.342721327,15.9654744 C0.0571202173,16.5568907 -2.27373675e-13,16.8794814 -2.27373675e-13,17.578428 C-2.27373675e-13,19.1913816 0.913923523,20.4817446 2.62753011,21.2344562 C3.31297274,21.5032819 3.54145363,21.557047 4.96945913,21.557047 C6.51170507,21.557047 6.56882529,21.557047 7.59698925,21.0731609 C10.3387598,19.8365631 11.4811642,17.4171326 10.3387598,15.2127627 C10.1102789,14.7288766 8.68227342,12.4169764 7.14002748,10.051311 L4.3411367,5.69633622 L4.79809846,5.69633622 C6.62594551,5.58880598 7.88259033,5.05115477 8.73939364,4.13714771 C9.48195649,3.33067088 9.71043738,2.52419408 9.65331716,1.23383116 C9.59619694,0.0509985062 9.48195651,-0.217827109 9.1963554,0.158528744 L9.1963554,0.158528744 Z" id="路径"></path>
                     </g>
-                    <g id="编组" transform="translate(123.828663, 8.699431) rotate(-8.000000) translate(-123.828663, -8.699431) translate(117.954232, 0.740103)" fill="#FFCF00">
+                    <g id="编组" transform="translate(115.905092, 18.592328) rotate(-8.000000) translate(-115.905092, -18.592328) translate(110.030661, 10.633000)" fill="#FFCF00">
                         <path d="M5.96876548,0.610334892 C5.10331258,4.8157963 5.08773443,6.91577113 0.975102253,8.65748254 C4.10977265,9.76166879 5.24178504,11.1102091 6.08819798,15.3083215 C6.55900436,10.4120547 8.82822186,9.71757483 10.77376,8.40026778 C6.84806562,7.15093892 6.20243776,3.64914362 5.96876548,0.610334892 Z" id="路径" transform="translate(5.874431, 7.959328) rotate(8.000000) translate(-5.874431, -7.959328) "></path>
                     </g>
-                    <g id="编组备份-2" transform="translate(8.353945, 11.367056)" fill="#FFD256">
-                        <path d="M3.99493058,0 C3.30256826,3.08400503 3.29010574,4.62398658 0,5.90124161 C2.50773632,6.71097819 3.41334623,7.69990772 4.09047658,10.7785235 C4.46712168,7.18792785 6.28249568,6.67864262 7.83892617,5.71261745 C4.6983707,4.79644295 4.18186841,2.22845973 3.99493058,0 Z" id="路径"></path>
-                    </g>
+                    <path d="M17.3886882,13.7405467 L5.70084641,15.5898645 C5.66296042,15.5955467 5.62754471,15.606171 5.59321289,15.6185859 L5.17102225,15.6185859 C4.88313407,15.6185859 4.65443173,15.8366821 4.65443173,16.1055123 L4.65443173,28.7605624 C4.19838821,28.5108082 3.66808512,28.3682279 3.10292087,28.3682279 C1.38932954,28.3682279 4.54747351e-13,29.6809119 4.54747351e-13,31.3004825 C4.54747351e-13,32.9201725 1.38930434,34.2326655 3.10292087,34.2326655 C4.81646178,34.2326655 6.20581655,32.9201487 6.20581655,31.3004825 C6.20581655,31.1817771 6.19827967,31.0651487 6.18408818,30.9513137 C6.19827967,30.9062619 6.20581655,30.8594673 6.20581655,30.8097123 L6.20581655,20.5177655 L17.0660396,18.7038779 L17.0660396,25.827329 C16.6099709,25.5785297 16.0797182,25.4350183 15.5145288,25.4350183 C13.8009374,25.4350183 12.4116331,26.7485618 12.4116331,28.3682279 C12.4116331,29.986963 13.8009122,31.3004826 15.5145288,31.3004826 C17.2281453,31.3004826 18.6174497,29.9869391 18.6174497,28.3682279 C18.6174497,28.2495702 18.6098876,28.1329418 18.5957465,28.0181041 C18.6099128,27.9730523 18.6174497,27.9262339 18.6174497,27.8765265 L18.6174497,14.1930935 C18.6174497,13.9538442 18.4341198,13.7539644 18.1927383,13.7137353 C18.108396,13.664028 18.0023505,13.6438777 17.8856677,13.6620942 L17.6109375,13.7061193 L17.5826302,13.7061193 C17.5139665,13.7061431 17.4482521,13.718558 17.3886882,13.7405467 L17.3886882,13.7405467 Z" id="路径" fill="url(#linearGradient-50)"></path>
+                    <path d="M11.5028352,0 C10.8104729,3.08400503 10.7980104,4.62398658 7.50790466,5.90124161 C10.015641,6.71097819 10.9212509,7.69990772 11.5983812,10.7785235 C11.9750263,7.18792785 13.7904003,6.67864262 15.3468308,5.71261745 C12.2062754,4.79644295 11.6897731,2.22845973 11.5028352,0 Z" id="路径" fill="#FFD256"></path>
                 </g>
             </g>
         </g>

+ 9 - 13
src/page-instrument/evaluat-model/evaluat-result/img/icon_expression2.svg

@@ -172,16 +172,16 @@
             <feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
             <feColorMatrix values="0 0 0 0 0.963654435   0 0 0 0 1   0 0 0 0 0.817785942  0 0 0 0.5 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
         </filter>
-        <linearGradient x1="76.9945329%" y1="0%" x2="40.4500795%" y2="99.4213184%" id="linearGradient-51">
+        <linearGradient x1="58.2441752%" y1="0%" x2="47.0834384%" y2="99.4213184%" id="linearGradient-51">
             <stop stop-color="#FF8C6E" offset="0%"></stop>
             <stop stop-color="#FF5D10" offset="100%"></stop>
         </linearGradient>
-        <linearGradient x1="58.2441752%" y1="0%" x2="47.0834384%" y2="99.4213184%" id="linearGradient-52">
+        <linearGradient x1="76.9945329%" y1="0%" x2="40.4500795%" y2="99.4213184%" id="linearGradient-52">
             <stop stop-color="#FF8C6E" offset="0%"></stop>
             <stop stop-color="#FF5D10" offset="100%"></stop>
         </linearGradient>
     </defs>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="蓝色" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
         <g id="测评备份" transform="translate(-450.000000, -12.000000)">
             <g id="编组-2" transform="translate(450.393105, 12.000000)">
                 <g id="真棒备份-4" transform="translate(78.407426, 83.042586) rotate(-1.000000) translate(-78.407426, -83.042586) translate(27.907426, 7.548901)">
@@ -308,23 +308,19 @@
                                 <use fill="black" fill-opacity="1" filter="url(#filter-50)" xlink:href="#path-48"></use>
                             </g>
                             <path d="M11.1484324,-2.33308697 L12.2158113,0.360305293 C12.2158113,0.360305293 13.7568943,4.33786676 11.9488853,7.20365702 C10.1405511,10.0694473 6.14478943,14.3189927 6.11260225,17.8133174 C6.08008995,21.307642 7.6949759,25.976428 11.5106195,26.9709816 C11.5106195,26.9709816 6.12235594,26.434197 5.28126273,19.2228669 C4.44049465,12.0115369 10.9179202,8.33763099 11.6432696,6.55945009 C12.3689442,4.78126919 13.1635448,2.42842829 11.1484324,-2.33308697" id="Fill-116" fill="#F6FFFD" opacity="0.487753005" mask="url(#mask-49)"></path>
-                            <path d="M15.6296678,9.23351288 C15.6127614,9.01638282 15.1387321,15.8473271 12.5227924,18.544964 C10.1357393,21.0062067 6.24791844,25.999545 11.5106845,26.9709163 C16.7741008,27.9419611 8.70974982,24.2471585 11.9414725,22.1754439 C16.5201797,19.2407597 16.0194903,14.2023628 15.6296678,9.23351288" id="Fill-114" fill="#4AD7BC" mask="url(#mask-49)"></path>
+                            <path d="M15.6296678,9.23351288 C15.6127614,9.01638282 15.1387321,15.8473271 12.5227924,18.544964 C10.1357393,21.0062067 6.24791844,25.999545 11.5106845,26.9709163 C16.7741008,27.9419611 8.70974982,24.2471585 11.9414725,22.1754439 C16.5201797,19.2407597 16.0194903,14.2023628 15.6296678,9.23351288" id="Fill-114" fill="#73E2F0" mask="url(#mask-49)"></path>
                         </g>
                     </g>
                 </g>
-                <g id="编组-17" transform="translate(77.294111, 59.492933) rotate(2.000000) translate(-77.294111, -59.492933) translate(4.281298, 35.996986)" fill-rule="nonzero">
-                    <g id="编组" transform="translate(10.803609, 35.373768) rotate(-9.000000) translate(-10.803609, -35.373768) translate(1.494884, 25.085177)" fill="url(#linearGradient-51)">
-                        <path d="M17.3886882,0.0850624029 L5.70084641,1.93438018 C5.66296042,1.94006238 5.62754471,1.95068666 5.59321289,1.96310155 L5.17102225,1.96310155 C4.88313407,1.96310155 4.65443173,2.1811978 4.65443173,2.450028 L4.65443173,15.1050781 C4.19838821,14.8553239 3.66808512,14.7127436 3.10292087,14.7127436 C1.38932954,14.7127436 -2.27373675e-13,16.0254276 -2.27373675e-13,17.6449982 C-2.27373675e-13,19.2646882 1.38930434,20.5771812 3.10292087,20.5771812 C4.81646178,20.5771812 6.20581655,19.2646643 6.20581655,17.6449982 C6.20581655,17.5262927 6.19827967,17.4096644 6.18408818,17.2958293 C6.19827967,17.2507776 6.20581655,17.203983 6.20581655,17.1542279 L6.20581655,6.86228117 L17.0660396,5.04839361 L17.0660396,12.1718446 C16.6099709,11.9230454 16.0797182,11.779534 15.5145288,11.779534 C13.8009374,11.779534 12.4116331,13.0930775 12.4116331,14.7127436 C12.4116331,16.3314786 13.8009122,17.6449982 15.5145288,17.6449982 C17.2281453,17.6449982 18.6174497,16.3314548 18.6174497,14.7127436 C18.6174497,14.5940859 18.6098876,14.4774575 18.5957465,14.3626198 C18.6099128,14.317568 18.6174497,14.2707496 18.6174497,14.2210422 L18.6174497,0.537609148 C18.6174497,0.298359834 18.4341198,0.0984800359 18.1927383,0.0582510045 C18.108396,0.00854366917 18.0023505,-0.011606648 17.8856677,0.00660982946 L17.6109375,0.0506349606 L17.5826302,0.0506349606 C17.5139665,0.050658805 17.4482521,0.0630737166 17.3886882,0.0850624029 L17.3886882,0.0850624029 Z" id="路径"></path>
-                    </g>
-                    <g id="编组" transform="translate(139.016582, 13.108827) rotate(-9.000000) translate(-139.016582, -13.108827) translate(133.627321, 2.330304)" fill="url(#linearGradient-52)">
+                <g id="编组-17" transform="translate(81.816884, 43.497494) rotate(2.000000) translate(-81.816884, -43.497494) translate(12.765857, 26.252188)" fill-rule="nonzero">
+                    <g id="编组" transform="translate(131.093012, 23.001724) rotate(-9.000000) translate(-131.093012, -23.001724) translate(125.703750, 12.223201)" fill="url(#linearGradient-51)">
                         <path d="M9.1963554,0.158528744 C8.91075429,0.534884597 7.36850835,1.18006604 6.05474331,1.44889164 C4.39825694,1.77148237 3.54145363,2.04030797 2.68465033,2.47042894 C1.54224594,3.11561041 0.913923523,3.92208721 1.02816396,4.67479892 C1.08528417,4.83609427 2.45616946,6.71787352 4.05553561,8.86847838 C5.71202198,11.0190832 7.08290727,12.8470973 7.14002748,12.9008625 C7.1971477,13.0083927 6.96866683,13.0083927 6.16898374,12.9546276 C3.65569407,12.7933322 1.37088528,14.02993 0.342721327,15.9654744 C0.0571202173,16.5568907 -2.27373675e-13,16.8794814 -2.27373675e-13,17.578428 C-2.27373675e-13,19.1913816 0.913923523,20.4817446 2.62753011,21.2344562 C3.31297274,21.5032819 3.54145363,21.557047 4.96945913,21.557047 C6.51170507,21.557047 6.56882529,21.557047 7.59698925,21.0731609 C10.3387598,19.8365631 11.4811642,17.4171326 10.3387598,15.2127627 C10.1102789,14.7288766 8.68227342,12.4169764 7.14002748,10.051311 L4.3411367,5.69633622 L4.79809846,5.69633622 C6.62594551,5.58880598 7.88259033,5.05115477 8.73939364,4.13714771 C9.48195649,3.33067088 9.71043738,2.52419408 9.65331716,1.23383116 C9.59619694,0.0509985062 9.48195651,-0.217827109 9.1963554,0.158528744 L9.1963554,0.158528744 Z" id="路径"></path>
                     </g>
-                    <g id="编组" transform="translate(123.828663, 8.699431) rotate(-8.000000) translate(-123.828663, -8.699431) translate(117.954232, 0.740103)" fill="#FFCF00">
+                    <g id="编组" transform="translate(115.905092, 18.592328) rotate(-8.000000) translate(-115.905092, -18.592328) translate(110.030661, 10.633000)" fill="#FFCF00">
                         <path d="M5.96876548,0.610334892 C5.10331258,4.8157963 5.08773443,6.91577113 0.975102253,8.65748254 C4.10977265,9.76166879 5.24178504,11.1102091 6.08819798,15.3083215 C6.55900436,10.4120547 8.82822186,9.71757483 10.77376,8.40026778 C6.84806562,7.15093892 6.20243776,3.64914362 5.96876548,0.610334892 Z" id="路径" transform="translate(5.874431, 7.959328) rotate(8.000000) translate(-5.874431, -7.959328) "></path>
                     </g>
-                    <g id="编组备份-2" transform="translate(8.353945, 11.367056)" fill="#FFD256">
-                        <path d="M3.99493058,0 C3.30256826,3.08400503 3.29010574,4.62398658 0,5.90124161 C2.50773632,6.71097819 3.41334623,7.69990772 4.09047658,10.7785235 C4.46712168,7.18792785 6.28249568,6.67864262 7.83892617,5.71261745 C4.6983707,4.79644295 4.18186841,2.22845973 3.99493058,0 Z" id="路径"></path>
-                    </g>
+                    <path d="M17.3886882,13.7405467 L5.70084641,15.5898645 C5.66296042,15.5955467 5.62754471,15.606171 5.59321289,15.6185859 L5.17102225,15.6185859 C4.88313407,15.6185859 4.65443173,15.8366821 4.65443173,16.1055123 L4.65443173,28.7605624 C4.19838821,28.5108082 3.66808512,28.3682279 3.10292087,28.3682279 C1.38932954,28.3682279 -2.27373675e-13,29.6809119 -2.27373675e-13,31.3004825 C-2.27373675e-13,32.9201725 1.38930434,34.2326655 3.10292087,34.2326655 C4.81646178,34.2326655 6.20581655,32.9201487 6.20581655,31.3004825 C6.20581655,31.1817771 6.19827967,31.0651487 6.18408818,30.9513137 C6.19827967,30.9062619 6.20581655,30.8594673 6.20581655,30.8097123 L6.20581655,20.5177655 L17.0660396,18.7038779 L17.0660396,25.827329 C16.6099709,25.5785297 16.0797182,25.4350183 15.5145288,25.4350183 C13.8009374,25.4350183 12.4116331,26.7485618 12.4116331,28.3682279 C12.4116331,29.986963 13.8009122,31.3004826 15.5145288,31.3004826 C17.2281453,31.3004826 18.6174497,29.9869391 18.6174497,28.3682279 C18.6174497,28.2495702 18.6098876,28.1329418 18.5957465,28.0181041 C18.6099128,27.9730523 18.6174497,27.9262339 18.6174497,27.8765265 L18.6174497,14.1930935 C18.6174497,13.9538442 18.4341198,13.7539644 18.1927383,13.7137353 C18.108396,13.664028 18.0023505,13.6438777 17.8856677,13.6620942 L17.6109375,13.7061193 L17.5826302,13.7061193 C17.5139665,13.7061431 17.4482521,13.718558 17.3886882,13.7405467 L17.3886882,13.7405467 Z" id="路径" fill="url(#linearGradient-52)"></path>
+                    <path d="M11.5028352,0 C10.8104729,3.08400503 10.7980104,4.62398658 7.50790466,5.90124161 C10.015641,6.71097819 10.9212509,7.69990772 11.5983812,10.7785235 C11.9750263,7.18792785 13.7904003,6.67864262 15.3468308,5.71261745 C12.2062754,4.79644295 11.6897731,2.22845973 11.5028352,0 Z" id="路径" fill="#FFD256"></path>
                 </g>
             </g>
         </g>

+ 11 - 11
src/page-instrument/evaluat-model/evaluat-result/img/icon_expression3.svg

@@ -201,7 +201,7 @@
             <stop stop-color="#FF5D10" offset="100%"></stop>
         </linearGradient>
     </defs>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="蓝色" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
         <g id="测评备份-2" transform="translate(-450.000000, -12.000000)">
             <g id="编组-2" transform="translate(450.393105, 12.000000)">
                 <g id="真棒备份-2" transform="translate(80.106863, 79.170360) rotate(7.000000) translate(-80.106863, -79.170360) translate(29.606831, 5.999996)">
@@ -296,7 +296,7 @@
                                 <use fill="black" fill-opacity="1" filter="url(#filter-42)" xlink:href="#path-40"></use>
                             </g>
                             <path d="M10.6175547,-2.22198759 L11.634106,0.343147898 C11.634106,0.343147898 13.1018041,4.13130167 11.3798907,6.86062573 C9.65766774,9.58994979 5.85218041,13.6371359 5.82152595,16.9650641 C5.79056186,20.2929924 7.32854848,24.7394553 10.9624947,25.6866492 C10.9624947,25.6866492 5.83081518,25.1754257 5.02977403,18.3074923 C4.22904252,11.4395589 10.3980193,7.94060094 11.0888282,6.24709533 C11.7799468,4.55358971 12.5367093,2.31278884 10.6175547,-2.22198759" id="Fill-116" fill="#F6FFFD" opacity="0.487753005" mask="url(#mask-41)"></path>
-                            <path d="M14.8853979,8.79382179 C14.8692966,8.58703126 14.4178401,15.0926925 11.9264689,17.6618705 C9.65308506,20.0059111 5.95039852,24.7614714 10.9625567,25.686587 C15.9753341,26.6113916 8.29499983,23.0925319 11.3728309,21.1194704 C15.7335045,18.3245331 15.2566574,13.5260599 14.8853979,8.79382179" id="Fill-114" fill="#4AD7BC" mask="url(#mask-41)"></path>
+                            <path d="M11.9264689,17.6618705 C9.65308506,20.0059111 5.95039852,24.7614714 10.9625567,25.686587 C15.9753341,26.6113916 8.29499983,23.0925319 11.3728309,21.1194704 C15.7335045,18.3245331 15.2566574,13.5260599 14.8853979,8.79382179 C14.8692966,8.58703126 14.4178401,15.0926925 11.9264689,17.6618705 Z" id="Fill-114" fill="#73E2F0" mask="url(#mask-41)"></path>
                         </g>
                     </g>
                     <g id="左翅膀" transform="translate(0.000000, 64.889991)">
@@ -304,26 +304,26 @@
                             <use fill="url(#linearGradient-43)" fill-rule="evenodd" xlink:href="#path-44"></use>
                             <use fill="black" fill-opacity="1" filter="url(#filter-45)" xlink:href="#path-44"></use>
                         </g>
-                        <path d="M7.6236761,19.495669 C7.36167743,24.2575048 8.05510972,27.8396786 9.70397297,30.2421903 C9.70397297,34.4601426 21.9218744,39.8003001 25.7222857,39.8003001 C26.4361597,40.6591436 27.2904697,41.4035694 28.2852157,42.0335775 L27.4123543,44.3430248 C26.2856419,43.4933002 25.5338467,42.5504625 25.1569686,41.5145117 C19.5248154,40.4239167 9.33470093,37.3214066 7.78963543,30.6445378 C5.64862041,26.8267531 5.37900151,22.6415552 6.98077874,18.0889443 L7.6236761,19.495669 Z" id="路径-7" fill="#30B497"></path>
+                        <path d="M7.6236761,19.495669 C7.36167743,24.2575048 8.05510972,27.8396786 9.70397297,30.2421903 C9.70397297,34.4601426 21.9218744,39.8003001 25.7222857,39.8003001 C26.4361597,40.6591436 27.2904697,41.4035694 28.2852157,42.0335775 L27.4123543,44.3430248 C26.2856419,43.4933002 25.5338467,42.5504625 25.1569686,41.5145117 C19.5248154,40.4239167 9.33470093,37.3214066 7.78963543,30.6445378 C5.64862041,26.8267531 5.37900151,22.6415552 6.98077874,18.0889443 L7.6236761,19.495669 Z" id="路径-7" fill="#1DABCF"></path>
                         <path d="M6.18469136,11.0151196 C8.80234268,12.6336745 11.8741357,13.8286837 15.964708,13.9825442 C20.0552804,14.1364047 23.2144391,13.4088822 23.2736032,9.63905729 C23.3327674,5.86923236 18.8124285,5.13592634 15.4210266,4.59878105 C12.0296248,4.06163577 9.63998022,4.55597485 6.56053252,5.73329896 C8.52279789,7.2705771 8.00586845,10.5343411 6.18469136,11.0151196 Z" id="Fill-21" fill="url(#linearGradient-46)" transform="translate(14.729435, 9.191919) scale(-1, -1) rotate(81.000000) translate(-14.729435, -9.191919) "></path>
                         <path d="M9.53823537,27.8917233 C9.18894369,26.0894873 9.44503873,25.1436051 9.49573518,23.9966255 C5.40673803,24.7246775 1.06012339,27.3363871 3.72857221,31.7774317 C6.55099224,35.5779803 15.4974435,32.9026842 15.0243452,30.7462008 C14.7089463,29.3085452 12.8802431,28.3570527 9.53823537,27.8917233 Z" id="Fill-21备份-5" fill="url(#linearGradient-47)"></path>
                         <path d="M8.57894308,23.3081338 C9.20776183,21.5834175 9.9440294,21.3729059 10.5782229,20.4158632 C6.69829375,18.9339363 0.985129138,19.1455636 1.68787599,23.9582015 C2.14973492,28.6695613 15.0243452,29.8402306 15.0243452,27.0542856 C15.0243452,25.196989 12.8758778,23.9482717 8.57894308,23.3081338 Z" id="Fill-21备份-6" fill="url(#linearGradient-48)"></path>
-                        <path d="M18.7942028,23.8573875 C18.7942028,23.8573875 11.887975,24.4489608 12.8148685,17.8211914 C12.8148685,17.8211914 14.1057331,22.2463346 18.7942028,23.8573875 Z" id="Fill-15" fill="#32B89A" transform="translate(15.761736, 20.846076) scale(-1, 1) rotate(-103.000000) translate(-15.761736, -20.846076) "></path>
+                        <path d="M18.7942028,23.8573875 C18.7942028,23.8573875 11.887975,24.4489608 12.8148685,17.8211914 C12.8148685,17.8211914 14.1057331,22.2463346 18.7942028,23.8573875 Z" id="Fill-15" fill="#1DABCF" transform="translate(15.761736, 20.846076) scale(-1, 1) rotate(-103.000000) translate(-15.761736, -20.846076) "></path>
                         <path d="M8.27015186,17.4093579 C6.15952821,14.873424 8.40782876,11.7124198 9.70397297,11.1468834 C5.03706466,9.76654654 0.312439553,10.8480156 0.877880149,17.2938655 C0.877880149,22.0421822 14.0243556,26.600882 15.0243452,23.215607 C16.0243348,19.8303321 9.62382371,17.2315803 8.27015186,17.4093579 Z" id="Fill-21备份-7" fill="url(#linearGradient-49)"></path>
                     </g>
                 </g>
-                <g id="编组-17" transform="translate(77.294111, 59.492933) rotate(2.000000) translate(-77.294111, -59.492933) translate(4.281298, 35.996986)" fill-rule="nonzero">
-                    <g id="编组" transform="translate(10.803609, 35.373768) rotate(-9.000000) translate(-10.803609, -35.373768) translate(1.494884, 25.085177)" fill="url(#linearGradient-50)">
-                        <path d="M17.3886882,0.0850624029 L5.70084641,1.93438018 C5.66296042,1.94006238 5.62754471,1.95068666 5.59321289,1.96310155 L5.17102225,1.96310155 C4.88313407,1.96310155 4.65443173,2.1811978 4.65443173,2.450028 L4.65443173,15.1050781 C4.19838821,14.8553239 3.66808512,14.7127436 3.10292087,14.7127436 C1.38932954,14.7127436 -2.27373675e-13,16.0254276 -2.27373675e-13,17.6449982 C-2.27373675e-13,19.2646882 1.38930434,20.5771812 3.10292087,20.5771812 C4.81646178,20.5771812 6.20581655,19.2646643 6.20581655,17.6449982 C6.20581655,17.5262927 6.19827967,17.4096644 6.18408818,17.2958293 C6.19827967,17.2507776 6.20581655,17.203983 6.20581655,17.1542279 L6.20581655,6.86228117 L17.0660396,5.04839361 L17.0660396,12.1718446 C16.6099709,11.9230454 16.0797182,11.779534 15.5145288,11.779534 C13.8009374,11.779534 12.4116331,13.0930775 12.4116331,14.7127436 C12.4116331,16.3314786 13.8009122,17.6449982 15.5145288,17.6449982 C17.2281453,17.6449982 18.6174497,16.3314548 18.6174497,14.7127436 C18.6174497,14.5940859 18.6098876,14.4774575 18.5957465,14.3626198 C18.6099128,14.317568 18.6174497,14.2707496 18.6174497,14.2210422 L18.6174497,0.537609148 C18.6174497,0.298359834 18.4341198,0.0984800359 18.1927383,0.0582510045 C18.108396,0.00854366917 18.0023505,-0.011606648 17.8856677,0.00660982946 L17.6109375,0.0506349606 L17.5826302,0.0506349606 C17.5139665,0.050658805 17.4482521,0.0630737166 17.3886882,0.0850624029 L17.3886882,0.0850624029 Z" id="路径"></path>
+                <g id="编组-17" transform="translate(81.466852, 44.046275) rotate(2.000000) translate(-81.466852, -44.046275) translate(12.085158, 26.233856)" fill-rule="nonzero">
+                    <g id="编组" transform="translate(10.803609, 24.006711) rotate(-9.000000) translate(-10.803609, -24.006711) translate(1.494884, 13.718121)" fill="url(#linearGradient-50)">
+                        <path d="M17.3886882,0.0850624029 L5.70084641,1.93438018 C5.66296042,1.94006238 5.62754471,1.95068666 5.59321289,1.96310155 L5.17102225,1.96310155 C4.88313407,1.96310155 4.65443173,2.1811978 4.65443173,2.450028 L4.65443173,15.1050781 C4.19838821,14.8553239 3.66808512,14.7127436 3.10292087,14.7127436 C1.38932954,14.7127436 -3.41060513e-13,16.0254276 -3.41060513e-13,17.6449982 C-3.41060513e-13,19.2646882 1.38930434,20.5771812 3.10292087,20.5771812 C4.81646178,20.5771812 6.20581655,19.2646643 6.20581655,17.6449982 C6.20581655,17.5262927 6.19827967,17.4096644 6.18408818,17.2958293 C6.19827967,17.2507776 6.20581655,17.203983 6.20581655,17.1542279 L6.20581655,6.86228117 L17.0660396,5.04839361 L17.0660396,12.1718446 C16.6099709,11.9230454 16.0797182,11.779534 15.5145288,11.779534 C13.8009374,11.779534 12.4116331,13.0930775 12.4116331,14.7127436 C12.4116331,16.3314786 13.8009122,17.6449982 15.5145288,17.6449982 C17.2281453,17.6449982 18.6174497,16.3314548 18.6174497,14.7127436 C18.6174497,14.5940859 18.6098876,14.4774575 18.5957465,14.3626198 C18.6099128,14.317568 18.6174497,14.2707496 18.6174497,14.2210422 L18.6174497,0.537609148 C18.6174497,0.298359834 18.4341198,0.0984800359 18.1927383,0.0582510045 C18.108396,0.00854366917 18.0023505,-0.011606648 17.8856677,0.00660982946 L17.6109375,0.0506349606 L17.5826302,0.0506349606 C17.5139665,0.050658805 17.4482521,0.0630737166 17.3886882,0.0850624029 L17.3886882,0.0850624029 Z" id="路径"></path>
                     </g>
-                    <g id="编组" transform="translate(139.016582, 13.108827) rotate(-9.000000) translate(-139.016582, -13.108827) translate(133.627321, 2.330304)" fill="url(#linearGradient-51)">
+                    <g id="编组" transform="translate(131.754345, 23.008174) rotate(-9.000000) translate(-131.754345, -23.008174) translate(126.365084, 12.229651)" fill="url(#linearGradient-51)">
                         <path d="M9.1963554,0.158528744 C8.91075429,0.534884597 7.36850835,1.18006604 6.05474331,1.44889164 C4.39825694,1.77148237 3.54145363,2.04030797 2.68465033,2.47042894 C1.54224594,3.11561041 0.913923523,3.92208721 1.02816396,4.67479892 C1.08528417,4.83609427 2.45616946,6.71787352 4.05553561,8.86847838 C5.71202198,11.0190832 7.08290727,12.8470973 7.14002748,12.9008625 C7.1971477,13.0083927 6.96866683,13.0083927 6.16898374,12.9546276 C3.65569407,12.7933322 1.37088528,14.02993 0.342721327,15.9654744 C0.0571202173,16.5568907 -2.27373675e-13,16.8794814 -2.27373675e-13,17.578428 C-2.27373675e-13,19.1913816 0.913923523,20.4817446 2.62753011,21.2344562 C3.31297274,21.5032819 3.54145363,21.557047 4.96945913,21.557047 C6.51170507,21.557047 6.56882529,21.557047 7.59698925,21.0731609 C10.3387598,19.8365631 11.4811642,17.4171326 10.3387598,15.2127627 C10.1102789,14.7288766 8.68227342,12.4169764 7.14002748,10.051311 L4.3411367,5.69633622 L4.79809846,5.69633622 C6.62594551,5.58880598 7.88259033,5.05115477 8.73939364,4.13714771 C9.48195649,3.33067088 9.71043738,2.52419408 9.65331716,1.23383116 C9.59619694,0.0509985062 9.48195651,-0.217827109 9.1963554,0.158528744 L9.1963554,0.158528744 Z" id="路径"></path>
                     </g>
-                    <g id="编组" transform="translate(123.828663, 8.699431) rotate(-8.000000) translate(-123.828663, -8.699431) translate(117.954232, 0.740103)" fill="#FFCF00">
+                    <g id="编组" transform="translate(116.566426, 18.598778) rotate(-8.000000) translate(-116.566426, -18.598778) translate(110.691995, 10.639450)" fill="#FFCF00">
                         <path d="M5.96876548,0.610334892 C5.10331258,4.8157963 5.08773443,6.91577113 0.975102253,8.65748254 C4.10977265,9.76166879 5.24178504,11.1102091 6.08819798,15.3083215 C6.55900436,10.4120547 8.82822186,9.71757483 10.77376,8.40026778 C6.84806562,7.15093892 6.20243776,3.64914362 5.96876548,0.610334892 Z" id="路径" transform="translate(5.874431, 7.959328) rotate(8.000000) translate(-5.874431, -7.959328) "></path>
                     </g>
-                    <g id="编组备份-2" transform="translate(8.353945, 11.367056)" fill="#FFD256">
-                        <path d="M3.99493058,0 C3.30256826,3.08400503 3.29010574,4.62398658 0,5.90124161 C2.50773632,6.71097819 3.41334623,7.69990772 4.09047658,10.7785235 C4.46712168,7.18792785 6.28249568,6.67864262 7.83892617,5.71261745 C4.6983707,4.79644295 4.18186841,2.22845973 3.99493058,0 Z" id="路径"></path>
+                    <g id="编组备份-2" transform="translate(8.353945, 0.000000)" fill="#FFD256">
+                        <path d="M3.99493058,0 C3.30256826,3.08400503 3.29010574,4.62398658 -2.27373675e-13,5.90124161 C2.50773632,6.71097819 3.41334623,7.69990772 4.09047658,10.7785235 C4.46712168,7.18792785 6.28249568,6.67864262 7.83892617,5.71261745 C4.6983707,4.79644295 4.18186841,2.22845973 3.99493058,0 Z" id="路径"></path>
                     </g>
                 </g>
             </g>

+ 13 - 13
src/page-instrument/evaluat-model/evaluat-result/img/icon_expression4.svg

@@ -110,10 +110,10 @@
             <stop stop-color="#000000" offset="0%"></stop>
             <stop stop-color="#00003D" offset="100%"></stop>
         </linearGradient>
-        <filter x="-21.9%" y="-18.4%" width="143.8%" height="136.8%" filterUnits="objectBoundingBox" id="filter-29">
+        <filter x="-21.9%" y="-17.5%" width="143.8%" height="135.0%" filterUnits="objectBoundingBox" id="filter-29">
             <feOffset dx="0" dy="-2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
             <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
-            <feColorMatrix values="0 0 0 0 0.114745713   0 0 0 0 0.507168977   0 0 0 0 0.419313022  0 0 0 0.265993772 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feColorMatrix values="0 0 0 0 0.427014016   0 0 0 0 0.633484915   0 0 0 0 0.81870126  0 0 0 0.265993772 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
             <feMerge>
                 <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
                 <feMergeNode in="SourceGraphic"></feMergeNode>
@@ -154,10 +154,10 @@
             <stop stop-color="#F4A305" offset="0%"></stop>
             <stop stop-color="#F4D877" offset="100%"></stop>
         </linearGradient>
-        <filter x="-17.8%" y="-14.9%" width="135.6%" height="129.7%" filterUnits="objectBoundingBox" id="filter-37">
-            <feOffset dx="0" dy="-1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+        <filter x="-21.9%" y="-18.3%" width="143.8%" height="136.5%" filterUnits="objectBoundingBox" id="filter-37">
+            <feOffset dx="0" dy="-2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
             <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
-            <feColorMatrix values="0 0 0 0 0.114745713   0 0 0 0 0.507168977   0 0 0 0 0.419313022  0 0 0 0.265993772 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feColorMatrix values="0 0 0 0 0.427014016   0 0 0 0 0.633484915   0 0 0 0 0.81870126  0 0 0 0.265993772 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
             <feMerge>
                 <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
                 <feMergeNode in="SourceGraphic"></feMergeNode>
@@ -187,12 +187,12 @@
             <stop stop-color="#FF5D10" offset="100%"></stop>
         </linearGradient>
     </defs>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="蓝色" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
         <g id="测评" transform="translate(-450.000000, -12.000000)">
             <g id="编组-11" transform="translate(211.000000, 9.329345)">
                 <g id="编组-2" transform="translate(239.393105, 0.000000)">
                     <g id="小酷" transform="translate(78.606895, 78.669617) rotate(7.000000) translate(-78.606895, -78.669617) translate(27.628386, 5.668579)">
-                        <g id="真棒备份" transform="translate(-0.000000, 0.000000)">
+                        <g id="真棒备份">
                             <g id="身" transform="translate(26.079506, 85.456229)">
                                 <g id="Fill-57">
                                     <use fill="url(#radialGradient-1)" fill-rule="evenodd" xlink:href="#path-2"></use>
@@ -246,7 +246,7 @@
                                         <use fill="black" fill-opacity="1" filter="url(#filter-23)" xlink:href="#path-21"></use>
                                     </g>
                                     <path d="M10.5025604,-2.19850306 L11.5081018,0.339521114 C11.5081018,0.339521114 12.9599039,4.0876373 11.2566399,6.78811471 C9.55306957,9.48859212 5.78879788,13.4930029 5.75847543,16.7857577 C5.7278467,20.0785126 7.24917603,24.4779801 10.8437645,25.415163 C10.8437645,25.415163 5.76766405,24.9093427 4.97529864,18.1139976 C4.18323952,11.3186525 10.2854027,7.8566755 10.9687298,6.1810688 C11.6523632,4.50546211 12.4009295,2.28834462 10.5025604,-2.19850306" id="Fill-116" fill="#F6FFFD" opacity="0.487753005" mask="url(#mask-22)"></path>
-                                    <path d="M14.7241804,8.70087852 C14.7082534,8.49627359 14.2616865,14.9331755 11.7972983,17.4751994 C9.54853652,19.7944656 5.88595223,24.4997636 10.8438258,25.4151015 C15.8023119,26.3301316 8.20516014,22.8484634 11.2496565,20.8962554 C15.5631015,18.1308582 15.0914189,13.3831008 14.7241804,8.70087852" id="Fill-114" fill="#4AD7BC" mask="url(#mask-22)"></path>
+                                    <path d="M14.7241804,8.70087852 C14.7082534,8.49627359 14.2616865,14.9331755 11.7972983,17.4751994 C9.54853652,19.7944656 5.88595223,24.4997636 10.8438258,25.4151015 C15.8023119,26.3301316 8.20516014,22.8484634 11.2496565,20.8962554 C15.5631015,18.1308582 15.0914189,13.3831008 14.7241804,8.70087852" id="Fill-114" fill="#73E2F0" mask="url(#mask-22)"></path>
                                 </g>
                                 <path d="M31.0853493,61.912768 C31.6190493,57.4005923 30.3079177,54.5650373 27.1519547,53.406103 C23.9959917,52.2471687 20.894627,53.484275 17.8478604,57.1174221 C22.1654287,56.5570521 25.0717899,56.4981887 26.566944,56.9408318 C28.0620981,57.383475 29.5682332,59.040787 31.0853493,61.912768 Z" id="路径-9" fill="#DDDDDD" transform="translate(24.524504, 57.449225) rotate(8.000000) translate(-24.524504, -57.449225) "></path>
                                 <path d="M17.7262171,57.6236373 C16.9028425,56.9163102 19.8855825,54.9883925 24.8289631,55.5152839 C29.7723438,56.0421754 31.9377016,61.5312857 30.7644848,62.3690624 C29.7726,63.0773526 26.542555,61.1216385 23.6327168,61.3835919 C20.7228787,61.6455454 18.0602819,63.076059 17.3766881,62.3685748 C16.6930942,61.6610906 20.2788686,59.7219963 23.6326471,59.4687903 C26.3734997,59.2618594 27.6562204,59.722265 27.9413502,59.7222754 C28.2264801,59.7222858 27.0098604,57.6239754 24.2310258,57.3089395 C21.1775174,56.9627638 18.1430516,57.9817225 17.7262171,57.6236373 Z" id="路径-8" fill="#000025" transform="translate(24.184467, 58.994173) rotate(8.000000) translate(-24.184467, -58.994173) "></path>
@@ -267,23 +267,23 @@
                                     <use fill="url(#linearGradient-30)" fill-rule="evenodd" xlink:href="#path-31"></use>
                                     <use fill="black" fill-opacity="1" filter="url(#filter-32)" xlink:href="#path-31"></use>
                                 </g>
-                                <path d="M7.54312151,18.8866801 C7.28396044,23.5981874 7.96988245,27.1425006 9.60088755,29.5196197 C9.60088755,33.6929918 21.686462,38.9767084 25.4457126,38.9767084 C26.151855,39.8264747 26.9969123,40.5630325 27.9808846,41.1863819 L27.1174768,43.4714203 C26.0029673,42.6306766 25.2593145,41.6978039 24.8865183,40.6728022 C19.3153645,39.5937339 9.23561494,36.5240147 7.7072834,29.9177148 C5.58945682,26.1402808 5.32275805,21.999317 6.9071871,17.4948233 L7.54312151,18.8866801 Z" id="路径-7" fill="#30B497" opacity="0.47312346"></path>
+                                <path d="M9.02940902,17.859246 C8.1979914,22.5040506 8.44685752,26.1055379 9.77600741,28.6637079 C9.26740129,32.8059723 20.6189686,39.5231659 24.3501984,39.9813033 C24.9475168,40.9107927 25.6965114,41.7448469 26.5971821,42.483466 L25.4617339,44.6462491 C24.4579927,43.6759476 23.8335715,42.6593999 23.5884703,41.596606 C18.1903484,39.8466281 8.55983647,35.5713776 7.84800232,28.8280633 C6.20631509,24.8206876 6.4462608,20.6780875 8.56783944,16.4002629 L9.02940902,17.859246 Z" id="路径-7" fill="#1DABCF" opacity="0.47312346" transform="translate(16.685465, 30.523256) rotate(-7.000000) translate(-16.685465, -30.523256) "></path>
                                 <path d="M7.3068637,10.4951537 C9.8968689,12.0962157 12.9362097,13.2783251 16.9835474,13.4305752 C21.030885,13.5828253 24.1566419,12.8632249 24.2151292,9.13422751 C24.2736164,5.40523008 19.8010469,4.67980391 16.4454844,4.1484295 C13.0899219,3.61705509 10.7255423,4.10600789 7.6786601,5.27053966 C9.62020558,6.7911961 9.10878462,10.0196069 7.3068637,10.4951537 Z" id="Fill-21" fill="url(#linearGradient-33)" transform="translate(15.761280, 8.691817) scale(-1, -1) rotate(87.000000) translate(-15.761280, -8.691817) "></path>
                                 <path d="M9.43694498,27.1939952 C9.09143634,25.4108073 9.34475772,24.4749223 9.3949051,23.3400653 C5.35019417,24.0604224 1.0506559,26.6445284 3.69020387,31.0386349 C6.48205544,34.7990149 15.3316114,32.1519945 14.863637,30.0183033 C14.5516541,28.5958425 12.7427568,27.6544065 9.43694498,27.1939952 Z" id="Fill-21备份-5" fill="url(#linearGradient-34)"></path>
                                 <path d="M8.48804239,22.6588503 C9.11005067,20.9523629 9.83834403,20.7440762 10.4656688,19.7971486 C6.62776159,18.3308844 0.97647388,18.540275 1.67160957,23.3020475 C2.1284663,27.9636121 14.863637,29.1219085 14.863637,26.3654086 C14.863637,24.527742 12.7384388,23.2922225 8.48804239,22.6588503 Z" id="Fill-21备份-6" fill="url(#linearGradient-35)"></path>
-                                <path d="M18.5935975,23.2018133 C18.5935975,23.2018133 11.7606017,23.7864401 12.6771397,17.2303443 C12.6771397,17.2303443 13.9546813,21.6077871 18.5935975,23.2018133 Z" id="Fill-15" fill="#32B89A" transform="translate(15.593069, 20.222775) scale(-1, 1) rotate(-109.000000) translate(-15.593069, -20.222775) "></path>
+                                <path d="M18.5935975,23.2018133 C18.5935975,23.2018133 11.7606017,23.7864401 12.6771397,17.2303443 C12.6771397,17.2303443 13.9546813,21.6077871 18.5935975,23.2018133 Z" id="Fill-15" fill="#18ADD0" transform="translate(15.593069, 20.222775) scale(-1, 1) rotate(-109.000000) translate(-15.593069, -20.222775) "></path>
                                 <path d="M8.18259556,16.8224195 C6.09483119,14.3132884 8.31878134,11.1856933 9.60088755,10.6261341 C4.98452458,9.26038626 0.311069915,10.3304251 0.87038646,16.7081479 C0.87038646,21.4062788 13.8744779,25.916797 14.863637,22.5673015 C15.8527962,19.2178061 9.52160636,16.6465209 8.18259556,16.8224195 Z" id="Fill-21备份-7" fill="url(#linearGradient-36)"></path>
                             </g>
-                            <g id="左翅膀备份" filter="url(#filter-37)" transform="translate(83.686047, 87.417840) scale(-1, 1) translate(-83.686047, -87.417840) translate(65.415075, 65.535823)">
+                            <g id="左翅膀备份" filter="url(#filter-37)" transform="translate(83.686047, 87.446443) scale(-1, 1) translate(-83.686047, -87.446443) translate(65.415075, 65.535823)">
                                 <g id="Clip-26" transform="translate(18.270972, 25.330160) scale(-1, 1) rotate(-17.000000) translate(-18.270972, -25.330160) ">
                                     <use fill="url(#linearGradient-30)" fill-rule="evenodd" xlink:href="#path-38"></use>
                                     <use fill="black" fill-opacity="1" filter="url(#filter-39)" xlink:href="#path-38"></use>
                                 </g>
-                                <path d="M7.54312151,19.1659986 C7.28396044,23.8775058 7.96988245,27.4218191 9.60088755,29.7989382 C9.60088755,33.9723103 21.686462,39.2560269 25.4457126,39.2560269 C26.151855,40.1057932 26.9969123,40.842351 27.9808846,41.4657004 L27.1174768,43.7507388 C26.0029673,42.9099951 25.2593145,41.9771224 24.8865183,40.9521207 C19.3153645,39.8730524 9.23561494,36.8033332 7.7072834,30.1970333 C5.58945682,26.4195993 5.32275805,22.2786355 6.9071871,17.7741418 L7.54312151,19.1659986 Z" id="路径-7" fill="#30B497" opacity="0.565788632"></path>
+                                <path d="M6.19993039,20.4149851 C6.51688935,25.1229573 7.62964173,28.5572589 9.53818752,30.7178898 C10.0467936,34.8601542 22.6862071,38.6316258 26.4174368,38.1734884 C27.2218762,38.9308635 28.1503984,39.5589446 29.2030035,40.0577315 L28.6245076,42.4309606 C27.4158446,41.7323081 26.5640462,40.8970174 26.0691125,39.9250884 C20.4079799,39.5330162 10.0292586,37.7145906 7.7072136,31.3437899 C5.14481957,27.8526104 4.37545219,23.7750151 5.39911146,19.1110039 L6.19993039,20.4149851 Z" id="路径-7" fill="#1DABCF" opacity="0.565788632" transform="translate(17.081900, 30.770982) rotate(7.000000) translate(-17.081900, -30.770982) "></path>
                                 <path d="M8.49620629,10.7749207 C11.0861299,12.3758693 14.1254069,13.5578433 18.1727246,13.7099086 C22.2200423,13.8619739 25.3458221,13.1422282 25.4044799,9.41321621 C25.4631378,5.68420417 20.9906158,4.95898038 17.6350883,4.42775785 C14.2795609,3.89653532 11.9151665,4.38559791 8.8682407,5.55027286 C10.8097103,7.0708453 10.2981432,10.2992899 8.49620629,10.7749207 Z" id="Fill-21" fill="url(#linearGradient-40)" transform="translate(16.950629, 8.971184) scale(-1, -1) rotate(97.000000) translate(-16.950629, -8.971184) "></path>
                                 <path d="M9.43694498,27.4733137 C9.09143634,25.6901258 9.34475772,24.7542408 9.3949051,23.6193838 C5.35019417,24.3397409 1.0506559,26.9238469 3.69020387,31.3179534 C6.48205544,35.0783334 15.3316114,32.4313129 14.863637,30.2976218 C14.5516541,28.875161 12.7427568,27.933725 9.43694498,27.4733137 Z" id="Fill-21备份-5" fill="url(#linearGradient-34)"></path>
                                 <path d="M8.48804239,22.9381688 C9.11005067,21.2316814 9.83834403,21.0233947 10.4656688,20.0764671 C6.62776159,18.6102029 0.97647388,18.8195935 1.67160957,23.5813659 C2.1284663,28.2429306 14.863637,29.4012269 14.863637,26.644727 C14.863637,24.8070604 12.7384388,23.571541 8.48804239,22.9381688 Z" id="Fill-21备份-6" fill="url(#linearGradient-35)"></path>
-                                <path d="M18.5935739,23.4810234 C18.5935739,23.4810234 11.7604644,24.0658017 12.6771694,17.5097804 C12.6771694,17.5097804 13.9546271,21.8871292 18.5935739,23.4810234 Z" id="Fill-15" fill="#32B89A" transform="translate(15.593058, 20.502103) scale(-1, 1) rotate(-103.000000) translate(-15.593058, -20.502103) "></path>
+                                <path d="M18.5935739,23.4810234 C18.5935739,23.4810234 11.7604644,24.0658017 12.6771694,17.5097804 C12.6771694,17.5097804 13.9546271,21.8871292 18.5935739,23.4810234 Z" id="Fill-15" fill="#18ADD0" transform="translate(15.593058, 20.502103) scale(-1, 1) rotate(-103.000000) translate(-15.593058, -20.502103) "></path>
                                 <path d="M8.18259556,17.101738 C6.09483119,14.5926069 8.31878134,11.4650117 9.60088755,10.9054526 C4.98452458,9.53970475 0.311069915,10.6097436 0.87038646,16.9874664 C0.87038646,21.6855973 13.8744779,26.1961155 14.863637,22.84662 C15.8527962,19.4971246 9.52160636,16.9258394 8.18259556,17.101738 Z" id="Fill-21备份-7" fill="url(#linearGradient-36)"></path>
                             </g>
                         </g>

+ 1 - 1
src/page-instrument/evaluat-model/evaluat-result/index.module.less

@@ -123,7 +123,7 @@
 
         .rightBadge {
             position: relative;
-            top: -8px;
+            top: -5px;
             right: -8px;
             margin-left: auto;
             max-width: 146px;

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

@@ -65,6 +65,7 @@ export default defineComponent({
 			if (!evaluatingData.isErrorState) {
 				handleAddRecord();
 			}
+			// console.log('评测等级',evaluatingData.resultData.leve)
 		});
 
 		watch(() => evaluatingData.resulstMode, (val) => {

+ 1 - 1
src/page-instrument/view-detail/index.tsx

@@ -146,7 +146,7 @@ export default defineComponent({
       // 如果后台设置了不显示指法,关闭指法开关
       if (!state.isShowFingering) {
         state.setting.displayFingering = false
-      }
+      }      
       // api_setEventTracking();
     });
 

+ 13 - 0
src/page-instrument/view-evaluat-report/index.module.less

@@ -1,3 +1,16 @@
+/*隐藏滚动条*/
+::-webkit-scrollbar {
+  display: none;
+}
+
+
+.detail {
+  overflow: auto;
+  margin-right: -17px;
+  /*和滚动条宽度相等*/
+  height: 100vh;
+}
+
 .skeleton {
   position: fixed;
   left: 0;

+ 1 - 1
src/page-instrument/view-evaluat-report/index.tsx

@@ -450,4 +450,4 @@ export default defineComponent({
 			</div>
 		);
 	},
-});
+});

+ 103 - 0
src/page-instrument/view-figner/change-subject/index.module.less

@@ -0,0 +1,103 @@
+.changeSubject {
+  padding: 18px 0;
+}
+
+.changeSubjectContainer {
+  height: 217px;
+  overflow-x: hidden;
+  overflow-y: auto;
+  padding: 0 15px;
+
+  &::-webkit-scrollbar {
+    display: none;
+  }
+}
+
+.title {
+  display: flex;
+  align-items: center;
+
+  font-size: 16px;
+  font-weight: 500;
+  color: #333333;
+  line-height: 22px;
+
+  &::before {
+    content: '';
+    display: inline-block;
+    width: 4px;
+    height: 11px;
+    background: #1CACF1;
+    border-radius: 3px;
+    margin-right: 6px;
+  }
+}
+
+.subjectContainer {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding-top: 18px;
+
+  .subjectItem {
+    width: 31%;
+    height: 34px;
+    line-height: 34px;
+    text-align: center;
+    background: #F6F6F6;
+    border-radius: 50px;
+    font-size: 13px;
+    color: #333333;
+    border: 1px solid #F6F6F6;
+    margin-bottom: 12px;
+
+    &:nth-child(3n + 2) {
+      margin-left: 2.333%;
+      margin-right: 2.333%;
+    }
+
+    // &:nth-child(3n + 3) {
+    //   margin-left: 2.333%;
+    // }
+
+    &.arrow::after {
+      content: '';
+      display: inline-block;
+      margin-left: 3px;
+      width: 0;
+      height: 0;
+      border-left: 4px solid transparent;
+      border-right: 4px solid transparent;
+      border-top: 4px solid transparent;
+      border-bottom: 4px solid #777777;
+      transform: translateY(3px) rotate(180deg);
+    }
+
+
+    &.active {
+      border: 1px solid #1CACF1;
+      background: #EBF8FF;
+      color: #1CACF1;
+
+      &::after {
+        border-bottom: 4px solid #1CACF1;
+        transform: translateY(-2px) rotate(0deg);
+      }
+    }
+  }
+
+
+}
+
+.btnGroups {
+  border-top: 1px solid #F2F2F2;
+  display: flex;
+  align-items: center;
+  padding: 18px 15px 0;
+
+  :global {
+    .van-button+.van-button {
+      margin-left: 15px;
+    }
+  }
+}

+ 92 - 0
src/page-instrument/view-figner/change-subject/index.tsx

@@ -0,0 +1,92 @@
+import { defineComponent, onMounted, reactive } from "vue";
+import styles from "./index.module.less";
+import { Button, showToast } from "vant";
+
+export default defineComponent({
+  name: "change-subject",
+  props: {
+    subjectList: {
+      type: Array,
+      default: () => [],
+    },
+    subject: {
+      type: String,
+      default: "",
+    },
+  },
+  emits: ["close", "confirm"],
+  setup(props, { emit }) {
+    const state = reactive({
+      subjectValue: null as any,
+      instrumentCode: null as any,
+      selectList: [] as any,
+    });
+
+    //
+    const selectItem = () => {
+      const i: any = props.subjectList.find((item: any) => item.value === props.subject);
+      if (i) {
+        state.subjectValue = i.id;
+        state.instrumentCode = i.value;
+        state.selectList = [];
+      }
+    };
+
+    onMounted(() => {
+      selectItem();
+    });
+    return () => (
+      <div class={styles.changeSubject}>
+        <div class={styles.changeSubjectContainer}>
+          <div class={styles.title}>乐器</div>
+
+          <div class={styles.subjectContainer}>
+            {props.subjectList.map((item: any) => (
+              <div
+                class={[styles.subjectItem, item.id === state.subjectValue && styles.active]}
+                onClick={() => {
+                  // if (item.children.length <= 0) {
+                  //   state.instrumentCode = "";
+                  // }
+                  state.subjectValue = item.id;
+                  state.instrumentCode = item.value;
+                  // state.selectList = item.children;
+                }}
+              >
+                {item.text}
+              </div>
+            ))}
+          </div>
+        </div>
+
+        <div class={styles.btnGroups}>
+          <Button
+            round
+            block
+            onClick={() => {
+              emit("close");
+              selectItem();
+            }}
+          >
+            重置
+          </Button>
+          <Button
+            type="primary"
+            block
+            round
+            color="linear-gradient(90deg, #44C9FF 0%, #259CFE 100%)"
+            onClick={() => {
+              if (state.selectList.length > 0 && !state.instrumentCode) {
+                showToast("请选择乐器");
+                return;
+              }
+              emit("confirm", state.instrumentCode || state.subjectValue);
+            }}
+          >
+            确认
+          </Button>
+        </div>
+      </div>
+    );
+  },
+});

BIN
src/page-instrument/view-figner/image/icon_action_cancel.png


BIN
src/page-instrument/view-figner/image/icon_action_confirm.png


BIN
src/page-instrument/view-figner/image/icon_bg_t.png


BIN
src/page-instrument/view-figner/image/icon_bg_v.png


BIN
src/page-instrument/view-figner/image/icon_shuo_h.png


BIN
src/page-instrument/view-figner/image/icon_shuo_v.png


+ 56 - 4
src/page-instrument/view-figner/index.module.less

@@ -19,7 +19,7 @@
     }
 
     &.fingerRight {
-        background: url('./image/icon_bg_t.png') no-repeat;
+        background: url('./image/icon_bg_t.png') no-repeat rgba(215, 205, 199, 1);
         background-size: cover;
 
         .fingerContent {
@@ -436,14 +436,15 @@
     .noteContent {
         display: flex;
         position: relative;
-        max-width: calc(100% - 92px);
+        // max-width: calc(100% - 92px);
+        max-width: 73%;
         border-radius: 25px;
         background: rgba(255, 255, 255, 0.5);
         border: 1px solid rgba(255, 255, 255, 0.6);
         overflow: hidden;
 
         &.noteContentOther {
-            max-width: calc(100% - 92px - 52px - 5Px);
+            // max-width: calc(100% - 92px - 52px - 5Px);
         }
 
         &.noteContentWrap {
@@ -806,11 +807,18 @@
 }
 
 .fixedRightBtns {
+    // position: fixed;
+    // right: 12px;
+    // top: 50%;
+    // transform: translateY(-50%);
+
     position: fixed;
-    right: 12px;
+    left: 12px;
     top: 50%;
+    right: auto;
     transform: translateY(-50%);
 
+
     .baseBtn {
         // width: 60px;
         // height: 45px;
@@ -1249,4 +1257,48 @@
             }
         }
     }
+}
+
+.changeSubjectPopup {
+    width: 375px;
+    // height: 310px;
+    background: #FFFFFF;
+    border-radius: 12px;
+}
+
+.linkSourceClass {
+
+    // .head {
+    //     display: none;
+    //     opacity: 0;
+    // }
+    .backBtn {
+        display: none;
+        opacity: 0;
+    }
+
+
+    .changeInstrumentBtn {
+        margin: 26px 5px 26px 18px !important;
+    }
+
+    .noteContentOther {
+        max-width: 75% !important
+    }
+
+    .fingerContent,
+    .fixedRightBtns {
+        padding-left: 0 !important;
+        padding-top: 0 !important;
+    }
+
+    // .left {
+    //     // padding: 26px 5px 26px 18px;
+    //     padding-top: 26px;
+    //     padding-left: 18px;
+    // }
+
+    // .backBtn {
+    //     display: none;
+    // }
 }

+ 244 - 131
src/page-instrument/view-figner/index.tsx

@@ -15,7 +15,8 @@ import { usePageVisibility } from "@vant/use";
 import { watch } from "vue";
 import icon_loading_img from "./image/icon_loading_img.png";
 import state, { IPlatform } from "/src/state";
-import { getSubjectList } from "../api";
+import { api_musicalInstrumentList, api_subjectList, getSubjectList } from "../api";
+import ChangeSubject from "./change-subject";
 
 export default defineComponent({
   name: "viewFigner",
@@ -40,6 +41,7 @@ export default defineComponent({
     const code = mappingVoicePart(query.code, "INSTRUMENT");
     const subject = props.isComponent ? props.subject || "pan-flute" : code || "pan-flute";
     const data = reactive({
+      linkSource: query.linkSource, // 来源,目前只有课件里使用
       loading: true,
       subject: subject as any,
       realKey: 0,
@@ -68,6 +70,8 @@ export default defineComponent({
       loadingSoundFonts: true,
       loadingSoundProgress: 0,
 
+      changeSubjectShow: false,
+
       huaweiPad: navigator?.userAgent?.includes("UAWEIVRD-W09") ? true : false,
       paddingTop: "",
       paddingLeft: "",
@@ -106,7 +110,7 @@ export default defineComponent({
     const getAPPData = async (type: "top" | "left") => {
       const screenData = await isSpecialShapedScreen();
       if (screenData?.content) {
-        // console.log("🚀 ~ screenData:", screenData.content);
+        console.log("🚀 ~ screenData:", screenData.content);
         const { isSpecialShapedScreen, notchHeight } = screenData.content;
         if (isSpecialShapedScreen) {
           if (type === "top") {
@@ -120,10 +124,10 @@ export default defineComponent({
     };
 
     const getHeadTop = () => {
-      if (!browsInfo.ios && fingerData.fingeringInfo.orientation === 1) {
+      if (fingerData.fingeringInfo.orientation === 1) {
         getAPPData("top");
       }
-      if (!browsInfo.ios && fingerData.fingeringInfo.orientation === 0) {
+      if (fingerData.fingeringInfo.orientation === 0) {
         getAPPData("left");
       }
     };
@@ -161,7 +165,7 @@ export default defineComponent({
     };
     const getFingeringData = async () => {
       const subject: any = data.subject + (data.viewIndex === 0 ? "" : data.viewIndex);
-      console.log("🚀 ~ subject:", subject);
+      console.log("🚀 ~ subject:模式", subject, data.viewIndex, data.fingeringMode);
       fingerData.subject = await getFingeringConfig(subject);
     };
     const createAudio = (url: string) => {
@@ -201,24 +205,25 @@ export default defineComponent({
       data.loadingSoundFonts = false;
     };
 
-    const selectSubjectType = (subject: string) => {
-      data.subjects.forEach((item: any) => {
-        if (item.value === subject) {
-          item.className = styles.selected;
-        } else {
-          item.className = "";
-        }
-      });
-    };
+    // const selectSubjectType = (subject: string) => {
+    //   data.subjects.forEach((item: any) => {
+    //     if (item.value === subject) {
+    //       item.className = styles.selected;
+    //     } else {
+    //       item.className = "";
+    //     }
+    //   });
+    // };
 
     // 切换当前模式
-    const onChangeFingeringModel = () => {
+    const onChangeFingeringModel = (e: any) => {
+      e.stopPropagation();
       //
       if (playAction.listenLock) return;
       if (playAction.showAnswerLoading) return;
-      data.loadingImg = true
+      data.loadingImg = true;
       if (data.fingeringMode === "scaleMode") {
-        if (["pan-flute", "ocarina"].includes(data.subject)) {
+        if (["pan-flute", "ocarina", "whistling"].includes(data.subject)) {
           data.viewIndex = 1;
         } else {
           data.viewIndex = 0;
@@ -226,6 +231,7 @@ export default defineComponent({
         const o: any = {
           "pan-flute": 2,
           ocarina: 2,
+          whistling: 2,
           piccolo: 2,
           "hulusi-flute": 2,
           "baroque-recorder": 2,
@@ -249,17 +255,16 @@ export default defineComponent({
     const __init = async (loadSong = true) => {
       data.loadingDom = true;
       getNotes();
-
-      selectSubjectType(data.subject);
+      // selectSubjectType(data.subject);
 
       if (data.fingeringMode === "fingeringMode") {
         if (data.subject === "pan-flute") {
           data.viewIndex = 3;
-        } else if (["pan-flute", "ocarina", "melodica"].includes(data.subject)) {
+        } else if (["pan-flute", "ocarina", "melodica", "whistling"].includes(data.subject)) {
           data.viewIndex = 1;
         }
       } else {
-        if (["pan-flute", "ocarina"].includes(data.subject)) {
+        if (["pan-flute", "ocarina", "whistling"].includes(data.subject)) {
           data.viewIndex = 1;
         }
       }
@@ -267,6 +272,7 @@ export default defineComponent({
       const o: any = {
         "pan-flute": 2,
         ocarina: 2,
+        whistling: 2,
         piccolo: 2,
         "hulusi-flute": 2,
         "baroque-recorder": 2,
@@ -285,23 +291,29 @@ export default defineComponent({
     // 获取声部
     const getSubjects = async () => {
       try {
-        const subjects = await getSubjectList({
+        // api_subjectList
+        const subjects = await api_musicalInstrumentList({
           enableFlag: true,
-          delFlag: 0,
-          page: 1,
-          rows: 999,
         });
-        const rows = subjects.data.rows || [];
+
+        const rows = subjects.data || [];
         rows.forEach((row: any) => {
-          data.subjects.push({
+          const tempList: any = {
             text: row.name,
-            value: mappingVoicePart(row.code, "INSTRUMENT"),
-            className: "",
-          });
+            value: mappingVoicePart(row.code, "INSTRUMENT"), // mappingVoicePart(row.code, "INSTRUMENT"),
+            id: row.id,
+          };
+          data.subjects.push(tempList);
         });
-        // console.log(data.subjects, "subjects");
-      } catch {
+
+        // data.subjects.forEach((item: any) => {
+        //   if (item.value === data.subject && item.children?.length > 1) {
+        //     data.subject = item.children[0].value;
+        //   }
+        // });
+      } catch (e) {
         //
+        console.log(e, "e");
       }
     };
 
@@ -338,6 +350,7 @@ export default defineComponent({
       if (showNote) {
         data.realKey = item.realKey;
       }
+      console.log('key:', item.realKey, data.soundFonts)
       data.noteAudio = data.soundFonts[item.realKey];
       if (data.noteAudio) {
         data.noteAudio.play();
@@ -357,7 +370,7 @@ export default defineComponent({
       handleStop();
       if (props.isComponent) {
         // 返回的时候默认横屏
-        api_setRequestedOrientation(0);
+        // api_setRequestedOrientation(0);
         emit("close");
         return;
       } else if (state.platform === IPlatform.PC) {
@@ -391,10 +404,10 @@ export default defineComponent({
     // 排箫,默认0.9显示
     const setDefaultScale = () => {
       if (data.subject === "pan-flute") {
-        data.transform.scale = 0.9
-        data.transform.startScale = 0.9
+        data.transform.scale = 0.9;
+        data.transform.startScale = 0.9;
       }
-    }
+    };
 
     onMounted(() => {
       loadElement();
@@ -402,7 +415,7 @@ export default defineComponent({
     });
     const loadElement = () => {
       const fingeringContainer = document.getElementById("fingeringContainer");
-      setDefaultScale()
+      setDefaultScale();
       // console.log("🚀 ~ fingeringContainer:", fingeringContainer);
       const mc = new Hammer.Manager(fingeringContainer as HTMLElement);
       mc.add(new Hammer.Pan({ threshold: 0, pointers: 0 }));
@@ -449,7 +462,12 @@ export default defineComponent({
     // 判断乐器是否移动
     const instrumentTranstion = computed(() => {
       const transform = data.transform;
-      if (transform.scale !== 1 || transform.x !== 0 || transform.y !== 0 || transform.startScale !== 1 || transform.startX !== 0 || transform.startY !== 0) {
+
+      let scale = 1;
+      if (data.subject === "pan-flute") {
+        scale = 0.9;
+      }
+      if (transform.scale !== scale || transform.x !== 0 || transform.y !== 0 || transform.startScale !== scale || transform.startX !== 0 || transform.startY !== 0) {
         return true;
       } else {
         return false;
@@ -461,7 +479,11 @@ export default defineComponent({
       () => pageVisible.value,
       (val) => {
         if (val === "hidden") {
-          console.log("页面隐藏停止播放");
+          clearTimeout(playAction.timer);
+          playAction.listenLock = false;
+          playAction.listenTipsStatus = false;
+          playAction.exampleAnser = {};
+          resetMode(true, 0);
           handleStop();
           gaumntPause();
         }
@@ -470,8 +492,28 @@ export default defineComponent({
     /** 课件播放 */
     const changePlay = (res: any) => {
       if (res?.data?.api === "setPlayState") {
+        clearTimeout(playAction.timer);
+        playAction.listenLock = false;
+        playAction.listenTipsStatus = false;
+        playAction.exampleAnser = {};
+        resetMode(true, 0);
         handleStop();
         gaumntPause();
+
+        // 重置乐器
+        if (res?.data?.data.code) {
+          data.subject = code;
+          data.viewIndex = 0;
+          data.tipShow = false;
+          data.loadingDom = true;
+          fingerData.fingeringInfo = subjectFingering(data.subject);
+          data.activeTone = {} as any;
+          resetElement();
+          // 设置屏幕方向
+          setTimeout(() => {
+            __init();
+          }, 100);
+        }
       }
     };
 
@@ -580,6 +622,7 @@ export default defineComponent({
       /** 0: 未答,1: 答对,2: 答错 */
       userAnswerStatus: 0 as 0 | 1 | 2, // 用户回答状态
       userAnswer: {} as any, // 用户答的数据
+      timer: null as any,
     });
     const onActionPlay = async () => {
       playAction.resetAction = false;
@@ -607,7 +650,7 @@ export default defineComponent({
     const fingeringPlay = (note: any, timer = 1500, showNote = true) => {
       return new Promise((resolve) => {
         noteClick(note, showNote);
-        setTimeout(() => {
+        playAction.timer = setTimeout(() => {
           resolve(note);
         }, timer);
       });
@@ -622,7 +665,7 @@ export default defineComponent({
       playAction.listenModeStatus = true; // 是否开始听音
       playAction.listenLock = true; // 锁
       playAction.listenTipsStatus = true;
-      setTimeout(() => {
+      playAction.timer = setTimeout(() => {
         playAction.listenTipsStatus = false;
         playAction.listenLock = false; // 锁
       }, 2000);
@@ -642,7 +685,7 @@ export default defineComponent({
       data.realKey = 0;
       playAction.exampleAnser = {};
       gaumntPause();
-      setTimeout(async () => {
+      playAction.timer = setTimeout(async () => {
         // 设置答题数据
         randomIndex = Math.floor(Math.random() * data.notes.length);
         playAction.standardAnswer = data.notes[randomIndex];
@@ -737,35 +780,35 @@ export default defineComponent({
     const containerBox = computed(() => {
       if (state.platform === IPlatform.PC || query.modelType) {
         return {
-          paddingTop: "1rem",
+          paddingTop: "1.3rem",
           paddingBottom: "",
         };
       }
       if (data.fingeringMode === "scaleMode") {
         if (data.subject === "hulusi-flute") {
           return {
-            paddingTop: "3.1rem",
-            paddingBottom: ".8rem",
+            paddingTop: "1.3rem",
+            paddingBottom: ".5rem",
           };
         } else if (data.subject === "piccolo" || data.subject === "baroque-recorder") {
           return {
-            paddingTop: "4rem",
-            paddingBottom: ".8rem",
+            paddingTop: "1.3rem",
+            paddingBottom: ".5rem",
           };
         } else if (data.subject === "pan-flute") {
           return {
-            paddingTop: "0",
+            paddingTop: "1.3rem",
             paddingBottom: "0",
           };
-        } else if (data.subject === "ocarina") {
+        } else if (data.subject === "ocarina" || data.subject === "whistling") {
           return {
-            paddingTop: "1.2rem",
+            paddingTop: "1.3rem",
             paddingBottom: "0",
           };
         } else if (data.subject === "melodica") {
           return {
-            paddingTop: "2.8rem",
-            paddingBottom: "1.8rem",
+            paddingTop: "1.8rem",
+            paddingBottom: "0.2rem",
           };
         } else {
           return {
@@ -776,28 +819,28 @@ export default defineComponent({
       } else {
         if (data.subject === "hulusi-flute") {
           return {
-            paddingTop: "3.1rem",
+            paddingTop: "1.3rem",
             paddingBottom: "0rem",
           };
         } else if (data.subject === "piccolo" || data.subject === "baroque-recorder") {
           return {
-            paddingTop: "3rem",
+            paddingTop: "1.3rem",
             paddingBottom: ".5rem",
           };
         } else if (data.subject === "pan-flute") {
           return {
-            paddingTop: "0",
+            paddingTop: "1.3rem",
             paddingBottom: "0",
           };
-        } else if (data.subject === "ocarina") {
+        } else if (data.subject === "ocarina" || data.subject === "whistling") {
           return {
-            paddingTop: "1rem",
+            paddingTop: "1.3rem",
             paddingBottom: "0",
           };
         } else if (data.subject === "melodica") {
           return {
-            paddingTop: "2.8rem",
-            paddingBottom: "0.8rem",
+            paddingTop: "1.8rem",
+            paddingBottom: "0.2rem",
           };
         } else {
           return {
@@ -897,12 +940,24 @@ export default defineComponent({
       const rs: number[] = Array.isArray(relationship[1]) ? relationship[fingerData.relationshipIndex] : relationship;
       const canTizhi = Array.isArray(relationship[1]);
       return (
-        <div class={[styles.fingerBox, state.platform !== IPlatform.PC && !query.modelType && fingerData.fingeringInfo.orientation === 1 ? styles.fingerBottom : styles.fingerRight]}>
+        <div
+          class={[styles.fingerBox, state.platform !== IPlatform.PC && !query.modelType && fingerData.fingeringInfo.orientation === 1 ? styles.fingerBottom : styles.fingerRight, data.linkSource === "class" ? styles.linkSourceClass : ""]}
+          onClick={() => {
+            if (data.linkSource === "class") {
+              window.parent.postMessage(
+                {
+                  api: "clickViewFigner",
+                },
+                "*"
+              );
+            }
+          }}
+        >
           <div
             class={styles.head}
             style={{
-              paddingTop: data.paddingTop ? data.paddingTop : "",
-              paddingLeft: data.paddingLeft ? data.paddingLeft : "",
+              paddingTop: data.paddingTop && !browser().ios ? data.paddingTop : "",
+              paddingLeft: data.paddingLeft && !browser().ios ? data.paddingLeft : "",
             }}
           >
             <div class={styles.left}>
@@ -910,65 +965,26 @@ export default defineComponent({
                 <img src={icons.icon_back} />
               </button>
 
-              <Popover
-                placement="bottom"
-                class={styles.popoverContainer}
-                actions={data.subjects}
-                onUpdate:show={() => {
+              <div
+                class={[styles.baseBtn, styles.changeInstrumentBtn]}
+                onClick={(e) => {
+                  e.stopPropagation();
+                  //
                   // 播放音阶时不能切换
-                  if (playStatus.gamut) return;
+                  if (playStatus.gamut) {
+                    return;
+                  }
                   // 开始答题不能切换
-                  if (playStatus.action) return;
-                }}
-                onSelect={(val: any) => {
-                  if (data.subject === val.value) return;
-                  const originalSubject = JSON.parse(JSON.stringify(data.subject));
-                  data.subject = val.value;
-                  data.viewIndex = 0;
-                  data.tipShow = false;
-                  data.loadingDom = true;
-                  fingerData.fingeringInfo = subjectFingering(data.subject);
-                  data.activeTone = {} as any;
-                  resetElement();
-                  resetMode(true, 0);
-                  api_setRequestedOrientation(orientationDirection.value);
-                  // 设置屏幕方向
-                  setTimeout(() => {
-                    const before = ["hulusi-flute", "piccolo", "baroque-recorder"].includes(originalSubject) ? 1 : 0;
-                    if (orientationDirection.value !== before) {
-                      data.paddingTop = "";
-                      data.paddingLeft = "";
-                    }
+                  if (playAction.listenLock) {
+                    return;
+                  }
 
-                    __init();
-                  }, 100);
+                  data.changeSubjectShow = true;
                 }}
               >
-                {{
-                  reference: () => (
-                    <div
-                      class={styles.baseBtn}
-                      onClick={(e) => {
-                        //
-                        // 播放音阶时不能切换
-                        if (playStatus.gamut) {
-                          e.stopPropagation();
-                          e.preventDefault();
-                        }
-                        // 开始答题不能切换
-                        // if (playStatus.action) return;
-                        if (playAction.listenLock) {
-                          e.stopPropagation();
-                          e.preventDefault();
-                        }
-                      }}
-                    >
-                      <img src={icons.icon_change_instrument} />
-                      <span>切换乐器</span>
-                    </div>
-                  ),
-                }}
-              </Popover>
+                <img src={icons.icon_change_instrument} />
+                <span>切换乐器</span>
+              </div>
               <div class={styles.baseBtn} onClick={onChangeFingeringModel}>
                 <img src={modeText.value.icon} />
                 <span>{modeText.value.text}</span>
@@ -977,7 +993,13 @@ export default defineComponent({
             </div>
             {/*  */}
           </div>
-          <div class={styles.fingerContent}>
+          <div
+            class={styles.fingerContent}
+            style={{
+              paddingTop: data.paddingTop ? data.paddingTop : "",
+              paddingLeft: data.paddingLeft ? data.paddingLeft : "",
+            }}
+          >
             <div class={styles.wrapFinger}>
               <div
                 id="fingeringContainer"
@@ -995,9 +1017,7 @@ export default defineComponent({
                   class={[styles.fingeringContainer]}
                 >
                   <div class={styles.imgs}>
-                    {
-                      !data.loadingImg && <img src={data.fingeringMode === "scaleMode" ? fingerData.subject?.json?.full : fingerData.subject?.json?.full1} />
-                    }
+                    {!data.loadingImg && <img src={data.fingeringMode === "scaleMode" ? fingerData.subject?.json?.full : fingerData.subject?.json?.full1} />}
                     {rs.map((key: number | string, index: number) => {
                       const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
                       return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
@@ -1020,11 +1040,22 @@ export default defineComponent({
                 {playAction.userAnswerStatus === 2 && <div class={[styles.tipsT, styles.playError]}></div>}
                 {playAction.resetAction && <div class={[styles.tipsT, styles.playTips5]}></div>}
                 {((data.noteType !== "#c" && (orientationDirection.value === 0 || (orientationDirection.value === 1 && state.platform === IPlatform.PC))) || (orientationDirection.value === 1 && state.platform === IPlatform.APP)) && (
-                  <Button class={styles.noteBtn} onClick={() => scrollNoteBox("left")}>
+                  <Button
+                    class={styles.noteBtn}
+                    onClick={(e: any) => {
+                      e.stopPropagation();
+                      scrollNoteBox("left");
+                    }}
+                  >
                     <Icon name="arrow-left" />
                   </Button>
                 )}
-                <div class={[styles.noteContent, data.fingeringMode !== "scaleMode" && orientationDirection.value === 0 && styles.noteContentOther, browsInfo.ios ? "" : styles.noteContentWrap, data.huaweiPad && styles.huaweiPad]}>
+                <div
+                  class={[styles.noteContent, data.fingeringMode !== "scaleMode" && orientationDirection.value === 0 && styles.noteContentOther, browsInfo.ios ? "" : styles.noteContentWrap, data.huaweiPad && styles.huaweiPad]}
+                  onClick={(e: any) => {
+                    e.stopPropagation();
+                  }}
+                >
                   {/* 判断是否为音阶模式 */}
                   {data.fingeringMode !== "scaleMode" && (
                     <div draggable={false} class={styles.note} onClick={noteChangeShow}>
@@ -1103,13 +1134,24 @@ export default defineComponent({
                   </div>
                 </div>
                 {((data.noteType !== "#c" && (orientationDirection.value === 0 || (orientationDirection.value === 1 && state.platform === IPlatform.PC))) || (orientationDirection.value === 1 && state.platform === IPlatform.APP)) && (
-                  <Button class={styles.noteBtn} onClick={() => scrollNoteBox("right")}>
+                  <Button
+                    class={styles.noteBtn}
+                    onClick={(e: any) => {
+                      e.stopPropagation();
+                      scrollNoteBox("right");
+                    }}
+                  >
                     <Icon name="arrow" />
                   </Button>
                 )}
               </div>
               {data.fingeringMode !== "scaleMode" && (
-                <div class={styles.optionBtns}>
+                <div
+                  class={styles.optionBtns}
+                  onClick={(e: any) => {
+                    e.stopPropagation();
+                  }}
+                >
                   <Button class={[styles.oBtn, styles.gamut, playStatus.action && styles.disabled]} round onClick={onGamutPlayOrPause}>
                     {playStatus.gamut ? "暂停" : "播放音阶"}
                   </Button>
@@ -1125,7 +1167,13 @@ export default defineComponent({
             <div class={[styles.tips, data.loadingDom ? styles.hiddens : "", data.tipShow ? "" : styles.tipHidden]}>
               <div class={styles.tipTitle}>
                 <div class={styles.tipTitleName}>{fingerData.fingeringInfo.code}使用说明</div>
-                <Button class={styles.tipClose} onClick={() => (data.tipShow = false)}>
+                <Button
+                  class={styles.tipClose}
+                  onClick={(e: any) => {
+                    e.stopPropagation();
+                    data.tipShow = false;
+                  }}
+                >
                   <Icon name="cross" size={19} color="#fff" />
                 </Button>
               </div>
@@ -1155,7 +1203,16 @@ export default defineComponent({
               </div>
             )}
           </div>
-          <div class={styles.fixedRightBtns}>
+          <div
+            class={styles.fixedRightBtns}
+            style={{
+              paddingTop: data.paddingTop ? data.paddingTop : "",
+              paddingLeft: data.paddingLeft ? data.paddingLeft : "",
+            }}
+            onClick={(e: any) => {
+              e.stopPropagation();
+            }}
+          >
             <div class={styles.rightBtn}>
               {data.subject !== "melodica" && data.fingeringMode === "scaleMode" && (
                 <div
@@ -1163,7 +1220,7 @@ export default defineComponent({
                   onClick={() => {
                     data.viewIndex++;
                     if (data.viewIndex > data.viewTotal) {
-                      if (["pan-flute", "ocarina"].includes(data.subject)) {
+                      if (["pan-flute", "ocarina", "whistling"].includes(data.subject)) {
                         data.viewIndex = 1;
                       } else {
                         data.viewIndex = 0;
@@ -1234,7 +1291,13 @@ export default defineComponent({
             <div class={styles.tones}>
               <div class={styles.toneTitle}>
                 <div class={styles.tipTitleName}>移调</div>
-                <Button class={styles.tipClose} onClick={() => (data.tnoteShow = false)}>
+                <Button
+                  class={styles.tipClose}
+                  onClick={(e: any) => {
+                    e.stopPropagation();
+                    data.tnoteShow = false;
+                  }}
+                >
                   <Icon name="cross" size={19} color="#fff" />
                 </Button>
               </div>
@@ -1250,7 +1313,8 @@ export default defineComponent({
                             round
                             plain
                             type={data.popupActiveTone.realName === tone.realName ? "primary" : "default"}
-                            onClick={() => {
+                            onClick={(e: any) => {
+                              e.stopPropagation();
                               data.popupActiveTone = tone;
                               setNotes();
                             }}
@@ -1279,9 +1343,16 @@ export default defineComponent({
                     </Space>
                   </div>
                   <div class={styles.toneAction}>
-                    <img onClick={() => (data.tnoteShow = false)} src={icons.icon_action_cancel} />
                     <img
-                      onClick={() => {
+                      onClick={(e: any) => {
+                        e.stopPropagation();
+                        data.tnoteShow = false;
+                      }}
+                      src={icons.icon_action_cancel}
+                    />
+                    <img
+                      onClick={(e: any) => {
+                        e.stopPropagation();
                         data.activeTone = data.popupActiveTone;
                         setNotes();
                         data.tnoteShow = false;
@@ -1294,6 +1365,48 @@ export default defineComponent({
             </div>
           </Popup>
 
+          <Popup
+            v-model:show={data.changeSubjectShow}
+            class={styles.changeSubjectPopup}
+            onClick={(e: any) => {
+              e.stopPropagation();
+            }}
+          >
+            <ChangeSubject
+              subjectList={data.subjects}
+              subject={data.subject}
+              onClose={() => (data.changeSubjectShow = false)}
+              onConfirm={(code: any) => {
+                if (data.subject === code) {
+                  data.changeSubjectShow = false;
+                  return;
+                }
+                const originalSubject = JSON.parse(JSON.stringify(data.subject));
+                data.subject = code;
+                data.viewIndex = 0;
+                data.tipShow = false;
+                data.loadingDom = true;
+                fingerData.fingeringInfo = subjectFingering(data.subject);
+                data.activeTone = {} as any;
+                resetElement();
+                resetMode(true, 0);
+                // api_setRequestedOrientation(orientationDirection.value);
+
+                data.changeSubjectShow = false;
+                // 设置屏幕方向
+                setTimeout(() => {
+                  const before = ["hulusi-flute", "piccolo", "baroque-recorder"].includes(originalSubject) ? 0 : 0;
+                  if (orientationDirection.value !== before) {
+                    data.paddingTop = "";
+                    data.paddingLeft = "";
+                  }
+
+                  __init();
+                }, 100);
+              }}
+            />
+          </Popup>
+
           {props.show && !data.loading && !data.loadingSoundFonts && <GuideIndex fingeringMode={data.fingeringMode} showGuide={false} list={["finger"]} />}
         </div>
       );

+ 1 - 0
src/store.ts

@@ -20,6 +20,7 @@ type IUser = {
   /** 是否是VIP */
   vipMember?: boolean;
   phone?: string;
+  schoolInfos?: any[];
 };
 type IStatus = "init" | "login" | "logout" | "error";
 type IPlatformType = "STUDENT" | "TEACHER" | "WEB" | "";

+ 2305 - 0
src/view/figner-preview/index.ts

@@ -4682,6 +4682,2311 @@ export const FIGNER_INSTRUMENT_DATA: { [_: string]: IFIGNER_INSTRUMENT_DATA } =
 			},
 		],
 	},
+	whistling: {
+		tips: [
+			{
+				key: 0,
+				name: "嘴型",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"以嘴唇轻轻含住吹口,不可含太深,以免盖住出气孔。\n吹气方式宜以丹田之力(腹腔)稳定送出,一可避免太多口水,二可产生振音效果,让笛韵更为悦耳。",
+			},
+			{
+				key: 0,
+				name: "长音",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"长音的吹奏,要求音量平稳,不可忽大忽小,音与音之间,要流畅的连接,不可断断续续。\n短音与重音需运用“踢舌”的技巧,将舌尖抵住上腭牙齿与牙龈的相接处,于吹气时瞬间将舌头缩回,这样的声音干净有力,听起来有活泼欢乐的感觉。",
+			},
+			{
+				key: 0,
+				name: "滑音",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"开合气孔的方式,一般是直接提高手指,音阶瞬间转换,另一种方式是将手指向陶笛外侧慢慢滑开,如此可以产生优美的滑音。",
+			},
+			{
+				key: 0,
+				name: "圆滑音",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"在两个以上不同高的音符之间加上“”记号,此记号成为圆滑线,它的吹法是用一口气连接的吹完整串音符,中间气不间断,注意第一个音仍要踢舌!",
+			},
+			{
+				key: 0,
+				name: "气震音",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"气震音是指在吹奏中用气流的变化来让发出的音发生波动,产生颤抖的感觉,所以又称气颤音,靠腹部控制,又叫腹震音。",
+			},
+			{
+				key: 0,
+				name: "呼吸方法",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"使用胸腹式呼吸法是一种比较科学的呼吸方法,大致分为两个步骤,吸气速度要快,胸腹要做到联合动作,让胸腹快速吸到更多的气,也可以用口协助吸气。",
+			},
+		],
+		tones: [
+			{
+				key: 1,
+				name: "C",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "",
+			},
+			{
+				key: 1,
+				name: "C",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Db5",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "D5",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Eb5",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "E5",
+			},
+			{
+				key: 4,
+				name: "F",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "F5",
+			},
+			{
+				key: 4,
+				name: "F",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Gb5",
+			},
+			{
+				key: 5,
+				name: "G",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "G5",
+			},
+			{
+				key: 5,
+				name: "G",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Ab5",
+			},
+			{
+				key: 6,
+				name: "A",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "A5",
+			},
+			{
+				key: 6,
+				name: "A",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Bb5",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "B5",
+			},
+		],
+		list: [
+			{
+				key: 6,
+				name: "A",
+				octave: 4,
+				step: -1,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 4,
+				step: -1,
+				realKey: 58,
+				mark: "fall",
+				realName: "Bb4",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 4,
+				step: -1,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 1,
+				name: "C",
+				octave: 5,
+				step: 0,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 5,
+				step: 0,
+				realKey: 61,
+				mark: "fall",
+				realName: "Db5",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 5,
+				step: 0,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 5,
+				step: 0,
+				realKey: 63,
+				mark: "fall",
+				realName: "Eb5",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 5,
+				step: 0,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 4,
+				name: "F",
+				octave: 5,
+				step: 0,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 5,
+				name: "G",
+				octave: 5,
+				step: 0,
+				realKey: 66,
+				mark: "fall",
+				realName: "Gb5",
+			},
+			{
+				key: 5,
+				name: "G",
+				octave: 5,
+				step: 0,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 6,
+				name: "A",
+				octave: 5,
+				step: 0,
+				realKey: 68,
+				mark: "fall",
+				realName: "Ab5",
+			},
+			{
+				key: 6,
+				name: "A",
+				octave: 5,
+				step: 0,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 5,
+				step: 0,
+				realKey: 70,
+				mark: "fall",
+				realName: "Bb5",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 5,
+				step: 0,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 1,
+				name: "C",
+				octave: 6,
+				step: 1,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 6,
+				step: 1,
+				realKey: 73,
+				mark: "fall",
+				realName: "Db6",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 6,
+				step: 1,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 6,
+				step: 1,
+				realKey: 75,
+				mark: "fall",
+				realName: "Eb6",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 6,
+				step: 1,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 4,
+				name: "F",
+				octave: 6,
+				step: 1,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listDb5: [
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 3,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listD5: [
+			{
+				key: 5,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listEb5: [
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listE5: [
+			{
+				key: 4,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listF5: [
+			{
+				key: 3,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 4,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listGb5: [
+			{
+				key: 2,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 3,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 4,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listG5: [
+			{
+				key: 2,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 2,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 3,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 4,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listAb5: [
+			{
+				key: 1,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 2,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 2,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 3,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 4,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listA5: [
+			{
+				key: 1,
+				step: 0,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 3,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 4,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 4,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 5,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 5,
+				step: 1,
+				mark: "rise",
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listBb5: [
+			{
+				key: 7,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 3,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 4,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 4,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 5,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listB5: [
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 3,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 4,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+	},	
 	melodica: {
 		tips: [
 			{

+ 84 - 38
src/view/fingering/fingering-config.ts

@@ -57,7 +57,10 @@ export type IVocals =
   | "melodica1"
   | "baroque-recorder"
   | "baroque-recorder1"
-  | "baroque-recorder2";
+  | "baroque-recorder2"
+  | "whistling"
+  | "whistling1"
+  | "whistling2";
 
 /** 映射声部ID */
 export const mappingVoicePart = (id: number | string, soruce: "GYM" | "COLEXIU" | "ORCHESTRA" | "INSTRUMENT" | "ENSEMBLE"): number => {
@@ -103,7 +106,6 @@ export const mappingVoicePart = (id: number | string, soruce: "GYM" | "COLEXIU"
     if (typeof code === "string") {
       code = code.toLocaleLowerCase().replace(/ /g, "");
     }
-    console.log(code, "1212");
     const subject: { [_key: string | number]: any } = {
       flute: 2,
       clarinet: 4,
@@ -122,7 +124,7 @@ export const mappingVoicePart = (id: number | string, soruce: "GYM" | "COLEXIU"
       ukulele: 130,
       mouthorgan: 140,
       piano: 150,
-	  baroquerecorder: 'baroque-recorder',
+      baroquerecorder: "baroque-recorder",
       4: "piccolo",
       3: "hulusi-flute",
       1: "pan-flute",
@@ -139,7 +141,8 @@ export const mappingVoicePart = (id: number | string, soruce: "GYM" | "COLEXIU"
       tenorrecorder: "piccolo",
       woodwind: "hulusi-flute",
       panpipes: "pan-flute",
-      ocarina: "ocarina",
+      ocarina: "ocarina", // 陶笛
+      whistling: "whistling", // 高音陶笛
       nai: "melodica",
       15: "baroque-recorder",
       16: "baroque-recorder",
@@ -210,7 +213,7 @@ export const mappingVoicePart = (id: number | string, soruce: "GYM" | "COLEXIU"
       panpipes: "pan-flute",
       ocarina: "ocarina",
       nai: "melodica",
-	  BaroqueRecorder: 'baroque-recorder',
+      BaroqueRecorder: "baroque-recorder",
     };
     let _track;
     if (typeof code === "string") {
@@ -238,6 +241,7 @@ export const matchVoicePart = (id: number | string, type: "SINGLE" | "CONCERT"):
       37: "piccolo",
       36: "melodica",
       38: "baroque-recorder",
+      39: "whistling",
       1: 2,
       5: 5,
       3: 4,
@@ -313,19 +317,20 @@ export const matchVoicePart = (id: number | string, type: "SINGLE" | "CONCERT"):
       woodwind: "hulusi-flute",
       panpipes: "pan-flute",
       ocarina: "ocarina",
+      whistling: "whistling",
       nai: "melodica",
-	    BaroqueRecorder: 'baroque-recorder',
-      'Drum Set': 24,
-      'Marimba': 26,
-      'Vibraphone': 27,
-      'Tubular Bells': 30,
-      'Mallets': 32,
+      BaroqueRecorder: "baroque-recorder",
+      "Drum Set": 24,
+      Marimba: 26,
+      Vibraphone: 27,
+      "Tubular Bells": 30,
+      Mallets: 32,
     };
     let _track;
     if (typeof code === "string") {
       code = code.toLocaleLowerCase().replace(/ /g, "");
       for (let sKey in subject) {
-        let pitchKey = sKey
+        let pitchKey = sKey;
         if (typeof sKey === "string") pitchKey = pitchKey.toLocaleLowerCase().replace(/ /g, "");
         if (pitchKey === code) {
           _track = subject[sKey];
@@ -338,7 +343,7 @@ export const matchVoicePart = (id: number | string, type: "SINGLE" | "CONCERT"):
     return _track;
   }
   return 0;
-}
+};
 
 /** 声部的指法配置信息 */
 export const subjectFingering = (subjectId: number | string): IFingering => {
@@ -413,7 +418,7 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
         name: "piccolo",
         direction: "vertical",
         width: "3rem",
-        orientation: 1,
+        orientation: 0,
         hasTizhi: true,
         id: 2,
       };
@@ -422,7 +427,7 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
         name: "piccolo",
         direction: "vertical",
         width: "3rem",
-        orientation: 1,
+        orientation: 0,
         code: "竖笛",
         hasTizhi: true,
         id: 37,
@@ -432,7 +437,7 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
         name: "hulusi-flute",
         direction: "vertical",
         width: "3rem",
-        orientation: 1,
+        orientation: 0,
         code: "葫芦丝",
         hasTizhi: false,
         id: 35,
@@ -459,6 +464,17 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
         hasTizhi: false,
         id: 34,
       };
+    case "whistling": // 高音陶笛
+      return {
+        name: "whistling",
+        direction: "vertical",
+        width: "3rem",
+        disabledFinger: true,
+        orientation: 0,
+        code: "陶笛",
+        hasTizhi: false,
+        id: 39,
+      };      
     case "melodica": // 口风琴
       return {
         name: "melodica",
@@ -474,13 +490,13 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
         name: "baroque-recorder",
         direction: "vertical",
         width: "3rem",
-        orientation: 1,
+        orientation: 0,
         code: "竖笛",
         hasTizhi: true,
         id: 38,
-      };	  
+      };
     default:
-      return typeof subjectId === 'number' ? { id: subjectId } : {};
+      return typeof subjectId === "number" ? { id: subjectId } : {};
   }
 };
 
@@ -659,6 +675,36 @@ export const getFingeringConfig = async (type: IVocals | undefined): Promise<ITy
           marginTop: "auto",
         },
       };
+    case "whistling":
+      const whistling = await import(`./fingering-img/whistling/index.json`);
+      return {
+        json: whistling.default,
+        relationship: relationships.ocarina,
+        width: "180px",
+        styles: {
+          marginTop: "auto",
+        },
+      };
+    case "whistling1":
+      const whistling1 = await import(`./fingering-img/whistling1/index.json`);
+      return {
+        json: whistling1.default,
+        relationship: relationships.ocarina,
+        width: "180px",
+        styles: {
+          marginTop: "auto",
+        },
+      };
+    case "whistling2":
+      const whistling2 = await import(`./fingering-img/whistling2/index.json`);
+      return {
+        json: whistling2.default,
+        relationship: relationships.ocarina,
+        width: "180px",
+        styles: {
+          marginTop: "auto",
+        },
+      };      
     case "melodica":
       const melodica = await import(`./fingering-img/melodica/index.json`);
       return {
@@ -679,25 +725,25 @@ export const getFingeringConfig = async (type: IVocals | undefined): Promise<ITy
           marginTop: "auto",
         },
       };
-	case "baroque-recorder":
-		const baroqueRecorder = await import(`./fingering-img/baroque-recorder/index.json`);
-		return {
-			json: baroqueRecorder.default,
-			relationship: relationships.baroqueRecorder,
-		};  	
-	case "baroque-recorder1":
-		const baroqueRecorder1 = await import(`./fingering-img/baroque-recorder1/index.json`);
-		return {
-			json: baroqueRecorder1.default,
-			relationship: relationships.baroqueRecorder,
-		};	
-	case "baroque-recorder2":
-		const baroqueRecorder2 = await import(`./fingering-img/baroque-recorder2/index.json`);
-		return {
-			json: baroqueRecorder2.default,
-			relationship: relationships.baroqueRecorder,
-		};			  
+    case "baroque-recorder":
+      const baroqueRecorder = await import(`./fingering-img/baroque-recorder/index.json`);
+      return {
+        json: baroqueRecorder.default,
+        relationship: relationships.baroqueRecorder,
+      };
+    case "baroque-recorder1":
+      const baroqueRecorder1 = await import(`./fingering-img/baroque-recorder1/index.json`);
+      return {
+        json: baroqueRecorder1.default,
+        relationship: relationships.baroqueRecorder,
+      };
+    case "baroque-recorder2":
+      const baroqueRecorder2 = await import(`./fingering-img/baroque-recorder2/index.json`);
+      return {
+        json: baroqueRecorder2.default,
+        relationship: relationships.baroqueRecorder,
+      };
     default:
       return null;
   }
-};
+};

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/view/fingering/fingering-img/ocarina/index.json


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/view/fingering/fingering-img/ocarina1/index.json


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/view/fingering/fingering-img/ocarina2/index.json


BIN
src/view/fingering/fingering-img/whistling/1.png


BIN
src/view/fingering/fingering-img/whistling/10.png


BIN
src/view/fingering/fingering-img/whistling/11.png


BIN
src/view/fingering/fingering-img/whistling/12.png


BIN
src/view/fingering/fingering-img/whistling/2.png


BIN
src/view/fingering/fingering-img/whistling/3.png


BIN
src/view/fingering/fingering-img/whistling/4.png


BIN
src/view/fingering/fingering-img/whistling/5.png


BIN
src/view/fingering/fingering-img/whistling/6.png


BIN
src/view/fingering/fingering-img/whistling/7.png


BIN
src/view/fingering/fingering-img/whistling/8.png


BIN
src/view/fingering/fingering-img/whistling/9.png


BIN
src/view/fingering/fingering-img/whistling/full.png


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 0
src/view/fingering/fingering-img/whistling/index.json


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 0
src/view/fingering/fingering-img/whistling1/index.json


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 0
src/view/fingering/fingering-img/whistling2/index.json


+ 0 - 1
src/view/selection/index.tsx

@@ -186,7 +186,6 @@ export default defineComponent({
 						const actualEndIndex = state.userChooseEndIndex > state.section[1].MeasureNumberXML ? state.userChooseEndIndex : state.section[1].MeasureNumberXML
 						// 选段预备拍背景
 						if (state.sectionFirst && item.MeasureNumberXML === state.sectionFirst.MeasureNumberXML) {
-							console.log(1111111)
 							item.staveBox.height = selectData.measureHeight + 'px';
 							return styles.prepareStaveBox;
 						}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
stats.html


+ 1 - 1
vite.config.ts

@@ -78,7 +78,7 @@ export default defineConfig({
 				// target: "https://dev.kt.colexiu.com",
 				target: "https://test.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
 				// target: "https://dev.resource.colexiu.com",
-				// target: "https://test.kt.colexiu.com", // 课堂乐器测试环境
+				// target: "https://test.kt.colexiu.com",
 				// target: "https://mec.colexiu.com",
 				changeOrigin: true,
 				rewrite: (path) => path.replace(/^\/instrument/, ""),

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels