lex-xin 7 月之前
父节点
当前提交
452eaead68
共有 44 个文件被更改,包括 356 次插入8 次删除
  1. 1 0
      dist/assets/auth-login-legacy.7484cd27.js
  2. 1 0
      dist/assets/auth-login-legacy.bf5332c7.js
  3. 1 0
      dist/assets/auth-login.2c80b831.js
  4. 1 0
      dist/assets/auth-login.7aeca562.js
  5. 1 0
      dist/assets/home-layout-center-legacy.1089d844.js
  6. 5 0
      dist/assets/home-layout-center.363b7f0b.js
  7. 4 0
      dist/assets/home-layout-center.f5cb1ee8.js
  8. 1 0
      dist/assets/index-legacy.86d09ad4.js
  9. 1 0
      dist/assets/index-legacy.c98d13aa.js
  10. 1 0
      dist/assets/index-legacy.f028b8f2.js
  11. 1 0
      dist/assets/index-legacy.f2c7a11c.js
  12. 1 0
      dist/assets/index.3d926f57.js
  13. 0 0
      dist/assets/index.4c25b5a6.js
  14. 1 0
      dist/assets/index.ba5cd8ed.js
  15. 1 0
      dist/assets/login-legacy.3e493940.js
  16. 1 0
      dist/assets/login-legacy.fd6ee519.js
  17. 1 0
      dist/assets/login.1c200c37.js
  18. 1 0
      dist/assets/login.4e5fff28.js
  19. 1 0
      dist/assets/polyfills-legacy.7757259d.js
  20. 1 0
      dist/assets/polyfills-legacy.f001d713.js
  21. 0 0
      dist/assets/privacy-legacy.a87fcebd.js
  22. 0 0
      dist/assets/privacy-legacy.eaa38c52.js
  23. 0 0
      dist/assets/privacy.091a8bbd.js
  24. 0 0
      dist/assets/privacy.45e9c2a9.js
  25. 1 0
      dist/assets/routes-common-legacy.4be2a969.js
  26. 1 0
      dist/assets/routes-common-legacy.8acab46a.js
  27. 0 0
      dist/assets/routes-common.46c2376d.js
  28. 1 0
      dist/assets/teacher-legacy.0cf7ebd3.js
  29. 1 0
      dist/assets/teacher-legacy.a07d60bd.js
  30. 1 0
      dist/assets/teacher.b1edf8ec.js
  31. 1 0
      dist/assets/teacher.bbe6493f.js
  32. 12 0
      dist/index.html
  33. 11 0
      dist/teacher.html
  34. 4 0
      dist/tenant.html
  35. 二进制
      src/teacher/music/upload/images/audio-bg.png
  36. 二进制
      src/teacher/music/upload/images/audio-pause.png
  37. 二进制
      src/teacher/music/upload/images/audio-play.png
  38. 二进制
      src/teacher/music/upload/images/top_bg.png
  39. 二进制
      src/teacher/music/upload/images/top_line.png
  40. 11 1
      src/teacher/music/upload/index.module.less
  41. 41 6
      src/teacher/music/upload/index.tsx
  42. 116 0
      src/teacher/music/upload/listen-audio/index.module.less
  43. 126 0
      src/teacher/music/upload/listen-audio/index.tsx
  44. 3 1
      src/views/protocol/privacy.tsx

文件差异内容过多而无法显示
+ 1 - 0
dist/assets/auth-login-legacy.7484cd27.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/auth-login-legacy.bf5332c7.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/auth-login.2c80b831.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/auth-login.7aeca562.js


+ 1 - 0
dist/assets/home-layout-center-legacy.1089d844.js

@@ -0,0 +1 @@
+!function(){function e(e,t,n,r,o,s,a){try{var u=e[s](a),c=u.value}catch(i){return void n(i)}u.done?t(c):Promise.resolve(c).then(r,o)}System.register(["./ResizeObserver.es-legacy.a86d6777.js","./index-legacy.c98d13aa.js","./auth-legacy.488eab8f.js","./routes-common-legacy.8acab46a.js"],(function(t){"use strict";var n,r,o,s,a,u,c,i,f,l;return{setters:[function(e){n=e.d,r=e.g,o=e.u,s=e.p,a=e.i,u=e.j,c=e.C,i=e.F},function(e){f=e.a,l=e.b},function(){},function(){}],execute:function(){t("default",n({name:"home-layout-center",data:function(){return{status:!1}},mounted:function(){this.getUserInfo()},methods:{getUserInfo:function(){var t,n=this;return(t=regeneratorRuntime.mark((function e(){var t,u,c;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,f.post("/api-auth/smsLogin",{requestType:"form",data:{clientId:"student",clientSecret:"student",phone:r.orchestraInfo.phone,token:r.orchestraInfo.token,isSurportRegister:!0}});case 3:return t=e.sent,u=t.data.authentication,o(u.token_type+" "+u.access_token),s({api:"setCache",content:{key:"h5-colexiu-token",value:u.token_type+" "+u.access_token}}),e.next=9,f.get("/api-student/student/queryUserInfo",{initRequest:!0});case 9:c=e.sent,a(c.data),n.$router.push("/home"),e.next=17;break;case 14:e.prev=14,e.t0=e.catch(0),n.status=!0;case 17:case"end":return e.stop()}}),e,null,[[0,14]])})),function(){var n=this,r=arguments;return new Promise((function(o,s){var a=t.apply(n,r);function u(t){e(a,o,s,u,c,"next",t)}function c(t){e(a,o,s,u,c,"throw",t)}u(void 0)}))})()}},render:function(){return u(i,null,[this.status?u("div",{class:l.error},[u(c,{type:"notFond",classImgSize:"CERT",tips:"加载失败,请稍后重试",buttonText:"重新加载",plain:!0,onClick:this.getUserInfo},null)]):u("div",null,null)])}}))}}}))}();

+ 5 - 0
dist/assets/home-layout-center.363b7f0b.js

@@ -0,0 +1,5 @@
+<<<<<<<< HEAD:dist/assets/home-layout-center.f5cb1ee8.js
+import{d as r,g as s,u,p as i,i as c,j as e,C as l,F as p}from"./ResizeObserver.es.493a14ba.js";import{a,b as h}from"./index.756f4bb9.js";import"./auth.1afb5182.js";import"./routes-common.1e4234c4.js";var g=r({name:"home-layout-center",data(){return{status:!1}},mounted(){this.getUserInfo()},methods:{async getUserInfo(){try{const o=await a.post("/api-auth/smsLogin",{requestType:"form",data:{clientId:"student",clientSecret:"student",phone:s.orchestraInfo.phone,token:s.orchestraInfo.token,isSurportRegister:!0}}),{authentication:t}=o.data;u(t.token_type+" "+t.access_token),i({api:"setCache",content:{key:"h5-colexiu-token",value:t.token_type+" "+t.access_token}});const n=await a.get("/api-student/student/queryUserInfo",{initRequest:!0});c(n.data),this.$router.push("/home")}catch{this.status=!0}}},render(){return e(p,null,[this.status?e("div",{class:h.error},[e(l,{type:"notFond",classImgSize:"CERT",tips:"\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",buttonText:"\u91CD\u65B0\u52A0\u8F7D",plain:!0,onClick:this.getUserInfo},null)]):e("div",null,null)])}});export{g as default};
+========
+import{d as r,g as s,u,p as i,i as c,j as e,C as l,F as p}from"./ResizeObserver.es.493a14ba.js";import{a,b as h}from"./index.4c25b5a6.js";import"./auth.1afb5182.js";import"./routes-common.46c2376d.js";var g=r({name:"home-layout-center",data(){return{status:!1}},mounted(){this.getUserInfo()},methods:{async getUserInfo(){try{const o=await a.post("/api-auth/smsLogin",{requestType:"form",data:{clientId:"student",clientSecret:"student",phone:s.orchestraInfo.phone,token:s.orchestraInfo.token,isSurportRegister:!0}}),{authentication:t}=o.data;u(t.token_type+" "+t.access_token),i({api:"setCache",content:{key:"h5-colexiu-token",value:t.token_type+" "+t.access_token}});const n=await a.get("/api-student/student/queryUserInfo",{initRequest:!0});c(n.data),this.$router.push("/home")}catch{this.status=!0}}},render(){return e(p,null,[this.status?e("div",{class:h.error},[e(l,{type:"notFond",classImgSize:"CERT",tips:"\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",buttonText:"\u91CD\u65B0\u52A0\u8F7D",plain:!0,onClick:this.getUserInfo},null)]):e("div",null,null)])}});export{g as default};
+>>>>>>>> iteration-20240912:dist/assets/home-layout-center.363b7f0b.js

+ 4 - 0
dist/assets/home-layout-center.f5cb1ee8.js

@@ -1 +1,5 @@
+<<<<<<<< HEAD:dist/assets/home-layout-center.f5cb1ee8.js
 import{d as r,g as s,u,p as i,i as c,j as e,C as l,F as p}from"./ResizeObserver.es.493a14ba.js";import{a,b as h}from"./index.756f4bb9.js";import"./auth.1afb5182.js";import"./routes-common.1e4234c4.js";var g=r({name:"home-layout-center",data(){return{status:!1}},mounted(){this.getUserInfo()},methods:{async getUserInfo(){try{const o=await a.post("/api-auth/smsLogin",{requestType:"form",data:{clientId:"student",clientSecret:"student",phone:s.orchestraInfo.phone,token:s.orchestraInfo.token,isSurportRegister:!0}}),{authentication:t}=o.data;u(t.token_type+" "+t.access_token),i({api:"setCache",content:{key:"h5-colexiu-token",value:t.token_type+" "+t.access_token}});const n=await a.get("/api-student/student/queryUserInfo",{initRequest:!0});c(n.data),this.$router.push("/home")}catch{this.status=!0}}},render(){return e(p,null,[this.status?e("div",{class:h.error},[e(l,{type:"notFond",classImgSize:"CERT",tips:"\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",buttonText:"\u91CD\u65B0\u52A0\u8F7D",plain:!0,onClick:this.getUserInfo},null)]):e("div",null,null)])}});export{g as default};
+========
+import{d as r,g as s,u,p as i,i as c,j as e,C as l,F as p}from"./ResizeObserver.es.493a14ba.js";import{a,b as h}from"./index.4c25b5a6.js";import"./auth.1afb5182.js";import"./routes-common.46c2376d.js";var g=r({name:"home-layout-center",data(){return{status:!1}},mounted(){this.getUserInfo()},methods:{async getUserInfo(){try{const o=await a.post("/api-auth/smsLogin",{requestType:"form",data:{clientId:"student",clientSecret:"student",phone:s.orchestraInfo.phone,token:s.orchestraInfo.token,isSurportRegister:!0}}),{authentication:t}=o.data;u(t.token_type+" "+t.access_token),i({api:"setCache",content:{key:"h5-colexiu-token",value:t.token_type+" "+t.access_token}});const n=await a.get("/api-student/student/queryUserInfo",{initRequest:!0});c(n.data),this.$router.push("/home")}catch{this.status=!0}}},render(){return e(p,null,[this.status?e("div",{class:h.error},[e(l,{type:"notFond",classImgSize:"CERT",tips:"\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",buttonText:"\u91CD\u65B0\u52A0\u8F7D",plain:!0,onClick:this.getUserInfo},null)]):e("div",null,null)])}});export{g as default};
+>>>>>>>> iteration-20240912:dist/assets/home-layout-center.363b7f0b.js

文件差异内容过多而无法显示
+ 1 - 0
dist/assets/index-legacy.86d09ad4.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/index-legacy.c98d13aa.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/index-legacy.f028b8f2.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/index-legacy.f2c7a11c.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/index.3d926f57.js


文件差异内容过多而无法显示
+ 0 - 0
dist/assets/index.4c25b5a6.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/index.ba5cd8ed.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/login-legacy.3e493940.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/login-legacy.fd6ee519.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/login.1c200c37.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/login.4e5fff28.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/polyfills-legacy.7757259d.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/polyfills-legacy.f001d713.js


文件差异内容过多而无法显示
+ 0 - 0
dist/assets/privacy-legacy.a87fcebd.js


文件差异内容过多而无法显示
+ 0 - 0
dist/assets/privacy-legacy.eaa38c52.js


文件差异内容过多而无法显示
+ 0 - 0
dist/assets/privacy.091a8bbd.js


文件差异内容过多而无法显示
+ 0 - 0
dist/assets/privacy.45e9c2a9.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/routes-common-legacy.4be2a969.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/routes-common-legacy.8acab46a.js


文件差异内容过多而无法显示
+ 0 - 0
dist/assets/routes-common.46c2376d.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/teacher-legacy.0cf7ebd3.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/teacher-legacy.a07d60bd.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/teacher.b1edf8ec.js


文件差异内容过多而无法显示
+ 1 - 0
dist/assets/teacher.bbe6493f.js


+ 12 - 0
dist/index.html

@@ -52,10 +52,17 @@
             _T_));
     })(Object);
   </script>
+<<<<<<< HEAD
   <script type="module" crossorigin src="./assets/index.756f4bb9.js"></script>
   <link rel="modulepreload" href="./assets/ResizeObserver.es.493a14ba.js">
   <link rel="modulepreload" href="./assets/auth.1afb5182.js">
   <link rel="modulepreload" href="./assets/routes-common.1e4234c4.js">
+=======
+  <script type="module" crossorigin src="./assets/index.4c25b5a6.js"></script>
+  <link rel="modulepreload" href="./assets/ResizeObserver.es.493a14ba.js">
+  <link rel="modulepreload" href="./assets/auth.1afb5182.js">
+  <link rel="modulepreload" href="./assets/routes-common.46c2376d.js">
+>>>>>>> iteration-20240912
   <link rel="stylesheet" href="./assets/ResizeObserver.es.ea6352ab.css">
   <link rel="stylesheet" href="./assets/auth.f09b6d78.css">
   <link rel="stylesheet" href="./assets/index.820e7d12.css">
@@ -67,8 +74,13 @@
   
   <!-- <script type="module" src="/src/teacher/main.ts"></script> -->
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
+<<<<<<< HEAD
   <script nomodule id="vite-legacy-polyfill" src="./assets/polyfills-legacy.f001d713.js"></script>
   <script nomodule id="vite-legacy-entry" data-src="./assets/index-legacy.f2c7a11c.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule id="vite-legacy-polyfill" src="./assets/polyfills-legacy.7757259d.js"></script>
+  <script nomodule id="vite-legacy-entry" data-src="./assets/index-legacy.c98d13aa.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> iteration-20240912
 </body>
 
 </html>

+ 11 - 0
dist/teacher.html

@@ -52,9 +52,15 @@
             _T_));
     })(Object);
   </script>
+<<<<<<< HEAD
   <script type="module" crossorigin src="./assets/teacher.b1edf8ec.js"></script>
   <link rel="modulepreload" href="./assets/ResizeObserver.es.493a14ba.js">
   <link rel="modulepreload" href="./assets/routes-common.1e4234c4.js">
+=======
+  <script type="module" crossorigin src="./assets/teacher.bbe6493f.js"></script>
+  <link rel="modulepreload" href="./assets/ResizeObserver.es.493a14ba.js">
+  <link rel="modulepreload" href="./assets/routes-common.46c2376d.js">
+>>>>>>> iteration-20240912
   <link rel="stylesheet" href="./assets/ResizeObserver.es.ea6352ab.css">
   <link rel="stylesheet" href="./assets/teacher.ded4b243.css">
   <script type="module">!function(){try{new Function("m","return import(m)")}catch(o){console.warn("vite: loading legacy build because dynamic import is unsupported, syntax error above 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>
@@ -64,8 +70,13 @@
   <div id="app"></div>
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
+<<<<<<< HEAD
   <script nomodule id="vite-legacy-polyfill" src="./assets/polyfills-legacy.f001d713.js"></script>
   <script nomodule id="vite-legacy-entry" data-src="./assets/teacher-legacy.a07d60bd.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+=======
+  <script nomodule id="vite-legacy-polyfill" src="./assets/polyfills-legacy.7757259d.js"></script>
+  <script nomodule id="vite-legacy-entry" data-src="./assets/teacher-legacy.0cf7ebd3.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+>>>>>>> iteration-20240912
 </body>
 
 </html>

+ 4 - 0
dist/tenant.html

@@ -66,7 +66,11 @@
   
   <!-- <script type="module" src="/src/teacher/main.ts"></script> -->
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
+<<<<<<< HEAD
   <script nomodule id="vite-legacy-polyfill" src="./assets/polyfills-legacy.f001d713.js"></script>
+=======
+  <script nomodule id="vite-legacy-polyfill" src="./assets/polyfills-legacy.7757259d.js"></script>
+>>>>>>> iteration-20240912
   <script nomodule id="vite-legacy-entry" data-src="./assets/tenant-legacy.b2e1f7c2.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 

二进制
src/teacher/music/upload/images/audio-bg.png


二进制
src/teacher/music/upload/images/audio-pause.png


二进制
src/teacher/music/upload/images/audio-play.png


二进制
src/teacher/music/upload/images/top_bg.png


二进制
src/teacher/music/upload/images/top_line.png


+ 11 - 1
src/teacher/music/upload/index.module.less

@@ -394,7 +394,7 @@
 .upbtn {
   border: 1px solid #cfcfcf;
   width: 100%;
-  color: #666666;
+  color: #aaa;
   height: 48px;
   background: #F6F8F9;
   border-radius: 6px;
@@ -445,3 +445,13 @@
   margin-top: 0 !important;
   position: relative;
 }
+
+.listenAudioShow {
+  overflow: hidden;
+  :global {
+    .van-popup__close-icon {
+      color: #6F7F7C;
+      top: 20px;
+    }
+  }
+}

+ 41 - 6
src/teacher/music/upload/index.tsx

@@ -35,6 +35,7 @@ import ColHeader from '@/components/col-header'
 import ColSticky from '@/components/col-sticky'
 import MessageTip from './message-tip'
 import SelectTag from './select-tag'
+import ListenAudio from './listen-audio'
 
 export type BackgroundMp3 = {
   url?: string
@@ -88,6 +89,7 @@ export default defineComponent({
       tagsNames: [] as Array<{ [id in string]: string }>,
       formated: {} as FormatXMLInfo,
       tagVisibility: false,
+      listenAudioShow: false,
       // subjectListres: [] as any[],
       // subjectListNames: {} as any,
       // selectedSubjectList: null as any,
@@ -105,7 +107,11 @@ export default defineComponent({
       messageTipType: 'upload' as 'upload' | 'error' | 'origin',
       cbsInstrumentList: [] as any,
       tagList: [] as any,
-      musicSheetAuthRecordId: null as any
+      musicSheetAuthRecordId: null as any,
+      fileInfo: {
+        url: '',
+        name: '' as any
+      }
     }
   },
   watch: {
@@ -560,7 +566,7 @@ export default defineComponent({
                   </div>
                 ),
                 input: () =>
-                  browser().isApp ? (
+                  !browser().isApp ? (
                     <div class={styles.btnSection}>
                       <Button
                         icon={UploadIcon}
@@ -568,12 +574,19 @@ export default defineComponent({
                         loading={this.mp3Loading}
                         disabled={this.auditDisabled}
                         onClick={() => {
-                          if (this.mp3Url) return
+                          if (this.mp3Url) {
+                            this.listenAudioShow = true
+                            this.fileInfo = {
+                              url: this.mp3Url,
+                              name: this.fileName(this.mp3Url)
+                            }
+                            return
+                          }
                           this.naiveMp3File()
                         }}
                       >
                         {this.mp3Url
-                          ? this.fileName(this.mp3Url)
+                          ? <span style='text-decoration-line: underline;color: #14BC9C;'>{this.fileName(this.mp3Url)}</span>
                           : '上传伴奏文件'}
                       </Button>
 
@@ -589,11 +602,22 @@ export default defineComponent({
                   ) : (
                     <>
                       <Upload
-                        onUpdate:modelValue={val => (this.mp3Url = val)}
+                        onUpdate:modelValue={val => {
+                          this.mp3Url = val
+                        }}
                         accept=".mp3"
                         disabled={this.auditDisabled}
                       />
-                      <div style={{ marginLeft: '8px' }}>
+                      <div
+                        style={{ marginLeft: '8px' }}
+                        onClick={() => {
+                          this.listenAudioShow = true
+                          this.fileInfo = {
+                            url: this.mp3Url,
+                            name: this.fileName(this.mp3Url)
+                          }
+                        }}
+                      >
                         {this.fileName(this.mp3Url)}
                       </div>
                     </>
@@ -1082,6 +1106,17 @@ export default defineComponent({
           />
         </Popup>
 
+        <Popup
+          show={this.listenAudioShow}
+          round
+          closeable
+          teleport="body"
+          class={styles.listenAudioShow}
+          onUpdate:show={val => (this.listenAudioShow = val)}
+        >
+          {this.listenAudioShow && <ListenAudio fileInfo={this.fileInfo} />}
+        </Popup>
+
         <MessageTip
           title={this.messageTipTitle}
           type={this.messageTipType}

+ 116 - 0
src/teacher/music/upload/listen-audio/index.module.less

@@ -0,0 +1,116 @@
+.listenAudio {
+  background: url('../images/top_bg.png') no-repeat top center;
+  background-size: contain;
+  width: 315px;
+  min-height: 200px;
+
+  .title {
+    padding-top: 20px;
+    padding-bottom: 24px;
+    font-weight: 600;
+    font-size: 18px;
+    color: #000000;
+    text-align: center;
+
+    span {
+      display: inline-block;
+      position: relative;
+      span {
+        position: relative;
+        z-index: 5;
+      }
+      &::after {
+        content: '';
+        display: inline-block;
+        width: 100%;
+        height: 8px;
+        background: url('../images/top_line.png') no-repeat center;
+        background-size: contain;
+        position: absolute;
+        bottom: -2px;
+        left: 0;
+        z-index: -1;
+      }
+    }
+  }
+
+  .container {
+    .img {
+      position: relative;
+      width: 200px;
+      height: 200px;
+      margin: 0 auto;
+      cursor: pointer;
+
+      .audioBg {
+        width: inherit;
+        height: inherit;
+      }
+
+      .iconImg {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate(-50%, -50%);
+        width: 50px;
+        height: 50px;
+      }
+    }
+
+    .slider {
+      // width: 100%;
+      padding: 17px 0 10px;
+      --van-slider-bar-height: 3px;
+      --van-slider-button-width: 13px !important;
+      --van-slider-button-height: 13px !important;
+      --van-slider-active-background-color: #2cc4a8 !important;
+
+      :global {
+        .n-slider {
+          --n-handle-size: 13px !important;
+          --n-fill-color: var(--van-primary-color) !important;
+          --n-fill-color-hover: var(--van-primary-color) !important;
+        }
+
+        .van-loading {
+          width: 100%;
+          height: 100%;
+        }
+      }
+    }
+
+    .audioInfo {
+      padding: 24px 20px 20px;
+      .name {
+        font-weight: 600;
+        font-size: 16px;
+        color: #131415;
+        line-height: 22px;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+      }
+
+      .time {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        font-size: 14px;
+        color: #777777;
+        line-height: 20px;
+      }
+      audio {
+        visibility: hidden;
+        position: absolute;
+        z-index: -2;
+      }
+      :global {
+        .plyr {
+          visibility: hidden;
+          position: absolute;
+          z-index: -2;
+        }
+      }
+    }
+  }
+}

+ 126 - 0
src/teacher/music/upload/listen-audio/index.tsx

@@ -0,0 +1,126 @@
+import {
+  defineComponent,
+  onMounted,
+  onUnmounted,
+  PropType,
+  reactive,
+  ref
+} from 'vue'
+import styles from './index.module.less'
+import iconPause from '../images/audio-pause.png'
+import iconPlay from '../images/audio-play.png'
+import audioBg from '../images/audio-bg.png'
+import { Slider } from 'vant'
+import { getSecondRPM } from '@/helpers/utils'
+import Plyr from 'plyr'
+
+type fileType = {
+  url: string
+  name: string
+}
+
+export default defineComponent({
+  name: 'listen-audio',
+  props: {
+    fileInfo: {
+      type: Object as PropType<fileType>
+    }
+  },
+  setup(props) {
+    const audioRef = ref()
+    const audioProtoType = reactive({
+      audioPause: true,
+      duration: 0.01,
+      currentTime: 0
+    })
+
+    const onChangePlay = () => {
+      if(!audioRef.value) return
+      if (audioProtoType.audioPause) {
+        audioRef.value?.play()
+      } else {
+        audioRef.value?.pause()
+      }
+      audioProtoType.audioPause = audioRef.value.paused
+    }
+
+    const handleChangeTime = (val: any) => {
+      audioRef.value.currentTime = val
+    }
+
+    onMounted(() => {
+      if (!props.fileInfo?.url) return
+      audioRef.value = new Plyr('#audioSrc', {
+        controls: [
+          'play-large',
+          'play',
+          'progress',
+          'current-time',
+          'duration'
+        ],
+        fullscreen: { enabled: false }
+      })
+      audioRef.value.on('loadedmetadata', () => {
+        audioProtoType.duration = audioRef.value.duration
+      })
+      audioRef.value.on('timeupdate', () => {
+        audioProtoType.currentTime = audioRef.value.currentTime || 0
+      })
+      audioRef.value.on('ended', () => {
+        audioProtoType.currentTime = 0
+        audioRef.value.currentTime = 0
+        audioProtoType.audioPause = true
+      })
+    })
+
+    onUnmounted(() => {
+      audioRef.value?.destroy()
+    })
+    return () => (
+      <div class={styles.listenAudio}>
+        <h2 class={styles.title}>
+          <span>
+            <span>预览音频</span>
+          </span>
+        </h2>
+
+        <div class={styles.container}>
+          <div class={styles.img} onClick={onChangePlay}>
+            <img src={audioBg} class={styles.audioBg} />
+            <img
+              src={audioProtoType.audioPause ? iconPause : iconPlay}
+              class={styles.iconImg}
+            />
+          </div>
+
+          <div class={styles.audioInfo}>
+            <audio
+              crossorigin="anonymous"
+              id="audioSrc"
+              src={props.fileInfo?.url}
+              controls="false"
+              preload="metadata"
+              playsinline
+            />
+            <div class={styles.name}>{props.fileInfo?.name}</div>
+            <div class={styles.slider}>
+              <Slider
+                step={0.01}
+                class={styles.timeProgress}
+                v-model={audioProtoType.currentTime}
+                max={audioProtoType.duration}
+                onUpdate:modelValue={val => {
+                  handleChangeTime(val)
+                }}
+              />
+            </div>
+            <div class={styles.time}>
+              <div>{getSecondRPM(audioProtoType.currentTime)}</div>
+              <div>{getSecondRPM(audioProtoType.duration)}</div>
+            </div>
+          </div>
+        </div>
+      </div>
+    )
+  }
+})

+ 3 - 1
src/views/protocol/privacy.tsx

@@ -58,7 +58,7 @@ export default defineComponent({
           <br />
           需要说明的是,我们的一些产品支持您使用第三方平台的账号(例如:微信)进行登录,如您使用第三方平台的账号登录的,我们将根据您的授权获取该第三方账号下的相关信息(包括:昵称、头像,具体以您的授权内容为准)以及身份验证信息(个人敏感信息)。我们收集这些信息是用于为您提供账号登录服务以及保障您的账号安全,防范安全风险。如您拒绝授权此类信息的,您将无法使用第三方平台的账号登录我们平台,但不影响我们为您提供的其他产品和服务的正常使用。
           <br />
-          <h2>(二)服务内容展示/览/播放/下载/上传功能</h2>
+          <h2>(二)服务内容展示/览/播放/下载/上传功能/个性化推荐</h2>
           <br />
           我们的产品与/或服务为您提供曲谱、视频、帖子服务内容的展示、浏览、播放、下载和上传功能,在此过程中,我们会根据您使用我们产品与/或服务的具体操作收集您的一些信息,包括如下个人信息:
           <br />
@@ -76,6 +76,8 @@ export default defineComponent({
           {this.name}
           ”App的安装包名,包体大小,以此来判定app是否已被盗版攻击,以更好的保护您的个人权益和隐私。
           <br />
+          我们将可能收集您的用户搜索、浏览记录、使用习惯等个人信息,用于向您提供个性化推荐服务
+          <br />
           我们收集这些信息是为了向您提供我们最核心的服务内容展示/播放/下载服务,如您拒绝提供上述信息和/或权限将可能导致您无法使用我们的产品与服务。请您知悉,单独的设备信息、日志信息无法识别您的身份信息。
           <br />
           <h2>(三)信息统计、消息推送、分享、支付</h2>

部分文件因为文件数量过多而无法显示