Selaa lähdekoodia

Merge branch '11/24SAAS' into 0601Action

mo 2 vuotta sitten
vanhempi
commit
85d5fd0896
88 muutettua tiedostoa jossa 4391 lisäystä ja 2944 poistoa
  1. 0 0
      dist/index.html
  2. 0 0
      dist/static/css/chunk-087583d6.a598f9c8.css
  3. 0 1
      dist/static/css/chunk-0d319023.b7efbbfe.css
  4. 1 0
      dist/static/css/chunk-14c71a18.2e5f5315.css
  5. 1 0
      dist/static/css/chunk-15f14d6c.4dd85850.css
  6. 1 1
      dist/static/css/chunk-16eec650.99905f36.css
  7. 0 0
      dist/static/css/chunk-1bc06ad3.7d75b883.css
  8. 0 0
      dist/static/css/chunk-1dd65f4c.ae5cb9cc.css
  9. 0 0
      dist/static/css/chunk-2d2e5db1.991a567c.css
  10. 0 1
      dist/static/css/chunk-3c85fe6c.d9c7095a.css
  11. 0 0
      dist/static/css/chunk-4c8b3831.2d78f198.css
  12. 0 0
      dist/static/css/chunk-5444f946.474efa3c.css
  13. 0 1
      dist/static/css/chunk-665096e5.0dd0ad7d.css
  14. 0 0
      dist/static/css/chunk-6a11f5e4.73566dfc.css
  15. 0 1
      dist/static/css/chunk-7303fe92.ef7caa58.css
  16. 0 0
      dist/static/css/chunk-77f3bfdc.7515c8b2.css
  17. 0 0
      dist/static/css/chunk-7879452f.886a9877.css
  18. 1 0
      dist/static/css/chunk-9adedfe6.c128b922.css
  19. 0 0
      dist/static/css/chunk-cf00896e.0a49fc63.css
  20. 1 0
      dist/static/css/chunk-f518c388.4209f4c1.css
  21. 1 1
      dist/static/css/chunk-f9a2f440.b87303f9.css
  22. 1 1
      dist/static/img/empty.70d4d9a3.svg
  23. 0 0
      dist/static/js/app.bcb7121f.js
  24. 0 0
      dist/static/js/chunk-087583d6.57550198.js
  25. 0 0
      dist/static/js/chunk-08d5c6a5.7b0277a0.js
  26. 0 0
      dist/static/js/chunk-0cd5ddfa.68ebbe8d.js
  27. 0 0
      dist/static/js/chunk-0d319023.036e946d.js
  28. 0 0
      dist/static/js/chunk-14c71a18.2f9c551b.js
  29. 0 0
      dist/static/js/chunk-15f14d6c.28ce8552.js
  30. 0 0
      dist/static/js/chunk-16eec650.4335b004.js
  31. 1 1
      dist/static/js/chunk-1bc06ad3.463dcdaf.js
  32. 0 0
      dist/static/js/chunk-1dd65f4c.db2018ad.js
  33. 0 0
      dist/static/js/chunk-253b078c.efd3faec.js
  34. 0 0
      dist/static/js/chunk-253b078c.f2691bb1.js
  35. 0 0
      dist/static/js/chunk-2d2e5db1.f706084c.js
  36. 0 0
      dist/static/js/chunk-34f534da.5f80c4ea.js
  37. 0 0
      dist/static/js/chunk-3c85fe6c.76390d12.js
  38. 0 0
      dist/static/js/chunk-43ccc730.6dd79123.js
  39. 0 0
      dist/static/js/chunk-4c8b3831.fd15196c.js
  40. 0 0
      dist/static/js/chunk-53e139a5.4ae71938.js
  41. 0 0
      dist/static/js/chunk-5444f946.e92e7ee4.js
  42. 0 0
      dist/static/js/chunk-598480c1.fe3baf17.js
  43. 0 0
      dist/static/js/chunk-665096e5.fadb9841.js
  44. 0 0
      dist/static/js/chunk-6a11f5e4.6918dcfc.js
  45. 0 0
      dist/static/js/chunk-7303fe92.2519c62e.js
  46. 0 0
      dist/static/js/chunk-77f3bfdc.6d36505a.js
  47. 0 0
      dist/static/js/chunk-7879452f.7ae4e953.js
  48. 0 0
      dist/static/js/chunk-7a89b00a.c002c7cc.js
  49. 0 0
      dist/static/js/chunk-9adedfe6.23f08e73.js
  50. 0 0
      dist/static/js/chunk-a26cd514.fbe8edef.js
  51. 0 0
      dist/static/js/chunk-cf00896e.9938c76a.js
  52. 0 0
      dist/static/js/chunk-f518c388.e78486a1.js
  53. 0 0
      dist/static/js/chunk-f9a2f440.72d139b2.js
  54. 144 144
      dist/systemMaintain/index.html
  55. 1193 1193
      dist/yuepu/Fundamental-Level 1 - 4Flute.xml
  56. 16 16
      dist/yuepu/assets/background.2740ad6f.svg
  57. 0 0
      dist/yuepu/assets/index-legacy.83f908ef.js
  58. 0 0
      dist/yuepu/assets/index.1adfde28.js
  59. 13 13
      dist/yuepu/assets/music.b14142b5.svg
  60. 0 0
      dist/yuepu/assets/polyfills-legacy.351c0b44.js
  61. 0 0
      dist/yuepu/assets/polyfills-modern.61133417.js
  62. 15 15
      dist/yuepu/assets/replay.5d29554b.svg
  63. 23 23
      dist/yuepu/assets/setting.d94f0146.svg
  64. 0 0
      dist/yuepu/assets/vendor-legacy.047522f1.js
  65. 0 0
      dist/yuepu/assets/vendor.e484ff32.js
  66. 41 41
      dist/yuepu/index.html
  67. 17 17
      dist/yuepu/loading.svg
  68. 2 2
      package.json
  69. 69 27
      src/views/accompaniment/index.vue
  70. 3 3
      src/views/businessManager/shopManager/shopList.vue
  71. 85 75
      src/views/businessManager/shopManager/shopOperation.vue
  72. 41 21
      src/views/liveClassManager/index.vue
  73. 45 21
      src/views/liveClassManager/liveClassDetail.vue
  74. 11 2
      src/views/liveClassManager/modals/shareDetail.vue
  75. 103 36
      src/views/liveClassManager/newLiveClass.vue
  76. 12 17
      src/views/liveShopManger/index.vue
  77. 309 306
      src/views/main/baseinfo/index.vue
  78. 382 506
      src/views/main/baseinfo/management.vue
  79. 460 0
      src/views/main/baseinfo/modals/manageOrgan.vue
  80. 518 0
      src/views/main/baseinfo/modals/manageOrganAll.vue
  81. 169 0
      src/views/main/baseinfo/modals/searchDayHeader.vue
  82. 97 57
      src/views/productService/model/rechargeModel.vue
  83. 139 75
      src/views/productService/model/serviceModel.vue
  84. 104 57
      src/views/resetTeaming/modals/giveMemberModel.vue
  85. 93 26
      src/views/setQuestions/operation.vue
  86. 12 11
      src/views/studentManager/studentList.vue
  87. 146 150
      src/views/teacherManager/teacherDetail/components/teacherInfo.vue
  88. 121 82
      src/views/teacherManager/teacherDetail/index.vue

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/index.html


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-087583d6.a598f9c8.css


+ 0 - 1
dist/static/css/chunk-0d319023.b7efbbfe.css

@@ -1 +0,0 @@
-.dialog-footer[data-v-07e9e40c]{display:block;text-align:right;margin-top:20px}.title[data-v-3b09448b]{margin-bottom:30px;font-size:16px;color:#000}.dialog-footer[data-v-4d102b4c]{display:block;text-align:right;margin-top:20px}.newBand[data-v-e4373e10]{display:inline-block;margin-right:10px}.right-code .title[data-v-e4373e10]{font-size:18px;text-align:center;padding-bottom:8px}[data-v-e4373e10] .studentInfo .multiple.el-select{width:185px!important}.red[data-v-e4373e10]{color:red}.demo-table-expand label[data-v-e4373e10]{width:150px;color:#99a9bf}.demo-table-expand .el-form-item[data-v-e4373e10]{margin-right:0;margin-bottom:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;position:relative}.demo-table-expand .el-form-item__label[data-v-e4373e10]{z-index:100}[data-v-e4373e10] .el-table__expanded-cell[class*=cell]{padding:20px 0 20px 110px}.schoolWrap[data-v-e4373e10]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

+ 1 - 0
dist/static/css/chunk-14c71a18.2e5f5315.css

@@ -0,0 +1 @@
+.alert[data-v-3960a935]{margin-bottom:22px}.shopImage[data-v-3960a935]{width:60px;height:60px}.shopDesc[data-v-3960a935]{max-height:70px;overflow:hidden}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-3960a935]{max-width:95px}.hiddenStart[data-v-3960a935] .el-form-item__label:before{content:""!important;position:absolute;color:transparent;margin-right:4px}

+ 1 - 0
dist/static/css/chunk-15f14d6c.4dd85850.css

@@ -0,0 +1 @@
+.hiddenStart[data-v-586af1a5] .el-form-item__label:before{content:""!important;position:absolute;color:transparent;margin-right:4px}.alert[data-v-586af1a5]{margin-bottom:22px}.el-row[data-v-586af1a5]{margin-top:40px}.el-col[data-v-586af1a5]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-right:50%}.el-input-group[data-v-586af1a5]{width:200px;margin:0 20px}[data-v-586af1a5] .el-tree-node__content{height:40px!important}[data-v-586af1a5] .avatar-uploader .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-586af1a5]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-586af1a5]{font-size:28px;color:#8c939d;width:120px;height:120px;line-height:120px;text-align:center}.avatar[data-v-586af1a5]{width:120px;height:120px;display:block}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-586af1a5]{max-width:95px}.imageSize[data-v-586af1a5]{color:red;line-height:1.5}

+ 1 - 1
dist/static/css/chunk-08d5c6a5.ad84074e.css → dist/static/css/chunk-16eec650.99905f36.css

@@ -1 +1 @@
-.btns[data-v-49790124]{text-align:right}.files[data-v-49790124]{background-color:#f8f8f8;padding:20px 0;padding-right:20px;margin-bottom:20px;border-radius:5px;position:relative}.files .file-remove[data-v-49790124]{position:absolute;right:20px;bottom:10px}.myCascader .el-radio{width:100%;height:100%;z-index:10;position:absolute;top:10px;right:10px}.myCascader .el-radio__input{visibility:hidden}.myCascader .el-cascader-node__postfix{top:10px}[data-v-f7cf953c] .el-dropdown{margin-right:10px;color:#14928a}.remark[data-v-f7cf953c]{display:inline;overflow:hidden;white-space:pre}.lookForm[data-v-f7cf953c] .el-dialog__body{padding:0}.iframe_back[data-v-f7cf953c]{width:195px;height:45px;position:absolute;bottom:50px;background:transparent;left:50%;z-index:99;margin-left:-100px}.iframe_help[data-v-f7cf953c]{position:absolute;background:transparent;width:50px;height:120px;top:50%;right:0;margin-top:-35px}.iframe_header_back[data-v-f7cf953c]{background:transparent;width:225px;height:50px;position:absolute;top:65px;left:20px}
+.btns[data-v-49790124]{text-align:right}.files[data-v-49790124]{background-color:#f8f8f8;padding:20px 0;padding-right:20px;margin-bottom:20px;border-radius:5px;position:relative}.files .file-remove[data-v-49790124]{position:absolute;right:20px;bottom:10px}.myCascader .el-radio{width:100%;height:100%;z-index:10;position:absolute;top:10px;right:10px}.myCascader .el-radio__input{visibility:hidden}.myCascader .el-cascader-node__postfix{top:10px}[data-v-8add0188] .el-dropdown{margin-right:10px;color:#14928a}.remark[data-v-8add0188]{display:inline;overflow:hidden;white-space:pre}.lookForm[data-v-8add0188] .el-dialog__body{padding:0}.iframe_back[data-v-8add0188]{width:195px;height:45px;position:absolute;bottom:50px;background:transparent;left:50%;z-index:99;margin-left:-100px}.iframe_help[data-v-8add0188]{position:absolute;background:transparent;width:50px;height:120px;top:50%;right:0;margin-top:-35px}.iframe_header_back[data-v-8add0188]{background:transparent;width:225px;height:50px;position:absolute;top:65px;left:20px}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-1bc06ad3.7d75b883.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-1dd65f4c.ae5cb9cc.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-2d2e5db1.991a567c.css


+ 0 - 1
dist/static/css/chunk-3c85fe6c.d9c7095a.css

@@ -1 +0,0 @@
-.hiddenStart[data-v-5ee77fb0] .el-form-item__label:before{content:""!important;position:absolute;color:transparent;margin-right:4px}.alert[data-v-5ee77fb0]{margin-bottom:22px}.el-row[data-v-5ee77fb0]{margin-top:40px}.el-col[data-v-5ee77fb0]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-right:50%}.el-input-group[data-v-5ee77fb0]{width:200px;margin:0 20px}[data-v-5ee77fb0] .el-tree-node__content{height:40px!important}[data-v-5ee77fb0] .avatar-uploader .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-5ee77fb0]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-5ee77fb0]{font-size:28px;color:#8c939d;width:120px;height:120px;line-height:120px;text-align:center}.avatar[data-v-5ee77fb0]{width:120px;height:120px;display:block}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-5ee77fb0]{max-width:95px}.imageSize[data-v-5ee77fb0]{color:red;line-height:1.5}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-4c8b3831.2d78f198.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-5444f946.474efa3c.css


+ 0 - 1
dist/static/css/chunk-665096e5.0dd0ad7d.css

@@ -1 +0,0 @@
-.chioseWrap[data-v-368e77bc]{text-align:center;font-size:16px}.chioseWrap>p[data-v-368e77bc]{font-weight:600;padding-bottom:15px;line-height:1.5}.chioseWrap>p span[data-v-368e77bc]{color:red;padding:0 3px}.dialog-footer[data-v-368e77bc]{text-align:right;display:block;padding-top:15px}.chioseWrap[data-v-20fbc19e]{font-size:16px}.chioseWrap>p[data-v-20fbc19e]{font-weight:500;padding-bottom:15px}.chioseWrap>p span[data-v-20fbc19e]{color:red;padding:0 3px}.dialog-footer[data-v-20fbc19e]{text-align:right;display:block;padding-top:15px}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-6a11f5e4.73566dfc.css


+ 0 - 1
dist/static/css/chunk-7303fe92.ef7caa58.css

@@ -1 +0,0 @@
-.alert[data-v-deea135c]{margin-bottom:22px}.shopImage[data-v-deea135c]{width:60px;height:60px}.shopDesc[data-v-deea135c]{max-height:70px;overflow:hidden}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-deea135c]{max-width:95px}.hiddenStart[data-v-deea135c] .el-form-item__label:before{content:""!important;position:absolute;color:transparent;margin-right:4px}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-77f3bfdc.7515c8b2.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-7879452f.886a9877.css


+ 1 - 0
dist/static/css/chunk-9adedfe6.c128b922.css

@@ -0,0 +1 @@
+.dialog-footer[data-v-07e9e40c]{display:block;text-align:right;margin-top:20px}.title[data-v-3b09448b]{margin-bottom:30px;font-size:16px;color:#000}.dialog-footer[data-v-4d102b4c]{display:block;text-align:right;margin-top:20px}.newBand[data-v-06126804]{display:inline-block;margin-right:10px}.right-code .title[data-v-06126804]{font-size:18px;text-align:center;padding-bottom:8px}[data-v-06126804] .studentInfo .multiple.el-select{width:185px!important}.red[data-v-06126804]{color:red}.demo-table-expand label[data-v-06126804]{width:150px;color:#99a9bf}.demo-table-expand .el-form-item[data-v-06126804]{margin-right:0;margin-bottom:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;position:relative}.demo-table-expand .el-form-item__label[data-v-06126804]{z-index:100}[data-v-06126804] .el-table__expanded-cell[class*=cell]{padding:20px 0 20px 110px}.schoolWrap[data-v-06126804]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/chunk-cf00896e.0a49fc63.css


+ 1 - 0
dist/static/css/chunk-f518c388.4209f4c1.css

@@ -0,0 +1 @@
+.chioseWrap[data-v-368e77bc]{text-align:center;font-size:16px}.chioseWrap>p[data-v-368e77bc]{font-weight:600;padding-bottom:15px;line-height:1.5}.chioseWrap>p span[data-v-368e77bc]{color:red;padding:0 3px}.dialog-footer[data-v-368e77bc]{text-align:right;display:block;padding-top:15px}.chioseWrap[data-v-36506a1d]{font-size:16px}.chioseWrap>p[data-v-36506a1d]{font-weight:500;padding-bottom:15px}.chioseWrap>p span[data-v-36506a1d]{color:red;padding:0 3px}.dialog-footer[data-v-36506a1d]{text-align:right;display:block;padding-top:15px}

+ 1 - 1
dist/static/css/chunk-0cd5ddfa.f09dfc3e.css → dist/static/css/chunk-f9a2f440.b87303f9.css

@@ -1 +1 @@
-.process[data-v-2e4894ee]{padding:10px;max-height:400px;overflow-y:auto}.process .name[data-v-2e4894ee]{font-size:16px;font-weight:700;color:#262626;margin-bottom:8px}.process .concat[data-v-2e4894ee]{font-size:14px}.process .concat[data-v-2e4894ee],.process .timer[data-v-2e4894ee]{font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#666;line-height:18px;margin-bottom:8px}.process .timer[data-v-2e4894ee]{font-size:12px}.el-timeline-item__content[data-v-2e4894ee]{position:relative}[data-v-2e4894ee] .el-timeline-item__node{background-color:var(--color-primary)}[data-v-2e4894ee] .el-timeline-item__tail{border-left:2px solid var(--color-primary)}.courseMask .el-dialog__body[data-v-24316af6]{padding-bottom:0}.process[data-v-705461eb]{padding:10px;max-height:600px;overflow-y:auto}.process .name[data-v-705461eb]{font-size:16px;font-weight:700}.process div[data-v-705461eb]{line-height:30px}.detailImgList[data-v-705461eb]{padding:0 20px}.horizontal[data-v-705461eb]{width:208x;height:208px}.vertical[data-v-705461eb]{width:208px;height:208px}.imgWrapItem[data-v-705461eb]{margin-bottom:20px;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;font-weight:500;color:#666;line-height:20px}.imgWrapItem p[data-v-705461eb]{margin-bottom:8px}.imgWrapItem .el-image[data-v-705461eb],.logo[data-v-705461eb]{border:1px solid #dedede;border-radius:4px;background:#fff}.logo[data-v-705461eb]{color:var(--color-primary);width:208px;height:208px;display:inline-block;line-height:208px;text-align:center}[data-v-705461eb] .el-image__error{width:206px}.courseMask .el-dialog__body[data-v-74db3f70],.courseMask .el-dialog__body[data-v-90ce9be4]{padding-bottom:0}
+.process[data-v-2e4894ee]{padding:10px;max-height:400px;overflow-y:auto}.process .name[data-v-2e4894ee]{font-size:16px;font-weight:700;color:#262626;margin-bottom:8px}.process .concat[data-v-2e4894ee]{font-size:14px}.process .concat[data-v-2e4894ee],.process .timer[data-v-2e4894ee]{font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#666;line-height:18px;margin-bottom:8px}.process .timer[data-v-2e4894ee]{font-size:12px}.el-timeline-item__content[data-v-2e4894ee]{position:relative}[data-v-2e4894ee] .el-timeline-item__node{background-color:var(--color-primary)}[data-v-2e4894ee] .el-timeline-item__tail{border-left:2px solid var(--color-primary)}.courseMask .el-dialog__body[data-v-24316af6]{padding-bottom:0}.process[data-v-090d8870]{padding:10px;max-height:600px;overflow-y:auto}.process .name[data-v-090d8870]{font-size:16px;font-weight:700}.process div[data-v-090d8870]{line-height:30px}.detailImgList[data-v-090d8870]{padding:0 20px}.horizontal[data-v-090d8870]{width:208x;height:208px}.vertical[data-v-090d8870]{width:208px;height:208px}.imgWrapItem[data-v-090d8870]{margin-bottom:20px;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;font-weight:500;color:#666;line-height:20px}.imgWrapItem p[data-v-090d8870]{margin-bottom:8px}.imgWrapItem .el-image[data-v-090d8870],.logo[data-v-090d8870]{border:1px solid #dedede;border-radius:4px;background:#fff}.logo[data-v-090d8870]{color:var(--color-primary);width:208px;height:208px;display:inline-block;line-height:208px;text-align:center}[data-v-090d8870] .el-image__error{width:206px}.courseMask .el-dialog__body[data-v-74db3f70],.courseMask .el-dialog__body[data-v-90ce9be4]{padding-bottom:0}

+ 1 - 1
dist/static/img/empty.70d4d9a3.svg

@@ -1 +1 @@
-<svg t="1609119920930" class="icon" viewBox="0 0 1706 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10437" width="256" height="256"><path d="M0 851.446623a853.285929 172.553377 0 1 0 1706.571857 0 853.285929 172.553377 0 1 0-1706.571857 0Z" fill="#ECEEF2" p-id="10438"></path><path d="M304.149029 857.135196a92.534118 92.534118 0 0 1-91.775642-92.913356L151.316038 301.361628a27.494769 27.494769 0 0 1 9.480955-21.426958L439.726682 6.883173a27.874007 27.874007 0 0 1 18.961909-6.826287h793.555914a27.30515 27.30515 0 0 1 18.961909 6.067811l277.602356 273.620354a34.131437 34.131437 0 0 1 9.670574 21.806196l-61.057349 462.670593a92.534118 92.534118 0 0 1-91.775642 92.913356z" fill="#E1E5EC" p-id="10439"></path><path d="M242.143585 764.22184a61.815825 61.815825 0 0 0 62.005444 62.005444h1099.790752a60.298872 60.298872 0 0 0 60.678111-61.057349l61.057348-452.241542H1076.467604l-2.844287 18.961909a223.371294 223.371294 0 0 1-66.177064 126.096699 217.87234 217.87234 0 0 1-150.178323 60.867729 221.285484 221.285484 0 0 1-216.924245-187.343666l-3.033906-18.961909H180.32776z" fill="#F4F5F7" p-id="10440"></path><path d="M202.133956 282.02048h447.121826a11.377146 11.377146 0 0 1 9.860193 11.187527 197.203859 197.203859 0 1 0 394.407718 0 10.618669 10.618669 0 0 1 10.049812-11.187527h442.570968L1251.675648 29.827084h-792.607818z" fill="#FFFFFF" p-id="10441"></path><path d="M1117.994186 338.147733l378.290095-0.568858-56.316872 405.974483-38.871914-0.948095 53.662204-371.08457-342.831325 1.327334z" fill="#FFFFFF" p-id="10442"></path></svg>
+<svg t="1609119920930" class="icon" viewBox="0 0 1706 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10437" width="256" height="256"><path d="M0 851.446623a853.285929 172.553377 0 1 0 1706.571857 0 853.285929 172.553377 0 1 0-1706.571857 0Z" fill="#ECEEF2" p-id="10438"></path><path d="M304.149029 857.135196a92.534118 92.534118 0 0 1-91.775642-92.913356L151.316038 301.361628a27.494769 27.494769 0 0 1 9.480955-21.426958L439.726682 6.883173a27.874007 27.874007 0 0 1 18.961909-6.826287h793.555914a27.30515 27.30515 0 0 1 18.961909 6.067811l277.602356 273.620354a34.131437 34.131437 0 0 1 9.670574 21.806196l-61.057349 462.670593a92.534118 92.534118 0 0 1-91.775642 92.913356z" fill="#E1E5EC" p-id="10439"></path><path d="M242.143585 764.22184a61.815825 61.815825 0 0 0 62.005444 62.005444h1099.790752a60.298872 60.298872 0 0 0 60.678111-61.057349l61.057348-452.241542H1076.467604l-2.844287 18.961909a223.371294 223.371294 0 0 1-66.177064 126.096699 217.87234 217.87234 0 0 1-150.178323 60.867729 221.285484 221.285484 0 0 1-216.924245-187.343666l-3.033906-18.961909H180.32776z" fill="#F4F5F7" p-id="10440"></path><path d="M202.133956 282.02048h447.121826a11.377146 11.377146 0 0 1 9.860193 11.187527 197.203859 197.203859 0 1 0 394.407718 0 10.618669 10.618669 0 0 1 10.049812-11.187527h442.570968L1251.675648 29.827084h-792.607818z" fill="#FFFFFF" p-id="10441"></path><path d="M1117.994186 338.147733l378.290095-0.568858-56.316872 405.974483-38.871914-0.948095 53.662204-371.08457-342.831325 1.327334z" fill="#FFFFFF" p-id="10442"></path></svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/app.bcb7121f.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-087583d6.57550198.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-08d5c6a5.7b0277a0.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-0cd5ddfa.68ebbe8d.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-0d319023.036e946d.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-14c71a18.2f9c551b.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-15f14d6c.28ce8552.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-16eec650.4335b004.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
dist/static/js/chunk-1bc06ad3.463dcdaf.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-1dd65f4c.db2018ad.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-253b078c.efd3faec.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-253b078c.f2691bb1.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-2d2e5db1.f706084c.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-34f534da.5f80c4ea.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-3c85fe6c.76390d12.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-43ccc730.6dd79123.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-4c8b3831.fd15196c.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-53e139a5.4ae71938.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-5444f946.e92e7ee4.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-598480c1.fe3baf17.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-665096e5.fadb9841.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-6a11f5e4.6918dcfc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-7303fe92.2519c62e.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-77f3bfdc.6d36505a.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-7879452f.7ae4e953.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-7a89b00a.c002c7cc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-9adedfe6.23f08e73.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-a26cd514.fbe8edef.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-cf00896e.9938c76a.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-f518c388.e78486a1.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/chunk-f9a2f440.72d139b2.js


+ 144 - 144
dist/systemMaintain/index.html

@@ -1,144 +1,144 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-  <meta charset="UTF-8">
-  <link rel="icon" href="./favicon.ico" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>管乐迷</title>
-  <style>
-    .wscn-http404-container {
-      transform: translate(-50%, -50%);
-      position: absolute;
-      top: 40%;
-      left: 50%;
-    }
-
-    .wscn-http404 {
-      position: relative;
-      width: 1000px;
-      padding: 0 50px;
-      overflow: hidden;
-    }
-
-    .pic-404 {
-      position: relative;
-      float: left;
-      width: 475px;
-      overflow: hidden;
-    }
-
-    .pic-404__parent {
-      width: 100%;
-      width: 475px;
-      height: 430px;
-    }
-
-    .pic-404__child {
-      position: absolute;
-      width: 475px;
-      height: 430px;
-    }
-
-
-    .bullshit {
-      position: relative;
-      float: left;
-      width: 365px;
-      padding: 120px 0 30px;
-      margin-left: 100px;
-      overflow: hidden;
-    }
-
-    .bullshit__oops {
-      font-size: 32px;
-      font-weight: bold;
-      line-height: 40px;
-      color: #000;
-      opacity: 0;
-      margin-bottom: 20px;
-      animation-name: slideUp;
-      animation-duration: 0.5s;
-      animation-fill-mode: forwards;
-    }
-
-    .bullshit__headline {
-      font-size: 20px;
-      line-height: 24px;
-      color: #222;
-      font-weight: bold;
-      opacity: 0;
-      margin-bottom: 10px;
-      animation-name: slideUp;
-      animation-duration: 0.5s;
-      animation-delay: 0.1s;
-      animation-fill-mode: forwards;
-    }
-
-    .bullshit__info {
-      font-size: 18px;
-      line-height: 31px;
-      color: #666;
-      opacity: 0;
-      margin-bottom: 30px;
-      animation-name: slideUp;
-      animation-duration: 0.5s;
-      animation-delay: 0.2s;
-      animation-fill-mode: forwards;
-    }
-
-    .bullshit__return-home {
-      display: block;
-      float: left;
-      width: 110px;
-      height: 36px;
-      background: #1482f0;
-      border-radius: 100px;
-      text-align: center;
-      color: #ffffff;
-      opacity: 0;
-      font-size: 14px;
-      line-height: 36px;
-      cursor: pointer;
-      animation-name: slideUp;
-      animation-duration: 0.5s;
-      animation-delay: 0.3s;
-      animation-fill-mode: forwards;
-    }
-
-    @keyframes slideUp {
-      0% {
-        transform: translateY(60px);
-        opacity: 0;
-      }
-
-      100% {
-        transform: translateY(0);
-        opacity: 1;
-      }
-    }
-
-  </style>
-</head>
-
-<body>
-  <div class="wscn-http404-container">
-    <div class="wscn-http404">
-      <div class="pic-404">
-        <img class="pic-404__parent" src="./bg.png" alt="bg">
-      </div>
-      <div class="bullshit">
-        <div class="bullshit__oops">系统升级中</div>
-        <div class="bullshit__info">我们正在对系统进行升级,升级期间暂时无法访问。预计结束时间:2022年2月10日 22:00
-          给您带来的不便,敬请谅解!</div>
-        <!-- <a href=""
-           class="bullshit__return-home">返回首页</a> -->
-      </div>
-    </div>
-  </div>
-  <!-- <div id="app"></div>
-  <img id="loading" class="show" src="./bg.png" alt="loading"/>
-  系统维护中 -->
-</body>
-
-</html>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8">
+  <link rel="icon" href="./favicon.ico" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>管乐迷</title>
+  <style>
+    .wscn-http404-container {
+      transform: translate(-50%, -50%);
+      position: absolute;
+      top: 40%;
+      left: 50%;
+    }
+
+    .wscn-http404 {
+      position: relative;
+      width: 1000px;
+      padding: 0 50px;
+      overflow: hidden;
+    }
+
+    .pic-404 {
+      position: relative;
+      float: left;
+      width: 475px;
+      overflow: hidden;
+    }
+
+    .pic-404__parent {
+      width: 100%;
+      width: 475px;
+      height: 430px;
+    }
+
+    .pic-404__child {
+      position: absolute;
+      width: 475px;
+      height: 430px;
+    }
+
+
+    .bullshit {
+      position: relative;
+      float: left;
+      width: 365px;
+      padding: 120px 0 30px;
+      margin-left: 100px;
+      overflow: hidden;
+    }
+
+    .bullshit__oops {
+      font-size: 32px;
+      font-weight: bold;
+      line-height: 40px;
+      color: #000;
+      opacity: 0;
+      margin-bottom: 20px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-fill-mode: forwards;
+    }
+
+    .bullshit__headline {
+      font-size: 20px;
+      line-height: 24px;
+      color: #222;
+      font-weight: bold;
+      opacity: 0;
+      margin-bottom: 10px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.1s;
+      animation-fill-mode: forwards;
+    }
+
+    .bullshit__info {
+      font-size: 18px;
+      line-height: 31px;
+      color: #666;
+      opacity: 0;
+      margin-bottom: 30px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.2s;
+      animation-fill-mode: forwards;
+    }
+
+    .bullshit__return-home {
+      display: block;
+      float: left;
+      width: 110px;
+      height: 36px;
+      background: #1482f0;
+      border-radius: 100px;
+      text-align: center;
+      color: #ffffff;
+      opacity: 0;
+      font-size: 14px;
+      line-height: 36px;
+      cursor: pointer;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.3s;
+      animation-fill-mode: forwards;
+    }
+
+    @keyframes slideUp {
+      0% {
+        transform: translateY(60px);
+        opacity: 0;
+      }
+
+      100% {
+        transform: translateY(0);
+        opacity: 1;
+      }
+    }
+
+  </style>
+</head>
+
+<body>
+  <div class="wscn-http404-container">
+    <div class="wscn-http404">
+      <div class="pic-404">
+        <img class="pic-404__parent" src="./bg.png" alt="bg">
+      </div>
+      <div class="bullshit">
+        <div class="bullshit__oops">系统升级中</div>
+        <div class="bullshit__info">我们正在对系统进行升级,升级期间暂时无法访问。预计结束时间:2022年2月10日 22:00
+          给您带来的不便,敬请谅解!</div>
+        <!-- <a href=""
+           class="bullshit__return-home">返回首页</a> -->
+      </div>
+    </div>
+  </div>
+  <!-- <div id="app"></div>
+  <img id="loading" class="show" src="./bg.png" alt="loading"/>
+  系统维护中 -->
+</body>
+
+</html>

+ 1193 - 1193
dist/yuepu/Fundamental-Level 1 - 4Flute.xml

@@ -1,1193 +1,1193 @@
-<?xml version="1.0" encoding='UTF-8' standalone='no' ?>
-<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.0 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
-<score-partwise version="3.0">
- <work>
-  <work-title>Fundamental</work-title>
- </work>
- <identification>
-  <rights>Daya Music</rights>
-  <encoding>
-   <encoding-date>2021-02-25</encoding-date>
-   <encoder>Administrator</encoder>
-   <software>Sibelius 7.5.0</software>
-   <software>Direct export, not from Dolet</software>
-   <encoding-description>Sibelius / MusicXML 3.0</encoding-description>
-   <supports element="print" type="yes" value="yes" attribute="new-system" />
-   <supports element="print" type="yes" value="yes" attribute="new-page" />
-   <supports element="accidental" type="yes" />
-   <supports element="beam" type="yes" />
-   <supports element="stem" type="yes" />
-  </encoding>
- </identification>
- <defaults>
-  <scaling>
-   <millimeters>210</millimeters>
-   <tenths>1292</tenths>
-  </scaling>
-  <page-layout>
-   <page-height>1827</page-height>
-   <page-width>1292</page-width>
-   <page-margins type="both">
-    <left-margin>92</left-margin>
-    <right-margin>92</right-margin>
-    <top-margin>92</top-margin>
-    <bottom-margin>92</bottom-margin>
-   </page-margins>
-  </page-layout>
-  <system-layout>
-   <system-margins>
-    <left-margin>112</left-margin>
-    <right-margin>0</right-margin>
-   </system-margins>
-   <system-distance>100</system-distance>
-  </system-layout>
-  <appearance>
-   <line-width type="stem">0.9375</line-width>
-   <line-width type="beam">5</line-width>
-   <line-width type="staff">0.9375</line-width>
-   <line-width type="light barline">1.5625</line-width>
-   <line-width type="heavy barline">5</line-width>
-   <line-width type="leger">1.5625</line-width>
-   <line-width type="ending">1.5625</line-width>
-   <line-width type="wedge">1.25</line-width>
-   <line-width type="enclosure">0.9375</line-width>
-   <line-width type="tuplet bracket">1.25</line-width>
-   <line-width type="bracket">5</line-width>
-   <line-width type="dashes">1.5625</line-width>
-   <line-width type="extend">0.9375</line-width>
-   <line-width type="octave shift">1.5625</line-width>
-   <line-width type="pedal">1.5625</line-width>
-   <line-width type="slur middle">1.5625</line-width>
-   <line-width type="slur tip">0.625</line-width>
-   <line-width type="tie middle">1.5625</line-width>
-   <line-width type="tie tip">0.625</line-width>
-   <note-size type="cue">75</note-size>
-   <note-size type="grace">60</note-size>
-  </appearance>
-  <music-font font-family="Opus Std" font-size="18.4252" />
-  <lyric-font font-family="Times New Roman" font-size="10.6521" />
-  <lyric-language xml:lang="zh" />
- </defaults>
- <part-list>
-  <score-part id="P1">
-   <part-name>Flute</part-name>
-   <part-name-display>
-    <display-text>Flute</display-text>
-   </part-name-display>
-   <part-abbreviation>Fl.</part-abbreviation>
-   <part-abbreviation-display>
-    <display-text>Fl.</display-text>
-   </part-abbreviation-display>
-   <score-instrument id="P1-I1">
-    <instrument-name>Flute (2)</instrument-name>
-    <instrument-sound>wind.flutes.flute</instrument-sound>
-    <solo />
-    <virtual-instrument>
-     <virtual-library>General MIDI</virtual-library>
-     <virtual-name>Flute</virtual-name>
-    </virtual-instrument>
-   </score-instrument>
-  </score-part>
- </part-list>
- <part id="P1">
-  <!--============== Part: P1, Measure: 1 ==============-->
-  <measure number="1" width="234">
-   <print new-page="yes">
-    <system-layout>
-     <system-margins>
-      <left-margin>22</left-margin>
-      <right-margin>0</right-margin>
-     </system-margins>
-     <top-system-distance>250</top-system-distance>
-    </system-layout>
-   </print>
-   <attributes>
-    <divisions>256</divisions>
-    <key color="#000000">
-     <fifths>0</fifths>
-     <mode>major</mode>
-    </key>
-    <time color="#000000">
-     <beats>4</beats>
-     <beat-type>4</beat-type>
-    </time>
-    <staves>1</staves>
-    <clef number="1" color="#000000">
-     <sign>G</sign>
-     <line>2</line>
-    </clef>
-    <staff-details number="1" print-object="yes" />
-   </attributes>
-   <note color="#000000" default-x="75" default-y="-35">
-    <pitch>
-     <step>F</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="115" default-y="-40">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="155" default-y="-45">
-    <pitch>
-     <step>D</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="194" default-y="-50">
-    <pitch>
-     <step>C</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 2 ==============-->
-  <measure number="2" width="112">
-   <note color="#000000" default-x="19">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <accidental>flat</accidental>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 3 ==============-->
-  <measure number="3" width="177">
-   <note color="#000000" default-x="19" default-y="-40">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="58" default-y="-45">
-    <pitch>
-     <step>D</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="98" default-y="-50">
-    <pitch>
-     <step>C</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="138" default-y="-55">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 4 ==============-->
-  <measure number="4" width="107">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 5 ==============-->
-  <measure number="5" width="173">
-   <note color="#000000" default-x="15" default-y="-45">
-    <pitch>
-     <step>D</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="54" default-y="-50">
-    <pitch>
-     <step>C</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="94" default-y="-55">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="133" default-y="10">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 6 ==============-->
-  <measure number="6" width="107">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 7 ==============-->
-  <measure number="7" width="173">
-   <note color="#000000" default-x="15" default-y="-50">
-    <pitch>
-     <step>C</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="54" default-y="-55">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="94" default-y="10">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="133" default-y="5">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 8 ==============-->
-  <measure number="8" width="159">
-   <print new-system="yes">
-    <system-layout>
-     <system-margins>
-      <left-margin>22</left-margin>
-      <right-margin>0</right-margin>
-     </system-margins>
-     <system-distance>100</system-distance>
-    </system-layout>
-   </print>
-   <attributes>
-    <staff-details number="1" print-object="yes" />
-   </attributes>
-   <note color="#000000" default-x="57">
-    <pitch>
-     <step>F</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 9 ==============-->
-  <measure number="9" width="193">
-   <note color="#000000" default-x="19" default-y="-55">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="62" default-y="10">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="106" default-y="5">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="149">
-    <pitch>
-     <step>F</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 10 ==============-->
-  <measure number="10" width="122">
-   <note color="#000000" default-x="20">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <accidental>flat</accidental>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 11 ==============-->
-  <measure number="11" width="189">
-   <note color="#000000" default-x="15" default-y="10">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="under" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="58" default-y="5">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="102">
-    <pitch>
-     <step>F</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="145" default-y="-5">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 12 ==============-->
-  <measure number="12" width="116">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>D</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="under" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 13 ==============-->
-  <measure number="13" width="189">
-   <note color="#000000" default-x="15" default-y="5">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="under" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="58">
-    <pitch>
-     <step>F</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="101" default-y="-5">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="145" default-y="-10">
-    <pitch>
-     <step>D</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 14 ==============-->
-  <measure number="14" width="116">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>C</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="under" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 15 ==============-->
-  <measure number="15" width="220">
-   <print new-system="yes">
-    <system-layout>
-     <system-margins>
-      <left-margin>22</left-margin>
-      <right-margin>0</right-margin>
-     </system-margins>
-     <system-distance>100</system-distance>
-    </system-layout>
-   </print>
-   <attributes>
-    <staff-details number="1" print-object="yes" />
-   </attributes>
-   <note color="#000000" default-x="57" default-y="-35">
-    <pitch>
-     <step>F</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="98" default-y="-40">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="139" default-y="-45">
-    <pitch>
-     <step>D</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="179" default-y="-50">
-    <pitch>
-     <step>C</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 16 ==============-->
-  <measure number="16" width="110">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <accidental>flat</accidental>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 17 ==============-->
-  <measure number="17" width="178">
-   <note color="#000000" default-x="15" default-y="-40">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="55" default-y="-45">
-    <pitch>
-     <step>D</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="96" default-y="-50">
-    <pitch>
-     <step>C</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="137" default-y="-55">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 18 ==============-->
-  <measure number="18" width="110">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 19 ==============-->
-  <measure number="19" width="178">
-   <note color="#000000" default-x="15" default-y="-45">
-    <pitch>
-     <step>D</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="55" default-y="-50">
-    <pitch>
-     <step>C</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="96" default-y="-55">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="137" default-y="10">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 20 ==============-->
-  <measure number="20" width="110">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 21 ==============-->
-  <measure number="21" width="178">
-   <note color="#000000" default-x="15" default-y="-50">
-    <pitch>
-     <step>C</step>
-     <octave>5</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="55" default-y="-55">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="96" default-y="10">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="137" default-y="5">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 22 ==============-->
-  <measure number="22" width="158">
-   <print new-system="yes">
-    <system-layout>
-     <system-margins>
-      <left-margin>22</left-margin>
-      <right-margin>0</right-margin>
-     </system-margins>
-     <system-distance>100</system-distance>
-    </system-layout>
-   </print>
-   <attributes>
-    <staff-details number="1" print-object="yes" />
-   </attributes>
-   <note color="#000000" default-x="57">
-    <pitch>
-     <step>F</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 23 ==============-->
-  <measure number="23" width="187">
-   <note color="#000000" default-x="15" default-y="-55">
-    <pitch>
-     <step>B</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>down</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="over" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="58" default-y="10">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="101" default-y="5">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="144">
-    <pitch>
-     <step>F</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 24 ==============-->
-  <measure number="24" width="115">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <accidental>flat</accidental>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="over" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 25 ==============-->
-  <measure number="25" width="188">
-   <note color="#000000" default-x="15" default-y="10">
-    <pitch>
-     <step>A</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="under" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="58" default-y="5">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="101">
-    <pitch>
-     <step>F</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="144" default-y="-5">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 26 ==============-->
-  <measure number="26" width="115">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>D</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="under" />
-    </notations>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 27 ==============-->
-  <measure number="27" width="187">
-   <note color="#000000" default-x="15" default-y="5">
-    <pitch>
-     <step>G</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="start" orientation="under" />
-    </notations>
-   </note>
-   <note color="#000000" default-x="58">
-    <pitch>
-     <step>F</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="101" default-y="-5">
-    <pitch>
-     <step>E</step>
-     <alter>-1</alter>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <accidental>flat</accidental>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-   <note color="#000000" default-x="144" default-y="-10">
-    <pitch>
-     <step>D</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>256</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>quarter</type>
-    <stem>up</stem>
-    <staff>1</staff>
-   </note>
-  </measure>
-  <!--============== Part: P1, Measure: 28 ==============-->
-  <measure number="28" width="131">
-   <note color="#000000" default-x="15">
-    <pitch>
-     <step>C</step>
-     <octave>4</octave>
-    </pitch>
-    <duration>1024</duration>
-    <instrument id="P1-I1" />
-    <voice>1</voice>
-    <type>whole</type>
-    <staff>1</staff>
-    <notations>
-     <slur color="#000000" type="stop" orientation="under" />
-    </notations>
-   </note>
-   <barline>
-    <bar-style>light-heavy</bar-style>
-   </barline>
-  </measure>
- </part>
-</score-partwise>
+<?xml version="1.0" encoding='UTF-8' standalone='no' ?>
+<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.0 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
+<score-partwise version="3.0">
+ <work>
+  <work-title>Fundamental</work-title>
+ </work>
+ <identification>
+  <rights>Daya Music</rights>
+  <encoding>
+   <encoding-date>2021-02-25</encoding-date>
+   <encoder>Administrator</encoder>
+   <software>Sibelius 7.5.0</software>
+   <software>Direct export, not from Dolet</software>
+   <encoding-description>Sibelius / MusicXML 3.0</encoding-description>
+   <supports element="print" type="yes" value="yes" attribute="new-system" />
+   <supports element="print" type="yes" value="yes" attribute="new-page" />
+   <supports element="accidental" type="yes" />
+   <supports element="beam" type="yes" />
+   <supports element="stem" type="yes" />
+  </encoding>
+ </identification>
+ <defaults>
+  <scaling>
+   <millimeters>210</millimeters>
+   <tenths>1292</tenths>
+  </scaling>
+  <page-layout>
+   <page-height>1827</page-height>
+   <page-width>1292</page-width>
+   <page-margins type="both">
+    <left-margin>92</left-margin>
+    <right-margin>92</right-margin>
+    <top-margin>92</top-margin>
+    <bottom-margin>92</bottom-margin>
+   </page-margins>
+  </page-layout>
+  <system-layout>
+   <system-margins>
+    <left-margin>112</left-margin>
+    <right-margin>0</right-margin>
+   </system-margins>
+   <system-distance>100</system-distance>
+  </system-layout>
+  <appearance>
+   <line-width type="stem">0.9375</line-width>
+   <line-width type="beam">5</line-width>
+   <line-width type="staff">0.9375</line-width>
+   <line-width type="light barline">1.5625</line-width>
+   <line-width type="heavy barline">5</line-width>
+   <line-width type="leger">1.5625</line-width>
+   <line-width type="ending">1.5625</line-width>
+   <line-width type="wedge">1.25</line-width>
+   <line-width type="enclosure">0.9375</line-width>
+   <line-width type="tuplet bracket">1.25</line-width>
+   <line-width type="bracket">5</line-width>
+   <line-width type="dashes">1.5625</line-width>
+   <line-width type="extend">0.9375</line-width>
+   <line-width type="octave shift">1.5625</line-width>
+   <line-width type="pedal">1.5625</line-width>
+   <line-width type="slur middle">1.5625</line-width>
+   <line-width type="slur tip">0.625</line-width>
+   <line-width type="tie middle">1.5625</line-width>
+   <line-width type="tie tip">0.625</line-width>
+   <note-size type="cue">75</note-size>
+   <note-size type="grace">60</note-size>
+  </appearance>
+  <music-font font-family="Opus Std" font-size="18.4252" />
+  <lyric-font font-family="Times New Roman" font-size="10.6521" />
+  <lyric-language xml:lang="zh" />
+ </defaults>
+ <part-list>
+  <score-part id="P1">
+   <part-name>Flute</part-name>
+   <part-name-display>
+    <display-text>Flute</display-text>
+   </part-name-display>
+   <part-abbreviation>Fl.</part-abbreviation>
+   <part-abbreviation-display>
+    <display-text>Fl.</display-text>
+   </part-abbreviation-display>
+   <score-instrument id="P1-I1">
+    <instrument-name>Flute (2)</instrument-name>
+    <instrument-sound>wind.flutes.flute</instrument-sound>
+    <solo />
+    <virtual-instrument>
+     <virtual-library>General MIDI</virtual-library>
+     <virtual-name>Flute</virtual-name>
+    </virtual-instrument>
+   </score-instrument>
+  </score-part>
+ </part-list>
+ <part id="P1">
+  <!--============== Part: P1, Measure: 1 ==============-->
+  <measure number="1" width="234">
+   <print new-page="yes">
+    <system-layout>
+     <system-margins>
+      <left-margin>22</left-margin>
+      <right-margin>0</right-margin>
+     </system-margins>
+     <top-system-distance>250</top-system-distance>
+    </system-layout>
+   </print>
+   <attributes>
+    <divisions>256</divisions>
+    <key color="#000000">
+     <fifths>0</fifths>
+     <mode>major</mode>
+    </key>
+    <time color="#000000">
+     <beats>4</beats>
+     <beat-type>4</beat-type>
+    </time>
+    <staves>1</staves>
+    <clef number="1" color="#000000">
+     <sign>G</sign>
+     <line>2</line>
+    </clef>
+    <staff-details number="1" print-object="yes" />
+   </attributes>
+   <note color="#000000" default-x="75" default-y="-35">
+    <pitch>
+     <step>F</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="115" default-y="-40">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="155" default-y="-45">
+    <pitch>
+     <step>D</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="194" default-y="-50">
+    <pitch>
+     <step>C</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 2 ==============-->
+  <measure number="2" width="112">
+   <note color="#000000" default-x="19">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <accidental>flat</accidental>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 3 ==============-->
+  <measure number="3" width="177">
+   <note color="#000000" default-x="19" default-y="-40">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="58" default-y="-45">
+    <pitch>
+     <step>D</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="98" default-y="-50">
+    <pitch>
+     <step>C</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="138" default-y="-55">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 4 ==============-->
+  <measure number="4" width="107">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 5 ==============-->
+  <measure number="5" width="173">
+   <note color="#000000" default-x="15" default-y="-45">
+    <pitch>
+     <step>D</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="54" default-y="-50">
+    <pitch>
+     <step>C</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="94" default-y="-55">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="133" default-y="10">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 6 ==============-->
+  <measure number="6" width="107">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 7 ==============-->
+  <measure number="7" width="173">
+   <note color="#000000" default-x="15" default-y="-50">
+    <pitch>
+     <step>C</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="54" default-y="-55">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="94" default-y="10">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="133" default-y="5">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 8 ==============-->
+  <measure number="8" width="159">
+   <print new-system="yes">
+    <system-layout>
+     <system-margins>
+      <left-margin>22</left-margin>
+      <right-margin>0</right-margin>
+     </system-margins>
+     <system-distance>100</system-distance>
+    </system-layout>
+   </print>
+   <attributes>
+    <staff-details number="1" print-object="yes" />
+   </attributes>
+   <note color="#000000" default-x="57">
+    <pitch>
+     <step>F</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 9 ==============-->
+  <measure number="9" width="193">
+   <note color="#000000" default-x="19" default-y="-55">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="62" default-y="10">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="106" default-y="5">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="149">
+    <pitch>
+     <step>F</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 10 ==============-->
+  <measure number="10" width="122">
+   <note color="#000000" default-x="20">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <accidental>flat</accidental>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 11 ==============-->
+  <measure number="11" width="189">
+   <note color="#000000" default-x="15" default-y="10">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="under" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="58" default-y="5">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="102">
+    <pitch>
+     <step>F</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="145" default-y="-5">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 12 ==============-->
+  <measure number="12" width="116">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>D</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="under" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 13 ==============-->
+  <measure number="13" width="189">
+   <note color="#000000" default-x="15" default-y="5">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="under" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="58">
+    <pitch>
+     <step>F</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="101" default-y="-5">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="145" default-y="-10">
+    <pitch>
+     <step>D</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 14 ==============-->
+  <measure number="14" width="116">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>C</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="under" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 15 ==============-->
+  <measure number="15" width="220">
+   <print new-system="yes">
+    <system-layout>
+     <system-margins>
+      <left-margin>22</left-margin>
+      <right-margin>0</right-margin>
+     </system-margins>
+     <system-distance>100</system-distance>
+    </system-layout>
+   </print>
+   <attributes>
+    <staff-details number="1" print-object="yes" />
+   </attributes>
+   <note color="#000000" default-x="57" default-y="-35">
+    <pitch>
+     <step>F</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="98" default-y="-40">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="139" default-y="-45">
+    <pitch>
+     <step>D</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="179" default-y="-50">
+    <pitch>
+     <step>C</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 16 ==============-->
+  <measure number="16" width="110">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <accidental>flat</accidental>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 17 ==============-->
+  <measure number="17" width="178">
+   <note color="#000000" default-x="15" default-y="-40">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="55" default-y="-45">
+    <pitch>
+     <step>D</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="96" default-y="-50">
+    <pitch>
+     <step>C</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="137" default-y="-55">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 18 ==============-->
+  <measure number="18" width="110">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 19 ==============-->
+  <measure number="19" width="178">
+   <note color="#000000" default-x="15" default-y="-45">
+    <pitch>
+     <step>D</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="55" default-y="-50">
+    <pitch>
+     <step>C</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="96" default-y="-55">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="137" default-y="10">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 20 ==============-->
+  <measure number="20" width="110">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 21 ==============-->
+  <measure number="21" width="178">
+   <note color="#000000" default-x="15" default-y="-50">
+    <pitch>
+     <step>C</step>
+     <octave>5</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="55" default-y="-55">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="96" default-y="10">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="137" default-y="5">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 22 ==============-->
+  <measure number="22" width="158">
+   <print new-system="yes">
+    <system-layout>
+     <system-margins>
+      <left-margin>22</left-margin>
+      <right-margin>0</right-margin>
+     </system-margins>
+     <system-distance>100</system-distance>
+    </system-layout>
+   </print>
+   <attributes>
+    <staff-details number="1" print-object="yes" />
+   </attributes>
+   <note color="#000000" default-x="57">
+    <pitch>
+     <step>F</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 23 ==============-->
+  <measure number="23" width="187">
+   <note color="#000000" default-x="15" default-y="-55">
+    <pitch>
+     <step>B</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>down</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="over" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="58" default-y="10">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="101" default-y="5">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="144">
+    <pitch>
+     <step>F</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 24 ==============-->
+  <measure number="24" width="115">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <accidental>flat</accidental>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="over" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 25 ==============-->
+  <measure number="25" width="188">
+   <note color="#000000" default-x="15" default-y="10">
+    <pitch>
+     <step>A</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="under" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="58" default-y="5">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="101">
+    <pitch>
+     <step>F</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="144" default-y="-5">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 26 ==============-->
+  <measure number="26" width="115">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>D</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="under" />
+    </notations>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 27 ==============-->
+  <measure number="27" width="187">
+   <note color="#000000" default-x="15" default-y="5">
+    <pitch>
+     <step>G</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="start" orientation="under" />
+    </notations>
+   </note>
+   <note color="#000000" default-x="58">
+    <pitch>
+     <step>F</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="101" default-y="-5">
+    <pitch>
+     <step>E</step>
+     <alter>-1</alter>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <accidental>flat</accidental>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+   <note color="#000000" default-x="144" default-y="-10">
+    <pitch>
+     <step>D</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>256</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>quarter</type>
+    <stem>up</stem>
+    <staff>1</staff>
+   </note>
+  </measure>
+  <!--============== Part: P1, Measure: 28 ==============-->
+  <measure number="28" width="131">
+   <note color="#000000" default-x="15">
+    <pitch>
+     <step>C</step>
+     <octave>4</octave>
+    </pitch>
+    <duration>1024</duration>
+    <instrument id="P1-I1" />
+    <voice>1</voice>
+    <type>whole</type>
+    <staff>1</staff>
+    <notations>
+     <slur color="#000000" type="stop" orientation="under" />
+    </notations>
+   </note>
+   <barline>
+    <bar-style>light-heavy</bar-style>
+   </barline>
+  </measure>
+ </part>
+</score-partwise>

+ 16 - 16
dist/yuepu/assets/background.2740ad6f.svg

@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="30px" height="21px" viewBox="0 0 30 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
-    <title>编组 6</title>
-    <desc>Created with Sketch.</desc>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="伴奏备份-5" transform="translate(-342.000000, -639.000000)">
-            <g id="编组-6" transform="translate(343.000000, 640.000000)">
-                <text id="伴奏" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#1A1A1A">
-                    <tspan x="2" y="14">伴奏</tspan>
-                </text>
-                <path d="M0,2 C0,0.8954305 0.940202025,0 2.1,0 L25.9,0 C27.059798,0 28,0.8954305 28,2 M28,17 C28,18.1045695 27.059798,19 25.9,19 L2.1,19 C0.940202025,19 0,18.1045695 0,17" id="形状" stroke="#1A1A1A" opacity="0.574916295"></path>
-            </g>
-        </g>
-    </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="30px" height="21px" viewBox="0 0 30 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
+    <title>编组 6</title>
+    <desc>Created with Sketch.</desc>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="伴奏备份-5" transform="translate(-342.000000, -639.000000)">
+            <g id="编组-6" transform="translate(343.000000, 640.000000)">
+                <text id="伴奏" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#1A1A1A">
+                    <tspan x="2" y="14">伴奏</tspan>
+                </text>
+                <path d="M0,2 C0,0.8954305 0.940202025,0 2.1,0 L25.9,0 C27.059798,0 28,0.8954305 28,2 M28,17 C28,18.1045695 27.059798,19 25.9,19 L2.1,19 C0.940202025,19 0,18.1045695 0,17" id="形状" stroke="#1A1A1A" opacity="0.574916295"></path>
+            </g>
+        </g>
+    </g>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/yuepu/assets/index-legacy.83f908ef.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/yuepu/assets/index.1adfde28.js


+ 13 - 13
dist/yuepu/assets/music.b14142b5.svg

@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="30px" height="21px" viewBox="0 0 30 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
-    <title>编组 6备份</title>
-    <desc>Created with Sketch.</desc>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="编组-6备份" transform="translate(1.000000, 1.000000)">
-            <text id="原声" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#14928A">
-                <tspan x="2" y="14">原声</tspan>
-            </text>
-            <path d="M0,2 C0,0.8954305 0.940202025,0 2.1,0 L25.9,0 C27.059798,0 28,0.8954305 28,2 M28,17 C28,18.1045695 27.059798,19 25.9,19 L2.1,19 C0.940202025,19 0,18.1045695 0,17" id="形状" stroke="#14928A" opacity="0.574916295"></path>
-        </g>
-    </g>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="30px" height="21px" viewBox="0 0 30 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
+    <title>编组 6备份</title>
+    <desc>Created with Sketch.</desc>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="编组-6备份" transform="translate(1.000000, 1.000000)">
+            <text id="原声" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#14928A">
+                <tspan x="2" y="14">原声</tspan>
+            </text>
+            <path d="M0,2 C0,0.8954305 0.940202025,0 2.1,0 L25.9,0 C27.059798,0 28,0.8954305 28,2 M28,17 C28,18.1045695 27.059798,19 25.9,19 L2.1,19 C0.940202025,19 0,18.1045695 0,17" id="形状" stroke="#14928A" opacity="0.574916295"></path>
+        </g>
+    </g>
 </svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/yuepu/assets/polyfills-legacy.351c0b44.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/yuepu/assets/polyfills-modern.61133417.js


+ 15 - 15
dist/yuepu/assets/replay.5d29554b.svg

@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="22px" height="21px" viewBox="0 0 22 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
-    <title>编组</title>
-    <desc>Created with Sketch.</desc>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="伴奏备份-5" transform="translate(-286.000000, -639.000000)" fill="#1A1A1A" fill-rule="nonzero">
-            <g id="编组-3" transform="translate(0.000000, 18.000000)">
-                <g id="编组" transform="translate(297.000000, 631.421053) scale(-1, 1) translate(-297.000000, -631.421053) translate(286.000000, 621.000000)">
-                    <path d="M21.8359743,5.91618045 C21.4133965,7.0257019 21.0615062,8.16089287 20.7824176,9.31493233 C20.5279569,10.3734135 19.9595125,10.6413835 19.1023816,10.1813684 C19.1023816,10.1813684 16.8062829,8.88915789 15.8866529,8.47231579 C14.8132553,7.98401503 14.9714872,7.47437594 16.3613486,6.9433985 C16.7720572,6.78708271 17.1663969,6.59057144 17.5726412,6.4238346 C16.1878095,3.53041761 13.2777299,1.67769054 10.0712582,1.64801504 C5.30782736,1.72874517 1.51067257,5.65548936 1.58774614,10.4210526 C1.5098371,15.1866217 5.30633371,19.1140403 10.0697701,19.1955789 C12.4640261,19.1829371 14.7366908,18.1386081 16.3062899,16.3297895 C16.5067122,16.1698604 16.7415656,16.0587535 16.9922922,16.0052481 C17.3774369,16.0098332 17.6998373,16.2986565 17.7467459,16.6811278 C17.7563723,16.870475 17.7141837,17.0588621 17.6247238,17.226 C17.5872265,17.2811669 17.5427057,17.331212 17.4922852,17.3748722 C15.6413244,19.5566109 12.9315942,20.8226441 10.0712582,20.8421053 C4.41465343,20.7450836 -0.0930331504,16.0801605 0.0014588411,10.4210526 C0.0139187466,9.29275203 0.205800339,8.17362578 0.569903248,7.10566917 C0.580968335,7.01624856 0.606605274,6.92924621 0.645795047,6.8481203 C2.01644926,2.79485654 5.79595676,0.0492687634 10.0727463,0 C13.931717,0.0337531718 17.4260937,2.28823581 19.048811,5.79112781 C19.5205306,5.58270676 20.0041547,5.40406014 20.4714101,5.18075188 C21.8166293,4.53861654 22.2739642,4.78375939 21.8434147,5.91618045 L21.8359743,5.91618045 Z" id="路径"></path>
-                    <path d="M8.18320392,13.7071392 C7.50450737,14.1305274 6.94736842,13.8126149 6.94736842,13.0014923 L6.94736842,7.84061301 C6.94736842,7.02949037 7.50306026,6.71157784 8.18320392,7.13496603 L12.2264409,9.65152602 C12.5343515,9.77570179 12.7368421,10.0807 12.7368421,10.4203098 C12.7368421,10.7599196 12.5343515,11.0649179 12.2264409,11.1890937 L8.18320392,13.7071392 Z" id="路径" transform="translate(9.842105, 10.421053) scale(-1, 1) translate(-9.842105, -10.421053) "></path>
-                </g>
-            </g>
-        </g>
-    </g>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="22px" height="21px" viewBox="0 0 22 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
+    <title>编组</title>
+    <desc>Created with Sketch.</desc>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="伴奏备份-5" transform="translate(-286.000000, -639.000000)" fill="#1A1A1A" fill-rule="nonzero">
+            <g id="编组-3" transform="translate(0.000000, 18.000000)">
+                <g id="编组" transform="translate(297.000000, 631.421053) scale(-1, 1) translate(-297.000000, -631.421053) translate(286.000000, 621.000000)">
+                    <path d="M21.8359743,5.91618045 C21.4133965,7.0257019 21.0615062,8.16089287 20.7824176,9.31493233 C20.5279569,10.3734135 19.9595125,10.6413835 19.1023816,10.1813684 C19.1023816,10.1813684 16.8062829,8.88915789 15.8866529,8.47231579 C14.8132553,7.98401503 14.9714872,7.47437594 16.3613486,6.9433985 C16.7720572,6.78708271 17.1663969,6.59057144 17.5726412,6.4238346 C16.1878095,3.53041761 13.2777299,1.67769054 10.0712582,1.64801504 C5.30782736,1.72874517 1.51067257,5.65548936 1.58774614,10.4210526 C1.5098371,15.1866217 5.30633371,19.1140403 10.0697701,19.1955789 C12.4640261,19.1829371 14.7366908,18.1386081 16.3062899,16.3297895 C16.5067122,16.1698604 16.7415656,16.0587535 16.9922922,16.0052481 C17.3774369,16.0098332 17.6998373,16.2986565 17.7467459,16.6811278 C17.7563723,16.870475 17.7141837,17.0588621 17.6247238,17.226 C17.5872265,17.2811669 17.5427057,17.331212 17.4922852,17.3748722 C15.6413244,19.5566109 12.9315942,20.8226441 10.0712582,20.8421053 C4.41465343,20.7450836 -0.0930331504,16.0801605 0.0014588411,10.4210526 C0.0139187466,9.29275203 0.205800339,8.17362578 0.569903248,7.10566917 C0.580968335,7.01624856 0.606605274,6.92924621 0.645795047,6.8481203 C2.01644926,2.79485654 5.79595676,0.0492687634 10.0727463,0 C13.931717,0.0337531718 17.4260937,2.28823581 19.048811,5.79112781 C19.5205306,5.58270676 20.0041547,5.40406014 20.4714101,5.18075188 C21.8166293,4.53861654 22.2739642,4.78375939 21.8434147,5.91618045 L21.8359743,5.91618045 Z" id="路径"></path>
+                    <path d="M8.18320392,13.7071392 C7.50450737,14.1305274 6.94736842,13.8126149 6.94736842,13.0014923 L6.94736842,7.84061301 C6.94736842,7.02949037 7.50306026,6.71157784 8.18320392,7.13496603 L12.2264409,9.65152602 C12.5343515,9.77570179 12.7368421,10.0807 12.7368421,10.4203098 C12.7368421,10.7599196 12.5343515,11.0649179 12.2264409,11.1890937 L8.18320392,13.7071392 Z" id="路径" transform="translate(9.842105, 10.421053) scale(-1, 1) translate(-9.842105, -10.421053) "></path>
+                </g>
+            </g>
+        </g>
+    </g>
 </svg>

+ 23 - 23
dist/yuepu/assets/setting.d94f0146.svg

@@ -1,24 +1,24 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="22px" height="19px" viewBox="0 0 22 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
-    <title>编组 2</title>
-    <desc>Created with Sketch.</desc>
-    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="伴奏备份-5" transform="translate(-321.000000, -639.000000)" fill="#000000">
-            <g id="编组-3" transform="translate(0.000000, 18.000000)">
-                <g id="编组-2" transform="translate(321.000000, 621.000000)">
-                    <g id="编组">
-                        <path d="M17.1788934,2.65984165 L21.2637262,2.66129281 C21.6441871,2.6595274 21.9627029,2.95663144 21.9969824,3.34525683 C22.0312619,3.73388223 21.7699052,4.08478959 21.3953125,4.15308163 L21.2637262,4.16614204 L17.1788934,4.16614204 C17.3474571,3.67892357 17.3474571,3.14706012 17.1788934,2.65984165 L17.1788934,2.65984165 Z" id="形状" fill-rule="nonzero"></path>
-                        <path d="M12.7368421,0 C14.6553049,0 16.2105263,1.5552214 16.2105263,3.47368421 C16.2105263,5.39214703 14.6553049,6.94736842 12.7368421,6.94736842 C11.0558023,6.94736842 9.65365999,5.75326639 9.33235683,4.16700399 L0.73627375,4.16614204 C0.355812911,4.16790744 0.0372970883,3.8708034 0.00301760378,3.48217801 C-0.0312618807,3.09355262 0.230094793,2.74264526 0.604687516,2.67435322 L0.73627375,2.66129281 L9.35922942,2.65897043 C9.72584461,1.13357143 11.0989635,0 12.7368421,0 Z" id="形状结合" fill-rule="nonzero"></path>
-                        <circle id="椭圆形" cx="12.7368421" cy="3.47368421" r="1.15789474"></circle>
-                    </g>
-                    <g id="编组备份-3" transform="translate(11.000000, 15.052632) scale(-1, 1) translate(-11.000000, -15.052632) translate(0.000000, 11.578947)">
-                        <path d="M17.1788934,2.65984165 L21.2637262,2.66129281 C21.6441871,2.6595274 21.9627029,2.95663144 21.9969824,3.34525683 C22.0312619,3.73388223 21.7699052,4.08478959 21.3953125,4.15308163 L21.2637262,4.16614204 L17.1788934,4.16614204 C17.3474571,3.67892357 17.3474571,3.14706012 17.1788934,2.65984165 L17.1788934,2.65984165 Z" id="形状" fill-rule="nonzero"></path>
-                        <path d="M12.7368421,0 C14.6553049,0 16.2105263,1.5552214 16.2105263,3.47368421 C16.2105263,5.39214703 14.6553049,6.94736842 12.7368421,6.94736842 C11.0558023,6.94736842 9.65365999,5.75326639 9.33235683,4.16700399 L0.73627375,4.16614204 C0.355812911,4.16790744 0.0372970883,3.8708034 0.00301760378,3.48217801 C-0.0312618807,3.09355262 0.230094793,2.74264526 0.604687516,2.67435322 L0.73627375,2.66129281 L9.35922942,2.65897043 C9.72584461,1.13357143 11.0989635,0 12.7368421,0 Z" id="形状结合" fill-rule="nonzero"></path>
-                        <circle id="椭圆形" cx="12.7368421" cy="3.47368421" r="1.15789474"></circle>
-                    </g>
-                </g>
-            </g>
-        </g>
-    </g>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="22px" height="19px" viewBox="0 0 22 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
+    <title>编组 2</title>
+    <desc>Created with Sketch.</desc>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="伴奏备份-5" transform="translate(-321.000000, -639.000000)" fill="#000000">
+            <g id="编组-3" transform="translate(0.000000, 18.000000)">
+                <g id="编组-2" transform="translate(321.000000, 621.000000)">
+                    <g id="编组">
+                        <path d="M17.1788934,2.65984165 L21.2637262,2.66129281 C21.6441871,2.6595274 21.9627029,2.95663144 21.9969824,3.34525683 C22.0312619,3.73388223 21.7699052,4.08478959 21.3953125,4.15308163 L21.2637262,4.16614204 L17.1788934,4.16614204 C17.3474571,3.67892357 17.3474571,3.14706012 17.1788934,2.65984165 L17.1788934,2.65984165 Z" id="形状" fill-rule="nonzero"></path>
+                        <path d="M12.7368421,0 C14.6553049,0 16.2105263,1.5552214 16.2105263,3.47368421 C16.2105263,5.39214703 14.6553049,6.94736842 12.7368421,6.94736842 C11.0558023,6.94736842 9.65365999,5.75326639 9.33235683,4.16700399 L0.73627375,4.16614204 C0.355812911,4.16790744 0.0372970883,3.8708034 0.00301760378,3.48217801 C-0.0312618807,3.09355262 0.230094793,2.74264526 0.604687516,2.67435322 L0.73627375,2.66129281 L9.35922942,2.65897043 C9.72584461,1.13357143 11.0989635,0 12.7368421,0 Z" id="形状结合" fill-rule="nonzero"></path>
+                        <circle id="椭圆形" cx="12.7368421" cy="3.47368421" r="1.15789474"></circle>
+                    </g>
+                    <g id="编组备份-3" transform="translate(11.000000, 15.052632) scale(-1, 1) translate(-11.000000, -15.052632) translate(0.000000, 11.578947)">
+                        <path d="M17.1788934,2.65984165 L21.2637262,2.66129281 C21.6441871,2.6595274 21.9627029,2.95663144 21.9969824,3.34525683 C22.0312619,3.73388223 21.7699052,4.08478959 21.3953125,4.15308163 L21.2637262,4.16614204 L17.1788934,4.16614204 C17.3474571,3.67892357 17.3474571,3.14706012 17.1788934,2.65984165 L17.1788934,2.65984165 Z" id="形状" fill-rule="nonzero"></path>
+                        <path d="M12.7368421,0 C14.6553049,0 16.2105263,1.5552214 16.2105263,3.47368421 C16.2105263,5.39214703 14.6553049,6.94736842 12.7368421,6.94736842 C11.0558023,6.94736842 9.65365999,5.75326639 9.33235683,4.16700399 L0.73627375,4.16614204 C0.355812911,4.16790744 0.0372970883,3.8708034 0.00301760378,3.48217801 C-0.0312618807,3.09355262 0.230094793,2.74264526 0.604687516,2.67435322 L0.73627375,2.66129281 L9.35922942,2.65897043 C9.72584461,1.13357143 11.0989635,0 12.7368421,0 Z" id="形状结合" fill-rule="nonzero"></path>
+                        <circle id="椭圆形" cx="12.7368421" cy="3.47368421" r="1.15789474"></circle>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
 </svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/yuepu/assets/vendor-legacy.047522f1.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/yuepu/assets/vendor.e484ff32.js


+ 41 - 41
dist/yuepu/index.html

@@ -1,41 +1,41 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-<script type="module" src="./assets/polyfills-modern.61133417.js"></script>
-  <meta charset="UTF-8">
-  <link rel="icon" href="./favicon.ico" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/vConsole/3.4.0/vconsole.min.js" integrity="sha512-c+KbbiPQeY22GNThFfW4imH273TsyOmh9r4PhSQCOkBsHL+Ax1EpunDGfZ3YUx6aSPvdXutoarvcCc/V1Nvjpg==" crossorigin="anonymous"></script>
-  <script>
-    new VConsole()
-  </script> -->
-  <title>管乐迷</title>
-  <style>
-    #loading{
-      position: fixed;
-      left: 50%;
-      top: 50%;
-      transform: translate(-50%, -50%);
-      visibility: hidden;
-      opacity: 0;
-      transition: opacity .3s;
-    }
-    #loading.show {
-      visibility: visible;
-      opacity: 1;
-    }
-  </style>
-<script type="module" crossorigin src="./assets/index.1adfde28.js"></script>
-  <link rel="modulepreload" href="./assets/vendor.e484ff32.js">
-  <link rel="stylesheet" href="./assets/index.c5989498.css">
-</head>
-<body>
-  <div id="app"></div>
-  <img id="loading" class="show" src="./loading.svg" alt="loading"/>
-  
-
-<script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule src="./assets/polyfills-legacy.351c0b44.js"></script>
-  <script nomodule id="vite-legacy-entry" data-src="./assets/index-legacy.83f908ef.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
-</body>
-</html>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<script type="module" src="./assets/polyfills-modern.61133417.js"></script>
+  <meta charset="UTF-8">
+  <link rel="icon" href="./favicon.ico" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/vConsole/3.4.0/vconsole.min.js" integrity="sha512-c+KbbiPQeY22GNThFfW4imH273TsyOmh9r4PhSQCOkBsHL+Ax1EpunDGfZ3YUx6aSPvdXutoarvcCc/V1Nvjpg==" crossorigin="anonymous"></script>
+  <script>
+    new VConsole()
+  </script> -->
+  <title>管乐迷</title>
+  <style>
+    #loading{
+      position: fixed;
+      left: 50%;
+      top: 50%;
+      transform: translate(-50%, -50%);
+      visibility: hidden;
+      opacity: 0;
+      transition: opacity .3s;
+    }
+    #loading.show {
+      visibility: visible;
+      opacity: 1;
+    }
+  </style>
+<script type="module" crossorigin src="./assets/index.1adfde28.js"></script>
+  <link rel="modulepreload" href="./assets/vendor.e484ff32.js">
+  <link rel="stylesheet" href="./assets/index.c5989498.css">
+</head>
+<body>
+  <div id="app"></div>
+  <img id="loading" class="show" src="./loading.svg" alt="loading"/>
+  
+
+<script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
+  <script nomodule src="./assets/polyfills-legacy.351c0b44.js"></script>
+  <script nomodule id="vite-legacy-entry" data-src="./assets/index-legacy.83f908ef.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+</body>
+</html>

+ 17 - 17
dist/yuepu/loading.svg

@@ -1,17 +1,17 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin:auto;display:block;" width="200px" height="200px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
-<path transform="translate(30,130)" fill="#e15b64" d="M6.999-2.173c-0.21-1.843-1.216-3.542-2.21-5.061C4.291-7.995,3.814-8.771,3.242-9.477 c-0.389-0.479-0.799-0.955-0.985-1.554c-0.13-0.42,0.033-1.539-0.704-1.467c-0.359,0.035-0.418,0.337-0.471,0.621 c-0.072,0.38,0,0.842,0,1.227c0,4.1,0,8.199,0,12.299c0,1.247,0,2.495,0,3.742c-2.884-1.873-8.377,1.23-8.197,4.705 c0.091,1.754,1.807,2.481,3.362,2.395c1.974-0.108,3.983-1.249,5.113-2.868c1-1.434,0.769-3.163,0.769-4.822 c0-2.398,0-4.797,0-7.195c0-1.72,0-3.439,0-5.159c1.769,2.454,4.472,4.668,4.002,8.037C6.038,1.149,5.681,1.832,5.665,2.494 C5.639,3.53,6.145,2.799,6.343,2.349C6.99,0.875,7.253-0.575,6.999-2.173z">
-  <animateTransform attributeName="transform" type="translate" keyTimes="0;0;0.2;0.4;1" values="30 130;30 130;30 50;30 130;30 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="-0.8928571428571428s"></animateTransform>
-</path>
-<path transform="translate(70,20)" fill="#f47e60" d="M6.999-2.173c-0.21-1.843-1.216-3.542-2.21-5.061C4.291-7.995,3.814-8.771,3.242-9.477 c-0.389-0.479-0.799-0.955-0.985-1.554c-0.13-0.42,0.033-1.539-0.704-1.467c-0.359,0.035-0.418,0.337-0.471,0.621 c-0.072,0.38,0,0.842,0,1.227c0,4.1,0,8.199,0,12.299c0,1.247,0,2.495,0,3.742c-2.884-1.873-8.377,1.23-8.197,4.705 c0.091,1.754,1.807,2.481,3.362,2.395c1.974-0.108,3.983-1.249,5.113-2.868c1-1.434,0.769-3.163,0.769-4.822 c0-2.398,0-4.797,0-7.195c0-1.72,0-3.439,0-5.159c1.769,2.454,4.472,4.668,4.002,8.037C6.038,1.149,5.681,1.832,5.665,2.494 C5.639,3.53,6.145,2.799,6.343,2.349C6.99,0.875,7.253-0.575,6.999-2.173z">
-  <animateTransform attributeName="transform" type="translate" keyTimes="0;0.1;0.4;0.7;1" values="70 130;70 130;70 20;70 130;70 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="-0.8928571428571428s"></animateTransform>
-</path>
-<path transform="translate(40,60)" fill="#f8b26a" d="M10.988-11.314c-0.201-0.914-2.865,0.152-3.31,0.255c-2.865,0.661-5.73,1.322-8.594,1.983 C-1.873-8.855-2.84-8.658-3.791-8.413c-0.481,0.124-0.664,0.217-0.719,0.77c-0.18,1.819,0,3.786,0,5.621c0,2.663,0,5.325,0,7.988 c-2.146-1.278-5.411,0.577-6.269,2.683c-1.074,2.636,1.925,3.462,3.907,2.736c1.954-0.715,3.253-2.269,3.343-4.333 c0.046-1.037,0-2.087,0-3.125c0-1.638,0-3.276,0-4.914c0-0.673,0-1.346,0-2.019c0-0.215-0.116-0.848,0-1.036 c0.17-0.277,1.196-0.348,1.535-0.427c1.425-0.329,2.849-0.657,4.274-0.986c2.579-0.595,5.158-1.19,7.737-1.786 c0,3.284,0,6.569,0,9.853c-1.64-0.977-3.949-0.013-5.2,1.179c-0.958,0.913-1.87,2.579-0.84,3.778 c1.198,1.393,3.567,0.71,4.866-0.135C10.164,6.578,10.936,5.347,11,3.788c0.148-3.605,0-7.245,0-10.853c0-0.415,0-0.829,0-1.244 C11-9.247,11.189-10.396,10.988-11.314z">
-  <animateTransform attributeName="transform" type="translate" keyTimes="0;0.3;0.6;0.9;1" values="40 130;40 130;40 60;40 130;40 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="-0.8928571428571428s"></animateTransform>
-</path>
-<path transform="translate(60,130)" fill="#e15b64" d="M6.999-2.173c-0.21-1.843-1.216-3.542-2.21-5.061C4.291-7.995,3.814-8.771,3.242-9.477 c-0.389-0.479-0.799-0.955-0.985-1.554c-0.13-0.42,0.033-1.539-0.704-1.467c-0.359,0.035-0.418,0.337-0.471,0.621 c-0.072,0.38,0,0.842,0,1.227c0,4.1,0,8.199,0,12.299c0,1.247,0,2.495,0,3.742c-2.884-1.873-8.377,1.23-8.197,4.705 c0.091,1.754,1.807,2.481,3.362,2.395c1.974-0.108,3.983-1.249,5.113-2.868c1-1.434,0.769-3.163,0.769-4.822 c0-2.398,0-4.797,0-7.195c0-1.72,0-3.439,0-5.159c1.769,2.454,4.472,4.668,4.002,8.037C6.038,1.149,5.681,1.832,5.665,2.494 C5.639,3.53,6.145,2.799,6.343,2.349C6.99,0.875,7.253-0.575,6.999-2.173z">
-  <animateTransform attributeName="transform" type="translate" keyTimes="0;0.5;0.75;1;1" values="60 130;60 130;60 70;60 130;60 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="-0.8928571428571428s"></animateTransform>
-</path>
-<path transform="translate(50,130)" fill="#abbd81" d="M10.988-11.314c-0.201-0.914-2.865,0.152-3.31,0.255c-2.865,0.661-5.73,1.322-8.594,1.983 C-1.873-8.855-2.84-8.658-3.791-8.413c-0.481,0.124-0.664,0.217-0.719,0.77c-0.18,1.819,0,3.786,0,5.621c0,2.663,0,5.325,0,7.988 c-2.146-1.278-5.411,0.577-6.269,2.683c-1.074,2.636,1.925,3.462,3.907,2.736c1.954-0.715,3.253-2.269,3.343-4.333 c0.046-1.037,0-2.087,0-3.125c0-1.638,0-3.276,0-4.914c0-0.673,0-1.346,0-2.019c0-0.215-0.116-0.848,0-1.036 c0.17-0.277,1.196-0.348,1.535-0.427c1.425-0.329,2.849-0.657,4.274-0.986c2.579-0.595,5.158-1.19,7.737-1.786 c0,3.284,0,6.569,0,9.853c-1.64-0.977-3.949-0.013-5.2,1.179c-0.958,0.913-1.87,2.579-0.84,3.778 c1.198,1.393,3.567,0.71,4.866-0.135C10.164,6.578,10.936,5.347,11,3.788c0.148-3.605,0-7.245,0-10.853c0-0.415,0-0.829,0-1.244 C11-9.247,11.189-10.396,10.988-11.314z">
-  <animateTransform attributeName="transform" type="translate" keyTimes="0;0;0.4;0.8;1" values="50 130;50 130;50 20;50 130;50 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="0s"></animateTransform>
-</path>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin:auto;display:block;" width="200px" height="200px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
+<path transform="translate(30,130)" fill="#e15b64" d="M6.999-2.173c-0.21-1.843-1.216-3.542-2.21-5.061C4.291-7.995,3.814-8.771,3.242-9.477 c-0.389-0.479-0.799-0.955-0.985-1.554c-0.13-0.42,0.033-1.539-0.704-1.467c-0.359,0.035-0.418,0.337-0.471,0.621 c-0.072,0.38,0,0.842,0,1.227c0,4.1,0,8.199,0,12.299c0,1.247,0,2.495,0,3.742c-2.884-1.873-8.377,1.23-8.197,4.705 c0.091,1.754,1.807,2.481,3.362,2.395c1.974-0.108,3.983-1.249,5.113-2.868c1-1.434,0.769-3.163,0.769-4.822 c0-2.398,0-4.797,0-7.195c0-1.72,0-3.439,0-5.159c1.769,2.454,4.472,4.668,4.002,8.037C6.038,1.149,5.681,1.832,5.665,2.494 C5.639,3.53,6.145,2.799,6.343,2.349C6.99,0.875,7.253-0.575,6.999-2.173z">
+  <animateTransform attributeName="transform" type="translate" keyTimes="0;0;0.2;0.4;1" values="30 130;30 130;30 50;30 130;30 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="-0.8928571428571428s"></animateTransform>
+</path>
+<path transform="translate(70,20)" fill="#f47e60" d="M6.999-2.173c-0.21-1.843-1.216-3.542-2.21-5.061C4.291-7.995,3.814-8.771,3.242-9.477 c-0.389-0.479-0.799-0.955-0.985-1.554c-0.13-0.42,0.033-1.539-0.704-1.467c-0.359,0.035-0.418,0.337-0.471,0.621 c-0.072,0.38,0,0.842,0,1.227c0,4.1,0,8.199,0,12.299c0,1.247,0,2.495,0,3.742c-2.884-1.873-8.377,1.23-8.197,4.705 c0.091,1.754,1.807,2.481,3.362,2.395c1.974-0.108,3.983-1.249,5.113-2.868c1-1.434,0.769-3.163,0.769-4.822 c0-2.398,0-4.797,0-7.195c0-1.72,0-3.439,0-5.159c1.769,2.454,4.472,4.668,4.002,8.037C6.038,1.149,5.681,1.832,5.665,2.494 C5.639,3.53,6.145,2.799,6.343,2.349C6.99,0.875,7.253-0.575,6.999-2.173z">
+  <animateTransform attributeName="transform" type="translate" keyTimes="0;0.1;0.4;0.7;1" values="70 130;70 130;70 20;70 130;70 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="-0.8928571428571428s"></animateTransform>
+</path>
+<path transform="translate(40,60)" fill="#f8b26a" d="M10.988-11.314c-0.201-0.914-2.865,0.152-3.31,0.255c-2.865,0.661-5.73,1.322-8.594,1.983 C-1.873-8.855-2.84-8.658-3.791-8.413c-0.481,0.124-0.664,0.217-0.719,0.77c-0.18,1.819,0,3.786,0,5.621c0,2.663,0,5.325,0,7.988 c-2.146-1.278-5.411,0.577-6.269,2.683c-1.074,2.636,1.925,3.462,3.907,2.736c1.954-0.715,3.253-2.269,3.343-4.333 c0.046-1.037,0-2.087,0-3.125c0-1.638,0-3.276,0-4.914c0-0.673,0-1.346,0-2.019c0-0.215-0.116-0.848,0-1.036 c0.17-0.277,1.196-0.348,1.535-0.427c1.425-0.329,2.849-0.657,4.274-0.986c2.579-0.595,5.158-1.19,7.737-1.786 c0,3.284,0,6.569,0,9.853c-1.64-0.977-3.949-0.013-5.2,1.179c-0.958,0.913-1.87,2.579-0.84,3.778 c1.198,1.393,3.567,0.71,4.866-0.135C10.164,6.578,10.936,5.347,11,3.788c0.148-3.605,0-7.245,0-10.853c0-0.415,0-0.829,0-1.244 C11-9.247,11.189-10.396,10.988-11.314z">
+  <animateTransform attributeName="transform" type="translate" keyTimes="0;0.3;0.6;0.9;1" values="40 130;40 130;40 60;40 130;40 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="-0.8928571428571428s"></animateTransform>
+</path>
+<path transform="translate(60,130)" fill="#e15b64" d="M6.999-2.173c-0.21-1.843-1.216-3.542-2.21-5.061C4.291-7.995,3.814-8.771,3.242-9.477 c-0.389-0.479-0.799-0.955-0.985-1.554c-0.13-0.42,0.033-1.539-0.704-1.467c-0.359,0.035-0.418,0.337-0.471,0.621 c-0.072,0.38,0,0.842,0,1.227c0,4.1,0,8.199,0,12.299c0,1.247,0,2.495,0,3.742c-2.884-1.873-8.377,1.23-8.197,4.705 c0.091,1.754,1.807,2.481,3.362,2.395c1.974-0.108,3.983-1.249,5.113-2.868c1-1.434,0.769-3.163,0.769-4.822 c0-2.398,0-4.797,0-7.195c0-1.72,0-3.439,0-5.159c1.769,2.454,4.472,4.668,4.002,8.037C6.038,1.149,5.681,1.832,5.665,2.494 C5.639,3.53,6.145,2.799,6.343,2.349C6.99,0.875,7.253-0.575,6.999-2.173z">
+  <animateTransform attributeName="transform" type="translate" keyTimes="0;0.5;0.75;1;1" values="60 130;60 130;60 70;60 130;60 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="-0.8928571428571428s"></animateTransform>
+</path>
+<path transform="translate(50,130)" fill="#abbd81" d="M10.988-11.314c-0.201-0.914-2.865,0.152-3.31,0.255c-2.865,0.661-5.73,1.322-8.594,1.983 C-1.873-8.855-2.84-8.658-3.791-8.413c-0.481,0.124-0.664,0.217-0.719,0.77c-0.18,1.819,0,3.786,0,5.621c0,2.663,0,5.325,0,7.988 c-2.146-1.278-5.411,0.577-6.269,2.683c-1.074,2.636,1.925,3.462,3.907,2.736c1.954-0.715,3.253-2.269,3.343-4.333 c0.046-1.037,0-2.087,0-3.125c0-1.638,0-3.276,0-4.914c0-0.673,0-1.346,0-2.019c0-0.215-0.116-0.848,0-1.036 c0.17-0.277,1.196-0.348,1.535-0.427c1.425-0.329,2.849-0.657,4.274-0.986c2.579-0.595,5.158-1.19,7.737-1.786 c0,3.284,0,6.569,0,9.853c-1.64-0.977-3.949-0.013-5.2,1.179c-0.958,0.913-1.87,2.579-0.84,3.778 c1.198,1.393,3.567,0.71,4.866-0.135C10.164,6.578,10.936,5.347,11,3.788c0.148-3.605,0-7.245,0-10.853c0-0.415,0-0.829,0-1.244 C11-9.247,11.189-10.396,10.988-11.314z">
+  <animateTransform attributeName="transform" type="translate" keyTimes="0;0;0.4;0.8;1" values="50 130;50 130;50 20;50 130;50 130;" keySplines="0 0 1 1;0 0.5 0.5 1;0.5 0 1 0.5;0 0 1 1" calcMode="spline" dur="1.7857142857142856s" repeatCount="indefinite" begin="0s"></animateTransform>
+</path>
+</svg>

+ 2 - 2
package.json

@@ -7,7 +7,7 @@
   "scripts": {
     "dev": "vue-cli-service serve --hot",
     "build": "vue-cli-service build",
-    "preview": "npx http-server ./dist -P http://dev.dayaedu.com",
+    "preview": "npx http-server ./dist -P https://test.dayaedu.com",
     "lint": "eslint --ext .js,.vue src",
     "test:unit": "jest --clearCache && vue-cli-service test:unit",
     "test:ci": "npm run lint && npm run test:unit",
@@ -15,7 +15,6 @@
   },
   "dependencies": {
     "@babel/plugin-proposal-optional-chaining": "^7.11.0",
-    "JSONPath": "^0.11.2",
     "axios": "0.18.1",
     "browserslist": "^4.18.1",
     "caniuse-lite": "^1.0.30001286",
@@ -31,6 +30,7 @@
     "i": "^0.3.6",
     "js-base64": "^3.6.0",
     "js-cookie": "2.2.0",
+    "JSONPath": "^0.11.2",
     "linq": "^3.2.2",
     "lodash": "^4.17.20",
     "mammoth": "^1.4.19",

+ 69 - 27
src/views/accompaniment/index.vue

@@ -123,8 +123,15 @@
         <el-form-item>
           <el-button @click="submit" type="primary">搜索</el-button>
           <el-button @click="reset" type="danger">重置</el-button>
+                  <el-button
+            @click="onExport"
+            type="primary"
+            v-permission="'export/exportMusicScoreList'"
+            >导出</el-button
+          >
         </el-form-item>
       </saveform>
+
       <el-table
         style="width: 100%"
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
@@ -258,7 +265,7 @@
               "
               >预览</el-button
             > -->
-            <el-dropdown :disabled="(scope.row.isOpenMetronome ? !scope.row.url : !scope.row.metronomeUrl) || scope.row.clientType != 'SMART_PRACTICE'">
+            <el-dropdown :disabled="scope.row.clientType != 'SMART_PRACTICE'">
                 <span class="el-dropdown-link">
                   预览<i class="el-icon-arrow-down el-icon--right"></i>
                 </span>
@@ -373,6 +380,9 @@ import { vaildTeachingUrl } from "@/utils/validate";
 import { getToken } from "@/utils/auth";
 import deepClone from "@/helpers/deep-clone/";
 import Tooltip from "@/components/Tooltip/index";
+import { Export } from "@/utils/downLoadFile";
+import qs from "qs";
+import cleanDeep from "clean-deep";
 export default {
   name: "accompaniment",
   components: {
@@ -385,7 +395,7 @@ export default {
     return {
       parts: [],
       selectPart: 0,
-      tabName: 'first',
+      tabName: "first",
       type: "",
       activeUrl: "",
       songUseType,
@@ -434,11 +444,14 @@ export default {
   },
   async mounted() {
     const { query, params } = this.$route;
-      await this.FetchTree();
+    await this.FetchTree();
     if (params.categoriesId) {
       // console.log(this.tree)
       // console.log(this.formatParentId(params.categoriesId, this.tree))
-      this.searchForm.categoriesId = this.formatParentId(params.categoriesId, this.tree);
+      this.searchForm.categoriesId = this.formatParentId(
+        params.categoriesId,
+        this.tree
+      );
     }
     this.$store.dispatch("setSubjects");
     this.$store.dispatch("setBranchs");
@@ -469,15 +482,18 @@ export default {
       try {
         const res = await queryTree();
         this.tree = res.data;
-        this.formatTree(this.tree)
+        this.formatTree(this.tree);
       } catch (error) {}
     },
-    formatTree(data){
-      for(let i of data) {
-        if(i.sysMusicScoreCategoriesList && i.sysMusicScoreCategoriesList.length > 0) {
-          this.formatTree(i.sysMusicScoreCategoriesList, i)
+    formatTree(data) {
+      for (let i of data) {
+        if (
+          i.sysMusicScoreCategoriesList &&
+          i.sysMusicScoreCategoriesList.length > 0
+        ) {
+          this.formatTree(i.sysMusicScoreCategoriesList, i);
         } else {
-          i.sysMusicScoreCategoriesList = null
+          i.sysMusicScoreCategoriesList = null;
         }
       }
     },
@@ -508,32 +524,39 @@ export default {
       this.FetchList();
     },
     getPartListNames(xml) {
-      if (!xml) return []
-      const xmlParse = new DOMParser().parseFromString(xml, 'text/xml')
-      const partList = xmlParse.getElementsByTagName('part-list')?.[0]?.getElementsByTagName('score-part') || []
-      const partListNames = Array.from(partList).map(item => item.getElementsByTagName('part-name')?.[0].textContent || '')
-      this.xmlFirstSpeed = xmlParse.getElementsByTagName('per-minute')?.[0]?.textContent || ''
-      return partListNames
+      if (!xml) return [];
+      const xmlParse = new DOMParser().parseFromString(xml, "text/xml");
+      const partList =
+        xmlParse
+          .getElementsByTagName("part-list")?.[0]
+          ?.getElementsByTagName("score-part") || [];
+      const partListNames = Array.from(partList).map(
+        (item) => item.getElementsByTagName("part-name")?.[0].textContent || ""
+      );
+      this.xmlFirstSpeed =
+        xmlParse.getElementsByTagName("per-minute")?.[0]?.textContent || "";
+      return partListNames;
     },
     async looker(row, num) {
       try {
-        this.selectPart = 0
-        const res = await fetch(row.xmlUrl)
-        const text = await res.text()
-        this.parts = this.getPartListNames(text)
+        this.selectPart = 0;
+        const res = await fetch(row.xmlUrl);
+        const text = await res.text();
+        this.parts = this.getPartListNames(text);
       } catch (error) {
-        this.parts = []
-        this.selectPart = 0
+        this.parts = [];
+        this.selectPart = 0;
       }
       this.accompanyUrl =
         vaildTeachingUrl() +
         "/accompany?Authorization=" +
         getToken() +
-        "&platform=web&isOpenMetronome="+ num +"#/detail/" +
+        "&platform=web&isOpenMetronome=" +
+        num +
+        "#/detail/" +
         row.id;
       this.lookVisible = true;
 
-
       // this.$nextTick(() => {
       //   console.log(this.$refs.iframe)
       //   let iframe = this.$refs.iframe
@@ -567,8 +590,8 @@ export default {
     },
     async transcod(row) {
       try {
-       const res = await Transcod(row)
-       console.log(res)
+        const res = await Transcod(row);
+        console.log(res);
       } catch (error) {}
     },
     open(type) {
@@ -589,6 +612,25 @@ export default {
     changeCategor(e) {
       this.$refs.myCascader.dropDownVisible = false;
     },
+    onExport() {
+      let { categoriesId, organId, ...search } = deepClone(this.searchForm);
+      Export(
+        this,
+        {
+          url: "/api-web/export/exportMusicScoreList",
+          params: {
+            ...search,
+            categoriesId:
+              categoriesId && categoriesId.length > 0
+                ? categoriesId.pop()
+                : null,
+          },
+          fileName: `教学伴奏导出.xls`,
+          method: "get",
+        },
+        "确定导出教学伴奏"
+      );
+    },
   },
 };
 </script>
@@ -613,7 +655,7 @@ export default {
 <style lang="less" scoped>
 /deep/.el-dropdown {
   margin-right: 10px;
-  color: #14928A;
+  color: #14928a;
 }
 .remark {
   display: inline;

+ 3 - 3
src/views/businessManager/shopManager/shopList.vue

@@ -105,7 +105,7 @@
           <el-select
             v-model.trim="searchForm.educationShowOrganId"
             clearable
-            placeholder="管理端APP可售分部"
+            placeholder="移动端可售分部"
           >
             <el-option
               v-for="item in selects.branchs"
@@ -896,14 +896,14 @@
         </el-form-item> -->
         <!--   :disabled="pageDisabled || pageType == 'update'" -->
         <el-form-item
-          label="管理端APP可售分部"
+          label="移动端可售分部"
           prop="educationShowOrganId"
           :label-width="formLabelWidth"
         >
           <select-all
             v-model.trim="form.educationShowOrganId"
             filterable
-            placeholder="管理端APP可售分部"
+            placeholder="移动端可售分部"
             style="width: 400px !important"
             multiple
             clearable

+ 85 - 75
src/views/businessManager/shopManager/shopOperation.vue

@@ -259,7 +259,7 @@
             ></el-option>
           </select-all>
         </el-form-item> -->
-        <el-form-item label="管理端APP可售分部" prop="educationShowOrganId">
+        <el-form-item label="移动端可售分部" prop="educationShowOrganId">
           <select-all
             v-model.trim="form.educationShowOrganId"
             filterable
@@ -418,7 +418,13 @@
             <img v-if="form.image" :src="form.image" class="avatar" />
             <i v-else class="el-icon-plus avatar-uploader-icon"></i>
           </el-upload> -->
-          <image-cropper :options="cropperOptions" :disabled="pageDisabled" :imgSize="2" :imageUrl="form.image"  @crop-upload-success="cropSuccess" />
+          <image-cropper
+            :options="cropperOptions"
+            :disabled="pageDisabled"
+            :imgSize="2"
+            :imageUrl="form.image"
+            @crop-upload-success="cropSuccess"
+          />
           <p class="imageSize">
             <!-- 仅支持上传尺寸为:{{ imageWidthM }}x{{ imageHeightM }}的图片 -->
             请上传大小2M以内,格式为jpg、png、gif图片
@@ -456,11 +462,11 @@ import {
   categoryListTree,
   goodsAdd,
   goodsUpdate,
-  goodsSingleQuery,
+  goodsSingleQuery
 } from "@/api/businessManager";
 import { getToken, getTenantId } from "@/utils/auth";
 import { goodsType, stockType } from "@/utils/searchArray";
-import ImageCropper from '@/components/ImageCropper'
+import ImageCropper from "@/components/ImageCropper";
 let validPrice = (rule, value, callback) => {
   if ((value == "" && typeof value == "string") || value == null) {
     callback(new Error("请输入金额"));
@@ -494,11 +500,11 @@ export default {
         create: "添加",
         update: "修改",
         look: "查看",
-        copy: "复制",
+        copy: "复制"
       },
       pageDisabled: false,
       headers: {
-        Authorization: getToken(),
+        Authorization: getToken()
       },
       form: {
         sn: null,
@@ -528,7 +534,7 @@ export default {
         educationShowOrganId: null,
         courseFeeShowOrganId: null,
         memberFeeShowOrganId: null,
-        replacementShowOrganId: null,
+        replacementShowOrganId: null
       },
       rules: {
         sn: [{ required: true, message: "请输入商品货号", trigger: "blur" }],
@@ -536,138 +542,138 @@ export default {
           {
             required: true,
             message: "请输入品牌",
-            trigger: "blur",
+            trigger: "blur"
           },
           {
             min: 2,
             max: 30,
             message: "长度在 2 到 30 个字符",
-            trigger: "blur",
-          },
+            trigger: "blur"
+          }
         ],
         supplyChannel: [
-          { required: true, message: "请输入备查货号", trigger: "blur" },
+          { required: true, message: "请输入备查货号", trigger: "blur" }
         ],
         name: [
           {
             required: true,
             message: "请输入商品名称",
-            trigger: "blur",
+            trigger: "blur"
           },
           {
             min: 2,
             max: 30,
             message: "长度在 2 到 30 个字符",
-            trigger: "blur",
-          },
+            trigger: "blur"
+          }
         ],
         type: [
           {
             required: true,
             message: "请选择商品分类",
-            trigger: "change",
-          },
+            trigger: "change"
+          }
         ],
         goodsCategoryId: [
           {
             required: true,
             message: "请选择商品类型",
-            trigger: "change",
-          },
+            trigger: "change"
+          }
         ],
         organIdList: [
           {
             required: true,
             message: "请选择所属分部",
-            trigger: "change",
-          },
+            trigger: "change"
+          }
         ],
         specification: [
           {
             required: true,
             message: "请输入商品型号",
-            trigger: "blur",
+            trigger: "blur"
           },
           {
             min: 2,
             max: 30,
             message: "长度在 2 到 30 个字符",
-            trigger: "blur",
-          },
+            trigger: "blur"
+          }
         ],
         stockCount: [
-          { required: true, validator: validStock, trigger: "blur" },
+          { required: true, validator: validStock, trigger: "blur" }
         ],
         taxStockCount: [
-          { required: true, validator: validStock, trigger: "blur" },
+          { required: true, validator: validStock, trigger: "blur" }
         ],
         stockType: [
-          { required: true, message: "请选择库存类型", trigger: "change" },
+          { required: true, message: "请选择库存类型", trigger: "change" }
         ],
         marketPrice: [
           {
             required: true,
             validator: validPrice,
-            trigger: "blur",
-          },
+            trigger: "blur"
+          }
         ],
         discountPrice: [
           {
             required: true,
             validator: validPrice,
-            trigger: "blur",
-          },
+            trigger: "blur"
+          }
         ],
         groupPurchasePrice: [
           {
             required: true,
             validator: validPrice,
-            trigger: "blur",
-          },
+            trigger: "blur"
+          }
         ],
         clientShow: [
-          { required: true, message: "请选择学员是否展示", trigger: "change" },
+          { required: true, message: "请选择学员是否展示", trigger: "change" }
         ],
         replacementShow: [
-          { required: true, message: "是否参与乐器置换", trigger: "change" },
+          { required: true, message: "是否参与乐器置换", trigger: "change" }
         ],
         educationalShow: [
           {
             required: true,
             message: "请选择教务端是否展示",
-            trigger: "change",
-          },
+            trigger: "change"
+          }
         ],
         musicGroupShow: [
-          { required: true, message: "请选择乐团是否展示", trigger: "change" },
+          { required: true, message: "请选择乐团是否展示", trigger: "change" }
         ],
         courseViewType: [
-          { required: true, message: "请选乐团收费模式", trigger: "change" },
+          { required: true, message: "请选乐团收费模式", trigger: "change" }
         ],
         stockWarning: [
-          { required: true, message: "请选择是否库存预警", trigger: "change" },
+          { required: true, message: "请选择是否库存预警", trigger: "change" }
         ],
         image: [
           {
             required: true,
             message: "请选择图片",
-            trigger: "blur",
-          },
+            trigger: "blur"
+          }
         ],
         brief: [
           {
             required: true,
             message: "请输入商品描述",
-            trigger: "blur",
-          },
+            trigger: "blur"
+          }
         ],
         desc: [
           {
             required: true,
             message: "请输入商品详情",
-            trigger: "blur",
-          },
-        ],
+            trigger: "blur"
+          }
+        ]
       },
       Fsearch: null,
       Frules: null,
@@ -680,8 +686,8 @@ export default {
         autoCropHeight: 300, //默认生成截图框高度
         fixedBox: true, //是否固定截图框大小 不允许改变
         previewsCircle: false, //预览图是否是圆形
-        title: '商品图片', //模态框上显示的标题
-      },
+        title: "商品图片" //模态框上显示的标题
+      }
     };
   },
   mounted() {
@@ -706,7 +712,7 @@ export default {
       this.form.image = data.data.url;
     },
     onSubmit(formName) {
-      this.$refs[formName].validate((valid) => {
+      this.$refs[formName].validate(valid => {
         if (valid) {
           let tempForm = JSON.parse(JSON.stringify(this.form));
           if (tempForm.courseViewType) {
@@ -719,21 +725,25 @@ export default {
             tempForm.studentShowOrganId = tempForm.studentShowOrganId.join(",");
           }
           if (tempForm.educationShowOrganId) {
-            tempForm.educationShowOrganId =
-              tempForm.educationShowOrganId.join(",");
+            tempForm.educationShowOrganId = tempForm.educationShowOrganId.join(
+              ","
+            );
           }
 
           if (tempForm.courseFeeShowOrganId) {
-            tempForm.courseFeeShowOrganId =
-              tempForm.courseFeeShowOrganId.join(",");
+            tempForm.courseFeeShowOrganId = tempForm.courseFeeShowOrganId.join(
+              ","
+            );
           }
           if (tempForm.memberFeeShowOrganId) {
-            tempForm.memberFeeShowOrganId =
-              tempForm.memberFeeShowOrganId.join(",");
+            tempForm.memberFeeShowOrganId = tempForm.memberFeeShowOrganId.join(
+              ","
+            );
           }
           if (tempForm.replacementShowOrganId) {
-            tempForm.replacementShowOrganId =
-              tempForm.replacementShowOrganId.join(",");
+            tempForm.replacementShowOrganId = tempForm.replacementShowOrganId.join(
+              ","
+            );
           }
           if (
             !tempForm.studentShowOrganId &&
@@ -754,11 +764,11 @@ export default {
             tempForm.stockCount = 0;
             tempForm.taxStockCount = 0;
             tempForm.status = "NO"; // 默认上架
-            goodsAdd(tempForm).then((res) => {
+            goodsAdd(tempForm).then(res => {
               this.messageTips("保存", res);
             });
           } else if (this.pageType == "update") {
-            goodsUpdate(tempForm).then((res) => {
+            goodsUpdate(tempForm).then(res => {
               this.messageTips("保存", res);
             });
           }
@@ -767,7 +777,7 @@ export default {
             let isError = document.getElementsByClassName("is-error");
             isError[0].scrollIntoView({
               block: "center",
-              behavior: "smooth",
+              behavior: "smooth"
             });
           });
           return false;
@@ -782,8 +792,8 @@ export default {
           path: "/shopList",
           query: {
             pageInfo: this.Frules,
-            searchForm: this.Fsearch,
-          },
+            searchForm: this.Fsearch
+          }
         });
       } else {
         this.$message.error(res.msg);
@@ -792,7 +802,7 @@ export default {
     onCancel() {
       this.$store.dispatch("delVisitedViews", this.$route);
       this.$router.push({
-        path: "/shopList",
+        path: "/shopList"
       });
     },
     onReSet(formName) {
@@ -822,13 +832,13 @@ export default {
           stockWarning: null,
           image: null,
           brief: null,
-          desc: null,
+          desc: null
         };
         if (this.$refs["form"]) {
           this.$refs["form"].resetFields();
         }
       } else {
-        goodsSingleQuery(this.id).then((res) => {
+        goodsSingleQuery(this.id).then(res => {
           if (res.code == 200) {
             let result = res.data;
             let courseViewType = null;
@@ -893,7 +903,7 @@ replacementShowOrganId: 6,7 */
               image: result.image,
               brief: result.brief,
               desc: result.desc,
-              replacementShow: result.replacementShow,
+              replacementShow: result.replacementShow
             };
           }
         });
@@ -902,15 +912,15 @@ replacementShowOrganId: 6,7 */
     getCatagory() {
       categoryListTree({
         delFlag: 0,
-        rows: 9999,
-      }).then((res) => {
+        rows: 9999
+      }).then(res => {
         let result = res.data;
         if (res.code == 200) {
           let tempArray = [];
-          result.rows.forEach((row) => {
+          result.rows.forEach(row => {
             tempArray.push({
               label: row.name,
-              value: row.id,
+              value: row.id
             });
           });
           this.categoryList = tempArray;
@@ -923,7 +933,7 @@ replacementShowOrganId: 6,7 */
     beforeAvatarUpload(file) {
       const imageType = {
         "image/png": true,
-        "image/jpeg": true,
+        "image/jpeg": true
       };
       const isImage = imageType[file.type];
       const isLt2M = file.size / 1024 / 1024 < 2;
@@ -932,7 +942,7 @@ replacementShowOrganId: 6,7 */
       const _URL = window.URL || window.webkitURL;
       const isSize = new Promise((resolve, reject) => {
         const img = new Image();
-        img.onload = function () {
+        img.onload = function() {
           if (imageWidth && imageHeigh) {
             this.width === imageWidth && this.height === imageHeigh
               ? resolve()
@@ -954,7 +964,7 @@ replacementShowOrganId: 6,7 */
         () => {
           return file;
         },
-        (src) => {
+        src => {
           this.$message.error(src);
           this.uploadImgLoading = false;
           return Promise.reject();
@@ -967,8 +977,8 @@ replacementShowOrganId: 6,7 */
         this.$message.error("上传头像图片大小不能超过 2MB!");
       }
       return isImage && isLt2M && isSize;
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 41 - 21
src/views/liveClassManager/index.vue

@@ -108,10 +108,17 @@
               </div>
             </template>
           </el-table-column>
-              <el-table-column align="center" prop="popularize" label="观看权限">
+          <el-table-column align="center" prop="popularize" label="直播设备">
             <template slot-scope="scope">
               <div>
-                {{ scope.row.popularizeType=='ALL'? "全员" : "部分" }}
+                {{ scope.row.os == "pc" ? "电脑" : "手机" }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="popularize" label="观看权限">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.popularizeType == "ALL" ? "全员" : "部分" }}
               </div>
             </template>
           </el-table-column>
@@ -152,17 +159,19 @@
           <el-table-column align="center" prop="studentId" label="操作">
             <template slot-scope="scope">
               <div>
-                <el-dropdown trigger="click" placement="bottom">
+                <el-dropdown trigger="click" placement="bottom" :hide-on-click="false" >
                   <span class="el-dropdown-link">
                     操作<i class="el-icon-arrow-down el-icon--right"></i>
                   </span>
-                  <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-menu slot="dropdown" style="width:100px">
                     <el-dropdown-item
+                    style="width:100px"
                       v-if="permission('/liveStudentList')&&scope.row.popularizeType!=='ALL'"
+                        @click.native="lookStudentDetail(scope.row)"
                     >
                       <el-button
                         type="text"
-                        @click="lookStudentDetail(scope.row)"
+
                         >观看学员</el-button
                       >
                     </el-dropdown-item>
@@ -171,10 +180,11 @@
                         permission('imLiveBroadcastRoom/opsPopularize') &&
                         scope.row.liveState != 2
                       "
+                           @click.native="popularizeRoom(scope.row)"
                     >
                       <el-button
                         type="text"
-                        @click="popularizeRoom(scope.row)"
+
                         >{{
                           scope.row.popularize == 1 ? "取消推广" : "首页推广"
                         }}</el-button
@@ -186,42 +196,44 @@
                         permission('imLiveBroadcastRoom/roomDestroy') &&
                         scope.row.liveState == 1
                       "
+                       @click.native="closeRoom(scope.row)"
                     >
-                      <el-button type="text" @click="closeRoom(scope.row)"
+                      <el-button type="text"
                         >关闭直播</el-button
                       >
                     </el-dropdown-item>
 
-                    <el-dropdown-item v-if="scope.row.liveState == 2">
-                      <el-button type="text" @click="gotoDetail(scope.row)"
+                    <el-dropdown-item v-if="scope.row.liveState == 2"  @click.native="gotoDetail(scope.row)">
+                      <el-button type="text"
                         >直播详情</el-button
                       >
                     </el-dropdown-item>
                     <auth auths="/liveBlackList">
-                      <el-dropdown-item>
-                        <el-button type="text" @click="gotoBuylist(scope.row)"
+                      <el-dropdown-item  @click.native="gotoBuylist(scope.row)">
+                        <el-button type="text"
                           >订单详情</el-button
                         >
                       </el-dropdown-item>
                     </auth>
-                    <el-dropdown-item v-if="permission('liveGoodsMapper/page')">
-                      <el-button type="text" @click="setShop(scope.row)"
+                    <el-dropdown-item v-if="permission('liveGoodsMapper/page')&&ishowCart(scope.row)"  @click.native="setShop(scope.row)">
+                      <el-button type="text"
                         >商品设置</el-button
                       >
                     </el-dropdown-item>
                     <auth
                       auths="imLiveBroadcastRoom/queryLiveRoomGoodsOrderList"
                     >
-                      <el-dropdown-item>
-                        <el-button type="text" @click="gotoBlacklist(scope.row)"
+                      <el-dropdown-item  @click.native="gotoBlacklist(scope.row)">
+                        <el-button type="text"
                           >黑名单</el-button
                         >
                       </el-dropdown-item>
                     </auth>
                     <el-dropdown-item
                       v-if="permission('imLiveBroadcastRoom/shareGroup')"
+                       @click.native="shareLive(scope.row)"
                     >
-                      <el-button type="text" @click="shareLive(scope.row)"
+                      <el-button type="text"
                         >分享</el-button
                       >
                     </el-dropdown-item>
@@ -232,7 +244,7 @@
                         scope.row.liveState == 0
                       "
                     >
-                      <el-button type="text" @click="resetLive(scope.row)"
+                      <el-button type="text"  @click.native="resetLive(scope.row)"
                         >修改</el-button
                       >
                     </el-dropdown-item>
@@ -242,7 +254,7 @@
                       v-if="scope.row.liveState == 0"
                     >
                       <el-dropdown-item>
-                        <el-button type="text" @click="deteleLive(scope.row)"
+                        <el-button type="text"  @click.native="deteleLive(scope.row)"
                           >删除</el-button
                         >
                       </el-dropdown-item>
@@ -446,9 +458,9 @@ export default {
     resetLive(row) {
       let params = {
         path: "/business/createLiveClass",
-        query: { ...row },
+       query: { id:row.id,roomUid:row.roomUid}
       };
-      //   query: { id:row.id,roomUid:row.roomUid},
+      //  ,
       this.$router.push(params, (route) => {
         route.meta.title = "修改直播课";
       });
@@ -533,9 +545,17 @@ export default {
     lookStudentDetail(row) {
       this.$router.push({
         path: "/business/liveStudentList",
-        query: { roomUid: row.roomUid,name:row.roomTitle },
+        query: { roomUid: row.roomUid, name: row.roomTitle },
       });
     },
+    ishowCart(row){
+      let json = JSON.parse(row.roomConfig)
+      if(json.whether_view_shop_cart == 0) {
+         return true
+      }else{
+        return false
+      }
+    }
   },
 };
 </script>

+ 45 - 21
src/views/liveClassManager/liveClassDetail.vue

@@ -131,9 +131,11 @@
           :key="index"
           @click="opneVideo(item)"
         >
-          <video width="110px" :src="item.url"></video>
-          <i class="el-icon-video-play linkIcon"></i
-          >
+          <div class="linkItemWrap">
+            <video width="110px" :src="item.url"></video>
+            <i class="el-icon-video-play linkIcon"></i>
+          </div>
+
           <p :underline="false" type="text" class="lineTitle">
             {{ item.endTime | dateForMinFormat }}
           </p>
@@ -153,14 +155,26 @@
       v-if="videoVisible"
     >
       <!-- activeUrl -->
-      <video
-        style="width: 640px"
-        :src="activeVideo.url"
-        ref="dialogVideo"
-        controls="controls"
-      >
-        您的浏览器不支持视频播放
-      </video>
+      <div class="activeVideoWrap">
+        <video
+          v-if="activeVideo.os == 'mobile'"
+          style="width: 320px"
+          :src="activeVideo.url"
+          ref="dialogVideo"
+          controls="controls"
+        >
+          您的浏览器不支持视频播放
+        </video>
+        <video
+          v-else
+          style="width: 640px"
+          :src="activeVideo.url"
+          ref="dialogVideo"
+          controls="controls"
+        >
+          您的浏览器不支持视频播放
+        </video>
+      </div>
     </el-dialog>
   </div>
 </template>
@@ -315,27 +329,32 @@ export default {
   flex-direction: row;
   align-items: center;
   flex-wrap: wrap;
-  justify-content: space-around;
 
   .linkItem {
     display: flex;
     flex-direction: column;
     align-items: center;
+    margin-right: 5px;
     cursor: pointer;
     position: relative;
     &:hover {
       color: var(--color-primary);
-      .lineTitle{
-         color: var(--color-primary);
-         font-weight: bold;
+      .lineTitle {
+        color: var(--color-primary);
+        font-weight: bold;
       }
     }
-    .linkIcon {
-      font-size: 25px;
-      position: absolute;
-      top: 30px;
-      color: #fff;
-
+    .linkItemWrap {
+      position: relative;
+      .linkIcon {
+        font-size: 25px;
+        position: absolute;
+        top: 50%;
+        margin-top: -13px;
+        left: 50%;
+        margin-left: -13px;
+        color: #fff;
+      }
     }
   }
   .lineTitle {
@@ -349,4 +368,9 @@ export default {
     border-radius: 4px;
   }
 }
+.activeVideoWrap {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
 </style>

+ 11 - 2
src/views/liveClassManager/modals/shareDetail.vue

@@ -1,8 +1,8 @@
 <template>
   <div>
     <el-form :model="form" ref="form" class="form">
-      <el-form-item label="分享对象">
-        <el-radio-group v-model="form.shareTarget" @change="changeShareTarget">
+      <el-form-item label="分享对象" v-if="row.os !== 'mobile'">
+        <el-radio-group v-model="form.shareTarget" @change="changeShareTarget" >
           <el-radio v-model="form.shareTarget" label="1">主讲人</el-radio>
           <el-radio v-model="form.shareTarget" label="2">学员</el-radio>
         </el-radio-group>
@@ -82,6 +82,15 @@ export default {
       ? domain + `/live/?roomUid=${this.row.roomUid}`
       : "https://test.dayaedu.com" + `/live/?roomUid=${this.row.roomUid}`;
       // this.copyText()
+
+      // 判断一下
+
+      if(this.row.os == 'mobile'){
+          console.log('设置学员观看')
+          this.form.shareTarget='2'
+      }else {
+         this.form.shareTarget='1'
+      }
   },
   methods: {
     copyText(e) {

+ 103 - 36
src/views/liveClassManager/newLiveClass.vue

@@ -158,6 +158,26 @@
           </el-form-item>
         </el-row>
         <el-alert
+          title="直播设备配置"
+          type="info"
+          :closable="false"
+          style="margin-bottom: 20px"
+        ></el-alert>
+        <el-row class="row">
+          <el-form-item
+            class="mline"
+            label="直播设备"
+            prop="os"
+            label-width="120px"
+            :rules="[{ required: true, message: '请选择推广类型' }]"
+          >
+            <el-radio-group v-model="form.os" >
+              <el-radio label="pc">电脑</el-radio>
+              <el-radio label="mobile">手机</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-row>
+        <el-alert
           title="观看权限配置"
           type="info"
           :closable="false"
@@ -313,7 +333,7 @@
             </el-radio-group>
           </el-form-item>
         </el-row>
-        <!-- <el-row class="row">
+        <el-row class="row">
           <el-form-item
             prop="roomConfig.whether_view_shop_cart"
             label-width="120px"
@@ -326,7 +346,7 @@
               <el-radio :label="1">否</el-radio>
             </el-radio-group>
           </el-form-item>
-        </el-row> -->
+        </el-row>
       </el-form>
       <el-row class="row">
         <el-button type="primary" @click="preLook">预览</el-button>
@@ -349,7 +369,7 @@
 import preview from "./modals/preview.vue";
 import axios from "axios";
 import { getToken, getTenantId } from "@/utils/auth";
-import { createLiveBroadcast, resetLiveBroadcastRoomList } from "./api";
+import { createLiveBroadcast, resetLiveBroadcastRoomList ,getRoomInfo} from "./api";
 import { queryByOrganId } from "@/api/systemManage";
 import { getTeamList } from "@/api/teamServer";
 export default {
@@ -368,6 +388,7 @@ export default {
         liveRemark: "",
         preTemplate: null,
         popularizeType: "ALL",
+        os:'pc',
         roomConfig: {
           whether_like: 0,
           whether_chat: 0,
@@ -388,47 +409,93 @@ export default {
   mounted() {
     this.$store.dispatch("setBranchs");
     if (this.$route.query.id) {
-      this.name = "修改直播间";
+      // this.name = "修改直播间";
+      this.getDetail()
       // console.log()
-      this.form = {
-        ...this.$route.query,
-        organIds: [],
-        schoolIds: [],
-        teamIds: [],
-      };
-      this.form.roomConfig = JSON.parse(this.$route.query.roomConfig);
+      // this.form = {
+      //   ...this.$route.query,
+      //   organIds: [],
+      //   schoolIds: [],
+      //   teamIds: [],
+      // };
+      // this.form.roomConfig = JSON.parse(this.$route.query.roomConfig);
 
-      if (this.$route.query.popularizeOrgIds) {
-        this.form.organIds = this.$route.query.popularizeOrgIds
-          .split(",")
-          .map((item) => {
-            return item * 1;
-          });
-      }
-      this.changeSection(this.form.organIds);
-      if (this.$route.query.popularizeSchoolIds) {
-        this.form.schoolIds = this.$route.query.popularizeSchoolIds
-          .split(",")
-          .map((item) => {
-            return item * 1;
-          });
-      }
+      // if (this.$route.query.popularizeOrgIds) {
+      //   this.form.organIds = this.$route.query.popularizeOrgIds
+      //     .split(",")
+      //     .map((item) => {
+      //       return item * 1;
+      //     });
+      // }
+      // this.changeSection(this.form.organIds);
+      // if (this.$route.query.popularizeSchoolIds) {
+      //   this.form.schoolIds = this.$route.query.popularizeSchoolIds
+      //     .split(",")
+      //     .map((item) => {
+      //       return item * 1;
+      //     });
+      // }
 
-      if (this.$route.query.popularizeTeamIds) {
-        let arr = this.$route.query.popularizeTeamIds.split(",");
-        this.$set(this.form, "teamIds", arr);
-        console.log(this.form.teamIds);
-      }
+      // if (this.$route.query.popularizeTeamIds) {
+      //   let arr = this.$route.query.popularizeTeamIds.split(",");
+      //   this.$set(this.form, "teamIds", arr);
+      //   console.log(this.form.teamIds);
+      // }
 
-      // this.form.popularizeType = "SCHOOL";
+      // // this.form.popularizeType = "SCHOOL";
 
-      this.remoteMethod(this.$route.query.speakerName);
+      // this.remoteMethod(this.$route.query.speakerName);
 
-      this.checkList.push(this.form.preTemplate * 1);
-      this.isinit = false;
+      // this.checkList.push(this.form.preTemplate * 1);
+      // this.isinit = false;
     }
   },
   methods: {
+        async getDetail() {
+      try {
+        const res = await getRoomInfo({ roomUid: this.$route.query.roomUid });
+        this.name = "修改直播间";
+        // console.log()
+        this.form = {
+          ...res.data,
+          organIds: [],
+          schoolIds: [],
+          teamIds: [],
+          catIds: [],
+          studentIds: [],
+        };
+        this.form.roomConfig = JSON.parse(res.data.roomConfig);
+        if (res.data.popularizeOrgIds) {
+          this.form.organIds = res.data.popularizeOrgIds
+            .split(",")
+            .map((item) => {
+              return item * 1;
+            });
+        }
+
+        if (res.data.popularizeSchoolIds) {
+          this.form.schoolIds = res.data.popularizeSchoolIds
+            .split(",")
+            .map((item) => {
+              return item * 1;
+            });
+        }
+
+        if (res.data.popularizeTeamIds) {
+          let arr = res.data.popularizeTeamIds.split(",");
+          this.$set(this.form, "teamIds", arr);
+        }
+
+        // this.form.popularizeType = "SCHOOL";
+        this.changeSection(this.form.organIds);
+        this.remoteMethod(res.data.speakerName);
+
+        this.checkList.push(this.form.preTemplate * 1);
+        this.isinit = false;
+      } catch (e) {
+        console.log(e);
+      }
+    },
     onCancel() {
       this.$store.dispatch("delVisitedViews", this.$route);
       this.$router.push("/liveClassManager");
@@ -524,7 +591,7 @@ export default {
       this.form.popularizeOrgIds = this.form.organIds.join(",");
       this.form.popularizeSchoolIds = this.form.schoolIds.join(",");
       this.form.popularizeTeamIds = this.form.teamIds.join(",");
-      this.$refs.form.validate(async(flag) => {
+      this.$refs.form.validate(async (flag) => {
         if (!flag) return;
         if (this.$route.query.id) {
           // 修改

+ 12 - 17
src/views/liveShopManger/index.vue

@@ -78,16 +78,12 @@
           <el-table-column align="center" prop="studentId" label="操作">
             <template slot-scope="scope">
               <div>
-                <auth
-                  auths="liveGoods/update"
-                >
+                <auth auths="liveGoods/update">
                   <el-button type="text" @click="resetShop(scope.row)"
                     >修改</el-button
                   >
                 </auth>
-                <auth
-                  auths="liveGoods/delete"
-                >
+                <auth auths="liveGoods/delete">
                   <el-button type="text" @click="deteleShop(scope.row)"
                     >删除</el-button
                   >
@@ -116,14 +112,14 @@ import { getToken } from "@/utils/auth";
 import pagination from "@/components/Pagination/index";
 import load from "@/utils/loading";
 import { getTimes } from "@/utils";
-import { getLiveGoodsMapperList,delLiveGoods } from "./api";
+import { getLiveGoodsMapperList, delLiveGoods } from "./api";
 import eidtLiveShop from "./models/eidtLiveShop";
 export default {
   components: { pagination, eidtLiveShop },
   data() {
     return {
       searchForm: {
-        search: null,
+        search: null
       },
 
       tableList: [],
@@ -133,8 +129,8 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
-      },
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
@@ -153,7 +149,7 @@ export default {
       let params = {
         ...this.searchForm,
         page: this.rules.page,
-        rows: this.rules.limit,
+        rows: this.rules.limit
       };
       try {
         const res = await getLiveGoodsMapperList({ ...params });
@@ -181,10 +177,10 @@ export default {
       this.$confirm(`确定删除"${row.name}"?`, "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
-          delLiveGoods({ goodsId: row.id }).then((res) => {
+          delLiveGoods({ goodsId: row.id }).then(res => {
             if (res.code === 200) {
               this.$message.success("删除成功");
               this.getList();
@@ -193,9 +189,8 @@ export default {
           });
         })
         .catch();
-    },
-  },
+    }
+  }
 };
 </script>
-<style lang='scss' scoped>
-</style>
+<style lang="scss" scoped></style>

+ 309 - 306
src/views/main/baseinfo/index.vue

@@ -1,306 +1,309 @@
-<template>
-  <div class="container main">
-    <save-form
-      inline
-      :model="search"
-      @submit="FetchDetail"
-      @reset="reset"
-      saveKey="/main/main/baseInfo"
-    >
-      <!-- <el-form-item prop="year">
-        <el-date-picker
-          v-model="search.dates"
-          type="daterange"
-          align="right"
-          unlink-panels
-          range-separator="至"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-          :picker-options="pickerOptions">
-        </el-date-picker>
-      </el-form-item> -->
-      <el-form-item prop="organId">
-        <el-select
-          clearable
-          filterable
-          placeholder="请选择分部"
-          v-model="search.organId"
-        >
-          <el-option
-            v-for="(item, index) in selects.branchs"
-            :key="index"
-            :label="item.name"
-            :value="item.id"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-button native-type="submit" type="primary">搜索</el-button>
-      <el-button native-type="reset" type="danger">重置</el-button>
-    </save-form>
-    <!-- <el-alert type="info" :closable="false" style="margin-bottom: 20px;">
-      每日0点更新前一日数据
-    </el-alert> -->
-    <!-- 这里显示选项卡 -->
-    <empty desc="暂无统计数据" v-if="isEmpty" />
-    <el-row v-else class="rows" :gutter="20">
-      <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
-        <studentbaseinfo :data="dataInfo" />
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
-        <operate :data="dataInfo" />
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="8">
-        <hrdata :data="dataInfo" />
-      </el-col>
-      <!-- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-        <surplusCourse :data="dataInfo" />
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-        <useCourse :data="dataInfo" />
-      </el-col> -->
-      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-        <management
-          ref="management"
-          :data="dataInfo"
-          :search="search"
-          @resetDate="resetDate"
-        />
-      </el-col>
-      <el-col
-        :xs="24"
-        :sm="24"
-        :md="24"
-        :lg="24"
-        :xl="24"
-        v-if="$helpers.tenantId == 1"
-      >
-        <business
-          ref="business"
-          :data="dataInfo"
-          :search="search"
-          @resetDate="resetDate"
-        />
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-        <curriculum
-          :data="dataInfo"
-          ref="curriculum"
-          :search="search"
-          @resetDate="resetDate"
-        />
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-        <student
-          :data="dataInfo"
-          ref="student"
-          :search="search"
-          @resetDate="resetDate"
-        />
-      </el-col>
-
-      <!-- <el-col :xs="24" :sm="24" :md="12">
-        <operate :data="dataInfo"/>
-      </el-col> -->
-      <!-- <el-col :xs="24" :sm="24" :md="12">
-        <hrdata :data="dataInfo"/>
-      </el-col> -->
-    </el-row>
-  </div>
-</template>
-<script>
-import { getIndex } from "../api";
-import operate from "./operate";
-import business from "./business";
-import management from "./management";
-import hrdata from "./hr";
-import student from "./student";
-import curriculum from "./curriculum";
-import studentbaseinfo from "./studentBaseinfo";
-import surplusCourse from "./surplusCourse";
-import useCourse from "./useCourse";
-import { getTimes } from "@/utils";
-import { descs } from "../constant";
-
-export default {
-  components: {
-    operate,
-    business,
-    management,
-    hrdata,
-    student,
-    curriculum,
-    studentbaseinfo,
-    surplusCourse,
-    useCourse,
-  },
-  data() {
-    return {
-      pickerOptions: {
-        firstDayOfWeek: 1,
-        disabledDate: (a) => {
-          const { dayjs } = this.$helpers;
-          return dayjs(a).isAfter(dayjs().subtract(1, "day"));
-        },
-        shortcuts: [
-          {
-            text: "最近一周",
-            onClick(picker) {
-              const end = new Date();
-              const start = new Date();
-              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
-              start.setTime(start.getTime() - 3600 * 1000 * 24 * 8);
-              picker.$emit("pick", [start, end]);
-            },
-          },
-          {
-            text: "最近一个月",
-            onClick(picker) {
-              const end = new Date();
-              const start = new Date();
-              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
-              start.setTime(start.getTime() - 3600 * 1000 * 24 * 31);
-              picker.$emit("pick", [start, end]);
-            },
-          },
-          {
-            text: "最近三个月",
-            onClick(picker) {
-              const end = new Date();
-              const start = new Date();
-              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
-              start.setTime(start.getTime() - 3600 * 1000 * 24 * 91);
-              picker.$emit("pick", [start, end]);
-            },
-          },
-        ],
-      },
-      search: {
-        dates: [],
-        organId: null,
-      },
-      dataInfo: {},
-      business: {},
-      loading: false,
-    };
-  },
-  computed: {
-    isEmpty() {
-      return !Object.keys(this.dataInfo).length;
-    },
-  },
-  created() {},
-  async mounted() {
-    this.$set(this.search, "dates", this.getInitDate());
-   await this.$store.dispatch("setBranchs");
-    this.FetchDetail();
-  },
-  methods: {
-    getInitDate() {
-      const end = this.$helpers
-        .dayjs(new Date())
-        .subtract(1, "day")
-        .format("YYYY-MM-DD");
-      const start = this.$helpers
-        .dayjs(new Date())
-        .subtract(1, "day")
-        .set("date", 1)
-        .format("YYYY-MM-DD");
-      return [start, end];
-    },
-    reset() {
-      this.$set(this.search, "dates", this.getInitDate());
-      this.$set(this.search, "organId", null);
-      this.FetchDetail();
-    },
-    async FetchDetail() {
-      // 这里改变就通知子组件重置
-
-      const data = {};
-      try {
-        const { dates, ...rest } = this.search;
-        const res = await getIndex({
-          ...rest,
-          ...getTimes(dates, ["startDate", "endDate"]),
-        });
-        for (const item of res.data) {
-          data[item.dataType] = {
-            ...item,
-            desc: descs[item.dataType],
-          };
-        }
-      } catch (error) {
-        console.log(error);
-      }
-      this.dataInfo = data;
-      if (this.$refs.business) {
-        this.$refs["business"].init();
-      }
-      if (this.$refs.management) {
-        this.$refs["management"].init();
-      }
-    },
-    resetDate(data) {
-      let arr = null;
-      for (let item in data) {
-        // console.log(item)
-        if (item == "VIP_GROUP_COURSE") {
-          arr = data[item].indexMonthData;
-        }
-        this.dataInfo[item] = data[item];
-      }
-      this.dataInfo = { ...this.dataInfo };
-    },
-  },
-};
-</script>
-<style lang="less" scoped>
-.container {
-  overflow: hidden;
-  .rows {
-    > div {
-      margin-bottom: 20px;
-    }
-  }
-  /deep/ .el-card__body .statistic {
-    margin-bottom: 15px;
-    padding: 0;
-  }
-}
-/deep/.el-card__header {
-  padding: 0 20px !important;
-}
-</style>
-<style lang="scss">
-.main {
-  .statistic {
-    .statistic-content > span {
-      font-size: 22px !important;
-      &:first-child {
-        font-size: 14px !important;
-      }
-    }
-  }
-}
-
-.box {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-  height: 55px;
-  line-height: 55px;
-  .shape {
-    margin-right: 10px;
-    height: 18px;
-    width: 4px;
-    background-color: var(--color-primary);
-  }
-}
-.wall {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-  justify-content: center;
-  color: #888;
-  font-size: 14px;
-}
-</style>
+<template>
+  <div class="container main">
+    <save-form
+      inline
+      :model="search"
+      @submit="FetchDetail"
+      @reset="reset"
+      saveKey="/main/main/baseInfo"
+    >
+      <!-- <el-form-item prop="year">
+        <el-date-picker
+          v-model="search.dates"
+          type="daterange"
+          align="right"
+          unlink-panels
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :picker-options="pickerOptions">
+        </el-date-picker>
+      </el-form-item> -->
+      <el-form-item prop="organId">
+        <el-select
+          clearable
+          filterable
+          placeholder="请选择分部"
+          v-model="search.organId"
+        >
+          <el-option
+            v-for="(item, index) in selects.branchs"
+            :key="index"
+            :label="item.name"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-button native-type="submit" type="primary">搜索</el-button>
+      <el-button native-type="reset" type="danger">重置</el-button>
+    </save-form>
+    <!-- <el-alert type="info" :closable="false" style="margin-bottom: 20px;">
+      每日0点更新前一日数据
+    </el-alert> -->
+    <!-- 这里显示选项卡 -->
+    <empty desc="暂无统计数据" v-if="isEmpty" />
+    <el-row v-else class="rows" :gutter="20">
+      <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+        <studentbaseinfo :data="dataInfo" />
+      </el-col>
+      <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+        <operate :data="dataInfo" />
+      </el-col>
+      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="8">
+        <hrdata :data="dataInfo" />
+      </el-col>
+      <!-- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+        <surplusCourse :data="dataInfo" />
+      </el-col>
+      <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+        <useCourse :data="dataInfo" />
+      </el-col> -->
+      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+        <management
+          ref="management"
+          :data="dataInfo"
+          :search="search"
+          @resetDate="resetDate"
+        />
+      </el-col>
+      <el-col
+        :xs="24"
+        :sm="24"
+        :md="24"
+        :lg="24"
+        :xl="24"
+        v-if="$helpers.tenantId == 1"
+      >
+        <business
+          ref="business"
+          :data="dataInfo"
+          :search="search"
+          @resetDate="resetDate"
+        />
+      </el-col>
+      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+        <curriculum
+          :data="dataInfo"
+          ref="curriculum"
+          :search="search"
+          @resetDate="resetDate"
+        />
+      </el-col>
+      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+        <student
+          :data="dataInfo"
+          ref="student"
+          :search="search"
+          @resetDate="resetDate"
+        />
+      </el-col>
+
+      <!-- <el-col :xs="24" :sm="24" :md="12">
+        <operate :data="dataInfo"/>
+      </el-col> -->
+      <!-- <el-col :xs="24" :sm="24" :md="12">
+        <hrdata :data="dataInfo"/>
+      </el-col> -->
+    </el-row>
+  </div>
+</template>
+<script>
+import { getIndex } from "../api";
+import operate from "./operate";
+import business from "./business";
+import management from "./management";
+import hrdata from "./hr";
+import student from "./student";
+import curriculum from "./curriculum";
+import studentbaseinfo from "./studentBaseinfo";
+import surplusCourse from "./surplusCourse";
+import useCourse from "./useCourse";
+import { getTimes } from "@/utils";
+import { descs } from "../constant";
+
+export default {
+  components: {
+    operate,
+    business,
+    management,
+    hrdata,
+    student,
+    curriculum,
+    studentbaseinfo,
+    surplusCourse,
+    useCourse,
+  },
+  data() {
+    return {
+      pickerOptions: {
+        firstDayOfWeek: 1,
+        disabledDate: (a) => {
+          const { dayjs } = this.$helpers;
+          return dayjs(a).isAfter(dayjs().subtract(1, "day"));
+        },
+        shortcuts: [
+          {
+            text: "最近一周",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 8);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 31);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 91);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+        ],
+      },
+      search: {
+        dates: [],
+        organId: null,
+      },
+      dataInfo: {},
+      business: {},
+      loading: false,
+    };
+  },
+  computed: {
+    isEmpty() {
+      return !Object.keys(this.dataInfo).length;
+    },
+  },
+  created() {},
+  async mounted() {
+    this.$set(this.search, "dates", this.getInitDate());
+   await this.$store.dispatch("setBranchs");
+    this.FetchDetail();
+  },
+  methods: {
+    getInitDate() {
+      const end = this.$helpers
+        .dayjs(new Date())
+        .subtract(1, "day")
+        .format("YYYY-MM-DD");
+      const start = this.$helpers
+        .dayjs(new Date())
+        .subtract(1, "day")
+        .set("date", 1)
+        .format("YYYY-MM-DD");
+      return [start, end];
+    },
+    reset() {
+      this.$set(this.search, "dates", this.getInitDate());
+      this.$set(this.search, "organId", null);
+      this.FetchDetail();
+    },
+    async FetchDetail() {
+      // 这里改变就通知子组件重置
+
+      const data = {};
+      try {
+        const { dates, ...rest } = this.search;
+        const res = await getIndex({
+          ...rest,
+          ...getTimes(dates, ["startDate", "endDate"]),
+        });
+        for (const item of res.data) {
+          data[item.dataType] = {
+            ...item,
+            desc: descs[item.dataType],
+          };
+        }
+      } catch (error) {
+        console.log(error);
+      }
+      this.dataInfo = data;
+      if (this.$refs.business) {
+        this.$refs["business"].init();
+      }
+      if (this.$refs.management) {
+        this.$refs["management"].init();
+      }
+    },
+    resetDate(data) {
+      let arr = null;
+
+      for (let item in data) {
+        // console.log(item)
+        if (item == "VIP_GROUP_COURSE") {
+          arr = data[item].indexMonthData;
+        }
+
+        this.dataInfo[item] = data[item];
+        // this.$set( this.dataInfo,item,data[item])
+      }
+      this.dataInfo = { ...this.dataInfo };
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+.container {
+  overflow: hidden;
+  .rows {
+    > div {
+      margin-bottom: 20px;
+    }
+  }
+  /deep/ .el-card__body .statistic {
+    margin-bottom: 15px;
+    padding: 0;
+  }
+}
+/deep/.el-card__header {
+  padding: 0 20px !important;
+}
+</style>
+<style lang="scss">
+.main {
+  .statistic {
+    .statistic-content > span {
+      font-size: 22px !important;
+      &:first-child {
+        font-size: 14px !important;
+      }
+    }
+  }
+}
+
+.box {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  height: 55px;
+  line-height: 55px;
+  .shape {
+    margin-right: 10px;
+    height: 18px;
+    width: 4px;
+    background-color: var(--color-primary);
+  }
+}
+.wall {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  color: #888;
+  font-size: 14px;
+}
+</style>

+ 382 - 506
src/views/main/baseinfo/management.vue

@@ -1,506 +1,382 @@
-<template >
-  <el-card id="management">
-    <div slot="header" class="clearfix">
-      <searchHeader
-        :dates="mdate"
-        :title="'经营数据'"
-        @changeValue="changeValue"
-        :isShowQuert="true"
-        :endDate="endDate"
-        ref="searchHeader"
-      />
-    </div>
-    <div
-      class="wall"
-      style="height: 68px"
-      v-if="JSON.stringify(items) == '{}'"
-    ></div>
-    <statistic :col="5" class="statistic" :cols="12">
-      <statistic-item @click="active = 0">
-        <span>
-          {{ items["TOTAL_AMOUNT"].title + "(元)" }}
-          <el-tooltip
-            v-if="items['TOTAL_AMOUNT'].desc"
-            :content="items['TOTAL_AMOUNT'].desc"
-            :open-delay="0.3"
-            placement="top"
-          >
-            <i
-              style="margin-left: 5px; cursor: pointer"
-              class="el-icon-warning-outline"
-            />
-          </el-tooltip>
-        </span>
-        <!--  12345678901.23 -->
-        <span>
-          <count-to
-            :endVal="items['TOTAL_AMOUNT'].percent"
-            :decimals="2"
-            :class="'blod'"
-        /></span>
-      </statistic-item>
-      <template v-for="(item, key) in items">
-        <statistic-item
-          v-if="item.dataType != 'TOTAL_AMOUNT'"
-          :key="key"
-          :class="{ active: active === key }"
-          @click="active = key"
-        >
-          <span>
-            {{ item.title + "(元)" }}
-            <el-tooltip
-              v-if="item.desc"
-              :content="item.desc"
-              :open-delay="0.3"
-              placement="top"
-            >
-              <i
-                style="margin-left: 5px; cursor: pointer"
-                class="el-icon-warning-outline"
-              />
-            </el-tooltip>
-          </span>
-          <!--  12345678901.23 -->
-          <span>
-            <count-to
-              :endVal="item.percent"
-              :decimals="2"
-              :class="item.dataType == 'TOTAL_AMOUNT' ? 'blod' : ''"
-          /></span>
-        </statistic-item>
-      </template>
-
-      <statistic-item></statistic-item>
-    </statistic>
-
-    <div class="statisticWrap">
-      <statistic :col="5" class="statistic" :cols="0" :isNoLine='true'>
-        <statistic-item
-          v-for="(item, key) in items2"
-          :key="key"
-          :class="{ active: active === key }"
-          @click="active = key"
-        >
-          <template v-if="item.dataType != 'OTHER_AMOUNT'">
-            <span>
-              {{ item.title + "(元)" }}
-              <!-- {{ item.dataType == 'OTHER_AMOUNT' ? 'other' : null }} -->
-              <el-tooltip
-                v-if="item.desc"
-                :content="item.desc"
-                :open-delay="0.3"
-                placement="top"
-              >
-                <i
-                  style="margin-left: 5px; cursor: pointer"
-                  class="el-icon-warning-outline"
-                />
-              </el-tooltip>
-            </span>
-            <!--  12345678901.23 -->
-            <span> <count-to :endVal="item.percent" :decimals="2" /></span>
-          </template>
-          <el-popover
-            placement="top"
-            width="400"
-            v-else
-            trigger="hover">
-            <descriptions :column="1" v-if="(item.indexMonthDataDetail || []).length > 0">
-              <template v-for="(item, index) in item.indexMonthDataDetail || []">
-                <descriptions-item :key="index" :label="orderType[item.orderType]">{{ item.totalNum | moneyFormat }}元
-                </descriptions-item>
-              </template>
-            </descriptions>
-            <div slot="reference">
-              <span>
-                {{ item.title + "(元)" }}
-                <el-tooltip
-                  v-if="item.desc"
-                  :content="item.desc"
-                  :open-delay="0.3"
-                  placement="top"
-                >
-                  <i
-                    style="margin-left: 5px; cursor: pointer"
-                    class="el-icon-warning-outline"
-                  />
-                </el-tooltip>
-              </span>
-              <span style="font-size: 18px; display: block; color: rgba(0, 0, 0, 0.85);"> <count-to :endVal="item.percent" :decimals="2" /></span>
-            </div>
-          </el-popover>
-        </statistic-item>
-      </statistic>
-    </div>
-
-    <!-- 按月/按天 -->
-
-    <div class="wrap">
-      <div class="chioseBox">
-        <el-radio-group v-model="timer" >
-          <el-radio-button label="day">按天</el-radio-button>
-          <el-radio-button label="month">按月</el-radio-button>
-        </el-radio-group>
-      </div>
-      <!--   v-if="timer == 'day'"     :settings="chartSettings"   DD-->
-      <ve-line
-        :data="timer == 'day' ? chartData : chartDataForMoth"
-        height="350px"
-        :data-empty="dataEmpty"
-        :extend="chartExtend"
-        :legend="legend"
-      />
-      <!-- <ve-line
-      v-else
-        :data-zoom="dataZoom"
-        :settings="{
-          area: true,
-        }"
-        :data="chartDataForMoth"
-        height="350px"
-        :data-empty="dataEmpty"
-        :data-zoom="dataZoom"
-        :extend="chartExtend"
-        :legend="legend"
-      /> -->
-    </div>
-  </el-card>
-</template>
-<script>
-import "echarts/lib/component/dataZoom";
-import countTo from "vue-count-to";
-import veLine from "v-charts/lib/line.common";
-import histogram from "v-charts/lib/histogram.common";
-import searchHeader from "./modals/searchHeader";
-import { getIndex } from "../api";
-import { getTimes } from "@/utils";
-import { descs, chioseNum } from "../constant";
-import { orderType } from '@/constant'
-
-export default {
-  props: ["data", "search"],
-  components: {
-    "ve-line": veLine,
-    "count-to": countTo,
-    "ve-histogram": histogram,
-    searchHeader,
-  },
-  computed: {
-    legend() {
-      return {
-        left: "10px",
-      };
-    },
-    items() {
-      let obj = {};
-      let arr = [
-        "TOTAL_AMOUNT",
-        "FINANCE_AMOUNT",
-        "FINANCE_BALANCE_AMOUNT",
-        "FINANCE_PAY",
-      ];
-      arr.forEach((str) => {
-        if (this.data[str]) {
-          obj[str] = this.data[str];
-        }
-      });
-      // console.log(obj);
-      return obj;
-    },
-    items2() {
-      let obj = {};
-      let arr = [
-        "APPLY_AMOUNT",
-        "RENEW_AMOUNT",
-        "VIP_AMOUNT",
-        "PRACTICE_AMOUNT",
-        "OTHER_AMOUNT",
-      ];
-      arr.forEach((str) => {
-        if (this.data[str]) {
-          obj[str] = this.data[str];
-        }
-      });
-      return obj;
-    },
-    chartExtend() {
-      return {
-        series: {
-          smooth: false,
-        },
-
-        yAxis: {
-          //纵轴标尺固定
-          minInterval: 1,
-          type: "value",
-          scale: true,
-          min: 0,
-          axisLabel: {
-            formatter: "{value}元",
-          },
-        },
-
-        tooltip: {
-          axisPointer: {
-            type: "shadow",
-            shadowStyle: {
-              color: "rgba(150,150,150,0.2)",
-            },
-          },
-
-          formatter: (item) => {
-            return [
-              item[0].axisValueLabel,
-              ...item.map(
-                (d) => `<br/>${d.marker}${d.seriesName}: ${d.value[1]} 元`
-              ),
-            ].join("");
-          },
-        },
-      };
-    },
-    dataZoom() {
-      return [
-        {
-          type: "slider",
-          start: 50,
-          end: 100,
-          filterMode: "empty",
-        },
-      ];
-    },
-    chartData() {
-      const values = Object.values({ ...this.items, ...this.items2 });
-      const months = {};
-      for (const item of values) {
-        for (const row of item.indexMonthData || []) {
-          const key = this.$helpers.dayjs(row.month).format("YYYY-MM-DD");
-          if (!months[key]) {
-            months[key] = {
-              日期: key,
-            };
-          }
-          months[key][item.title] = row.percent;
-        }
-      }
-      // console.log(values);
-      return {
-        columns: [
-          "日期",
-          "总收入",
-          "现金收入",
-          "余额收入",
-          "财务支出",
-          "报名缴费收入",
-          "网管课收入",
-          "其他收入",
-          "乐团续费收入",
-          "VIP课收入",
-        ],
-        rows: Object.values(months),
-        loading: true,
-      };
-    },
-    chartDataForMoth() {
-      const values = Object.values({ ...this.items, ...this.items2 });
-      const months = {};
-      for (const item of values) {
-        for (const row of item.indexMonthData || []) {
-          const key = this.$helpers.dayjs(row.month).format("YYYY-MM");
-
-          if (!months[key]) {
-            months[key] = {
-              月份: key,
-            };
-            months[key][item.title] = row.percent;
-          } else {
-            if (months[key][item.title]) {
-              months[key][item.title] = (
-                parseFloat(months[key][item.title]) + parseFloat(row.percent)
-              ).toFixed(2);
-            } else {
-              months[key][item.title] = parseFloat(row.percent).toFixed(2);
-            }
-          }
-        }
-      }
-      return {
-        columns: [
-          "月份",
-          "总收入",
-          "现金收入",
-          "余额收入",
-          "财务支出",
-          "报名缴费收入",
-          "网管课收入",
-          "其他收入",
-          "乐团续费收入",
-          "VIP课收入",
-        ],
-        rows: Object.values(months),
-        loading: true,
-      };
-    },
-    dataEmpty() {
-      return !this.chartData.rows.length;
-    },
-  },
-  data() {
-    // this.chartSettings = {
-    //   stack: { 总收入: [`现金收入`, `余额收入`] },
-    // };
-    return {
-      orderType,
-      active: "SHOULD_INCOME_MONEY",
-      timer: "day",
-      mdate: [],
-      loading: false,
-      endDate: "",
-      show: true,
-    };
-  },
-  mounted() {
-    this.init();
-  },
-  methods: {
-    init() {
-      this.$refs.searchHeader.initStatue('month');
-      this.mdate = this.getInitDate();
-      this.endDate = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
-      // this.$refs.searchHeader.initStatue()
-      this.changeValue(this.mdate);
-    },
-    changeValue(date) {
-      // 请求更改数据
-      this.mdate = date;
-      this.isDayOrMoth(date);
-      this.FetchDetail();
-    },
-    async FetchDetail() {
-      this.loading = true;
-      let data = [];
-      try {
-        const { dates, ...rest } = this.search;
-        const res = await getIndex({
-          ...rest,
-          ...getTimes(this.mdate, ["startDate", "endDate"]),
-          //
-          dataTypes:
-            "FINANCE_AMOUNT,FINANCE_BALANCE_AMOUNT,FINANCE_PAY,TOTAL_AMOUNT",
-        });
-        for (const item of res.data) {
-          // 再循环一遍
-          for (const key in { ...this.items, ...this.items2 }) {
-            // console.log(key);
-            if (item.dataType == key) {
-              data[item.dataType] = {
-                ...item,
-                desc: descs[item.dataType],
-              };
-            }
-          }
-        }
-      } catch (error) {
-        console.log(error);
-      }
-      this.loading = false;
-      this.$emit("resetDate", data);
-    },
-
-    isDayOrMoth(arr) {
-      if (!arr || arr.length < 1) {
-        this.timer = "day";
-      } else {
-        const count = this.$helpers
-          .dayjs(arr[0])
-          .diff(this.$helpers.dayjs(arr[1]), "day");
-        Math.abs(count) > chioseNum
-          ? (this.timer = "month")
-          : (this.timer = "day");
-      }
-    },
-    getInitDate() {
-      const end = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
-      const start = this.$helpers
-        .dayjs(new Date())
-        .set("date", 1)
-        .format("YYYY-MM-DD");
-      return [start, end];
-    },
-  },
-};
-</script>
-<style lang="less" scoped>
-/deep/.description-title {
-  margin-bottom: 0;
-}
-#management .statistic .statistic-content > span {
-  &:first-child {
-    font-size: 14px !important;
-  }
-  font-size: 18px !important;
-}
-.chioseBox {
-  position: absolute;
-  right: 20px;
-  z-index: 1000;
-}
-.wrap {
-  position: relative;
-}
-.blod {
-  font-weight: bold;
-  color: var(--color-primary);
-  font-size: 22px !important;
-}
-// .chioseBox {
-//   position: absolute;
-//   right: 20px;
-//   z-index: 1000;
-// }
-// .wrap {
-//   position: relative;
-// }
-.statisticWrap {
-  // box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
-  border-radius: 4px;
-  border: 1px solid #ebeef5;
-  padding-top: 10px;
-  margin-bottom: 10px;
-  position: relative;
-  &:after {
-    top: -16px;
-    margin-left:calc(10% - 14px) ;
-    border-top-width: 0;
-    border-color: transparent;
-    border-bottom-color: #fff;
-    content: " ";
-    border-width: 8px;
-    position: absolute;
-    display: block;
-    width: 0;
-    height: 0;
-
-    border-style: solid;
-    z-index: 101;
-
-  }
-      &:before {
-      top: -20px;
-       margin-left:calc(10% - 16px) ;
-
-      border-top-width: 0;
-      border-color: transparent;
-      border-bottom-color: #ebeef5;
-      content: " ";
-      border-width: 10px;
-      position: absolute;
-      display: block;
-      width: 0;
-      height: 0;
-
-      border-style: solid;
-      z-index: 100;
-    }
-}
-</style>
+<template >
+  <el-card id="management">
+    <div slot="header" class="clearfix">
+      <searchHeader
+        :dates="mdate"
+        :title="'经营数据'"
+        @changeValue="changeValue"
+        :isShowQuert="true"
+        :endDate="endDate"
+        ref="searchHeader"
+      />
+    </div>
+
+    <el-tabs v-model="activeName">
+      <el-tab-pane label="总览" name="first">
+        <div v-if="activeName == 'first'">
+          <manageOrganAll :data="data" :search="search" ref="manageOrganAll" />
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="分部数据" name="second">
+        <div v-if="activeName == 'second'">
+          <manageOrgan :data="data" :search="search" ref="manageOrgan" />
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+  </el-card>
+</template>
+<script>
+import "echarts/lib/component/dataZoom";
+import countTo from "vue-count-to";
+import veLine from "v-charts/lib/line.common";
+import histogram from "v-charts/lib/histogram.common";
+import searchHeader from "./modals/searchDayHeader";
+import { getIndex } from "../api";
+import { getTimes } from "@/utils";
+import { descs, chioseNum } from "../constant";
+import { orderType } from "@/constant";
+import manageOrganAll from "./modals/manageOrganAll";
+import manageOrgan from "./modals/manageOrgan";
+export default {
+  props: ["data", "search"],
+  components: {
+    "ve-line": veLine,
+    "count-to": countTo,
+    "ve-histogram": histogram,
+    searchHeader,
+    manageOrganAll,
+    manageOrgan,
+  },
+  computed: {
+    legend() {
+      return {
+        left: "10px",
+      };
+    },
+    items() {
+      let obj = {};
+      let arr = [
+        "TOTAL_AMOUNT",
+        "FINANCE_AMOUNT",
+        "FINANCE_BALANCE_AMOUNT",
+        "FINANCE_PAY",
+        "ORGAN_APPLY_AMOUNT",
+        "ORGAN_RENEW_AMOUNT",
+        "ORGAN_VIP_AMOUNT",
+        "ORGAN_PRACTICE_AMOUNT",
+        "ORGAN_OTHER_AMOUNT",
+        "ORGAN_TOTAL_AMOUNT",
+      ];
+      arr.forEach((str) => {
+        if (this.data[str]) {
+          obj[str] = this.data[str];
+        }
+      });
+      // console.log(obj);
+      return obj;
+    },
+    items2() {
+      let obj = {};
+      let arr = [
+        "APPLY_AMOUNT",
+        "RENEW_AMOUNT",
+        "VIP_AMOUNT",
+        "PRACTICE_AMOUNT",
+        "OTHER_AMOUNT",
+      ];
+      arr.forEach((str) => {
+        if (this.data[str]) {
+          obj[str] = this.data[str];
+        }
+      });
+      return obj;
+    },
+    chartExtend() {
+      return {
+        series: {
+          smooth: false,
+        },
+
+        yAxis: {
+          //纵轴标尺固定
+          minInterval: 1,
+          type: "value",
+          scale: true,
+          min: 0,
+          axisLabel: {
+            formatter: "{value}元",
+          },
+        },
+
+        tooltip: {
+          axisPointer: {
+            type: "shadow",
+            shadowStyle: {
+              color: "rgba(150,150,150,0.2)",
+            },
+          },
+
+          formatter: (item) => {
+            return [
+              item[0].axisValueLabel,
+              ...item.map(
+                (d) => `<br/>${d.marker}${d.seriesName}: ${d.value[1]} 元`
+              ),
+            ].join("");
+          },
+        },
+      };
+    },
+    dataZoom() {
+      return [
+        {
+          type: "slider",
+          start: 50,
+          end: 100,
+          filterMode: "empty",
+        },
+      ];
+    },
+    chartData() {
+      const values = Object.values({ ...this.items, ...this.items2 });
+      const months = {};
+      for (const item of values) {
+        for (const row of item.indexMonthData || []) {
+          const key = this.$helpers.dayjs(row.month).format("YYYY-MM-DD");
+          if (!months[key]) {
+            months[key] = {
+              日期: key,
+            };
+          }
+          months[key][item.title] = row.percent;
+        }
+      }
+      // console.log(values);
+      return {
+        columns: [
+          "日期",
+          "总收入",
+          "现金收入",
+          "余额收入",
+          "财务支出",
+          "报名缴费收入",
+          "网管课收入",
+          "其他收入",
+          "乐团续费收入",
+          "VIP课收入",
+        ],
+        rows: Object.values(months),
+        loading: true,
+      };
+    },
+    chartDataForMoth() {
+      const values = Object.values({ ...this.items, ...this.items2 });
+      const months = {};
+      for (const item of values) {
+        for (const row of item.indexMonthData || []) {
+          const key = this.$helpers.dayjs(row.month).format("YYYY-MM");
+
+          if (!months[key]) {
+            months[key] = {
+              月份: key,
+            };
+            months[key][item.title] = row.percent;
+          } else {
+            if (months[key][item.title]) {
+              months[key][item.title] = (
+                parseFloat(months[key][item.title]) + parseFloat(row.percent)
+              ).toFixed(2);
+            } else {
+              months[key][item.title] = parseFloat(row.percent).toFixed(2);
+            }
+          }
+        }
+      }
+      return {
+        columns: [
+          "月份",
+          "总收入",
+          "现金收入",
+          "余额收入",
+          "财务支出",
+          "报名缴费收入",
+          "网管课收入",
+          "其他收入",
+          "乐团续费收入",
+          "VIP课收入",
+        ],
+        rows: Object.values(months),
+        loading: true,
+      };
+    },
+    dataEmpty() {
+      return !this.chartData.rows.length;
+    },
+  },
+  data() {
+    // this.chartSettings = {
+    //   stack: { 总收入: [`现金收入`, `余额收入`] },
+    // };
+    return {
+      orderType,
+      active: "SHOULD_INCOME_MONEY",
+      timer: "day",
+      mdate: [],
+      loading: false,
+      endDate: "",
+      show: true,
+      activeName: "first",
+    };
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    init() {
+      this.$refs.searchHeader.initStatue("month");
+      this.mdate = this.getInitDate();
+      this.endDate = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
+      // this.$refs.searchHeader.initStatue()
+      this.changeValue(this.mdate);
+    },
+    changeValue(date) {
+      // 请求更改数据
+      this.mdate = date;
+      // this.isDayOrMoth(date);
+      if (this.$refs.manageOrganAll && this.$refs.manageOrganAll.isDayOrMoth) {
+        this.$refs.manageOrganAll.isDayOrMoth(date);
+      }
+      this.FetchDetail();
+    },
+    async FetchDetail() {
+      this.loading = true;
+      let data = [];
+      try {
+        const { dates, ...rest } = this.search;
+        const res = await getIndex({
+          ...rest,
+          ...getTimes(this.mdate, ["startDate", "endDate"]),
+          //
+          dataTypes:
+            "FINANCE_AMOUNT,FINANCE_BALANCE_AMOUNT,FINANCE_PAY,TOTAL_AMOUNT,ORGAN_FINANCE_AMOUNT",
+        });
+
+        for (const item of res.data) {
+          // 再循环一遍
+          for (const key in { ...this.items, ...this.items2 }) {
+            // console.log(key);
+            if (item.dataType == key) {
+              data[item.dataType] = {
+                ...item,
+                desc: descs[item.dataType],
+              };
+            }
+          }
+        }
+      } catch (error) {
+        console.log(error);
+      }
+      // console.log(data,'第二次请求',res.data)
+      this.loading = false;
+      this.$emit("resetDate", data);
+    },
+
+    isDayOrMoth(arr) {
+      if (!arr || arr.length < 1) {
+        this.timer = "day";
+      } else {
+        const count = this.$helpers
+          .dayjs(arr[0])
+          .diff(this.$helpers.dayjs(arr[1]), "day");
+        Math.abs(count) > chioseNum
+          ? (this.timer = "month")
+          : (this.timer = "day");
+      }
+    },
+    getInitDate() {
+      const end = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
+      const start = this.$helpers
+        .dayjs(new Date())
+        .set("date", 1)
+        .format("YYYY-MM-DD");
+      return [start, end];
+    },
+    changeTimer(val) {
+      this.timer = val;
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+/deep/.description-title {
+  margin-bottom: 0;
+}
+#management .statistic .statistic-content > span {
+  &:first-child {
+    font-size: 14px !important;
+  }
+  font-size: 18px !important;
+}
+.chioseBox {
+  position: absolute;
+  right: 20px;
+  z-index: 1000;
+}
+.wrap {
+  position: relative;
+}
+.blod {
+  font-weight: bold;
+  color: var(--color-primary);
+  font-size: 22px !important;
+}
+// .chioseBox {
+//   position: absolute;
+//   right: 20px;
+//   z-index: 1000;
+// }
+// .wrap {
+//   position: relative;
+// }
+.statisticWrap {
+  // box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
+  border-radius: 4px;
+  border: 1px solid #ebeef5;
+  padding-top: 10px;
+  margin-bottom: 10px;
+  position: relative;
+  &:after {
+    top: -16px;
+    margin-left: calc(10% - 14px);
+    border-top-width: 0;
+    border-color: transparent;
+    border-bottom-color: #fff;
+    content: " ";
+    border-width: 8px;
+    position: absolute;
+    display: block;
+    width: 0;
+    height: 0;
+
+    border-style: solid;
+    z-index: 101;
+  }
+  &:before {
+    top: -20px;
+    margin-left: calc(10% - 16px);
+
+    border-top-width: 0;
+    border-color: transparent;
+    border-bottom-color: #ebeef5;
+    content: " ";
+    border-width: 10px;
+    position: absolute;
+    display: block;
+    width: 0;
+    height: 0;
+
+    border-style: solid;
+    z-index: 100;
+  }
+}
+</style>

+ 460 - 0
src/views/main/baseinfo/modals/manageOrgan.vue

@@ -0,0 +1,460 @@
+<template>
+  <div>
+    <div
+      class="wall"
+      style="height: 68px"
+      v-if="JSON.stringify(items) == '{}'"
+    ></div>
+    <!-- 按月/按天 -->
+    <div class="wrap">
+      <!--   v-if="timer == 'day'"     :settings="chartSettings"   DD-->
+      <ve-histogram
+        :data="chartData"
+        height="524px"
+        :data-empty="dataEmpty"
+        :extend="chartExtend"
+            :legend="legend"
+        :data-zoom="dataZoom"
+      />
+      <!-- <ve-line
+
+      v-else
+        :data-zoom="dataZoom"
+        :settings="{
+          area: true,
+        }"
+        :data="chartDataForMoth"
+        height="350px"
+        :data-empty="dataEmpty"
+        :data-zoom="dataZoom"
+        :extend="chartExtend"
+        :legend="legend"
+      /> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import "echarts/lib/component/dataZoom";
+import countTo from "vue-count-to";
+// import veLine from "v-charts/lib/line.common";
+import histogram from "v-charts/lib/histogram.common";
+import searchHeader from "./searchHeader";
+import { getIndex } from "../../api";
+import { getTimes } from "@/utils";
+import { descs, chioseNum } from "../../constant";
+import { orderType } from "@/constant";
+import lodash from "lodash";
+export default {
+  props: ["data", "search"],
+  components: {
+    // "ve-line": veLine,
+    "count-to": countTo,
+    "ve-histogram": histogram,
+    searchHeader,
+  },
+  computed: {
+    legend() {
+      return {
+        show:false,
+      };
+    },
+    items() {
+      let obj = {};
+      let arr = [
+        "ORGAN_TOTAL_AMOUNT",
+        // "FINANCE_AMOUNT",
+        // "FINANCE_BALANCE_AMOUNT",
+        // "FINANCE_PAY",
+      ];
+      arr.forEach((str) => {
+        if (this.data[str]) {
+          obj[str] = this.data[str];
+        }
+      });
+      // console.log(obj);
+      return obj;
+    },
+    items2() {
+      let obj = {};
+      let arr = [
+        "ORGAN_TOTAL_AMOUNT",
+        "ORGAN_APPLY_AMOUNT",
+        "ORGAN_RENEW_AMOUNT",
+        "ORGAN_VIP_AMOUNT",
+        "ORGAN_PRACTICE_AMOUNT",
+        "ORGAN_OTHER_AMOUNT",
+      ];
+
+
+      arr.forEach((str) => {
+        if (this.data[str]) {
+
+          obj[str] = this.data[str]
+        }
+      });
+      return obj;
+    },
+    chartExtend() {
+      return {
+        series: {
+          smooth: false,
+          barWidth: 60,
+          label: {
+            show: true,
+            position: "top",
+            color: "#000",
+            formatter: function (value) {
+              var val = value.data;
+              return val + "%";
+            },
+          },
+        },
+        markerPoint: {
+          data: { name: "百分比" },
+        },
+
+        yAxis: {
+          //纵轴标尺固定
+          minInterval: 1,
+          type: "value",
+          scale: true,
+          min: 0,
+
+          axisLabel: {
+            formatter: "{value}%",
+          },
+          splitLine: {
+            //分割线配置
+            show: true,
+            lineStyle: {
+              color: "#EBEEF5",
+            },
+          },
+        },
+
+        xAxis: {
+          interval: 0,
+          axisLabel: {
+            show: true, // 是否显示刻度标签,默认显示
+            interval: 0, // 坐标轴刻度标签的显示间隔,在类目轴中有效;默认会采用标签不重叠的策略间隔显示标签;可以设置成0强制显示所有标签;如果设置为1,表示『隔一个标签显示一个标签』,如果值为2,表示隔两个标签显示一个标签,以此类推。
+            inside: false, // 刻度标签是否朝内,默认朝外
+            margin: 6, // 刻度标签与轴线之间的距离
+            rotate: 45,
+            // formatter: function (value) {
+            //   return value.split("").join("\n");
+            // },
+          },
+        },
+
+        tooltip: {
+          axisPointer: {
+            type: "shadow",
+            shadowStyle: {
+              color: "rgba(150,150,150,0.2)",
+            },
+          },
+
+          formatter: (item) => {
+            // console.log(item);
+            // console.log(this.values, item[0].axisValue, "organ");
+            let arr = [
+              { name: "总收入", dot: "元" },
+              { name: "总收入占比", dot: "%" },
+              { name: "报名缴费收入", dot: "元" },
+              { name: "乐团续费收入", dot: "元" },
+              { name: "VIP课收入", dot: "元" },
+              { name: "网管课收入", dot: "元" },
+              { name: "其他收入", dot: "元" },
+            ];
+            return [
+              item[0].axisValueLabel,
+              ...arr.map(
+                (d) =>
+                  `<br/>${d.name}:${this.values[item[0].axisValue][d.name]}${
+                    d.dot
+                  }`
+              ),
+            ].join("");
+          },
+        },
+      };
+    },
+    dataZoom() {
+      return [
+        {
+          show: true,
+          type: "slider",
+          start: 0,
+          end: 20,
+          filterMode: "empty",
+          zoomLock: true,
+          handleSize: 0,
+        },
+      ];
+    },
+    chartData() {
+      //
+      const values = Object.values({ ...this.items2 });
+      const organ = {};
+      // 计算总的百分比
+      for (const row of values[0].indexMonthData || []) {
+        const key = row.organName;
+        organ[key] = {
+          分部: row.organName,
+        };
+        for (const item of values) {
+          if (item.title == row.title) {
+            organ[key][item.title] = row.percent;
+          }
+
+          if (item.title == "总收入" && row.title == "总收入") {
+            organ[key]["总收入占比"] = (
+              (isNaN(row.percent / item.percent)?0:row.percent / item.percent) *
+              100
+            ).toFixed(2);
+          }
+        }
+      }
+
+      for (const item of values) {
+        for (const row of item.indexMonthData || []) {
+          if ((item.title == row.title)) {
+            organ[row.organName][row.title] = row.percent;
+          }
+        }
+      }
+
+      // const months = {};
+      // for (const item of values) {
+      //   for (const row of item.indexMonthData || []) {
+      //     const key = this.$helpers.dayjs(row.month).format("YYYY-MM-DD");
+      //     if (!months[key]) {
+      //       months[key] = {
+      //         日期: key,
+      //       };
+      //     }
+      //     months[key][item.title] = row.percent;
+      //   }
+      // }
+      // console.log(organ);
+
+      this.values = organ;
+      let row = Object.values(organ);
+      row = lodash.sortBy(row, function (o) {
+        return -o["总收入占比"];
+      });
+      // console.log(row, "row");
+      // console.log(values);
+      // return;
+      return {
+        columns: ["分部", "总收入占比"],
+        rows: row,
+        loading: true,
+      };
+    },
+    chartDataForMoth() {
+      const values = Object.values({ ...this.items, ...this.items2 });
+      const months = {};
+      for (const item of values) {
+        for (const row of item.indexMonthData || []) {
+          const key = this.$helpers.dayjs(row.month).format("YYYY-MM");
+
+          if (!months[key]) {
+            months[key] = {
+              月份: key,
+            };
+            months[key][item.title] = row.percent;
+          } else {
+            if (months[key][item.title]) {
+              months[key][item.title] = (
+                parseFloat(months[key][item.title]) + parseFloat(row.percent)
+              ).toFixed(2);
+            } else {
+              months[key][item.title] = parseFloat(row.percent).toFixed(2);
+            }
+          }
+        }
+      }
+      return {
+        columns: [
+          "月份",
+          "总收入",
+          "现金收入",
+          "余额收入",
+          "财务支出",
+          "报名缴费收入",
+          "网管课收入",
+          "其他收入",
+          "乐团续费收入",
+          "VIP课收入",
+        ],
+        rows: Object.values(months),
+        loading: true,
+      };
+    },
+    dataEmpty() {
+      return !this.chartData.rows.length;
+    },
+  },
+  data() {
+    // this.chartSettings = {
+    //   stack: { 总收入: [`现金收入`, `余额收入`] },
+    // };
+    return {
+      orderType,
+      active: "SHOULD_INCOME_MONEY",
+      mdate: [],
+      loading: false,
+      endDate: "",
+      show: true,
+      activeName: "first",
+      timer: "day",
+      values: "",
+    };
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    init() {
+      // this.$refs.searchHeader.initStatue("month");
+      this.mdate = this.getInitDate();
+      this.endDate = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
+      this.isDayOrMoth(this.mdate);
+      // // this.$refs.searchHeader.initStatue()
+      // this.changeValue(this.mdate);
+    },
+    // changeValue(date) {
+    //   // 请求更改数据
+    //   this.mdate = date;
+    //   this.isDayOrMoth(date);
+    //   this.FetchDetail();
+    // },
+    // async FetchDetail() {
+    //   this.loading = true;
+    //   let data = [];
+    //   try {
+    //     const { dates, ...rest } = this.search;
+    //     const res = await getIndex({
+    //       ...rest,
+    //       ...getTimes(this.mdate, ["startDate", "endDate"]),
+    //       //
+    //       dataTypes:
+    //         "FINANCE_AMOUNT,FINANCE_BALANCE_AMOUNT,FINANCE_PAY,TOTAL_AMOUNT",
+    //     });
+    //     for (const item of res.data) {
+    //       // 再循环一遍
+    //       for (const key in { ...this.items, ...this.items2 }) {
+    //         // console.log(key);
+    //         if (item.dataType == key) {
+    //           data[item.dataType] = {
+    //             ...item,
+    //             desc: descs[item.dataType],
+    //           };
+    //         }
+    //       }
+    //     }
+    //   } catch (error) {
+    //     console.log(error);
+    //   }
+    //   this.loading = false;
+    //   this.$emit("resetDate", data);
+    // },
+
+    isDayOrMoth(arr) {
+      if (!arr || arr.length < 1) {
+        this.timer = "day";
+      } else {
+        const count = this.$helpers
+          .dayjs(arr[0])
+          .diff(this.$helpers.dayjs(arr[1]), "day");
+        Math.abs(count) > chioseNum
+          ? (this.timer = "month")
+          : (this.timer = "day");
+      }
+    },
+    getInitDate() {
+      const end = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
+      const start = this.$helpers
+        .dayjs(new Date())
+        .set("date", 1)
+        .format("YYYY-MM-DD");
+      return [start, end];
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+/deep/.description-title {
+  margin-bottom: 0;
+}
+#management .statistic .statistic-content > span {
+  &:first-child {
+    font-size: 14px !important;
+  }
+  font-size: 18px !important;
+}
+.chioseBox {
+  position: absolute;
+  right: 20px;
+  z-index: 1000;
+}
+.wrap {
+  position: relative;
+}
+.blod {
+  font-weight: bold;
+  color: var(--color-primary);
+  font-size: 22px !important;
+}
+// .chioseBox {
+//   position: absolute;
+//   right: 20px;
+//   z-index: 1000;
+// }
+// .wrap {
+//   position: relative;
+// }
+.statisticWrap {
+  // box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
+  border-radius: 4px;
+  border: 1px solid #ebeef5;
+  padding-top: 10px;
+  margin-bottom: 10px;
+  position: relative;
+  &:after {
+    top: -16px;
+    margin-left: calc(10% - 14px);
+    border-top-width: 0;
+    border-color: transparent;
+    border-bottom-color: #fff;
+    content: " ";
+    border-width: 8px;
+    position: absolute;
+    display: block;
+    width: 0;
+    height: 0;
+
+    border-style: solid;
+    z-index: 101;
+  }
+  &:before {
+    top: -20px;
+    margin-left: calc(10% - 16px);
+
+    border-top-width: 0;
+    border-color: transparent;
+    border-bottom-color: #ebeef5;
+    content: " ";
+    border-width: 10px;
+    position: absolute;
+    display: block;
+    width: 0;
+    height: 0;
+
+    border-style: solid;
+    z-index: 100;
+  }
+}
+</style>

+ 518 - 0
src/views/main/baseinfo/modals/manageOrganAll.vue

@@ -0,0 +1,518 @@
+<template>
+  <div>
+    <div
+      class="wall"
+      style="height: 68px"
+      v-if="JSON.stringify(items) == '{}'"
+    ></div>
+    <statistic :col="5" class="statistic" :cols="12">
+      <statistic-item @click="active = 0">
+        <span>
+          {{ items["TOTAL_AMOUNT"].title + "(元)" }}
+          <el-tooltip
+            v-if="items['TOTAL_AMOUNT'].desc"
+            :content="items['TOTAL_AMOUNT'].desc"
+            :open-delay="0.3"
+            placement="top"
+          >
+            <i
+              style="margin-left: 5px; cursor: pointer"
+              class="el-icon-warning-outline"
+            />
+          </el-tooltip>
+        </span>
+        <!--  12345678901.23 -->
+        <span>
+          <count-to
+            :endVal="items['TOTAL_AMOUNT'].percent"
+            :decimals="2"
+            :class="'blod'"
+        /></span>
+      </statistic-item>
+      <template v-for="(item, key) in items">
+        <statistic-item
+          v-if="item.dataType != 'TOTAL_AMOUNT'"
+          :key="key"
+          :class="{ active: active === key }"
+          @click="active = key"
+        >
+          <span>
+            {{ item.title + "(元)" }}
+            <el-tooltip
+              v-if="item.desc"
+              :content="item.desc"
+              :open-delay="0.3"
+              placement="top"
+            >
+              <i
+                style="margin-left: 5px; cursor: pointer"
+                class="el-icon-warning-outline"
+              />
+            </el-tooltip>
+          </span>
+          <!--  12345678901.23 -->
+          <span>
+            <count-to
+              :endVal="item.percent"
+              :decimals="2"
+              :class="item.dataType == 'TOTAL_AMOUNT' ? 'blod' : ''"
+          /></span>
+        </statistic-item>
+      </template>
+
+      <statistic-item></statistic-item>
+    </statistic>
+
+    <div class="statisticWrap">
+      <statistic :col="5" class="statistic" :cols="0" :isNoLine="true">
+        <statistic-item
+          v-for="(item, key) in items2"
+          :key="key"
+          :class="{ active: active === key }"
+          @click="active = key"
+        >
+          <template v-if="item.dataType != 'OTHER_AMOUNT'">
+            <span>
+              {{ item.title + "(元)" }}
+              <!-- {{ item.dataType == 'OTHER_AMOUNT' ? 'other' : null }} -->
+              <el-tooltip
+                v-if="item.desc"
+                :content="item.desc"
+                :open-delay="0.3"
+                placement="top"
+              >
+                <i
+                  style="margin-left: 5px; cursor: pointer"
+                  class="el-icon-warning-outline"
+                />
+              </el-tooltip>
+            </span>
+            <!--  12345678901.23 -->
+            <span> <count-to :endVal="item.percent" :decimals="2" /></span>
+          </template>
+          <el-popover placement="top" width="400" v-else trigger="hover">
+            <descriptions
+              :column="1"
+              v-if="(item.indexMonthDataDetail || []).length > 0"
+            >
+              <template
+                v-for="(item, index) in item.indexMonthDataDetail || []"
+              >
+                <descriptions-item
+                  :key="index"
+                  :label="orderType[item.orderType]"
+                  >{{ item.totalNum | moneyFormat }}元
+                </descriptions-item>
+              </template>
+            </descriptions>
+            <div slot="reference">
+              <span>
+                {{ item.title + "(元)" }}
+                <el-tooltip
+                  v-if="item.desc"
+                  :content="item.desc"
+                  :open-delay="0.3"
+                  placement="top"
+                >
+                  <i
+                    style="margin-left: 5px; cursor: pointer"
+                    class="el-icon-warning-outline"
+                  />
+                </el-tooltip>
+              </span>
+              <span
+                style="
+                  font-size: 18px;
+                  display: block;
+                  color: rgba(0, 0, 0, 0.85);
+                "
+              >
+                <count-to :endVal="item.percent" :decimals="2"
+              /></span>
+            </div>
+          </el-popover>
+        </statistic-item>
+      </statistic>
+    </div>
+
+    <!-- 按月/按天 -->
+
+    <div class="wrap">
+      <div class="chioseBox">
+        <el-radio-group v-model="timer">
+          <el-radio-button label="day">按天</el-radio-button>
+          <el-radio-button label="month">按月</el-radio-button>
+        </el-radio-group>
+      </div>
+      <!--   v-if="timer == 'day'"     :settings="chartSettings"   DD-->
+      <ve-line
+        :data="timer == 'day' ? chartData : chartDataForMoth"
+        height="350px"
+        :data-empty="dataEmpty"
+        :extend="chartExtend"
+        :legend="legend"
+      />
+      <!-- <ve-line
+      v-else
+        :data-zoom="dataZoom"
+        :settings="{
+          area: true,
+        }"
+        :data="chartDataForMoth"
+        height="350px"
+        :data-empty="dataEmpty"
+        :data-zoom="dataZoom"
+        :extend="chartExtend"
+        :legend="legend"
+      /> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import "echarts/lib/component/dataZoom";
+import countTo from "vue-count-to";
+import veLine from "v-charts/lib/line.common";
+import histogram from "v-charts/lib/histogram.common";
+import searchHeader from "./searchHeader";
+import { getIndex } from "../../api";
+import { getTimes } from "@/utils";
+import { descs, chioseNum } from "../../constant";
+import { orderType } from "@/constant";
+
+export default {
+  props: ["data", "search"],
+  components: {
+    "ve-line": veLine,
+    "count-to": countTo,
+    "ve-histogram": histogram,
+    searchHeader,
+  },
+  computed: {
+    legend() {
+      return {
+        left: "10px",
+      };
+    },
+    items() {
+      let obj = {};
+      let arr = [
+        "TOTAL_AMOUNT",
+        "FINANCE_AMOUNT",
+        "FINANCE_BALANCE_AMOUNT",
+        "FINANCE_PAY",
+      ];
+      arr.forEach((str) => {
+        if (this.data[str]) {
+          obj[str] = this.data[str];
+        }
+      });
+      // console.log(obj);
+      return obj;
+    },
+    items2() {
+      let obj = {};
+      let arr = [
+        "APPLY_AMOUNT",
+        "RENEW_AMOUNT",
+        "VIP_AMOUNT",
+        "PRACTICE_AMOUNT",
+        "OTHER_AMOUNT",
+      ];
+      arr.forEach((str) => {
+        if (this.data[str]) {
+          obj[str] = this.data[str];
+        }
+      });
+      return obj;
+    },
+    chartExtend() {
+      return {
+        series: {
+          smooth: false,
+        },
+
+        yAxis: {
+          //纵轴标尺固定
+          minInterval: 1,
+          type: "value",
+          scale: true,
+          min: 0,
+          axisLabel: {
+            formatter: "{value}元",
+          },
+        },
+
+        tooltip: {
+          axisPointer: {
+            type: "shadow",
+            shadowStyle: {
+              color: "rgba(150,150,150,0.2)",
+            },
+          },
+
+          formatter: (item) => {
+            return [
+              item[0].axisValueLabel,
+              ...item.map(
+                (d) => `<br/>${d.marker}${d.seriesName}: ${d.value[1]} 元`
+              ),
+            ].join("");
+          },
+        },
+      };
+    },
+    dataZoom() {
+      return [
+        {
+          type: "slider",
+          start: 50,
+          end: 100,
+          filterMode: "empty",
+        },
+      ];
+    },
+    chartData() {
+      const values = Object.values({ ...this.items, ...this.items2 });
+      const months = {};
+      for (const item of values) {
+        for (const row of item.indexMonthData || []) {
+          const key = this.$helpers.dayjs(row.month).format("YYYY-MM-DD");
+          if (!months[key]) {
+            months[key] = {
+              日期: key,
+            };
+            months[key][item.title] = row.percent;
+          } else {
+            if (months[key][item.title]) {
+              months[key][item.title] = (
+                parseFloat(months[key][item.title]) + parseFloat(row.percent)
+              ).toFixed(2);
+            } else {
+              months[key][item.title] = parseFloat(row.percent).toFixed(2);
+            }
+          }
+        }
+      }
+      // console.log(values);
+      return {
+        columns: [
+          "日期",
+          "总收入",
+          "现金收入",
+          "余额收入",
+          "财务支出",
+          "报名缴费收入",
+          "网管课收入",
+          "其他收入",
+          "乐团续费收入",
+          "VIP课收入",
+        ],
+        rows: Object.values(months),
+        loading: true,
+      };
+    },
+    chartDataForMoth() {
+      const values = Object.values({ ...this.items, ...this.items2 });
+      const months = {};
+      for (const item of values) {
+        for (const row of item.indexMonthData || []) {
+          const key = this.$helpers.dayjs(row.month).format("YYYY-MM");
+
+          if (!months[key]) {
+            months[key] = {
+              月份: key,
+            };
+            months[key][item.title] = row.percent;
+          } else {
+            if (months[key][item.title]) {
+              months[key][item.title] = (
+                parseFloat(months[key][item.title]) + parseFloat(row.percent)
+              ).toFixed(2);
+            } else {
+              months[key][item.title] = parseFloat(row.percent).toFixed(2);
+            }
+          }
+        }
+      }
+      return {
+        columns: [
+          "月份",
+          "总收入",
+          "现金收入",
+          "余额收入",
+          "财务支出",
+          "报名缴费收入",
+          "网管课收入",
+          "其他收入",
+          "乐团续费收入",
+          "VIP课收入",
+        ],
+        rows: Object.values(months),
+        loading: true,
+      };
+    },
+    dataEmpty() {
+      return !this.chartData.rows.length;
+    },
+  },
+  data() {
+    // this.chartSettings = {
+    //   stack: { 总收入: [`现金收入`, `余额收入`] },
+    // };
+    return {
+      orderType,
+      active: "SHOULD_INCOME_MONEY",
+      mdate: [],
+      loading: false,
+      endDate: "",
+      show: true,
+      activeName: "first",
+      timer: "day",
+    };
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    init() {
+      // this.$refs.searchHeader.initStatue("month");
+      this.mdate = this.getInitDate();
+      this.endDate = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
+      this.isDayOrMoth(this.mdate);
+      // // this.$refs.searchHeader.initStatue()
+      // this.changeValue(this.mdate);
+    },
+    // changeValue(date) {
+    //   // 请求更改数据
+    //   this.mdate = date;
+    //   this.isDayOrMoth(date);
+    //   this.FetchDetail();
+    // },
+    // async FetchDetail() {
+    //   this.loading = true;
+    //   let data = [];
+    //   try {
+    //     const { dates, ...rest } = this.search;
+    //     const res = await getIndex({
+    //       ...rest,
+    //       ...getTimes(this.mdate, ["startDate", "endDate"]),
+    //       //
+    //       dataTypes:
+    //         "FINANCE_AMOUNT,FINANCE_BALANCE_AMOUNT,FINANCE_PAY,TOTAL_AMOUNT",
+    //     });
+    //     for (const item of res.data) {
+    //       // 再循环一遍
+    //       for (const key in { ...this.items, ...this.items2 }) {
+    //         // console.log(key);
+    //         if (item.dataType == key) {
+    //           data[item.dataType] = {
+    //             ...item,
+    //             desc: descs[item.dataType],
+    //           };
+    //         }
+    //       }
+    //     }
+    //   } catch (error) {
+    //     console.log(error);
+    //   }
+    //   this.loading = false;
+    //   this.$emit("resetDate", data);
+    // },
+
+    isDayOrMoth(arr) {
+      if (!arr || arr.length < 1) {
+        this.timer = "day";
+      } else {
+        const count = this.$helpers
+          .dayjs(arr[0])
+          .diff(this.$helpers.dayjs(arr[1]), "day");
+        Math.abs(count) > chioseNum
+          ? (this.timer = "month")
+          : (this.timer = "day");
+      }
+    },
+    getInitDate() {
+      const end = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
+      const start = this.$helpers
+        .dayjs(new Date())
+        .set("date", 1)
+        .format("YYYY-MM-DD");
+      return [start, end];
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+/deep/.description-title {
+  margin-bottom: 0;
+}
+#management .statistic .statistic-content > span {
+  &:first-child {
+    font-size: 14px !important;
+  }
+  font-size: 18px !important;
+}
+.chioseBox {
+  position: absolute;
+  right: 20px;
+  z-index: 1000;
+}
+.wrap {
+  position: relative;
+}
+.blod {
+  font-weight: bold;
+  color: var(--color-primary);
+  font-size: 22px !important;
+}
+// .chioseBox {
+//   position: absolute;
+//   right: 20px;
+//   z-index: 1000;
+// }
+// .wrap {
+//   position: relative;
+// }
+.statisticWrap {
+  // box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
+  border-radius: 4px;
+  border: 1px solid #ebeef5;
+  padding-top: 10px;
+  margin-bottom: 10px;
+  position: relative;
+  &:after {
+    top: -16px;
+    margin-left: calc(10% - 14px);
+    border-top-width: 0;
+    border-color: transparent;
+    border-bottom-color: #fff;
+    content: " ";
+    border-width: 8px;
+    position: absolute;
+    display: block;
+    width: 0;
+    height: 0;
+
+    border-style: solid;
+    z-index: 101;
+  }
+  &:before {
+    top: -20px;
+    margin-left: calc(10% - 16px);
+
+    border-top-width: 0;
+    border-color: transparent;
+    border-bottom-color: #ebeef5;
+    content: " ";
+    border-width: 10px;
+    position: absolute;
+    display: block;
+    width: 0;
+    height: 0;
+
+    border-style: solid;
+    z-index: 100;
+  }
+}
+</style>

+ 169 - 0
src/views/main/baseinfo/modals/searchDayHeader.vue

@@ -0,0 +1,169 @@
+<template>
+  <div class="titleWrap">
+    <div class="box">
+      <span class="shape"></span>
+      <span>{{ title }}</span>
+    </div>
+    <div class="right">
+      <el-radio-group v-model="timer" @change="changeQuick" v-if="isShowQuert">
+        <el-radio-button label="day">今日</el-radio-button>
+        <el-radio-button label="month">本月</el-radio-button>
+        <el-radio-button label="year">本年度</el-radio-button>
+        <el-radio-button label="lastYear">去年</el-radio-button>
+      </el-radio-group>
+      <el-date-picker
+        v-if="isShowQuert"
+        v-model="date"
+        type="daterange"
+        style="width: 300px; padding: 0 10px"
+        range-separator="-"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期"
+        value-format="yyyy-MM-dd"
+        format="yyyy-MM-dd"
+        @change="changeValue"
+        :picker-options="bigin()"
+      >
+      </el-date-picker>
+      <el-date-picker
+        v-else
+        v-model="date"
+        type="daterange"
+        style="width: 300px; padding: 0 10px"
+        range-separator="-"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期"
+        value-format="yyyy-MM-dd"
+        format="yyyy-MM-dd"
+        @change="changeWeek"
+        :picker-options="bigin()"
+      >
+      </el-date-picker>
+    </div>
+  </div>
+</template>
+<script>
+import { getNowDateAndSunday, getNowDateAndMonday } from "@/utils/date";
+export default {
+  props: ["title", "dates", "isShowQuert", "endDate"],
+
+  data() {
+    return {
+      timer: "",
+      date: this.dates,
+    };
+  },
+  mounted() {},
+
+  watch: {
+    dates(val) {
+      this.date = val;
+    },
+  },
+
+  methods: {
+    changeWeek(val) {
+      this.date = [getNowDateAndMonday(val[0]), getNowDateAndSunday(val[1])];
+      this.submitDate(this.date);
+    },
+    changeValue(val) {
+      this.timer = "";
+      this.date = val;
+      this.submitDate(this.date);
+    },
+    changeQuick(val) {
+      let startDate;
+      let endDate;
+      if (val == "month") {
+        // 获取本月的第一天 获取本月的今天
+        startDate = this.$helpers
+          .dayjs(new Date())
+          .set("date", 1)
+          .format("YYYY-MM-DD");
+        this.endDate
+          ? (endDate = this.endDate)
+          : (endDate = this.$helpers
+              .dayjs(new Date())
+              .subtract(1, "day")
+              .format("YYYY-MM-DD"));
+        this.date = [startDate, endDate];
+        this.submitDate(this.date);
+      } else if (val == "day") {
+        startDate = this.$helpers
+          .dayjs(new Date())
+
+          .format("YYYY-MM-DD");
+        this.endDate
+          ? (endDate = this.endDate)
+          : (endDate = this.$helpers
+              .dayjs(new Date())
+
+              .format("YYYY-MM-DD"));
+        this.date = [startDate, endDate];
+         this.submitDate(this.date);
+      } else if (val == "year") {
+        startDate = this.$helpers
+          .dayjs(new Date())
+          .set("month", 0)
+          .set("date", 1)
+          .format("YYYY-MM-DD");
+        this.endDate
+          ? (endDate = this.endDate)
+          : (endDate = this.$helpers
+              .dayjs(new Date())
+              .subtract(1, "day")
+              .format("YYYY-MM-DD"));
+        this.date = [startDate, endDate];
+        this.submitDate(this.date);
+      } else if (val == "lastYear") {
+        startDate = this.$helpers
+          .dayjs(new Date())
+          .subtract(1, "year")
+          .set("month", 0)
+          .set("date", 1)
+          .format("YYYY-MM-DD");
+        endDate = this.$helpers
+          .dayjs()
+          .subtract(1, "year")
+          .endOf("year")
+          .format("YYYY-MM-DD");
+        this.date = [startDate, endDate];
+        this.submitDate(this.date);
+      }
+    },
+    submitDate(date) {
+      this.$emit("changeValue", date);
+    },
+    bigin() {
+      let self = this;
+      return {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          if (self.endDate) {
+            let endTime = self.$helpers.dayjs(self.endDate).valueOf();
+            return time.getTime() > endTime;
+          } else {
+            return time.getTime() >= Date.now() - 24 * 60 * 60 * 1000;
+          }
+        },
+      };
+    },
+    initStatue(val) {
+      if (val) {
+        this.timer = val;
+      } else {
+        this.timer = "";
+      }
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.titleWrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+  height: 55px;
+}
+</style>

+ 97 - 57
src/views/productService/model/rechargeModel.vue

@@ -1,7 +1,12 @@
 <template>
   <div class="chioseWrap">
     <el-form :inline="true" ref="payForm" :model="payForm">
-      <el-form-item prop="payType" :rules="[{required: true, message: '请选择支付方式', trigger: 'change'}]">
+      <el-form-item
+        prop="payType"
+        :rules="[
+          { required: true, message: '请选择支付方式', trigger: 'change' }
+        ]"
+      >
         <el-select
           v-model.trim="payForm.payType"
           style="width: 180px"
@@ -21,26 +26,22 @@
     >
       <el-table-column align="center" prop="name" label="产品名称">
       </el-table-column>
-      <el-table-column
-        align="center"
-        label="充值金额(元)"
-      >
+      <el-table-column align="center" label="充值金额(元)">
         <template slot-scope="scope">
           {{ scope.row.rechargeAmount | hasMoneyFormat }}
         </template>
       </el-table-column>
-      <el-table-column
-        align="center"
-        label="支付价格(元)"
-      >
+      <el-table-column align="center" label="支付价格(元)">
         <template slot-scope="scope">
-          <span style="color: red;">{{ scope.row.amount | hasMoneyFormat }}</span>
+          <span style="color: red;">{{
+            scope.row.amount | hasMoneyFormat
+          }}</span>
         </template>
       </el-table-column>
     </el-table>
 
     <span slot="footer" class="dialog-footer">
-      <el-button @click="$listeners.close();">取 消</el-button>
+      <el-button @click="$listeners.close()">取 消</el-button>
       <el-button @click="onMemberPay" type="primary">确 定</el-button>
     </span>
 
@@ -52,21 +53,27 @@
       width="500px"
       append-to-body
     >
-      <payment :tableList="tableList" :orderNo="orderNo" v-on="$listeners" :codeUrl="codeUrl" @close="onPaymentClose" />
+      <payment
+        :tableList="tableList"
+        :orderNo="orderNo"
+        v-on="$listeners"
+        :codeUrl="codeUrl"
+        @close="onPaymentClose"
+      />
     </el-dialog>
   </div>
 </template>
 <script>
-import { recharge } from '../api'
-import { vaildStudentUrl } from '@/utils/validate'
-import payment from '@/views/productService/model/payment'
+import { recharge } from "../api";
+import { vaildStudentUrl } from "@/utils/validate";
+import payment from "@/views/productService/model/payment";
 export default {
   props: ["amount"],
   components: { payment },
   data() {
     return {
       payForm: {
-        payType: null,
+        payType: null
       },
       pay_channel: null, //支付渠道
       selectStudentMoney: 0, // 选中学生金额
@@ -77,64 +84,97 @@ export default {
     };
   },
   async mounted() {
-    if(this.amount) {
-      this.tableList = [{
-        name: '云教室充值',
-        rechargeAmount: this.amount,
-        amount: this.amount
-      }]
+    if (this.amount) {
+      this.tableList = [
+        {
+          name: "云教室充值",
+          rechargeAmount: this.amount,
+          amount: this.amount
+        }
+      ];
     }
   },
   methods: {
     onMemberPay() {
-      this.$refs.payForm.validate(async (_) => {
-        if(_) {
+      this.$refs.payForm.validate(async _ => {
+        if (_) {
           try {
-            const res = await recharge({ amount: this.amount })
-            console.log(res.data.amount, res.data.orderNo)
-            if(res.data.amount == 0 && res.data.orderNo) {
-              this.$message.success('您已成功缴费')
-              this.onPaymentClose(true)
-              this.$listeners.getList()
-              return
+            const res = await recharge({ amount: this.amount });
+            console.log(res.data.amount, res.data.orderNo);
+            if (res.data.amount == 0 && res.data.orderNo) {
+              this.$message.success("您已成功缴费");
+              this.onPaymentClose(true);
+              this.$listeners.getList();
+              return;
             }
-            const payForm = this.payForm
+            const payForm = this.payForm;
             // // 二维码页面, 唤起支付页面
-            const { orderNo, sign, amount, orderBody, orderSubject } = res.data.payMap
-            this.orderNo = orderNo
-            this.codeUrl = vaildStudentUrl() + '/#/payCenter?orderNo=' + orderNo + '&sign=' + sign + '&amount=' + amount + '&payType=' + payForm.payType + '&orderBody=' + orderBody + '&orderSubject=' + orderSubject + '&platform=tenantRecharge'
-            console.log(this.codeUrl, 'codeUrl')
-            this.payMentVisible = true
-          } catch(e) {}
+            const {
+              orderNo,
+              sign,
+              amount,
+              orderBody,
+              orderSubject,
+              tenantId,
+              returnUrl,
+              notifyUrl
+            } = res.data.payMap;
+            this.orderNo = orderNo;
+            this.codeUrl =
+              vaildStudentUrl() +
+              "/#/payCenter?orderNo=" +
+              orderNo +
+              "&sign=" +
+              sign +
+              "&amount=" +
+              amount +
+              "&payType=" +
+              payForm.payType +
+              "&orderBody=" +
+              orderBody +
+              "&orderSubject=" +
+              orderSubject +
+              "&platform=tenantRecharge" +
+              "&tenantId" +
+              tenantId +
+              "&returnUrl=" +
+              returnUrl +
+              "&notifyUrl=" +
+              notifyUrl;
+            console.log(this.codeUrl, "codeUrl");
+            this.payMentVisible = true;
+          } catch (e) {}
         }
-      })
+      });
     },
     onClose(done) {
-      this.onPaymentClose(false, done)
+      this.onPaymentClose(false, done);
     },
     onPaymentClose(hideTip = false, callBack) {
-      if(hideTip) {
-        this.payMentVisible = false
-        this.$emit('close')
-        return
+      if (hideTip) {
+        this.payMentVisible = false;
+        this.$emit("close");
+        return;
       }
       this.$confirm(`是否支付完成?`, "提示", {
         confirmButtonText: "已完成支付",
         cancelButtonText: "未完成支付",
-        type: "warning",
-      }).then(async (res) => {
-        if(typeof callBack == 'function') {
-          callBack()
-        }
-        this.payMentVisible = false
-      }).catch(e => {
-        if(typeof callBack == 'function') {
-          callBack()
-        }
-        this.payMentVisible = false
-      });
+        type: "warning"
+      })
+        .then(async res => {
+          if (typeof callBack == "function") {
+            callBack();
+          }
+          this.payMentVisible = false;
+        })
+        .catch(e => {
+          if (typeof callBack == "function") {
+            callBack();
+          }
+          this.payMentVisible = false;
+        });
     }
-  },
+  }
 };
 </script>
 <style lang="less" scoped>

+ 139 - 75
src/views/productService/model/serviceModel.vue

@@ -1,7 +1,12 @@
 <template>
   <div class="chioseWrap">
     <el-form :inline="true" ref="payForm" :model="payForm">
-      <el-form-item prop="payType" :rules="[{required: true, message: '请选择支付方式', trigger: 'change'}]">
+      <el-form-item
+        prop="payType"
+        :rules="[
+          { required: true, message: '请选择支付方式', trigger: 'change' }
+        ]"
+      >
         <el-select
           v-model.trim="payForm.payType"
           style="width: 180px"
@@ -18,7 +23,11 @@
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
         :data="tableList"
       >
-        <el-table-column align="center" prop="platformServeName" label="产品名称">
+        <el-table-column
+          align="center"
+          prop="platformServeName"
+          label="产品名称"
+        >
         </el-table-column>
         <el-table-column align="center" label="学员上限">
           <template slot-scope="scope">
@@ -32,34 +41,43 @@
         </el-table-column>
         <el-table-column align="center" prop="num" label="数量">
         </el-table-column>
-        <el-table-column
-          align="center"
-          label="原价(元)"
-        >
+        <el-table-column align="center" label="原价(元)">
           <template slot-scope="scope">
             {{ scope.row.rechargeAmount | hasMoneyFormat }}
           </template>
         </el-table-column>
-        <el-table-column
-          align="center"
-          label="支付价格(元)"
-        >
+        <el-table-column align="center" label="支付价格(元)">
           <template slot-scope="scope">
-            <span style="color: red;">{{ scope.row.value | hasMoneyFormat }}</span>
+            <span style="color: red;">{{
+              scope.row.value | hasMoneyFormat
+            }}</span>
           </template>
         </el-table-column>
       </el-table>
 
-      <el-form-item prop="checked" :rules="[{required: true, message: '请阅读并同意协议', trigger: 'change'}]">
+      <el-form-item
+        prop="checked"
+        :rules="[
+          { required: true, message: '请阅读并同意协议', trigger: 'change' }
+        ]"
+      >
         <el-checkbox v-model="payForm.checked" @change="onCheckChange">
         </el-checkbox>
-          <span style="color: #606266; padding-left: 5px;cursor: pointer;" @click="onCheckBox">我已阅读并同意</span>
-          <span @click.stop="onLookContract" style="color: #01C1B5;cursor: pointer;">《产品及服务协议》</span>
+        <span
+          style="color: #606266; padding-left: 5px;cursor: pointer;"
+          @click="onCheckBox"
+          >我已阅读并同意</span
+        >
+        <span
+          @click.stop="onLookContract"
+          style="color: #01C1B5;cursor: pointer;"
+          >《产品及服务协议》</span
+        >
       </el-form-item>
     </el-form>
 
     <span slot="footer" class="dialog-footer">
-      <el-button @click="$listeners.close();">取 消</el-button>
+      <el-button @click="$listeners.close()">取 消</el-button>
       <el-button @click="onMemberPay" type="primary">确 定</el-button>
     </span>
 
@@ -85,17 +103,23 @@
       width="500px"
       append-to-body
     >
-      <payment :tableList="tableList" :orderNo="orderNo" v-on="$listeners" :codeUrl="codeUrl" @close="onPaymentClose" />
+      <payment
+        :tableList="tableList"
+        :orderNo="orderNo"
+        v-on="$listeners"
+        :codeUrl="codeUrl"
+        @close="onPaymentClose"
+      />
     </el-dialog>
   </div>
 </template>
 <script>
 // import { recharge } from '../api'
-import { vaildStudentUrl } from '@/utils/validate'
-import payment from '@/views/productService/model/payment'
+import { vaildStudentUrl } from "@/utils/validate";
+import payment from "@/views/productService/model/payment";
 import previewProtocol from "@/views/tenantSetting/model/previewProtocol";
-import { tenantInfoRePay, getContract } from '../api'
-import { getTenantId } from '@/utils/auth'
+import { tenantInfoRePay, getContract } from "../api";
+import { getTenantId } from "@/utils/auth";
 export default {
   props: ["value", "tenantInfo"],
   components: { payment, previewProtocol },
@@ -103,7 +127,7 @@ export default {
     return {
       payForm: {
         payType: null,
-        checked: null,
+        checked: null
       },
       fileContent: null,
       lookVisible: false,
@@ -116,90 +140,130 @@ export default {
     };
   },
   async mounted() {
-    if(this.value) {
-      const { contractPrice, originalPrice, ...res } = this.tenantInfo
-      this.tableList = [{
-        ...res,
-        num: this.value,
-        rechargeAmount: this.value * originalPrice,
-        value: this.value * contractPrice
-      }]
+    if (this.value) {
+      const { contractPrice, originalPrice, ...res } = this.tenantInfo;
+      this.tableList = [
+        {
+          ...res,
+          num: this.value,
+          rechargeAmount: this.value * originalPrice,
+          value: this.value * contractPrice
+        }
+      ];
     }
   },
   methods: {
     onCheckChange() {
-      if(!this.payForm.checked) {
-        this.payForm.checked = null
+      if (!this.payForm.checked) {
+        this.payForm.checked = null;
       }
     },
     onCheckBox() {
-      if(this.payForm.checked) {
-        this.payForm.checked = null
+      if (this.payForm.checked) {
+        this.payForm.checked = null;
       } else {
-        this.payForm.checked = true
+        this.payForm.checked = true;
       }
     },
     onMemberPay() {
-      this.$refs.payForm.validate(async (_) => {
-        if(_) {
+      this.$refs.payForm.validate(async _ => {
+        if (_) {
           try {
-            console.log(this.value, 'this.value')
-            const res = await tenantInfoRePay({ id: getTenantId(), val: this.value })
+            console.log(this.value, "this.value");
+            const res = await tenantInfoRePay({
+              id: getTenantId(),
+              val: this.value
+            });
             // console.log(res)
-            if(res.data.amount == 0 && res.data.orderNo) {
-              this.$message.success('您已成功缴费')
-              this.onPaymentClose(true)
-              this.$listeners.getList()
-              return
+            if (res.data.amount == 0 && res.data.orderNo) {
+              this.$message.success("您已成功缴费");
+              this.onPaymentClose(true);
+              this.$listeners.getList();
+              return;
             }
-            const payForm = this.payForm
+            const payForm = this.payForm;
             // 二维码页面, 唤起支付页面
-            const { orderNo, sign, amount, orderBody, orderSubject } = res.data.payMap
-            this.orderNo = orderNo
-            this.codeUrl = vaildStudentUrl() + '/#/payCenter?orderNo=' + orderNo + '&sign=' + sign + '&amount=' + amount + '&payType=' + payForm.payType + '&orderBody=' + orderBody + '&orderSubject=' + orderSubject + '&platform=tenant'
-            console.log(this.codeUrl, 'codeUrl')
-            this.payMentVisible = true
-          } catch(e) {}
+            const {
+              orderNo,
+              sign,
+              amount,
+              orderBody,
+              orderSubject,
+              tenantId,
+              returnUrl,
+              notifyUrl
+            } = res.data.payMap;
+            this.orderNo = orderNo;
+            this.codeUrl =
+              vaildStudentUrl() +
+              "/#/payCenter?orderNo=" +
+              orderNo +
+              "&sign=" +
+              sign +
+              "&amount=" +
+              amount +
+              "&payType=" +
+              payForm.payType +
+              "&orderBody=" +
+              orderBody +
+              "&orderSubject=" +
+              orderSubject +
+              "&platform=tenant" +
+              "&tenantId=" +
+              tenantId +
+              "&returnUrl=" +
+              returnUrl +
+              "&notifyUrl=" +
+              notifyUrl;
+            console.log(this.codeUrl, "codeUrl");
+            this.payMentVisible = true;
+          } catch (e) {}
         }
-      })
+      });
     },
     onClose(done) {
-      this.onPaymentClose(false, done)
+      this.onPaymentClose(false, done);
     },
     async onLookContract() {
       // 如果有协议则不需要重新请求
-      if(!this.fileContent) {
+      if (!this.fileContent) {
         try {
-          const tenantId = this.$helpers.tenantId
-          const res = await getContract({ id: tenantId, type: 1, renewCount: this.value })
-          this.fileContent = res.data
-        } catch(e) {}
+          const tenantId = this.$helpers.tenantId;
+          const res = await getContract({
+            id: tenantId,
+            type: 1,
+            renewCount: this.value
+          });
+          this.fileContent = res.data;
+        } catch (e) {}
       }
-      this.lookVisible = true
+      this.lookVisible = true;
     },
     onPaymentClose(hideTip = false, callBack) {
-      if(hideTip) {
-        this.payMentVisible = false
-        this.$emit('close')
-        return
+      if (hideTip) {
+        this.payMentVisible = false;
+        this.$emit("close");
+        return;
       }
       this.$confirm(`是否支付完成?`, "提示", {
         confirmButtonText: "已完成支付",
         cancelButtonText: "未完成支付",
-        type: "warning",
-      }).then(async (res) => {
-        if(typeof callBack == 'function') {
-          callBack()
-        }
-        this.payMentVisible = false
-      }).catch(e => {
-        if(typeof callBack == 'function') {
-          callBack()
-        }
-        this.payMentVisible = false
-      });
+        type: "warning"
+      })
+        .then(async res => {
+          if (typeof callBack == "function") {
+            callBack();
+          }
+          this.payMentVisible = false;
+        })
+        .catch(e => {
+          if (typeof callBack == "function") {
+            callBack();
+          }
+          this.payMentVisible = false;
+        });
     }
-  },
+  }
 };
 </script>
 <style lang="less" scoped>

+ 104 - 57
src/views/resetTeaming/modals/giveMemberModel.vue

@@ -1,8 +1,19 @@
 <template>
   <div class="chioseWrap">
-    <p>您将为以下<span>{{tableList.length}}</span>位学员激活云教练,激活金额<span>{{ selectStudentMoney | moneyFormat }}</span>元</p>
+    <p>
+      您将为以下<span>{{ tableList.length }}</span
+      >位学员激活云教练,激活金额<span>{{
+        selectStudentMoney | moneyFormat
+      }}</span
+      >元
+    </p>
     <el-form :inline="true" ref="payForm" :model="payForm">
-      <el-form-item prop="payType" :rules="[{required: true, message: '请选择支付方式', trigger: 'change'}]">
+      <el-form-item
+        prop="payType"
+        :rules="[
+          { required: true, message: '请选择支付方式', trigger: 'change' }
+        ]"
+      >
         <el-select
           v-model.trim="payForm.payType"
           style="width: 180px"
@@ -24,11 +35,7 @@
       </el-table-column>
       <el-table-column align="center" prop="phone" label="手机号">
       </el-table-column>
-      <el-table-column
-        align="center"
-        prop="type"
-        label="云教练类型"
-      >
+      <el-table-column align="center" prop="type" label="云教练类型">
         <template slot-scope="scope">
           {{ scope.row.type | memberEnumType }}
         </template>
@@ -38,10 +45,7 @@
         prop="time"
         label="数量"
       ></el-table-column>
-      <el-table-column
-        align="center"
-        label="缴费金额(元)"
-      >
+      <el-table-column align="center" label="缴费金额(元)">
         <template slot-scope="scope">
           {{ scope.row.amount | hasMoneyFormat }}
         </template>
@@ -49,7 +53,13 @@
     </el-table>
 
     <span slot="footer" class="dialog-footer">
-      <el-button @click="$listeners.close();$listeners.getList()">取 消</el-button>
+      <el-button
+        @click="
+          $listeners.close();
+          $listeners.getList();
+        "
+        >取 消</el-button
+      >
       <el-button @click="onMemberPay" type="primary">确 定</el-button>
     </span>
 
@@ -61,86 +71,123 @@
       width="500px"
       append-to-body
     >
-      <giveMemberPayment :tableList="tableList" v-on="$listeners" :orderNo="orderNo" :codeUrl="codeUrl" @close="onPaymentClose" />
+      <giveMemberPayment
+        :tableList="tableList"
+        v-on="$listeners"
+        :orderNo="orderNo"
+        :codeUrl="codeUrl"
+        @close="onPaymentClose"
+      />
     </el-dialog>
   </div>
 </template>
 <script>
-import { cloudPay } from '../api'
-import { vaildStudentUrl } from '@/utils/validate'
-import giveMemberPayment from '@/views/resetTeaming/modals/giveMemberPayment'
+import { cloudPay } from "../api";
+import { vaildStudentUrl } from "@/utils/validate";
+import giveMemberPayment from "@/views/resetTeaming/modals/giveMemberPayment";
 export default {
   props: ["tableList"],
   components: { giveMemberPayment },
   data() {
     return {
       payForm: {
-        payType: null,
+        payType: null
       },
       pay_channel: null, //支付渠道
       selectStudentMoney: 0, // 选中学生金额
       payMentVisible: false,
       codeUrl: null,
-      orderNo: null,
+      orderNo: null
     };
   },
   async mounted() {
-    let tableList = this.tableList || []
-    for(let i of tableList) {
-      this.selectStudentMoney += parseFloat(i.amount)
+    let tableList = this.tableList || [];
+    for (let i of tableList) {
+      this.selectStudentMoney += parseFloat(i.amount);
     }
   },
   methods: {
     onMemberPay() {
-      this.$refs.payForm.validate(async (_) => {
-        if(_) {
+      this.$refs.payForm.validate(async _ => {
+        if (_) {
           try {
-            const res = await cloudPay(this.tableList)
-            console.log(res)
-            if(res.data.amount == 0 && res.data.orderNo) {
-              this.$message.success('您已成功缴费')
-              this.onPaymentClose(true)
-              this.$listeners.getList()
-              return
+            const res = await cloudPay(this.tableList);
+            console.log(res);
+            if (res.data.amount == 0 && res.data.orderNo) {
+              this.$message.success("您已成功缴费");
+              this.onPaymentClose(true);
+              this.$listeners.getList();
+              return;
             }
-            const payForm = this.payForm
+            const payForm = this.payForm;
             // // 二维码页面, 唤起支付页面
-            const { orderNo, sign, amount, orderBody, orderSubject } = res.data.payMap
-            this.orderNo = orderNo
-            this.codeUrl = vaildStudentUrl() + '/#/payCenter?orderNo=' + orderNo + '&sign=' + sign + '&amount=' + amount + '&payType=' + payForm.payType + '&orderBody=' + orderBody + '&orderSubject=' + orderSubject + '&platform=cloudTeacherOrder'
-            console.log(this.codeUrl, 'codeUrl')
-            this.payMentVisible = true
-          } catch(e) {}
+            const {
+              orderNo,
+              sign,
+              amount,
+              orderBody,
+              orderSubject,
+              tenantId,
+              returnUrl,
+              notifyUrl
+            } = res.data.payMap;
+            this.orderNo = orderNo;
+            this.codeUrl =
+              vaildStudentUrl() +
+              "/#/payCenter?orderNo=" +
+              orderNo +
+              "&sign=" +
+              sign +
+              "&amount=" +
+              amount +
+              "&payType=" +
+              payForm.payType +
+              "&orderBody=" +
+              orderBody +
+              "&orderSubject=" +
+              orderSubject +
+              "&platform=cloudTeacherOrder" +
+              "&tenantId=" +
+              tenantId +
+              "&returnUrl=" +
+              returnUrl +
+              "&notifyUrl=" +
+              notifyUrl;
+            console.log(this.codeUrl, "codeUrl");
+            this.payMentVisible = true;
+          } catch (e) {}
         }
-      })
+      });
     },
     onClose(done) {
-      this.onPaymentClose(false, done)
+      this.onPaymentClose(false, done);
     },
     onPaymentClose(hideTip = false, callBack) {
-      if(hideTip) {
-        this.payMentVisible = false
-        this.$emit('close')
-        this.$emit('getList')
-        return
+      if (hideTip) {
+        this.payMentVisible = false;
+        this.$emit("close");
+        this.$emit("getList");
+        return;
       }
       this.$confirm(`是否支付完成?`, "提示", {
         confirmButtonText: "已完成支付",
         cancelButtonText: "未完成支付",
-        type: "warning",
-      }).then(async (res) => {
-        if(typeof callBack == 'function') {
-          callBack()
-        }
-        this.payMentVisible = false
-      }).catch(e => {
-        if(typeof callBack == 'function') {
-          callBack()
-        }
-        this.payMentVisible = false
-      });
+        type: "warning"
+      })
+        .then(async res => {
+          if (typeof callBack == "function") {
+            callBack();
+          }
+          this.payMentVisible = false;
+        })
+        .catch(e => {
+          if (typeof callBack == "function") {
+            callBack();
+          }
+          this.payMentVisible = false;
+        });
     }
-  },
+  }
 };
 </script>
 <style lang="less" scoped>

+ 93 - 26
src/views/setQuestions/operation.vue

@@ -90,7 +90,7 @@
             >
               <template slot="label">
                 <p style="position: relative" class="titleCell">
-                  <span style="color: #f56c6c; margin-right: 4px">*</span>
+                  <!-- <span style="color: #f56c6c; margin-right: 4px">*</span> -->
                   是否逐题提交
                   <el-tooltip placement="top" popper-class="mTooltip">
                     <div slot="content">逐题模式下,所有问题默认必填</div>
@@ -119,6 +119,80 @@
           </el-col>
         </el-row>
         <el-row>
+          <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
+            <el-form-item
+              label="分享标题"
+              prop="shareTitle"
+              :rules="[
+                { required: true, message: '请输入分享标题', trigger: 'blur' },
+              ]"
+            >
+              <template slot="label">
+                <p style="position: relative" class="titleCell">
+                  <!-- <span style="color: #f56c6c; margin-right: 4px">*</span> -->
+                  分享标题
+                  <el-tooltip placement="top" popper-class="mTooltip">
+                    <div slot="content">
+                      问卷链接分享到微信时,显示的链接标题
+                    </div>
+                    <i
+                      class="el-icon-question"
+                      style="
+                        font-size: 18px;
+                        color: #f56c6c;
+                        position: relative;
+                        top: 2px;
+                      "
+                    ></i>
+                  </el-tooltip>
+                </p>
+              </template>
+              <el-input
+                v-model="form.shareTitle"
+                placeholder="请输入分享标题"
+                :disabled="disabled"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
+            <el-form-item
+              label="分享描述"
+              prop="shareDescribe"
+              :rules="[
+                { required: true, message: '请输入分享描述', trigger: 'blur' },
+              ]"
+            >
+              <template slot="label">
+                <p style="position: relative" class="titleCell">
+                  <!-- <span style="color: #f56c6c; margin-right: 4px">*</span> -->
+                  分享描述
+                  <el-tooltip placement="top" popper-class="mTooltip">
+                    <div slot="content">
+                      问卷链接分享到微信时,显示的链接描述
+                    </div>
+                    <i
+                      class="el-icon-question"
+                      style="
+                        font-size: 18px;
+                        color: #f56c6c;
+                        position: relative;
+                        top: 2px;
+                      "
+                    ></i>
+                  </el-tooltip>
+                </p>
+              </template>
+              <el-input
+                v-model="form.shareDescribe"
+                placeholder="请输入分享描述"
+                :disabled="disabled"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
           <el-form-item
             label="问卷模板"
             prop="templateType"
@@ -236,7 +310,7 @@
             </el-col>
             <el-col :span="12" style="text-align: right; padding-right: 15px">
               <el-tooltip
-              key="moveDown"
+                key="moveDown"
                 class="item"
                 effect="dark"
                 content="向下移动"
@@ -250,7 +324,7 @@
                 ></el-button>
               </el-tooltip>
               <el-tooltip
-              key="moveUp"
+                key="moveUp"
                 class="item"
                 effect="dark"
                 content="向上移动"
@@ -338,21 +412,16 @@
         </el-col>
       </el-row>
       <el-row>
-        <el-col :xs="24"
-          :sm="24"
-          :md="24"
-          :lg="18"
-          :xl="18">
-                            <el-alert
-        v-if="disabled"
-        style="margin: 10px 0"
-        title="该问卷已存在提交数据,不可修改"
-        :closable="false"
-        type="error"
-      >
-      </el-alert>
-          </el-col>
-
+        <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
+          <el-alert
+            v-if="disabled"
+            style="margin: 10px 0"
+            title="该问卷已存在提交数据,不可修改"
+            :closable="false"
+            type="error"
+          >
+          </el-alert>
+        </el-col>
       </el-row>
 
       <el-button type="primary" :disabled="disabled" @click="onSubmit">{{
@@ -414,7 +483,7 @@ export default {
         title: null,
         againCommitFlag: 1,
         questionnaireQuestionList: [{ questionnaireQuestionItemList: [{}] }],
-        commitType:null
+        commitType: null,
       },
       disabled: false,
       questionStatus: false,
@@ -467,7 +536,7 @@ export default {
         console.log(validateResult);
         if (validateResult) {
           this.setResultSort();
-          console.log(this.form)
+          console.log(this.form);
           try {
             if (this.type == "create") {
               await questionnaireTopicAdd(this.form);
@@ -528,24 +597,23 @@ export default {
     },
     // 向上移动
     moveUp(arr, index) {
-      console.log('向上移动')
+      console.log("向上移动");
       arr.splice(index, 1, ...arr.splice(index + 1, 1, arr[index]));
     },
     // 向下移动
     moveDown(arr, index) {
-      console.log('向下移动')
+      console.log("向下移动");
       arr.splice(index - 1, 1, ...arr.splice(index, 1, arr[index - 1]));
     },
     // 删除选项
     onDelete(arr, index) {
       if (!this.disabled) {
         if (this.form.delQuestionnaireQuestionIdList) {
-
           this.form.delQuestionnaireQuestionIdList.push(arr[index].id);
-             console.log( this.form.delQuestionnaireQuestionIdList)
+          console.log(this.form.delQuestionnaireQuestionIdList);
         } else {
           this.form.delQuestionnaireQuestionIdList = [arr[index].id];
-            console.log( this.form.delQuestionnaireQuestionIdList)
+          console.log(this.form.delQuestionnaireQuestionIdList);
         }
       }
       arr.splice(index, 1);
@@ -586,7 +654,6 @@ export default {
       if (!val) {
         this.form.commitType = 0;
       }
-
     },
   },
 };

+ 12 - 11
src/views/studentManager/studentList.vue

@@ -11,6 +11,7 @@
         class="searchForm"
         @submit="onSearch"
         @reset="onReSet"
+        ref="saveForm"
         :model.sync="searchForm"
       >
         <el-form-item>
@@ -20,6 +21,7 @@
             @keydown.enter.native="
               (e) => {
                 e.target.blur();
+                $refs.saveForm.save();
                 onSearch();
               }
             "
@@ -173,7 +175,7 @@
           <el-button native-type="reset" type="primary">重置</el-button>
           <el-button
             type="primary"
-            v-permission="'export/studentHasCourse'"
+            v-if="$helpers.permission('export/studentHasCourse')"
             @click="downLoadStudent"
             >导出名单</el-button
           >
@@ -187,7 +189,7 @@
         >创建云教练缴费</el-button
       >
       <el-button
-        v-permission="'studentManage/register'"
+        v-if="$helpers.permission('studentManage/register')"
         @click="addStudent"
         type="primary"
         icon="el-icon-plus"
@@ -540,7 +542,7 @@
           <el-table-column align="center" width="180px" label="操作">
             <template slot-scope="scope">
               <router-link
-                v-permission="'/studentDetail'"
+               v-if="$helpers.permission('/studentDetail')"
                 class="el-button--text"
                 :to="{
                   path: `/business/studentDetail`,
@@ -560,22 +562,24 @@
               <el-button
                 type="text"
                 style="padding-left: 10px"
-                v-permission="'studentManage/studentUpdate'"
+                v-if="$helpers.permission('studentManage/studentUpdate')"
                 @click="resetStudent(scope.row)"
                 >修改</el-button
               >
               <!-- api-auth/user/updatePassword2 -->
               <el-button
-                v-permission="'api-auth/user/updatePassword2'"
+                v-if="$helpers.permission('api-auth/user/updatePassword2')"
                 @click="resetPassWrod(scope.row)"
                 type="text"
                 >修改密码</el-button
               >
               <el-button
-                v-if="scope.row.isSignedContract"
+                v-if="
+                  scope.row.isSignedContract &&
+                  $helpers.permission('sysUserContracts/getLatest')
+                "
                 type="text"
                 @click="lookContracts(scope.row)"
-                v-permission="'sysUserContracts/getLatest'"
                 >下载协议</el-button
               >
             </template>
@@ -702,7 +706,7 @@
             ></el-option>
           </el-select>
         </el-form-item>
-          <el-form-item prop="school" label="所属学校">
+        <el-form-item prop="school" label="所属学校">
           <el-select
             v-model.trim="studentForm.school"
             filterable
@@ -735,7 +739,6 @@
           </el-select>
         </el-form-item>
         <el-form-item label="学员班级" prop="currentClass">
-
           <el-select
             placeholder="班级"
             filterable
@@ -783,7 +786,6 @@
             <el-option label="38班" value="38班"></el-option>
             <el-option label="39班" value="39班"></el-option>
             <el-option label="40班" value="40班"></el-option>
-
           </el-select>
           <!-- <el-input
             v-model.trim="maskForm.course"
@@ -791,7 +793,6 @@
           ></el-input> -->
         </el-form-item>
 
-
         <el-form-item label="指导老师" prop="teacherId">
           <el-select
             class="multiple"

+ 146 - 150
src/views/teacherManager/teacherDetail/components/teacherInfo.vue

@@ -6,98 +6,86 @@
         <el-form :model="topForm">
           <el-row>
             <el-col :span="12">
-              <el-form-item label="姓名"
-                            :label-width="formLabelWidth">
-                <el-input v-model.trim="topForm.realName"
-                          disabled></el-input>
+              <el-form-item label="姓名" :label-width="formLabelWidth">
+                <el-input v-model.trim="topForm.realName" disabled></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="姓名(备注)"
-                            :label-width="formLabelWidth">
-                <el-input v-model.trim="topForm.memo"
-                          disabled></el-input>
+              <el-form-item label="姓名(备注)" :label-width="formLabelWidth">
+                <el-input v-model.trim="topForm.memo" disabled></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="老师编号"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.id"></el-input>
+              <el-form-item label="老师编号" :label-width="formLabelWidth">
+                <el-input disabled v-model.trim="topForm.id"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="性别"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.gender"></el-input>
+              <el-form-item label="性别" :label-width="formLabelWidth">
+                <el-input disabled v-model.trim="topForm.gender"></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="出生日期"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.birthdate"></el-input>
+              <el-form-item label="出生日期" :label-width="formLabelWidth">
+                <el-input disabled v-model.trim="topForm.birthdate"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="工作类别"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.jobNature "></el-input>
+              <el-form-item label="工作类别" :label-width="formLabelWidth">
+                <el-input disabled v-model.trim="topForm.jobNature"></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="入职日期"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.entryDate"></el-input>
+              <el-form-item label="入职日期" :label-width="formLabelWidth">
+                <el-input disabled v-model.trim="topForm.entryDate"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="教学点"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.teacherSchools"></el-input>
+              <el-form-item label="教学点" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.teacherSchools"
+                ></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="所属分部"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.organName"></el-input>
+              <el-form-item label="所属分部" :label-width="formLabelWidth">
+                <el-input disabled v-model.trim="topForm.organName"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="流动范围"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.flowOrganRange"></el-input>
+              <el-form-item label="流动范围" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.flowOrganRange"
+                ></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="老师简介"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          type='textarea'
-                          v-model.trim="topForm.introduction"></el-input>
+              <el-form-item label="老师简介" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  type="textarea"
+                  v-model.trim="topForm.introduction"
+                ></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="开放陪练"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="isSupportExtraPracticeLesson"></el-input>
+              <el-form-item label="开放陪练" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="isSupportExtraPracticeLesson"
+                ></el-input>
               </el-form-item>
             </el-col>
           </el-row>
@@ -105,82 +93,85 @@
           <h4>资料学历</h4>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="手机号"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.phone"></el-input>
+              <el-form-item label="手机号" :label-width="formLabelWidth">
+                <el-input disabled v-model.trim="topForm.phone"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="毕业学校"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.graduateSchool"></el-input>
+              <el-form-item label="毕业学校" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.graduateSchool"
+                ></el-input>
               </el-form-item>
             </el-col>
-
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="电子邮箱"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.email"></el-input>
+              <el-form-item label="电子邮箱" :label-width="formLabelWidth">
+                <el-input disabled v-model.trim="topForm.email"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="最高学历"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.educationBackground"></el-input>
+              <el-form-item label="最高学历" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.educationBackground"
+                ></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="专业技能"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.subjectName"></el-input>
+              <el-form-item label="专业技能" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.subjectName"
+                ></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="职称"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.technicalTitles"></el-input>
+              <el-form-item label="职称" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.technicalTitles"
+                ></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="证件类型"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.certificateType"></el-input>
+              <el-form-item label="证件类型" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.certificateType"
+                ></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="证件号码"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.certificateNum"></el-input>
+              <el-form-item label="证件号码" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.certificateNum"
+                ></el-input>
               </el-form-item>
             </el-col>
           </el-row>
-             <el-row>
+          <el-row>
             <el-col :span="12">
-              <el-form-item label="转正日期"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.formalStaffDate"></el-input>
+              <el-form-item label="转正日期" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.formalStaffDate"
+                ></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="离职日期"
-                            :label-width="formLabelWidth">
-                <el-input disabled
-                          v-model.trim="topForm.demissionDate"></el-input>
+              <el-form-item label="离职日期" :label-width="formLabelWidth">
+                <el-input
+                  disabled
+                  v-model.trim="topForm.demissionDate"
+                ></el-input>
               </el-form-item>
             </el-col>
           </el-row>
@@ -188,97 +179,102 @@
       </div>
       <div class="right">
         <div class="teacherIcon">
-          <img v-if="topForm.avatar"
-               :src="topForm.avatar"
-               alt="">
-          <img v-else
-               src="@/assets/images/base/woman.png"
-               alt="">
+          <img v-if="topForm.avatar" :src="topForm.avatar" alt="" />
+          <img v-else src="@/assets/images/base/woman.png" alt="" />
         </div>
-
       </div>
     </div>
-
   </div>
 </template>
 <script>
-import { teacherGet } from '@/api/teacherManager'
-import dayjs from 'dayjs';
+import { teacherGet } from "@/api/teacherManager";
+import dayjs from "dayjs";
 export default {
-  name: 'teacherInfo',
-  props:['teacherInfo'],
-  data () {
+  name: "teacherInfo",
+  props: ["teacherInfo"],
+  data() {
     return {
-      formLabelWidth: '80px',
+      formLabelWidth: "80px",
       teacherId: this.$route.query.teacherId,
       topForm: {}
-    }
+    };
   },
-  mounted () {
-    this.teacherId = this.$route.query.teacherId
-    this.teacherGet()
+  mounted() {
+    this.teacherId = this.$route.query.teacherId;
+    this.teacherGet();
   },
   methods: {
-    teacherGet () {
-        let tempData = this.teacherInfo
-          tempData.subjectName = this.joinArray(tempData.subjectName)
-          let sn = []
-          if(tempData.teacherSchools && tempData.teacherSchools.length > 0) {
-            tempData.teacherSchools.forEach(item => {
-              sn.push(item.name)
-            })
-          }
-          tempData.teacherSchools = this.joinArray(sn, ',') // 教学点
-          tempData.entryDate = this.formatTimer(tempData.entryDate)
-          tempData.jobNature = this.jobNature(tempData.jobNature)
-          tempData.birthdate = this.formatTimer(tempData.birthdate)
-          if(tempData.gender !='男'&&tempData.gender!='女'){
-            tempData.gender = tempData.gender ? '男' : '女'
-          }
+    teacherGet() {
+      let tempData = this.teacherInfo;
+      tempData.subjectName = this.joinArray(tempData.subjectName);
+      let sn = [];
+      // 处理教学点显示问题
+      if (
+        tempData.teacherSchools &&
+        typeof tempData.teacherSchools == "object" &&
+        tempData.teacherSchools.length > 0
+      ) {
+        tempData.teacherSchools.forEach(item => {
+          sn.push(item.name);
+        });
+      } else {
+        sn.push(tempData.teacherSchools);
+      }
+      tempData.teacherSchools = this.joinArray(sn, ","); // 教学点
+      tempData.entryDate = this.formatTimer(tempData.entryDate);
+      tempData.jobNature = this.jobNature(tempData.jobNature);
+      tempData.birthdate = this.formatTimer(tempData.birthdate);
+      if (tempData.gender != "男" && tempData.gender != "女") {
+        tempData.gender = tempData.gender ? "男" : "女";
+      }
 
-          this.topForm = this.teacherInfo
-          if(this.topForm.demissionDate){
-             this.topForm.demissionDate = dayjs(this.topForm.demissionDate).format('YYYY-MM-DD')
-          }
-          if(this.topForm.formalStaffDate) {
-            this.topForm.formalStaffDate = dayjs(this.topForm.formalStaffDate).format('YYYY-MM-DD')
-          }
+      this.topForm = this.teacherInfo;
+      if (this.topForm.demissionDate) {
+        this.topForm.demissionDate = dayjs(this.topForm.demissionDate).format(
+          "YYYY-MM-DD"
+        );
+      }
+      if (this.topForm.formalStaffDate) {
+        this.topForm.formalStaffDate = dayjs(
+          this.topForm.formalStaffDate
+        ).format("YYYY-MM-DD");
+      }
     },
-    joinArray (value, type) {
+    joinArray(value, type) {
       if (!type) {
-        type = ' '
+        type = " ";
       }
-      if (typeof value == 'object' && value != null) {
-        return value.join(type)
+      if (typeof value == "object" && value != null) {
+        return value.join(type);
       } else {
-        return value
+        return value;
       }
     },
-    formatTimer (value) {
+    formatTimer(value) {
       if (value) {
-        return value.split(' ')[0]
+        return value.split(" ")[0];
       } else {
-        return value
+        return value;
       }
     },
-    jobNature (value) {
+    jobNature(value) {
       let template = {
         PART_TIME: "兼职",
         FULL_TIME: "全职",
-        LABOUR:'劳务'
+        LABOUR: "劳务"
         // TEMPORARY: "零时工"
-      }
-      return template[value]
+      };
+      return template[value];
     }
   },
   computed: {
-    isSupportExtraPracticeLesson () {
-      let str = ''
-      this.topForm.isSupportExtraPracticeLesson ? str = '是' : str = "否"
-      return str
-    },
+    isSupportExtraPracticeLesson() {
+      let str = "";
+      this.topForm.isSupportExtraPracticeLesson ? (str = "是") : (str = "否");
+      return str;
+    }
   }
-}
+};
 </script>
 <style lang="scss" scoped>
 .teacherInfo {

+ 121 - 82
src/views/teacherManager/teacherDetail/index.vue

@@ -1,89 +1,131 @@
 <template>
   <div class="m-container">
     <h2 class="mo-tilte">
-      <el-page-header @back="onCancel"
-                      :content="teacherName"></el-page-header>
+      <el-page-header @back="onCancel" :content="teacherName"></el-page-header>
       <div>
         <!-- 服务指标:本周 运营指标: -->
-        <el-button v-if="teacherInfos && permission('/operateStudent')" type="text" @click="gotoOperating">运营指标:<span style="color:red">{{teacherInfos.operatingIndex}}%</span></el-button>
-        <el-button v-if="teacherInfos && permission('/serverIndexList')" type="text" @click="gotoAfterSchool">服务指标(每周):<span style="color:red">{{teacherInfos.serviceIndex}}%</span></el-button>
+        <el-button
+          v-if="teacherInfos && permission('/operateStudent')"
+          type="text"
+          @click="gotoOperating"
+          >运营指标:<span style="color:red"
+            >{{ teacherInfos.operatingIndex }}%</span
+          ></el-button
+        >
+        <el-button
+          v-if="teacherInfos && permission('/serverIndexList')"
+          type="text"
+          @click="gotoAfterSchool"
+          >服务指标(每周):<span style="color:red"
+            >{{ teacherInfos.serviceIndex }}%</span
+          ></el-button
+        >
       </div>
     </h2>
     <div class="m-core">
       <!-- navMenu -->
-      <tab-router v-model.trim="activeName"
-               type="card"
-               @tab-click="handleClick">
-        <el-tab-pane label="基本信息"
-        lazy
-                     v-if="permissionList.teacherInfo"
-                     name="0">
-          <teacherInfo v-if="activeName == 0&&teacherInfos" :teacherInfo='teacherInfos'  />
+      <tab-router
+        v-model.trim="activeName"
+        type="card"
+        @tab-click="handleClick"
+      >
+        <el-tab-pane
+          label="基本信息"
+          lazy
+          v-if="permissionList.teacherInfo"
+          name="0"
+        >
+          <teacherInfo
+            v-if="activeName == 0 && teacherInfos"
+            :teacherInfo="teacherInfos"
+          />
         </el-tab-pane>
-        <el-tab-pane label="乐团课"
-        lazy
-                     v-if="permissionList.musicGroup"
-                     name="1">
+        <el-tab-pane
+          label="乐团课"
+          lazy
+          v-if="permissionList.musicGroup"
+          name="1"
+        >
           <courseInfo v-if="activeName == 1" />
         </el-tab-pane>
-        <el-tab-pane label="VIP课"
-        lazy
-                     v-if="permissionList.VipCourse"
-                     name="2">
+        <el-tab-pane
+          label="VIP课"
+          lazy
+          v-if="permissionList.VipCourse"
+          name="2"
+        >
           <courseInfo1 v-if="activeName == 2" />
         </el-tab-pane>
-        <el-tab-pane label="网管课"
-        lazy
-                     v-if="permissionList.teacherNetwork"
-                     name="8">
+        <el-tab-pane
+          label="网管课"
+          lazy
+          v-if="permissionList.teacherNetwork"
+          name="8"
+        >
           <teacherNetwork v-if="activeName == 8" />
         </el-tab-pane>
-        <el-tab-pane label="对外课"
-        lazy
-                     v-if="permissionList.outCourseList"
-                     name="3">
+        <el-tab-pane
+          label="对外课"
+          lazy
+          v-if="permissionList.outCourseList"
+          name="3"
+        >
           <outCourseList v-if="activeName == 3" />
         </el-tab-pane>
-        <el-tab-pane label="课表详情"
-        lazy
-                     v-if="permissionList.teacherRecord"
-                     name="4">
+        <el-tab-pane
+          label="课表详情"
+          lazy
+          v-if="permissionList.teacherRecord"
+          name="4"
+        >
           <teacherRecord v-if="activeName == 4" />
         </el-tab-pane>
-        <el-tab-pane label="请假记录"
-        lazy
-                     v-if="permissionList.leaveRecord"
-                     name="5">
+        <el-tab-pane
+          label="请假记录"
+          lazy
+          v-if="permissionList.leaveRecord"
+          name="5"
+        >
           <leaveRecord v-if="activeName == 5" />
         </el-tab-pane>
-        <el-tab-pane label="上课结算列表"
-        lazy
-                     v-if="permissionList.settlement"
-                     name="6">
+        <el-tab-pane
+          label="上课结算列表"
+          lazy
+          v-if="permissionList.settlement"
+          name="6"
+        >
           <settlement v-if="activeName == 6" />
         </el-tab-pane>
-        <el-tab-pane label="时间记录"
-        lazy
-                     v-if="permissionList.timerList"
-                     name="7">
+        <el-tab-pane
+          label="时间记录"
+          lazy
+          v-if="permissionList.timerList"
+          name="7"
+        >
           <timerList v-if="activeName == 7" />
         </el-tab-pane>
-        <el-tab-pane label="学员"
-        lazy
-                     v-if="permissionList.serveStudentList"
-                     name="9">
+        <el-tab-pane
+          label="学员"
+          lazy
+          v-if="permissionList.serveStudentList"
+          name="9"
+        >
           <serveStudentList v-if="activeName == 9" />
         </el-tab-pane>
-        <el-tab-pane label="月历课表"
-        lazy
-                     v-if="permissionList.calendarList"
-                     name="10">
+        <el-tab-pane
+          label="月历课表"
+          lazy
+          v-if="permissionList.calendarList"
+          name="10"
+        >
           <calendarList v-if="activeName == 10" />
         </el-tab-pane>
-        <el-tab-pane label="周历课表"
-        lazy
-                     v-if="permissionList.weeklyCalendar"
-                     name="11">
+        <el-tab-pane
+          label="周历课表"
+          lazy
+          v-if="permissionList.weeklyCalendar"
+          name="11"
+        >
           <weeklyCalendar v-if="activeName == 11" />
         </el-tab-pane>
       </tab-router>
@@ -102,10 +144,10 @@ import timerList from "@/views/teacherManager/teacherDetail/components/timerList
 import outCourseList from "@/views/teacherManager/teacherDetail/components/outCourseList";
 import teacherNetwork from "@/views/teacherManager/teacherDetail/components/teacherNetwork";
 import serveStudentList from "@/views/teacherManager/teacherDetail/components/serveStudentList";
-import calendarList from '@/views/teacherManager/teacherDetail/components/calendarList'
-import weeklyCalendar from '@/views/teacherManager/teacherDetail/components/weeklyCalendar'
+import calendarList from "@/views/teacherManager/teacherDetail/components/calendarList";
+import weeklyCalendar from "@/views/teacherManager/teacherDetail/components/weeklyCalendar";
 import { permission } from "@/utils/directivePage";
-import { teacherGet } from '@/api/teacherManager'
+import { teacherGet } from "@/api/teacherManager";
 export default {
   components: {
     teacherRecord,
@@ -123,7 +165,7 @@ export default {
     weeklyCalendar
   },
   name: "teacherDetail",
-  data () {
+  data() {
     return {
       teacherName: this.$route.query.teacherName,
       activeName: "",
@@ -141,52 +183,49 @@ export default {
         teacherNetwork: permission("/teacherDetail/teacherNetwork"),
         serveStudentList: permission("/teacherDetail/serveStudentList"),
         calendarList: permission("/teacherDetail/calendarList"),
-        weeklyCalendar: permission("/teacherDetail/weeklyCalendar"),
+        weeklyCalendar: permission("/teacherDetail/weeklyCalendar")
       },
-      teacherInfos:null
+      teacherInfos: null
     };
   },
-  activated () {
+  activated() {},
 
-  },
-
-  mounted () {
-      this.teacherName = this.$route.query.teacherName;
-      this.teacherId = this.$route.query.teacherId
+  mounted() {
+    this.teacherName = this.$route.query.teacherName;
+    this.teacherId = this.$route.query.teacherId;
 
-      teacherGet({ teacherId: this.teacherId }).then(res => {
-        if (res.code == 200) {
-         this.teacherInfos = res.data
-         this.activeName = "0";
-
-        }
-      })
+    teacherGet({ teacherId: this.teacherId }).then(res => {
+      if (res.code == 200) {
+        this.teacherInfos = res.data;
+        this.activeName = "0";
+      }
+    });
   },
   methods: {
     permission,
-    handleClick (val, event) {
+    handleClick(val, event) {
       this.activeName = val.name;
       // this.activeStatus[val.name] = true
     },
-    onCancel () {
-       this.$store.dispatch('delVisitedViews', this.$route)
+    onCancel() {
+      this.$store.dispatch("delVisitedViews", this.$route);
       this.$router.push({
         path: "/teacherManager/teacherList"
       });
     },
-      gotoAfterSchool() {
+    gotoAfterSchool() {
       // 需要的参数 id
       this.$router.push({
         path: "/serverIndexManager/serverIndexList",
-        query: { teacherId:  this.teacherId*1, activeIndex: "2" },
+        query: { teacherId: this.teacherId * 1, activeIndex: "2" }
       });
     },
     gotoOperating() {
       this.$router.push({
         path: "/operateManager/operateStudent",
-        query: { teacherId:  this.teacherId*1, operatingTag: "1" },
+        query: { teacherId: this.teacherId * 1, operatingTag: "1" }
       });
-    },
+    }
   }
 };
 </script>

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä