index.tsx 26 KB

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