index.tsx 45 KB

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