index.tsx 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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 { queryCourseware, saveCourseware } from '../../../api';
  19. import Draggable from 'vuedraggable';
  20. import iconDelete from '../../../images/icon-delete.png';
  21. import { useRouter } from 'vue-router';
  22. export default defineComponent({
  23. name: 'courseware-modal',
  24. setup() {
  25. const catchStore = useCatchStore();
  26. const prepareStore = usePrepareStore();
  27. const router = useRouter();
  28. const dialog = useDialog();
  29. const message = useMessage();
  30. const forms = reactive({
  31. coursewareList: [] as any,
  32. loadingStatus: false,
  33. showAttendClass: false,
  34. drag: false
  35. });
  36. // 获取列表
  37. const getList = async () => {
  38. forms.loadingStatus = true;
  39. try {
  40. // 判断是否有选择对应的课件
  41. if (!prepareStore.getSelectKey) return;
  42. const { data } = await queryCourseware({
  43. coursewareDetailKnowledgeId: prepareStore.getSelectKey,
  44. subjectId: prepareStore.getSubjectId,
  45. pag: 1,
  46. rows: 99
  47. });
  48. const tempRows = data.rows || [];
  49. const temp: any = [];
  50. tempRows.forEach((row: any) => {
  51. temp.push({
  52. id: row.id,
  53. materialId: row.materialId,
  54. coverImg: row.coverImg,
  55. type: row.materialType,
  56. title: row.materialName,
  57. isCollect: !!row.favoriteFlag,
  58. isSelected: row.source === 'PLATFORM' ? true : false,
  59. content: row.content
  60. });
  61. });
  62. forms.coursewareList = temp || [];
  63. prepareStore.setCoursewareList(temp || []);
  64. } catch {
  65. //
  66. }
  67. forms.loadingStatus = false;
  68. };
  69. // 监听选择的key 左侧选择了其它的课
  70. watch(
  71. () => prepareStore.getSelectKey,
  72. () => {
  73. getList();
  74. }
  75. );
  76. watch(
  77. () => prepareStore.getIsAddResource,
  78. (val: boolean) => {
  79. if (val) {
  80. getList();
  81. prepareStore.setIsAddResource(false);
  82. }
  83. }
  84. );
  85. // 删除
  86. const onDelete = (item: any) => {
  87. //
  88. const index = forms.coursewareList.findIndex(
  89. (c: any) => c.id === item.id
  90. );
  91. forms.coursewareList.splice(index, 1);
  92. prepareStore.setCoursewareList(forms.coursewareList);
  93. };
  94. // 完成编辑
  95. const onOverEdit = async () => {
  96. dialog.warning({
  97. title: '提示',
  98. content: `是否完成编辑?`,
  99. positiveText: '确定',
  100. negativeText: '取消',
  101. onPositiveClick: async () => {
  102. try {
  103. const temp: any = [];
  104. forms.coursewareList.forEach((item: any) => {
  105. temp.push({
  106. materialName: item.title,
  107. materialType: item.type,
  108. materialId: item.materialId,
  109. id: item.id
  110. });
  111. });
  112. // 保存课件
  113. await saveCourseware({
  114. coursewareDetailKnowledgeId: prepareStore.getSelectKey,
  115. lessonCoursewareId: prepareStore.getLessonCoursewareId,
  116. lessonCoursewareDetailId:
  117. prepareStore.getLessonCoursewareDetailId,
  118. materialList: [...temp]
  119. });
  120. forms.drag = false;
  121. message.success('编辑成功');
  122. prepareStore.setCoursewareList(forms.coursewareList);
  123. } catch {
  124. //
  125. }
  126. }
  127. });
  128. };
  129. // 预览上课
  130. const onPreviewAttend = () => {
  131. const { href } = router.resolve({
  132. path: '/attend-class',
  133. query: {
  134. type: 'preview',
  135. subjectId: prepareStore.getSubjectId,
  136. detailId: prepareStore.getSelectKey
  137. }
  138. });
  139. window.open(href, +new Date() + '');
  140. };
  141. onMounted(async () => {
  142. // 获取教材分类列表
  143. await catchStore.getSubjects();
  144. const subjectList = catchStore.getSubjectList;
  145. if (subjectList.length > 0) {
  146. prepareStore.setSubjectId(subjectList[0].id);
  147. }
  148. await getList();
  149. });
  150. return () => (
  151. <div class={styles.coursewareModal}>
  152. <div class={styles.btnGroup}>
  153. {forms.drag ? (
  154. <NSpace>
  155. <NButton type="default" onClick={onOverEdit}>
  156. 完成编辑
  157. </NButton>
  158. <NButton
  159. type="error"
  160. onClick={() => {
  161. forms.drag = false;
  162. getList();
  163. }}>
  164. 退出编辑
  165. </NButton>
  166. <NButton
  167. type="error"
  168. onClick={() => {
  169. forms.coursewareList = [];
  170. prepareStore.setCoursewareList([]);
  171. }}>
  172. 清空资源
  173. </NButton>
  174. <span class={styles.tips}>拖动可将资源进行排序</span>
  175. </NSpace>
  176. ) : (
  177. <NSpace>
  178. <NSelect
  179. placeholder="选择声部"
  180. options={catchStore.getSubjectList}
  181. labelField="name"
  182. valueField="id"
  183. value={prepareStore.getSubjectId}
  184. onUpdate:value={(val: any) => {
  185. prepareStore.setSubjectId(val);
  186. getList();
  187. }}
  188. />
  189. <NButton type="default" onClick={() => (forms.drag = true)}>
  190. 编辑
  191. </NButton>
  192. </NSpace>
  193. )}
  194. <NSpace>
  195. <NButton type="default" onClick={onPreviewAttend}>
  196. 预览
  197. </NButton>
  198. <NButton
  199. type="primary"
  200. onClick={() => (forms.showAttendClass = true)}>
  201. 开始上课
  202. </NButton>
  203. </NSpace>
  204. </div>
  205. <NScrollbar class={styles.listContainer}>
  206. <NSpin show={forms.loadingStatus}>
  207. <div
  208. class={[
  209. styles.listSection,
  210. !forms.loadingStatus &&
  211. prepareStore.getCoursewareList.length <= 0
  212. ? styles.emptySection
  213. : ''
  214. ]}>
  215. {forms.coursewareList.length > 0 && (
  216. <>
  217. {forms.drag ? (
  218. <Draggable
  219. v-model:modelValue={forms.coursewareList}
  220. itemKey="id"
  221. componentData={{
  222. animation: 200,
  223. group: 'description'
  224. }}
  225. class={styles.list}>
  226. {{
  227. item: (element: any) => {
  228. const item = element.element;
  229. return (
  230. <div
  231. data-id={item.id}
  232. class={[styles.itemBlock, 'row-nav']}>
  233. <CardType
  234. class={[styles.itemContent, 'handle']}
  235. isShowCollect={false}
  236. item={item}
  237. />
  238. <div class={styles.itemOperation}>
  239. <img
  240. src={iconDelete}
  241. class={styles.iconDelete}
  242. onClick={(e: MouseEvent) => {
  243. e.stopPropagation();
  244. onDelete(item);
  245. }}
  246. />
  247. </div>
  248. </div>
  249. );
  250. }
  251. }}
  252. </Draggable>
  253. ) : (
  254. <div class={styles.list}>
  255. {forms.coursewareList.map((item: any) => (
  256. <CardType
  257. class={[styles.itemContent, 'handle']}
  258. isShowCollect={false}
  259. item={item}
  260. />
  261. ))}
  262. </div>
  263. )}
  264. </>
  265. )}
  266. {!forms.loadingStatus &&
  267. prepareStore.getCoursewareList.length <= 0 && (
  268. <TheEmpty description="暂无课件" />
  269. )}
  270. </div>
  271. </NSpin>
  272. </NScrollbar>
  273. <NModal
  274. v-model:show={forms.showAttendClass}
  275. preset="card"
  276. showIcon={false}
  277. class={['modalTitle background', styles.attendClassModal]}
  278. title={'选择班级'}
  279. blockScroll={false}>
  280. <AttendClass onClose={() => (forms.showAttendClass = false)} />
  281. </NModal>
  282. </div>
  283. );
  284. }
  285. });