index.tsx 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295
  1. import { closeToast, Form, Icon, Popup, showDialog, showToast } from 'vant';
  2. import {
  3. defineComponent,
  4. onMounted,
  5. reactive,
  6. nextTick,
  7. onUnmounted,
  8. ref,
  9. watch,
  10. Transition,
  11. computed
  12. } from 'vue';
  13. import iconBack from './image/back.svg';
  14. import styles from './index.module.less';
  15. import 'plyr/dist/plyr.css';
  16. import { useRoute, useRouter } from 'vue-router';
  17. import {
  18. listenerMessage,
  19. postMessage,
  20. promisefiyPostMessage,
  21. removeListenerMessage
  22. } from '@/helpers/native-message';
  23. import MusicScore from './component/musicScore';
  24. import iconMenu from './image/icon-menu.svg';
  25. import iconChange from './image/icon-change.svg';
  26. import iconDian from './image/icon-dian.svg';
  27. import iconPoint from './image/icon-point.svg';
  28. import iconUp from './image/icon-up.svg';
  29. import iconDown from './image/icon-down.svg';
  30. import Points from './component/points';
  31. import { browser, getSecondRPM } from '@/helpers/utils';
  32. import { Vue3Lottie } from 'vue3-lottie';
  33. import playLoadData from './datas/data.json';
  34. import { usePageVisibility } from '@vant/use';
  35. import AudioItem from './component/audio-item';
  36. import {
  37. api_classLessonCoursewareQuery,
  38. api_lessonCoursewareKnowledgeDetailDetail
  39. } from './api';
  40. import {
  41. api_lessonDetailCourseware,
  42. api_classDetailCourseware
  43. } from '../courseware-list/api';
  44. import VideoItem from './component/video-item';
  45. import Chapter from './component/chapter';
  46. import {
  47. api_classLessonCoursewareDetail,
  48. api_lessonCoursewareDetail
  49. } from '../courseware-list/api';
  50. // import detail from '../information/help-center/detail';
  51. import { state } from '@/state';
  52. import Theory from './component/theory';
  53. import InstrumentInfo from './component/instrument-info';
  54. // import TempoPractice from '../../views/tempo-practice';
  55. import SelectCoursewarePop from '@/components/select-courseware-pop';
  56. import { debounce } from "../../helpers/utils"
  57. import TempoItem from './component/tempo-item';
  58. export default defineComponent({
  59. name: 'CoursewarePlay',
  60. setup() {
  61. const pageVisibility = usePageVisibility();
  62. const lastTimeKey = 'lastTime' + (state?.user?.data?.phone ?? '');
  63. const showSelectCourseware = ref(false);
  64. const debounceSkip = ref(false);
  65. /** 设置播放容器 16:9 */
  66. const parentContainer = reactive({
  67. width: '100vw'
  68. });
  69. const setContainer = () => {
  70. let min = Math.min(screen.width, screen.height);
  71. let max = Math.max(screen.width, screen.height);
  72. let width = min * (16 / 9);
  73. if (width > max) {
  74. parentContainer.width = '100vw';
  75. return;
  76. } else {
  77. parentContainer.width = width + 'px';
  78. }
  79. };
  80. const handleInit = (type = 0) => {
  81. //设置容器16:9
  82. setContainer();
  83. // 横屏
  84. // postMessage(
  85. // {
  86. // api: 'setRequestedOrientation',
  87. // content: {
  88. // orientation: type
  89. // }
  90. // },
  91. // () => {
  92. // console.log(234);
  93. // }
  94. // );
  95. // 头,包括返回箭头
  96. // postMessage({
  97. // api: 'setTitleBarVisibility',
  98. // content: {
  99. // status: type
  100. // }
  101. // })
  102. // 安卓的状态栏
  103. postMessage({
  104. api: 'setStatusBarVisibility',
  105. content: {
  106. isVisibility: type
  107. }
  108. });
  109. // 进入页面设置常量
  110. postMessage({
  111. api: 'keepScreenLongLight',
  112. content: {
  113. isOpenLight: type ? true : false
  114. }
  115. });
  116. };
  117. handleInit();
  118. onUnmounted(() => {
  119. handleInit(1);
  120. window.removeEventListener('message', iframeHandle);
  121. });
  122. const getCourseDetail = async () => {
  123. try {
  124. if (route.query.tab == 'course') {
  125. const res = await api_classLessonCoursewareDetail({
  126. id: activeData.courseId as any,
  127. subjectId: activeData.subjectId
  128. });
  129. if (res?.code == 200 && Array.isArray(res?.data?.lessonList)) {
  130. data.courseDetails = res.data.lessonList || [];
  131. // console.log('🚀 ~ data.details course:', data.courseDetails);
  132. }
  133. } else {
  134. const res = await api_lessonCoursewareDetail({
  135. id: route.query.lessonCoursewareId as any,
  136. subjectId: activeData.subjectId
  137. });
  138. if (res?.code == 200 && Array.isArray(res?.data?.lessonList)) {
  139. data.courseDetails = res.data.lessonList || [];
  140. }
  141. }
  142. // console.log(data.courseDetails, 'data.courseDetails');
  143. } catch {
  144. //
  145. }
  146. };
  147. const route = useRoute();
  148. const headeRef = ref();
  149. const loadingClass = ref(false); // 重新加载课件
  150. const data = reactive({
  151. allList: [] as any, // 所选章节下的所有课件列表
  152. kjId: route.query.id as string, // 所选的课件id
  153. zsdId: '' as string, // 知识点id
  154. knowledgePointList: [] as any, //所选课件,所选知识点下所有的资源列表
  155. courseDetails: [] as any,
  156. itemList: [] as any,
  157. videoRefs: {} as any[],
  158. videoState: 'init' as 'init' | 'play',
  159. videoItemRef: null as any,
  160. animationState: 'start' as 'start' | 'end',
  161. coursewareList: []
  162. });
  163. const activeData = reactive({
  164. isAutoPlay: true, // 是否自动播放
  165. subjectId: route.query.subjectId,
  166. lessonCoursewareId: route.query.lessonCoursewareId,
  167. lessonCoursewareDetailId: route.query.lessonCoursewareDetailId,
  168. coursewareDetailKnowledgeId: route.query.coursewareDetailKnowledgeId,
  169. courseId: route.query.courseId, // 我的课程专用编号
  170. nowTime: 0,
  171. model: true, // 遮罩
  172. isAnimation: true, // 是否动画
  173. videoBtns: true, // 视频
  174. currentTime: 0,
  175. duration: 0,
  176. timer: null as any,
  177. item: null as any
  178. });
  179. // 切换单元临时数据
  180. const temporaryData = reactive({
  181. dyId: '', // 单元id
  182. zjId: '' // 章节id
  183. });
  184. const getDetail = async () => {
  185. data.allList = [];
  186. let courseList: any[] = [];
  187. if (route.query.tab == 'course') {
  188. // const res = await api_classLessonCoursewareQuery({
  189. // coursewareDetailKnowledgeId: activeData.coursewareDetailKnowledgeId,
  190. // subjectId: activeData.subjectId,
  191. // page: 1,
  192. // rows: -1
  193. // });
  194. const res = await api_classDetailCourseware({
  195. lessonCoursewareKnowledgeDetailId:
  196. activeData.coursewareDetailKnowledgeId // 章节id
  197. });
  198. if (res?.code === 200 && Array.isArray(res.data)) {
  199. // const tempRows = res.data.rows || [];
  200. // tempRows.forEach((item: any) => {
  201. // courseList.push({
  202. // content: item.content,
  203. // coverImg: item.coverImg,
  204. // id: item.id,
  205. // materialId: item.materialId,
  206. // name: item.materialName,
  207. // relOrder: 0,
  208. // sourceFrom: item.source,
  209. // type: item.materialType
  210. // });
  211. // });
  212. res.data.forEach((item: any) => {
  213. item.knowledgeList = item.resourceList;
  214. item.resourceList.forEach((n: any) => {
  215. n.materialInfo = n.resourceList;
  216. });
  217. });
  218. data.allList = res.data;
  219. const currentCourse = res.data.find(
  220. (item: any) => item.id === data.kjId
  221. );
  222. data.zsdId = currentCourse?.knowledgeList?.[0].id;
  223. courseList = currentCourse?.knowledgeList?.[0].materialInfo || [];
  224. }
  225. } else {
  226. // const res = await api_lessonCoursewareKnowledgeDetailDetail({
  227. // lessonCoursewareKnowledgeDetailId:
  228. // activeData.coursewareDetailKnowledgeId,
  229. // subjectId: activeData.subjectId
  230. // });
  231. const res = await api_lessonDetailCourseware({
  232. lessonCoursewareKnowledgeDetailId:
  233. activeData.coursewareDetailKnowledgeId // 章节id
  234. });
  235. if (res?.code === 200 && Array.isArray(res.data)) {
  236. data.allList = res.data;
  237. const currentCourse = res.data.find(
  238. (item: any) => item.id === data.kjId
  239. );
  240. data.zsdId = currentCourse?.knowledgeList?.[0].id;
  241. courseList = currentCourse?.knowledgeList?.[0].materialInfo || [];
  242. // console.log('课件类型', data.allList);
  243. }
  244. }
  245. // 当前的资源id
  246. let resourceId: any = null;
  247. // 课程
  248. if (courseList.length > 0) {
  249. resourceId = courseList[0].id;
  250. data.knowledgePointList = courseList.map((item: any) => {
  251. return {
  252. ...item,
  253. url:
  254. item.type === 'SONG'
  255. ? 'https://oss.dayaedu.com/ktqy/1698420034679a22d3f7a.png'
  256. : item.type === 'PPT'
  257. ? 'https://oss.dayaedu.com/ktqy/12/1701931810284.png'
  258. : item.coverImg
  259. };
  260. });
  261. }
  262. // 当前章节下的所有资源列表
  263. let allResource: any = [];
  264. data.allList.forEach((item: any) => {
  265. item.knowledgeList.forEach((material: any) => {
  266. material.materialInfo.forEach((resource: any) => {
  267. resource.zsdId = material.id; // 知识点id
  268. resource.kjId = item.id; // 课件id
  269. resource.bizId =
  270. route.query.tab == 'course'
  271. ? resource.materialId
  272. : resource.bizId;
  273. resource.url =
  274. resource.type === 'SONG'
  275. ? 'https://oss.dayaedu.com/ktqy/1698420034679a22d3f7a.png'
  276. : resource.type === 'PPT'
  277. ? 'https://oss.dayaedu.com/ktqy/12/1701931810284.png'
  278. : resource.coverImg;
  279. });
  280. allResource = allResource.concat(material.materialInfo);
  281. });
  282. });
  283. data.itemList = allResource.map((m: any, index: number) => {
  284. if (!popupData.itemActive) {
  285. popupData.itemActive = m.id;
  286. popupData.itemName = m.name;
  287. }
  288. return {
  289. ...m,
  290. iframeRef: null,
  291. videoEle: null,
  292. autoPlay: false, //加载完成是否自动播放
  293. isprepare: false, // 视频是否加载完成
  294. isRender: false // 是否渲染了
  295. };
  296. });
  297. const resourceIndex = data.itemList.findIndex(
  298. (resource: any) => resource.id === resourceId
  299. );
  300. setTimeout(() => {
  301. handleSwipeChange(resourceIndex);
  302. }, 0);
  303. // console.log('资源', data.itemList, resourceIndex);
  304. setTimeout(() => {
  305. data.animationState = 'end';
  306. }, 500);
  307. };
  308. // ifram事件处理
  309. const iframeHandle = (ev: MessageEvent) => {
  310. if (ev.data?.api === 'headerTogge') {
  311. activeData.model =
  312. ev.data.show || (ev.data.playState == 'play' ? false : true);
  313. }
  314. if (ev.data?.api === 'api_fingerPreView') {
  315. clearInterval(activeData.timer);
  316. activeData.model = !ev.data.state;
  317. }
  318. };
  319. onMounted(() => {
  320. postMessage({
  321. api: 'courseLoading',
  322. content: {
  323. show: false,
  324. type: 'fullscreen'
  325. }
  326. });
  327. getDetail();
  328. getCourseDetail();
  329. window.addEventListener('message', iframeHandle);
  330. });
  331. const playRef = ref();
  332. // 返回
  333. const goback = () => {
  334. try {
  335. playRef.value?.handleOut();
  336. } catch (error) {}
  337. postMessage({ api: 'goBack' });
  338. // router.back()
  339. };
  340. const popupData = reactive({
  341. open: false,
  342. activeIndex: 0,
  343. itemActive: '',
  344. itemName: '',
  345. itemPointName: route.query.name as any,
  346. chapterOpen: false
  347. });
  348. // 切换素材
  349. const toggleMaterial = (itemActive: any, zsdId: any, kjId: any) => {
  350. // 如果切换了知识点或者切换了课件,需要加载新的
  351. // if (zsdId !== data.zsdId || kjId !== data.kjId) {
  352. // data.zsdId = zsdId
  353. // data.kjId = kjId
  354. // let target = { materialInfo: [] }
  355. // // 如果是切换了知识点id
  356. // const kjIndex = data.allList.findIndex((item: any) => item.id === kjId)
  357. // target = data.allList[kjIndex].knowledgeList.find((item: any) => item.id === zsdId)
  358. // } else {
  359. // const index = data.itemList.findIndex((n: any) => n.id == itemActive);
  360. // if (index > -1) {
  361. // handleSwipeChange(index);
  362. // }
  363. // }
  364. const index = data.itemList.findIndex((n: any) => n.id == itemActive);
  365. if (index > -1) {
  366. handleSwipeChange(index);
  367. }
  368. };
  369. /** 延迟收起模态框 */
  370. const setModelOpen = () => {
  371. clearTimeout(activeData.timer);
  372. closeToast();
  373. activeData.model = !activeData.model;
  374. activeData.timer = setTimeout(() => {
  375. activeData.model = false;
  376. }, 4000);
  377. };
  378. const setModelOpen1 = () => {
  379. clearTimeout(activeData.timer);
  380. closeToast();
  381. activeData.model = true;
  382. activeData.timer = setTimeout(() => {
  383. activeData.model = false;
  384. }, 4000);
  385. };
  386. // 双击
  387. const handleDbClick = (item: any) => {
  388. if (item && ['VIDEO'].includes(item.type)) {
  389. console.log('双击');
  390. }
  391. };
  392. const effectIndex = ref(3);
  393. const effects = [
  394. {
  395. prev: {
  396. transform: 'translate3d(0, 0, -800px) rotateX(180deg)'
  397. },
  398. next: {
  399. transform: 'translate3d(0, 0, -800px) rotateX(-180deg)'
  400. }
  401. },
  402. {
  403. prev: {
  404. transform: 'translate3d(-100%, 0, -800px)'
  405. },
  406. next: {
  407. transform: 'translate3d(100%, 0, -800px)'
  408. }
  409. },
  410. {
  411. prev: {
  412. transform: 'translate3d(-50%, 0, -800px) rotateY(80deg)'
  413. },
  414. next: {
  415. transform: 'translate3d(50%, 0, -800px) rotateY(-80deg)'
  416. }
  417. },
  418. {
  419. prev: {
  420. transform: 'translate3d(-100%, 0, -800px) rotateY(-120deg)',
  421. opacity: 0
  422. },
  423. next: {
  424. transform: 'translate3d(100%, 0, -800px) rotateY(120deg)',
  425. opacity: 0
  426. }
  427. },
  428. // 风车4
  429. {
  430. prev: {
  431. transform: 'translate3d(-50%, 50%, -800px) rotateZ(-14deg)',
  432. opacity: 0
  433. },
  434. next: {
  435. transform: 'translate3d(50%, 50%, -800px) rotateZ(14deg)',
  436. opacity: 0
  437. }
  438. },
  439. // 翻页5
  440. {
  441. prev: {
  442. transform: 'translateZ(-800px) rotate3d(0, -1, 0, 90deg)',
  443. opacity: 0
  444. },
  445. next: {
  446. transform: 'translateZ(-800px) rotate3d(0, 1, 0, 90deg)',
  447. opacity: 0
  448. },
  449. current: { transitionDelay: '700ms' }
  450. }
  451. ];
  452. const handleStop = () => {
  453. data.videoItemRef?.pause();
  454. };
  455. const acitveTimer = ref();
  456. // 轮播切换
  457. const handleSwipeChange = (index: number) => {
  458. // 如果是当前正在播放 或者是视频最后一个
  459. if (popupData.activeIndex == index) return;
  460. data.animationState = 'start';
  461. data.videoState = 'init';
  462. handleStop();
  463. clearTimeout(acitveTimer.value);
  464. activeData.model = true;
  465. const item = data.itemList[index];
  466. data.kjId = item.kjId;
  467. data.zsdId = item.zsdId;
  468. popupData.activeIndex = index;
  469. popupData.itemActive = item.id;
  470. popupData.itemName = item.name;
  471. if (item.type == 'MUSIC') {
  472. activeData.model = true;
  473. } else if (item.type == 'VIDEO') {
  474. if (item.error) {
  475. data.videoRefs[index]?.onPlay();
  476. }
  477. setTimeout(() => {
  478. data.animationState = 'end';
  479. }, 800);
  480. }
  481. };
  482. // 上一个知识点, 下一个知识点
  483. const handlePreAndNext = async (type: string) => {
  484. // 层级关系:单元〉章节〉知识点〉课件资源
  485. if (type === 'up') {
  486. // 判断上面是否还有章节
  487. if (popupData.activeIndex > 0) {
  488. handleSwipeChange(popupData.activeIndex - 1);
  489. return;
  490. }
  491. // 获取当前是哪个章节
  492. let detailIndex = data.courseDetails.findIndex(
  493. (item: any) => item.id == activeData.lessonCoursewareDetailId
  494. );
  495. const detailItem = data.courseDetails[detailIndex]?.knowledgeList || [];
  496. let lessonIndex = detailItem.findIndex(
  497. (item: any) => item.id == activeData.coursewareDetailKnowledgeId
  498. );
  499. let lessonStatus = false; // 当前章节上面是否有内容
  500. let lessonCoursewareDetailId = '';
  501. let coursewareDetailKnowledgeId = '';
  502. let coursewareDetailKnowledgeName = '';
  503. let coursewareItem = {} as any;
  504. while (lessonIndex >= 0) {
  505. lessonIndex--;
  506. if (lessonIndex >= 0) {
  507. if (detailItem[lessonIndex].containMaterial) {
  508. lessonStatus = true;
  509. lessonCoursewareDetailId =
  510. detailItem[lessonIndex].lessonCoursewareDetailId;
  511. coursewareDetailKnowledgeId = detailItem[lessonIndex].id;
  512. coursewareDetailKnowledgeName = detailItem[lessonIndex].name;
  513. coursewareItem = detailItem[lessonIndex];
  514. }
  515. }
  516. if (lessonStatus) {
  517. break;
  518. }
  519. }
  520. // 判断当前章节下面课程是否有内容,否则往上一个章节走
  521. if (lessonStatus) {
  522. // loadingClass.value = true;
  523. // activeData.coursewareDetailKnowledgeId = coursewareDetailKnowledgeId;
  524. // activeData.lessonCoursewareDetailId = lessonCoursewareDetailId;
  525. // await getDetail();
  526. // popupData.activeIndex = data.itemList.length - 1 || 0;
  527. // popupData.itemActive =
  528. // data.knowledgePointList[data.itemList.length - 1]?.id ||
  529. // data.knowledgePointList[0]?.id;
  530. // popupData.itemPointName = coursewareDetailKnowledgeName;
  531. // popupData.itemName =
  532. // data.knowledgePointList[data.itemList.length - 1]?.name ||
  533. // data.knowledgePointList[0]?.name;
  534. // localStorage.setItem(lastTimeKey, coursewareDetailKnowledgeId);
  535. // popupData.chapterOpen = false;
  536. // loadingClass.value = false;
  537. // console.log
  538. temporaryData.zjId = coursewareDetailKnowledgeId;
  539. temporaryData.dyId = lessonCoursewareDetailId;
  540. // activeData.coursewareDetailKnowledgeId = coursewareDetailKnowledgeId;
  541. checkCourseware({
  542. ...coursewareItem,
  543. itemActive: coursewareDetailKnowledgeId
  544. });
  545. return;
  546. }
  547. let prevLessonStatus = false;
  548. while (detailIndex >= 0) {
  549. detailIndex--;
  550. const tempDetail =
  551. data.courseDetails[detailIndex]?.knowledgeList || [];
  552. let tempLessonLength = tempDetail.length;
  553. while (tempLessonLength > 0) {
  554. if (tempDetail[tempLessonLength - 1].containMaterial) {
  555. prevLessonStatus = true;
  556. lessonCoursewareDetailId =
  557. tempDetail[tempLessonLength - 1].lessonCoursewareDetailId;
  558. coursewareDetailKnowledgeId = tempDetail[tempLessonLength - 1].id;
  559. coursewareDetailKnowledgeName =
  560. tempDetail[tempLessonLength - 1].name;
  561. coursewareItem = tempDetail[tempLessonLength - 1];
  562. }
  563. tempLessonLength--;
  564. if (prevLessonStatus) {
  565. break;
  566. }
  567. }
  568. if (prevLessonStatus) {
  569. break;
  570. }
  571. }
  572. // 判断当前章节下面课程是否有内容,否则往上一个章节走
  573. if (prevLessonStatus) {
  574. // loadingClass.value = true;
  575. // activeData.coursewareDetailKnowledgeId = coursewareDetailKnowledgeId;
  576. // activeData.lessonCoursewareDetailId = lessonCoursewareDetailId;
  577. // await getDetail();
  578. // popupData.activeIndex = data.itemList.length - 1 || 0;
  579. // popupData.itemActive =
  580. // data.knowledgePointList[data.itemList.length - 1]?.id ||
  581. // data.knowledgePointList[0]?.id;
  582. // localStorage.setItem(lastTimeKey, coursewareDetailKnowledgeId);
  583. // popupData.itemPointName = coursewareDetailKnowledgeName;
  584. // popupData.itemName =
  585. // data.knowledgePointList[data.itemList.length - 1]?.name ||
  586. // data.knowledgePointList[0]?.name;
  587. // popupData.chapterOpen = false;
  588. // loadingClass.value = false;
  589. // console.log('2', coursewareItem, coursewareDetailKnowledgeId);
  590. temporaryData.zjId = coursewareDetailKnowledgeId;
  591. temporaryData.dyId = lessonCoursewareDetailId;
  592. // activeData.coursewareDetailKnowledgeId = coursewareDetailKnowledgeId;
  593. checkCourseware({
  594. ...coursewareItem,
  595. itemActive: coursewareDetailKnowledgeId
  596. });
  597. return;
  598. }
  599. } else {
  600. if (popupData.activeIndex < data.itemList.length - 1) {
  601. handleSwipeChange(popupData.activeIndex + 1);
  602. return;
  603. }
  604. // 获取当前是哪个单元
  605. let detailIndex = data.courseDetails.findIndex(
  606. (item: any) => item.id == activeData.lessonCoursewareDetailId
  607. );
  608. // 当前章节列表
  609. const detailItem = data.courseDetails[detailIndex]?.knowledgeList || [];
  610. // 获取当前是哪个章节
  611. let lessonIndex = detailItem.findIndex(
  612. (item: any) => item.id == activeData.coursewareDetailKnowledgeId
  613. );
  614. let lessonStatus = false; // 当前章节下面是否有内容
  615. let lessonCoursewareDetailId = '';
  616. let coursewareDetailKnowledgeId = '';
  617. let coursewareDetailKnowledgeName = '';
  618. let coursewareItem = {} as any;
  619. while (lessonIndex < detailItem.length - 1) {
  620. lessonIndex++;
  621. if (lessonIndex >= 0) {
  622. if (detailItem[lessonIndex].containMaterial) {
  623. lessonStatus = true;
  624. lessonCoursewareDetailId =
  625. detailItem[lessonIndex].lessonCoursewareDetailId;
  626. coursewareDetailKnowledgeId = detailItem[lessonIndex].id;
  627. coursewareDetailKnowledgeName = detailItem[lessonIndex].name;
  628. coursewareItem = detailItem[lessonIndex];
  629. }
  630. }
  631. if (lessonStatus) {
  632. break;
  633. }
  634. }
  635. // 判断当前章节下面课程是否有内容,否则往下一个章节走
  636. if (lessonStatus) {
  637. // loadingClass.value = true;
  638. // activeData.coursewareDetailKnowledgeId = coursewareDetailKnowledgeId;
  639. // activeData.lessonCoursewareDetailId = lessonCoursewareDetailId;
  640. // await getDetail();
  641. // popupData.activeIndex = 0;
  642. // popupData.itemActive = data.knowledgePointList[0].id;
  643. // popupData.itemName = data.knowledgePointList[0].name;
  644. // localStorage.setItem(lastTimeKey, coursewareDetailKnowledgeId);
  645. // popupData.itemPointName = coursewareDetailKnowledgeName;
  646. // popupData.chapterOpen = false;
  647. // loadingClass.value = false;
  648. temporaryData.zjId = coursewareDetailKnowledgeId;
  649. temporaryData.dyId = lessonCoursewareDetailId;
  650. // activeData.coursewareDetailKnowledgeId = coursewareDetailKnowledgeId;
  651. // console.log(coursewareItem, 'coursewareItem', temporaryData);
  652. checkCourseware({
  653. ...coursewareItem,
  654. itemActive: coursewareDetailKnowledgeId
  655. });
  656. return;
  657. }
  658. let nextLessonStatus = false;
  659. while (detailIndex <= data.courseDetails.length - 1) {
  660. detailIndex++;
  661. const tempDetail =
  662. data.courseDetails[detailIndex]?.knowledgeList || [];
  663. let tempLessonLength = 0;
  664. while (tempLessonLength <= tempDetail.length - 1) {
  665. if (tempDetail[tempLessonLength].containMaterial) {
  666. nextLessonStatus = true;
  667. lessonCoursewareDetailId =
  668. tempDetail[tempLessonLength].lessonCoursewareDetailId;
  669. coursewareDetailKnowledgeId = tempDetail[tempLessonLength].id;
  670. coursewareDetailKnowledgeName = tempDetail[tempLessonLength].name;
  671. coursewareItem = tempDetail[tempLessonLength];
  672. }
  673. tempLessonLength++;
  674. if (nextLessonStatus) {
  675. break;
  676. }
  677. }
  678. if (nextLessonStatus) {
  679. break;
  680. }
  681. }
  682. // 判断当前章节下面课程是否有内容,否则往下一个单元走
  683. if (nextLessonStatus) {
  684. // loadingClass.value = true;
  685. // activeData.coursewareDetailKnowledgeId = coursewareDetailKnowledgeId;
  686. // activeData.lessonCoursewareDetailId = lessonCoursewareDetailId;
  687. // await getDetail();
  688. // popupData.activeIndex = 0;
  689. // popupData.itemActive = data.knowledgePointList[0].id;
  690. // localStorage.setItem(lastTimeKey, coursewareDetailKnowledgeId);
  691. // popupData.itemName = data.knowledgePointList[0].name;
  692. // popupData.itemPointName = coursewareDetailKnowledgeName;
  693. // popupData.chapterOpen = false;
  694. // loadingClass.value = false;
  695. temporaryData.zjId = coursewareDetailKnowledgeId;
  696. temporaryData.dyId = lessonCoursewareDetailId;
  697. // activeData.coursewareDetailKnowledgeId = coursewareDetailKnowledgeId;
  698. // console.log(coursewareItem, 'coursewareItem', temporaryData);
  699. checkCourseware({
  700. ...coursewareItem,
  701. itemActive: coursewareDetailKnowledgeId
  702. });
  703. return;
  704. }
  705. }
  706. };
  707. /** 弹窗关闭 */
  708. const handleClosePopup = () => {
  709. // setModelOpen();
  710. };
  711. // popupData.activeIndex == 0 && styles.btnsDisabled
  712. // popupData.activeIndex == data.itemList.length - 1
  713. // 是否允许上一页
  714. const isUpArrow = computed(() => {
  715. /**
  716. * 1,判断当前课程中是否处在第一个资源;
  717. * 2,判断当前课程是否在当前章节的第一个;
  718. * 3,判断当前章节,当前课程上面还没有其它课程,是否有资源;
  719. * 4,判断当前章节上面还没有其它章节;
  720. * 5,判断上面章节里面课程是否有资源;
  721. */
  722. if (popupData.activeIndex > 0) {
  723. return true;
  724. }
  725. // 获取当前是哪个章节
  726. let detailIndex = data.courseDetails.findIndex(
  727. (item: any) => item.id == activeData.lessonCoursewareDetailId
  728. );
  729. const detailItem = data.courseDetails[detailIndex]?.knowledgeList || [];
  730. let lessonIndex = detailItem.findIndex(
  731. (item: any) => item.id == activeData.coursewareDetailKnowledgeId
  732. );
  733. // 说明已经是第一单元,第一课
  734. if (detailIndex <= 0 && lessonIndex <= 0) {
  735. return false;
  736. }
  737. let lessonStatus = false; // 当前章节上面是否有内容
  738. while (lessonIndex >= 0) {
  739. lessonIndex--;
  740. if (lessonIndex >= 0) {
  741. if (detailItem[lessonIndex].containMaterial) {
  742. lessonStatus = true;
  743. }
  744. }
  745. }
  746. // 判断当前章节下面课程是否有内容,否则往上一个章节走
  747. if (lessonStatus) {
  748. return true;
  749. }
  750. // 已经是第一个章节了
  751. if (detailIndex <= 0) {
  752. return false;
  753. }
  754. let prevLessonStatus = false;
  755. while (detailIndex >= 0) {
  756. detailIndex--;
  757. const tempDetail = data.courseDetails[detailIndex]?.knowledgeList || [];
  758. let tempLessonLength = tempDetail.length;
  759. while (tempLessonLength > 0) {
  760. if (tempDetail[tempLessonLength - 1].containMaterial) {
  761. prevLessonStatus = true;
  762. }
  763. tempLessonLength--;
  764. }
  765. if (prevLessonStatus) {
  766. return true;
  767. }
  768. }
  769. return false;
  770. });
  771. // 是否允许下一页
  772. const isDownArrow = computed(() => {
  773. if (popupData.activeIndex < data.itemList.length - 1) {
  774. return true;
  775. }
  776. // 获取当前是哪个章节
  777. let detailIndex = data.courseDetails.findIndex(
  778. (item: any) => item.id == activeData.lessonCoursewareDetailId
  779. );
  780. const detailItem = data.courseDetails[detailIndex]?.knowledgeList || [];
  781. let lessonIndex = detailItem.findIndex(
  782. (item: any) => item.id == activeData.coursewareDetailKnowledgeId
  783. );
  784. // 说明已经是最后-单元,最后一课
  785. if (
  786. detailIndex >= data.courseDetails.length - 1 &&
  787. lessonIndex >= detailItem.length - 1
  788. ) {
  789. return false;
  790. }
  791. let lessonStatus = false; // 当前章节下面是否有内容
  792. while (lessonIndex < detailItem.length - 1) {
  793. lessonIndex++;
  794. if (lessonIndex >= 0) {
  795. if (detailItem[lessonIndex].containMaterial) {
  796. lessonStatus = true;
  797. }
  798. }
  799. }
  800. // 判断当前章节下面课程是否有内容,否则往下一个章节走
  801. if (lessonStatus) {
  802. return true;
  803. }
  804. // 已经是最后一个章节了
  805. if (detailIndex >= data.courseDetails.length - 1) {
  806. return false;
  807. }
  808. let nextLessonStatus = false;
  809. while (detailIndex < data.courseDetails.length - 1) {
  810. detailIndex++;
  811. const tempDetail = data.courseDetails[detailIndex]?.knowledgeList || [];
  812. let tempLessonLength = 0;
  813. while (tempLessonLength <= tempDetail.length - 1) {
  814. if (tempDetail[tempLessonLength].containMaterial) {
  815. nextLessonStatus = true;
  816. }
  817. tempLessonLength++;
  818. }
  819. if (nextLessonStatus) {
  820. return true;
  821. }
  822. }
  823. return false;
  824. });
  825. const activeVideoItem = computed(() => {
  826. const item = data.itemList[popupData.activeIndex];
  827. if (item && item.type && item.type.toLocaleUpperCase() === 'VIDEO') {
  828. return item;
  829. }
  830. return {};
  831. });
  832. // 加载新的章节里的课件
  833. const loadNewCourseware = async (item: any) => {
  834. if( debounceSkip.value ) return;
  835. debounceSkip.value = true;
  836. data.itemList = [];
  837. loadingClass.value = true;
  838. // activeData.coursewareDetailKnowledgeId = item.coursewareDetailKnowledgeId;
  839. // activeData.lessonCoursewareDetailId = item.lessonCoursewareDetailId;
  840. if (route.query.tab == 'all') {
  841. activeData.coursewareDetailKnowledgeId =
  842. item.coursewareDetailKnowledgeId;
  843. activeData.lessonCoursewareDetailId = temporaryData.dyId;
  844. localStorage.setItem(lastTimeKey, item.coursewareDetailKnowledgeId);
  845. } else {
  846. activeData.lessonCoursewareDetailId = temporaryData.dyId;
  847. activeData.coursewareDetailKnowledgeId = temporaryData.zjId;
  848. localStorage.setItem(lastTimeKey, temporaryData.zjId);
  849. }
  850. // console.log(item, 'item', route.query.tab);
  851. // console.log(activeData, temporaryData, 'active');
  852. popupData.chapterOpen = false;
  853. showSelectCourseware.value = false;
  854. data.kjId = item.id;
  855. await getDetail();
  856. popupData.activeIndex = 0;
  857. popupData.itemActive = data.knowledgePointList[0].id;
  858. popupData.itemName = data.knowledgePointList[0].name;
  859. // 匹配到当前的章节名称
  860. const dyItem = data.courseDetails.find(
  861. (unit: any) => unit.id === activeData.lessonCoursewareDetailId
  862. );
  863. const zjItem = dyItem?.knowledgeList?.find(
  864. (chapter: any) => chapter.id === activeData.coursewareDetailKnowledgeId
  865. );
  866. zjItem && (popupData.itemPointName = zjItem.name);
  867. console.log('章节名称', popupData.itemPointName);
  868. loadingClass.value = false;
  869. debounceSkip.value = false;
  870. };
  871. // 通过章节id,检测此章节有几个课件
  872. const checkCourseware = async (item: any) => {
  873. // 如果有多个课件,需要选择一个课件进入上课页面
  874. if (item.coursewareNum) {
  875. try {
  876. const res =
  877. route.query.tab == 'all'
  878. ? await api_lessonDetailCourseware({
  879. lessonCoursewareKnowledgeDetailId: item.itemActive
  880. })
  881. : await api_classDetailCourseware({
  882. lessonCoursewareKnowledgeDetailId: item.itemActive
  883. });
  884. if (res?.code == 200 && res.data?.length) {
  885. data.coursewareList = res.data;
  886. // 如果只有一个课件,直接进入该课件
  887. // console.log(res.data, 'data');
  888. if (res.data.length == 1) {
  889. loadNewCourseware({ ...res.data[0] });
  890. } else {
  891. // 如果有多个课件,需要选择一个课件进入上课页面
  892. showSelectCourseware.value = true;
  893. }
  894. }
  895. } catch {
  896. //
  897. }
  898. }
  899. };
  900. return () => (
  901. <div id="playContent" class={styles.playContent}>
  902. <div
  903. class={styles.coursewarePlay}
  904. style={{ width: parentContainer.width }}
  905. onClick={() => setModelOpen()}>
  906. {!loadingClass.value && (
  907. <div class={styles.wraps}>
  908. <div
  909. style={
  910. activeVideoItem.value.type &&
  911. data.animationState === 'end' &&
  912. data.videoState === 'play'
  913. ? {
  914. zIndex: 15,
  915. opacity: 1
  916. }
  917. : { opacity: 0, zIndex: -1 }
  918. }
  919. class={styles.itemDiv}>
  920. <VideoItem
  921. ref={(el: any) => (data.videoItemRef = el)}
  922. item={activeVideoItem.value}
  923. showModel={activeData.model}
  924. onClose={setModelOpen1}
  925. onCanplay={() => {
  926. data.videoState = 'play';
  927. }}
  928. onPause={() => {
  929. clearTimeout(activeData.timer);
  930. activeData.model = true;
  931. }}
  932. onEnded={() => {
  933. // const _index = popupData.activeIndex + 1
  934. // if (_index < data.itemList.length) {
  935. // handleSwipeChange(_index);
  936. // }
  937. }}
  938. />
  939. </div>
  940. {data.itemList.map((m: any, mIndex: number) => {
  941. const isRender =
  942. m.isRender || Math.abs(popupData.activeIndex - mIndex) < 2;
  943. const isEmtry = Math.abs(popupData.activeIndex - mIndex) > 4;
  944. if (isRender) {
  945. m.isRender = true;
  946. }
  947. return isRender ? (
  948. <div
  949. key={'index' + mIndex}
  950. class={[
  951. styles.itemDiv,
  952. popupData.activeIndex === mIndex && styles.itemActive,
  953. activeData.isAnimation && styles.acitveAnimation,
  954. Math.abs(popupData.activeIndex - mIndex) < 2
  955. ? styles.show
  956. : styles.hide
  957. ]}
  958. style={
  959. mIndex < popupData.activeIndex
  960. ? effects[effectIndex.value].prev
  961. : mIndex > popupData.activeIndex
  962. ? effects[effectIndex.value].next
  963. : {}
  964. }
  965. onClick={(e: Event) => {
  966. if (Date.now() - activeData.nowTime < 300) {
  967. handleDbClick(m);
  968. return;
  969. }
  970. activeData.nowTime = Date.now();
  971. }}>
  972. {m.type === 'IMG' && <img src={m.content} />}
  973. {m.type === 'PPT' && (
  974. <iframe
  975. src={`https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(
  976. m.content
  977. )}`}
  978. width="100%"
  979. height="100%"
  980. frameborder="1"></iframe>
  981. )}
  982. {m.type === 'VIDEO' && (
  983. <img
  984. src={m.coverImg}
  985. onLoad={() => {
  986. m.isprepare = true;
  987. }}
  988. />
  989. )}
  990. {/* {m.type === 'VIDEO' && (
  991. <VideoItem
  992. ref={(v: any) => (data.videoRefs[mIndex] = v)}
  993. item={m}
  994. show={popupData.activeIndex === mIndex}
  995. pageVisibility={pageVisibility.value}
  996. showModel={activeData.model}
  997. isEmtry={isEmtry}
  998. onLoadedmetadata={() => {
  999. m.isprepare = true;
  1000. m.error = false;
  1001. }}
  1002. onEnded={() => {
  1003. const _index = popupData.activeIndex + 1;
  1004. if (_index < data.itemList.length) {
  1005. handleSwipeChange(_index);
  1006. }
  1007. }}
  1008. onReset={() => {
  1009. m.error = false;
  1010. }}
  1011. onError={() => {
  1012. m.isprepare = true;
  1013. m.error = true;
  1014. }}
  1015. />
  1016. )} */}
  1017. {m.type === 'SONG' && (
  1018. <AudioItem
  1019. item={m}
  1020. show={popupData.activeIndex === mIndex}
  1021. pageVisibility={pageVisibility.value}
  1022. showModel={activeData.model}
  1023. isEmtry={isEmtry}
  1024. onEnded={() => {
  1025. const _index = popupData.activeIndex + 1;
  1026. if (_index < data.itemList.length) {
  1027. handleSwipeChange(_index);
  1028. }
  1029. }}
  1030. onClose={() => {
  1031. clearTimeout(activeData.timer);
  1032. activeData.timer = setTimeout(() => {
  1033. activeData.model = false;
  1034. }, 4000);
  1035. }}
  1036. />
  1037. )}
  1038. {m.type === 'MUSIC' && (
  1039. <MusicScore
  1040. pageVisibility={pageVisibility.value}
  1041. show={popupData.activeIndex === mIndex}
  1042. activeModel={activeData.model}
  1043. data-vid={m.id}
  1044. music={m}
  1045. />
  1046. )}
  1047. {m.type === 'VIDEO' && (
  1048. <Transition name="van-fade">
  1049. {/* {!m.isprepare && (
  1050. <div class={styles.loadWrap}>
  1051. <Vue3Lottie
  1052. style={{ width: '100%', height: '100%' }}
  1053. animationData={playLoadData}></Vue3Lottie>
  1054. </div>
  1055. )} */}
  1056. {data.videoState !== 'play' && (
  1057. <div class={styles.loadWrap}>
  1058. <Vue3Lottie
  1059. style={{ width: '100%', height: '100%' }}
  1060. animationData={playLoadData}></Vue3Lottie>
  1061. </div>
  1062. )}
  1063. </Transition>
  1064. )}
  1065. {/* 新增:RHYTHM:节奏练习,THEORY:乐理知识,MUSIC_WIKI:名曲鉴赏 INSTRUMENT:乐器 MUSICIAN:音乐家 资源类型 */}
  1066. {m.type === 'RHYTHM' && (
  1067. <TempoItem
  1068. key={mIndex}
  1069. class={styles.tempoPracticeGroup}
  1070. dataJson={m.dataJson}
  1071. show={popupData.activeIndex === mIndex}
  1072. pageVisibility={pageVisibility.value}
  1073. />
  1074. // <TempoPractice
  1075. // key={mIndex}
  1076. // class={styles.tempoPracticeGroup}
  1077. // dataJson={m?.dataJson ? JSON.parse(m?.dataJson) : {}}
  1078. // modeType={'courseware'}
  1079. // show={popupData.activeIndex === mIndex}
  1080. // />
  1081. )}
  1082. {m.type === 'THEORY' && <Theory id={m.bizId} />}
  1083. {popupData.activeIndex === mIndex &&
  1084. <>
  1085. {m.type === 'MUSIC_WIKI' && (
  1086. <InstrumentInfo
  1087. type={'wiki'}
  1088. id={m.bizId}
  1089. show={popupData.activeIndex === mIndex}
  1090. />
  1091. )}
  1092. {m.type === 'INSTRUMENT' && (
  1093. <InstrumentInfo
  1094. type={'instrument'}
  1095. id={m.bizId}
  1096. show={popupData.activeIndex === mIndex}
  1097. />
  1098. )}
  1099. {m.type === 'MUSICIAN' && (
  1100. <InstrumentInfo
  1101. type={'musician'}
  1102. id={m.bizId}
  1103. show={popupData.activeIndex === mIndex}
  1104. />
  1105. )}
  1106. </>
  1107. }
  1108. </div>
  1109. ) : (
  1110. <div
  1111. key={'index' + mIndex}
  1112. class={[
  1113. styles.itemDiv,
  1114. popupData.activeIndex === mIndex && styles.itemActive,
  1115. activeData.isAnimation && styles.acitveAnimation,
  1116. Math.abs(popupData.activeIndex - mIndex) < 2
  1117. ? styles.show
  1118. : styles.hide
  1119. ]}
  1120. style={
  1121. mIndex < popupData.activeIndex
  1122. ? effects[effectIndex.value].prev
  1123. : mIndex > popupData.activeIndex
  1124. ? effects[effectIndex.value].next
  1125. : {}
  1126. }></div>
  1127. );
  1128. })}
  1129. </div>
  1130. )}
  1131. <Transition name="right">
  1132. {activeData.model && (
  1133. <div
  1134. class={styles.rightFixedBtns}
  1135. onClick={(e: Event) => {
  1136. e.stopPropagation();
  1137. clearTimeout(activeData.timer);
  1138. }}>
  1139. <div
  1140. class={[styles.fullBtn, styles.point]}
  1141. onClick={() => (popupData.chapterOpen = true)}>
  1142. <img src={iconChange} />
  1143. <span>切换</span>
  1144. </div>
  1145. <div
  1146. class={[styles.fullBtn, styles.point]}
  1147. onClick={() => (popupData.open = true)}>
  1148. <img src={iconMenu} />
  1149. <span>课件</span>
  1150. </div>
  1151. <div
  1152. class={[
  1153. styles.fullBtn,
  1154. // popupData.activeIndex == 0 && styles.btnsDisabled
  1155. !isUpArrow.value && styles.btnsDisabled
  1156. ]}
  1157. onClick={() => handlePreAndNext('up')}>
  1158. <img src={iconUp} />
  1159. <span style={{ textAlign: 'center' }}>上一个</span>
  1160. </div>
  1161. <div
  1162. class={[
  1163. styles.fullBtn,
  1164. !isDownArrow.value && styles.btnsDisabled
  1165. ]}
  1166. onClick={() => handlePreAndNext('down')}>
  1167. <span style={{ textAlign: 'center' }}>下一个</span>
  1168. <img src={iconDown} />
  1169. </div>
  1170. </div>
  1171. )}
  1172. </Transition>
  1173. </div>
  1174. <div
  1175. style={{ transform: activeData.model ? '' : 'translateY(-100%)' }}
  1176. class={styles.headerContainer}
  1177. ref={headeRef}>
  1178. <div class={styles.backBtn} onClick={() => goback()}>
  1179. <Icon name={iconBack} />
  1180. 返回
  1181. </div>
  1182. <div class={styles.menu}>{popupData.itemName}</div>
  1183. </div>
  1184. {/* 课件列表 */}
  1185. <Popup
  1186. class={styles.popup}
  1187. style={{ background: 'rgba(0,0,0, 0.75)' }}
  1188. overlayClass={styles.overlayClass}
  1189. position="right"
  1190. round
  1191. v-model:show={popupData.open}
  1192. onClose={handleClosePopup}>
  1193. <Points
  1194. allList={data.allList}
  1195. data={data.knowledgePointList}
  1196. itemActive={popupData.itemActive}
  1197. itemName={popupData.itemPointName}
  1198. kjId={data.kjId}
  1199. zsdId={data.zsdId}
  1200. popShow={popupData.open}
  1201. onHandleSelect={(res: any) => {
  1202. popupData.open = false;
  1203. toggleMaterial(res.itemActive, res.zsdId, res.kjId);
  1204. }}
  1205. />
  1206. </Popup>
  1207. {/* 知识点列表 */}
  1208. <Popup
  1209. class={styles.popup}
  1210. style={{ background: 'rgba(0,0,0, 0.75)' }}
  1211. overlayClass={styles.overlayClass}
  1212. position="right"
  1213. round
  1214. v-model:show={popupData.chapterOpen}
  1215. onClose={handleClosePopup}>
  1216. <Chapter
  1217. detail={data.courseDetails}
  1218. itemActive={activeData.coursewareDetailKnowledgeId as any}
  1219. active={activeData.lessonCoursewareDetailId as any}
  1220. onHandleSelect={async (item: any) => {
  1221. temporaryData.dyId = item.tabActive;
  1222. temporaryData.zjId = item.itemActive;
  1223. popupData.itemPointName = item.itemName;
  1224. checkCourseware(item);
  1225. }}
  1226. />
  1227. </Popup>
  1228. {showSelectCourseware.value && (
  1229. <SelectCoursewarePop
  1230. list={data.coursewareList}
  1231. onClose={() => {
  1232. showSelectCourseware.value = false;
  1233. }}
  1234. onSelect={item => loadNewCourseware(item)}></SelectCoursewarePop>
  1235. )}
  1236. </div>
  1237. );
  1238. }
  1239. });