lex-xin 3 月之前
父節點
當前提交
ba2acc8148
共有 100 個文件被更改,包括 1605 次插入62 次删除
  1. 1 0
      dist/assets/deep-clone-4101bd24.js
  2. 0 0
      dist/assets/deep-clone-legacy-b2a18f4b.js
  3. 0 0
      dist/assets/function-call-50f64d43.js
  4. 0 0
      dist/assets/function-call-legacy-b04ec475.js
  5. 二進制
      dist/assets/icon-videobg-2414ec8d.png
  6. 1 0
      dist/assets/index-04905b7e.js
  7. 0 0
      dist/assets/index-129180e7.js
  8. 1 0
      dist/assets/index-138057eb.js
  9. 0 0
      dist/assets/index-1897671a.js
  10. 1 0
      dist/assets/index-21b481bf.js
  11. 0 0
      dist/assets/index-2b5b98f6.css
  12. 1 0
      dist/assets/index-31181024.js
  13. 0 0
      dist/assets/index-3929a7d2.js
  14. 5 0
      dist/assets/index-3d4db582.js
  15. 0 0
      dist/assets/index-3e8d3a45.js
  16. 0 0
      dist/assets/index-46a8a5dd.js
  17. 1 0
      dist/assets/index-4ccc8ba3.js
  18. 0 0
      dist/assets/index-4d5eca6b.css
  19. 1 0
      dist/assets/index-5e07d0a8.js
  20. 0 0
      dist/assets/index-5f87e684.js
  21. 0 0
      dist/assets/index-64f6a1ad.js
  22. 1 0
      dist/assets/index-66d06cda.js
  23. 0 0
      dist/assets/index-7239322e.js
  24. 0 0
      dist/assets/index-8516e065.css
  25. 1 0
      dist/assets/index-873836ea.js
  26. 0 0
      dist/assets/index-9a796eeb.css
  27. 0 0
      dist/assets/index-a6fcfa76.js
  28. 0 0
      dist/assets/index-b15dc522.js
  29. 0 0
      dist/assets/index-b9f3e212.js
  30. 0 0
      dist/assets/index-bad91848.js
  31. 0 0
      dist/assets/index-caf6b7c2.css
  32. 4 0
      dist/assets/index-e9916235.js
  33. 1 0
      dist/assets/index-f8b886f3.js
  34. 0 0
      dist/assets/index-legacy-1efd2903.js
  35. 0 0
      dist/assets/index-legacy-4d535398.js
  36. 0 0
      dist/assets/index-legacy-59ef14a9.js
  37. 0 0
      dist/assets/index-legacy-6175aca1.js
  38. 2 0
      dist/assets/index-legacy-61c32217.js
  39. 0 0
      dist/assets/index-legacy-6d32f895.js
  40. 0 0
      dist/assets/index-legacy-8ca433ad.js
  41. 0 0
      dist/assets/index-legacy-90be1b77.js
  42. 0 0
      dist/assets/index-legacy-95ce45d9.js
  43. 1 0
      dist/assets/index-legacy-98da5527.js
  44. 4 0
      dist/assets/index-legacy-9e51bd4d.js
  45. 0 0
      dist/assets/index-legacy-a9e6783a.js
  46. 5 0
      dist/assets/index-legacy-ad6c3bda.js
  47. 3 0
      dist/assets/index-legacy-af628324.js
  48. 0 0
      dist/assets/index-legacy-cd45e0d7.js
  49. 0 0
      dist/assets/index-legacy-cddbf7b3.js
  50. 0 0
      dist/assets/index-legacy-d3a0abcd.js
  51. 1 0
      dist/assets/index-legacy-d4421eaf.js
  52. 0 0
      dist/assets/index-legacy-d66a57b4.js
  53. 0 0
      dist/assets/index-legacy-d9357148.js
  54. 0 0
      dist/assets/index-legacy-da4b7441.js
  55. 1 0
      dist/assets/index-legacy-dd5b5ca9.js
  56. 0 0
      dist/assets/index-legacy-f5627ce0.js
  57. 0 0
      dist/assets/login-930134f9.js
  58. 0 0
      dist/assets/login-legacy-cd23aa66.js
  59. 1 0
      dist/assets/tcplayer.min-b13f9cdd.js
  60. 1 0
      dist/assets/tcplayer.min-d63b8f89.js
  61. 1 0
      dist/assets/tcplayer.min-legacy-88d15d77.js
  62. 1 0
      dist/assets/tcplayer.min-legacy-97623f23.js
  63. 1 0
      dist/assets/use-tab-status-e5fea658.js
  64. 1 0
      dist/assets/use-tab-status-legacy-4f587a47.js
  65. 9 0
      dist/index.html
  66. 1 0
      src/components/TheVip/index.module.less
  67. 1 0
      src/components/TheVip/index.tsx
  68. 8 1
      src/components/globalTools/index.tsx
  69. 2 0
      src/components/o-guide/index.module.less
  70. 二進制
      src/components/o-search/images/icon_search.png
  71. 94 0
      src/components/o-search/index.module.less
  72. 109 0
      src/components/o-search/index.tsx
  73. 19 0
      src/helpers/validate.ts
  74. 8 0
      src/router/index.ts
  75. 134 5
      src/views/choose-homework/music-list/index.module.less
  76. 228 27
      src/views/choose-homework/music-list/index.tsx
  77. 二進制
      src/views/courseList/image/icon_search.png
  78. 30 3
      src/views/courseList/index.module.less
  79. 20 6
      src/views/courseList/index.tsx
  80. 151 0
      src/views/courseListSearch/child-node.tsx
  81. 二進制
      src/views/courseListSearch/image/icon-arrow-down.png
  82. 二進制
      src/views/courseListSearch/image/icon-arrow-up.png
  83. 二進制
      src/views/courseListSearch/image/icon-image.png
  84. 二進制
      src/views/courseListSearch/image/icon-menu.png
  85. 二進制
      src/views/courseListSearch/image/icon-song.png
  86. 二進制
      src/views/courseListSearch/image/icon-video.png
  87. 138 0
      src/views/courseListSearch/index.module.less
  88. 216 0
      src/views/courseListSearch/index.tsx
  89. 36 3
      src/views/coursewarePlay/component/courseware-tips/index.module.less
  90. 5 1
      src/views/coursewarePlay/component/courseware-tips/index.tsx
  91. 1 1
      src/views/coursewarePlay/component/courseware-type/index.module.less
  92. 1 1
      src/views/coursewarePlay/component/courseware-type/index.tsx
  93. 2 4
      src/views/coursewarePlay/component/musicScore.tsx
  94. 14 0
      src/views/coursewarePlay/component/point.module.less
  95. 311 0
      src/views/coursewarePlay/component/points-search.tsx
  96. 二進制
      src/views/coursewarePlay/component/tips/icon-close.png
  97. 19 2
      src/views/coursewarePlay/component/tips/index.module.less
  98. 1 1
      src/views/coursewarePlay/component/tools/pen.module.less
  99. 2 2
      src/views/coursewarePlay/component/tools/pen.tsx
  100. 3 5
      src/views/coursewarePlay/component/video-play.tsx

+ 1 - 0
dist/assets/deep-clone-4101bd24.js

@@ -0,0 +1 @@
+import{y as e,E as a,d as t,I as o,r as s,af as r,a1 as l,n,ab as c,j as i,at as f,az as d,a as u,U as p,a7 as b,ar as g,W as m,ag as w,w as y}from"./index-b9f3e212.js";const[h,v]=e("notice-bar"),k=y(t({name:h,props:{text:String,mode:String,color:String,delay:a(1),speed:a(60),leftIcon:String,wrapable:Boolean,background:String,scrollable:{type:Boolean,"default":null}},emits:["close","replay"],setup(e,{emit:a,slots:t}){let y,h=0,k=0;const x=o(),j=o(),S=s({show:!0,offset:0,duration:0}),I=t=>{"closeable"===e.mode&&(S.show=!1,a("close",t))},A=()=>{if(t["right-icon"])return t["right-icon"]();const a="closeable"===e.mode?"cross":"link"===e.mode?"arrow":void 0;return a?u(p,{name:a,"class":v("right-icon"),onClick:I},null):void 0},T=()=>{S.offset=h,S.duration=0,m((()=>{g((()=>{S.offset=-k,S.duration=(k+h)/+e.speed,a("replay")}))}))},B=()=>{const a=!1===e.scrollable&&!e.wrapable,o={transform:S.offset?"translateX(".concat(S.offset,"px)"):"",transitionDuration:"".concat(S.duration,"s")};return u("div",{ref:x,role:"marquee","class":v("wrap")},[u("div",{ref:j,style:o,"class":[v("content"),{"van-ellipsis":a}],onTransitionend:T},[t["default"]?t["default"]():e.text])])},E=()=>{const{delay:a,speed:t,scrollable:o}=e,s=w(a)?1e3*+a:0;h=0,k=0,S.offset=0,S.duration=0,clearTimeout(y),y=setTimeout((()=>{if(!x.value||!j.value||!1===o)return;const e=b(x).width,a=b(j).width;(o||a>e)&&g((()=>{h=e,k=a,S.offset=-k,S.duration=k/+t}))}),s)};return r(E),l(E),n("pageshow",E),c({reset:E}),i((()=>[e.text,e.scrollable]),E),()=>{const{color:a,wrapable:o,background:s}=e;return f(u("div",{role:"alert","class":v({wrapable:o}),style:{color:a,background:s}},[t["left-icon"]?t["left-icon"]():e.leftIcon?u(p,{"class":v("left-icon"),name:e.leftIcon},null):void 0,B(),A()]),[[d,S.show]])}}})),x=e=>{if(null===e)return null;const a=Object.assign({},e);return Object.keys(a).forEach((t=>a[t]="object"==typeof e[t]?x(e[t]):e[t])),Array.isArray(e)?(a.length=e.length,Array.from(a)):a};export{k as N,x as d};

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/deep-clone-legacy-b2a18f4b.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/function-call-50f64d43.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/function-call-legacy-b04ec475.js


二進制
dist/assets/icon-videobg-2414ec8d.png


+ 1 - 0
dist/assets/index-04905b7e.js

@@ -0,0 +1 @@
+import{y as o,d as a,I as r,ay as e,c as l,z as s,ag as i,j as n,_ as t,a0 as d,o as c,L as u,a as v,A as g,G as f,D as h,at as m,bc as p,H as y,U as w,w as b}from"./index-b9f3e212.js";const[z,L]=o("image"),S=b(a({name:z,props:{src:String,alt:String,fit:String,position:String,round:Boolean,block:Boolean,width:g,height:g,radius:g,lazyLoad:Boolean,iconSize:g,showError:f,errorIcon:h("photo-fail"),iconPrefix:String,showLoading:f,loadingIcon:h("photo")},emits:["load","error"],setup(o,{emit:a,slots:g}){const f=r(!1),h=r(!0),b=r(),{$Lazyload:z}=e().proxy,S=l((()=>{const a={width:s(o.width),height:s(o.height)};return i(o.radius)&&(a.overflow="hidden",a.borderRadius=s(o.radius)),a}));n((()=>o.src),(()=>{f.value=!1,h.value=!0}));const x=o=>{h.value&&(h.value=!1,a("load",o))},I=()=>{const o=new Event("load");Object.defineProperty(o,"target",{value:b.value,enumerable:!0}),x(o)},j=o=>{f.value=!0,h.value=!1,a("error",o)},P=(a,r,e)=>e?e():v(w,{name:a,size:o.iconSize,"class":r,classPrefix:o.iconPrefix},null),$=()=>{if(f.value||!o.src)return;const a={alt:o.alt,"class":L("img"),style:{objectFit:o.fit,objectPosition:o.position}};return o.lazyLoad?m(v("img",y({ref:b},a),null),[[p("lazy"),o.src]]):v("img",y({ref:b,src:o.src,onLoad:x,onError:j},a),null)},E=({el:o})=>{const a=()=>{o===b.value&&h.value&&I()};b.value?a():u(a)},k=({el:o})=>{o!==b.value||f.value||j()};return z&&t&&(z.$on("loaded",E),z.$on("error",k),d((()=>{z.$off("loaded",E),z.$off("error",k)}))),c((()=>{u((()=>{var a;(null==(a=b.value)?void 0:a.complete)&&!o.lazyLoad&&I()}))})),()=>{var a;return v("div",{"class":L({round:o.round,block:o.block}),style:S.value},[$(),h.value&&o.showLoading?v("div",{"class":L("loading")},[P(o.loadingIcon,L("loading-icon"),g.loading)]):f.value&&o.showError?v("div",{"class":L("error")},[P(o.errorIcon,L("error-icon"),g.error)]):void 0,null==(a=g["default"])?void 0:a.call(g)])}}}));export{S as I};

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-129180e7.js


文件差異過大導致無法顯示
+ 1 - 0
dist/assets/index-138057eb.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-1897671a.js


+ 1 - 0
dist/assets/index-21b481bf.js

@@ -0,0 +1 @@
+import{y as t,d as s,a as e,F as i,G as a,H as l,bp as r,ah as n,w as o}from"./index-b9f3e212.js";const[d,p]=t("cell-group"),u=o(s({name:d,inheritAttrs:!1,props:{title:String,inset:Boolean,border:a},setup(t,{slots:s,attrs:a}){const o=()=>{var i;return e("div",l({"class":[p({inset:t.inset}),{[n]:t.border&&!t.inset}]},a,r()),[null==(i=s["default"])?void 0:i.call(s)])};return()=>t.title||s.title?e(i,null,[e("div",{"class":p("title",{inset:t.inset})},[s.title?s.title():t.title]),o()]):o()}}));export{u as C};

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-2b5b98f6.css


文件差異過大導致無法顯示
+ 1 - 0
dist/assets/index-31181024.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-3929a7d2.js


+ 5 - 0
dist/assets/index-3d4db582.js

@@ -0,0 +1,5 @@
+<<<<<<<< HEAD:dist/assets/index-e9916235.js
+import{d as a,a as s}from"./index-d661cbe3.js";const i=""+new URL("loading-9729222e.gif",import.meta.url).href,o="_loading_xbdvm_1",e=a({name:"o-loading",setup:()=>()=>s("div",{"class":o},[s("img",{"class":o,src:i},null)])});export{e as O};
+========
+import{d as a,a as s}from"./index-b9f3e212.js";const i=""+new URL("loading-9729222e.gif",import.meta.url).href,o="_loading_xbdvm_1",e=a({name:"o-loading",setup:()=>()=>s("div",{"class":o},[s("img",{"class":o,src:i},null)])});export{e as O};
+>>>>>>>> iteration-20241028-member:dist/assets/index-3d4db582.js

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-3e8d3a45.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-46a8a5dd.js


+ 1 - 0
dist/assets/index-4ccc8ba3.js

@@ -0,0 +1 @@
+import{I as e,b6 as t,j as n,b7 as a,b8 as o,b9 as u}from"./index-b9f3e212.js";function c(e){return!!a()&&(o(e),!0)}function i(e){return"function"==typeof e?e():u(e)}const s="undefined"!=typeof window&&"undefined"!=typeof document,l=Object.prototype.toString,r=e=>"[object Object]"===l.call(e),f=()=>{};function m(a,o=1e3,u={}){const{immediate:l=!0,immediateCallback:r=!1}=u;let f=null;const m=e(!1);function d(){f&&(clearInterval(f),f=null)}function b(){m.value=!1,d()}function p(){const e=i(o);e<=0||(m.value=!0,r&&a(),d(),f=setInterval(a,e))}return l&&s&&p(),(t(o)||"function"==typeof o)&&c(n(o,(()=>{m.value&&s&&p()}))),c(b),{isActive:m,pause:b,resume:p}}function d(t=1e3,n={}){const{controls:a=!1,immediate:o=!0,callback:u}=n,c=e(0),i=()=>c.value+=1,s=m(u?()=>{i(),u(c.value)}:i,t,{immediate:o});return a?{counter:c,reset:()=>{c.value=0},...s}:c}export{m as a,r as b,i as c,s as i,f as n,c as t,d as u};

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-4d5eca6b.css


+ 1 - 0
dist/assets/index-5e07d0a8.js

@@ -0,0 +1 @@
+import{t as e,i as n,n as o,b as a,c as t}from"./index-4ccc8ba3.js";import{c as i,j as r,I as s,ay as u,o as v}from"./index-b9f3e212.js";function l(e){var n;const o=t(e);return null!=(n=null==o?void 0:o.$el)?n:o}const c=n?window:void 0;function d(...n){let i,s,u,v;if("string"==typeof n[0]||Array.isArray(n[0])?([s,u,v]=n,i=c):[i,s,u,v]=n,!i)return o;Array.isArray(s)||(s=[s]),Array.isArray(u)||(u=[u]);const d=[],f=()=>{d.forEach((e=>e())),d.length=0},p=r((()=>[l(i),t(v)]),(([e,n])=>{if(f(),!e)return;const o=a(n)?{...n}:n;d.push(...s.flatMap((n=>u.map((a=>{return i=n,r=a,s=o,(t=e).addEventListener(i,r,s),()=>t.removeEventListener(i,r,s);var t,i,r,s})))))}),{immediate:!0,flush:"post"}),w=()=>{p(),f()};return e(w),w}function f(e){const n=function(){const e=s(!1);return u()&&v((()=>{e.value=!0})),e}();return i((()=>(n.value,Boolean(e()))))}function p(n,o,a={}){const{window:t=c,...s}=a;let u;const v=f((()=>t&&"ResizeObserver"in t)),d=()=>{u&&(u.disconnect(),u=void 0)},p=i((()=>Array.isArray(n)?n.map((e=>l(e))):[l(n)])),w=r(p,(e=>{if(d(),v.value&&t){u=new ResizeObserver(o);for(const n of e)n&&u.observe(n,s)}}),{immediate:!0,flush:"post",deep:!0}),y=()=>{d(),w()};return e(y),{isSupported:v,stop:y}}function w(e={}){const{window:n=c}=e,o=null==n?void 0:n.navigator,a=f((()=>o&&"connection"in o)),t=s(!0),i=s(!1),r=s(void 0),u=s(void 0),v=s(void 0),l=s(void 0),p=s(void 0),w=s(void 0),y=s("unknown"),m=a.value&&o.connection;function A(){o&&(t.value=o.onLine,r.value=t.value?void 0:Date.now(),u.value=t.value?Date.now():void 0,m&&(v.value=m.downlink,l.value=m.downlinkMax,w.value=m.effectiveType,p.value=m.rtt,i.value=m.saveData,y.value=m.type))}return n&&(d(n,"offline",(()=>{t.value=!1,r.value=Date.now()})),d(n,"online",(()=>{t.value=!0,u.value=Date.now()}))),m&&d(m,"change",A,!1),A(),{isSupported:a,isOnline:t,saveData:i,offlineAt:r,onlineAt:u,downlink:v,downlinkMax:l,effectiveType:w,rtt:p,type:y}}export{p as a,w as u};

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-5f87e684.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-64f6a1ad.js


+ 1 - 0
dist/assets/index-66d06cda.js

@@ -0,0 +1 @@
+import{a as t}from"./index-5e07d0a8.js";import{d as e,r as o,I as s,o as i,j as a,a as f}from"./index-b9f3e212.js";const d=e({name:"m-sticky",props:{position:{type:String,"default":"top"},mode:{type:String,"default":"fixed"},offsetTop:{type:String,"default":"0px"},offsetBottom:{"default":"0px"},varName:{type:String,"default":"--header-height"}},emits:["barHeight"],setup(e,{slots:d,emit:p}){const l=o({divStyle:{},heightV:0,sectionStyle:{width:"100%",height:"auto",left:"0"}}),n=s(),c=s();return i((()=>{"top"===e.position?l.divStyle.top=e.offsetTop||"0px":l.divStyle.bottom=e.offsetBottom||"0px";try{t(c.value,(t=>{const o=t[0],{height:s}=o.contentRect;Math.abs(s-l.heightV)>1&&setTimeout((()=>{var t;t=s,l.sectionStyle.height="".concat(t,"px"),l.heightV=t,document.documentElement.style.setProperty(e.varName,"".concat(t,"px")),p("barHeight",t)}),10)}))}catch(o){}})),a((()=>e.offsetTop),(()=>{l.divStyle.top=e.offsetTop})),a((()=>e.offsetBottom),(()=>{l.divStyle.bottom=e.offsetBottom})),()=>f("div",{style:[l.sectionStyle],"class":"sticky"===e.mode&&"_sticky_4d2w6_1"},[f("div",{ref:n,"class":["van-sticky","fixed"===e.mode?"van-sticky--fixed":""],style:[l.divStyle,l.sectionStyle]},[f("div",{ref:c},[d["default"]&&d["default"]()])])])}});export{d as O};

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-7239322e.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-8516e065.css


+ 1 - 0
dist/assets/index-873836ea.js

@@ -0,0 +1 @@
+import{O as s}from"./index-66d06cda.js";import{d as i,a as t,O as e,p as a}from"./index-b9f3e212.js";import{I as o}from"./index-04905b7e.js";import"./index-5e07d0a8.js";import"./index-4ccc8ba3.js";const r=i({name:"classify-list",data:()=>({list:[],liveConfig:!1}),mounted(){const s=sessionStorage.getItem("musicScoreList");if(s){const i=JSON.parse(s);this.list=i}else this.$router.replace("/")},methods:{toDetail(s){this.$router.push({path:"/music-list/"+s.id,query:{...this.$route.query}})},goBack(){this.$router.push({path:"/",query:{...this.$route.query}})}},render(){return t("div",{"class":"_container_1askh_1"},[t(s,{position:"top"},{"default":()=>[t(e,{border:!1,isFixed:!1,backIconColor:"white"},null)]}),t("div",{"class":"_content_1askh_12"},[t("div",{"class":"_title_1askh_22"},[a("教材")]),t("div",{"class":"_items_1askh_38"},[this.list.map((s=>t("div",{key:s.id,onClick:()=>this.toDetail(s)},[t("div",{"class":"_inner_1askh_49"},[t(o,{src:s.coverImg,"class":"_img_1askh_53"},null),t("div",{"class":"van-ellipsis"},[s.name])])])))])])])}});export{r as default};

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-9a796eeb.css


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-a6fcfa76.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-b15dc522.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-b9f3e212.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-bad91848.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-caf6b7c2.css


+ 4 - 0
dist/assets/index-e9916235.js

@@ -1 +1,5 @@
+<<<<<<<< HEAD:dist/assets/index-e9916235.js
 import{d as a,a as s}from"./index-d661cbe3.js";const i=""+new URL("loading-9729222e.gif",import.meta.url).href,o="_loading_xbdvm_1",e=a({name:"o-loading",setup:()=>()=>s("div",{"class":o},[s("img",{"class":o,src:i},null)])});export{e as O};
+========
+import{d as a,a as s}from"./index-b9f3e212.js";const i=""+new URL("loading-9729222e.gif",import.meta.url).href,o="_loading_xbdvm_1",e=a({name:"o-loading",setup:()=>()=>s("div",{"class":o},[s("img",{"class":o,src:i},null)])});export{e as O};
+>>>>>>>> iteration-20241028-member:dist/assets/index-3d4db582.js

+ 1 - 0
dist/assets/index-f8b886f3.js

@@ -0,0 +1 @@
+import{y as l,a4 as e,an as a,d as i,aY as r,a as t,D as n,A as s,G as o,ao as c,ag as u,U as d,w as v}from"./index-b9f3e212.js";const[b,f]=l("cell"),g={tag:n("div"),icon:String,size:String,title:s,value:s,label:s,center:Boolean,isLink:Boolean,border:o,iconPrefix:String,valueClass:c,labelClass:c,titleClass:c,titleStyle:null,arrowDirection:String,required:{type:[Boolean,String],"default":null},clickable:{type:Boolean,"default":null}},p=v(i({name:b,props:e({},g,a),setup(l,{slots:e}){const a=r(),i=()=>{if(e.label||u(l.label))return t("div",{"class":[f("label"),l.labelClass]},[e.label?e.label():l.label])},n=()=>{var a;if(e.title||u(l.title)){const r=null==(a=e.title)?void 0:a.call(e);if(Array.isArray(r)&&0===r.length)return;return t("div",{"class":[f("title"),l.titleClass],style:l.titleStyle},[r||t("span",null,[l.title]),i()])}},s=()=>{const a=e.value||e["default"];if(a||u(l.value))return t("div",{"class":[f("value"),l.valueClass]},[a?a():t("span",null,[l.value])])},o=()=>{if(e["right-icon"])return e["right-icon"]();if(l.isLink){const e=l.arrowDirection&&"right"!==l.arrowDirection?"arrow-".concat(l.arrowDirection):"arrow";return t(d,{name:e,"class":f("right-icon")},null)}};return()=>{var i;const{tag:r,size:c,center:u,border:v,isLink:b,required:g}=l,p=null!=(i=l.clickable)?i:b,y={center:u,required:!!g,clickable:p,borderless:!v};return c&&(y[c]=!!c),t(r,{"class":f(y),role:p?"button":void 0,tabindex:p?0:void 0,onClick:a},{"default":()=>{var a;return[e.icon?e.icon():l.icon?t(d,{name:l.icon,"class":f("left-icon"),classPrefix:l.iconPrefix},null):void 0,n(),s(),o(),null==(a=e.extra)?void 0:a.call(e)]}})}}}));export{p as C,g as c};

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-1efd2903.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-4d535398.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-59ef14a9.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-6175aca1.js


文件差異過大導致無法顯示
+ 2 - 0
dist/assets/index-legacy-61c32217.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-6d32f895.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-8ca433ad.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-90be1b77.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-95ce45d9.js


+ 1 - 0
dist/assets/index-legacy-98da5527.js

@@ -0,0 +1 @@
+System.register(["./index-legacy-4d535398.js"],(function(e,l){"use strict";var t,r,i,a,n,s,o,c,u,d,v,b,f;return{setters:[e=>{t=e.y,r=e.a4,i=e.an,a=e.d,n=e.aY,s=e.a,o=e.D,c=e.A,u=e.G,d=e.ao,v=e.ag,b=e.U,f=e.w}],execute:function(){const[l,g]=t("cell"),y=e("c",{tag:o("div"),icon:String,size:String,title:c,value:c,label:c,center:Boolean,isLink:Boolean,border:u,iconPrefix:String,valueClass:d,labelClass:d,titleClass:d,titleStyle:null,arrowDirection:String,required:{type:[Boolean,String],"default":null},clickable:{type:Boolean,"default":null}}),C=r({},y,i);var S=a({name:l,props:C,setup(e,{slots:l}){const t=n(),r=()=>{if(l.label||v(e.label))return s("div",{"class":[g("label"),e.labelClass]},[l.label?l.label():e.label])},i=()=>{var t;if(l.title||v(e.title)){const i=null==(t=l.title)?void 0:t.call(l);if(Array.isArray(i)&&0===i.length)return;return s("div",{"class":[g("title"),e.titleClass],style:e.titleStyle},[i||s("span",null,[e.title]),r()])}},a=()=>{const t=l.value||l["default"];if(t||v(e.value))return s("div",{"class":[g("value"),e.valueClass]},[t?t():s("span",null,[e.value])])},o=()=>{if(l["right-icon"])return l["right-icon"]();if(e.isLink){const l=e.arrowDirection&&"right"!==e.arrowDirection?`arrow-${e.arrowDirection}`:"arrow";return s(b,{name:l,"class":g("right-icon")},null)}};return()=>{var r;const{tag:n,size:c,center:u,border:d,isLink:v,required:f}=e,y=null!=(r=e.clickable)?r:v,C={center:u,required:!!f,clickable:y,borderless:!d};return c&&(C[c]=!!c),s(n,{"class":g(C),role:y?"button":void 0,tabindex:y?0:void 0,onClick:t},{"default":()=>{var t;return[l.icon?l.icon():e.icon?s(b,{name:e.icon,"class":g("left-icon"),classPrefix:e.iconPrefix},null):void 0,i(),a(),o(),null==(t=l.extra)?void 0:t.call(l)]}})}}});e("C",f(S))}}}));

+ 4 - 0
dist/assets/index-legacy-9e51bd4d.js

@@ -1 +1,5 @@
+<<<<<<<< HEAD:dist/assets/index-legacy-9e51bd4d.js
 System.register(["./index-legacy-b47bf050.js"],(function(e,t){"use strict";var n,i;return{setters:[e=>{n=e.d,i=e.a}],execute:function(){var o=document.createElement("style");o.textContent="._loading_xbdvm_1{display:flex;align-items:center;flex-direction:column;justify-content:center;font-size:.37333rem;height:1.46667rem!important}._loading_xbdvm_1 img{height:.8rem;width:3.2rem;margin-top:.53333rem;-o-object-fit:contain;object-fit:contain}._loading_xbdvm_1 ._des_xbdvm_15{margin-top:.53333rem}\n",document.head.appendChild(o);const a=""+new URL("loading-9729222e.gif",t.meta.url).href,m="_loading_xbdvm_1";e("O",n({name:"o-loading",setup:()=>()=>i("div",{"class":m},[i("img",{"class":m,src:a},null)])}))}}}));
+========
+System.register(["./index-legacy-4d535398.js"],(function(e,t){"use strict";var n,i;return{setters:[e=>{n=e.d,i=e.a}],execute:function(){var o=document.createElement("style");o.textContent="._loading_xbdvm_1{display:flex;align-items:center;flex-direction:column;justify-content:center;font-size:.37333rem;height:1.46667rem!important}._loading_xbdvm_1 img{height:.8rem;width:3.2rem;margin-top:.53333rem;-o-object-fit:contain;object-fit:contain}._loading_xbdvm_1 ._des_xbdvm_15{margin-top:.53333rem}\n",document.head.appendChild(o);const a=""+new URL("loading-9729222e.gif",t.meta.url).href,m="_loading_xbdvm_1";e("O",n({name:"o-loading",setup:()=>()=>i("div",{"class":m},[i("img",{"class":m,src:a},null)])}))}}}));
+>>>>>>>> iteration-20241028-member:dist/assets/index-legacy-ad6c3bda.js

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-a9e6783a.js


+ 5 - 0
dist/assets/index-legacy-ad6c3bda.js

@@ -0,0 +1,5 @@
+<<<<<<<< HEAD:dist/assets/index-legacy-9e51bd4d.js
+System.register(["./index-legacy-b47bf050.js"],(function(e,t){"use strict";var n,i;return{setters:[e=>{n=e.d,i=e.a}],execute:function(){var o=document.createElement("style");o.textContent="._loading_xbdvm_1{display:flex;align-items:center;flex-direction:column;justify-content:center;font-size:.37333rem;height:1.46667rem!important}._loading_xbdvm_1 img{height:.8rem;width:3.2rem;margin-top:.53333rem;-o-object-fit:contain;object-fit:contain}._loading_xbdvm_1 ._des_xbdvm_15{margin-top:.53333rem}\n",document.head.appendChild(o);const a=""+new URL("loading-9729222e.gif",t.meta.url).href,m="_loading_xbdvm_1";e("O",n({name:"o-loading",setup:()=>()=>i("div",{"class":m},[i("img",{"class":m,src:a},null)])}))}}}));
+========
+System.register(["./index-legacy-4d535398.js"],(function(e,t){"use strict";var n,i;return{setters:[e=>{n=e.d,i=e.a}],execute:function(){var o=document.createElement("style");o.textContent="._loading_xbdvm_1{display:flex;align-items:center;flex-direction:column;justify-content:center;font-size:.37333rem;height:1.46667rem!important}._loading_xbdvm_1 img{height:.8rem;width:3.2rem;margin-top:.53333rem;-o-object-fit:contain;object-fit:contain}._loading_xbdvm_1 ._des_xbdvm_15{margin-top:.53333rem}\n",document.head.appendChild(o);const a=""+new URL("loading-9729222e.gif",t.meta.url).href,m="_loading_xbdvm_1";e("O",n({name:"o-loading",setup:()=>()=>i("div",{"class":m},[i("img",{"class":m,src:a},null)])}))}}}));
+>>>>>>>> iteration-20241028-member:dist/assets/index-legacy-ad6c3bda.js

文件差異過大導致無法顯示
+ 3 - 0
dist/assets/index-legacy-af628324.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-cd45e0d7.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-cddbf7b3.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-d3a0abcd.js


+ 1 - 0
dist/assets/index-legacy-d4421eaf.js

@@ -0,0 +1 @@
+System.register(["./index-legacy-4d535398.js"],(function(t,e){"use strict";var s,i,r,n,l,a,o,u,c;return{setters:[t=>{s=t.y,i=t.d,r=t.a,n=t.F,l=t.G,a=t.H,o=t.bp,u=t.ah,c=t.w}],execute:function(){const[e,d]=s("cell-group"),v={title:String,inset:Boolean,border:l};var p=i({name:e,inheritAttrs:!1,props:v,setup(t,{slots:e,attrs:s}){const i=()=>{var i;return r("div",a({"class":[d({inset:t.inset}),{[u]:t.border&&!t.inset}]},s,o()),[null==(i=e["default"])?void 0:i.call(e)])};return()=>t.title||e.title?r(n,null,[r("div",{"class":d("title",{inset:t.inset})},[e.title?e.title():t.title]),i()]):i()}});t("C",c(p))}}}));

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-d66a57b4.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-d9357148.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-da4b7441.js


+ 1 - 0
dist/assets/index-legacy-dd5b5ca9.js

@@ -0,0 +1 @@
+System.register(["./index-legacy-1efd2903.js","./index-legacy-4d535398.js"],(function(t,e){"use strict";var o,i,s,d,n,a,f;return{setters:[t=>{o=t.a},t=>{i=t.d,s=t.r,d=t.I,n=t.o,a=t.j,f=t.a}],execute:function(){var e=document.createElement("style");e.textContent="._sticky_4d2w6_1{position:sticky;top:0;z-index:99}._white_4d2w6_6{background-color:#fff}._white_4d2w6_6>div{padding-top:.4rem;box-shadow:0 0 .26667rem rgba(216,216,216,.5)}\n",document.head.appendChild(e),t("O",i({name:"m-sticky",props:{position:{type:String,"default":"top"},mode:{type:String,"default":"fixed"},offsetTop:{type:String,"default":"0px"},offsetBottom:{"default":"0px"},varName:{type:String,"default":"--header-height"}},emits:["barHeight"],setup(t,{slots:e,emit:i}){const c=s({divStyle:{},heightV:0,sectionStyle:{width:"100%",height:"auto",left:"0"}}),l=d(),r=d();return n((()=>{"top"===t.position?c.divStyle.top=t.offsetTop||"0px":c.divStyle.bottom=t.offsetBottom||"0px";try{o(r.value,(e=>{const o=e[0],{height:s}=o.contentRect;Math.abs(s-c.heightV)>1&&setTimeout((()=>{(e=>{c.sectionStyle.height=`${e}px`,c.heightV=e,document.documentElement.style.setProperty(t.varName,`${e}px`),i("barHeight",e)})(s)}),10)}))}catch(e){}})),a((()=>t.offsetTop),(()=>{c.divStyle.top=t.offsetTop})),a((()=>t.offsetBottom),(()=>{c.divStyle.bottom=t.offsetBottom})),()=>f("div",{style:[c.sectionStyle],"class":"sticky"===t.mode&&"_sticky_4d2w6_1"},[f("div",{ref:l,"class":["van-sticky","fixed"===t.mode?"van-sticky--fixed":""],style:[c.divStyle,c.sectionStyle]},[f("div",{ref:r},[e["default"]&&e["default"]()])])])}}))}}}));

文件差異過大導致無法顯示
+ 0 - 0
dist/assets/index-legacy-f5627ce0.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/login-930134f9.js


文件差異過大導致無法顯示
+ 0 - 0
dist/assets/login-legacy-cd23aa66.js


文件差異過大導致無法顯示
+ 1 - 0
dist/assets/tcplayer.min-b13f9cdd.js


文件差異過大導致無法顯示
+ 1 - 0
dist/assets/tcplayer.min-d63b8f89.js


文件差異過大導致無法顯示
+ 1 - 0
dist/assets/tcplayer.min-legacy-88d15d77.js


文件差異過大導致無法顯示
+ 1 - 0
dist/assets/tcplayer.min-legacy-97623f23.js


+ 1 - 0
dist/assets/use-tab-status-e5fea658.js

@@ -0,0 +1 @@
+import{aP as o}from"./index-b9f3e212.js";const s=Symbol(),a=()=>o(s,null);export{s as T,a as u};

+ 1 - 0
dist/assets/use-tab-status-legacy-4f587a47.js

@@ -0,0 +1 @@
+System.register(["./index-legacy-4d535398.js"],(function(e,t){"use strict";var n;return{setters:[e=>{n=e.aP}],execute:function(){const t=e("T",Symbol());e("u",(()=>n(t,null)))}}}));

+ 9 - 0
dist/index.html

@@ -41,8 +41,13 @@
   <meta name="referrer" content="no-referrer" />
   <title>管乐迷</title>
   <script src="./flexible.js" charset="UTF-8"></script>
+<<<<<<< HEAD
   <script type="module" crossorigin src="./assets/index-d661cbe3.js"></script>
   <link rel="stylesheet" href="./assets/index-7b43a5c2.css">
+=======
+  <script type="module" crossorigin src="./assets/index-b9f3e212.js"></script>
+  <link rel="stylesheet" href="./assets/index-9a796eeb.css">
+>>>>>>> iteration-20241028-member
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};if(location.protocol!="file:"){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>
@@ -52,7 +57,11 @@
   
   <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="./assets/polyfills-legacy-9f17e47e.js"></script>
+<<<<<<< HEAD
   <script nomodule crossorigin id="vite-legacy-entry" data-src="./assets/index-legacy-b47bf050.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./assets/index-legacy-4d535398.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> iteration-20241028-member
 </body>
 
 </html>

+ 1 - 0
src/components/TheVip/index.module.less

@@ -5,6 +5,7 @@
   background: url('./top-bg.png') no-repeat top center #fff !important;
   background-size: contain !important;
   overflow: hidden;
+  border-radius: 20px !important;
 
   .iconClose {
     width: 18px;

+ 1 - 0
src/components/TheVip/index.tsx

@@ -27,6 +27,7 @@ export default defineComponent({
             if(state.vipFrom === "exercise") {
               postMessage({ api: 'back' });
             }
+            state.buyVipId = ''
           }}>取消</Button>
           <Button round type="primary" onClick={() => {
             gotoMemberCenter()

+ 8 - 1
src/components/globalTools/index.tsx

@@ -5,7 +5,7 @@ import {
   isPlay,
   isHidden
 } from './globalTools';
-import { defineComponent, onMounted, onUnmounted, ref, watch } from 'vue';
+import { defineComponent, onMounted, onUnmounted, ref } from 'vue';
 import { useRoute } from 'vue-router';
 import styles from './index.module.less';
 import iconTool from './images/icon-tool.png';
@@ -14,10 +14,13 @@ import iconWhiteboard from './images/icon-whiteboard.png';
 import gArrowRight from './images/g-arrow-right.png';
 import Pen from '@/views/coursewarePlay/component/tools/pen';
 import { nextTick } from 'process';
+import { useNetwork } from '@vueuse/core';
+import { showToast } from 'vant';
 
 export default defineComponent({
   name: 'globalTools',
   setup() {
+    const { isOnline } = useNetwork()
     const isMask = ref(false); // 是否显示遮罩层,为了处理云教练里面拖动不了的问题
     const route = useRoute();
     // watch(
@@ -37,6 +40,10 @@ export default defineComponent({
 
     function openType(type: 'note' | 'whiteboard') {
       if (isLock) return;
+      if(!isOnline.value) {
+        showToast('网络异常')
+        return
+      }
       if (type === 'note') {
         penShow.value = true;
 

+ 2 - 0
src/components/o-guide/index.module.less

@@ -26,6 +26,8 @@
     .van-tabs__line{
       bottom: .5rem;
       background: linear-gradient( 135deg, #79FECA 0%, #06CEC1 100%);
+      width: 16px;
+      height: 4px;
     }
   }
   .content {

二進制
src/components/o-search/images/icon_search.png


+ 94 - 0
src/components/o-search/index.module.less

@@ -0,0 +1,94 @@
+.m-search {
+  --van-cell-background-color: transparent;
+
+  input::placeholder {
+    color: var(--k-gray-4);
+    font-size: 13px;
+  }
+
+  :global {
+    .van-field__control {
+      -webkit-user-select: text !important;
+      user-select: text !important;
+      font-size: 13px;
+    }
+
+    .van-search__field {
+      background: transparent !important;
+      padding: 0 var(--van-padding-xs) 0 0;
+    }
+
+    .van-field__right-icon {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      padding-right: 4px;
+    }
+  }
+
+  // &.default {
+  //   :global {
+  //     .van-search__content {
+  //       background: #f8f9fc !important;
+  //     }
+  //   }
+  // }
+
+  // &.white {
+  //   :global {
+  //     .van-search__content {
+  //       background: #fff !important;
+  //     }
+  //   }
+  // }
+
+  // &.transparent {
+  //   :global {
+  //     .van-search__content {
+  //       background: rgba(255, 255, 255, 0.16);
+
+  //       input::placeholder {
+  //         color: #fff;
+  //       }
+
+  //       input {
+  //         color: #fff;
+  //       }
+
+  //       .van-field__clear {
+  //         color: #fff;
+  //       }
+  //     }
+  //   }
+  // }
+
+  .searchBtn {
+    width: 52px;
+    height: 25px;
+    padding: 0;
+    font-size: 13px;
+    font-weight: 500;
+    --van-button-mini-height: 28px;
+    --van-font-size-xs: 12px;
+    background: linear-gradient(to right, #55D8C4, #0BC4B7);
+    border: none;
+    font-weight: 600;
+
+    :global {
+      .van-button__text {
+        margin-top: 1px;
+      }
+    }
+  }
+
+  .leftIcon {
+    width: 14px;
+    height: 14px;
+    margin-top: -2px;
+
+    img {
+      width: 100%;
+      height: 100%;
+    }
+  }
+}

+ 109 - 0
src/components/o-search/index.tsx

@@ -0,0 +1,109 @@
+import { Button, Icon, Search } from 'vant';
+import { PropType, defineComponent, reactive, ref, watch } from 'vue';
+import styles from './index.module.less';
+import iconSearch from './images/icon_search.png';
+
+export default defineComponent({
+  name: 'm-search',
+  props: {
+    modelValue: {
+      type: String,
+      default: ''
+    },
+    shape: {
+      type: String as PropType<'round' | 'square'>,
+      default: 'round'
+    },
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    clearable: {
+      type: Boolean,
+      default: true
+    },
+    autofocus: {
+      // ios系统不支持
+      type: Boolean,
+      default: false
+    },
+    placeholder: {
+      type: String,
+      default: '请输入搜索关键词'
+    },
+    background: {
+      type: String,
+      default: '#fff'
+    },
+    searchIcon: {
+      type: String,
+      default: iconSearch
+    },
+    inputBackground: {
+      type: String,
+      default: '#f8f9fc'
+    }
+  },
+  emits: ['search', 'focus', 'blur'],
+  setup(props, { slots, emit, expose }) {
+    const forms = reactive({
+      search: props.modelValue || '',
+    });
+    const searchRef = ref()
+    watch(
+      () => props.modelValue,
+      () => {
+        forms.search = props.modelValue;
+      }
+    );
+
+    const searchBlur = () => {
+      searchRef.value?.blur()
+    }
+
+    expose({
+      searchBlur
+    })
+    return () => (
+      <Search
+        class={[styles['m-search'], styles[props.inputBackground]]}
+        style={{"--van-search-content-background": props.inputBackground}}
+        ref={searchRef}
+        shape={props.shape}
+        background={props.background}
+        placeholder={props.placeholder}
+        disabled={props.disabled}
+        autofocus={props.autofocus}
+        autocomplete="off"
+        clearable={props.clearable}
+        v-model={forms.search}
+        clearTrigger="always"
+        onClear={() => {
+          console.log('clear');
+          forms.search = '';
+          emit('search', forms.search);
+        }}
+        onFocus={() => emit('focus')}
+        onBlur={() => emit('blur', forms.search)}
+        onSearch={() => emit('search', forms.search)}>
+        {{
+          left: () => slots.left && slots.left(),
+          'left-icon': () => (
+            <Icon name={props.searchIcon} class={styles.leftIcon} />
+          ),
+          'right-icon': () => (
+            <Button
+              disabled={props.disabled}
+              class={styles.searchBtn}
+              round
+              type="primary"
+              size="mini"
+              onClick={() => emit('search', forms.search)}>
+              搜索
+            </Button>
+          )
+        }}
+      </Search>
+    );
+  }
+});

+ 19 - 0
src/helpers/validate.ts

@@ -15,6 +15,25 @@ export function vaildStudentUrl() {
   return returnUrl;
 }
 
+
+// 当前
+export function vaildCurrentUrl() {
+  const url = window.location.hostname;
+  let returnUrl = '';
+  if (/dev/.test(url)) {
+    // dev 环境
+    returnUrl = 'https://dev.gym.lexiaoya.cn';
+  } else if (/test/.test(url)) {
+    // dev 环境
+    returnUrl = 'https://test.gym.lexiaoya.cn';
+  } else {
+    // 默认线上环境
+    returnUrl = 'https://gym.lexiaoya.cn';
+  }
+  return returnUrl;
+}
+
+
 export function checkPhone(phone: string) {
   const phoneRule = /^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-7]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/;
   return phoneRule.test(phone);

+ 8 - 0
src/router/index.ts

@@ -24,6 +24,14 @@ const router: Router = createRouter({
           }
         },
         {
+          path: '/courseListSearch',
+          name: 'courseListSearch',
+          component: () => import('@/views/courseListSearch/index'),
+          meta: {
+            title: '搜索'
+          }
+        },
+        {
           path: '/coursewarePlay',
           name: 'coursewarePlay',
           component: () => import('@/views/coursewarePlay'),

+ 134 - 5
src/views/choose-homework/music-list/index.module.less

@@ -4,7 +4,7 @@
   overflow: hidden;
   :global{
     .van-sticky--fixed{
-      box-shadow: 5px 5px 5px 0 rgba(0, 0, 0, .03);
+      // box-shadow: 5px 5px 5px 0 rgba(0, 0, 0, .03);
     }
     .van-dropdown-menu__bar{
       box-shadow: none;
@@ -126,12 +126,22 @@
       display: flex;
       align-items: center;
       padding-right: 10px;
+      position: relative;
+      &::before {
+        content: "";
+        position: absolute;
+        right: -4px;
+        top: 20%;
+        width: 1PX;
+        height: 60%;
+        background: #f2f2f2;
+      }
       .van-cell{
         padding: 0.26667rem 0.42667rem;
       }
     }
     .van-dropdown-menu__title{
-      font-size: 12px;
+      font-size: 13px;
     }
     .van-dropdown-menu{
       height: 100%;
@@ -154,7 +164,7 @@
         }
 
         .van-field__control {
-            font-size: 16px;
+            font-size: 13px;
         }
       }
       .van-cell__value {
@@ -181,9 +191,9 @@
   }
   .search_btn {
     background: #01C1B5;
-    font-size: 14px;
+    font-size: 13px;
     color: #fff;
-    padding: 4px 9px;
+    padding: 4px 13px;
     border-radius: 15px;
   }
 }
@@ -298,3 +308,122 @@
 .notice{
   padding-left: 4PX!important;
 }
+
+.searchResult {
+  padding: 16px 13px 12px;
+  overflow: hidden;
+  border-bottom: 1px solid #f2f2f2;
+  position: relative;
+  &::before {
+    content: "";
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 10px;
+    background: rgb(248, 249, 252);
+  }
+  .searchTitle {
+    font-size: 15px;
+    color: #333333;
+    font-weight: 600;
+    line-height: 22px;
+  }
+}
+
+.radio-group {
+  display: flex;
+  margin-top: 12px;
+  margin-bottom: 7px;
+  flex-wrap: wrap;
+
+  .radio:first-child {
+    :global {
+      .van-radio__label {
+        margin-left: 0;
+      }
+    }
+  }
+}
+
+.radio {
+  :global {
+    .van-radio__icon {
+      display: none;
+    }
+
+    .van-tag--large {
+      width: 80px;
+      height: 32px;
+      font-size: 16px;
+      text-align: center;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+
+    .van-tag {
+      box-sizing: border-box;
+      width: 31% !important;
+    }
+
+    .van-tag--default {
+      color: #333333;
+      background: #f6f6f6;
+    }
+
+    .van-tag--primary {
+      background: #fff3f5;
+    }
+  }
+}
+
+.organ-radio {
+  :global {
+    .van-tag--large {
+      width: auto;
+      // padding: 0 2px;
+      margin-bottom: 10px;
+      margin-right: 10px;
+      font-size: 13px;
+      &:nth-child(3n+3) {
+        margin-right: 0px;
+      }
+    }
+  }
+}
+
+.resetting {
+  border-color: #dbdbdb !important;
+  color: #333333 !important;
+  margin-right: 15px;
+}
+
+.confirm,
+.resetting {
+  flex: 1;
+  :global {
+    .van-button__text {
+      font-size: 15px;
+    }
+  }
+}
+.btnGroup {
+  display: flex;
+  justify-content: space-around;
+  padding: 18px 13px;
+}
+
+.activeTag {
+  background: #F2FFFC !important;
+  color: #00B2A7 !important;
+}
+
+:global {
+  .van-dropdown-item--down {
+    // margin-top: 15px;
+  }
+  .van-dropdown-item__content {
+    border-radius: 0px 0px 20px 20px;
+  }
+}

+ 228 - 27
src/views/choose-homework/music-list/index.tsx

@@ -12,7 +12,9 @@ import {
   Popup,
   showLoadingToast,
   closeToast,
-  showToast
+  showToast,
+  Tag,
+  Button
 } from 'vant';
 import qs from 'query-string';
 import { find } from 'lodash';
@@ -53,7 +55,8 @@ export default defineComponent({
       selectedPartIndex: 0,
       activeRow: null as any,
       liveConfig: false,
-      musicScoreList: []
+      musicScoreList: [],
+      isAllSubject: false, // 是否默认选中的全部声部
     };
   },
   created() {
@@ -62,6 +65,15 @@ export default defineComponent({
     // console.log(this.liveConfig, " this.liveConfig");
     // console.log(searchParse, "parseSearch");
   },
+  computed: {
+    showSubjectOption() {
+      if ((appState.subjectOptions && appState.subjectOptions.length === 1) || this.$route.params.id == "43") {
+        return false
+      } else {
+        return true
+      }
+    },
+  },  
   async mounted() {
     await this.initList();
   },
@@ -122,6 +134,7 @@ export default defineComponent({
         const childClass = this.musicScoreList || [];
         // console.log(childClass);
         state.levelOptions = [
+          { value: this.$route.params.id, text: "全部级别" },
           ...childClass.map((item: any) => ({
             value: item.id,
             text: item.name,
@@ -135,7 +148,7 @@ export default defineComponent({
             if (active.childs) {
               // console.log(active, "showInfo");
               state.typeOptions = [
-                { value: 0, text: '全部' },
+                { value: 0, text: '全部类型' },
                 ...active.childs.map((item: any) => ({
                   value: item.id,
                   text: item.name
@@ -170,8 +183,8 @@ export default defineComponent({
               text: item.name
             }))
         ];
-
-        if (!appState.subjectId) {
+        // 非全部声部的情况,才需要默认选中第一个声部
+        if (!appState.subjectId && !this.isAllSubject) {
           const studentSubjectIds =
             baseState.platformType === 'TEACHER'
               ? baseState.user.data.subjectId
@@ -306,16 +319,24 @@ export default defineComponent({
       });
       const xmlParse = new DOMParser().parseFromString(res, 'text/xml');
       const parts = xmlParse.getElementsByTagName('part');
-      const firstMeasures = parts[0]?.getElementsByTagName('measure');
+      // 找到正确的part,妙极客的曲子有些无效的part需要过滤掉
+      const realPart = Array.from(parts).find((part: any) => part?.parentElement?.tagName !== 'system') || parts[0];
+      const firstMeasures = realPart?.getElementsByTagName('measure');
+      // 增加开始小节,结束小节数
+      const startMeasureNumber = firstMeasures[0]?.getAttribute('number') ? Number(firstMeasures[0]?.getAttribute('number')) : 0;
+      const endMeasureNumber = firstMeasures[firstMeasures.length-1]?.getAttribute('number') ? Number(firstMeasures[firstMeasures.length-1]?.getAttribute('number')) : firstMeasures.length;
       const body = {
         api: 'onAccompanySelectResult',
         content: {
           id: _id,
           name: row.name,
           noteLength: firstMeasures.length,
-          partIndex: this.selectedPartIndex + ''
+          partIndex: this.selectedPartIndex + '',
+          startMeasureNumber,
+          endMeasureNumber
         }
       };
+      // console.log('小节',body.content)
       postMessage(body);
       return;
       // }
@@ -447,7 +468,7 @@ export default defineComponent({
             border={false}
             isFixed={false}
             backIconColor="white"></OHeader>
-          {state.typeOptions ||
+          {/* {state.typeOptions ||
           (state.levelOptions && state.levelOptions.length > 0) ? (
             <DropdownMenu activeColor="#01C1B5">
               {state.levelOptions && state.levelOptions.length > 0 ? (
@@ -488,7 +509,7 @@ export default defineComponent({
                 />
               ) : null}
             </DropdownMenu>
-          ) : null}
+          ) : null} */}
           <Search
             class={[styles.search]}
             placeholder="请输入搜索关键词"
@@ -504,24 +525,204 @@ export default defineComponent({
                 <img class={styles.iconSearch} src={iconSearch} />
               ),
               label: () => {
-                return (
-                  <DropdownMenu
-                    activeColor="#01C1B5"
-                    onClick={(evt: MouseEvent) => {
-                      evt.preventDefault();
-                    }}>
-                    <DropdownItem
-                      class={styles.searchSelect}
-                      get-container="#app"
-                      modelValue={appState.subjectId}
-                      options={appState.subjectOptions}
-                      onChange={(val: any) => {
-                        appState.subjectId = val;
-                        this.onSearch();
-                      }}
-                    />
-                  </DropdownMenu>
-                );
+                if ((this.showSubjectOption && appState.subjectOptions && appState.subjectOptions.length > 2) || state.levelOptions?.length>1 || state.typeOptions?.length>1) {
+                  return (
+                    <DropdownMenu
+                      activeColor="#01C1B5"
+                      onClick={(evt: MouseEvent) => {
+                        evt.preventDefault();
+                      }}>
+                      {/* <DropdownItem
+                        class={styles.searchSelect}
+                        get-container="#app"
+                        modelValue={appState.subjectId}
+                        options={appState.subjectOptions}
+                        onChange={(val: any) => {
+                          appState.subjectId = val;
+                          this.onSearch();
+                        }}
+                      /> */}
+                      <DropdownItem
+                        teleport="body"
+                        title="筛选"
+                        ref="dropItem"
+                      >
+                        <div
+                          class={styles.searchResult}
+                          style={{
+                            maxHeight: '45vh',
+                            overflowY: 'auto'
+                          }}
+                        >
+                          {this.showSubjectOption && appState.subjectOptions && appState.subjectOptions.length > 2 && (
+                              <>
+                                <div class={styles.searchTitle}>
+                                  声部
+                                </div>
+                                <div
+                                  class={[
+                                    styles['radio-group'],
+                                    styles.radio,
+                                    styles['organ-radio']
+                                  ]}
+                                >
+                                  {appState.subjectOptions.map((subject: any) => {
+                                    const isActive =
+                                      subject.value === appState.subjectId
+                                    const type = isActive
+                                      ? 'primary'
+                                      : 'default'
+                                    return (
+                                      <Tag
+                                        size="large"
+                                        plain={isActive}
+                                        type={type}
+                                        round
+                                        class={isActive && styles.activeTag}
+                                        onClick={() => {
+                                          appState.subjectId = subject.value
+                                        }}
+                                      >
+                                        {subject.text}
+                                      </Tag>
+                                    )
+                                  })}
+                                </div>
+                              </>
+                            )}
+                          {state.levelOptions &&
+                            state.levelOptions
+                              .length > 1 && (
+                              <>
+                                <div class={styles.searchTitle}>
+                                  级别
+                                </div>
+                                <div
+                                  class={[
+                                    styles['radio-group'],
+                                    styles.radio,
+                                    styles['organ-radio']
+                                  ]}
+                                >
+                                  {state.levelOptions.map((subject: any) => {
+                                    const isActive =
+                                      subject.value === state.levelId
+                                    const type = isActive
+                                      ? 'primary'
+                                      : 'default'
+                                    return (
+                                      <Tag
+                                        size="large"
+                                        plain={isActive}
+                                        type={type}
+                                        round
+                                        class={isActive && styles.activeTag}
+                                        onClick={() => {
+                                          state.levelId = subject.value
+                                          state.typeId = 0;
+                                          const active = find(state.levelOptions, { value: subject.value });
+                                          if (active) {
+                                            if (active.childs && active.childs.length) {
+                                              state.typeOptions = [
+                                                { value: 0, text: "全部类型" },
+                                                ...active.childs.map((item: any) => ({
+                                                  value: item.id,
+                                                  text: item.name,
+                                                })),
+                                              ];
+                                            } else {
+                                              state.typeOptions = null;
+                                            }
+                                          }                                     
+                                        }}
+                                      >
+                                        {subject.text}
+                                      </Tag>
+                                    )
+                                  })}
+                                </div>
+                              </>
+                            )}
+                          {state.typeOptions &&
+                            state.typeOptions
+                              .length > 1 && (
+                              <>
+                                <div class={styles.searchTitle}>
+                                  类型
+                                </div>
+                                <div
+                                  class={[
+                                    styles['radio-group'],
+                                    styles.radio,
+                                    styles['organ-radio']
+                                  ]}
+                                >
+                                  {state.typeOptions.map((subject: any) => {
+                                    const isActive =
+                                      subject.value === state.typeId
+                                    const type = isActive
+                                      ? 'primary'
+                                      : 'default'
+                                    return (
+                                      <Tag
+                                        size="large"
+                                        plain={isActive}
+                                        type={type}
+                                        round
+                                        class={isActive && styles.activeTag}
+                                        onClick={() => {
+                                          state.typeId = subject.value
+                                        }}
+                                      >
+                                        {subject.text}
+                                      </Tag>
+                                    )
+                                  })}
+                                </div>
+                              </>
+                            )}
+                        </div>
+
+                        <div class={[styles.btnGroup]}>
+                          <Button
+                            class={styles.resetting}
+                            type="primary"
+                            plain
+                            round
+                            onClick={() => {
+                              if (this.showSubjectOption) {
+                                appState.subjectId = 0;
+                              }
+                              state.levelId = this.$route.params.id;
+                              state.typeId = 0;
+                              state.typeOptions = null;
+                            }}
+                          >
+                            重置
+                          </Button>
+
+                          <Button
+                            class={styles.confirm}
+                            type="primary"
+                            color="rgba(1, 193, 181, 1)"
+                            round
+                            block
+                            onClick={() => {
+                              (this.$refs.dropItem as any)?.toggle();
+                              // 如果手动选的全部声部,查询的时候不需要默认选中第一个声部
+                              this.isAllSubject = appState.subjectId === 0 ? true : false;
+                              this.onSearch();
+                            }}
+                          >
+                            确定
+                          </Button>
+                        </div>
+                      </DropdownItem>                       
+                    </DropdownMenu>
+                  );                  
+                } else {
+                  return null;
+                }
               },
               action: () => (
                 <span class={styles.search_btn} onClick={this.onSearch}>

二進制
src/views/courseList/image/icon_search.png


+ 30 - 3
src/views/courseList/index.module.less

@@ -18,7 +18,7 @@
     margin-right: 30px;
     border-radius: 2px;
     overflow: hidden;
-    box-shadow: 0px 2px 6px 0px rgba(221, 168, 133, 0.67);
+    box-shadow: 0px 2px 6px 0px rgba(168, 168, 168, .7);
     overflow: hidden;
     background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAABOFBMVEUAAAC0tLTT09PU1NTt7e3////T09P////T09P////T09P////X19f////U1NTU1NTT09PT09PU1NTU1NTV1dXT09PU1NTU1NTV1dXZ2dn+/v7R0dH////////KysrIyMjT09O0tLTU1NS0tLTU1NS0tLTT09PT09PT09PU1NTU1NTU1NTT09O2trbU1NTV1dXV1dXW1tbV1dXW1tbV1dXJycm4uLj///+0tLT///+0tLT////p6em0tLT4+Pj///+2trb///+1tbX///+0tLT////T09P5+fn+/v63t7e8vLz8/Pzl5eXW1tbBwcH39/fw8PDs7Ozb29v7+/vg4ODOzs65ubny8vLJycnp6enGxsbFxcW+vr62trb09PTY2NjLy8vCwsLn5+fi4uLS0tLu7u7Q0NDd3d02Mu/gAAAARHRSTlMAnPwvBfv07ODdw5AbGezmyrirl5B4aT0kDZyclTwsIPj48+Ta1tPS0LGhiIaEcGJgV05FNhMS7++8vKyslZRzc1ZWJRSpe/cAAALfSURBVFjD7djXcuIwGAVg1pTQAiT0Ekiy6b1v7whsA6b3EGAJu+//BstaiWNiCYGlXGTG55KBDzH6j2xjMmJET5ZdDivQFavDtTxLXlsCFFlam7HmiUxl49ftApRxYWkHLe3A0lZa2oqlAXUMGk/fHG9vpCnSk/pZNJ18m6aOWELRN1CmtbMI+jjNJH0Evc2GlhD0Bhu6h6DTjPIq6Pqonb8XXoCWmjKSHTCnpccp5ges6bHCZAW2dBc8JcOWLqjoPFu6oqLLr2bVQxX9h/GElBWmKDCmxSKAyXWYt1GE677rLtLGejsLcuOCQMI7lVFlsMjxJJUeW3bP+OSTskBJqcuSFppAFT4vsqMrYDrVAitazMHV8kBJs8WGzsPmNoRCFSj5fcuA7vJKvcQ8UJKrCNT0WH0mdEpASbFOSdfhyClvzagGsSzR0D14LHTSSho1/mkQaw39dB9u2vThCU8KQj1JtFiVt+z5ONSLmnoSaeszuia/+lfzAaGS09STQDum6SH/cOXX5rY9Xz0Rj6Sqy0YmjUzrbp56ah6kIT2AH8Pe4M5TT83jP6ThsnALmq+eiD8tlIt/G8POWU8FVNMNuXc8rnH4epJpOHg1jIivJ5mWcvLg4ZqMryeZhnOLm1hyPfF0C95R9PAcvp4jcSYNL7UDHEWuJ56GO46FyPXE0+/+/7Lhgs+ffU093yPoDwCAEcki1/Mjgv4BQFUkSeR6/jQh8gn0SQy5np9NqFi+CgSDWE9rwmJCJ/X9yxt9iSdisVji2y+TESNGXjiW6LU7FYkkzQ9JRiIp93XUoodyX12cBg/9qyvOHbvXxmUw4Wxe+45zZdV/GDy9uHJbZqPhk7jTjrTI4ezO+EkY8wUBW4Y6tgCSPvNxtDLnOzOhEw2HAvt7Hj2oZ28/EApHyRtpvjwPBY/8B5Ot9O1u2b2eTds6x8nr4tZtmx6vfWvXN9nCA/9RMHR+aZ5sohEji+YfnN0/51L6d+cAAAAASUVORK5CYII=');
     background-repeat: no-repeat;
@@ -71,11 +71,37 @@
   }
 }
 
+.periodHeader {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 20px 20px 0;
+  .searchGroup {
+    padding: 3px 10px 3px 7px;
+    border-radius: 19px;
+    border: 1px solid rgba(1,193,181,0.5);
+    font-size: 14px;
+    color: rgba(0,0,0,0.4);
+    line-height: 20px;
+    display: flex;
+    align-items: center;
+    cursor: pointer;
+    .iconSearch {
+      width: 20px;
+      height: 20px;
+      /deep/.van-icon__image {
+        margin: auto;
+        vertical-align: middle;
+      }
+    }
+  }
+}
+
 
 .periodTitle {
   display: flex;
   align-items: center;
-  padding: 20px 20px 0;
+  
 
   .pIcon {
     width: 20px;
@@ -202,6 +228,7 @@
 
 .courseDialog {
   width: 315px;
+  border-radius: 20px !important;
 
   :global {
     .van-dialog__header {
@@ -259,7 +286,7 @@
 }
 
 .btnGroup {
-  padding: 20px 25px calc(20px + env(safe-area-inset-bottom));
+  padding: 20px 25px 30px; // calc(20px + env(safe-area-inset-bottom));
   border-top: 1px solid #F2F2F2;
   background-color: #fff;
 }

+ 20 - 6
src/views/courseList/index.tsx

@@ -28,6 +28,7 @@ import {
 import iconCourse from './image/icon-course.png';
 import iconCachePoint from './image/icon-cache-point.png';
 import iconCourseLock from './image/icon-course-lock.png';
+import iconSearch from './image/icon_search.png'
 // import iconTip from './image/iconTip.png';
 import { browser } from '@/helpers/utils';
 import OEmpty from '@/components/o-empty';
@@ -328,10 +329,23 @@ export default defineComponent({
         <TransitionGroup name="van-fade">
           {!data.loading && (
             <>
-              <div key="periodTitle" class={styles.periodTitle}>
-                <img class={styles.pIcon} src={iconList} />
-                <div class={styles.pTitle}>课程列表</div>
-                <div class={styles.pNum}>共{data.list.length}课</div>
+              <div class={styles.periodHeader}>
+                <div key="periodTitle" class={styles.periodTitle}>
+                  <img class={styles.pIcon} src={iconList} />
+                  <div class={styles.pTitle}>课程列表</div>
+                  <div class={styles.pNum}>共{data.list.length}课</div>
+                </div>
+                <div class={styles.searchGroup} onClick={() => {
+                  router.push({
+                    path: '/courseListSearch',
+                    query: {
+                      id: route.query.id
+                    }
+                  })
+                }}>
+                  <img src={iconSearch} class={styles.iconSearch} />
+                  <span class={styles.searchContent}>搜索素材</span>
+                </div>
               </div>
 
               <div key="list" class={styles.periodList}>
@@ -426,7 +440,7 @@ export default defineComponent({
               <Button round block type="primary" onClick={() => {
                 handleShowVip(route.query.id as string, "LESSON")
               }}>
-                开通会员即可查看所有课件
+                开通会员即可查看课件
               </Button>
             </div>
           </OSticky>
@@ -442,7 +456,7 @@ export default defineComponent({
           <div class={styles.title}>下载提醒</div>
 
           <div class={styles.content}>
-            您尚未下载课件内容,为了更加流畅的学习体验,推荐您下载后观看课件
+            您尚未下载课件内容,为了更加流畅的学习体验,推荐您下载后观看。
           </div>
 
           <div class={styles.popupBtnGroup}>

+ 151 - 0
src/views/courseListSearch/child-node.tsx

@@ -0,0 +1,151 @@
+import { defineComponent } from "vue";
+import styles from './index.module.less'
+import { Cell, Collapse, CollapseItem } from "vant";
+import iconVideo from './image/icon-video.png'
+import iconSong from './image/icon-song.png'
+import iconImage from './image/icon-image.png'
+import { handleShowVip } from "@/state";
+import { browser } from "@/helpers/utils";
+import { useRouter } from "vue-router";
+
+// 获取对应图片
+export const getImage = (item: any) => {
+  if (item.typeCode === 'VIDEO') {
+    return iconVideo;
+  } else if (['IMAGE', 'IMG'].includes(item.typeCode)) {
+    return iconImage;
+  } else if (item.typeCode === 'SONG') {
+    return iconSong;
+  } else {
+    return iconVideo;
+  }
+};
+
+const ChildNode = defineComponent({
+  name: 'child-node',
+  props: {
+    id: {
+      type: String,
+      default: ''
+    },
+    search: {
+      type: String,
+      default: ''
+    },
+    isLock: {
+      type: Boolean,
+      default: false,
+    },
+    list: {
+      type: Array,
+      default: () => []
+    },
+    collapse: {
+      type: String,
+      default: ''
+    }
+  },
+  emits: ['update:collapse'],
+  setup(props, { emit }) {
+    const router = useRouter()
+    const toDetail = (item: any) => {
+      // 
+      if(props.isLock) {
+        handleShowVip(props.id, "LESSON")
+        return
+      }
+
+      if (browser().isApp) {
+        postMessage({
+          api: 'openWebView',
+          content: {
+            url: `${location.origin}${location.pathname}#/coursewarePlay?lessonId=${props.id}&source=search&kId=${item.id}&search=${props.search}`,
+            orientation: 0,
+            isHideTitle: true,
+            statusBarTextColor: false,
+            isOpenLight: true,
+            showLoadingAnim: true
+          }
+        });
+      } else {
+        router.push({
+          path: '/coursewarePlay',
+          query: {
+            lessonId: props.id,
+            kId: item.id,
+            search: props.search,
+            source: 'search'
+          }
+        });
+      }
+    }
+
+    const formatName = (name: string) => {
+      if(!name || !props.search) return name
+      const search: any = props.search
+      return name.replace(search, `<span style="color: #01C1B5;">${search}</span>`)
+    }
+    return () => (
+      <Collapse
+        modelValue={props.collapse}
+        onUpdate:modelValue={(val: any) => {
+          emit('update:collapse', val);
+        }}
+        border={false}
+        accordion>
+        {props.list?.map((point: any) => (
+          <CollapseItem
+            clickable={false}
+            center
+            border={false}
+            class={styles.collapseChild}
+            name={point.id}>
+            {{
+              title: () => (
+                <div
+                  class={[
+                    styles.itemTitle,
+                    Array.isArray(point?.materialList) && point?.materialList.length > 0 ? styles.materialTitle : ''
+                  ]}>
+                  {point.name}
+                </div>
+              ),
+              default: () => (
+                <>
+                  {Array.isArray(point?.materialList) &&
+                    point.materialList.map((n: any) => (
+                      <Cell center isLink clickable={false} onClick={() => toDetail(n)}>
+                        {{
+                          title: () => <div class={styles.materialSection}>
+                            <img src={getImage(n)} class={styles.iconMaterial} />
+                            <div v-html={formatName(n.name)}></div>
+                          </div>
+                        }}
+                      </Cell>
+                    ))}
+                  {Array.isArray(point?.children) && (
+                    <ChildNode
+                      isLock={props.isLock}
+                      search={props.search}
+                      id={props.id}
+                      list={point.children}
+                      collapse={point.collapse}
+                      onUpdate:collapse={val => {
+                        point.collapse = val;
+                      }}
+                    />
+                  )}
+                </>
+              ),
+              'right-icon': () => (
+                  <i class={[styles.arrow, props.collapse === point.id ? styles.arrowActive : '']}></i>
+              )
+            }}
+          </CollapseItem>
+        ))}
+      </Collapse>
+    );
+  }
+});
+
+export default ChildNode;

二進制
src/views/courseListSearch/image/icon-arrow-down.png


二進制
src/views/courseListSearch/image/icon-arrow-up.png


二進制
src/views/courseListSearch/image/icon-image.png


二進制
src/views/courseListSearch/image/icon-menu.png


二進制
src/views/courseListSearch/image/icon-song.png


二進制
src/views/courseListSearch/image/icon-video.png


+ 138 - 0
src/views/courseListSearch/index.module.less

@@ -0,0 +1,138 @@
+.courseListSearch {
+  min-height: 100vh;
+  background-color: #fff;
+  background: linear-gradient(180deg, #7defe6 0%, rgba(255, 255, 255, 0) 170px);
+  box-sizing: border-box;
+
+  :global {
+    .van-nav-bar__title {
+      width: 100%;
+      max-width: 100%;
+      margin-left: 46px;
+    }
+    .van-nav-bar__right {
+      display: none;
+    }
+    .van-search {
+      padding-left: 0;
+    }
+
+    .o-result-container {
+      height: 90vh;
+    }
+  }
+}
+
+.collapseParent {
+  padding-top: 12px;
+
+  
+  :global {
+    .parentCollapse__item {
+      margin: 0 14px 12px;
+  
+      & >  .van-collapse-item__wrapper {
+        margin: 0 14px 12px;
+      }
+    }
+    .van-cell {
+      padding: 14px;
+      font-weight: 600;
+    }
+
+    .van-collapse-item {
+      background-color: #fff;
+      border-radius: 12px;
+      overflow: hidden;
+      
+    }
+
+    .van-collapse-item--border:after {
+      left: 0;
+      right: 0;
+    }
+
+    .van-collapse-item__content {
+      padding-top: 0;
+      padding-bottom: 0;
+      padding-right: 0;
+      padding-left: 0;
+    }
+  }
+}
+
+.collapseChild {
+  // margin: 0 !important;
+  :global {
+    .van-cell {
+      padding: 12px 0;
+      font-weight: 400;
+      font-size: 15px;
+      color: #333333;
+      line-height: 21px;  
+    }
+    .van-collapse-item__content {
+      // padding-left: 22px;
+
+      .van-cell {
+        padding: 12px 0;
+      }
+
+      .van-cell__title {
+        flex: 1 auto;
+      }
+
+      .van-cell__value {
+        flex-shrink: 0;
+        flex: 1 auto;
+      }
+    }
+  }
+}
+.materialSection {
+  display: flex;
+  align-items: center;
+  color: #333333;
+  padding-left: 10px;
+  .iconMaterial {
+    width: 32px;
+    height: 32px;
+    margin-right: 10px;
+  }
+}
+
+
+.itemTitle {
+  display: flex;
+  align-items: center;
+  font-size: 15px;
+  color: #333333;
+  line-height: 21px;
+  .iconMenu {
+    width: 36px;
+    height: 40px;
+    margin-right: 8px;
+  }
+
+  &.materialTitle::before {
+    content: '';
+    width: 4px;
+    height: 4px;
+    background: #01C1B5;
+    border-radius: 50%;
+    display: inline-block;
+    margin-right: 6px;
+  }
+}
+.arrow {
+  width: 16px;
+  height: 17px;
+  display: inline-block;
+  background: url('./image/icon-arrow-down.png');
+  background-size: contain;
+
+  &.arrowActive {
+    background: url('./image/icon-arrow-up.png');
+    background-size: contain;
+  }
+}

+ 216 - 0
src/views/courseListSearch/index.tsx

@@ -0,0 +1,216 @@
+import { computed, defineComponent, reactive, TransitionGroup, watch } from 'vue';
+import styles from './index.module.less';
+import OHeader from '@/components/o-header';
+import OSearch from '@/components/o-search';
+import request from '@/helpers/request';
+import { state } from '@/state';
+import { useRoute } from 'vue-router';
+import OLoading from '@/components/o-loading';
+import OEmpty from '@/components/o-empty';
+import { Cell, Collapse, CollapseItem } from 'vant';
+import ChildNode, { getImage } from './child-node';
+import { useEventListener, usePageVisibility } from '@vant/use';
+import iconMenu from './image/icon-menu.png';
+
+export default defineComponent({
+  name: 'course-list-search',
+  setup() {
+    const route = useRoute();
+    const data = reactive({
+      titleOpacity: 0,
+      loading: true,
+      detail: {
+        // id: '',
+        // cover: '',
+        // name: '',
+        // des: '',
+        useStatus: '',
+      },
+      list: [] as any,
+      search: '' as string | undefined,
+      parentCollapse: '' as any
+      // childrenCollapse: '' as any
+    });
+    const pageVisibility = usePageVisibility();
+    /** 是否锁定 */
+    const isLock = computed(() => {
+      return  (data.detail.useStatus === 'LOCK' && state.platformType === 'STUDENT') ? true : false;
+    })
+    const formatDataList = (list: any = []) => {
+      const tempList: any = [];
+      list.forEach((item: any) => {
+        let tempChild: any = {};
+        item.collapse = '';
+        tempChild = item;
+        if (Array.isArray(item.children)) {
+          tempChild.children = formatDataList(item.children);
+        }
+        tempList.push({
+          ...tempChild
+        });
+      });
+      return tempList;
+    };
+    /** 获取课件详情 */
+    const getDetail = async () => {
+      const res: any = await request.get(
+        `${state.platformApi}/lessonCourseware/getLessonCoursewareDetail/${route.query.id}`
+      );
+      if (res?.data) {
+        // data.detail.id = res.data.id;
+        // data.detail.cover = res.data.coverImg;
+        // data.detail.name = res.data.name;
+        // data.detail.des = res.data.lessonTargetDesc;
+        data.detail.useStatus = res.data.useStatus;
+      }
+    };
+    const getList = async (search?: string) => {
+      data.loading = true;
+      try {
+        const res: any = await request.get(
+          state.platformApi +
+            '/lessonCourseware/getLessonCoursewareCourseList/' +
+            route.query.id, {
+              requestType: 'form',
+              params: {
+                search
+              }
+            }
+        );
+        if (Array.isArray(res?.data)) {
+          data.search = search
+          res.data.forEach((item: any) => {
+            item.children = item.knowledgePointList || [];
+            item.id = item.coursewareDetailId;
+            item.name = item.coursewareDetailName;
+            formatDataList(item.children);
+          });
+
+          data.list = res.data;
+
+          data.parentCollapse = data.list[0].id
+        }
+      } catch (error) {
+        //
+      }
+      data.loading = false;
+    };
+    getDetail();
+    getList();
+
+    /** 页面显示和隐藏 */
+    watch(
+      () => pageVisibility.value,
+      value => {
+        if(value === "visible") {
+          getDetail()
+        }
+      }
+    );
+
+    useEventListener('scroll', () => {
+      const height =
+        window.scrollY ||
+        window.pageYOffset ||
+        document.documentElement.scrollTop;
+      data.titleOpacity = height > 100 ? 1 : height / 100;
+    });
+    return () => (
+      <div class={styles.courseListSearch}>
+        <OHeader
+          isBack
+          background={`rgba(255,255,255, ${data.titleOpacity})`}
+          border={false}>
+          {{
+            title: () => (
+              <div class={styles.title}>
+                <OSearch
+                  background="transparent"
+                  placeholder="请输入素材关键词"
+                  onSearch={(val: string) => {
+                    getList(val)
+                  }}
+                />
+              </div>
+            )
+          }}
+        </OHeader>
+
+        <TransitionGroup name="van-fade">
+          {!data.loading && (
+            <Collapse
+              key="courseListSearch"
+              modelValue={data.parentCollapse}
+              onUpdate:modelValue={(val: any) => {
+                data.parentCollapse = val;
+                // data.childrenCollapse = ''; // 重置子项选择
+              }}
+              class={styles.collapseParent}
+              border={false}
+              accordion>
+              {data.list.map((item: any) => (
+                <CollapseItem
+                  center
+                  name={item.coursewareDetailId}
+                  clickable={false}
+                  class={['parentCollapse__item']}>
+                  {{
+                    title: () => (
+                      <div class={[styles.itemTitle]}>
+                        <img src={iconMenu} class={styles.iconMenu} />
+                        {item.coursewareDetailName}
+                      </div>
+                    ),
+                    default: () => (
+                      <>
+                        {Array.isArray(item?.materialList) &&
+                          item.materialList.map((n: any) => (
+                            <Cell center isLink clickable={false}>
+                              {{
+                                title: () => (
+                                  <div class={styles.materialSection}>
+                                    <img
+                                      src={getImage(n)}
+                                      class={styles.iconMaterial}
+                                    />
+                                    {n.name}
+                                  </div>
+                                )
+                              }}
+                            </Cell>
+                          ))}
+                        {Array.isArray(item?.children) && (
+                          <ChildNode
+                            id={route.query.id as any}
+                            search={data.search}
+                            isLock={isLock.value}
+                            list={item.children}
+                            collapse={item.collapse}
+                            onUpdate:collapse={(val: any) => {
+                              item.collapse = val;
+                            }}
+                          />
+                        )}
+                      </>
+                    ),
+                    'right-icon': () => (
+                      <i
+                        class={[
+                          styles.arrow,
+                          data.parentCollapse === item.coursewareDetailId
+                            ? styles.arrowActive
+                            : ''
+                        ]}></i>
+                    )
+                  }}
+                </CollapseItem>
+              ))}
+            </Collapse>
+          )}
+        </TransitionGroup>
+        {data.loading && <OLoading />}
+        {!data.loading && !data.list.length && <OEmpty tips="暂无搜索结果" />}
+      </div>
+    );
+  }
+});

+ 36 - 3
src/views/coursewarePlay/component/courseware-tips/index.module.less

@@ -1,13 +1,45 @@
 .container {
+  position: relative;
   width: 453px;
-  height: 302px;
-  background: url('../../image/tips-bg.png') top center no-repeat #fff;
-  background-size: contain;
+  height: 80vh;
+  max-height: 302px;
+  // background: url('../../image/tips-bg.png') top center no-repeat #fff;
+  // background-size: contain;
   border-radius: 20px;
   display: flex;
   flex-direction: column;
+  overflow: hidden;
+  background-color: #fff;
+
+  &::before {
+    content: '';
+    width: 100%;
+    height: 46px;
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+    border-top-left-radius: 20px;
+    border-top-right-radius: 20px;
+    background: linear-gradient(to bottom, #DEFAFF, #ffffff);
+  }
+
+  .iconClose {
+    position: relative;
+    z-index: 1;
+    width: 18px;
+    height: 19px;
+    position: absolute;
+    top: 14px;
+    right: 20px;
+    z-index: 9;
+    background: url('../tips/icon-close.png') no-repeat center;
+    background-size: contain;
+  }
 
   .title {
+    position: relative;
+    z-index: 1;
     font-weight: 600;
     font-size: 16px;
     color: #131415;
@@ -24,6 +56,7 @@
     padding: 0 20px;
     margin-bottom: 16px;
     font-size: 14px;
+    line-height: 1.6;
 
     &::-webkit-scrollbar {
       display: none;

+ 5 - 1
src/views/coursewarePlay/component/courseware-tips/index.tsx

@@ -13,8 +13,12 @@ export default defineComponent({
       default: ''
     }
   },
-  setup(props) {
+  emits: ['close'],
+  setup(props, { emit }) {
     return () => <div class={styles.container}>
+      <i
+          class={styles.iconClose}
+          onClick={() => (emit("close"))}></i>
       <div class={styles.title}>
         {props.titleName}
       </div>

+ 1 - 1
src/views/coursewarePlay/component/courseware-type/index.module.less

@@ -123,7 +123,7 @@
     &::before {
       content: '';
       position: absolute;
-      left: 5px;
+      left: 0;
       width: 5px;
       height: 100%;
       background: linear-gradient(270deg, rgba(0, 0, 0, 0.25) 0%, rgba(0, 0, 0, 0.03) 100%);

+ 1 - 1
src/views/coursewarePlay/component/courseware-type/index.tsx

@@ -17,7 +17,7 @@ export default defineComponent({
       <div class={styles.container}>
         <div class={styles.pointHead}>
           <img src={iconMenucw} />
-          课类型
+          课类型
         </div>
         <div class={styles.content}>
           {props.list.map((item: any) => <div class={styles.item} onClick={() => emit("confirm", item)}>

+ 2 - 4
src/views/coursewarePlay/component/musicScore.tsx

@@ -8,6 +8,7 @@ import { usePageVisibility } from '@vant/use';
 import { useRoute } from 'vue-router';
 import { browser } from '@/helpers/utils';
 import { state } from '@/state';
+import { vaildCurrentUrl } from '@/helpers/validate';
 
 export default defineComponent({
   name: 'musicScore',
@@ -76,10 +77,7 @@ export default defineComponent({
       if (!browserInfo.ios) {
         isLoading.value = true;
       }
-      const origin = /(localhost|192)/.test(location.host)
-        ? 'https://test.gym.lexiaoya.cn'
-        : location.origin;
-      const src = `${origin}/accompany/?Authorization=${Authorization}#/detail/${props.music.content}?isHideBack=true`;
+      const src = `${vaildCurrentUrl()}/accompany/?Authorization=${Authorization}#/detail/${props.music.content}?isHideBack=true`;
       postMessage(
         {
           api: 'openAccompanyWebView',

+ 14 - 0
src/views/coursewarePlay/component/point.module.less

@@ -24,6 +24,20 @@
   }
 }
 
+.pointHeadSearch {
+  :global {
+    .van-search {
+      padding-top: 17px;
+      padding-left: 20px;
+      padding-right: 20px;
+
+      input {
+        color: rgba(255,255,255,0.9);
+      }
+    }
+  }
+}
+
 .content {
   flex: 1;
   overflow-y: auto;

+ 311 - 0
src/views/coursewarePlay/component/points-search.tsx

@@ -0,0 +1,311 @@
+import { defineComponent, reactive, watch } from 'vue';
+import styles from './point.module.less';
+import { iconArrow } from '../image/icons.json';
+import {
+  iconImage,
+  iconImageActive,
+  iconVideo,
+  iconVideoActive,
+  iconSong,
+  iconSongActive
+} from '../image/icons.json';
+import { Collapse, CollapseItem, Icon, Image } from 'vant';
+import PlayLoading from './play-loading';
+import OSearch from '@/components/o-search';
+import OLoading from '@/components/o-loading';
+import OEmpty from '@/components/o-empty';
+export default defineComponent({
+  name: 'points-list',
+  props: {
+    data: {
+      type: Array,
+      default: () => []
+    },
+    tabActive: {
+      type: String,
+      default: ''
+    },
+    itemActive: {
+      type: String,
+      default: ''
+    },
+    search: {
+      type: String,
+      default: ''
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    open: {
+      type: Boolean,
+      default: false,
+    }
+  },
+  emits: ['handleSelect', 'handleSearch'],
+  setup(props, { emit }) {
+    const pointData = reactive({
+      search: props.search,
+      isSearch: false, // 判断是否搜索过
+      active: props.tabActive[0] || '',
+      childActive: props.tabActive[1] || '',
+      liftChildActive: props.tabActive[2] || '',
+    });
+    watch(
+      () => props.tabActive,
+      () => {
+        pointData.active = props.tabActive[0] || '';
+        pointData.childActive = props.tabActive[1] || '';
+        pointData.liftChildActive = props.tabActive[2] || '';
+      }
+    );
+    
+    watch(() => props.open, () => {
+      pointData.search = props.search
+    })
+
+    // 获取对应图片
+    const getImage = (item: any) => {
+      if (item.typeCode === 'VIDEO') {
+        return props.itemActive == item.id ? iconVideoActive : iconVideo;
+      } else if (['IMAGE', 'IMG'].includes(item.typeCode)) {
+        return props.itemActive == item.id ? iconImageActive : iconImage;
+      } else if (item.typeCode === 'SONG') {
+        return props.itemActive == item.id ? iconSongActive : iconSong;
+      } else {
+        return props.itemActive == item.id ? iconVideoActive : iconVideo;
+      }
+    };
+    return () => (
+      <div class={styles.container}>
+        <div class={styles.pointHeadSearch}>
+          <OSearch placeholder='请输入素材关键词' modelValue={pointData.search} background='transparent' inputBackground='rgba(255, 255, 255, 0.15)' onSearch={(val: any) => {
+            // 
+            if(props.loading) return
+            pointData.isSearch = true
+            pointData.search = val
+            emit('handleSearch', {
+              search: val
+            })
+          }} />
+        </div>
+        <div class={styles.content}>
+          {props.loading && <OLoading />}
+          {!props.loading && !props.data.length && <OEmpty tips="暂无搜索结果" />}
+          <Collapse
+            class={styles.collapse}
+            modelValue={pointData.active}
+            onUpdate:modelValue={(val: any) => {
+              pointData.active = val;
+            }}
+            accordion>
+            {props.data.map((item: any, index: number) => {
+              return (
+                <CollapseItem
+                  center
+                  border={false}
+                  class={index > 0 ? styles.borderTop : ''}
+                  isLink={false}
+                  title={item.name}
+                  name={item.id}>
+                  {{
+                    default: () => (
+                      <>
+                        {Array.isArray(item?.materialList) &&
+                          item.materialList.map((n: any) => {
+                            return (
+                              <div
+                                class={[
+                                  styles.item,
+                                  props.itemActive == n.id
+                                    ? styles.itemActive
+                                    : ''
+                                ]}
+                                onClick={() => {
+                                  emit('handleSelect', {
+                                    isSearch: pointData.isSearch,
+                                    itemActive: n.id,
+                                    tabActive: item.id,
+                                    tabName: item.name
+                                  });
+                                  pointData.isSearch = false
+                                }}>
+                                <Image
+                                  src={getImage(n)}
+                                  class={styles.itemImage}
+                                />
+                                <span
+                                  style={{ width: '80%' }}
+                                  class="van-ellipsis">
+                                  {n.name}
+                                </span>
+                                {/* <Icon name={iconZhibo} /> */}
+                                <div class={styles.playLoading}>
+                                  <PlayLoading />
+                                </div>
+                              </div>
+                            );
+                          })}
+
+                        {Array.isArray(item?.children) && (
+                          <Collapse
+                            class={[
+                              styles.collapse,
+                              pointData.active === item.id
+                                ? styles.childActive
+                                : ''
+                            ]}
+                            modelValue={pointData.childActive}
+                            onUpdate:modelValue={(val: any) => {
+                              pointData.childActive = val;
+                            }}
+                            accordion>
+                            {item?.children.map((child: any) => {
+                              return (
+                                <CollapseItem
+                                  center
+                                  border={false}
+                                  isLink={false}
+                                  title={child.name}
+                                  name={child.id}
+                                  class={styles.childCollapseItem}>
+                                  {{
+                                    default: () => (
+                                      <>
+                                        {Array.isArray(child?.materialList) &&
+                                          child.materialList.map((n: any) => {
+                                            return (
+                                              <div
+                                                class={[
+                                                  styles.item,
+                                                  props.itemActive == n.id
+                                                    ? styles.itemActive
+                                                    : ''
+                                                ]}
+                                                onClick={() => {
+                                                  emit('handleSelect', {
+                                                    isSearch: pointData.isSearch,
+                                                    itemActive: n.id,
+                                                    tabActive: child.id,
+                                                    tabName: child.name
+                                                  });
+                                                  pointData.isSearch = false
+                                                }}>
+                                                <Image
+                                                  src={getImage(n)}
+                                                  class={styles.itemImage}
+                                                />
+                                                <span
+                                                  style={{ width: '73%' }}
+                                                  class="van-ellipsis">
+                                                  {n.name}
+                                                </span>
+                                                {/* <Icon name={iconZhibo} /> */}
+                                                <div class={styles.playLoading}>
+                                                  <PlayLoading />
+                                                </div>
+                                              </div>
+                                            );
+                                          })}
+
+                                          {Array.isArray(child?.children) && (
+                                            <Collapse
+                                              class={[
+                                                styles.collapse,
+                                                pointData.liftChildActive === child.id
+                                                  ? styles.childActive
+                                                  : ''
+                                              ]}
+                                              modelValue={pointData.liftChildActive}
+                                              onUpdate:modelValue={(val: any) => {
+                                                pointData.liftChildActive = val;
+                                              }}
+                                              accordion>
+                                              {child?.children.map((liftChild: any) => {
+                                                return (
+                                                  <CollapseItem
+                                                    center
+                                                    border={false}
+                                                    isLink={false}
+                                                    title={liftChild.name}
+                                                    name={liftChild.id}
+                                                    class={styles.childCollapseItem}>
+                                                    {{
+                                                      default: () => (
+                                                        <>
+                                                          {Array.isArray(liftChild?.materialList) &&
+                                                            liftChild.materialList.map((n: any) => {
+                                                              return (
+                                                                <div
+                                                                  class={[
+                                                                    styles.item,
+                                                                    props.itemActive == n.id
+                                                                      ? styles.itemActive
+                                                                      : ''
+                                                                  ]}
+                                                                  onClick={() => {
+                                                                    emit('handleSelect', {
+                                                                      isSearch: pointData.isSearch,
+                                                                      itemActive: n.id,
+                                                                      tabActive: liftChild.id,
+                                                                      tabName: liftChild.name
+                                                                    });
+                                                                    pointData.isSearch = false
+                                                                  }}>
+                                                                  <Image
+                                                                    src={getImage(n)}
+                                                                    class={styles.itemImage}
+                                                                  />
+                                                                  <span
+                                                                    style={{ width: '73%' }}
+                                                                    class="van-ellipsis">
+                                                                    {n.name}
+                                                                  </span>
+                                                                  {/* <Icon name={iconZhibo} /> */}
+                                                                  <div class={styles.playLoading}>
+                                                                    <PlayLoading />
+                                                                  </div>
+                                                                </div>
+                                                              );
+                                                            })}
+                                                        </>
+                                                      ),
+                                                      icon: () => (
+                                                        <img
+                                                          class={styles.arrow}
+                                                          src={iconArrow}
+                                                        />
+                                                      )
+                                                    }}
+                                                  </CollapseItem>
+                                                );
+                                              })}
+                                            </Collapse>
+                                          )}
+                                      </>
+                                    ),
+                                    icon: () => (
+                                      <img
+                                        class={styles.arrow}
+                                        src={iconArrow}
+                                      />
+                                    )
+                                  }}
+                                </CollapseItem>
+                              );
+                            })}
+                          </Collapse>
+                        )}
+                      </>
+                    ),
+                    icon: () => <img class={styles.arrow} src={iconArrow} />
+                  }}
+                </CollapseItem>
+              );
+            })}
+          </Collapse>
+        </div>
+      </div>
+    );
+  }
+});

二進制
src/views/coursewarePlay/component/tips/icon-close.png


+ 19 - 2
src/views/coursewarePlay/component/tips/index.module.less

@@ -3,11 +3,28 @@
   padding: 20px !important;
   max-width: 310px !important;
   min-width: 295px !important;
-  background: url('./top-bg.png') no-repeat top center #fff !important;
-  background-size: contain !important;
+  // background: url('./top-bg.png') no-repeat top center #fff !important;
+  // background-size: contain !important;
   overflow: hidden;
+  border-radius: 20px !important;
+  overflow: hidden;
+  background-color: #fff;
+
+  &::before {
+    content: '';
+    width: 100%;
+    height: 49px;
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+    border-top-left-radius: 20px;
+    border-top-right-radius: 20px;
+    background: linear-gradient(to bottom, #DEFAFF, #ffffff);
+  }
 
   .iconClose {
+    position: relative;
     width: 18px;
     height: 19px;
     position: absolute;

+ 1 - 1
src/views/coursewarePlay/component/tools/pen.module.less

@@ -23,7 +23,7 @@
 }
 .rightItem{
     position: absolute;
-    right: 15Px;
+    right: 8Px;
     bottom: 0;
     bottom: constant(safe-area-inset-bottom);
     bottom: env(safe-area-inset-bottom);

+ 2 - 2
src/views/coursewarePlay/component/tools/pen.tsx

@@ -42,8 +42,8 @@ export default defineComponent({
     const { show } = toRefs(props);
     const firstRender = ref(true);
     const src = /(localhost|192)/.test(location.host)
-      ? 'https://test.lexiaoya.cn/whiteboard-noCollab'
-      : `https://online.lexiaoya.cn/whiteboard-noCollab`;
+      ? 'https://test.lexiaoya.cn/whiteboard-noCollab?platform=daya'
+      : `https://online.lexiaoya.cn/whiteboard-noCollab?platform=daya`;
 
     const exportImg = (event: MessageEvent) => {
       const data = event.data;

+ 3 - 5
src/views/coursewarePlay/component/video-play.tsx

@@ -25,8 +25,9 @@ import {
 
 import TCPlayer from 'tcplayer.js';
 import 'tcplayer.js/dist/tcplayer.min.css';
-import { showToast, Slider } from 'vant';
 import { handleShowVip, state } from '@/state';
+import { showToast, Slider } from 'vant';
+import { vaildCurrentUrl } from '@/helpers/validate';
 
 // 秒转分
 export const getSecondRPM = (second: number, type?: string) => {
@@ -361,10 +362,7 @@ export default defineComponent({
       //   item.value.materialMusicId
       // }?Authorization=${Authorization}&isHideTitle=true`;
 
-    const origin = /(localhost|192)/.test(location.host)
-          ? 'https://test.gym.lexiaoya.cn/'
-          : location.origin;
-    const src = `${origin}/gym-music-score/?id=${item.value.materialMusicId}&isHideMusicList=true&systemType=${ state.platformType === 'TEACHER' ? 'teacher' : 'student'}`
+    const src = `${vaildCurrentUrl()}/gym-music-score/?id=${item.value.materialMusicId}&isHideMusicList=true&systemType=${ state.platformType === 'TEACHER' ? 'teacher' : 'student'}`
 
       postMessage({
         api: 'openAccompanyWebView',

部分文件因文件數量過多而無法顯示