|  | @@ -5,7 +5,8 @@ import {
 | 
	
		
			
				|  |  |    onUnmounted,
 | 
	
		
			
				|  |  |    ref,
 | 
	
		
			
				|  |  |    Transition,
 | 
	
		
			
				|  |  | -  computed
 | 
	
		
			
				|  |  | +  computed,
 | 
	
		
			
				|  |  | +  nextTick
 | 
	
		
			
				|  |  |  } from 'vue';
 | 
	
		
			
				|  |  |  import styles from './index.module.less';
 | 
	
		
			
				|  |  |  import 'plyr/dist/plyr.css';
 | 
	
	
		
			
				|  | @@ -48,7 +49,6 @@ import beatIcon from '/src/components/layout/images/beatIcon.png';
 | 
	
		
			
				|  |  |  import toneIcon from '/src/components/layout/images/toneIcon.png';
 | 
	
		
			
				|  |  |  import { px2vw } from '/src/utils';
 | 
	
		
			
				|  |  |  import PlaceholderTone from '/src/components/layout/modals/placeholderTone';
 | 
	
		
			
				|  |  | -import { state } from '/src/state';
 | 
	
		
			
				|  |  |  export type ToolType = 'init' | 'pen' | 'whiteboard';
 | 
	
		
			
				|  |  |  export type ToolItem = {
 | 
	
		
			
				|  |  |    type: ToolType;
 | 
	
	
		
			
				|  | @@ -58,26 +58,7 @@ export type ToolItem = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  export default defineComponent({
 | 
	
		
			
				|  |  |    name: 'CoursewarePlay',
 | 
	
		
			
				|  |  | -  props: {
 | 
	
		
			
				|  |  | -    type: {
 | 
	
		
			
				|  |  | -      type: String,
 | 
	
		
			
				|  |  | -      default: ''
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    subjectId: {
 | 
	
		
			
				|  |  | -      type: [String, Number],
 | 
	
		
			
				|  |  | -      default: ''
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    detailId: {
 | 
	
		
			
				|  |  | -      type: String,
 | 
	
		
			
				|  |  | -      default: ''
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    classGroupId: {
 | 
	
		
			
				|  |  | -      type: String,
 | 
	
		
			
				|  |  | -      default: ''
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  emits: ['close'],
 | 
	
		
			
				|  |  | -  setup(props, { emit }) {
 | 
	
		
			
				|  |  | +  setup() {
 | 
	
		
			
				|  |  |      const message = useMessage();
 | 
	
		
			
				|  |  |      const route = useRoute();
 | 
	
		
			
				|  |  |      /** 设置播放容器 16:9 */
 | 
	
	
		
			
				|  | @@ -120,7 +101,10 @@ export default defineComponent({
 | 
	
		
			
				|  |  |        modelAttendStatus: false, // 布置作业提示弹窗
 | 
	
		
			
				|  |  |        modalAttendMessage: '本节课未设置课后训练,是否继续?',
 | 
	
		
			
				|  |  |        modelTrainStatus: false, // 训练设置
 | 
	
		
			
				|  |  | -      homeworkStatus: true // 布置作业完成时
 | 
	
		
			
				|  |  | +      homeworkStatus: true, // 布置作业完成时
 | 
	
		
			
				|  |  | +      removeVisiable: false,
 | 
	
		
			
				|  |  | +      removeTitle: '',
 | 
	
		
			
				|  |  | +      removeContent: ''
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |      const activeData = reactive({
 | 
	
		
			
				|  |  |        // isAutoPlay: false, // 是否自动播放
 | 
	
	
		
			
				|  | @@ -308,11 +292,10 @@ export default defineComponent({
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      onMounted(() => {
 | 
	
		
			
				|  |  |        const query = route.query;
 | 
	
		
			
				|  |  | -      // 先取参数,
 | 
	
		
			
				|  |  | -      data.type = props.type || (query.type as any);
 | 
	
		
			
				|  |  | -      data.subjectId = props.subjectId || query.subjectId;
 | 
	
		
			
				|  |  | -      data.detailId = props.detailId || query.detailId;
 | 
	
		
			
				|  |  | -      data.classGroupId = props.classGroupId || query.classGroupId;
 | 
	
		
			
				|  |  | +      data.type = query.type as any;
 | 
	
		
			
				|  |  | +      data.subjectId = query.subjectId;
 | 
	
		
			
				|  |  | +      data.detailId = query.detailId;
 | 
	
		
			
				|  |  | +      data.classGroupId = query.classGroupId;
 | 
	
		
			
				|  |  |        initMoveable();
 | 
	
		
			
				|  |  |        window.addEventListener('message', iframeHandle);
 | 
	
		
			
				|  |  |        getDetail();
 | 
	
	
		
			
				|  | @@ -353,12 +336,12 @@ export default defineComponent({
 | 
	
		
			
				|  |  |        for (let i = 0; i < data.itemList.length; i++) {
 | 
	
		
			
				|  |  |          const activeItem = data.itemList[i];
 | 
	
		
			
				|  |  |          if (activeItem.type === 'VIDEO' && activeItem.videoEle) {
 | 
	
		
			
				|  |  | -          activeItem.videoEle.currentTime(0);
 | 
	
		
			
				|  |  | -          activeItem.videoEle.pause();
 | 
	
		
			
				|  |  | +          console.log(activeItem.videoEle, 'activeItem.videoEle');
 | 
	
		
			
				|  |  | +          activeItem.videoEle?.pause();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (activeItem.type === 'SONG' && activeItem.audioEle) {
 | 
	
		
			
				|  |  | -          activeItem.audioEle.stop();
 | 
	
		
			
				|  |  | +          activeItem.audioEle?.stop();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          // console.log('🚀 ~ activeItem:', activeItem)
 | 
	
		
			
				|  |  |          // 停止曲谱的播放
 | 
	
	
		
			
				|  | @@ -527,9 +510,12 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                clearTimeout(activeData.timer);
 | 
	
		
			
				|  |  |                message.destroyAll();
 | 
	
		
			
				|  |  |                // item.autoPlay = false;
 | 
	
		
			
				|  |  | -              // nextTick(() => {
 | 
	
		
			
				|  |  | -              //   item.videoEle?.play();
 | 
	
		
			
				|  |  | -              // });
 | 
	
		
			
				|  |  | +              nextTick(() => {
 | 
	
		
			
				|  |  | +                if (item.error) {
 | 
	
		
			
				|  |  | +                  item.videoEle?.src(item.content);
 | 
	
		
			
				|  |  | +                  //   item.videoEle?.onPlay();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              });
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |            //   requestAnimationFrame(() => {
 | 
	
	
		
			
				|  | @@ -613,10 +599,10 @@ export default defineComponent({
 | 
	
		
			
				|  |  |        const activeItem = data.itemList[popupData.activeIndex];
 | 
	
		
			
				|  |  |        // 暂停视频和曲谱的播放
 | 
	
		
			
				|  |  |        if (activeItem.type === 'VIDEO' && activeItem.videoEle) {
 | 
	
		
			
				|  |  | -        activeItem.videoEle.pause();
 | 
	
		
			
				|  |  | +        activeItem.videoEle?.stop();
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        if (activeItem.type === 'SONG' && activeItem.audioEle) {
 | 
	
		
			
				|  |  | -        activeItem.audioEle.stop();
 | 
	
		
			
				|  |  | +        activeItem.audioEle?.stop();
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        if (activeItem.type === 'MUSIC') {
 | 
	
		
			
				|  |  |          activeItem.iframeRef?.contentWindow?.postMessage(
 | 
	
	
		
			
				|  | @@ -745,6 +731,9 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                                setModelOpen();
 | 
	
		
			
				|  |  |                              }
 | 
	
		
			
				|  |  |                            }}
 | 
	
		
			
				|  |  | +                          onError={() => {
 | 
	
		
			
				|  |  | +                            m.error = true;
 | 
	
		
			
				|  |  | +                          }}
 | 
	
		
			
				|  |  |                          />
 | 
	
		
			
				|  |  |                          <Transition name="van-fade">
 | 
	
		
			
				|  |  |                            {!m.isprepare && (
 | 
	
	
		
			
				|  | @@ -866,13 +855,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            ]}
 | 
	
		
			
				|  |  |            onClick={async () => {
 | 
	
		
			
				|  |  |              if (data.type === 'preview') {
 | 
	
		
			
				|  |  | -              handleStop();
 | 
	
		
			
				|  |  | -              if (state.application) {
 | 
	
		
			
				|  |  | -                emit('close');
 | 
	
		
			
				|  |  | -              } else {
 | 
	
		
			
				|  |  | -                window.close();
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +              window.close();
 | 
	
		
			
				|  |  |                // onFullScreen();
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                const res = await lessonPreTrainingPage({
 | 
	
	
		
			
				|  | @@ -991,12 +974,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                round
 | 
	
		
			
				|  |  |                onClick={() => {
 | 
	
		
			
				|  |  |                  data.modelAttendStatus = false;
 | 
	
		
			
				|  |  | -                handleStop();
 | 
	
		
			
				|  |  | -                if (state.application) {
 | 
	
		
			
				|  |  | -                  emit('close');
 | 
	
		
			
				|  |  | -                } else {
 | 
	
		
			
				|  |  | -                  window.close();
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                window.close();
 | 
	
		
			
				|  |  |                }}>
 | 
	
		
			
				|  |  |                暂不布置
 | 
	
		
			
				|  |  |              </NButton>
 | 
	
	
		
			
				|  | @@ -1026,12 +1004,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |              onConfirm={() => {
 | 
	
		
			
				|  |  |                // 布置完作业之后直接关闭
 | 
	
		
			
				|  |  |                setTimeout(() => {
 | 
	
		
			
				|  |  | -                handleStop();
 | 
	
		
			
				|  |  | -                if (state.application) {
 | 
	
		
			
				|  |  | -                  emit('close');
 | 
	
		
			
				|  |  | -                } else {
 | 
	
		
			
				|  |  | -                  window.close();
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                window.close();
 | 
	
		
			
				|  |  |                }, 1000);
 | 
	
		
			
				|  |  |              }}
 | 
	
		
			
				|  |  |            />
 | 
	
	
		
			
				|  | @@ -1134,6 +1107,54 @@ export default defineComponent({
 | 
	
		
			
				|  |  |              <TimerMeter></TimerMeter>
 | 
	
		
			
				|  |  |            </div>
 | 
	
		
			
				|  |  |          </NModal>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <NModal
 | 
	
		
			
				|  |  | +          v-model:show={data.removeVisiable}
 | 
	
		
			
				|  |  | +          preset="card"
 | 
	
		
			
				|  |  | +          class={['modalTitle', styles.removeVisiable]}
 | 
	
		
			
				|  |  | +          title={data.removeTitle}>
 | 
	
		
			
				|  |  | +          <div class={styles.studentRemove}>
 | 
	
		
			
				|  |  | +            <p>{data.removeContent}</p>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <NSpace class={styles.btnGroupModal} justify="center">
 | 
	
		
			
				|  |  | +              <NButton
 | 
	
		
			
				|  |  | +                round
 | 
	
		
			
				|  |  | +                type="primary"
 | 
	
		
			
				|  |  | +                onClick={() => {
 | 
	
		
			
				|  |  | +                  //
 | 
	
		
			
				|  |  | +                }}>
 | 
	
		
			
				|  |  | +                确定
 | 
	
		
			
				|  |  | +              </NButton>
 | 
	
		
			
				|  |  | +              <NButton round onClick={() => (data.removeVisiable = false)}>
 | 
	
		
			
				|  |  | +                取消
 | 
	
		
			
				|  |  | +              </NButton>
 | 
	
		
			
				|  |  | +            </NSpace>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </NModal>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <NModal
 | 
	
		
			
				|  |  | +          v-model:show={data.removeVisiable}
 | 
	
		
			
				|  |  | +          preset="card"
 | 
	
		
			
				|  |  | +          class={['modalTitle', styles.removeVisiable]}
 | 
	
		
			
				|  |  | +          title={data.removeTitle}>
 | 
	
		
			
				|  |  | +          <div class={styles.studentRemove}>
 | 
	
		
			
				|  |  | +            <p>{data.removeContent}</p>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <NSpace class={styles.btnGroupModal} justify="center">
 | 
	
		
			
				|  |  | +              <NButton
 | 
	
		
			
				|  |  | +                round
 | 
	
		
			
				|  |  | +                type="primary"
 | 
	
		
			
				|  |  | +                onClick={() => {
 | 
	
		
			
				|  |  | +                  //
 | 
	
		
			
				|  |  | +                }}>
 | 
	
		
			
				|  |  | +                确定
 | 
	
		
			
				|  |  | +              </NButton>
 | 
	
		
			
				|  |  | +              <NButton round onClick={() => (data.removeVisiable = false)}>
 | 
	
		
			
				|  |  | +                取消
 | 
	
		
			
				|  |  | +              </NButton>
 | 
	
		
			
				|  |  | +            </NSpace>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </NModal>
 | 
	
		
			
				|  |  |        </div>
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  |    }
 |