Browse Source

Merge branch 'feature-tianyong' into gym-test

TIANYONG 6 months ago
parent
commit
3bac953a87
53 changed files with 248 additions and 120 deletions
  1. 1 0
      dist/css/instrument-8aed2e81.css
  2. 1 0
      dist/css/instrument-babfb2c2.css
  3. 14 0
      dist/instrument.html
  4. 1 0
      dist/js/index-0941b0c2.js
  5. 4 0
      dist/js/index-0d315092.js
  6. 1 0
      dist/js/index-112a37aa.js
  7. 1 0
      dist/js/index-13db91e9.js
  8. 5 0
      dist/js/index-638e5028.js
  9. 1 0
      dist/js/index-7fd99e77.js
  10. 0 0
      dist/js/index-85df5105.js
  11. 0 0
      dist/js/index-legacy-1e4420c9.js
  12. 1 0
      dist/js/index-legacy-26f61e59.js
  13. 0 0
      dist/js/index-legacy-2bfc2d28.js
  14. 4 0
      dist/js/index-legacy-343e74ac.js
  15. 5 0
      dist/js/index-legacy-b6715548.js
  16. 1 0
      dist/js/index-legacy-fdf30d60.js
  17. 0 0
      dist/js/instrument-bad6c273.js
  18. 0 0
      dist/js/instrument-legacy-5c153bad.js
  19. 0 0
      dist/js/modeView-0aedb786.js
  20. 0 0
      dist/js/modeView-legacy-51503147.js
  21. 0 0
      dist/js/polyfills-3cb38156.js
  22. 0 0
      dist/js/polyfills-legacy-4a90cbf7.js
  23. BIN
      dist/png/tips-02a6a659.png
  24. 2 1
      src/page-instrument/api.ts
  25. 2 2
      src/page-instrument/component/the-music-list/index.module.less
  26. 2 1
      src/page-instrument/component/the-music-list/index.tsx
  27. 11 0
      src/page-instrument/component/the-music-list/list.tsx
  28. 27 0
      src/page-instrument/component/vip/index.module.less
  29. 39 0
      src/page-instrument/component/vip/index.tsx
  30. BIN
      src/page-instrument/component/vip/tips.png
  31. 8 8
      src/page-instrument/custom-plugins/ExerciseStatistics/index.module.less
  32. 9 9
      src/page-instrument/custom-plugins/guide-driver/index.less
  33. 28 25
      src/page-instrument/custom-plugins/guide-driver/index.tsx
  34. 2 2
      src/page-instrument/custom-plugins/recording-time/index.tsx
  35. 1 1
      src/page-instrument/evaluat-model/earphone/index.module.less
  36. 3 2
      src/page-instrument/evaluat-model/evaluat-result/index.tsx
  37. 1 1
      src/page-instrument/evaluat-model/index.module.less
  38. 1 1
      src/page-instrument/follow-model/microphone/index.module.less
  39. 5 1
      src/page-instrument/header-top/index.module.less
  40. 3 3
      src/page-instrument/header-top/index.tsx
  41. 1 1
      src/page-instrument/header-top/speed/index.module.less
  42. 7 3
      src/page-instrument/view-detail/index.tsx
  43. 6 0
      src/page-instrument/view-figner/index.module.less
  44. 1 1
      src/page-instrument/view-figner/index.tsx
  45. 2 2
      src/view/fingering/fingering-config.ts
  46. 6 0
      src/view/fingering/index.module.less
  47. 1 1
      src/view/fingering/index.tsx
  48. 1 1
      src/view/follow-practice/index.tsx
  49. 12 29
      src/view/plugins/toggleMusicSheet/choosePartName/index.module.less
  50. 7 11
      src/view/plugins/toggleMusicSheet/choosePartName/index.tsx
  51. 9 9
      src/view/selection/index.module.less
  52. 10 5
      src/view/selection/index.tsx
  53. 1 0
      stats.html

File diff suppressed because it is too large
+ 1 - 0
dist/css/instrument-8aed2e81.css


File diff suppressed because it is too large
+ 1 - 0
dist/css/instrument-babfb2c2.css


+ 14 - 0
dist/instrument.html

@@ -2,7 +2,11 @@
 <html lang="en">
 
 <head>
+<<<<<<< HEAD
   <script type="module" crossorigin src="./js/polyfills-20584e52.js"></script>
+=======
+  <script type="module" crossorigin src="./js/polyfills-3cb38156.js"></script>
+>>>>>>> feature-tianyong
 
   <meta charset="UTF-8" />
   <meta name="viewport"
@@ -41,8 +45,13 @@
       })
     }
   </script>
+<<<<<<< HEAD
   <script type="module" crossorigin src="./js/instrument-75683fa3.js"></script>
   <link rel="stylesheet" href="./css/instrument-8aed2e81.css">
+=======
+  <script type="module" crossorigin src="./js/instrument-bad6c273.js"></script>
+  <link rel="stylesheet" href="./css/instrument-babfb2c2.css">
+>>>>>>> feature-tianyong
   <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>
@@ -65,8 +74,13 @@
     var vConsole = new window.VConsole();
   </script>   -->
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
+<<<<<<< HEAD
   <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-edd0f726.js"></script>
   <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-07d17021.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-4a90cbf7.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-5c153bad.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> feature-tianyong
 </body>
 
 </html>

File diff suppressed because it is too large
+ 1 - 0
dist/js/index-0941b0c2.js


+ 4 - 0
dist/js/index-0d315092.js

@@ -1 +1,5 @@
+<<<<<<<< HEAD:dist/js/index-0d315092.js
 import{d as i,g as l,r as d,E as e,o as r,s as c,b as s,M as u}from"./instrument-75683fa3.js";const f="_skeleton_vtlsh_1",m="_detail_vtlsh_12",p="_container_vtlsh_20",a={skeleton:f,detail:m,container:p},y=i({name:"music-list",setup(){const n=l(),t=d({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:e.staff,base64:""},{state:!1,name:"首调",type:e.firstTone,base64:""},{state:!1,name:"固定调",type:e.fixedTone,base64:""}]});r(()=>{window.appName="colexiu",c.xmlUrl=n.xmlUrl,t.isLoading=!1});const o=async()=>{console.log("渲染完成")};return()=>s("div",{class:a.detail},[s("div",{id:"scrollContainer",class:[a.container,"hideCursor"]},[!t.isLoading&&s(u,{onRendered:o},null)])])}});export{y as default};
+========
+import{d as i,g as l,r as d,E as e,o as r,s as c,b as s,M as u}from"./instrument-bad6c273.js";const f="_skeleton_vtlsh_1",m="_detail_vtlsh_12",p="_container_vtlsh_20",a={skeleton:f,detail:m,container:p},y=i({name:"music-list",setup(){const n=l(),t=d({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:e.staff,base64:""},{state:!1,name:"首调",type:e.firstTone,base64:""},{state:!1,name:"固定调",type:e.fixedTone,base64:""}]});r(()=>{window.appName="colexiu",c.xmlUrl=n.xmlUrl,t.isLoading=!1});const o=async()=>{console.log("渲染完成")};return()=>s("div",{class:a.detail},[s("div",{id:"scrollContainer",class:[a.container,"hideCursor"]},[!t.isLoading&&s(u,{onRendered:o},null)])])}});export{y as default};
+>>>>>>>> feature-tianyong:dist/js/index-638e5028.js

File diff suppressed because it is too large
+ 1 - 0
dist/js/index-112a37aa.js


File diff suppressed because it is too large
+ 1 - 0
dist/js/index-13db91e9.js


+ 5 - 0
dist/js/index-638e5028.js

@@ -0,0 +1,5 @@
+<<<<<<<< HEAD:dist/js/index-0d315092.js
+import{d as i,g as l,r as d,E as e,o as r,s as c,b as s,M as u}from"./instrument-75683fa3.js";const f="_skeleton_vtlsh_1",m="_detail_vtlsh_12",p="_container_vtlsh_20",a={skeleton:f,detail:m,container:p},y=i({name:"music-list",setup(){const n=l(),t=d({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:e.staff,base64:""},{state:!1,name:"首调",type:e.firstTone,base64:""},{state:!1,name:"固定调",type:e.fixedTone,base64:""}]});r(()=>{window.appName="colexiu",c.xmlUrl=n.xmlUrl,t.isLoading=!1});const o=async()=>{console.log("渲染完成")};return()=>s("div",{class:a.detail},[s("div",{id:"scrollContainer",class:[a.container,"hideCursor"]},[!t.isLoading&&s(u,{onRendered:o},null)])])}});export{y as default};
+========
+import{d as i,g as l,r as d,E as e,o as r,s as c,b as s,M as u}from"./instrument-bad6c273.js";const f="_skeleton_vtlsh_1",m="_detail_vtlsh_12",p="_container_vtlsh_20",a={skeleton:f,detail:m,container:p},y=i({name:"music-list",setup(){const n=l(),t=d({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:e.staff,base64:""},{state:!1,name:"首调",type:e.firstTone,base64:""},{state:!1,name:"固定调",type:e.fixedTone,base64:""}]});r(()=>{window.appName="colexiu",c.xmlUrl=n.xmlUrl,t.isLoading=!1});const o=async()=>{console.log("渲染完成")};return()=>s("div",{class:a.detail},[s("div",{id:"scrollContainer",class:[a.container,"hideCursor"]},[!t.isLoading&&s(u,{onRendered:o},null)])])}});export{y as default};
+>>>>>>>> feature-tianyong:dist/js/index-638e5028.js

File diff suppressed because it is too large
+ 1 - 0
dist/js/index-7fd99e77.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-85df5105.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-1e4420c9.js


File diff suppressed because it is too large
+ 1 - 0
dist/js/index-legacy-26f61e59.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-2bfc2d28.js


+ 4 - 0
dist/js/index-legacy-343e74ac.js

@@ -1 +1,5 @@
+<<<<<<<< HEAD:dist/js/index-legacy-343e74ac.js
 System.register(["./instrument-legacy-07d17021.js"],(function(e,t){"use strict";var i,n,a,o,r,s,l,d,c=document.createElement("style");return c.textContent="._skeleton_vtlsh_1{position:fixed;left:0;top:0;width:100vw;height:100vh;padding:.53333rem .8rem;background-color:#fff;z-index:1000;--van-skeleton-paragraph-height: .8rem}._detail_vtlsh_12{width:100vw;height:100vh;overflow:hidden;overflow-y:auto;--header-height: 1.65333rem;background:var(--container-background)}._detail_vtlsh_12 ._container_vtlsh_20{margin:0 .26667rem;border-radius:.26667rem}._detail_vtlsh_12 #musicAndSelection{overflow:initial!important;height:initial!important;max-height:initial!important}\n",document.head.appendChild(c),{setters:[e=>{i=e.d,n=e.g,a=e.r,o=e.E,r=e.o,s=e.s,l=e.b,d=e.M}],execute:function(){const t="_detail_vtlsh_12",c="_container_vtlsh_20";e("default",i({name:"music-list",setup(){const e=n(),i=a({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:o.staff,base64:""},{state:!1,name:"首调",type:o.firstTone,base64:""},{state:!1,name:"固定调",type:o.fixedTone,base64:""}]});r((()=>{window.appName="colexiu",s.xmlUrl=e.xmlUrl,i.isLoading=!1}));const h=async()=>{console.log("渲染完成")};return()=>l("div",{class:t},[l("div",{id:"scrollContainer",class:[c,"hideCursor"]},[!i.isLoading&&l(d,{onRendered:h},null)])])}}))}}}));
+========
+System.register(["./instrument-legacy-5c153bad.js"],(function(e,t){"use strict";var i,n,a,o,r,s,l,d,c=document.createElement("style");return c.textContent="._skeleton_vtlsh_1{position:fixed;left:0;top:0;width:100vw;height:100vh;padding:.53333rem .8rem;background-color:#fff;z-index:1000;--van-skeleton-paragraph-height: .8rem}._detail_vtlsh_12{width:100vw;height:100vh;overflow:hidden;overflow-y:auto;--header-height: 1.65333rem;background:var(--container-background)}._detail_vtlsh_12 ._container_vtlsh_20{margin:0 .26667rem;border-radius:.26667rem}._detail_vtlsh_12 #musicAndSelection{overflow:initial!important;height:initial!important;max-height:initial!important}\n",document.head.appendChild(c),{setters:[e=>{i=e.d,n=e.g,a=e.r,o=e.E,r=e.o,s=e.s,l=e.b,d=e.M}],execute:function(){const t="_detail_vtlsh_12",c="_container_vtlsh_20";e("default",i({name:"music-list",setup(){const e=n(),i=a({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:o.staff,base64:""},{state:!1,name:"首调",type:o.firstTone,base64:""},{state:!1,name:"固定调",type:o.fixedTone,base64:""}]});r((()=>{window.appName="colexiu",s.xmlUrl=e.xmlUrl,i.isLoading=!1}));const h=async()=>{console.log("渲染完成")};return()=>l("div",{class:t},[l("div",{id:"scrollContainer",class:[c,"hideCursor"]},[!i.isLoading&&l(d,{onRendered:h},null)])])}}))}}}));
+>>>>>>>> feature-tianyong:dist/js/index-legacy-b6715548.js

+ 5 - 0
dist/js/index-legacy-b6715548.js

@@ -0,0 +1,5 @@
+<<<<<<<< HEAD:dist/js/index-legacy-343e74ac.js
+System.register(["./instrument-legacy-07d17021.js"],(function(e,t){"use strict";var i,n,a,o,r,s,l,d,c=document.createElement("style");return c.textContent="._skeleton_vtlsh_1{position:fixed;left:0;top:0;width:100vw;height:100vh;padding:.53333rem .8rem;background-color:#fff;z-index:1000;--van-skeleton-paragraph-height: .8rem}._detail_vtlsh_12{width:100vw;height:100vh;overflow:hidden;overflow-y:auto;--header-height: 1.65333rem;background:var(--container-background)}._detail_vtlsh_12 ._container_vtlsh_20{margin:0 .26667rem;border-radius:.26667rem}._detail_vtlsh_12 #musicAndSelection{overflow:initial!important;height:initial!important;max-height:initial!important}\n",document.head.appendChild(c),{setters:[e=>{i=e.d,n=e.g,a=e.r,o=e.E,r=e.o,s=e.s,l=e.b,d=e.M}],execute:function(){const t="_detail_vtlsh_12",c="_container_vtlsh_20";e("default",i({name:"music-list",setup(){const e=n(),i=a({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:o.staff,base64:""},{state:!1,name:"首调",type:o.firstTone,base64:""},{state:!1,name:"固定调",type:o.fixedTone,base64:""}]});r((()=>{window.appName="colexiu",s.xmlUrl=e.xmlUrl,i.isLoading=!1}));const h=async()=>{console.log("渲染完成")};return()=>l("div",{class:t},[l("div",{id:"scrollContainer",class:[c,"hideCursor"]},[!i.isLoading&&l(d,{onRendered:h},null)])])}}))}}}));
+========
+System.register(["./instrument-legacy-5c153bad.js"],(function(e,t){"use strict";var i,n,a,o,r,s,l,d,c=document.createElement("style");return c.textContent="._skeleton_vtlsh_1{position:fixed;left:0;top:0;width:100vw;height:100vh;padding:.53333rem .8rem;background-color:#fff;z-index:1000;--van-skeleton-paragraph-height: .8rem}._detail_vtlsh_12{width:100vw;height:100vh;overflow:hidden;overflow-y:auto;--header-height: 1.65333rem;background:var(--container-background)}._detail_vtlsh_12 ._container_vtlsh_20{margin:0 .26667rem;border-radius:.26667rem}._detail_vtlsh_12 #musicAndSelection{overflow:initial!important;height:initial!important;max-height:initial!important}\n",document.head.appendChild(c),{setters:[e=>{i=e.d,n=e.g,a=e.r,o=e.E,r=e.o,s=e.s,l=e.b,d=e.M}],execute:function(){const t="_detail_vtlsh_12",c="_container_vtlsh_20";e("default",i({name:"music-list",setup(){const e=n(),i=a({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:o.staff,base64:""},{state:!1,name:"首调",type:o.firstTone,base64:""},{state:!1,name:"固定调",type:o.fixedTone,base64:""}]});r((()=>{window.appName="colexiu",s.xmlUrl=e.xmlUrl,i.isLoading=!1}));const h=async()=>{console.log("渲染完成")};return()=>l("div",{class:t},[l("div",{id:"scrollContainer",class:[c,"hideCursor"]},[!i.isLoading&&l(d,{onRendered:h},null)])])}}))}}}));
+>>>>>>>> feature-tianyong:dist/js/index-legacy-b6715548.js

File diff suppressed because it is too large
+ 1 - 0
dist/js/index-legacy-fdf30d60.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/instrument-bad6c273.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/instrument-legacy-5c153bad.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/modeView-0aedb786.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/modeView-legacy-51503147.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/polyfills-3cb38156.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/polyfills-legacy-4a90cbf7.js


BIN
dist/png/tips-02a6a659.png


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

@@ -51,7 +51,8 @@ export const studentQueryUserInfo = async () => {
         clientType:"STUDENT",
         id:data.id,
         vipMember: true, // 管乐迷 会员现在在外面判断的 所以这里默认不开启会员验证
-        gender:""
+        gender:"",
+        membershipEndTime: data.membershipEndTime
       }
       return res
     }

+ 2 - 2
src/page-instrument/component/the-music-list/index.module.less

@@ -165,7 +165,7 @@
         flex-grow: 1;
         overflow: hidden;
         .name{
-            line-height: 17px;
+            line-height: 20px;
             font-weight: 600;
             font-size: 16px;
             color: #333333;
@@ -176,7 +176,7 @@
         .detail{
             display: flex;
             align-items: center;
-            margin-top: 8px;
+            margin-top: 6px;
             height: 14px;
             .usedNum{
                 display: flex;

+ 2 - 1
src/page-instrument/component/the-music-list/index.tsx

@@ -6,7 +6,7 @@ import { followData } from "/src/view/follow-practice";
 import state, {IPlatform} from "/src/state";
 import { evaluatingData } from "/src/view/evaluating";
 import { getQuery } from "/src/utils/queryString";
-
+import Vip from "../vip"
 const query: any = getQuery();
 export const isMusicList = computed(()=>{
 	return !(query.workRecord || query.modelType || state.platform === IPlatform.PC || query.isCbs)
@@ -17,6 +17,7 @@ export default defineComponent({
 	setup() {
 		return () => (
 			<>
+				<Vip></Vip>
 				<Popup class={styles.popup} position="left" v-model:show={musicListShow.value} round overlay-style={{background:'rgba(0, 0, 0, 0.7)'}}>
 					<div class={[styles.tabs]}>
 						<Tabs>

+ 11 - 0
src/page-instrument/component/the-music-list/list.tsx

@@ -9,6 +9,9 @@ import searImg from "./imgs/searImg.png"
 import huoimg from "./imgs/huo.png"
 import emptyImg from "./imgs/empty.png"
 import { getQuery } from "/src/utils/queryString";
+import dayjs from "dayjs";
+import { storeData } from "/src/store"
+import { vipShow } from "../vip"
 
 export default defineComponent({
   name: "TheMusicList-list",
@@ -74,6 +77,14 @@ export default defineComponent({
     });
 
     const openAccomapina = (item: any) => {
+      if(item.paymentType === "VIP" && state.systemType === "student" && !dayjs().isBefore(dayjs(storeData.user?.membershipEndTime))){
+        vipShow.value = true
+        return
+      }
+      if(item.paymentType === "VIP" && state.systemType === "web" && state.isSchool){
+        vipShow.value = true
+        return
+      }
       if (item.id === state.examSongId) return;
       // 暂停播放
       togglePlay("paused");

+ 27 - 0
src/page-instrument/component/vip/index.module.less

@@ -0,0 +1,27 @@
+.vip{
+  padding: 20px 30px;
+  padding-top: 30px;
+  min-width: 230px;
+  >img{
+    width: 161px;
+    margin: 0 auto 20px;
+    display: block;
+  }
+  >p{
+    margin: 0;
+    font-size: 14px;
+    color: #808080;
+    margin: 0 auto 20px;
+    text-align: center;
+  }
+  .btn{
+    font-size: 16px;
+    height: 40px;
+    line-height: 40px;
+    width: 100%;
+  }
+  &+i{
+    right: 10px;
+    top: 10px;
+  }
+}

+ 39 - 0
src/page-instrument/component/vip/index.tsx

@@ -0,0 +1,39 @@
+import { defineComponent, ref } from "vue";
+import { Button, Popup } from "vant";
+import state from "/src/state";
+import TipsIcon from "./tips.png";
+import styles from "./index.module.less";
+
+export const vipShow = ref(false)
+export default defineComponent({
+  name: "vip-popup",
+  data() {
+    return {
+      content: "您尚未开通云练习服务,请联系乐团老师开通",
+    };
+  },
+  methods: {
+    open() {
+      vipShow.value = false;
+    },
+    getContent() {
+      if (state.isSchool) {
+        this.content = "VIP曲目暂不可用";
+      }
+      return this.content;
+    },
+  },
+  render() {
+    return (
+      <Popup show={vipShow.value} get-container="body" closeable onClickCloseIcon={() => (vipShow.value = false)} round>
+        <div class={styles.vip}>
+          <img src={TipsIcon} />
+          <p>{this.getContent()}</p>
+          <Button class={styles.btn} onClick={this.open} round color="#01C1B5">
+            确定
+          </Button>
+        </div>
+      </Popup>
+    );
+  },
+});

BIN
src/page-instrument/component/vip/tips.png


+ 8 - 8
src/page-instrument/custom-plugins/ExerciseStatistics/index.module.less

@@ -1,6 +1,6 @@
 .exerciseStatistics {
     position: fixed;
-    left: 12px;
+    left: 17px;
     bottom: 28px;
     box-sizing: border-box;
     z-index: 110;
@@ -21,8 +21,8 @@
     .icon {
         position: relative;
         display: block;
-        width: 32px;
-        height: 32px;
+        width: 37px;
+        height: 37px;
         transition: all var(--animation-time);
         // box-shadow: 0px 2px 4px 0px rgba(2,91,86,0.63);
         filter: drop-shadow(0px 2px 4px rgba(2, 91, 86, 0.4));
@@ -31,14 +31,14 @@
     .btnTietle {
         position: absolute;
         left: -20%;
-        bottom: -25%;
+        bottom: -22%;
         background: linear-gradient(180deg, #FF9941 0%, #FFC174 100%);
         border-radius: 6px;
         box-shadow: 0px 2px 4px 0px rgba(2, 91, 86, 0.4);
-        font-size: 9px;
+        font-size: 11px;
         white-space: nowrap;
         padding: 0 4px;
-        line-height: 12px;
+        line-height: 16px;
         transition: all var(--animation-time);
         transform-origin: center center;
     }
@@ -53,8 +53,8 @@
         padding: 3px;
         background: rgba(0, 73, 68, .4);
         .icon {
-            width: 22px;
-            height: 22px;
+            width: 26px;
+            height: 26px;
             filter:none;
         }
         .btnTietle{

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

@@ -150,7 +150,7 @@
 
 .popoverClass5-1 {
   width: 257px;
-  height: 165px;
+  height: 145px;
   background: url("./images/practise/d5-1.png") no-repeat center;
   background-size: contain;
 
@@ -473,8 +473,8 @@
 }
 
 .popoverClassER2 {
-  width: 261px;
-  height: 226px;
+  width: 260px;
+  height: 160px;
   background: url("./images/evaluating/r2.png") no-repeat center;
   background-size: contain;
 
@@ -486,7 +486,7 @@
 
 .popoverClassER3 {
   width: 261px;
-  height: 249px;
+  height: 181px;
   background: url("./images/evaluating/r3.png") no-repeat center;
   background-size: contain;
 
@@ -498,7 +498,7 @@
 
 .popoverClassER4 {
   width: 327px;
-  height: 246px;
+  height: 181px;
   background: url("./images/evaluating/r4.png") no-repeat center;
   background-size: contain;
 
@@ -524,7 +524,7 @@
 }
 
 .popoverClassReport1 {
-  transform: translateY(10px);
+  //transform: translateY(10px);
   width: 270px;
   height: 145px;
   background: url("./images/report/r1.png") no-repeat center;
@@ -537,7 +537,7 @@
 }
 
 .popoverClassReport2 {
-  transform: translateY(10px);
+  //transform: translateY(10px);
   width: 270px;
   height: 145px;
   background: url("./images/report/r2.png") no-repeat center;
@@ -571,7 +571,7 @@
 }
 
 .popoverClassReport3 {
-  transform: translateY(10px);
+  //transform: translateY(10px);
   width: 270px;
   height: 145px;
   background: url("./images/report/r3.png") no-repeat center;
@@ -605,7 +605,7 @@
 }
 
 .popoverClassReport4 {
-  transform: translateY(10px);
+  //transform: translateY(10px);
   width: 270px;
   height: 145px;
   background: url("./images/report/r5.png") no-repeat center;

+ 28 - 25
src/page-instrument/custom-plugins/guide-driver/index.tsx

@@ -21,7 +21,7 @@ type ButtonStatus = {
   playBtnStatus?: Boolean;
   /** 声部状态 */
   subjectStatus?: Boolean;
-  /** 练习模式 */
+  /** 是否显示模式切换 */
   modelTypeStatus?: Boolean;
   /** 播放模式 演唱 演奏 */
   playType?: Boolean;
@@ -69,9 +69,9 @@ export const PractiseDriver = defineComponent({
       }
 
       // 显示指法
-      if (!state.setting.displayFingering) {
-        length -= 1;
-      }
+      // if (!state.setting.displayFingering) {
+      //   length -= 1;
+      // }
 
       // 声部
       if (!props.statusAll.subjectStatus) {
@@ -131,21 +131,24 @@ export const PractiseDriver = defineComponent({
           },
         });
       }
-      options.steps?.push({
-        element: ".driver-9",
-        popover: {
-          title: "",
-          description: "",
-          popoverClass: "popoverClass popoverClass9",
-          align: "end",
-          side: "bottom",
-          nextBtnText: `下一步 (2/${length})`,
-          showButtons: ["next"],
-          onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
-            driverInitialPosition(popover, options);
+
+      if (props.statusAll.modelTypeStatus) {
+        options.steps?.push({
+          element: ".driver-9",
+          popover: {
+            title: "",
+            description: "",
+            popoverClass: "popoverClass popoverClass9",
+            align: "end",
+            side: "bottom",
+            nextBtnText: `下一步 (2/${length})`,
+            showButtons: ["next"],
+            onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
+              driverInitialPosition(popover, options);
+            },
           },
-        },
-      });
+        });
+      }
 
       if (props.statusAll.playType) {
         options.steps?.push({
@@ -1132,7 +1135,7 @@ export const EvaluatingReportDriver = defineComponent({
       options.config.stagePadding = 0;
       try {
         const rect = options.state.activeElement?.getBoundingClientRect();
-        popover.wrapper.style.marginLeft = -(rect?.width || 0) / 2 + 34 + "px";
+        popover.wrapper.style.marginLeft = -(rect?.width || 0) / 2 + 16 + "px";
       } catch {}
     };
 
@@ -1156,7 +1159,7 @@ export const EvaluatingReportDriver = defineComponent({
                 options.config.stagePadding = 0;
                 try {
                   const rect = options.state.activeElement?.getBoundingClientRect();
-                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 34 + "px";
+                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 16 + "px";
                 } catch {}
               },
             },
@@ -1177,7 +1180,7 @@ export const EvaluatingReportDriver = defineComponent({
                 options.config.stagePadding = 5;
                 try {
                   const rect = options.state.activeElement?.getBoundingClientRect();
-                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 34 + "px";
+                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 16 + "px";
                 } catch {}
               },
               onPrevClick: () => {
@@ -1206,7 +1209,7 @@ export const EvaluatingReportDriver = defineComponent({
                 options.config.stagePadding = 0;
                 try {
                   const rect = options.state.activeElement?.getBoundingClientRect();
-                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 34 + "px";
+                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 16 + "px";
                 } catch {}
               },
               onPrevClick: () => {
@@ -1252,7 +1255,7 @@ export const EvaluatingReportDriver = defineComponent({
               options.config.stagePadding = 0;
               try {
                 const rect = options.state.activeElement?.getBoundingClientRect();
-                popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 34 + "px";
+                popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 16 + "px";
               } catch {}
             },
           },
@@ -1276,7 +1279,7 @@ export const EvaluatingReportDriver = defineComponent({
                 options.config.stagePadding = 0;
                 try {
                   const rect = options.state.activeElement?.getBoundingClientRect();
-                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 34 + "px";
+                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 16 + "px";
                 } catch {}
               },
             },
@@ -1297,7 +1300,7 @@ export const EvaluatingReportDriver = defineComponent({
                 options.config.stagePadding = 5;
                 try {
                   const rect = options.state.activeElement?.getBoundingClientRect();
-                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 34 + "px";
+                  popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 16 + "px";
                 } catch {}
               },
               onPrevClick: () => {

+ 2 - 2
src/page-instrument/custom-plugins/recording-time/index.tsx

@@ -9,8 +9,8 @@ const recordData = reactive({
 	starTime: 0,
 });
 const handleRecord = () => {
-	// 不是练习模式不记录
-	if (state.modeType !== "practise") return;
+	// 不是练习模式不记录,web后台不记录
+	if (state.modeType !== "practise" || state.systemType === 'web') return;
 	let total = Date.now() - recordData.starTime;
 	recordData.starTime = Date.now();
 	if (total < 0) total = 0;

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

@@ -20,7 +20,7 @@
     .earphoneBtn {
         position: absolute;
         left: 50%;
-        bottom: 24px;
+        bottom: 28px;
         width: 133px;
         height: 39px;
         transform: translateX(-50%);

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

@@ -85,8 +85,9 @@ export default defineComponent({
     const noSaveTips = computed(() => {
       let tipContent = '';
       const rate = state.basePlayRate * state.originAudioPlayRate; // 播放倍率
-      if (query.workRecord || state.section.length === 2 || state.isAppPlay || rate != 1 || !state.accompany || state.systemType === 'teacher' || state.systemType === 'web') {
-        tipContent = (state.systemType === 'teacher' || state.systemType === 'web') ? '暂不支持保存作品噢~' : query.workRecord ? '评测作业暂不支持保存作品噢~' : (!state.accompany || state.isAppPlay) ? '该曲目暂不支持保存作品噢~' : state.section.length === 2 ? '选段后暂不支持保存作品噢~' : rate != 1 ? '调速后暂不支持保存作品噢~' : '';
+      console.log('123456',state.systemType)
+      if (query.workRecord || state.section.length === 2 || state.isAppPlay || rate != 1 || !state.accompany || state.systemType === 'web') {
+        tipContent = (state.systemType === 'web') ? '暂不支持保存作品噢~' : query.workRecord ? '评测作业暂不支持保存作品噢~' : (!state.accompany || state.isAppPlay) ? '该曲目暂不支持保存作品噢~' : state.section.length === 2 ? '选段后暂不支持保存作品噢~' : rate != 1 ? '调速后暂不支持保存作品噢~' : '';
       }
       return tipContent
     })

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

@@ -151,7 +151,7 @@
     .earphoneBtn {
         position: absolute;
         left: 50%;
-        bottom: 24px;
+        bottom: 28px;
         width: 133px;
         height: 39px;
         transform: translateX(-50%);

+ 1 - 1
src/page-instrument/follow-model/microphone/index.module.less

@@ -66,7 +66,7 @@
     .earphoneBtn {
         position: absolute;
         left: 50%;
-        bottom: 26px;
+        bottom: 28px;
         transform: translateX(-50%);
         display: flex;
         .earBtn{

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

@@ -89,6 +89,10 @@
     left: 30px;
     display: flex;
     align-items: center;
+    transition: all 0.3s;
+    &.headTopLeftHide{
+        margin-top: -54px;
+    }
 
     .img {
         width: 32px;
@@ -328,7 +332,7 @@
         left: 50%;
         top: 50%;
         transform: translate(-50%, -50%);
-        width: 38px;
+        width: 36px; // 宽给小一点,底部不会切边
         height: 38px;
     }
 }

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

@@ -668,8 +668,8 @@ export default defineComponent({
           }}
         >
           {/* 返回和标题 */}
-          {!(state.playState == "play" || followData.start || evaluatingData.startBegin) &&  (
-            <div id="noticeBarRollDom" class={styles.headTopLeftBox}>
+          {!(followData.start || evaluatingData.startBegin) &&  (
+            <div id="noticeBarRollDom" class={[styles.headTopLeftBox, state.playState == "play" && styles.headTopLeftHide]}>
               {
                 !query.isMove && !query.isHideBack && <img src={iconBack} class={["headTopBackBtn", styles.img, !headTopData.showBack && styles.hidenBack]} onClick={handleBack} />
               }
@@ -1001,7 +1001,7 @@ export default defineComponent({
           />
         )}
         {/* 跟练模式功能引导 加载音频完成 不是会员 */}
-        {state.modeType === "follow" && headTopData.modeType !== "init" && !query.isCbs && state.audioDone && !state.isLoading && !state.isVip && showWebGuide.value && (
+        {state.modeType === "follow" && headTopData.modeType !== "init" && !followData.earphone && !query.isCbs && state.audioDone && !state.isLoading && !state.isVip && showWebGuide.value && (
           <FollowDriver
             statusAll={{
               subjectStatus: state.musicRendered && !query.lessonTrainingId && !query.questionId && state.isConcert,

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

@@ -1,7 +1,7 @@
 .speedContainer{
     width: 334px;
     &.isHideBeat .content{
-        height: 190px;
+        height: 172px;
     }
     .head{
         height: 42px;

+ 7 - 3
src/page-instrument/view-detail/index.tsx

@@ -170,6 +170,8 @@ export default defineComponent({
       //   getMusicInfo(values[0]);
       // });
       window.addEventListener('message', changePlay)
+      const guideInfoStore = localStorage.getItem('guideInfo') ? JSON.parse(localStorage.getItem('guideInfo')) : {};
+      state.guideInfo = guideInfoStore
       try { 
         await getMusicDetail(id);
       } catch (err) {
@@ -339,6 +341,8 @@ export default defineComponent({
     /** 指法配置 */
     const fingerConfig = computed<any>(() => {
       if (state.setting.displayFingering && state.fingeringInfo?.name) {
+        // 横向指法
+        console.log("横向指法", state.fingeringInfo.name);
         if (state.fingeringInfo.direction === "transverse") {
           return {
             container: {
@@ -357,7 +361,7 @@ export default defineComponent({
             }
           };
         } else {
-          console.log("指法", state.playBtnDirection, state.platform);
+          console.log("竖向指法", state.fingeringInfo.name, state.playBtnDirection, state.platform);
           // 老师端,竖向指法,需要根据功能按钮方向进行设置
           if (state.platform === IPlatform.PC) {
             return {
@@ -371,7 +375,7 @@ export default defineComponent({
                 height: state.fingeringInfo.name === "hulusi-flute" ? "86%" : "80%",
                 right: state.playBtnDirection === "right" ? "initial" : 0,
                 left: state.playBtnDirection === "right" ? 0 : "initial",
-                top: (state.fingeringInfo.name === "ocarina" || state.fingeringInfo.name === "whistling") ? "60px" : state.fingeringInfo.name === "hulusi-flute" ? "10px" : (state.fingeringInfo.name === "baroque-recorder" || state.fingeringInfo.name === "piccolo") ? "36px" : 0,
+                top: (state.fingeringInfo.name === "ocarina" || state.fingeringInfo.name === "whistling") ? "60px" : state.fingeringInfo.name === "hulusi-flute" ? "10px" : (state.fingeringInfo.name === "baroque-recorder" || state.fingeringInfo.name === "piccolo") ? "36px" : "10%",
               },
             };
           } else {
@@ -384,7 +388,7 @@ export default defineComponent({
                 width: state.fingeringInfo.width,
                 height: state.fingeringInfo.name === "hulusi-flute" ? "86%" : "80%",
                 left: 0,
-                top: (state.fingeringInfo.name === "ocarina" || state.fingeringInfo.name === "whistling") ? "60px" : state.fingeringInfo.name === "hulusi-flute" ? "10px" : (state.fingeringInfo.name === "baroque-recorder" || state.fingeringInfo.name === "piccolo") ? "36px" : 0,
+                top: (state.fingeringInfo.name === "ocarina" || state.fingeringInfo.name === "whistling") ? "60px" : state.fingeringInfo.name === "hulusi-flute" ? "10px" : (state.fingeringInfo.name === "baroque-recorder" || state.fingeringInfo.name === "piccolo") ? "36px" : "10%",
               },
             };
           }

+ 6 - 0
src/page-instrument/view-figner/index.module.less

@@ -1058,6 +1058,12 @@
     // }
 }
 
+.speImgs {
+    &>img {
+      height: inherit;
+    }
+}
+
 .fingeringPointSection {
     position: absolute;
     left: 50%;

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

@@ -1337,7 +1337,7 @@ export default defineComponent({
                   }}
                   class={[styles.fingeringContainer]}
                 >
-                  <div class={styles.imgs}>
+                  <div class={[styles.imgs, state.fingeringInfo.name === 'trombone' && styles.speImgs]}>
                     {!data.loadingImg && <img id="fullInstrumentImg" src={data.fingeringMode === "scaleMode" ? fingerData.subject?.json?.full : fingerData.subject?.json?.full1} />}
 
                     {rs.map((key: number | string, index: number) => {

+ 2 - 2
src/view/fingering/fingering-config.ts

@@ -407,7 +407,7 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
       return {
         name: "trumpet",
         direction: "transverse",
-        height: "1.6rem",
+        height: "2.4rem",
         scaleData: {
           scale: "0.8",
           offset: "3.64rem"
@@ -427,7 +427,7 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
       return {
         name: "trombone",
         direction: "transverse",
-        height: "1.6rem",
+        height: "2.4rem",
         scaleData: {
           scale: "0.8",
           offset: "3.64rem"

+ 6 - 0
src/view/fingering/index.module.less

@@ -66,6 +66,12 @@
   }
 }
 
+.speImgs {
+  &>img {
+    height: inherit;
+  }
+}
+
 .rightContent {
   display: flex;
   flex-direction: column;

+ 1 - 1
src/view/fingering/index.tsx

@@ -57,7 +57,7 @@ export default defineComponent({
         <>
           {state.fingeringInfo.direction === "transverse" ? (
             <div onClick={() => doubeClick()} class={[styles.fingeringContainer]}>
-              <div class={styles.imgs}>
+              <div class={[styles.imgs, state.fingeringInfo.name === 'trombone' && styles.speImgs]}>
                 <img class="driver-7" src={fingerData.subject?.json?.full} />
                 {rs.map((key: number | string, index: number) => {
                   const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);

+ 1 - 1
src/view/follow-practice/index.tsx

@@ -28,7 +28,7 @@ export const followData = reactive({
 
 // 记录跟练时长
 const handleRecord = (total: number) => {
-	if (query.isCbs) return
+	if (query.isCbs || state.systemType === 'web') return
 	if (total < 0) total = 0;
 	const totalTime = total / 1000;
 

+ 12 - 29
src/view/plugins/toggleMusicSheet/choosePartName/index.module.less

@@ -28,16 +28,23 @@
     padding: 36px 20px 12px 20px;
     .pickerBox{
       width: 100%;
-      height: calc(100% - 40px);
+      height: calc(100% - 52px);
+      margin-bottom: 12px;
       display: flex;
       flex-direction: column;
-      overflow: hidden;
+      overflow-y: auto;
+      &::-webkit-scrollbar {
+          width: 0;
+          display: none;
+      }
       .titCon{
         display: flex;
         align-items: center;
-        margin-top: 10px;
-        &:first-child{
-          margin-top: 0;
+        padding: 10px 0;
+        &.stickyTit{
+          position: sticky;
+          top: 0;
+          background-color: #fff;
         }
         .tit{
           font-weight: 600;
@@ -54,30 +61,6 @@
         }
       }
       .content{
-        margin-top: 10px;
-        &.sheetCon{
-          flex-grow: 1;
-          overflow: hidden;
-          position: relative;
-          /* 解决iphonex 不能滚动 */
-          .boxCon{
-            position: absolute;
-            left: 0;
-            top: 0;
-            bottom: 0;
-            right: 0;
-            overflow: hidden;
-          }
-          .con{
-            width: 100%;
-            height: calc(100% - 4px);
-            overflow-y: auto;
-            &::-webkit-scrollbar {
-                width: 0;
-                display: none;
-            }
-          }
-        }
         .selBtn{
           width: 100%;
           height: 34px;

+ 7 - 11
src/view/plugins/toggleMusicSheet/choosePartName/index.tsx

@@ -84,23 +84,19 @@ export default defineComponent({
                   </div>
                 </>
             }
-            <div class={styles.titCon}>
+            <div class={[styles.titCon, styles.stickyTit]}>
               <div class={styles.tit}>选择声部</div>
               {
                 state.modeType === 'practise' && 
                 <div class={styles.tips}>(最多可选4个)</div>
               }
             </div>
-            <div class={[styles.content, styles.sheetCon]}>
-              <div class={styles.boxCon}>
-                <div class={styles.con}>
-                  {
-                    props.partListNames.map((item: any)=>{
-                      return <div class={[styles.selBtn,selValues.value.includes(item.value) && styles.active]} onClick={()=>{hanldeSelSheet(item.value)}}>{item.text}</div>
-                    })
-                  }
-                </div>
-              </div>
+            <div class={[styles.content]}>
+              {
+                props.partListNames.map((item: any)=>{
+                  return <div class={[styles.selBtn,selValues.value.includes(item.value) && styles.active]} onClick={()=>{hanldeSelSheet(item.value)}}>{item.text}</div>
+                })
+              }
             </div>
           </div>
           <div class={styles.btnCon}>

+ 9 - 9
src/view/selection/index.module.less

@@ -54,8 +54,8 @@
     position: absolute;
     height: 120%;
     background-color: rgba(45, 199, 170, 1);
-    min-height: 40px;
-    height: 40px;
+    min-height: 60PX;
+    height: 60PX;
     top: 50%;
     // width: 14PX;
     width: 2PX !important;
@@ -308,7 +308,7 @@
                 left: 50%;
                 top: 50%;
                 width: 2PX;
-                height: 40px;
+                height: 60PX;
                 transform: translate(-50%, -50%);
                 background: #2DC7AA;
             }
@@ -353,33 +353,33 @@
 
 .middleZoom {
     .line {
-        height: 50px;
+        height: 70PX;
     }
     :global {
         .node-dot::before{
-            height: 50px;
+            height: 70PX;
         }
     }
 }
 
 .bigZoom {
     .line {
-        height: 60px;
+        height: 80PX;
     }
     :global {
         .node-dot::before{
-            height: 60px;
+            height: 80PX;
         }
     }
 }
 
 .largeZoom {
     .line {
-        height: 70px;
+        height: 90PX;
     }
     :global {
         .node-dot::before{
-            height: 70px;
+            height: 90PX;
         }
     }
 }

+ 10 - 5
src/view/selection/index.tsx

@@ -12,6 +12,7 @@ import IntonationDown from "./imgs/pitchLow.png"
 import IntonationUp from "./imgs/pitchHigh.png"
 import MultipleRestMeasures from "./multipleRestMeasures"
 import { browser } from "../../utils";
+import { transform } from "lodash";
 
 export default defineComponent({
 	name: "selection",
@@ -51,18 +52,18 @@ export default defineComponent({
 					staveBox: null as any,
 				};
 				if (!notesList.includes(item.noteId)) {
-					let staveBbox: any = {};
+					let staveBbox: any = {}, customBgBox: any = {};
 					if (item.stave?.attrs?.id) {
 						const staveEle = document.querySelector(`#${item.stave.attrs.id}`);
 						staveBbox = staveEle?.parentElement?.parentElement?.getBoundingClientRect?.() || {
 							x: 0,
 							width: 0,
 						};
+						customBgBox = staveEle?.querySelector('.vf-custom-bg')?.getBoundingClientRect() || { y: 0, height: 0 }
 						// console.log("🚀 ~ staveBbox:", staveBbox.height)
 					}
 					if (item.svgElement) {
 						const noteEle = document.querySelector(`#vf-${item.svgElement?.attrs?.id}`);
-		
 						if (noteEle) {
 							const noteBbox = noteEle.getBoundingClientRect?.() || { x: 0, width: 0 };
 							if (state.musicRenderType !== EnumMusicRenderType.staff) {
@@ -88,14 +89,16 @@ export default defineComponent({
 								}
 								
 							} else {
+								const needTransY = -(staveBbox.height - customBgBox.height) / 2 + "px";
 								noteItem.bbox = {
 									left: noteBbox.x - parentLeft - noteBbox.width / 4 + "px",
-									top: staveBbox.y - parentTop + "px",
+									top: customBgBox.y ? customBgBox.y - parentTop + "px" : staveBbox.y - parentTop + "px",
 									width: noteBbox.width * 1.5 + "px",
 									height: staveBbox.height + "px",
 									x: item.bbox?.x,
 									y: item.bbox?.y,
-									originWidth: item.bbox?.width
+									originWidth: item.bbox?.width,
+									transform: `translateY(${needTransY})`
 								};
 							}
 							
@@ -219,8 +222,10 @@ export default defineComponent({
 						const currItem = selectData.staves.find(stave => {
 							return stave.MeasureNumberXML === item.MeasureNumberXML	
 						})
+						// 获取stave里面vf-custom-bg的位置坐标,才是准确的坐标
+						const currBgX = document.getElementById(currItem.stave.attrs.id)?.querySelector('.vf-custom-bg')?.getBoundingClientRect()?.x || 0;
 						return currItem && {
-							left: currItem.staveBox.left,
+							left: currBgX ? currBgX + 'px' : currItem.staveBox.left,
 							top: currItem.staveBox.top,
 							height: selectData.measureHeight + 'px'  // 小节的高度
 						}

File diff suppressed because it is too large
+ 1 - 0
stats.html


Some files were not shown because too many files changed in this diff