index.tsx 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. import { defineComponent, onMounted, reactive, watch } from 'vue';
  2. import styles from './index.module.less';
  3. import {
  4. NButton,
  5. NModal,
  6. NScrollbar,
  7. NSelect,
  8. NSpace,
  9. NSpin,
  10. useMessage,
  11. useDialog
  12. } from 'naive-ui';
  13. import CardType from '/src/components/card-type';
  14. import AttendClass from '/src/views/prepare-lessons/model/attend-class';
  15. import { usePrepareStore } from '/src/store/modules/prepareLessons';
  16. import { useCatchStore } from '/src/store/modules/catchData';
  17. import TheEmpty from '/src/components/TheEmpty';
  18. import {
  19. courseScheduleStart,
  20. queryCourseware,
  21. saveCourseware,
  22. teacherKnowledgeMaterialDelete
  23. } from '../../../api';
  24. import Draggable from 'vuedraggable';
  25. import iconDelete from '../../../images/icon-delete.png';
  26. import iconAddMusic from '../../../images/icon-add-music.png';
  27. import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router';
  28. import deepClone from '/src/helpers/deep-clone';
  29. import CardPreview from '/src/components/card-preview';
  30. import PreviewWindow from '/src/views/preview-window';
  31. import { state } from '/src/state';
  32. import SubjectSync from '../../../model/subject-sync';
  33. import { eventGlobal } from '/src/utils';
  34. export default defineComponent({
  35. name: 'courseware-modal',
  36. setup() {
  37. const catchStore = useCatchStore();
  38. const prepareStore = usePrepareStore();
  39. const route = useRoute();
  40. const router = useRouter();
  41. const dialog = useDialog();
  42. const message = useMessage();
  43. const localStorageSubjectId = localStorage.getItem(
  44. 'prepareLessonSubjectId'
  45. );
  46. const forms = reactive({
  47. className: route.query.name as any,
  48. classGroupId: route.query.classGroupId,
  49. // 选取参数带的,后取缓存
  50. subjectId: route.query.subjectId
  51. ? Number(route.query.subjectId)
  52. : localStorageSubjectId
  53. ? Number(localStorageSubjectId)
  54. : null,
  55. coursewareList: [] as any,
  56. loadingStatus: false,
  57. showAttendClass: false,
  58. attendClassType: 'change', //
  59. removeIds: [] as any, // 临时删除的编号
  60. drag: false,
  61. isEdit: false, // 是否更新数据
  62. editSubjectIds: '', // 声部编号
  63. removeVisiable: false,
  64. removeVisiable1: false,
  65. subjectSyncVisiable: false, // 同步声部
  66. show: false,
  67. item: {} as any,
  68. previewModal: false,
  69. previewParams: {
  70. type: '',
  71. subjectId: '',
  72. detailId: ''
  73. } as any
  74. });
  75. // 获取列表
  76. const getList = async () => {
  77. forms.loadingStatus = true;
  78. try {
  79. // 判断是否有选择对应的课件 或声部
  80. if (!prepareStore.getSelectKey || !prepareStore.getSubjectId)
  81. return (forms.loadingStatus = false);
  82. const { data } = await queryCourseware({
  83. coursewareDetailKnowledgeId: prepareStore.getSelectKey,
  84. subjectId: prepareStore.getSubjectId,
  85. page: 1,
  86. rows: 99
  87. });
  88. const tempRows = data.rows || [];
  89. const temp: any = [];
  90. tempRows.forEach((row: any) => {
  91. temp.push({
  92. id: row.id,
  93. materialId: row.materialId,
  94. coverImg: row.coverImg,
  95. type: row.materialType,
  96. title: row.materialName,
  97. isCollect: !!row.favoriteFlag,
  98. isSelected: row.source === 'PLATFORM' ? true : false,
  99. content: row.content,
  100. removeFlag: row.removeFlag
  101. });
  102. });
  103. prepareStore.setCoursewareList(temp || []);
  104. const tempCourse: any = [];
  105. temp.forEach((item: any) => {
  106. if (!forms.removeIds.includes(item.id)) {
  107. tempCourse.push(item);
  108. }
  109. });
  110. forms.coursewareList = tempCourse;
  111. } catch {
  112. //
  113. }
  114. forms.loadingStatus = false;
  115. };
  116. // 监听选择的key 左侧选择了其它的课
  117. watch(
  118. () => prepareStore.getSelectKey,
  119. () => {
  120. forms.drag = false;
  121. prepareStore.setIsEditResource(false);
  122. getList();
  123. }
  124. );
  125. // 声部变化时
  126. watch(
  127. () => prepareStore.getSubjectId,
  128. () => {
  129. getList();
  130. }
  131. );
  132. watch(
  133. () => prepareStore.getIsAddResource,
  134. (val: boolean) => {
  135. if (val) {
  136. getList();
  137. prepareStore.setIsAddResource(false);
  138. }
  139. }
  140. );
  141. // 监听列表变化,如果变化了,则弹选择声部的
  142. watch(
  143. () => forms.coursewareList,
  144. () => {
  145. if (forms.drag) {
  146. forms.isEdit = true;
  147. }
  148. },
  149. {
  150. deep: true
  151. }
  152. );
  153. // 删除
  154. const onDelete = (item: any) => {
  155. //
  156. forms.removeIds.push(item.id);
  157. const index = forms.coursewareList.findIndex(
  158. (c: any) => c.id === item.id
  159. );
  160. forms.coursewareList.splice(index, 1);
  161. forms.isEdit = true;
  162. // prepareStore.setCoursewareList(forms.coursewareList);
  163. // console.log(prepareStore.getCoursewareList, 'getCourseware');
  164. };
  165. // 完成编辑
  166. const onOverEdit = async () => {
  167. try {
  168. const temp: any = [];
  169. forms.coursewareList.forEach((item: any) => {
  170. temp.push({
  171. materialName: item.title,
  172. materialType: item.type,
  173. materialId: item.materialId,
  174. id: item.id
  175. });
  176. });
  177. // 保存课件
  178. // 判断是否编辑,如果编辑则取选择的声部
  179. await saveCourseware({
  180. coursewareDetailKnowledgeId: prepareStore.getSelectKey,
  181. lessonCoursewareId: prepareStore.getLessonCoursewareId,
  182. lessonCoursewareDetailId: prepareStore.getLessonCoursewareDetailId,
  183. subjectId: forms.isEdit
  184. ? forms.editSubjectIds
  185. : prepareStore.getSubjectId,
  186. materialList: [...temp]
  187. });
  188. forms.drag = false;
  189. message.success('编辑成功');
  190. forms.removeVisiable = false;
  191. prepareStore.setIsEditResource(false);
  192. // 重置临时删除编号
  193. forms.removeIds = [];
  194. await getList();
  195. } catch {
  196. //
  197. }
  198. };
  199. // 预览上课
  200. const onPreviewAttend = () => {
  201. // 获取上架的数据
  202. let count = 0;
  203. forms.coursewareList.forEach((item: any) => {
  204. if (!item.removeFlag) {
  205. count++;
  206. }
  207. });
  208. if (count <= 0) {
  209. message.error('课件不能为空');
  210. return;
  211. }
  212. // 判断是否在应用里面
  213. if (window.matchMedia('(display-mode: standalone)').matches) {
  214. state.application = window.matchMedia(
  215. '(display-mode: standalone)'
  216. ).matches;
  217. forms.previewModal = true;
  218. fscreen();
  219. forms.previewParams = {
  220. type: 'preview',
  221. subjectId: prepareStore.getSubjectId,
  222. detailId: prepareStore.getSelectKey,
  223. lessonCourseId: prepareStore.getBaseCourseware.id
  224. };
  225. } else {
  226. const { href } = router.resolve({
  227. path: '/attend-class',
  228. query: {
  229. type: 'preview',
  230. subjectId: prepareStore.getSubjectId,
  231. detailId: prepareStore.getSelectKey,
  232. lessonCourseId: prepareStore.getBaseCourseware.id
  233. }
  234. });
  235. window.open(href, +new Date() + '');
  236. }
  237. };
  238. const fscreen = () => {
  239. const el = document.documentElement;
  240. const isFullscreen =
  241. document.fullScreen ||
  242. document.mozFullScreen ||
  243. document.webkitIsFullScreen;
  244. if (!isFullscreen) {
  245. //进入全屏
  246. (el.requestFullscreen && el.requestFullscreen()) ||
  247. (el.mozRequestFullScreen && el.mozRequestFullScreen()) ||
  248. (el.webkitRequestFullscreen && el.webkitRequestFullscreen()) ||
  249. (el.msRequestFullscreen && el.msRequestFullscreen());
  250. }
  251. };
  252. // 单个删除
  253. const onRemove = async (item: any) => {
  254. try {
  255. dialog.warning({
  256. title: '提示',
  257. content: '该资源已下架,是否删除?',
  258. positiveText: '确定',
  259. negativeText: '取消',
  260. onPositiveClick: async () => {
  261. forms.removeIds.push(item.id);
  262. await teacherKnowledgeMaterialDelete({ ids: item.id });
  263. message.success('删除成功');
  264. getList();
  265. }
  266. });
  267. } catch {
  268. //
  269. }
  270. };
  271. watch(
  272. () => prepareStore.getSubjectList,
  273. () => {
  274. checkSubjectIds();
  275. }
  276. );
  277. const checkSubjectIds = () => {
  278. const subjectList = prepareStore.getSubjectList;
  279. // 并且没有声部时才会更新
  280. if (subjectList.length > 0) {
  281. // 并且声部在列表中
  282. const localStorageSubjectId = localStorage.getItem(
  283. 'prepareLessonSubjectId'
  284. );
  285. const subjectId =
  286. forms.subjectId || localStorageSubjectId
  287. ? Number(forms.subjectId || localStorageSubjectId)
  288. : null;
  289. // 判断浏览器上面是否有
  290. const index = subjectList.findIndex(
  291. (subject: any) => subject.id == subjectId
  292. );
  293. if (subjectId && index >= 0) {
  294. prepareStore.setSubjectId(subjectId);
  295. } else {
  296. // 判断是否有缓存
  297. prepareStore.setSubjectId(subjectList[0].id);
  298. }
  299. // 保存
  300. localStorage.setItem(
  301. 'prepareLessonSubjectId',
  302. prepareStore.getSubjectId as any
  303. );
  304. }
  305. };
  306. watch(
  307. () => route.query,
  308. async () => {
  309. forms.className = route.query.name as any;
  310. forms.classGroupId = route.query.classGroupId as any;
  311. forms.subjectId = route.query.subjectId
  312. ? Number(route.query.subjectId)
  313. : null;
  314. prepareStore.setClassGroupId(forms.classGroupId as any);
  315. checkSubjectIds();
  316. await getList();
  317. }
  318. );
  319. onMounted(async () => {
  320. prepareStore.setClassGroupId(route.query.classGroupId as any);
  321. // 获取教材分类列表
  322. checkSubjectIds();
  323. await getList();
  324. // 动态添加数据
  325. eventGlobal.on('onPrepareAddItem', (item: any) => {
  326. forms.drag = true;
  327. forms.coursewareList.push(item);
  328. prepareStore.setCoursewareList(forms.coursewareList);
  329. forms.isEdit = true;
  330. });
  331. });
  332. return () => (
  333. <div class={styles.coursewareModal}>
  334. <div class={styles.btnGroup}>
  335. {forms.drag ? (
  336. <NSpace>
  337. <span class={styles.tips}>拖动可将资源进行排序哦~</span>
  338. </NSpace>
  339. ) : (
  340. <NSpace>
  341. {forms.classGroupId && (
  342. <div class={styles.btnItem}>
  343. <span class={styles.btnTitle}>上课班级:</span>
  344. <div
  345. onClick={() => {
  346. forms.showAttendClass = true;
  347. forms.attendClassType = 'change';
  348. }}>
  349. <NSelect
  350. placeholder="选择声部"
  351. labelField="name"
  352. valueField="id"
  353. class={styles.btnClassList}
  354. value={forms.className}
  355. disabled
  356. />
  357. </div>
  358. </div>
  359. )}
  360. <div class={styles.btnItem}>
  361. <span class={styles.btnTitle}>声部:</span>
  362. <NSelect
  363. placeholder="选择声部"
  364. class={styles.btnSubjectList}
  365. options={prepareStore.getSubjectList}
  366. labelField="name"
  367. valueField="id"
  368. value={prepareStore.getSubjectId}
  369. onUpdate:value={(val: any) => {
  370. prepareStore.setSubjectId(val);
  371. // 保存
  372. localStorage.setItem('prepareLessonSubjectId', val);
  373. getList();
  374. }}
  375. />
  376. </div>
  377. </NSpace>
  378. )}
  379. {/* 编辑 */}
  380. {!forms.drag ? (
  381. <NSpace>
  382. <NButton
  383. type="default"
  384. onClick={() => {
  385. forms.drag = true;
  386. prepareStore.setIsEditResource(true);
  387. // forms.subjectSyncVisiable = true;
  388. }}>
  389. 编辑
  390. </NButton>
  391. </NSpace>
  392. ) : (
  393. <NSpace>
  394. <NButton
  395. type="error"
  396. onClick={() => {
  397. forms.removeVisiable1 = true;
  398. }}>
  399. 清空资源
  400. </NButton>
  401. <NButton
  402. type="error"
  403. onClick={() => {
  404. forms.drag = false;
  405. forms.isEdit = false;
  406. prepareStore.setIsEditResource(false);
  407. forms.removeIds = [];
  408. getList();
  409. }}>
  410. 取消编辑
  411. </NButton>
  412. <NButton
  413. type="default"
  414. onClick={() => {
  415. if (forms.isEdit) {
  416. forms.subjectSyncVisiable = true;
  417. } else {
  418. forms.removeVisiable = true;
  419. }
  420. }}>
  421. 完成编辑
  422. </NButton>
  423. </NSpace>
  424. )}
  425. </div>
  426. <NScrollbar
  427. class={[
  428. styles.listContainer,
  429. forms.drag ? styles.listContainerDrag : ''
  430. ]}
  431. {...{ id: 'lessons-2' }}>
  432. <NSpin show={forms.loadingStatus}>
  433. <div
  434. class={[
  435. styles.listSection
  436. // !forms.loadingStatus && forms.coursewareList.length <= 0
  437. // ? styles.emptySection
  438. // : ''
  439. ]}
  440. onDragenter={(e: any) => {
  441. e.preventDefault();
  442. }}
  443. onDragover={(e: any) => {
  444. e.preventDefault();
  445. }}
  446. onDrop={(e: any) => {
  447. let dropItem = e.dataTransfer.getData('text');
  448. dropItem = dropItem ? JSON.parse(dropItem) : {};
  449. // 判断是否有数据
  450. if (dropItem.id) {
  451. eventGlobal.emit('onPrepareAddItem', {
  452. materialId: dropItem.id,
  453. coverImg: dropItem.coverImg,
  454. type: dropItem.type,
  455. title: dropItem.title,
  456. isCollect: dropItem.isCollect,
  457. isSelected: dropItem.isSelected,
  458. content: dropItem.content,
  459. removeFlag: false
  460. });
  461. }
  462. }}>
  463. {forms.coursewareList.length > 0 && (
  464. <>
  465. {forms.drag ? (
  466. <Draggable
  467. v-model:modelValue={forms.coursewareList}
  468. itemKey="id"
  469. componentData={{
  470. itemKey: 'id',
  471. tag: 'div',
  472. animation: 200,
  473. group: 'description',
  474. disabled: false
  475. }}
  476. class={styles.list}>
  477. {{
  478. item: (element: any) => {
  479. const item = element.element;
  480. return (
  481. <div
  482. data-id={item.id}
  483. class={[
  484. styles.itemWrap,
  485. styles.itemBlock,
  486. 'row-nav'
  487. ]}>
  488. <div class={styles.itemWrapBox}>
  489. <CardType
  490. class={[styles.itemContent]}
  491. isShowCollect={false}
  492. offShelf={item.removeFlag ? true : false}
  493. onOffShelf={() => onRemove(item)}
  494. item={item}
  495. />
  496. <div class={styles.itemOperation}>
  497. <img
  498. src={iconDelete}
  499. class={styles.iconDelete}
  500. onClick={(e: MouseEvent) => {
  501. e.stopPropagation();
  502. onDelete(item);
  503. }}
  504. />
  505. </div>
  506. </div>
  507. </div>
  508. );
  509. }
  510. }}
  511. </Draggable>
  512. ) : (
  513. <div class={styles.list}>
  514. {forms.coursewareList.map((item: any) => (
  515. <div class={styles.itemWrap}>
  516. <div class={styles.itemWrapBox}>
  517. <CardType
  518. class={[styles.itemContent, 'handle']}
  519. isShowCollect={false}
  520. item={item}
  521. offShelf={item.removeFlag ? true : false}
  522. onOffShelf={() => onRemove(item)}
  523. disabledMouseHover={false}
  524. onClick={() => {
  525. if (item.type === 'IMG') return;
  526. forms.show = true;
  527. forms.item = item;
  528. }}
  529. />
  530. </div>
  531. </div>
  532. ))}
  533. <div class={styles.itemWrap}>
  534. <div class={styles.itemWrapBox}>
  535. <div
  536. class={[
  537. styles.itemContent,
  538. styles.addMusicItem,
  539. 'handle'
  540. ]}
  541. onClick={() => {
  542. // 直接跳转到制谱页面 (临时存储数据)
  543. sessionStorage.setItem(
  544. 'notation-open-create',
  545. '1'
  546. );
  547. router.push('/notation');
  548. }}>
  549. <img src={iconAddMusic} />
  550. <p class={styles.addMusicName}>开始制谱</p>
  551. </div>
  552. </div>
  553. </div>
  554. </div>
  555. )}
  556. </>
  557. )}
  558. {/* {!forms.loadingStatus && forms.coursewareList.length <= 0 && (
  559. <TheEmpty description="暂无课件" />
  560. )} */}
  561. {forms.coursewareList.length <= 0 && (
  562. <div class={styles.list}>
  563. <div class={styles.itemWrap}>
  564. <div class={styles.itemWrapBox}>
  565. <div
  566. class={[
  567. styles.itemContent,
  568. styles.addMusicItem,
  569. 'handle'
  570. ]}
  571. onClick={() => {
  572. // 直接跳转到制谱页面 (临时存储数据)
  573. sessionStorage.setItem('notation-open-create', '1');
  574. router.push('/notation');
  575. }}>
  576. <img src={iconAddMusic} />
  577. <p class={styles.addMusicName}>开始制谱</p>
  578. </div>
  579. </div>
  580. </div>
  581. </div>
  582. )}
  583. </div>
  584. </NSpin>
  585. </NScrollbar>
  586. {!forms.drag ? (
  587. <div
  588. class={[styles.btnGroup, styles.btnGroupClass]}
  589. style={{ justifyContent: 'flex-end' }}>
  590. <NSpace justify="end">
  591. <NButton type="primary" onClick={onPreviewAttend}>
  592. 预览课件
  593. </NButton>
  594. <NButton
  595. {...{ id: 'lessons-3' }}
  596. type="error"
  597. class={styles.btnClassStart}
  598. onClick={async () => {
  599. let count = 0;
  600. forms.coursewareList.forEach((item: any) => {
  601. if (!item.removeFlag) {
  602. count++;
  603. }
  604. });
  605. if (count <= 0) {
  606. message.error('课件不能为空');
  607. return;
  608. }
  609. if (forms.classGroupId) {
  610. // 开始上课
  611. const res = await courseScheduleStart({
  612. lessonCoursewareKnowledgeDetailId: prepareStore.selectKey,
  613. classGroupId: forms.classGroupId
  614. });
  615. if (
  616. window.matchMedia('(display-mode: standalone)').matches
  617. ) {
  618. state.application = window.matchMedia(
  619. '(display-mode: standalone)'
  620. ).matches;
  621. forms.previewModal = true;
  622. fscreen();
  623. forms.previewParams = {
  624. type: 'class',
  625. classGroupId: forms.classGroupId,
  626. subjectId: prepareStore.getSubjectId,
  627. detailId: prepareStore.getSelectKey,
  628. classId: res.data,
  629. lessonCourseId: prepareStore.getBaseCourseware.id
  630. };
  631. } else {
  632. const { href } = router.resolve({
  633. path: '/attend-class',
  634. query: {
  635. type: 'class',
  636. classGroupId: forms.classGroupId,
  637. subjectId: prepareStore.getSubjectId,
  638. detailId: prepareStore.getSelectKey,
  639. classId: res.data,
  640. lessonCourseId: prepareStore.getBaseCourseware.id
  641. }
  642. });
  643. window.open(href, +new Date() + '');
  644. }
  645. } else {
  646. forms.showAttendClass = true;
  647. forms.attendClassType = 'change';
  648. }
  649. }}>
  650. 开始上课
  651. </NButton>
  652. </NSpace>
  653. </div>
  654. ) : (
  655. ''
  656. )}
  657. <NModal
  658. v-model:show={forms.showAttendClass}
  659. preset="card"
  660. showIcon={false}
  661. class={['modalTitle background', styles.attendClassModal]}
  662. title={'选择班级'}
  663. blockScroll={false}>
  664. <AttendClass
  665. onClose={() => (forms.showAttendClass = false)}
  666. type={forms.attendClassType}
  667. onPreview={(item: any) => {
  668. if (window.matchMedia('(display-mode: standalone)').matches) {
  669. state.application = window.matchMedia(
  670. '(display-mode: standalone)'
  671. ).matches;
  672. forms.previewModal = true;
  673. forms.previewParams = {
  674. ...item
  675. };
  676. } else {
  677. const { href } = router.resolve({
  678. path: '/attend-class',
  679. query: {
  680. ...item
  681. }
  682. });
  683. window.open(href, +new Date() + '');
  684. }
  685. }}
  686. onConfirm={async (item: any) => {
  687. if (forms.classGroupId) {
  688. forms.className = item.name;
  689. forms.classGroupId = item.classGroupId;
  690. forms.subjectId = item.subjectId;
  691. forms.showAttendClass = false;
  692. prepareStore.setClassGroupId(item.classGroupId);
  693. checkSubjectIds();
  694. // 声部切换时
  695. eventGlobal.emit('onChangeClass', {
  696. lastUseCoursewareId: item.lastUseCoursewareId,
  697. unit: item.unit
  698. });
  699. } else {
  700. const res = await courseScheduleStart({
  701. lessonCoursewareKnowledgeDetailId: prepareStore.selectKey,
  702. classGroupId: item.classGroupId
  703. });
  704. forms.showAttendClass = false;
  705. if (window.matchMedia('(display-mode: standalone)').matches) {
  706. state.application = window.matchMedia(
  707. '(display-mode: standalone)'
  708. ).matches;
  709. forms.previewModal = true;
  710. forms.previewParams = {
  711. type: 'class',
  712. classId: res.data, // 上课编号
  713. classGroupId: item.classGroupId,
  714. subjectId: prepareStore.getSubjectId,
  715. detailId: prepareStore.getSelectKey,
  716. lessonCourseId: prepareStore.getBaseCourseware.id
  717. };
  718. setTimeout(() => {
  719. fscreen();
  720. }, 200);
  721. } else {
  722. const { href } = router.resolve({
  723. path: '/attend-class',
  724. query: {
  725. type: 'class',
  726. classId: res.data, // 上课编号
  727. classGroupId: item.classGroupId,
  728. subjectId: prepareStore.getSubjectId,
  729. detailId: prepareStore.getSelectKey,
  730. lessonCourseId: prepareStore.getBaseCourseware.id
  731. }
  732. });
  733. window.open(href, +new Date() + '');
  734. }
  735. }
  736. }}
  737. />
  738. </NModal>
  739. {/* 弹窗查看 */}
  740. <CardPreview v-model:show={forms.show} item={forms.item} />
  741. <NModal
  742. v-model:show={forms.removeVisiable}
  743. preset="card"
  744. class={['modalTitle', styles.removeVisiable]}
  745. title={'提示'}>
  746. <div class={styles.studentRemove}>
  747. <p>是否完成编辑?</p>
  748. <NSpace class={styles.btnGroupModal} justify="center">
  749. <NButton round type="primary" onClick={onOverEdit}>
  750. 确定
  751. </NButton>
  752. <NButton round onClick={() => (forms.removeVisiable = false)}>
  753. 取消
  754. </NButton>
  755. </NSpace>
  756. </div>
  757. </NModal>
  758. <NModal
  759. v-model:show={forms.removeVisiable1}
  760. preset="card"
  761. class={['modalTitle', styles.removeVisiable1]}
  762. title={'清空资源'}>
  763. <div class={styles.studentRemove}>
  764. <p>
  765. 请确认是否要清空资源?
  766. <span>点击确认后所有的素材内容 将被清空掉。</span>
  767. </p>
  768. <NSpace class={styles.btnGroupModal} justify="center">
  769. <NButton
  770. round
  771. type="primary"
  772. onClick={() => {
  773. forms.coursewareList.forEach((item: any) => {
  774. forms.removeIds.push(item.id);
  775. });
  776. forms.coursewareList = [];
  777. forms.removeVisiable1 = false;
  778. forms.isEdit = true;
  779. // prepareStore.setCoursewareList([]);
  780. }}>
  781. 确定
  782. </NButton>
  783. <NButton round onClick={() => (forms.removeVisiable1 = false)}>
  784. 取消
  785. </NButton>
  786. </NSpace>
  787. </div>
  788. </NModal>
  789. <PreviewWindow
  790. v-model:show={forms.previewModal}
  791. type="attend"
  792. params={forms.previewParams}
  793. />
  794. {/* 完成编辑时,选择声部 */}
  795. <NModal
  796. v-model:show={forms.subjectSyncVisiable}
  797. preset="card"
  798. class={['modalTitle background', styles.subjectSyncModal]}
  799. title={'同步声部'}>
  800. <SubjectSync
  801. subjectId={prepareStore.getSubjectId as any}
  802. onClose={() => (forms.subjectSyncVisiable = false)}
  803. onConfirm={async (subjectIds: any) => {
  804. //
  805. try {
  806. forms.editSubjectIds = subjectIds.join(',');
  807. await onOverEdit();
  808. forms.subjectSyncVisiable = false;
  809. } catch {
  810. //
  811. }
  812. }}
  813. />
  814. </NModal>
  815. </div>
  816. );
  817. }
  818. });