浏览代码

Merge branch 'master' into jenkins

lex 2 年之前
父节点
当前提交
db3c581a12
共有 31 个文件被更改,包括 900 次插入526 次删除
  1. 1 1
      README.md
  2. 0 0
      dist/assets/index-legacy.23f4c04a.js
  3. 56 0
      package-lock.json
  4. 3 0
      package.json
  5. 1 1
      public/project/initiation.html
  6. 53 7
      public/project/preRegister.html
  7. 9 1
      src/router/routes-common.ts
  8. 9 1
      src/router/routes-school.ts
  9. 3 3
      src/router/routes-teacher.ts
  10. 17 0
      src/school/approval-manage/batch-adjust.tsx
  11. 1 0
      src/school/orchestra/compontent/photo.module.less
  12. 2 2
      src/school/orchestra/orchestra-detail.tsx
  13. 1 1
      src/student/download/transfer.tsx
  14. 51 51
      src/student/music-group/pre-apply/component/payment.tsx
  15. 54 80
      src/views/accompany/music-list.tsx
  16. 16 2
      src/views/adapay/payment/index.module.less
  17. 11 6
      src/views/adapay/payment/index.tsx
  18. 61 5
      src/views/coursewarePlay/index.module.less
  19. 319 184
      src/views/coursewarePlay/index.tsx
  20. 1 1
      src/views/exercise-after-class/index.tsx
  21. 1 1
      src/views/exercise-after-class/types.ts
  22. 6 3
      src/views/mine-orchestra/index.tsx
  23. 1 1
      src/views/mine-orchestra/my-photo/index.tsx
  24. 84 86
      src/views/unit-test/index.tsx
  25. 6 2
      src/views/unit-test/model/drag-question/index.module.less
  26. 114 65
      src/views/unit-test/model/drag-question/index.tsx
  27. 3 0
      src/views/unit-test/model/keep-look-question/index.tsx
  28. 1 1
      src/views/unit-test/model/notice-start/index.tsx
  29. 7 7
      src/views/unit-test/unit-create/uni-last.tsx
  30. 1 1
      src/views/unit-test/unit-list/index.tsx
  31. 7 13
      src/views/unit-test/unit-list/unitDetail.tsx

+ 1 - 1
README.md

@@ -93,7 +93,7 @@ gyt/basic
 后台-课件
 gyt/courseware
 
-后台-单元测验-创建题目
+后台-阶段自测-创建题目
 question-bank
 
 群发消息

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


+ 56 - 0
package-lock.json

@@ -12,6 +12,7 @@
         "@vant/compat": "^1.0.0",
         "@vant/use": "^1.3.6",
         "@vueuse/core": "^8.4.1",
+        "animate.css": "^4.1.1",
         "browserslist": "^4.20.2",
         "classnames": "^2.3.1",
         "clean-deep": "^3.4.0",
@@ -31,10 +32,12 @@
         "qrcode.vue": "^3.3.3",
         "query-string": "^7.1.1",
         "sortablejs": "^1.15.0",
+        "swiper": "^9.0.5",
         "umi-request": "^1.4.0",
         "vant": "^4.0.0",
         "vconsole": "^3.15.0",
         "vue": "^3.2.26",
+        "vue-awesome-swiper": "^5.0.1",
         "vue-cropper": "^1.0.3",
         "vue-echarts": "^6.2.3",
         "vue-qr": "^4.0.9",
@@ -2767,6 +2770,11 @@
         "url": "https://github.com/sponsors/epoberezkin"
       }
     },
+    "node_modules/animate.css": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz",
+      "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
+    },
     "node_modules/ansi-colors": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz",
@@ -8544,6 +8552,11 @@
         "node": ">=6"
       }
     },
+    "node_modules/ssr-window": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-4.0.2.tgz",
+      "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ=="
+    },
     "node_modules/strict-uri-encode": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
@@ -8736,6 +8749,17 @@
       "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
       "dev": true
     },
+    "node_modules/swiper": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmmirror.com/swiper/-/swiper-9.0.5.tgz",
+      "integrity": "sha512-UiLQ5fvn8L3ZZpaPa+9oiwKwhVGQt5TVc0UuXxFKHyTQe8g2E3vbPMiMfIGb6NhNGj5ntsSDyyNgg4qVmWlJkQ==",
+      "dependencies": {
+        "ssr-window": "^4.0.2"
+      },
+      "engines": {
+        "node": ">= 4.7.0"
+      }
+    },
     "node_modules/systemjs": {
       "version": "6.12.1",
       "resolved": "https://registry.npmmirror.com/systemjs/-/systemjs-6.12.1.tgz",
@@ -9372,6 +9396,15 @@
         "@vue/shared": "3.2.26"
       }
     },
+    "node_modules/vue-awesome-swiper": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/vue-awesome-swiper/-/vue-awesome-swiper-5.0.1.tgz",
+      "integrity": "sha512-mWjFJzUqA4lG+DmsmibvMpoiBnl+IH2SSeiiQ3i5M0t1y9FknTxnGT0DsMb2YdJLgjYMEK3sYOWzqgLnZMH8Lg==",
+      "peerDependencies": {
+        "swiper": "^7.0.0  || ^8.0.0",
+        "vue": "3.x"
+      }
+    },
     "node_modules/vue-cropper": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/vue-cropper/-/vue-cropper-1.0.3.tgz",
@@ -11834,6 +11867,11 @@
         "uri-js": "^4.2.2"
       }
     },
+    "animate.css": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz",
+      "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
+    },
     "ansi-colors": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz",
@@ -15715,6 +15753,11 @@
       "resolved": "https://registry.npmmirror.com/split-on-first/-/split-on-first-1.1.0.tgz",
       "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="
     },
+    "ssr-window": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-4.0.2.tgz",
+      "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ=="
+    },
     "strict-uri-encode": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
@@ -15832,6 +15875,14 @@
       "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
       "dev": true
     },
+    "swiper": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmmirror.com/swiper/-/swiper-9.0.5.tgz",
+      "integrity": "sha512-UiLQ5fvn8L3ZZpaPa+9oiwKwhVGQt5TVc0UuXxFKHyTQe8g2E3vbPMiMfIGb6NhNGj5ntsSDyyNgg4qVmWlJkQ==",
+      "requires": {
+        "ssr-window": "^4.0.2"
+      }
+    },
     "systemjs": {
       "version": "6.12.1",
       "resolved": "https://registry.npmmirror.com/systemjs/-/systemjs-6.12.1.tgz",
@@ -16301,6 +16352,11 @@
         "@vue/shared": "3.2.26"
       }
     },
+    "vue-awesome-swiper": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/vue-awesome-swiper/-/vue-awesome-swiper-5.0.1.tgz",
+      "integrity": "sha512-mWjFJzUqA4lG+DmsmibvMpoiBnl+IH2SSeiiQ3i5M0t1y9FknTxnGT0DsMb2YdJLgjYMEK3sYOWzqgLnZMH8Lg=="
+    },
     "vue-cropper": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/vue-cropper/-/vue-cropper-1.0.3.tgz",

+ 3 - 0
package.json

@@ -24,6 +24,7 @@
     "@vant/compat": "^1.0.0",
     "@vant/use": "^1.3.6",
     "@vueuse/core": "^8.4.1",
+    "animate.css": "^4.1.1",
     "browserslist": "^4.20.2",
     "classnames": "^2.3.1",
     "clean-deep": "^3.4.0",
@@ -43,10 +44,12 @@
     "qrcode.vue": "^3.3.3",
     "query-string": "^7.1.1",
     "sortablejs": "^1.15.0",
+    "swiper": "^9.0.5",
     "umi-request": "^1.4.0",
     "vant": "^4.0.0",
     "vconsole": "^3.15.0",
     "vue": "^3.2.26",
+    "vue-awesome-swiper": "^5.0.1",
     "vue-cropper": "^1.0.3",
     "vue-echarts": "^6.2.3",
     "vue-qr": "^4.0.9",

+ 1 - 1
public/project/initiation.html

@@ -386,7 +386,7 @@
             this.canSignUp = orchestraDetail.data.data.status
             if (orchestraDetail.data.data.status !== 'INITIATION_SURVEY') {
               vant.showToast('乐团启蒙阶段已结束')
-              return
+              // return
             }
           }
         } catch {

+ 53 - 7
public/project/preRegister.html

@@ -224,9 +224,16 @@
       </van-cell-group>
 
       <van-cell-group inset class="cell-group">
-        <van-field label="选报声部" v-model="stu.registerSubjectId" readonly name="registerSubjectId"
-          :rules="[{ required: true, message: '请选择选报声部', trigger: 'onChange' }]" @click="pickerChange2"
-          placeholder="请选择选报声部">
+        <van-field label="首选声部" v-model="stu.registerSubjectId" readonly name="registerSubjectId"
+          :rules="[{ required: true, message: '请选择首选声部', trigger: 'onChange' }]" @click="pickerChange2"
+          placeholder="请选择首选声部">
+          <template #right-icon>
+            <van-icon name="arrow" :color="'#323233'" size="16"></van-icon>
+          </template>
+        </van-field>
+        <van-field label="次选声部" v-model="stu.standbyRegisterSubjectId" readonly name="standbyRegisterSubjectId"
+          :rules="[{ required: true, message: '请选择次选声部', trigger: 'onChange' }]" @click="pickerChange3"
+          placeholder="请选择次选声部">
           <template #right-icon>
             <van-icon name="arrow" :color="'#323233'" size="16"></van-icon>
           </template>
@@ -287,6 +294,10 @@
       <van-picker show-toolbar :columns="subjectList" @cancel="subjectPicker = false" @confirm="onConfirmSubject" />
     </van-popup>
 
+    <van-popup v-model:show="subjectPicker2" position="bottom" round>
+      <van-picker show-toolbar :columns="subjectList" @cancel="subjectPicker2 = false" @confirm="onConfirmSubject2" />
+    </van-popup>
+
     <van-popup v-model:show="submitStatus" round style="width: 100%;background-color: transparent;"
       :close-on-click-overlay="false">
       <div class="submit-container">
@@ -324,7 +335,9 @@
           schoolId: null,
           showPicker: false,
           classPicker: false,
+          subjectPickerType: 'first',
           subjectPicker: false,
+          subjectPicker2: false,
           submitStatus: false,
           pattern: /^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-7]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/,
           nameReg: /^[\u4E00-\u9FA5]+$/,
@@ -347,9 +360,11 @@
             currentGradeNum: null, // 年级编号
             currentClass: '', // 班级
             currentClassNum: null, // 年级编号
-            registerSubjectId: '',
+            registerSubjectId: '', // 首选声部
             registerSubjectNum: null, // 所在声部
-            instrumentsPrepareMode: null,
+            standbyRegisterSubjectId: '', // 次选声部
+            standbyRegisterSubjectNum: '', // 次选声部
+            instrumentsPrepareMode: 'GROUP_PURCHASE',
             learningSystemPrepareMode: 'GROUP_PURCHASE',
           },
           btnLoading: false,
@@ -403,7 +418,7 @@
             this.canSignUp = orchestraDetail.data.data.status
             if (orchestraDetail.data.data.status !== 'PRE_REGISTER') {
               vant.showToast('乐团预报名阶段已结束')
-              return
+              // return
             }
           }
 
@@ -478,6 +493,7 @@
               var grade = this.currentGrade.find(item => item.value == detail.currentGrade)
               var cls = this.classList.find(item => item.value == detail.currentClass)
               var subjects = this.subjectList.find(item => item.value == detail.registerSubjectId)
+              var subjects2 = this.subjectList.find(item => item.value == detail.standbyRegisterSubjectId)
               this.stu = {
                 username: detail.username, // 姓名
                 sex: detail.sex ? 1 : 0, // 性别
@@ -488,6 +504,8 @@
                 currentClassNum: detail.currentClass, // 年级编号
                 registerSubjectId: subjects.text, //
                 registerSubjectNum: detail.registerSubjectId, //
+                standbyRegisterSubjectId: subjects2.text,
+                standbyRegisterSubjectNum: detail.standbyRegisterSubjectId,
                 instrumentsPrepareMode: detail.instrumentsPrepareMode,
                 learningSystemPrepareMode: detail.learningSystemPrepareMode,
               }
@@ -547,6 +565,7 @@
               currentClass: stu.currentClassNum,
               currentGrade: stu.currentGradeNum,
               registerSubjectId: stu.registerSubjectNum,
+              standbyRegisterSubjectId: stu.standbyRegisterSubjectNum,
               code: this.code
             })
             if (res.data.code === 200) {
@@ -580,7 +599,29 @@
           this.classPicker = true
         },
         pickerChange2(type) {
+          let tempId = this.stu.standbyRegisterSubjectNum
+          this.subjectList.forEach((item) => {
+            if (item.value == tempId) {
+              item.disabled = true
+            } else {
+              item.disabled = false
+            }
+          })
+
           this.subjectPicker = true
+
+        },
+        pickerChange3() {
+          let tempId = this.stu.registerSubjectNum
+          this.subjectList.forEach((item) => {
+            if (item.value == tempId) {
+              item.disabled = true
+            } else {
+              item.disabled = false
+            }
+          })
+
+          this.subjectPicker2 = true
         },
         onConfirm(options) {
           var stu = this.stu
@@ -598,8 +639,13 @@
           var stu = this.stu
           stu.registerSubjectId = options.selectedOptions[0].text
           stu.registerSubjectNum = options.selectedOptions[0].value
-
           this.subjectPicker = false
+        },
+        onConfirmSubject2(options) {
+          var stu = this.stu
+          stu.standbyRegisterSubjectId = options.selectedOptions[0].text
+          stu.standbyRegisterSubjectNum = options.selectedOptions[0].value
+          this.subjectPicker2 = false
         }
       }
     })

+ 9 - 1
src/router/routes-common.ts

@@ -96,7 +96,7 @@ export const router: RouteRecordRaw[] = [
     name: 'unit-test',
     component: () => import('@/views/unit-test'),
     meta: {
-      title: '单元测验'
+      title: '阶段自测'
     }
   },
   {
@@ -148,6 +148,14 @@ export const router: RouteRecordRaw[] = [
     }
   },
   {
+    path: '/mine-myphoto',
+    name: 'mine-myphoto',
+    component: () => import('@/views/mine-orchestra/my-photo'),
+    meta: {
+      title: '乐团剪影'
+    }
+  },
+  {
     path: '/photo-list',
     name: 'photo-list',
     component: () => import('@/views/mine-orchestra/photo-list/index'),

+ 9 - 1
src/router/routes-school.ts

@@ -78,6 +78,14 @@ export default [
         }
       },
       {
+        path: '/school-photo',
+        name: 'school-photo',
+        component: () => import('@/school/orchestra/compontent/photo'),
+        meta: {
+          title: '乐团剪影'
+        }
+      },
+      {
         path: '/photo-detail',
         name: 'photo-detail',
         component: () => import('@/school/orchestra/compontent/photo-detail'),
@@ -355,7 +363,7 @@ export default [
         name: 'unit-list',
         component: () => import('@/views/unit-test/unit-list/index'),
         meta: {
-          title: '单元测验'
+          title: '阶段自测'
         }
       },
       {

+ 3 - 3
src/router/routes-teacher.ts

@@ -84,7 +84,7 @@ export default [
         name: 'unit-list',
         component: () => import('@/views/unit-test/unit-list/index'),
         meta: {
-          title: '单元测验'
+          title: '阶段自测'
         }
       },
       {
@@ -116,7 +116,7 @@ export default [
         name: 'uni-last',
         component: () => import('@/views/unit-test/unit-create/uni-last'),
         meta: {
-          title: '单元测验'
+          title: '阶段自测'
         }
       },
       {
@@ -128,7 +128,7 @@ export default [
         }
       }
 
-      //unitDetail 选择单元测验
+      //unitDetail 选择阶段自测
     ]
   },
   ...rootRouter,

+ 17 - 0
src/school/approval-manage/batch-adjust.tsx

@@ -19,6 +19,7 @@ import {
   Popup,
   Radio,
   RadioGroup,
+  showToast,
   Tag
 } from 'vant'
 import { defineComponent, onMounted, reactive } from 'vue'
@@ -62,6 +63,22 @@ export default defineComponent({
 
     const onSubmit = async () => {
       try {
+        if (forms.classGroupIdList.length <= 0) {
+          showToast('请选择班级')
+          return
+        }
+        if (!forms.startTime.join('-')) {
+          showToast('请选择课程开始日期')
+          return
+        }
+        if (!forms.endTime.join('-')) {
+          showToast('请选择课程结束日期')
+          return
+        }
+        if (!forms.adjustDay) {
+          showToast('请输入调整天数')
+          return
+        }
         form.submitLoading = true
         const res = await request.post('/api-school/courseSchedule/batchAdjust', {
           hideLoading: true,

+ 1 - 0
src/school/orchestra/compontent/photo.module.less

@@ -1,4 +1,5 @@
 .phone {
+  overflow: hidden;
   padding: 0 13px 0;
 }
 .addPhone {

+ 2 - 2
src/school/orchestra/orchestra-detail.tsx

@@ -53,14 +53,14 @@ export default defineComponent({
           <Tabs sticky lineWidth={20} lineHeight={4} v-model:active={tabValue.value}>
             <Tab title="乐团信息" name="information"></Tab>
             <Tab title="训练进度" name="plan"></Tab>
-            <Tab title="训练照片" name="photo"></Tab>
+            {/* <Tab title="训练照片" name="photo"></Tab> */}
             {/* <Tab title="乐团资讯" name="info"></Tab> */}
           </Tabs>
         </OSticky>
 
         {tabValue.value === 'information' && <Information termTimes={termTimes.value} />}
         {tabValue.value === 'plan' && <Plan height={tabHeight.value} termTimes={termTimes.value} />}
-        {tabValue.value === 'photo' && <Photo height={tabHeight.value} />}
+        {/* {tabValue.value === 'photo' && <Photo height={tabHeight.value} />} */}
       </div>
     )
   }

+ 1 - 1
src/student/download/transfer.tsx

@@ -21,7 +21,7 @@ export default defineComponent({
     const { origin, pathname } = location
     let tempPathname = pathname
     let beforeIos = 'BandMusicTeam://linkUrl='
-    let beforeAndroid = 'colexiustudent://html:8888/SplashActivity?url='
+    let beforeAndroid = 'orchestrastudent://html:8888/SplashActivity?url='
 
     if (pn === 's') {
       tempPathname = '/orchestra-student/'

+ 51 - 51
src/student/music-group/pre-apply/component/payment.tsx

@@ -385,26 +385,21 @@ export default defineComponent({
             </>
           )}
 
-          {/* 判断是否已经购买教材 */}
-          {!state.paymentOrderDetails.includes('TEXTBOOK') && (
+          {!state.paymentOrderDetails.includes('VIP') && (
             <>
-              {/* <div class={styles.applyTitle}>教材</div> */}
+              {/* <div class={styles.applyTitle}>乐团学习系统</div> */}
               <CellGroup
                 inset
                 class={[styles.mlr13, styles.sectionCell]}
-                onClick={() => {
-                  return
-                  // onSelect(state.textBookInfo.goodsId)
-                }}
+                onClick={() => onSelect(state.vipInfo.goodsId)}
               >
                 <Cell border={false}>
                   {{
                     icon: () => (
                       <Checkbox
-                        name={state.textBookInfo.goodsId}
-                        disabled
+                        name={state.vipInfo.goodsId}
                         class={styles.checkbox}
-                        ref={(el: any) => (state.checkboxRefs[state.textBookInfo.goodsId] = el)}
+                        ref={(el: any) => (state.checkboxRefs[state.vipInfo.goodsId] = el)}
                         onClick={(e: Event) => {
                           e.stopPropagation()
                         }}
@@ -422,36 +417,30 @@ export default defineComponent({
                       <div class={styles.section}>
                         <Image
                           class={styles.img}
-                          src={state.textBookInfo.goodsUrl}
+                          src={state.vipInfo.goodsUrl}
                           onClick={(e: any) => {
                             e.stopPropagation()
-                            state.selectGoodsId = state.textBookInfo.goodsId
-                            state.currentPrice = state.textBookInfo.currentPrice
-                            state.selectGoodsInfo = {}
-                            state.goodsStatus = true
+                            state.memberBaoStatus = true
                           }}
                         />
                         <div class={styles.sectionContent}>
                           <h2
                             onClick={(e: any) => {
                               e.stopPropagation()
-                              state.selectGoodsId = state.textBookInfo.goodsId
-                              state.currentPrice = state.textBookInfo.currentPrice
-                              state.selectGoodsInfo = {}
-                              state.goodsStatus = true
+                              state.memberBaoStatus = true
                             }}
                           >
-                            {state.textBookInfo.goodsName}
+                            {state.vipInfo.goodsName}
                           </h2>
                           <Tag
                             color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
                             textColor="#fff"
                             class={styles.brandName}
                           >
-                            {state.textBookInfo.brandName}
+                            6个月
                           </Tag>
                           <p class={[styles.model, 'van-multi-ellipsis--l2']}>
-                            {state.textBookInfo.description}
+                            {state.vipInfo.description}
                           </p>
                         </div>
                       </div>
@@ -465,25 +454,15 @@ export default defineComponent({
                         <div class={styles.sectionPrice}>
                           <p class={styles.price}>
                             团购价:
-                            <span
-                              class={[
-                                state.textBookInfo.currentPrice > 0 ? styles.numFont : styles.free
-                              ]}
-                            >
-                              {state.textBookInfo.currentPrice > 0 ? (
-                                <>
-                                  <span class={styles.numPrefix}>¥</span>
-                                  {moneyFormat(state.textBookInfo.currentPrice)}
-                                </>
-                              ) : (
-                                '免费'
-                              )}
+                            <span class={styles.numFont}>
+                              <span class={styles.numPrefix}>¥</span>
+                              {moneyFormat(state.vipInfo.currentPrice)}
                             </span>
                           </p>
                           <p class={styles.originPrice}>
                             原价:
                             <del class={styles.numFont}>
-                              ¥{moneyFormat(state.textBookInfo.originalPrice)}
+                              ¥{moneyFormat(state.vipInfo.originalPrice)}
                             </del>
                           </p>
                         </div>
@@ -495,21 +474,26 @@ export default defineComponent({
             </>
           )}
 
-          {!state.paymentOrderDetails.includes('VIP') && (
+          {/* 判断是否已经购买教材 */}
+          {!state.paymentOrderDetails.includes('TEXTBOOK') && (
             <>
-              {/* <div class={styles.applyTitle}>乐团学习系统</div> */}
+              {/* <div class={styles.applyTitle}>教材</div> */}
               <CellGroup
                 inset
                 class={[styles.mlr13, styles.sectionCell]}
-                onClick={() => onSelect(state.vipInfo.goodsId)}
+                onClick={() => {
+                  return
+                  // onSelect(state.textBookInfo.goodsId)
+                }}
               >
                 <Cell border={false}>
                   {{
                     icon: () => (
                       <Checkbox
-                        name={state.vipInfo.goodsId}
+                        name={state.textBookInfo.goodsId}
+                        disabled
                         class={styles.checkbox}
-                        ref={(el: any) => (state.checkboxRefs[state.vipInfo.goodsId] = el)}
+                        ref={(el: any) => (state.checkboxRefs[state.textBookInfo.goodsId] = el)}
                         onClick={(e: Event) => {
                           e.stopPropagation()
                         }}
@@ -527,30 +511,36 @@ export default defineComponent({
                       <div class={styles.section}>
                         <Image
                           class={styles.img}
-                          src={state.vipInfo.goodsUrl}
+                          src={state.textBookInfo.goodsUrl}
                           onClick={(e: any) => {
                             e.stopPropagation()
-                            state.memberBaoStatus = true
+                            state.selectGoodsId = state.textBookInfo.goodsId
+                            state.currentPrice = state.textBookInfo.currentPrice
+                            state.selectGoodsInfo = {}
+                            state.goodsStatus = true
                           }}
                         />
                         <div class={styles.sectionContent}>
                           <h2
                             onClick={(e: any) => {
                               e.stopPropagation()
-                              state.memberBaoStatus = true
+                              state.selectGoodsId = state.textBookInfo.goodsId
+                              state.currentPrice = state.textBookInfo.currentPrice
+                              state.selectGoodsInfo = {}
+                              state.goodsStatus = true
                             }}
                           >
-                            {state.vipInfo.goodsName}
+                            {state.textBookInfo.goodsName}
                           </h2>
                           <Tag
                             color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
                             textColor="#fff"
                             class={styles.brandName}
                           >
-                            6个月
+                            {state.textBookInfo.brandName}
                           </Tag>
                           <p class={[styles.model, 'van-multi-ellipsis--l2']}>
-                            {state.vipInfo.description}
+                            {state.textBookInfo.description}
                           </p>
                         </div>
                       </div>
@@ -564,15 +554,25 @@ export default defineComponent({
                         <div class={styles.sectionPrice}>
                           <p class={styles.price}>
                             团购价:
-                            <span class={styles.numFont}>
-                              <span class={styles.numPrefix}>¥</span>
-                              {moneyFormat(state.vipInfo.currentPrice)}
+                            <span
+                              class={[
+                                state.textBookInfo.currentPrice > 0 ? styles.numFont : styles.free
+                              ]}
+                            >
+                              {state.textBookInfo.currentPrice > 0 ? (
+                                <>
+                                  <span class={styles.numPrefix}>¥</span>
+                                  {moneyFormat(state.textBookInfo.currentPrice)}
+                                </>
+                              ) : (
+                                '免费'
+                              )}
                             </span>
                           </p>
                           <p class={styles.originPrice}>
                             原价:
                             <del class={styles.numFont}>
-                              ¥{moneyFormat(state.vipInfo.originalPrice)}
+                              ¥{moneyFormat(state.textBookInfo.originalPrice)}
                             </del>
                           </p>
                         </div>

+ 54 - 80
src/views/accompany/music-list.tsx

@@ -58,18 +58,7 @@ export default defineComponent({
           state.platformApi + '/musicSheetCategories/queryTree?enable=true'
         )
         if (Array.isArray(res?.data)) {
-          data.musicTree = res.data.map((n: any, index: number) => {
-            return {
-              ...n,
-              id: n.id,
-              icon: n.coverImg,
-              btnIcon: getImage('b2.svg'),
-              color: '#9881FF',
-              title: n.name,
-              subtitle: '',
-              btnText: 'GO >'
-            }
-          })
+          data.musicTree = res.data
         }
         getList()
       } catch (error) {
@@ -85,7 +74,6 @@ export default defineComponent({
     }
     const option1 = computed(() => {
       const v1: any = data.musicTree.find((n: any) => n.id == route.query.categorieid)
-      //   console.log('🚀 ~ v1', v1)
       if (Array.isArray(v1?.musicSheetCategoriesList)) {
         const list = v1.musicSheetCategoriesList.map((m: any) => {
           if (!data.value1) {
@@ -102,8 +90,7 @@ export default defineComponent({
       return []
     })
     const option2 = computed(() => {
-      const v1: any = props.musicTree.find((n: any) => n.id == route.query.categorieid)
-      //   console.log('🚀 ~ v1', v1)
+      const v1: any = data.musicTree.find((n: any) => n.id == route.query.categorieid)
       if (Array.isArray(v1?.musicSheetCategoriesList)) {
         const v2: any = v1.musicSheetCategoriesList.find((n: any) => n.id == data.value1)
         if (Array.isArray(v2?.musicSheetCategoriesList)) {
@@ -131,7 +118,7 @@ export default defineComponent({
             keyword: data.keyword,
             musicSheetCategoriesId: data.value2 || data.value1
           },
-          hideLoading: false
+          hideLoading: true
         })
         if (Array.isArray(res?.data?.rows)) {
           data.list = [].concat(data.list, res.data.rows)
@@ -146,22 +133,11 @@ export default defineComponent({
       data.loading = false
       data.refreshing = false
     }
-    const onRefresh = () => {
-      console.log('下拉刷新')
-      // 清空列表数据
-      data.pagenation.page = 1
-      data.finished = false
-      data.loading = false
-      data.list = []
-      // 重新加载数据
-      getList()
-    }
     // 重置搜索
     const onSearch = () => {
       data.pagenation.page = 1
       data.list = []
       data.finished = false
-      data.loading = false
       data.list = []
       getList()
     }
@@ -170,29 +146,29 @@ export default defineComponent({
       // 学生端验证
       if (state.platformType == 'STUDENT') {
         //学生有待激活会员
-      if (!userInfo.value.membershipDays && userInfo.value.purchaseMemberRecord) {
-        showConfirmDialog({
-          message: '您的团练宝暂未激活,请激活后使用'
-        }).then(() => {
-          router.push({
-            path: '/memberCenter'
+        if (!userInfo.value.membershipDays && userInfo.value.purchaseMemberRecord) {
+          showConfirmDialog({
+            message: '您的团练宝暂未激活,请激活后使用'
+          }).then(() => {
+            router.push({
+              path: '/memberCenter'
+            })
           })
-        })
-        return
-      }
-      //学生没有会员
-      if (!userInfo.value.vipMember) {
-        showConfirmDialog({
-          message: '您暂未开通团练宝,请开通后使用'
-        }).then(() => {
-          router.push({
-            path: '/memberCenter'
+          return
+        }
+        //学生没有会员
+        if (!userInfo.value.vipMember) {
+          showConfirmDialog({
+            message: '您暂未开通团练宝,请开通后使用'
+          }).then(() => {
+            router.push({
+              path: '/memberCenter'
+            })
           })
-        })
-        return
-      }
+          return
+        }
       }
-      
+
       let src = `${location.origin}/orchestra-music-score/?id=${item.id}`
       console.log('🚀 ~ 去云教练的src', src)
       postMessage({
@@ -268,41 +244,39 @@ export default defineComponent({
         </OSticky>
         <OFullRefresh
           v-model:modelValue={data.refreshing}
-          onRefresh={onRefresh}
+          onRefresh={onSearch}
           style="min-height: calc(100vh - var(--header-height))"
         >
-          {!!data.list.length && (
-            <List
-              loading-text=" "
-              immediateCheck={false}
-              loading={data.loading}
-              v-model:finished={data.finished}
-              finishedText="没有更多了"
-              onLoad={() => {
-                getList()
-              }}
-            >
-              <CellGroup inset>
-                {data.list.map((item: any) => {
-                  return (
-                    <Cell
-                      size="large"
-                      center
-                      title={item.musicSheetName}
-                      isLink
-                      onClick={() => openView(item)}
-                    >
-                      {{
-                        icon: () => (
-                          <Icon style={{ marginRight: '12px' }} size={40} name={imgDefault} />
-                        )
-                      }}
-                    </Cell>
-                  )
-                })}
-              </CellGroup>
-            </List>
-          )}
+          <List
+            loading-text=" "
+            immediateCheck={false}
+            loading={data.loading}
+            v-model:finished={data.finished}
+            finishedText="没有更多了"
+            onLoad={() => {
+              getList()
+            }}
+          >
+            <CellGroup inset>
+              {data.list.map((item: any) => {
+                return (
+                  <Cell
+                    size="large"
+                    center
+                    title={item.musicSheetName}
+                    isLink
+                    onClick={() => openView(item)}
+                  >
+                    {{
+                      icon: () => (
+                        <Icon style={{ marginRight: '12px' }} size={40} name={imgDefault} />
+                      )
+                    }}
+                  </Cell>
+                )
+              })}
+            </CellGroup>
+          </List>
           {!data.loading && !data.list.length && <OEmpty tips="暂无曲谱" />}
         </OFullRefresh>
       </div>

+ 16 - 2
src/views/adapay/payment/index.module.less

@@ -59,7 +59,7 @@
       color: #000000;
       span {
         font-size: 18px;
-        padding-left: 3px;
+        // padding-right: 3px;
       }
     }
   }
@@ -69,8 +69,22 @@
     // background-color: #f6f8f9;
   }
 
+  .payTypeRe {
+    display: flex;
+    align-items: center;
+  }
+  .recommend {
+    margin-left: 5px;
+    background: linear-gradient(122deg, #ffa371 0%, #ff6b3b 100%);
+    border-radius: 10px;
+    font-size: 12px;
+    color: #ffffff;
+    line-height: 16px;
+    padding: 0 5px;
+  }
+
   .payBtn {
-    width: 80% !important;
+    width: 90% !important;
     margin: 0 auto;
     font-size: 16px;
     font-weight: 600;

+ 11 - 6
src/views/adapay/payment/index.tsx

@@ -77,20 +77,19 @@ export default defineComponent({
     return () => (
       <div class={styles.payment}>
         <Icon onClick={onClose} name="cross" size={20} />
-        <div class={[styles.title, 'van-hairline--bottom']}>选择支付方式</div>
+        <div class={[styles.title]}>选择支付方式</div>
 
         <div class={styles.payAmount}>
           <p>应付金额</p>
           <div class={styles.amount}>
+            <span>¥</span>
             {moneyFormat(props.paymentConfig.currentPrice)}
-            <span>元</span>
           </div>
         </div>
         <RadioGroup v-model={state.payType}>
           <CellGroup border={false}>
             <Cell
-              title="微信支付"
-              border={false}
+              border={true}
               center
               onClick={() => {
                 // wx_lite
@@ -98,12 +97,18 @@ export default defineComponent({
               }}
               v-slots={{
                 icon: () => <Icon name="wechat-pay" color="#15c434" size={22} />,
-                'right-icon': () => <Radio name="wx" />
+                'right-icon': () => <Radio name="wx" />,
+                title: () => (
+                  <div class={styles.payTypeRe}>
+                    微信支付 <span class={styles.recommend}>推荐</span>
+                  </div>
+                )
               }}
             ></Cell>
             <Cell
               title="支付宝支付"
-              border={false}
+              border={true}
+              // class="van-hairline--bottom"
               center
               onClick={() => {
                 // alipay

+ 61 - 5
src/views/coursewarePlay/index.module.less

@@ -3,6 +3,15 @@
   height: 100vh;
   background-color: #000;
   overflow: hidden;
+
+  // :global {
+  //   // 更改动画样式
+  //   .van-swipe__track {
+  //     height: 100% !important;
+  //     transform: translateY(0px) !important;
+  //     position: relative;
+  //   }
+  // }
 }
 .coursewarePlay {
   position: relative;
@@ -75,6 +84,7 @@
   position: relative;
   width: 100%;
   height: 100%;
+  background-color: #000;
   video {
     width: 100%;
     height: 100%;
@@ -243,7 +253,7 @@
     width: 5px;
     height: 5px;
     background: #ff4e19;
-    border: .5px solid #ffffff;
+    border: 0.5px solid #ffffff;
     border-radius: 50%;
     margin-right: 3px;
     animation: loadFade 1s ease-in-out infinite;
@@ -251,13 +261,59 @@
 }
 
 @keyframes loadFade {
-  0%{
+  0% {
     opacity: 0;
   }
-  50%{
-    opacity: .5;
+  50% {
+    opacity: 0.5;
   }
-  100%{
+  100% {
     opacity: 1;
   }
 }
+
+/* ----------------------------------------------
+ * Generated by Animista on 2023-2-13 18:55:56
+ * Licensed under FreeBSD License.
+ * See http://animista.net/license for more info. 
+ * w: http://animista.net, t: @cssanimista
+ * ---------------------------------------------- */
+
+/**
+ * ----------------------------------------
+ * animation rotate-vert-right
+ * ----------------------------------------
+ */
+@-webkit-keyframes rotate-vert-right {
+  0% {
+    -webkit-transform: rotateY(0);
+    transform: rotateY(0);
+    -webkit-transform-origin: right;
+    transform-origin: right;
+  }
+  100% {
+    -webkit-transform: rotateY(-360deg);
+    transform: rotateY(-360deg);
+    -webkit-transform-origin: right;
+    transform-origin: right;
+  }
+}
+@keyframes rotate-vert-right {
+  0% {
+    -webkit-transform: rotateY(0);
+    transform: rotateY(0);
+    -webkit-transform-origin: right;
+    transform-origin: right;
+  }
+  100% {
+    -webkit-transform: rotateY(-360deg);
+    transform: rotateY(-360deg);
+    -webkit-transform-origin: right;
+    transform-origin: right;
+  }
+}
+
+.rotate-vert-right {
+  -webkit-animation: rotate-vert-right 0.5s cubic-bezier(0.645, 0.045, 0.355, 1) both;
+  animation: rotate-vert-right 0.5s cubic-bezier(0.645, 0.045, 0.355, 1) both;
+}

+ 319 - 184
src/views/coursewarePlay/index.tsx

@@ -17,7 +17,8 @@ import {
   onUnmounted,
   ref,
   watch,
-  Transition
+  Transition,
+  TransitionGroup
 } from 'vue'
 import iconBack from './image/back.svg'
 import styles from './index.module.less'
@@ -40,10 +41,17 @@ import Points from './component/points'
 import { browser, getSecondRPM } from '@/helpers/utils'
 import { Vue3Lottie } from 'vue3-lottie'
 import playLoadData from './datas/data.json'
-import { usePageVisibility } from '@vant/use'
+import { usePageVisibility, useRect } from '@vant/use'
 import PlayRecordTime from './playRecordTime'
 import dayjs from 'dayjs'
 
+import { Pagination, Navigation, EffectFade, EffectFlip, EffectCreative, Lazy } from 'swiper'
+import { Swiper, SwiperSlide } from 'swiper/vue'
+import 'swiper/less'
+import 'swiper/less/effect-fade'
+import 'swiper/less/effect-flip'
+import 'swiper/less/effect-creative'
+
 export default defineComponent({
   name: 'CoursewarePlay',
   setup() {
@@ -169,7 +177,7 @@ export default defineComponent({
         if (res?.data) {
           data.isCourse =
             res.data.status === 'ING' && state.platformType == 'TEACHER' ? true : false
-          data.isRecordPlay = Date.now() > dayjs(res.data.startTime).valueOf()
+          // data.isRecordPlay = Date.now() > dayjs(res.data.startTime).valueOf()
         }
       } catch (e) {
         console.log(e)
@@ -290,6 +298,7 @@ export default defineComponent({
       }
     }
 
+    const swiperDom = ref()
     onMounted(() => {
       getDetail()
       getCourseSchedule()
@@ -347,9 +356,10 @@ export default defineComponent({
     const toggleMaterial = () => {
       const index = data.itemList.findIndex((n: any) => n.id == popupData.itemActive)
       if (index > -1) {
-        swipeRef.value?.swipeTo(index, {
-          immediate: true
-        })
+        // swipeRef.value?.swipeTo(index, {
+        //   immediate: true
+        // })
+        swiperDom.value?.slideTo(index, 1000)
       }
     }
     /** 延迟收起模态框 */
@@ -389,14 +399,6 @@ export default defineComponent({
         }
       }
     }
-    // 上一个知识点, 下一个知识点
-    const handlePreAndNext = (type: string) => {
-      if (type === 'up') {
-        swipeRef.value?.prev()
-      } else {
-        swipeRef.value?.next()
-      }
-    }
 
     // 去点名,签退
     const gotoRollCall = (pageTag: string) => {
@@ -452,187 +454,325 @@ export default defineComponent({
     const handleEnded = (m: any) => {
       // console.log(m)
       if (popupData.activeIndex != data.itemList.length - 1) {
-        swipeRef.value?.next()
+        swiperDom.value.slideNext(800)
+
+        // setTimeout(() => {
+        // swipeRef.value?.next()
+        // ;(document.querySelector('.swiper-button-next') as any)?.click()
+        // swiperDom.value.navigation.nextEl.click()
+        // swiperDom.value.slideNext(800)
+        // }, 300)
+      }
+    }
+
+    const effects = [
+      {
+        prev: {
+          shadow: true,
+          translate: [0, 0, -400]
+        },
+        next: {
+          translate: ['100%', 0, 0]
+        }
+      },
+      {
+        prev: {
+          shadow: true,
+          translate: ['-120%', 0, -500]
+        },
+        next: {
+          shadow: true,
+          translate: ['120%', 0, -500]
+        }
+      },
+      {
+        prev: {
+          shadow: true,
+          translate: ['-20%', 0, -1]
+        },
+        next: {
+          translate: ['100%', 0, 0]
+        }
+      },
+      {
+        prev: {
+          shadow: true,
+          translate: [0, 0, -800],
+          rotate: [180, 0, 0]
+        },
+        next: {
+          shadow: true,
+          translate: [0, 0, -800],
+          rotate: [-180, 0, 0]
+        }
+      },
+      {
+        prev: {
+          shadow: true,
+          translate: ['-125%', 0, -800],
+          rotate: [0, 0, -90]
+        },
+        next: {
+          shadow: true,
+          translate: ['125%', 0, -800],
+          rotate: [0, 0, 90]
+        }
+      },
+      {
+        prev: {
+          shadow: true,
+          origin: 'right center',
+          translate: ['5%', 0, -200],
+          rotate: [0, -100, 0]
+        },
+        next: {
+          origin: 'left center',
+          translate: ['-5%', 0, -200],
+          rotate: [0, 100, 0]
+        }
+      },
+      {
+        prev: {
+          scale: 0.3,
+          opacity: 0.4
+        },
+        next: {
+          opacity: 0.4,
+          scale: 0.3
+        }
       }
+    ]
+    const swiperType = ref(effects[2])
+    // 上一个知识点, 下一个知识点
+    const handlePreAndNext = (type: string) => {
+      setTimeout(() => {
+        if (type === 'up') {
+          // swiperRef.value?.allowSlidePrev()
+
+          // ;(document.querySelector('.swiper-button-prev') as any)?.click()
+          // swiperDom.value.navigation.prevEl.click()
+          swiperDom.value.slidePrev(800)
+        } else {
+          // swiperRef.value?.allowSlideNext()
+
+          // ;(document.querySelector('.swiper-button-next') as any)?.click()
+          // swiperDom.value.navigation.nextEl.click()
+          // const nextKonwledgeId = data.itemList[popupData.activeIndex + 1].knowledgePointId
+          // console.log(nextKonwledgeId === popupData.tabActive)
+          // if (nextKonwledgeId === popupData.tabActive) {
+          //   swiperType.value = effects[2]
+          // } else {
+          //   swiperType.value = effects[3]
+          // }
+
+          swiperDom.value.slideNext(800)
+        }
+      }, 400)
     }
 
     return () => (
       <div class={styles.playContent}>
         <div class={styles.coursewarePlay} style={{ width: parentContainer.width }}>
-          <Swipe
+          {/* <swiper :modules="modules" :pagination="{ clickable: true }">
+    <swiper-slide>Slide 1</swiper-slide>
+    <swiper-slide>Slide 2</swiper-slide>
+    <swiper-slide>Slide 3</swiper-slide>
+  </swiper> */}
+
+          {/* 
+            知识点 翻
+            素材滑
+          */}
+          <Swiper
             style={{ height: '100%' }}
-            ref={swipeRef}
-            showIndicators={false}
-            loop={false}
-            duration={0}
-            vertical
-            lazyRender={true}
-            touchable={false}
-            initialSwipe={popupData.firstIndex}
-            onChange={handleSwipeChange}
+            effect="creative"
+            modules={[Pagination, Navigation, EffectFade, EffectFlip, EffectCreative]}
+            creativeEffect={swiperType.value}
+            direction="vertical"
+            navigation
+            allowTouchMove={false}
+            onSwiper={(swiper: any) => {
+              // console.log(swiper, 'index')
+              swiperDom.value = swiper
+            }}
+            onSlideChange={(swiper: any) => {
+              // console.log(swiper, 'index')
+              handleSwipeChange(swiper.activeIndex)
+            }}
           >
             {data.itemList.map((m: any, mIndex: number) => {
               return (
-                <SwipeItem class={styles.swipeItem}>
-                  <>
-                    <div
-                      class={styles.itemDiv}
-                      onClick={() => {
-                        clearTimeout(activeData.timer)
-                        if (Date.now() - activeData.nowTime < 300) {
-                          handleDbClick(m)
-                          return
-                        }
-                        activeData.nowTime = Date.now()
-                        activeData.timer = setTimeout(() => {
-                          activeData.model = !activeData.model
-                          setModelOpen()
-                        }, 300)
-                      }}
-                    >
-                      {m.type === 'VIDEO' ? (
-                        <>
-                          <video
-                            playsinline="false"
-                            muted={m.muted}
-                            preload="auto"
-                            class="player"
-                            data-vid={m.id}
-                            src={m.content}
-                            loop={m.loop}
-                            autoplay={m.autoPlay}
-                            onLoadedmetadata={(e: Event) => {
-                              const videoEle = e.target as unknown as HTMLVideoElement
-                              m.currentTime = videoEle.currentTime
-                              m.duration = videoEle.duration
-                              m.videoEle = videoEle
-                              m.isprepare = true
-                            }}
-                            onTimeupdate={(e: Event) => {
-                              if (!m.isprepare) return
-                              const videoEle = e.target as unknown as HTMLVideoElement
-                              m.currentTime = videoEle.currentTime
-                              m.progress = Number((videoEle.currentTime / m.duration) * 100)
-                            }}
-                            onPlay={() => {
-                              // 播放
-                              m.paused = false
-                              console.log('播放')
-                              setModelOpen()
-                              // 第一次播放
-                              if (m.muted) {
-                                m.muted = false
-                                m.autoPlay = false
-                              }
-                            }}
-                            onPause={() => {
-                              //暂停
-                              clearTimeout(activeData.timer)
-                              m.paused = true
-                            }}
-                            onEnded={() => handleEnded(m)}
-                          >
-                            <source src={m.content} type="video/mp4" />
-                          </video>
-                          {m.muted && (
-                            <div class={styles.loadWrap}>
-                              <Vue3Lottie animationData={playLoadData}></Vue3Lottie>
+                <SwiperSlide class={styles.swipeItem}>
+                  <div
+                    // class={[styles.itemDiv]}
+
+                    class={[styles.itemDiv]}
+                    onClick={() => {
+                      clearTimeout(activeData.timer)
+                      if (Date.now() - activeData.nowTime < 300) {
+                        handleDbClick(m)
+                        return
+                      }
+                      activeData.nowTime = Date.now()
+                      activeData.timer = setTimeout(() => {
+                        activeData.model = !activeData.model
+                        setModelOpen()
+                      }, 300)
+                    }}
+                  >
+                    {m.type === 'VIDEO' ? (
+                      <>
+                        <video
+                          class={['player']}
+                          playsinline="false"
+                          muted={m.muted}
+                          preload="auto"
+                          // class="player"
+                          data-vid={m.id}
+                          src={m.content}
+                          loop={m.loop}
+                          autoplay={m.autoPlay}
+                          onLoadedmetadata={(e: Event) => {
+                            const videoEle = e.target as unknown as HTMLVideoElement
+                            m.currentTime = videoEle.currentTime
+                            m.duration = videoEle.duration
+                            m.videoEle = videoEle
+                            m.isprepare = true
+                          }}
+                          onTimeupdate={(e: Event) => {
+                            if (!m.isprepare) return
+                            const videoEle = e.target as unknown as HTMLVideoElement
+                            m.currentTime = videoEle.currentTime
+                            m.progress = Number((videoEle.currentTime / m.duration) * 100)
+                          }}
+                          onPlay={() => {
+                            // 播放
+                            m.paused = false
+                            console.log('播放')
+                            setModelOpen()
+                            // 第一次播放
+                            if (m.muted) {
+                              m.muted = false
+                              m.autoPlay = false
+                            }
+                          }}
+                          onPause={() => {
+                            //暂停
+                            clearTimeout(activeData.timer)
+                            m.paused = true
+                          }}
+                          onEnded={() => handleEnded(m)}
+                        >
+                          <source src={m.content} type="video/mp4" />
+                        </video>
+                        {m.muted && (
+                          <div class={styles.loadWrap}>
+                            <Vue3Lottie animationData={playLoadData}></Vue3Lottie>
+                          </div>
+                        )}
+                        <div
+                          style={{ transform: activeData.model ? '' : 'translateY(100%)' }}
+                          class={styles.bottomFixedContainer}
+                          onClick={(e: Event) => {
+                            e.stopPropagation()
+                            setModelOpen()
+                          }}
+                        >
+                          <div style={{ opacity: m.isprepare ? '1' : '0' }}>
+                            <div class={styles.time}>
+                              <span>{getSecondRPM(m.currentTime)}</span>
+                              <span>{getSecondRPM(m.duration)}</span>
                             </div>
-                          )}
-                          <div
-                            style={{ transform: activeData.model ? '' : 'translateY(100%)' }}
-                            class={styles.bottomFixedContainer}
-                            onClick={(e: Event) => {
-                              e.stopPropagation()
-                              setModelOpen()
-                            }}
-                          >
-                            <div style={{ opacity: m.isprepare ? '1' : '0' }}>
-                              <div class={styles.time}>
-                                <span>{getSecondRPM(m.currentTime)}</span>
-                                <span>{getSecondRPM(m.duration)}</span>
-                              </div>
-                              <div class={styles.slider}>
-                                <Slider
-                                  onClick={() => setModelOpen()}
-                                  buttonSize={16}
-                                  step={1}
-                                  modelValue={m.progress}
-                                  onUpdate:modelValue={(val: any) => {
-                                    console.log('val', val)
-                                    m.progress = val
-                                    handleChangeSlider(m)
-                                  }}
-                                  onDragStart={(e: Event) => {
-                                    // 开始拖动,暂停播放
-                                    console.log('开始拖动')
-                                    // 如果拖动之前,视频是播放状态,拖动完毕后继续播放
-                                    if (!m.paused) {
-                                      m.isDrage = true
-                                    }
-                                    handlePaused(m)
-                                  }}
-                                  onDragEnd={(e: Event) => {
-                                    console.log('结束拖动')
-                                    if (m.isDrage) {
-                                      m.isDrage = false
-                                      handlePlay(m)
-                                    }
-                                  }}
-                                  min={0}
-                                  max={100}
-                                />
-                              </div>
+                            <div class={styles.slider}>
+                              <Slider
+                                onClick={() => setModelOpen()}
+                                buttonSize={16}
+                                step={1}
+                                modelValue={m.progress}
+                                onUpdate:modelValue={(val: any) => {
+                                  console.log('val', val)
+                                  m.progress = val
+                                  handleChangeSlider(m)
+                                }}
+                                onDragStart={(e: Event) => {
+                                  // 开始拖动,暂停播放
+                                  console.log('开始拖动')
+                                  // 如果拖动之前,视频是播放状态,拖动完毕后继续播放
+                                  if (!m.paused) {
+                                    m.isDrage = true
+                                  }
+                                  handlePaused(m)
+                                }}
+                                onDragEnd={(e: Event) => {
+                                  console.log('结束拖动')
+                                  if (m.isDrage) {
+                                    m.isDrage = false
+                                    handlePlay(m)
+                                  }
+                                }}
+                                min={0}
+                                max={100}
+                              />
                             </div>
+                          </div>
 
-                            <div class={styles.actions}>
-                              <div class={styles.actionBtn}>
-                                {m.isprepare ? (
-                                  <>
-                                    {m.paused ? (
-                                      <img src={iconplay} onClick={(e: Event) => handlePlay(m)} />
-                                    ) : (
-                                      <img
-                                        src={iconpause}
-                                        onClick={(e: Event) => handlePaused(m)}
-                                      />
-                                    )}
-                                  </>
-                                ) : (
-                                  <Loading color="#fff" />
-                                )}
+                          <div class={styles.actions}>
+                            <div class={styles.actionBtn}>
+                              {m.isprepare ? (
+                                <>
+                                  {m.paused ? (
+                                    <img src={iconplay} onClick={(e: Event) => handlePlay(m)} />
+                                  ) : (
+                                    <img src={iconpause} onClick={(e: Event) => handlePaused(m)} />
+                                  )}
+                                </>
+                              ) : (
+                                <Loading color="#fff" />
+                              )}
 
-                                {m.loop ? (
-                                  <img
-                                    src={iconLoopActive}
-                                    onClick={(e: Event) => (m.loop = false)}
-                                  />
-                                ) : (
-                                  <img src={iconLoop} onClick={(e: Event) => (m.loop = true)} />
-                                )}
-                              </div>
-                              <div>{m.name}</div>
+                              {m.loop ? (
+                                <img
+                                  src={iconLoopActive}
+                                  onClick={(e: Event) => (m.loop = false)}
+                                />
+                              ) : (
+                                <img src={iconLoop} onClick={(e: Event) => (m.loop = true)} />
+                              )}
                             </div>
+                            <div>{m.name}</div>
                           </div>
-                        </>
-                      ) : m.type === 'IMG' ? (
-                        <img src={m.content} />
-                      ) : (
-                        <MusicScore
-                          data-vid={m.id}
-                          music={m}
-                          onSetIframe={(el: any) => {
-                            m.iframeRef = el
-                          }}
-                        />
-                      )}
-                    </div>
-                  </>
-                </SwipeItem>
+                        </div>
+                      </>
+                    ) : m.type === 'IMG' ? (
+                      <img src={m.content} />
+                    ) : (
+                      <MusicScore
+                        data-vid={m.id}
+                        music={m}
+                        onSetIframe={(el: any) => {
+                          m.iframeRef = el
+                        }}
+                      />
+                    )}
+                  </div>
+                </SwiperSlide>
               )
             })}
-          </Swipe>
-
+          </Swiper>
+          {/* <Swipe
+            style={{ height: '100%' }}
+            ref={swipeRef}
+            showIndicators={false}
+            loop={false}
+            duration={0}
+            // vertical
+            lazyRender={true}
+            touchable={false}
+            initialSwipe={popupData.firstIndex}
+            onChange={handleSwipeChange}
+          >
+            
+          </Swipe> */}
           <div
             style={{ transform: activeData.model ? '' : 'translateY(-100%)' }}
             id="coursePlayHeader"
@@ -644,11 +784,8 @@ export default defineComponent({
               返回
             </div>
             <div class={styles.menu}>{popupData.tabName}</div>
-            {data.isCourse && data.isRecordPlay && (
-              <PlayRecordTime ref={playRef} list={data.itemList} />
-            )}
+            {data.isCourse && <PlayRecordTime ref={playRef} list={data.itemList} />}
           </div>
-
           <Transition name="right">
             {activeData.model && (
               <div class={styles.rightFixedBtns}>
@@ -680,7 +817,6 @@ export default defineComponent({
               </div>
             )}
           </Transition>
-
           <Transition name="left">
             {activeData.model && (
               <div class={styles.leftFixedBtns}>
@@ -694,7 +830,7 @@ export default defineComponent({
                   </div>
                 )}
                 {popupData.activeIndex != data.itemList.length - 1 && (
-                  <div class={styles.fullBtn} onClick={() => handlePreAndNext('down')}>
+                  <div class={[styles.fullBtn]} onClick={() => handlePreAndNext('down')}>
                     <span style={{ textAlign: 'center' }}>下一个</span>
                     <img src={iconDown} />
                   </div>
@@ -702,7 +838,6 @@ export default defineComponent({
               </div>
             )}
           </Transition>
-
           <Popup
             class={styles.popup}
             overlayClass={styles.overlayClass}

+ 1 - 1
src/views/exercise-after-class/index.tsx

@@ -220,7 +220,7 @@ export default defineComponent({
         // console.log(itemIndex ,data.trainings, data.videoData?.materialId)
         const isLastIndex = itemIndex === data.trainings.length - 1
         showConfirmDialog({
-          title: '课后训练',
+          title: '课后作业',
           message: '你已完成该练习~',
           confirmButtonColor: 'var(--van-primary)',
           confirmButtonText: isLastIndex ? '完成' : '下一题',

+ 1 - 1
src/views/exercise-after-class/types.ts

@@ -2,5 +2,5 @@ export const featureType = {
     UNIT_TEST: '',
     PRACTICE: '练习',
     EVALUATION: '评测',
-    LESSON_TRAINING: '课后训练'
+    LESSON_TRAINING: '课后作业'
 }

+ 6 - 3
src/views/mine-orchestra/index.tsx

@@ -163,14 +163,17 @@ export default defineComponent({
               >
                 <Tab name="course" title="我的班级">
                   <div class={styles.content}>
-                    <MyClass orchestraName={modelData.orchestra?.name || ''} list={modelData.orchestra?.classGroupIdList || []} />
+                    <MyClass
+                      orchestraName={modelData.orchestra?.name || ''}
+                      list={modelData.orchestra?.classGroupIdList || []}
+                    />
                   </div>
                 </Tab>
-                <Tab name="photo" title="乐团相册">
+                {/* <Tab name="photo" title="乐团相册">
                   <div class={styles.content}>
                     <MyPhoto orchestraId={modelData.orchestra?.id || ''} />
                   </div>
-                </Tab>
+                </Tab> */}
                 <Tab name="deeds" title="乐团事迹">
                   <div class={styles.content}>
                     <OrchestraDeeds orchestraId={modelData.orchestra?.id || ''} />

+ 1 - 1
src/views/mine-orchestra/my-photo/index.tsx

@@ -81,7 +81,7 @@ export default defineComponent({
     return () => (
       <div
         class={[styles.phoneDetail, !data.list.length && 'emptyRootContainer']}
-        style={{ height: '100%', minHeight: 'auto' }}
+        // style={{ height: '100%', minHeight: 'auto' }}
       >
         {!data.loading && !!data.list.length && (
           <List

+ 84 - 86
src/views/unit-test/index.tsx

@@ -91,11 +91,15 @@ export default defineComponent({
         }
         // 是不是未开始
         if (item.status === 'D_NO_SUBMIT') {
-          const { data } = await request.get('/api-student/unitExamination/detail', {
-            params: {
-              unitExaminationId: item.unitExaminationId
+          const { data } = await request.post(
+            '/api-student/studentUnitExamination/getExaminationDetail',
+            {
+              requestType: 'form',
+              data: {
+                studentUnitExaminationId: item.id
+              }
             }
-          })
+          )
           form.unitExam = data || {}
           form.visiableNotice = true
         }
@@ -214,99 +218,93 @@ export default defineComponent({
                 <source src="horse.ogg" type="audio/ogg" />
                 您的浏览器不支持该音频格式。
               </audio> */}
-              <TransitionGroup name="van-fade">
-                {form.list.map((item: any) => (
-                  <CellGroup inset class={styles.cellGroup} border={false}>
-                    <Cell
-                      center
-                      // isLink
-                      clickable={false}
-                      titleStyle={{ flex: '1 auto' }}
-                      valueClass={[
-                        styles['no-start'],
-                        item.status === 'A_PASS' && styles.pass,
-                        item.status === 'B_NO_PASS' && styles['no-pass']
-                      ]}
-                    >
-                      {{
-                        icon: () => <Image src={iconEdit} class={styles.img} />,
-                        title: () => (
-                          <div class={[styles.unitTitle, 'van-ellipsis']}>{item.name}</div>
-                        ),
-                        value: () => unitTestStatus[item.status]
-                      }}
-                    </Cell>
-                    <Cell center class={styles.unitSection}>
-                      {{
-                        title: () => (
-                          <div class={styles.unitInformation}>
-                            <div>
-                              <div class={styles.name}>{item.orchestraName}</div>
-                              <div class={styles.endTime}>
-                                截止时间:
-                                {dayjs(item.expiryDate || new Date()).format('YYYY-MM-DD HH:mm')}
-                              </div>
+
+              {form.list.map((item: any) => (
+                <CellGroup inset class={styles.cellGroup} border={false}>
+                  <Cell
+                    center
+                    // isLink
+                    clickable={false}
+                    titleStyle={{ flex: '1 auto' }}
+                    valueClass={[
+                      styles['no-start'],
+                      item.status === 'A_PASS' && styles.pass,
+                      item.status === 'B_NO_PASS' && styles['no-pass']
+                    ]}
+                  >
+                    {{
+                      icon: () => <Image src={iconEdit} class={styles.img} />,
+                      title: () => (
+                        <div class={[styles.unitTitle, 'van-ellipsis']}>{item.name}</div>
+                      ),
+                      value: () => unitTestStatus[item.status]
+                    }}
+                  </Cell>
+                  <Cell center class={styles.unitSection}>
+                    {{
+                      title: () => (
+                        <div class={styles.unitInformation}>
+                          <div>
+                            <div class={styles.name}>{item.orchestraName}</div>
+                            <div class={styles.endTime}>
+                              截止时间:
+                              {dayjs(item.expiryDate || new Date()).format('YYYY-MM-DD')}
                             </div>
-                            {item.status === 'A_PASS' || item.status === 'B_NO_PASS' ? (
-                              <span>
-                                {item.score || 0}
-                                <i>分</i>
-                              </span>
-                            ) : (
-                              ''
-                            )}
                           </div>
-                        ),
+                          {item.status === 'A_PASS' || item.status === 'B_NO_PASS' ? (
+                            <span>
+                              {item.score || 0}
+                              <i>分</i>
+                            </span>
+                          ) : (
+                            ''
+                          )}
+                        </div>
+                      ),
 
-                        label: () => (
-                          <div class={styles.unitBtnGroup}>
+                      label: () => (
+                        <div class={styles.unitBtnGroup}>
+                          <Button
+                            color="#FFF0E6"
+                            round
+                            block
+                            style={{ color: '#F67146' }}
+                            onClick={() => {
+                              router.push({
+                                path: '/test-exercise',
+                                query: {
+                                  id: item.unitExaminationId
+                                }
+                              })
+                            }}
+                          >
+                            练习模式
+                          </Button>
+                          {item.status === 'A_PASS' || item.status === 'B_NO_PASS' ? (
+                            <Button type="primary" round block onClick={() => onUnitTestLook(item)}>
+                              查看测验
+                            </Button>
+                          ) : (
                             <Button
-                              color="#FFF0E6"
+                              type="primary"
                               round
                               block
-                              style={{ color: '#F67146' }}
-                              onClick={() => {
-                                router.push({
-                                  path: '/test-exercise',
-                                  query: {
-                                    id: item.unitExaminationId
-                                  }
-                                })
-                              }}
+                              disabled={dayjs().isAfter(dayjs(item.expiryDate))}
+                              onClick={() => onUnitTestStart(item)}
                             >
-                              练习模式
+                              {item.status === 'C_ING' ? '继续测验' : '开始测验'}
                             </Button>
-                            {item.status === 'A_PASS' || item.status === 'B_NO_PASS' ? (
-                              <Button
-                                type="primary"
-                                round
-                                block
-                                onClick={() => onUnitTestLook(item)}
-                              >
-                                查看测验
-                              </Button>
-                            ) : (
-                              <Button
-                                type="primary"
-                                round
-                                block
-                                disabled={dayjs().isAfter(dayjs(item.expiryDate))}
-                                onClick={() => onUnitTestStart(item)}
-                              >
-                                {item.status === 'C_ING' ? '继续测验' : '开始测验'}
-                              </Button>
-                            )}
-                          </div>
-                        )
-                      }}
-                    </Cell>
-                  </CellGroup>
-                ))}
-              </TransitionGroup>
+                          )}
+                        </div>
+                      )
+                    }}
+                  </Cell>
+                </CellGroup>
+              ))}
             </List>
           </OFullRefresh>
         ) : (
-          <OEmpty tips="暂无单元测验" />
+          <OEmpty tips="暂无阶段自测" />
         )}
 
         <ActionSheet

+ 6 - 2
src/views/unit-test/model/drag-question/index.module.less

@@ -85,18 +85,22 @@
     }
   }
 
+  .itemsContainer {
+    display: inline-block;
+    margin-right: 10px;
+    margin-bottom: 8px;
+  }
+
   .items,
   .imgs {
     min-width: 56px;
     height: 36px;
     font-size: 16px;
     font-weight: 500;
-    margin-right: 10px;
     border-radius: 4px;
     background: #ffebdd;
     color: #f67146;
     justify-content: center;
-    margin-bottom: 8px;
   }
 
   .imgs {

+ 114 - 65
src/views/unit-test/model/drag-question/index.tsx

@@ -1,5 +1,5 @@
 import { Tag, Image, Button } from 'vant'
-import { computed, defineComponent, nextTick, onMounted, PropType, reactive } from 'vue'
+import { computed, defineComponent, nextTick, onMounted, PropType, reactive, watch } from 'vue'
 import { AnswerType, labelOptions, QuestionType } from '../../unit'
 import Draggable from 'vuedraggable'
 import styles from './index.module.less'
@@ -61,7 +61,7 @@ export default defineComponent({
     })
 
     onMounted(() => {
-      initSortable()
+      // initSortable()
     })
 
     const initSortable = () => {
@@ -81,11 +81,13 @@ export default defineComponent({
               state.list = [...state.options]
               updatePosition(state.list)
             }
-            setTimeout(() => {
-              onSelect()
-            }, 100)
+            // setTimeout(() => {
+            onSelect()
+            // }, 100)
           }
         })
+
+        // console.log(state.sortable)
       })
     }
 
@@ -102,6 +104,8 @@ export default defineComponent({
           answerExtra: index + 1
         })
       })
+
+      // console.log('🚀 ~ onSelect ~ result', result)
       emit('update:value', result)
     }
 
@@ -110,6 +114,7 @@ export default defineComponent({
       // 判断是否已经选中了
       if (item.checked || props.readOnly) return
       const result: any = []
+      // console.log(state.options, 'state.options')
       state.options.forEach((option: any, index: any) => {
         // console.log(option, '------')
         result.push({
@@ -118,6 +123,7 @@ export default defineComponent({
           answerExtra: index + 1
         })
       })
+
       result.push({
         answerId: item.examinationQuestionAnswerId,
         answer: item.questionAnswer,
@@ -129,15 +135,19 @@ export default defineComponent({
         answer: item.questionAnswer,
         answerExtra: state.list.length + 1
       })
-      // console.log(state.list, result, 'result lis4t')
+
+      // console.log(state.list, '------', result, 'result lis4t')
       emit('update:value', result)
 
-      initOptions()
+      nextTick(() => {
+        initOptions()
+      })
     }
 
     const answers = computed(() => {
       const list: any = props.data.answers || []
       const value: any = props.value || []
+      // console.log(value, 'answer')
       list.forEach((item: any) => {
         const tempIndex = value.findIndex(
           (c: any) => c.answerId === item.examinationQuestionAnswerId
@@ -152,47 +162,49 @@ export default defineComponent({
       const answers = props.data.answers || []
       const userAnswer = props.data.userAnswer || [] // 用户填写的答案
       // console.log(answers, userAnswer)
-      state.options = []
-      if (userAnswer.length > 0) {
-        userAnswer.forEach((answer: any, index: any) => {
-          const rightOption = answers.find(
-            (child: any) => answer.answerId === child.examinationQuestionAnswerId
-          )
-          const rightValue = answers.find((child: any) => answer.answerExtra == child.questionExtra)
-          const tmp = {
-            itemIndex: index,
-            index: answer.answerId, // 左边的值
-            leftValue: answer.answer, // 左边的值
-            rightValue: answer.answerExtra, // 右边的值
-            leftType: rightOption ? rightOption.questionAnswerTypeCode || 'TXT' : 'TXT', // 左边类型
-            rightType: rightOption ? rightOption.questionExtraTypeCode || 'TXT' : 'TXT', // 右边类型
-            rightIndex: rightValue ? rightValue.examinationQuestionAnswerId : ''
-          }
-          state.options.push(tmp)
+      // state.options = []
+      nextTick(() => {
+        if (userAnswer.length > 0) {
+          const tempList: any = []
+          userAnswer.forEach((answer: any, index: any) => {
+            const rightOption = answers.find(
+              (child: any) => answer.answerId === child.examinationQuestionAnswerId
+            )
+            const rightValue = answers.find(
+              (child: any) => answer.answerExtra == child.questionExtra
+            )
+            const tmp = {
+              itemIndex: index,
+              index: answer.answerId, // 左边的值
+              leftValue: answer.answer, // 左边的值
+              rightValue: answer.answerExtra, // 右边的值
+              leftType: rightOption ? rightOption.questionAnswerTypeCode || 'TXT' : 'TXT', // 左边类型
+              rightType: rightOption ? rightOption.questionExtraTypeCode || 'TXT' : 'TXT', // 右边类型
+              rightIndex: rightValue ? rightValue.examinationQuestionAnswerId : ''
+            }
+            // state.options.push(tmp)
+            tempList.push(tmp)
+          })
+          state.options = tempList
+        }
+      })
+    }
+
+    watch(
+      () => state.options,
+      () => {
+        const list = state.options || []
+        const result: any = []
+        list.forEach((item: any, index: number) => {
+          result.push({
+            answerId: item.index,
+            answer: item.leftValue,
+            answerExtra: index + 1
+          })
         })
-        // console.log(state.options, 'after options')
-        // state.list = state.options
+        emit('update:value', result)
       }
-      // else {
-      //   const resultValue: any = []
-      //   answers.forEach((answer: any) => {
-      //     const tmp = {
-      //       index: answer.examinationQuestionAnswerId, // 左边的值
-      //       leftValue: answer.questionAnswer, // 左边的值
-      //       rightValue: answer.questionExtra, // 右边的值
-      //       leftType: answer.questionAnswerTypeCode || 'TXT', // 左边类型
-      //       rightType: answer.questionExtraTypeCode || 'TXT' // 右边类型
-      //     }
-      //     resultValue.push({
-      //       answerId: answer.examinationQuestionAnswerId,
-      //       answer: answer.questionAnswer,
-      //       answerExtra: answer.questionExtra
-      //     })
-      //     state.options.push(tmp)
-      //   })
-      //   // 进页面就默认初始化答案
-      // }
-    }
+    )
 
     onMounted(() => {
       initOptions()
@@ -244,30 +256,67 @@ export default defineComponent({
                   state.options = []
                   state.list = []
                   onSelect()
+                  initOptions()
                 }}
               >
                 重置
               </Button>
             </div>
-            <div id={state.domId}>
-              {state.options.map((item: any) => (
-                <>
-                  {item.leftType === AnswerType.TXT && (
-                    <Tag class={[styles.items]} data-id={item.itemIndex}>
-                      {item.leftValue}
-                    </Tag>
-                  )}
-                  {item.leftType === AnswerType.IMAGE && (
-                    <Image
-                      src={item.leftValue}
-                      data-id={item.itemIndex}
-                      class={[styles.imgs, 'van-hairline--surround']}
-                      fit="cover"
-                    />
-                  )}
-                </>
-              ))}
-            </div>
+            {/* <div id={state.domId}>
+              {state.options.length > 0 &&
+                state.options.map((item: any) => (
+                  <>
+                    {item.leftType === AnswerType.TXT && (
+                      <Tag class={[styles.items]} data-id={item.itemIndex}>
+                        {item.leftValue}
+                      </Tag>
+                    )}
+                    {item.leftType === AnswerType.IMAGE && (
+                      <Image
+                        src={item.leftValue}
+                        data-id={item.itemIndex}
+                        class={[styles.imgs, 'van-hairline--surround']}
+                        fit="cover"
+                      />
+                    )}
+                  </>
+                ))}
+            </div> */}
+
+            <Draggable
+              v-model:modelValue={state.options}
+              itemKey="itemIndex"
+              // componentData={{
+              //   on: {
+              //     change: () => {
+              //       console.log('input')
+              //     }
+              //   }
+              // }}
+            >
+              {{
+                item: (element: any) => {
+                  const item = element.element
+                  return (
+                    <div class={styles.itemsContainer}>
+                      {item.leftType === AnswerType.TXT && (
+                        <Tag class={[styles.items]} data-id={item.itemIndex}>
+                          {item.leftValue}
+                        </Tag>
+                      )}
+                      {item.leftType === AnswerType.IMAGE && (
+                        <Image
+                          src={item.leftValue}
+                          data-id={item.itemIndex}
+                          class={[styles.imgs, 'van-hairline--surround']}
+                          fit="cover"
+                        />
+                      )}
+                    </div>
+                  )
+                }
+              }}
+            </Draggable>
           </div>
         </div>
         {props.showAnalysis && (

+ 3 - 0
src/views/unit-test/model/keep-look-question/index.tsx

@@ -457,6 +457,9 @@ export default defineComponent({
                 })
                 // 清除所有的选择的内容
                 state.selectItem = []
+
+                // 初始化数据
+                onSelect()
               }}
             >
               重置

+ 1 - 1
src/views/unit-test/model/notice-start/index.tsx

@@ -63,7 +63,7 @@ export default defineComponent({
             </div>
 
             <p class={styles.rContent}>
-              1、单元测验仅可进行一次,请通过练习模式充分练习后再进行测试,以保障测验分数准确;
+              1、阶段自测仅可进行一次,请通过练习模式充分练习后再进行测试,以保障测验分数准确;
               <br />
               2、点击开始测验后开始测验计时,到达测验时长后自动完成;
               <br />

+ 7 - 7
src/views/unit-test/unit-create/uni-last.tsx

@@ -215,13 +215,13 @@ export default defineComponent({
               color={'#FF8057'}
               shrink
             >
-              <Tab name="one" title="I类学生">
+              <Tab name="one" title="单团学生">
                 <NewspaperItem item={datas.uniDetail[1]}></NewspaperItem>
               </Tab>
-              <Tab name="two" title="II类学生">
+              <Tab name="two" title="双团学生">
                 <NewspaperItem item={datas.uniDetail[2]}></NewspaperItem>
               </Tab>
-              <Tab name="three" title="III类学生">
+              <Tab name="three" title="多团学生">
                 <NewspaperItem item={datas.uniDetail[3]}></NewspaperItem>
               </Tab>
             </Tabs>
@@ -248,12 +248,12 @@ export default defineComponent({
               default: () => (
                 <div class={styles.DialogConent}>
                   <p>
-                    根据学生入团的批次对不同训练阶段的学生进行分类,不同训练阶段的学生可布置不同标准的课后训练和单元测验内容。
+                    根据学生入团的批次对不同训练阶段的学生进行分类,不同训练阶段的学生可布置不同标准的课后作业和阶段自测内容。
                   </p>
                   <br />
-                  <p>&nbsp;&nbsp;&nbsp;I类学生:最新进入本乐团的学员</p>
-                  <p>&nbsp;II 类学生:较早进入本乐团的学员</p>
-                  <p>III 类学生:最早进入本乐团的学员</p>
+                  <p>单团学生:最新进入本乐团的学员</p>
+                  <p>双团学生:较早进入本乐团的学员</p>
+                  <p>多团学生:最早进入本乐团的学员</p>
                 </div>
               )
             }}

+ 1 - 1
src/views/unit-test/unit-list/index.tsx

@@ -163,7 +163,7 @@ export default defineComponent({
             </List>
           </OFullRefresh>
         ) : (
-          <OEmpty tips="暂无单元测验" />
+          <OEmpty tips="暂无阶段自测" />
         )}
 
         <ActionSheet

+ 7 - 13
src/views/unit-test/unit-list/unitDetail.tsx

@@ -88,13 +88,13 @@ export default defineComponent({
             color={'#FF8057'}
             shrink
           >
-            <Tab name={1} title="I类学生">
+            <Tab name={1} title="单团学生">
               <UnitStudentList type={1}></UnitStudentList>
             </Tab>
-            <Tab name={2} title="II类学生">
+            <Tab name={2} title="双团学生">
               <UnitStudentList type={2}></UnitStudentList>
             </Tab>
-            <Tab name={3} title="III类学生">
+            <Tab name={3} title="多团学生">
               <UnitStudentList type={3}></UnitStudentList>
             </Tab>
           </Tabs>
@@ -137,18 +137,12 @@ export default defineComponent({
             default: () => (
               <div class={styles.DialogConent}>
                 <p>
-                  根据学生入团的批次对不同训练阶段的学生进行分类,不同训练阶段的学生可布置不同标准的课后训练和单元测验内容。
+                  根据学生入团的批次对不同训练阶段的学生进行分类,不同训练阶段的学生可布置不同标准的课后作业和阶段自测内容。
                 </p>
                 <br />
-                <p>
-                  <span>I类学生:</span>最新进入本乐团的学员
-                </p>
-                <p>
-                  <span>II类学生:</span>较早进入本乐团的学员
-                </p>
-                <p>
-                  <span>III类学生:</span>最早进入本乐团的学员
-                </p>
+                <p>单团学生:最新进入本乐团的学员</p>
+                <p>双团学生:较早进入本乐团的学员</p>
+                <p>多团学生:最早进入本乐团的学员</p>
               </div>
             )
           }}

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