lex 8 months ago
parent
commit
d6d8e8e43e

+ 1 - 1
src/state.ts

@@ -25,7 +25,7 @@ export const state = reactive({
   musicCertStatus: false as boolean, // 是否音乐认证
   openLiveStatus: false as boolean, // 是否开通直播
   max: -1, // 表示不限制
-  vIds: [], // 已经选择的视频
+  vIds: [] as any, // 已经选择的视频
   choiseType: '', // 需要选择资源的类型
 });
 

+ 2 - 3
src/views/choise-homework/classroom-detail/index.tsx

@@ -39,8 +39,7 @@ export default defineComponent({
       ruleStatus: false,
       isDownloading: false, // 是否在下载资源
       parentCollapse: '' as any,
-      childrenCollapse: '' as any,
-      defaultValue: [1073557, 1073558]
+      childrenCollapse: '' as any
     });
 
     /** 获取课件详情 */
@@ -88,7 +87,7 @@ export default defineComponent({
         item.collapse = '';
         if (Array.isArray(item.materialList)) {
           item.materialList.forEach((item: any) => {
-            if (data.defaultValue.includes(item.id)) {
+            if (state.vIds.includes(item.id + '')) {
               item.status = 'disabled';
             } else {
               item.status = 'nochecked';

+ 11 - 16
src/views/choise-homework/index.tsx

@@ -10,12 +10,7 @@ import {
 } from 'vue';
 import styles from './index.module.less';
 import { useRoute, useRouter } from 'vue-router';
-import {
-  listenerMessage,
-  postMessage,
-  removeListenerMessage
-} from '@/helpers/native-message';
-import { browser } from '@/helpers/utils';
+import { postMessage } from '@/helpers/native-message';
 import OHeader from '@/components/o-header';
 import OSticky from '@/components/o-sticky';
 import OEmpty from '@/components/o-empty';
@@ -27,7 +22,6 @@ export default defineComponent({
     // music | video | onlymusic
     const route = useRoute();
     const router = useRouter();
-    const browserInfo = browser();
 
     const pageType = route.query.type as any;
     let topType = 'music';
@@ -37,7 +31,7 @@ export default defineComponent({
     }
 
     const state = reactive({
-      topKey: topType || ('music' as 'music' | 'video'),
+      topKey: topType || ('music' as 'music' | 'courseware'),
       list: [] as any,
       show: true,
       actionKey: 0,
@@ -126,12 +120,13 @@ export default defineComponent({
       // 获取默认数据
       postMessage(
         {
-          api: 'getCousewareSelectResult'
+          api: 'getCoursewareSelectResult'
         },
         (res: any) => {
-          if (res?.content?.data) {
-            baseState.max = res.content.data.max;
-            baseState.vIds = res.content.data.corusewareId || [];
+          if (res?.content) {
+            console.log(res?.content);
+            baseState.max = res.content.max;
+            baseState.vIds = res.content.coursewareIds || [];
             return;
           }
         }
@@ -144,7 +139,7 @@ export default defineComponent({
         if (state.list.length <= 0) {
           FetchList();
         }
-      } else if (state.topKey === 'video') {
+      } else if (state.topKey === 'courseware') {
         if (state.subjectList.length <= 0 || state.classList.length <= 0) {
           _initClassroom();
         }
@@ -235,10 +230,10 @@ export default defineComponent({
                   onChangeTopTabs();
                 }}>
                 <Tab title="云教练" name="music"></Tab>
-                <Tab title="云课堂" name="video"></Tab>
+                <Tab title="云课堂" name="courseware"></Tab>
               </Tabs>
 
-              {state.topKey === 'video' && (
+              {state.topKey === 'courseware' && (
                 <Tabs
                   class={styles.classroomTab}
                   v-model:active={state.actionKey}
@@ -258,7 +253,7 @@ export default defineComponent({
         <div
           class={[
             styles.container,
-            state.topKey === 'video' ? styles.containerClass : ''
+            state.topKey === 'courseware' ? styles.containerClass : ''
           ]}>
           {state.topKey === 'music' ? (
             <Transition name="van-fade">

+ 84 - 50
src/views/exercise-after-class/index.module.less

@@ -46,50 +46,6 @@
   z-index: 10;
 }
 
-// .btnGroup {
-//   position: absolute;
-//   top: 50%;
-//   right: 12px;
-//   z-index: 10;
-//   transform: translateY(-50%);
-
-//   .btnItem {
-//     background: rgba(0, 0, 0, 0.3);
-//     border-radius: 6px;
-//     width: 42px;
-//     height: 50px;
-//     font-size: 12px;
-//     color: #FFFFFF;
-//     text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.13);
-//     display: flex;
-//     align-items: center;
-//     flex-direction: column;
-//     justify-content: center;
-//     cursor: pointer;
-//   }
-
-//   .btnImg {
-//     width: 24px;
-//     height: 24px;
-//     margin-bottom: 2px;
-//   }
-// }
-.goPractice {
-  width: 89px;
-  height: 32px;
-  background: url('../coursewarePlay/image/btn_go_practice.png') no-repeat center;
-  background-size: contain;
-  position: absolute;
-  right: 12px;
-  bottom: 70px;
-  z-index: 11;
-  transition: all .5s ease;
-
-  &.hide {
-    transform: translateX(65px);
-  }
-}
-
 .menu {
   flex: 1;
   display: flex;
@@ -213,6 +169,47 @@
   }
 }
 
+// .bottomFixedContainer {
+//   position: absolute;
+//   left: 0;
+//   right: 0;
+//   bottom: 0;
+//   z-index: 10;
+//   background: linear-gradient(0deg, rgba(0, 0, 0, 0.5), transparent);
+//   padding: 0 30px;
+
+//   .time {
+//     display: flex;
+//     // justify-content: space-between;
+//     color: #fff;
+//     font-size: 10px;
+//     padding: 4px 0;
+//   }
+
+//   .slider {
+//     padding: 10px 0;
+//   }
+
+//   .actions {
+//     display: flex;
+//     justify-content: space-between;
+//     color: #fff;
+//     font-size: 12px;
+//     align-items: center;
+
+//     .actionBtn {
+//       display: flex;
+//     }
+
+//     .actionBtn>img {
+//       width: 26px;
+//       height: 26px;
+//       display: block;
+//       padding: 8px 8px 14px 8px;
+//     }
+//   }
+// }
+
 .bottomFixedContainer {
   position: absolute;
   left: 0;
@@ -220,18 +217,25 @@
   bottom: 0;
   z-index: 10;
   background: linear-gradient(0deg, rgba(0, 0, 0, 0.5), transparent);
-  padding: 0 30px;
+  transition: transform 0.5s;
 
   .time {
     display: flex;
     // justify-content: space-between;
     color: #fff;
     font-size: 10px;
-    padding: 4px 0;
+    padding: 4px 20px;
   }
 
   .slider {
-    padding: 10px 0;
+    padding: 8px 20px;
+    --van-slider-active-background: #00E5D7;
+
+    :global {
+      .van-slider__button {
+        background: #fff;
+      }
+    }
   }
 
   .actions {
@@ -239,6 +243,7 @@
     justify-content: space-between;
     color: #fff;
     font-size: 12px;
+    padding: 0 10px 4px 20px;
     align-items: center;
 
     .actionBtn {
@@ -246,10 +251,11 @@
     }
 
     .actionBtn>img {
-      width: 26px;
-      height: 26px;
+      width: 24px;
+      height: 24px;
       display: block;
-      padding: 8px 8px 14px 8px;
+      padding: 4px 10px 4px 2px;
+      box-sizing: content-box;
     }
   }
 }
@@ -303,4 +309,32 @@
   .bottom-leave-to {
     transform: translateY(100%);
   }
+}
+
+.visiablePopup {
+  width: 315px;
+  height: 174px;
+  background: #FFFFFF;
+  border-radius: 12px;
+  display: flex;
+  align-items: center;
+  flex-direction: column;
+  justify-content: center;
+
+  .title {
+    font-weight: 600;
+    font-size: 18px;
+    color: #333333;
+    line-height: 25px;
+  }
+
+  .content {
+    font-size: 16px;
+    color: #666666;
+    line-height: 24px;
+  }
+
+  .btnGroup {
+    display: flex;
+  }
 }

+ 75 - 104
src/views/exercise-after-class/index.tsx

@@ -1,4 +1,4 @@
-import { Icon, showConfirmDialog, showToast, Swipe, SwipeItem } from 'vant';
+import { Button, Icon, Popup, showConfirmDialog, Swipe, SwipeItem } from 'vant';
 import {
   defineComponent,
   onMounted,
@@ -12,22 +12,21 @@ import styles from './index.module.less';
 import 'plyr/dist/plyr.css';
 import request from '@/helpers/request';
 import { state } from '@/state';
-import { useRoute, useRouter } from 'vue-router';
+import { useRoute } from 'vue-router';
 import iconBack from '../coursewarePlay/image/back.svg';
 import { postMessage } from '@/helpers/native-message';
-import { browser } from '@/helpers/utils';
-import qs from 'query-string';
+// import { browser } from '@/helpers/utils';
 import { Vue3Lottie } from 'vue3-lottie';
 import playLoadData from '../coursewarePlay/datas/data.json';
 // import { handleCheckVip } from '../hook/useFee';
 import VideoClass from './video-class';
 import { usePageVisibility } from '@vant/use';
 
-const materialType = {
-  视频: 'VIDEO',
-  图片: 'IMG',
-  曲目: 'SONG'
-};
+// const materialType = {
+//   视频: 'VIDEO',
+//   图片: 'IMG',
+//   曲目: 'SONG'
+// };
 
 export default defineComponent({
   name: 'exercise-after-class',
@@ -72,9 +71,9 @@ export default defineComponent({
 
     const route = useRoute();
     const query = route.query;
-    const browserInfo = browser();
     const headeRef = ref();
     const data = reactive({
+      visiableStatus: true,
       isMember: false, // 是否为会员
       videoData: null as any,
       trainings: [] as any[],
@@ -108,33 +107,25 @@ export default defineComponent({
             }
           }
         );
-        data.expireTimeFlag = res.data?.expireTimeFlag || false;
-        if (Array.isArray(res?.data?.trainings)) {
-          const trainings = res?.data?.trainings || [];
-          const tempLessonTraining: any = [];
-          trainings.forEach((item: any) => {
-            tempLessonTraining.push(
-              ...(item.studentLessonTrainingDetails || [])
-            );
-          });
+        // data.expireTimeFlag = res.data?.expireTimeFlag || false;
+        if (Array.isArray(res?.data)) {
+          const trainings = res?.data || [];
+          //   const tempLessonTraining: any = [];
+          //   trainings.forEach((item: any) => {
+          //     tempLessonTraining.push(
+          //       ...(item.studentLessonTrainingDetails || [])
+          //     );
+          //   });
           // 没有播放完
-          tempLessonTraining.forEach((item: any) => {
-            let trainingContent: any = {};
-            try {
-              trainingContent = JSON.parse(item.trainingContent);
-            } catch (error) {
-              trainingContent = '';
-            }
-            if (trainingContent.practiceTimes !== item.trainingTimes + '') {
+          trainings.forEach((item: any) => {
+            if (item.times > item.trainingTimes) {
               data.isPlayAll = false;
             }
-
-            if (item.materialId == route.query.materialId) {
-              popupData.tabName = item.knowledgePointName;
+            if (item.id + '' == route.query.materialId) {
+              popupData.tabName = item.musicScoreName;
             }
           });
-
-          return tempLessonTraining;
+          return trainings;
         }
       } catch (error) {
         //
@@ -144,17 +135,12 @@ export default defineComponent({
     const setRecord = async (trainings: any[]) => {
       if (Array.isArray(trainings)) {
         data.trainings = trainings.map((n: any) => {
-          const materialRefs = n.materialRefs ? n.materialRefs : [];
-          const materialMusicId =
-            materialRefs.length > 0 ? materialRefs[0].resourceId : null;
-          try {
-            n.trainingContent = JSON.parse(n.trainingContent);
-          } catch (error) {
-            n.trainingContent = '';
-          }
+          // const materialRefs = n.materialRefs ? n.materialRefs : [];
+          // const materialMusicId =
+          //   materialRefs.length > 0 ? materialRefs[0].resourceId : null;
           return {
             ...n,
-            materialMusicId,
+            // materialMusicId,
             currentTime: 0,
             duration: 100,
             paused: true,
@@ -163,12 +149,13 @@ export default defineComponent({
             timer: null,
             // muted: state.user.data?.vipMember ? false : true, // 静音
             muted: true,
-            autoplay: state.user.data?.vipMember ? true : false //自动播放
+            autoplay: true
+            // autoplay: state.user.data?.vipMember ? true : false //自动播放
           };
         });
         console.log(data.trainings, 'trainings');
         data.itemList = data.trainings.filter(
-          (n: any) => n.materialId == route.query.materialId
+          (n: any) => n.id == route.query.materialId
         );
         data.videoData = data.itemList[0];
         handleExerciseCompleted();
@@ -179,13 +166,7 @@ export default defineComponent({
       const trainings = await getTrainingRecord();
       // 初始化状态
       trainings.forEach((record: any) => {
-        let trainingContent: any = {};
-        try {
-          trainingContent = JSON.parse(record.trainingContent);
-        } catch (error) {
-          trainingContent = '';
-        }
-        if (trainingContent.practiceTimes !== record.trainingTimes + '') {
+        if (record.times !== record.trainingTimes) {
           data.isPlayBaseStatus = false;
         }
       });
@@ -211,32 +192,18 @@ export default defineComponent({
     });
 
     // 达到指标,记录
-    const addTrainingRecord = async (m: any) => {
+    const addTrainingRecord = async () => {
       if (data.recordLoading || data.expireTimeFlag) return;
       console.log('记录观看次数');
       data.recordLoading = true;
-      const query = route.query;
       const body = {
-        materialType: 'VIDEO',
-        record: {
-          sourceTime: m.duration,
-          clientType: state.platformType,
-          feature: 'LESSON_TRAINING',
-          deviceType: browserInfo.android
-            ? 'ANDROID'
-            : browserInfo.isApp
-            ? 'IOS'
-            : 'WEB'
-        },
-        courseScheduleId: query.courseScheduleId,
-        lessonTrainingId: query.lessonTrainingId,
-        materialId: data.videoData?.materialId || ''
+        id: data.videoData?.id || ''
       };
       try {
-        await request.post(
+        await request.get(
           state.platformApi + '/studentCourseHomework/addStudentHomeworkRecord',
           {
-            data: body,
+            params: body,
             hideLoading: true
           }
         );
@@ -247,9 +214,8 @@ export default defineComponent({
       try {
         const trainings: any[] = await getTrainingRecord();
         if (Array.isArray(trainings)) {
-          const item = trainings.find(
-            (n: any) => n.materialId == data.videoData?.materialId
-          );
+          const item = trainings.find((n: any) => n.id == data.videoData?.id);
+          console.log(item, 'item');
           if (item) {
             data.videoData.trainingTimes = item.trainingTimes;
             handleExerciseCompleted();
@@ -270,37 +236,29 @@ export default defineComponent({
     const handleExerciseCompleted = () => {
       if (
         data?.videoData?.trainingTimes != 0 &&
-        data?.videoData?.trainingTimes + '' ===
-          data.videoData?.trainingContent?.practiceTimes
+        data?.videoData?.trainingTimes >= data.videoData?.times
       ) {
         let isLastIndex = false;
         let itemIndex = 0;
-        // console.log(data.isPlayBaseStatus, data.isPlayAll, data.trainings)
+        console.log(data.isPlayBaseStatus, data.isPlayAll, data.trainings);
         if (data.isPlayBaseStatus) {
           itemIndex = data.trainings.findIndex(
-            (n: any) => n.materialId == data.videoData?.materialId
+            (n: any) => n.id == data.videoData?.id
           );
           isLastIndex = itemIndex === data.trainings.length - 1;
         } else {
           let i = -1;
           let status = true;
           data.trainings.forEach((item: any, index: number) => {
-            if (
-              item.trainingContent.practiceTimes !== item.trainingTimes + '' &&
-              i === -1
-            ) {
-              // console.log(i, item.trainingContent.practiceTimes, item.trainingTimes, index)
+            if (item.times > item.trainingTimes && i === -1) {
               i = index;
             }
-            if (
-              item.trainingContent.practiceTimes !==
-              item.trainingTimes + ''
-            ) {
+            if (item.times > item.trainingTimes) {
               status = false;
             }
           });
           itemIndex = i != -1 ? i - 1 : -1;
-          // console.log(status)
+          // console.log(status, itemIndex);
           isLastIndex = status;
         }
 
@@ -314,25 +272,25 @@ export default defineComponent({
           .then(() => {
             if (!isLastIndex) {
               const nextItem = data.trainings[itemIndex + 1];
-              data.videoData?.expired;
-              if (nextItem.expired) {
-                showToast('该资源已过期');
-                return;
-              }
-              if (nextItem.knowledgePointName) {
-                popupData.tabName = nextItem.knowledgePointName;
-              }
-              if (nextItem?.type === materialType.视频) {
-                data.itemList = [nextItem];
-                data.videoData = nextItem;
-                handleExerciseCompleted();
+              if (nextItem.musicScoreName) {
+                popupData.tabName = nextItem.musicScoreName;
               }
+              data.itemList = [nextItem];
+              data.videoData = nextItem;
+              handleExerciseCompleted();
             } else {
               postMessage({ api: 'goBack' });
             }
           })
           .catch(() => {
+            console.log(
+              data.trainings,
+              itemIndex,
+              data.trainings[itemIndex],
+              'data.trainings[itemIndex]'
+            );
             data.trainings[itemIndex].currentTime = 0;
+            data.trainings[itemIndex].videoEle.currentTime(0);
           });
       }
     };
@@ -401,17 +359,30 @@ export default defineComponent({
                   返回
                 </div>
                 <div class={styles.menu}>{popupData.tabName}</div>
-                {/* 判断作业是否过期 */}
-                {!data.expireTimeFlag && (
-                  <div class={styles.nums}>
-                    观看视频模仿并练习:{data.videoData?.trainingTimes || 0}/
-                    {data.videoData?.trainingContent?.practiceTimes || 0}
-                  </div>
-                )}
+                <div class={styles.nums}>
+                  练习次数:{data.videoData?.trainingTimes || 0}/
+                  {data.videoData?.times || 0}
+                </div>
               </div>
             )}
           </Transition>
         </div>
+
+        {/* <Popup
+          v-model:show={data.visiableStatus}
+          closeable
+          class={styles.visiablePopup}>
+          <div class={styles.title}>温馨提示</div>
+          <p class={styles.content}>您已完成该练习~</p>
+          <div class={styles.btnGroup}>
+            <Button color="#ccc" round>
+              取消
+            </Button>
+            <Button color="#FF8057" round>
+              下一步
+            </Button>
+          </div>
+        </Popup> */}
       </div>
     );
   }

+ 2 - 2
src/views/exercise-after-class/video-class.tsx

@@ -44,7 +44,7 @@ export default defineComponent({
     'changeModal'
   ],
   setup(props, { emit }) {
-    const { item, modal, isMember } = toRefs(props);
+    const { item, modal } = toRefs(props);
     const videoItem = ref();
     const videoID = 'video' + Date.now() + Math.floor(Math.random() * 100);
 
@@ -61,7 +61,7 @@ export default defineComponent({
         videoItem.value.autoplay(props.item.autoplay);
 
         // 初步加载时
-        videoItem.value.one('loadedmetadata', (e: any) => {
+        videoItem.value.one('loadedmetadata', () => {
           // if (item.value.autoplay && videoItem.value) {
           //   videoItem.value?.play()
           // } else {