index.tsx 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. import {
  2. defineComponent,
  3. nextTick,
  4. onMounted,
  5. reactive,
  6. ref,
  7. watch
  8. } from 'vue';
  9. import styles from './index.module.less';
  10. import {
  11. NButton,
  12. NTooltip,
  13. NCarousel,
  14. NIcon,
  15. NImage,
  16. NInput,
  17. NModal,
  18. NScrollbar,
  19. NSelect,
  20. NSpace,
  21. NSpin,
  22. NTabPane,
  23. NTabs,
  24. useMessage
  25. } from 'naive-ui';
  26. import { usePrepareStore } from '/src/store/modules/prepareLessons';
  27. import add from '@/views/studentList/images/add.png';
  28. import iconSlideRight from '../../../images/icon-slide-right.png';
  29. import CoursewareType from '../../../model/courseware-type';
  30. import TheEmpty from '/src/components/TheEmpty';
  31. import RelatedClass from '../../../model/related-class';
  32. import { state } from '/src/state';
  33. import { useResizeObserver } from '@vueuse/core';
  34. import AttendClass from '/src/views/prepare-lessons/model/attend-class';
  35. import {
  36. api_addByOpenCourseware,
  37. api_teacherChapterLessonCoursewareRemove,
  38. api_queryOpenCoursewareByPage,
  39. api_updateCoursewareInfo,
  40. teacherChapterLessonCoursewareList,
  41. courseScheduleStart
  42. } from '../../../api';
  43. import { useRoute, useRouter } from 'vue-router';
  44. import TheMessageDialog from '/src/components/TheMessageDialog';
  45. import { eventGlobal, fscreen } from '/src/utils';
  46. import PreviewWindow from '/src/views/preview-window';
  47. import Related from './related';
  48. import Train from '../train';
  49. import ResourceMain from '../../resource-main';
  50. export default defineComponent({
  51. name: 'courseware-presets',
  52. props: {
  53. addParam: {
  54. type: Object,
  55. default: () => ({})
  56. }
  57. },
  58. emits: ['change'],
  59. setup(props, { emit }) {
  60. const prepareStore = usePrepareStore();
  61. const message = useMessage();
  62. const route = useRoute();
  63. const router = useRouter();
  64. const localStorageSubjectId = localStorage.getItem(
  65. 'prepareLessonSubjectId'
  66. );
  67. const forms = reactive({
  68. // 选取参数带的,后取缓存
  69. leftWidth: '100%',
  70. rightWidth: '0',
  71. messageLoading: false,
  72. subjectId: route.query.subjectId
  73. ? Number(route.query.subjectId)
  74. : localStorageSubjectId
  75. ? Number(localStorageSubjectId)
  76. : '',
  77. courseScheduleSubjectId: route.query.courseScheduleSubjectId,
  78. classGroupId: route.query.classGroupId,
  79. preStudentNum: route.query.preStudentNum,
  80. bodyWidth: '100%',
  81. loading: false,
  82. openLoading: false,
  83. showRelatedClass: false,
  84. tableList: [] as any,
  85. openTableShow: true, // 是否显示
  86. openTableList: [] as any,
  87. selectItem: {} as any,
  88. editTitleVisiable: false,
  89. editTitle: null,
  90. editBtnLoading: false,
  91. preRemoveVisiable: false,
  92. addVisiable: false, // 是否有添加的课件
  93. carouselIndex: 0,
  94. showAttendClass: false,
  95. attendClassType: 'change', //
  96. attendClassItem: {} as any,
  97. previewModal: false,
  98. previewParams: {
  99. type: '',
  100. courseId: '',
  101. subjectId: '',
  102. detailId: ''
  103. } as any,
  104. workVisiable: false
  105. });
  106. const getCoursewareList = async () => {
  107. forms.loading = true;
  108. try {
  109. // 判断是否有选择对应的课件 或声部
  110. if (!prepareStore.getSelectKey) return (forms.loading = false);
  111. const { data } = await teacherChapterLessonCoursewareList({
  112. subjectId: prepareStore.getSubjectId,
  113. coursewareDetailKnowledgeId: prepareStore.getSelectKey
  114. });
  115. if (!Array.isArray(data)) {
  116. return;
  117. }
  118. const tempList: any = [];
  119. data.forEach((item: any) => {
  120. const firstItem: any =
  121. item.chapterKnowledgeList[0]?.chapterKnowledgeMaterialList[0];
  122. tempList.push({
  123. id: item.id,
  124. lessonPreTrainingId: item.lessonPreTrainingId,
  125. openFlag: item.openFlag,
  126. openFlagEnable: item.openFlagEnable,
  127. subjectNames: item.subjectNames,
  128. fromChapterLessonCoursewareId: item.fromChapterLessonCoursewareId,
  129. name: item.name,
  130. coverImg: firstItem?.bizInfo.coverImg,
  131. type: firstItem?.bizInfo.type,
  132. isNotWork: item.lessonPreTrainingNum <= 0 ? true : false // 是否布置作业
  133. });
  134. });
  135. forms.tableList = tempList;
  136. } catch {
  137. //
  138. }
  139. forms.loading = false;
  140. };
  141. // 监听选择的key 左侧选择了其它的课
  142. watch(
  143. () => [prepareStore.getSelectKey, prepareStore.getSubjectId],
  144. async () => {
  145. await getCoursewareList();
  146. // await getOpenCoursewareList();
  147. eventGlobal.emit('openCoursewareChanged');
  148. subjectRef.value?.syncBarPosition();
  149. }
  150. );
  151. watch(
  152. () => prepareStore.getSubjectList,
  153. () => {
  154. checkSubjectIds();
  155. }
  156. );
  157. const checkSubjectIds = () => {
  158. const subjectList = prepareStore.getSubjectList;
  159. // 并且没有声部时才会更新
  160. if (subjectList.length > 0) {
  161. const prepareLessonCourseWareSubjectIsNull = sessionStorage.getItem(
  162. 'prepareLessonCourseWareSubjectIsNull'
  163. );
  164. if (prepareLessonCourseWareSubjectIsNull === 'true') {
  165. prepareStore.setSubjectId('');
  166. return;
  167. }
  168. // 并且声部在列表中
  169. const localStorageSubjectId = localStorage.getItem(
  170. 'prepareLessonSubjectId'
  171. );
  172. // // 先取 上次上课声部,在取班级声部 最后取缓存
  173. let subjectId = null;
  174. let index = -1;
  175. if (forms.courseScheduleSubjectId) {
  176. // 判断浏览器上面是否有
  177. index = subjectList.findIndex(
  178. (subject: any) => subject.id == forms.courseScheduleSubjectId
  179. );
  180. if (index >= 0) {
  181. subjectId = Number(forms.courseScheduleSubjectId);
  182. }
  183. }
  184. // 判断班级上面声部 & 还没有声部
  185. if (forms.subjectId && !subjectId) {
  186. // 判断浏览器上面是否有
  187. index = subjectList.findIndex(
  188. (subject: any) => subject.id == forms.subjectId
  189. );
  190. if (index >= 0) {
  191. subjectId = Number(forms.subjectId);
  192. }
  193. }
  194. // 缓存声部 & 还没有声部
  195. if (localStorageSubjectId && !subjectId) {
  196. // 判断浏览器上面是否有
  197. index = subjectList.findIndex(
  198. (subject: any) => subject.id == localStorageSubjectId
  199. );
  200. if (index >= 0) {
  201. subjectId = Number(localStorageSubjectId);
  202. }
  203. }
  204. // 判断是否选择为空
  205. if (subjectId && index >= 0) {
  206. prepareStore.setSubjectId(subjectId);
  207. // forms.subjectId = subjectId;
  208. } else {
  209. // 判断是否有缓存
  210. // prepareStore.setSubjectId(subjectList[0].id);
  211. // forms.subjectId = subjectList[0].id;
  212. }
  213. // 保存
  214. localStorage.setItem(
  215. 'prepareLessonSubjectId',
  216. prepareStore.getSubjectId as any
  217. );
  218. subjectRef.value?.syncBarPosition();
  219. }
  220. };
  221. const subjectRef = ref();
  222. onMounted(async () => {
  223. useResizeObserver(
  224. document.querySelector('#presetsLeftRef') as HTMLElement,
  225. (entries: any) => {
  226. const entry = entries[0];
  227. const { width } = entry.contentRect;
  228. forms.leftWidth = width + 'px';
  229. }
  230. );
  231. useResizeObserver(
  232. document.querySelector('#presetsRightRef') as HTMLElement,
  233. (entries: any) => {
  234. const entry = entries[0];
  235. const { width } = entry.contentRect;
  236. forms.rightWidth = width + 'px';
  237. }
  238. );
  239. prepareStore.setClassGroupId(route.query.classGroupId as any);
  240. if (!prepareStore.getSubjectId) {
  241. // 获取教材分类列表
  242. checkSubjectIds();
  243. }
  244. await getCoursewareList();
  245. console.log(props.addParam, 'addCourseware');
  246. if (props.addParam.isAdd) {
  247. forms.addVisiable = true;
  248. }
  249. });
  250. const getModalHeight = () => {
  251. const dom: any = document.querySelector('#model-homework-height');
  252. if (dom) {
  253. useResizeObserver(dom as HTMLElement, (entries: any) => {
  254. const entry = entries[0];
  255. const { height } = entry.contentRect;
  256. dom.style.setProperty('--window-page-lesson-height', height + 'px');
  257. });
  258. }
  259. };
  260. // 重命名
  261. // const onEditTitleSubmit = async () => {
  262. // try {
  263. // await api_updateCoursewareInfo({
  264. // id: forms.selectItem.id,
  265. // name: forms.editTitle
  266. // });
  267. // message.success('修改成功');
  268. // getCoursewareList();
  269. // // getOpenCoursewareList()
  270. // forms.editTitleVisiable = false;
  271. // } catch {
  272. // //
  273. // }
  274. // };
  275. // 删除
  276. const onRemove = async () => {
  277. forms.messageLoading = true;
  278. try {
  279. await api_teacherChapterLessonCoursewareRemove({
  280. id: forms.selectItem.id
  281. });
  282. message.success('删除成功');
  283. getCoursewareList();
  284. // getOpenCoursewareList();
  285. eventGlobal.emit('openCoursewareChanged');
  286. forms.preRemoveVisiable = false;
  287. } catch {
  288. //
  289. }
  290. setTimeout(() => {
  291. forms.messageLoading = false;
  292. }, 100);
  293. };
  294. // 添加课件
  295. const onAddCourseware = async (item: any) => {
  296. if (forms.messageLoading) return;
  297. forms.messageLoading = true;
  298. try {
  299. await api_addByOpenCourseware({ id: item.id });
  300. message.success('添加成功');
  301. getCoursewareList();
  302. // getOpenCoursewareList();
  303. eventGlobal.emit('openCoursewareChanged');
  304. } catch {
  305. //
  306. }
  307. setTimeout(() => {
  308. forms.messageLoading = false;
  309. }, 100);
  310. };
  311. // 预览上课
  312. const onPreviewAttend = (id: string) => {
  313. // 判断是否在应用里面
  314. if (window.matchMedia('(display-mode: standalone)').matches) {
  315. state.application = window.matchMedia(
  316. '(display-mode: standalone)'
  317. ).matches;
  318. forms.previewModal = true;
  319. fscreen();
  320. forms.previewParams = {
  321. type: 'preview',
  322. courseId: id,
  323. subjectId: prepareStore.getSubjectId,
  324. detailId: prepareStore.getSelectKey,
  325. lessonCourseId: prepareStore.getBaseCourseware.id
  326. };
  327. } else {
  328. const { href } = router.resolve({
  329. path: '/attend-class',
  330. query: {
  331. type: 'preview',
  332. courseId: id,
  333. subjectId: prepareStore.getSubjectId,
  334. detailId: prepareStore.getSelectKey,
  335. lessonCourseId: prepareStore.getBaseCourseware.id
  336. }
  337. });
  338. window.open(href, +new Date() + '');
  339. }
  340. };
  341. const onStartClass = async (item: any, classGroupId: any) => {
  342. if (classGroupId) {
  343. // 开始上课
  344. const res = await courseScheduleStart({
  345. lessonCoursewareKnowledgeDetailId: prepareStore.selectKey,
  346. classGroupId: classGroupId,
  347. useChapterLessonCoursewareId: item.id,
  348. subjectId: prepareStore.getSubjectId
  349. });
  350. if (window.matchMedia('(display-mode: standalone)').matches) {
  351. state.application = window.matchMedia(
  352. '(display-mode: standalone)'
  353. ).matches;
  354. forms.previewModal = true;
  355. fscreen();
  356. forms.previewParams = {
  357. type: 'class',
  358. classGroupId: classGroupId,
  359. courseId: item.id,
  360. subjectId: prepareStore.getSubjectId,
  361. detailId: prepareStore.getSelectKey,
  362. classId: res.data,
  363. lessonCourseId: prepareStore.getBaseCourseware.id,
  364. preStudentNum: forms.preStudentNum
  365. };
  366. } else {
  367. const { href } = router.resolve({
  368. path: '/attend-class',
  369. query: {
  370. type: 'class',
  371. classGroupId: classGroupId,
  372. courseId: item.id,
  373. subjectId: prepareStore.getSubjectId,
  374. detailId: prepareStore.getSelectKey,
  375. classId: res.data,
  376. lessonCourseId: prepareStore.getBaseCourseware.id,
  377. preStudentNum: forms.preStudentNum
  378. }
  379. });
  380. window.open(href, +new Date() + '');
  381. }
  382. } else {
  383. forms.showAttendClass = true;
  384. forms.attendClassType = 'change';
  385. forms.attendClassItem = item;
  386. }
  387. };
  388. // const carouselRef = ref();
  389. // const onChangeSlide = (type: 'left' | 'right') => {
  390. // if (type === 'left') {
  391. // carouselRef.value?.prev();
  392. // } else if (type === 'right') {
  393. // carouselRef.value?.next();
  394. // }
  395. // };
  396. return () => (
  397. <div
  398. class={[
  399. styles.coursewarePresetsContainer,
  400. forms.openTableShow && styles.rightLineShow
  401. ]}>
  402. <div
  403. class={styles.presetsLeft}
  404. id="presetsLeftRef"
  405. style={{ width: `calc(${forms.leftWidth} - ${forms.rightWidth})` }}>
  406. <NTabs
  407. ref={subjectRef}
  408. defaultValue="subject"
  409. paneClass={styles.paneTitle}
  410. justifyContent="start"
  411. paneWrapperClass={styles.paneWrapperContainer}
  412. value={prepareStore.getSubjectId?.toString()}
  413. onUpdate:value={val => {
  414. prepareStore.setSubjectId(val);
  415. // 保存
  416. forms.subjectId = val;
  417. if (!val) {
  418. sessionStorage.setItem(
  419. 'prepareLessonCourseWareSubjectIsNull',
  420. val ? 'false' : 'true'
  421. );
  422. }
  423. }}
  424. v-slots={{
  425. suffix: () => (
  426. <NButton
  427. class={styles.addBtn}
  428. type="primary"
  429. bordered={false}
  430. onClick={() => {
  431. eventGlobal.emit('teacher-slideshow', true);
  432. emit('change', {
  433. status: true,
  434. type: 'create'
  435. });
  436. }}>
  437. <NImage
  438. class={styles.addBtnIcon}
  439. previewDisabled
  440. src={add}></NImage>
  441. 创建课件
  442. </NButton>
  443. )
  444. }}>
  445. {[{ name: '全部声部', id: '' }, ...prepareStore.getSubjectList].map(
  446. (item: any) => (
  447. <NTabPane
  448. name={`${item.id}`}
  449. tab={item.name}
  450. displayDirective="if"></NTabPane>
  451. )
  452. )}
  453. </NTabs>
  454. <NSpin show={forms.loading}>
  455. <NScrollbar class={styles.coursewarePresets}>
  456. <div style={{ overflow: 'hidden' }}>
  457. <div
  458. class={[
  459. styles.list,
  460. !forms.loading &&
  461. forms.tableList.length <= 0 &&
  462. styles.listEmpty
  463. ]}>
  464. {forms.tableList.map((item: any) => (
  465. <div class={[styles.itemWrap, styles.itemBlock, 'row-nav']}>
  466. <div class={styles.itemWrapBox}>
  467. <CoursewareType
  468. operate
  469. isEditName
  470. item={item}
  471. onClick={() => onPreviewAttend(item.id)}
  472. // onEditName={() => {
  473. // forms.selectItem = item;
  474. // forms.editTitle = item.name;
  475. // forms.editTitleVisiable = true;
  476. // }}
  477. onEdit={() => {
  478. //
  479. eventGlobal.emit('teacher-slideshow', true);
  480. emit('change', {
  481. status: true,
  482. type: 'update',
  483. groupItem: { id: item.id }
  484. });
  485. }}
  486. onStartClass={() =>
  487. onStartClass(item, forms.classGroupId)
  488. }
  489. onDelete={() => {
  490. forms.selectItem = item;
  491. forms.preRemoveVisiable = true;
  492. }}
  493. // 布置作业
  494. onWork={() => {
  495. forms.workVisiable = true;
  496. forms.selectItem = item;
  497. nextTick(() => {
  498. getModalHeight();
  499. });
  500. }}
  501. />
  502. </div>
  503. </div>
  504. ))}
  505. {!forms.loading && forms.tableList.length <= 0 && (
  506. <TheEmpty
  507. class={styles.empty1}
  508. description="当前章节暂无课件,快点击右上角创建课件吧"
  509. />
  510. )}
  511. </div>
  512. </div>
  513. </NScrollbar>
  514. </NSpin>
  515. </div>
  516. <div class={styles.presetsRight} id="presetsRightRef">
  517. <NTooltip showArrow={false}>
  518. {{
  519. trigger: () => (
  520. <div
  521. class={[
  522. styles.presetsArrar,
  523. !forms.openTableShow && styles.presetsArrarActive
  524. ]}
  525. onClick={() => (forms.openTableShow = !forms.openTableShow)}>
  526. <NIcon>
  527. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
  528. <path
  529. d="M16.62 2.99a1.25 1.25 0 0 0-1.77 0L6.54 11.3a.996.996 0 0 0 0 1.41l8.31 8.31c.49.49 1.28.49 1.77 0s.49-1.28 0-1.77L9.38 12l7.25-7.25c.48-.48.48-1.28-.01-1.76z"
  530. fill="currentColor"></path>
  531. </svg>
  532. </NIcon>
  533. </div>
  534. ),
  535. default: () => <div>{forms.openTableShow ? '收起' : '展开'}</div>
  536. }}
  537. </NTooltip>
  538. <Related
  539. onMore={() => (forms.showRelatedClass = true)}
  540. onAdd={(item: any) => {
  541. onAddCourseware(item);
  542. }}
  543. onLook={(item: any) => {
  544. onPreviewAttend(item.id);
  545. }}
  546. />
  547. </div>
  548. {/* )} */}
  549. <NModal
  550. v-model:show={forms.showRelatedClass}
  551. preset="card"
  552. showIcon={false}
  553. class={['modalTitle background', styles.attendClassModal1]}
  554. title={'相关课件'}
  555. blockScroll={false}>
  556. <RelatedClass
  557. tableList={forms.tableList}
  558. subjectList={prepareStore.getSubjectList}
  559. subjectId={prepareStore.getSubjectId as any}
  560. coursewareDetailKnowledgeId={prepareStore.getSelectKey}
  561. onClose={() => (forms.showRelatedClass = false)}
  562. onAdd={(item: any) => onAddCourseware(item)}
  563. onClick={(item: any) => {
  564. onPreviewAttend(item.id);
  565. forms.showRelatedClass = false;
  566. }}
  567. />
  568. </NModal>
  569. {/* <NModal
  570. v-model:show={forms.editTitleVisiable}
  571. preset="card"
  572. class={['modalTitle', styles.removeVisiable1]}
  573. title={'课件重命名'}>
  574. <div class={styles.studentRemove}>
  575. <NInput
  576. placeholder="请输入课件名称"
  577. v-model:value={forms.editTitle}
  578. maxlength={15}
  579. onKeyup={(e: any) => {
  580. if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') {
  581. e.stopPropagation();
  582. }
  583. }}
  584. />
  585. <NSpace class={styles.btnGroupModal} justify="center">
  586. <NButton round onClick={() => (forms.editTitleVisiable = false)}>
  587. 取消
  588. </NButton>
  589. <NButton
  590. round
  591. type="primary"
  592. onClick={onEditTitleSubmit}
  593. loading={forms.editBtnLoading}>
  594. 确定
  595. </NButton>
  596. </NSpace>
  597. </div>
  598. </NModal> */}
  599. <NModal
  600. v-model:show={forms.preRemoveVisiable}
  601. preset="card"
  602. class={['modalTitle', styles.removeVisiable1]}
  603. title={'删除课件'}>
  604. <TheMessageDialog
  605. content={`<p style="text-align: left;">请确认是否删除【${forms.selectItem.name}】,删除后不可恢复</p>`}
  606. cancelButtonText="取消"
  607. confirmButtonText="确认"
  608. loading={forms.messageLoading}
  609. onClose={() => (forms.preRemoveVisiable = false)}
  610. onConfirm={() => onRemove()}
  611. />
  612. </NModal>
  613. <NModal
  614. v-model:show={forms.addVisiable}
  615. preset="card"
  616. class={['modalTitle', styles.removeVisiable1]}
  617. title={'保存成功'}>
  618. <TheMessageDialog
  619. content={`<p style="text-align: left;">【${props.addParam.name}】暂未设置课件作业,是否现在去设置课件作业</p>`}
  620. cancelButtonText="稍后设置"
  621. confirmButtonText="立即设置"
  622. // loading={forms.messageLoading}
  623. onClose={() => (forms.addVisiable = false)}
  624. onConfirm={() => {
  625. forms.addVisiable = false;
  626. forms.workVisiable = true;
  627. forms.selectItem = {
  628. id: props.addParam.id,
  629. name: props.addParam.name
  630. };
  631. }}
  632. />
  633. </NModal>
  634. {/* 应用内预览或上课 */}
  635. <PreviewWindow
  636. v-model:show={forms.previewModal}
  637. type="attend"
  638. params={forms.previewParams}
  639. />
  640. <NModal
  641. v-model:show={forms.showAttendClass}
  642. preset="card"
  643. showIcon={false}
  644. class={['modalTitle background', styles.attendClassModal]}
  645. title={'选择班级'}
  646. blockScroll={false}>
  647. <AttendClass
  648. onClose={() => (forms.showAttendClass = false)}
  649. type={forms.attendClassType}
  650. onPreview={(item: any) => {
  651. if (window.matchMedia('(display-mode: standalone)').matches) {
  652. state.application = window.matchMedia(
  653. '(display-mode: standalone)'
  654. ).matches;
  655. forms.previewModal = true;
  656. forms.previewParams = {
  657. ...item
  658. };
  659. } else {
  660. const { href } = router.resolve({
  661. path: '/attend-class',
  662. query: {
  663. ...item
  664. }
  665. });
  666. window.open(href, +new Date() + '');
  667. }
  668. }}
  669. onConfirm={async (item: any) => {
  670. onStartClass(forms.attendClassItem, item.classGroupId);
  671. }}
  672. />
  673. </NModal>
  674. <NModal
  675. v-model:show={forms.workVisiable}
  676. preset="card"
  677. class={['modalTitle background', styles.workVisiable]}
  678. title={
  679. forms.selectItem.lessonPreTrainingId ? '编辑作业' : '创建作业'
  680. }>
  681. <div id="model-homework-height" class={styles.workContainer}>
  682. <div class={styles.workTrain}>
  683. <Train
  684. cardType="prepare"
  685. lessonPreTraining={{
  686. title: '',
  687. chapterId: forms.selectItem.id, // 课件编号
  688. id: forms.selectItem.lessonPreTrainingId // 作业编号
  689. }}
  690. onChange={(val: any) => {
  691. forms.workVisiable = val.status;
  692. getCoursewareList();
  693. }}
  694. />
  695. </div>
  696. <div class={styles.resourceMain}>
  697. <ResourceMain cardType="prepare" />
  698. </div>
  699. </div>
  700. </NModal>
  701. </div>
  702. );
  703. }
  704. });