|
@@ -1,4 +1,4 @@
|
|
|
-import { closeToast, Icon, Popup, showDialog, showToast } from 'vant';
|
|
|
+import { closeToast, Form, Icon, Popup, showDialog, showToast } from 'vant';
|
|
|
import {
|
|
|
defineComponent,
|
|
|
onMounted,
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
api_classLessonCoursewareQuery,
|
|
|
api_lessonCoursewareKnowledgeDetailDetail
|
|
|
} from './api';
|
|
|
+import { api_lessonDetailCourseware, api_classDetailCourseware } from '../courseware-list/api'
|
|
|
import VideoItem from './component/video-item';
|
|
|
import Chapter from './component/chapter';
|
|
|
import {
|
|
@@ -45,12 +46,17 @@ import {
|
|
|
} from '../courseware-list/api';
|
|
|
import detail from '../information/help-center/detail';
|
|
|
import { state } from '@/state';
|
|
|
+import Theory from './component/theory';
|
|
|
+import InstrumentInfo from './component/instrument-info';
|
|
|
+import TempoPractice from '../../views/tempo-practice'
|
|
|
+import SelectCoursewarePop from '@/components/select-courseware-pop';
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'CoursewarePlay',
|
|
|
setup() {
|
|
|
const pageVisibility = usePageVisibility();
|
|
|
const lastTimeKey = 'lastTime' + (state?.user?.data?.phone ?? '');
|
|
|
+ const showSelectCourseware = ref(false);
|
|
|
/** 设置播放容器 16:9 */
|
|
|
const parentContainer = reactive({
|
|
|
width: '100vw'
|
|
@@ -140,21 +146,25 @@ export default defineComponent({
|
|
|
const headeRef = ref();
|
|
|
const loadingClass = ref(false); // 重新加载课件
|
|
|
const data = reactive({
|
|
|
- knowledgePointList: [] as any,
|
|
|
+ allList: [] as any, // 所选章节下的所有课件列表
|
|
|
+ kjId: route.query.id as string, // 所选的课件id
|
|
|
+ zsdId: '' as string, // 知识点id
|
|
|
+ knowledgePointList: [] as any, //所选课件,所选知识点下所有的资源列表
|
|
|
courseDetails: [] as any,
|
|
|
itemList: [] as any,
|
|
|
videoRefs: {} as any[],
|
|
|
|
|
|
videoState: 'init' as 'init' | 'play',
|
|
|
videoItemRef: null as any,
|
|
|
- animationState: 'start' as 'start' | 'end'
|
|
|
+ animationState: 'start' as 'start' | 'end',
|
|
|
+ coursewareList: [],
|
|
|
});
|
|
|
const activeData = reactive({
|
|
|
isAutoPlay: true, // 是否自动播放
|
|
|
subjectId: route.query.subjectId,
|
|
|
lessonCoursewareId: route.query.lessonCoursewareId,
|
|
|
lessonCoursewareDetailId: route.query.lessonCoursewareDetailId,
|
|
|
- coursewareDetailKnowledgeId: route.query.id,
|
|
|
+ coursewareDetailKnowledgeId: route.query.coursewareDetailKnowledgeId,
|
|
|
courseId: route.query.courseId, // 我的课程专用编号
|
|
|
nowTime: 0,
|
|
|
model: true, // 遮罩
|
|
@@ -166,37 +176,58 @@ export default defineComponent({
|
|
|
item: null as any
|
|
|
});
|
|
|
const getDetail = async () => {
|
|
|
+ data.allList = []
|
|
|
let courseList: any[] = [];
|
|
|
if (route.query.tab == 'course') {
|
|
|
- const res = await api_classLessonCoursewareQuery({
|
|
|
- coursewareDetailKnowledgeId: activeData.coursewareDetailKnowledgeId,
|
|
|
- subjectId: activeData.subjectId,
|
|
|
- page: 1,
|
|
|
- rows: -1
|
|
|
+ // const res = await api_classLessonCoursewareQuery({
|
|
|
+ // coursewareDetailKnowledgeId: activeData.coursewareDetailKnowledgeId,
|
|
|
+ // subjectId: activeData.subjectId,
|
|
|
+ // page: 1,
|
|
|
+ // rows: -1
|
|
|
+ // });
|
|
|
+ const res = await api_classDetailCourseware({
|
|
|
+ lessonCoursewareKnowledgeDetailId: activeData.coursewareDetailKnowledgeId, // 章节id
|
|
|
});
|
|
|
- if (res?.code === 200 && Array.isArray(res.data.rows)) {
|
|
|
- const tempRows = res.data.rows || [];
|
|
|
- tempRows.forEach((item: any) => {
|
|
|
- courseList.push({
|
|
|
- content: item.content,
|
|
|
- coverImg: item.coverImg,
|
|
|
- id: item.id,
|
|
|
- materialId: item.materialId,
|
|
|
- name: item.materialName,
|
|
|
- relOrder: 0,
|
|
|
- sourceFrom: item.source,
|
|
|
- type: item.materialType
|
|
|
- });
|
|
|
- });
|
|
|
+ if (res?.code === 200 && Array.isArray(res.data)) {
|
|
|
+ // const tempRows = res.data.rows || [];
|
|
|
+ // tempRows.forEach((item: any) => {
|
|
|
+ // courseList.push({
|
|
|
+ // content: item.content,
|
|
|
+ // coverImg: item.coverImg,
|
|
|
+ // id: item.id,
|
|
|
+ // materialId: item.materialId,
|
|
|
+ // name: item.materialName,
|
|
|
+ // relOrder: 0,
|
|
|
+ // sourceFrom: item.source,
|
|
|
+ // type: item.materialType
|
|
|
+ // });
|
|
|
+ // });
|
|
|
+ res.data.forEach((item: any) => {
|
|
|
+ item.knowledgeList = item.resourceList
|
|
|
+ item.resourceList.forEach((n: any) => {
|
|
|
+ n.materialInfo = n.resourceList
|
|
|
+ })
|
|
|
+ })
|
|
|
+ data.allList = res.data
|
|
|
+ const currentCourse = res.data.find((item: any) => item.id === data.kjId)
|
|
|
+ data.zsdId = currentCourse?.knowledgeList?.[0].id;
|
|
|
+ courseList = currentCourse?.knowledgeList?.[0].materialInfo || [];
|
|
|
}
|
|
|
} else {
|
|
|
- const res = await api_lessonCoursewareKnowledgeDetailDetail({
|
|
|
- lessonCoursewareKnowledgeDetailId:
|
|
|
- activeData.coursewareDetailKnowledgeId,
|
|
|
- subjectId: activeData.subjectId
|
|
|
+ // const res = await api_lessonCoursewareKnowledgeDetailDetail({
|
|
|
+ // lessonCoursewareKnowledgeDetailId:
|
|
|
+ // activeData.coursewareDetailKnowledgeId,
|
|
|
+ // subjectId: activeData.subjectId
|
|
|
+ // });
|
|
|
+ const res = await api_lessonDetailCourseware({
|
|
|
+ lessonCoursewareKnowledgeDetailId: activeData.coursewareDetailKnowledgeId, // 章节id
|
|
|
});
|
|
|
if (res?.code === 200 && Array.isArray(res.data)) {
|
|
|
- courseList = res.data || [];
|
|
|
+ data.allList = res.data
|
|
|
+ const currentCourse = res.data.find((item: any) => item.id === data.kjId)
|
|
|
+ data.zsdId = currentCourse?.knowledgeList?.[0].id;
|
|
|
+ courseList = currentCourse?.knowledgeList?.[0].materialInfo || [];
|
|
|
+ console.log('课件类型',data.allList)
|
|
|
}
|
|
|
}
|
|
|
// 课程
|
|
@@ -213,7 +244,18 @@ export default defineComponent({
|
|
|
};
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
+ data.allList.forEach((item: any) => {
|
|
|
+ item.knowledgeList.forEach((material: any) => {
|
|
|
+ material.materialInfo.forEach((resource: any) => {
|
|
|
+ resource.url = resource.type === 'SONG'
|
|
|
+ ? 'https://oss.dayaedu.com/ktqy/1698420034679a22d3f7a.png'
|
|
|
+ : resource.type === 'PPT'
|
|
|
+ ? 'https://oss.dayaedu.com/ktqy/12/1701931810284.png'
|
|
|
+ : resource.coverImg
|
|
|
+ })
|
|
|
+ })
|
|
|
+ })
|
|
|
+ console.log('资源1',data.allList)
|
|
|
data.itemList = data.knowledgePointList.map((m: any, index: number) => {
|
|
|
if (!popupData.itemActive) {
|
|
|
popupData.itemActive = m.id;
|
|
@@ -279,11 +321,36 @@ export default defineComponent({
|
|
|
});
|
|
|
|
|
|
// 切换素材
|
|
|
- const toggleMaterial = (itemActive: any) => {
|
|
|
- const index = data.itemList.findIndex((n: any) => n.id == itemActive);
|
|
|
- if (index > -1) {
|
|
|
- handleSwipeChange(index);
|
|
|
+ const toggleMaterial = (itemActive: any, zsdId: any, kjId: any) => {
|
|
|
+ // 如果切换了知识点或者切换了课件,需要加载新的
|
|
|
+ if (zsdId !== data.zsdId || kjId !== data.kjId) {
|
|
|
+ data.zsdId = zsdId
|
|
|
+ data.kjId = kjId
|
|
|
+ let target = { materialInfo: [] }
|
|
|
+ // 如果是切换了知识点id
|
|
|
+ const kjIndex = data.allList.findIndex((item: any) => item.id === kjId)
|
|
|
+ target = data.allList[kjIndex].knowledgeList.find((item: any) => item.id === zsdId)
|
|
|
+ data.itemList = target?.materialInfo.map((m: any, index: number) => {
|
|
|
+ if (!popupData.itemActive) {
|
|
|
+ popupData.itemActive = m.id;
|
|
|
+ popupData.itemName = m.name;
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ ...m,
|
|
|
+ iframeRef: null,
|
|
|
+ videoEle: null,
|
|
|
+ autoPlay: false, //加载完成是否自动播放
|
|
|
+ isprepare: false, // 视频是否加载完成
|
|
|
+ isRender: false // 是否渲染了
|
|
|
+ };
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ const index = data.itemList.findIndex((n: any) => n.id == itemActive);
|
|
|
+ if (index > -1) {
|
|
|
+ handleSwipeChange(index);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
};
|
|
|
/** 延迟收起模态框 */
|
|
|
const setModelOpen = () => {
|
|
@@ -740,6 +807,42 @@ export default defineComponent({
|
|
|
}
|
|
|
return {};
|
|
|
});
|
|
|
+
|
|
|
+ // 加载新的章节里的课件
|
|
|
+ const loadNewCourseware = async (item: any) => {
|
|
|
+ loadingClass.value = true;
|
|
|
+ activeData.coursewareDetailKnowledgeId = item.coursewareDetailKnowledgeId;
|
|
|
+ popupData.chapterOpen = false;
|
|
|
+ showSelectCourseware.value = false;
|
|
|
+ data.kjId = item.id
|
|
|
+ await getDetail();
|
|
|
+ popupData.activeIndex = 0;
|
|
|
+ popupData.itemActive = data.knowledgePointList[0].id;
|
|
|
+ popupData.itemName = data.knowledgePointList[0].name;
|
|
|
+ loadingClass.value = false;
|
|
|
+ }
|
|
|
+ // 通过章节id,检测此章节有几个课件
|
|
|
+ const checkCourseware = async (item: any) => {
|
|
|
+ // 如果有多个课件,需要选择一个课件进入上课页面
|
|
|
+ if (item.coursewareNum && item.coursewareNum > 1) {
|
|
|
+ try {
|
|
|
+ const res = route.query.tab == 'all' ? await api_lessonDetailCourseware({
|
|
|
+ lessonCoursewareKnowledgeDetailId: item.itemActive,
|
|
|
+ }): await api_classDetailCourseware({
|
|
|
+ lessonCoursewareKnowledgeDetailId: item.itemActive,
|
|
|
+ })
|
|
|
+ if (res?.code == 200 ) {
|
|
|
+ data.coursewareList = res.data;
|
|
|
+ showSelectCourseware.value = true;
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ loadNewCourseware(item);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
return () => (
|
|
|
<div id="playContent" class={styles.playContent}>
|
|
|
<div
|
|
@@ -906,6 +1009,23 @@ export default defineComponent({
|
|
|
)}
|
|
|
</Transition>
|
|
|
)}
|
|
|
+
|
|
|
+ {/* 新增:RHYTHM:节奏练习,THEORY:乐理知识,MUSIC_WIKI:名曲鉴赏 INSTRUMENT:乐器 MUSICIAN:音乐家 资源类型 */}
|
|
|
+ {m.type === 'RHYTHM' &&
|
|
|
+ <TempoPractice dataJson={m?.dataJson ? JSON.parse(m?.dataJson) : {}} />
|
|
|
+ }
|
|
|
+ {m.type === 'THEORY' && (
|
|
|
+ <Theory id={m.bizId} />
|
|
|
+ )}
|
|
|
+ {m.type === 'MUSIC_WIKI' && (
|
|
|
+ <InstrumentInfo type={'wiki'} id={m.bizId} />
|
|
|
+ )}
|
|
|
+ {m.type === 'INSTRUMENT' && (
|
|
|
+ <InstrumentInfo type={'instrument'} id={m.bizId} />
|
|
|
+ )}
|
|
|
+ {m.type === 'MUSICIAN' && (
|
|
|
+ <InstrumentInfo type={'musician'} id={m.bizId} />
|
|
|
+ )}
|
|
|
</div>
|
|
|
) : (
|
|
|
<div
|
|
@@ -996,12 +1116,15 @@ export default defineComponent({
|
|
|
v-model:show={popupData.open}
|
|
|
onClose={handleClosePopup}>
|
|
|
<Points
|
|
|
+ allList={data.allList}
|
|
|
data={data.knowledgePointList}
|
|
|
itemActive={popupData.itemActive}
|
|
|
itemName={popupData.itemPointName}
|
|
|
+ kjId={data.kjId}
|
|
|
+ zsdId={data.zsdId}
|
|
|
onHandleSelect={(res: any) => {
|
|
|
popupData.open = false;
|
|
|
- toggleMaterial(res.itemActive);
|
|
|
+ toggleMaterial(res.itemActive, res.zsdId, res.kjId);
|
|
|
}}
|
|
|
/>
|
|
|
</Popup>
|
|
@@ -1019,19 +1142,22 @@ export default defineComponent({
|
|
|
itemActive={activeData.coursewareDetailKnowledgeId as any}
|
|
|
active={activeData.lessonCoursewareDetailId as any}
|
|
|
onHandleSelect={async (item: any) => {
|
|
|
- loadingClass.value = true;
|
|
|
- activeData.coursewareDetailKnowledgeId = item.itemActive;
|
|
|
activeData.lessonCoursewareDetailId = item.tabActive;
|
|
|
- await getDetail();
|
|
|
- popupData.activeIndex = 0;
|
|
|
- popupData.itemActive = data.knowledgePointList[0].id;
|
|
|
- popupData.itemName = data.knowledgePointList[0].name;
|
|
|
popupData.itemPointName = item.itemName;
|
|
|
- popupData.chapterOpen = false;
|
|
|
- loadingClass.value = false;
|
|
|
+ checkCourseware(item)
|
|
|
}}
|
|
|
/>
|
|
|
</Popup>
|
|
|
+ {
|
|
|
+ showSelectCourseware.value &&
|
|
|
+ <SelectCoursewarePop
|
|
|
+ list={data.coursewareList}
|
|
|
+ onClose={() => {
|
|
|
+ showSelectCourseware.value = false;
|
|
|
+ }}
|
|
|
+ onSelect={(item) => loadNewCourseware(item)}
|
|
|
+ ></SelectCoursewarePop>
|
|
|
+ }
|
|
|
</div>
|
|
|
);
|
|
|
}
|