index.tsx 27 KB

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