Procházet zdrojové kódy

Merge branch 'iteration-20240909' into jenkins

lex-xin před 10 měsíci
rodič
revize
9998491382
30 změnil soubory, kde provedl 204 přidání a 58 odebrání
  1. 1 0
      src/components/card-preview/music-modal/index.module.less
  2. 5 0
      src/components/card-preview/video-modal/index.tsx
  3. 2 2
      src/utils/contants.ts
  4. 0 2
      src/views/attend-class/component/audio-pay.tsx
  5. 8 2
      src/views/content-information/content-instrument/detail.module.less
  6. 3 2
      src/views/content-information/content-instrument/detail.tsx
  7. 9 0
      src/views/content-information/content-knowledge/index.module.less
  8. 32 0
      src/views/content-information/content-music/components/list/search-group-resources.tsx
  9. 9 0
      src/views/content-information/content-music/detail.module.less
  10. 3 0
      src/views/content-information/content-music/detail.tsx
  11. 6 0
      src/views/prepare-lessons/components/directory-main/index.module.less
  12. 17 5
      src/views/prepare-lessons/components/directory-main/index.tsx
  13. 2 4
      src/views/prepare-lessons/components/directory-main/select-lessonware/index.tsx
  14. 4 3
      src/views/prepare-lessons/components/lesson-main/courseware-presets/index.tsx
  15. 1 1
      src/views/prepare-lessons/components/lesson-main/courseware/addCourseware.tsx
  16. 3 0
      src/views/prepare-lessons/components/lesson-main/train/index.tsx
  17. 1 1
      src/views/prepare-lessons/model/attend-class/index.tsx
  18. 7 2
      src/views/prepare-lessons/model/source-instrument/detail.module.less
  19. 3 0
      src/views/prepare-lessons/model/source-instrument/detail.tsx
  20. 9 0
      src/views/prepare-lessons/model/source-knowledge/index.module.less
  21. 9 0
      src/views/prepare-lessons/model/source-music/detail.module.less
  22. 3 0
      src/views/prepare-lessons/model/source-music/detail.tsx
  23. 2 2
      src/views/setting/components/schoolInfo/index.tsx
  24. 5 8
      src/views/studentList/components/evaluationRecords.tsx
  25. 4 0
      src/views/studentList/index.module.less
  26. 32 3
      src/views/xiaoku-music/component/play-item/index.module.less
  27. 13 12
      src/views/xiaoku-music/component/play-item/index.tsx
  28. binární
      src/views/xiaoku-music/images/song-arrow.png
  29. 1 1
      src/views/xiaoku-music/index.module.less
  30. 10 8
      src/views/xiaoku-music/index.tsx

+ 1 - 0
src/components/card-preview/music-modal/index.module.less

@@ -1,6 +1,7 @@
 .musicScore {
   width: 100%;
   height: 518px;
+  background-color: #213793;
 
   iframe {
     width: inherit;

+ 5 - 0
src/components/card-preview/video-modal/index.tsx

@@ -231,6 +231,11 @@ export default defineComponent({
     });
     onUnmounted(() => {
       window.removeEventListener('fullscreenchange', onFullScreenChange);
+      if(videoItem.value) {
+        videoItem.value.pause()
+        videoItem.value.dispose()
+        videoItem.value = null
+      }
     });
 
     expose({

+ 2 - 2
src/utils/contants.ts

@@ -77,9 +77,9 @@ export const gradeToCN = {
  * 场景
  */
 export const audioPlayType = {
-  PLAY: '演奏',
   SING: '演唱',
-  PLAY_SING: '演奏+演唱'
+  PLAY: '演奏',
+  PLAY_SING: '演唱+演奏'
 } as any;
 
 /**

+ 0 - 2
src/views/attend-class/component/audio-pay.tsx

@@ -420,8 +420,6 @@ export default defineComponent({
       });
       window.addEventListener('online', onChangeOnlineStatus);
       window.addEventListener('offline', onChangeOnlineStatus);
-
-      console.log(props.item, 'item');
     });
 
     onUnmounted(() => {

+ 8 - 2
src/views/content-information/content-instrument/detail.module.less

@@ -39,6 +39,11 @@
 
     .highlight {
       color: #0378EC;
+      background-color: #E1F0FF;
+    }
+
+    .speak-label {
+      cursor: pointer;
     }
 
   }
@@ -434,9 +439,10 @@
     padding: 0 27px;
     user-select: text;
     position: relative;
+    cursor: pointer;
 
-    &::selection {
-      background-color: #dfdfdf;
+    ::selection {
+      background-color: #E1F0FF;
     }
 
     &>img {

+ 3 - 2
src/views/content-information/content-instrument/detail.tsx

@@ -11,7 +11,6 @@ import {
   computed,
   defineComponent,
   onMounted,
-  onUnmounted,
   reactive,
   watch
 } from 'vue';
@@ -31,7 +30,6 @@ import TheNoticeBar from '/src/components/TheNoticeBar';
 import TheEmpty from '/src/components/TheEmpty';
 import PlayItem from '../../xiaoku-music/component/play-item';
 import { api_knowledgeWiki_detail } from '../api';
-import { state } from '/src/state';
 import { useSpeak } from '../useSpeak';
 
 export default defineComponent({
@@ -385,6 +383,9 @@ export default defineComponent({
             playState={data.playState}
             item={activeItem.value}
             onChange={value => handleChangeAudio(value)}
+            onShow={(status: boolean) => {
+              data.showPlayer = status
+           }}
           />
         )}
       </div>

+ 9 - 0
src/views/content-information/content-knowledge/index.module.less

@@ -38,6 +38,11 @@
 
     .highlight {
       color: #0378EC;
+      background-color: #E1F0FF;
+    }
+
+    .speak-label {
+      cursor: pointer;
     }
   }
 
@@ -271,6 +276,10 @@
     user-select: text;
     position: relative;
 
+    ::selection {
+      background-color: #E1F0FF;
+    }
+
     &>img {
       width: 100%;
     }

+ 32 - 0
src/views/content-information/content-music/components/list/search-group-resources.tsx

@@ -101,6 +101,38 @@ export default defineComponent({
       return [];
     });
 
+    const formatParentId = (id: any, list: any, ids = [] as any) => {
+      for (const item of list) {
+        if (item.childrenList && item.childrenList.length > 0) {
+          const cIds: any = formatParentId(id, item.childrenList, [
+            ...ids,
+            item.id
+          ]);
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.id === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    };
+
+    onMounted(() => {
+      // 处理缓存反显
+      if(props.wikiCategoryId) {
+        const ids = formatParentId(props.wikiCategoryId, props.categoryChildList)
+        if(ids.length > 0) {
+          forms.wikiCategoryId = ids[0]
+          forms.wikiCategoryIdChild = ids[ids.length - 1]
+        }
+      } else {
+        forms.wikiCategoryId = props.defaultWikiCategoryId
+      }
+      
+    })
+
     return () => (
       <div class={styles.searchGroup}>
         <div

+ 9 - 0
src/views/content-information/content-music/detail.module.less

@@ -38,6 +38,11 @@
 
     .highlight {
       color: #0378EC;
+      background-color: #E1F0FF;
+    }
+
+    .speak-label {
+      cursor: pointer;
     }
   }
 
@@ -421,6 +426,10 @@
     user-select: text;
     position: relative;
 
+    ::selection {
+      background-color: #E1F0FF;
+    }
+
     &>img {
       width: 100%;
     }

+ 3 - 0
src/views/content-information/content-music/detail.tsx

@@ -390,6 +390,9 @@ export default defineComponent({
             playState={data.playState}
             item={activeItem.value}
             onChange={value => handleChangeAudio(value)}
+            onShow={(status: boolean) => {
+              data.showPlayer = status
+            }}
           />
         )}
       </div>

+ 6 - 0
src/views/prepare-lessons/components/directory-main/index.module.less

@@ -40,6 +40,10 @@
   }
 }
 
+.theTooltip {
+  max-width: 300px !important;
+}
+
 .select-directory-info {
   display: flex;
   align-items: center;
@@ -133,6 +137,8 @@
       max-width: 200px;
     }
 
+    
+
     .subjects {
       font-size: max(14px, 11Px);
       color: #777777;

+ 17 - 5
src/views/prepare-lessons/components/directory-main/index.tsx

@@ -1,6 +1,6 @@
 import { computed, defineComponent, onMounted, reactive, ref } from 'vue';
 import styles from './index.module.less';
-import { NIcon, NSpin, NScrollbar, NModal, NImage } from 'naive-ui';
+import { NIcon, NSpin, NScrollbar, NModal, NImage, NTooltip } from 'naive-ui';
 import {
   lessonCoursewareDetail,
   lessonCoursewarePage,
@@ -12,7 +12,7 @@ import { usePrepareStore } from '/src/store/modules/prepareLessons';
 import { useUserStore } from '/src/store/modules/users';
 import { useRoute } from 'vue-router';
 import { eventGlobal } from '/src/utils';
-import TheNoticeBar from '/src/components/TheNoticeBar';
+// import TheNoticeBar from '/src/components/TheNoticeBar';
 import { getSubjectList2 } from '/src/api/user';
 import LessonsGuide from '@/custom-plugins/guide-page/lessons-guide';
 import { modalClickMask } from '/src/state';
@@ -273,17 +273,29 @@ export default defineComponent({
                     src={prepareStore.getBaseCourseware.coverImg}
                     lazy
                     previewDisabled={true}
-                    onLoad={e => {
+                    onLoad={(e: any) => {
                       (e.target as any).dataset.loaded = 'true';
                     }}
                   />
                 </div>
                 <div class={styles.itemContent}>
                   <h2>
-                    <TheNoticeBar text={prepareStore.getBaseCourseware.name} />
+                    {/* <TheNoticeBar text={prepareStore.getBaseCourseware.name} /> */}
+                    <NTooltip showArrow={false} class={styles.theTooltip} placement="top-start">
+                      {{
+                        trigger: () => prepareStore.getBaseCourseware.name,
+                        default: () => prepareStore.getBaseCourseware.name
+                      }}
+                    </NTooltip>
                   </h2>
                   <div class={styles.subjects}>
-                    <TheNoticeBar text={formatInstrumentNames.value} />
+                    {/* <TheNoticeBar text={formatInstrumentNames.value} /> */}
+                    <NTooltip showArrow={false} class={styles.theTooltip} placement="top-start">
+                      {{
+                        trigger: () => formatInstrumentNames.value,
+                        default: () => formatInstrumentNames.value
+                      }}
+                    </NTooltip>
                   </div>
                   <div
                     class={styles.changeDir}

+ 2 - 4
src/views/prepare-lessons/components/directory-main/select-lessonware/index.tsx

@@ -22,8 +22,6 @@ import AddTeaching, {
 import {
   lessonCoursewarePage,
   lessonCoursewareRemove,
-  bookVersionPage,
-  api_lessonCoursewarePage,
   api_lessonCoursewareTeacherCategory
 } from '../../../api';
 import iconUploadBg from '../images/icon-upload-bg.png';
@@ -243,11 +241,11 @@ export default defineComponent({
               </NFormItem>}
               
 
-              <NFormItem label="声部:">
+              <NFormItem label="乐器:">
                 <NSpace class={styles.spaceSection}>
                   {[
                     { name: '全部乐器', value: '' },
-                    ...catchStore.getSubjectList
+                    ...catchStore.getSubjectInstrumentOnly
                   ].map((subject: any) =>
                     subject.instruments && subject.instruments.length > 1 ? (
                       <NPopselect

+ 4 - 3
src/views/prepare-lessons/components/lesson-main/courseware-presets/index.tsx

@@ -383,7 +383,8 @@ export default defineComponent({
             type: 'class',
             classGroupId: classGroupId,
             courseId: item.id,
-            instrumentId: instrumentId || route.query.instrumentId,
+            instrumentId: prepareStore.getInstrumentId, // 产品说预览和上课都取当前选中的乐器
+            // instrumentId: instrumentId || route.query.instrumentId,
             detailId: prepareStore.getSelectKey,
             classId: res.data,
             lessonCourseId: prepareStore.getBaseCourseware.id,
@@ -396,8 +397,8 @@ export default defineComponent({
               type: 'class',
               classGroupId: classGroupId,
               courseId: item.id,
-              // instrumentId: prepareStore.getInstrumentId,
-              instrumentId: instrumentId || route.query.instrumentId,
+              instrumentId: prepareStore.getInstrumentId,
+              // instrumentId: instrumentId || route.query.instrumentId,
               detailId: prepareStore.getSelectKey,
               classId: res.data,
               lessonCourseId: prepareStore.getBaseCourseware.id,

+ 1 - 1
src/views/prepare-lessons/components/lesson-main/courseware/addCourseware.tsx

@@ -449,7 +449,6 @@ export default defineComponent({
         });
         forms.coursewareList[item.index || 0].list = array;
 
-        console.log(forms.coursewareList, 'courseware add drag');
         timer = setTimeout(() => {
           // 内容有更新 - 相关资源会刷新
           eventGlobal.emit('onCoursewareUpdate');
@@ -879,6 +878,7 @@ export default defineComponent({
                             isCollect: dropItem.isCollect,
                             isSelected: dropItem.isSelected,
                             content: dropItem.content,
+                            audioPlayTypeArray: dropItem.audioPlayTypeArray,
                             removeFlag: false,
                             index
                           },

+ 3 - 0
src/views/prepare-lessons/components/lesson-main/train/index.tsx

@@ -135,6 +135,9 @@ export default defineComponent({
           }
           temp.push({
             typeList: tList || [],
+            audioPlayTypeArray:row.audioPlayTypes
+            ? row.audioPlayTypes.split(',')
+            : [],
             ...row
           });
         });

+ 1 - 1
src/views/prepare-lessons/model/attend-class/index.tsx

@@ -50,7 +50,7 @@ export default defineComponent({
             emit('confirm', {
               lastUseCoursewareId: item.lessonCoursewareId,
               unit: item.lessonCoursewareKnowledgeDetailId,
-              instrumentId: item.instrumentId,
+              instrumentId: prepareStore.getInstrumentId, // item.instrumentId,
               courseScheduleSubjectId: item.courseScheduleSubjectId,
               name: item.name, // 班级名称
               classGroupId: item.id, // 班级编号

+ 7 - 2
src/views/prepare-lessons/model/source-instrument/detail.module.less

@@ -35,6 +35,11 @@
   :global {
     .highlight {
       color: #0378EC;
+      background-color: #E1F0FF;
+    }
+
+    .speak-label {
+      cursor: pointer;
     }
   }
 }
@@ -442,8 +447,8 @@
     user-select: text;
     position: relative;
 
-    &::selection {
-      background-color: #dfdfdf;
+    ::selection {
+      background-color: #E1F0FF;
     }
 
     &>img {

+ 3 - 0
src/views/prepare-lessons/model/source-instrument/detail.tsx

@@ -407,6 +407,9 @@ export default defineComponent({
             playState={data.playState}
             item={activeItem.value}
             onChange={value => handleChangeAudio(value)}
+            onShow={(status: boolean) => {
+              data.showPlayer = status
+            }}
           />
         )}
       </div>

+ 9 - 0
src/views/prepare-lessons/model/source-knowledge/index.module.less

@@ -269,6 +269,10 @@
     position: relative;
     user-select: text;
     position: relative;
+    
+    ::selection {
+      background-color: #E1F0FF;
+    }
 
     &:focus-visible {
       border: none !important;
@@ -279,6 +283,11 @@
     :global {
       .highlight {
         color: #0378EC;
+        background-color: #E1F0FF;
+      }
+  
+      .speak-label {
+        cursor: pointer;
       }
     }
 

+ 9 - 0
src/views/prepare-lessons/model/source-music/detail.module.less

@@ -23,6 +23,11 @@
   :global {
     .highlight {
       color: #0378EC;
+      background-color: #E1F0FF;
+    }
+
+    .speak-label {
+      cursor: pointer;
     }
   }
 }
@@ -395,6 +400,10 @@
     user-select: text;
     position: relative;
 
+    ::selection {
+      background-color: #E1F0FF;
+    }
+
     &>img {
       width: 100%;
     }

+ 3 - 0
src/views/prepare-lessons/model/source-music/detail.tsx

@@ -436,6 +436,9 @@ export default defineComponent({
             playState={data.playState}
             item={activeItem.value}
             onChange={value => handleChangeAudio(value)}
+            onShow={(status: boolean) => {
+              data.showPlayer = status
+            }}
           />
         )}
       </div>

+ 2 - 2
src/views/setting/components/schoolInfo/index.tsx

@@ -144,7 +144,7 @@ export default defineComponent({
               <NButton
                 type="primary"
                 text
-                disabled={btnStatus(row)}
+                disabled={row.id !== user.info.id && btnStatus(row)}
                 onClick={() => {
                   data.resetMessage = `重置"${row.nickname}"的密码,是否继续?`;
                   data.resetVisiable = true;
@@ -191,7 +191,7 @@ export default defineComponent({
     };
 
 
-    const btnStatus = (row: any) => {
+    const btnStatus = (row: any, type?: string) => {
       // 管理员
       if(user.info.teacherJobType === "ADMIN" && ["ADMIN", "HEADMASTER"].includes(row.jobType)) {
         return true

+ 5 - 8
src/views/studentList/components/evaluationRecords.tsx

@@ -1,4 +1,4 @@
-import { Ref, defineComponent, onMounted, reactive, ref } from 'vue';
+import {  defineComponent, onMounted, reactive, ref } from 'vue';
 import styles from '../index.module.less';
 import {
   NButton,
@@ -6,14 +6,12 @@ import {
   NForm,
   NFormItem,
   NInput,
-  NInputGroup,
   NInputNumber,
   NModal,
-  NNumberAnimation,
   NSpace,
   NTag
 } from 'naive-ui';
-import { useECharts } from '@/hooks/web/useECharts';
+// import { useECharts } from '@/hooks/web/useECharts';
 import Pagination from '/src/components/pagination';
 import { getPracticeRecordList } from '../api';
 import {
@@ -21,7 +19,7 @@ import {
   getNowDateAndSunday,
   getTimes
 } from '/src/utils/dateFormat';
-import { vaildMusicScoreUrl, vaildUrl } from '@/utils/urlUtils';
+import { vaildMusicScoreUrl } from '@/utils/urlUtils';
 import CDatePicker from '/src/components/CDatePicker';
 import { useUserStore } from '/src/store/modules/users';
 import TheEmpty from '/src/components/TheEmpty';
@@ -194,12 +192,12 @@ export default defineComponent({
       state.pagination.pageTotal = res.data.total;
     };
     const gotoRecode = (row: any) => {
-      const tockn = userStore.getToken;
+      const token = userStore.getToken;
       reportSrc.value =
         vaildMusicScoreUrl() +
         `/instrument/?v=${+new Date()}#/evaluat-report?v=${+new Date()}&id=${
           row.id
-        }&platform=webTeacher&Authorization=${tockn}`;
+        }&platform=webTeacher&Authorization=${token}`;
       payForm.detailVisiable = true;
     };
     const search = () => {
@@ -360,7 +358,6 @@ export default defineComponent({
           <div class={styles.reportContainer} style={{ lineHeight: 0 }}>
             <iframe
               width={'100%'}
-              height={'450px'}
               ref={iframeRef}
               frameborder="0"
               onLoad={(val: any) => {

+ 4 - 0
src/views/studentList/index.module.less

@@ -319,6 +319,10 @@
   overflow: hidden;
 }
 
+.reportContainer iframe {
+  height: 64vh;
+}
+
 .addStudentWrap {
   position: relative;
   width: 378px;

+ 32 - 3
src/views/xiaoku-music/component/play-item/index.module.less

@@ -20,14 +20,15 @@
   &.containerModal {
     position: absolute;
     left: 0;
-
   }
 }
 
 .hidden {
   transform: translateY(100%);
-  opacity: 0;
-  display: none;
+  &.item {
+     opacity: 0;
+     display: none;
+  }
 }
 
 .item {
@@ -171,4 +172,32 @@
     white-space: nowrap;
     flex-shrink: 0;
   }
+}
+
+
+.iconArrow {
+  position: absolute;
+  top: -24px;
+  right: 30px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: #fff;
+  cursor: pointer;
+  background: #ffffff;
+  border-radius: 100px 100px 0px 0px;
+  width: 44px;
+  height: 24px;
+  img {
+     margin-top: 3px;
+     width: 14px;
+     height: 14px;
+  }
+
+  &.down {
+     img {
+       margin-top: 0px;
+        transform: rotate(180deg);
+     }
+  }
 }

+ 13 - 12
src/views/xiaoku-music/component/play-item/index.tsx

@@ -1,12 +1,4 @@
-import {
-  PropType,
-  Transition,
-  computed,
-  defineComponent,
-  reactive,
-  ref,
-  watch
-} from 'vue';
+import { PropType, computed, defineComponent, reactive, ref, watch } from 'vue';
 import styles from './index.module.less';
 import { NButton, NImage, NProgress, NSlider } from 'naive-ui';
 import { IMusicItem } from '../../type';
@@ -14,6 +6,7 @@ import icon_pre from '../../images/icon_pre.png';
 import icon_next from '../../images/icon_next.png';
 import icon_play from '../../images/icon_play.png';
 import icon_pause from '../../images/icon_pause.png';
+import song_arrow from '../../images/song-arrow.png';
 import { getSecondRPM } from '/src/utils';
 import TheNoticeBar from '/src/components/TheNoticeBar';
 
@@ -37,7 +30,7 @@ export default defineComponent({
       default: ''
     }
   },
-  emits: ['change'],
+  emits: ['change', 'show'],
   setup(props, { emit }) {
     let timer = null as any;
     const audioData = reactive({
@@ -127,7 +120,7 @@ export default defineComponent({
                 props.item.titleImg ||
                 'https://oss.dayaedu.com/klx/16983720423251690789356356.png'
               }
-              onLoad={e => {
+              onLoad={(e: any) => {
                 (e.target as any).dataset.loaded = 'true';
               }}
             />
@@ -202,7 +195,7 @@ export default defineComponent({
               class={styles.timeProgress}
               value={audioData.currentTime}
               max={audioData.duration}
-              onUpdate:value={val => handleChangeTime(val)}
+              onUpdate:value={(val: any) => handleChangeTime(val)}
             />
             <div class={styles.time}>{time.value}</div>
             <audio
@@ -218,6 +211,14 @@ export default defineComponent({
               }}></audio>
           </div>
         </div>
+
+        <div
+          class={[styles.iconArrow, props.show ? '' : styles.down]}
+          onClick={() => {
+            emit('show', !props.show);
+          }}>
+          <img src={song_arrow as any} />
+        </div>
       </div>
     );
   }

binární
src/views/xiaoku-music/images/song-arrow.png


+ 1 - 1
src/views/xiaoku-music/index.module.less

@@ -530,7 +530,7 @@
   .previewIframe {
     width: 100%;
     height: 85vh;
-    background-color: #fff;
+    background-color: #213793;
     border-radius: 16px;
   }
 }

+ 10 - 8
src/views/xiaoku-music/index.tsx

@@ -865,7 +865,7 @@ export default defineComponent({
                               objectFit="cover"
                               previewDisabled={true}
                               src={item.titleImg || icon_default}
-                              onLoad={e => {
+                              onLoad={(e: any) => {
                                 (e.target as any).dataset.loaded = 'true';
                               }}
                             />
@@ -883,17 +883,16 @@ export default defineComponent({
                               <TheNoticeBar text={item.musicSheetName} />
                             </div>
                             <div class={styles.titleDes}>
-                              {item.audioPlayTypeArray?.includes('PLAY') && (
+                            {item.audioPlayTypeArray?.includes('SING') && (
                                 <span
-                                  class={[styles.iconType, styles.iconPlay]}>
-                                  演
+                                  class={[styles.iconType, styles.iconSing]}>
+                                  演
                                 </span>
                               )}
-
-                              {item.audioPlayTypeArray?.includes('SING') && (
+                              {item.audioPlayTypeArray?.includes('PLAY') && (
                                 <span
-                                  class={[styles.iconType, styles.iconSing]}>
-                                  演
+                                  class={[styles.iconType, styles.iconPlay]}>
+                                  演
                                 </span>
                               )}
 
@@ -1133,6 +1132,9 @@ export default defineComponent({
             playState={data.playState}
             item={activeItem.value}
             onChange={value => handleChangeAudio(value)}
+            onShow={(status: boolean) => {
+              data.showPlayer = status
+           }}
           />
         )}
         {showGuide.value ? <Musicguide></Musicguide> : null}