|
@@ -0,0 +1,693 @@
|
|
|
+import {
|
|
|
+ defineComponent,
|
|
|
+ nextTick,
|
|
|
+ onMounted,
|
|
|
+ onUnmounted,
|
|
|
+ reactive,
|
|
|
+ watch
|
|
|
+} from 'vue';
|
|
|
+import styles from './addCourseware.module.less';
|
|
|
+import {
|
|
|
+ NButton,
|
|
|
+ NModal,
|
|
|
+ NScrollbar,
|
|
|
+ NSelect,
|
|
|
+ NSpace,
|
|
|
+ NSpin,
|
|
|
+ useMessage,
|
|
|
+ useDialog,
|
|
|
+ NSwitch,
|
|
|
+ NInput,
|
|
|
+ NTooltip,
|
|
|
+ NImage,
|
|
|
+ NIcon
|
|
|
+} from 'naive-ui';
|
|
|
+import CardType from '/src/components/card-type';
|
|
|
+import AttendClass from '/src/views/prepare-lessons/model/attend-class';
|
|
|
+import { usePrepareStore } from '/src/store/modules/prepareLessons';
|
|
|
+import { useCatchStore } from '/src/store/modules/catchData';
|
|
|
+import TheEmpty from '/src/components/TheEmpty';
|
|
|
+import {
|
|
|
+ api_add,
|
|
|
+ courseScheduleStart,
|
|
|
+ queryCourseware,
|
|
|
+ saveCourseware,
|
|
|
+ teacherKnowledgeMaterialDelete
|
|
|
+} from '../../../api';
|
|
|
+import Draggable from 'vuedraggable';
|
|
|
+import iconDelete from '../../../images/icon-delete.png';
|
|
|
+import iconAddMusic from '../../../images/icon-add-music.png';
|
|
|
+import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router';
|
|
|
+import deepClone from '/src/helpers/deep-clone';
|
|
|
+import CardPreview from '/src/components/card-preview';
|
|
|
+import PreviewWindow from '/src/views/preview-window';
|
|
|
+import { state } from '/src/state';
|
|
|
+import SubjectSync from '../../../model/subject-sync';
|
|
|
+import { eventGlobal } from '/src/utils';
|
|
|
+import iconTips from '../../../images/icon-tips.png';
|
|
|
+import TheMessageDialog from '/src/components/TheMessageDialog';
|
|
|
+export default defineComponent({
|
|
|
+ name: 'courseware-modal',
|
|
|
+ emits: ['change'],
|
|
|
+ setup(props, { emit }) {
|
|
|
+ const catchStore = useCatchStore();
|
|
|
+ const prepareStore = usePrepareStore();
|
|
|
+ const route = useRoute();
|
|
|
+ const router = useRouter();
|
|
|
+ const dialog = useDialog();
|
|
|
+ const message = useMessage();
|
|
|
+
|
|
|
+ const forms = reactive({
|
|
|
+ subjects: [] as any,
|
|
|
+ name: '',
|
|
|
+ openFlag: false,
|
|
|
+ coursewareList: [
|
|
|
+ {
|
|
|
+ name: '',
|
|
|
+ list: [] as any
|
|
|
+ }
|
|
|
+ ] as any,
|
|
|
+ loadingStatus: false,
|
|
|
+ showAttendClass: false,
|
|
|
+ attendClassType: 'change', //
|
|
|
+ removeIds: [] as any, // 临时删除的编号
|
|
|
+ editSubjectIds: '', // 声部编号
|
|
|
+ removeVisiable: false,
|
|
|
+ addCoursewareItem: {} as any,
|
|
|
+ messageOperation: {
|
|
|
+ visiable: false,
|
|
|
+ type: 'delete' as 'delete' | 'addItem' | 'save',
|
|
|
+ contentDirection: 'center' as 'left' | 'center' | 'right',
|
|
|
+ title: '删除知识点',
|
|
|
+ content: '请确认是否删除该知识点,删除知识点后将同步删除知识点下的资源',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ index: 0
|
|
|
+ },
|
|
|
+ subjectSyncVisiable: false, // 同步声部
|
|
|
+ show: false,
|
|
|
+ item: {} as any,
|
|
|
+ previewModal: false,
|
|
|
+ previewParams: {
|
|
|
+ type: '',
|
|
|
+ subjectId: '',
|
|
|
+ detailId: ''
|
|
|
+ } as any
|
|
|
+ });
|
|
|
+
|
|
|
+ // 获取列表
|
|
|
+ const getList = async () => {
|
|
|
+ forms.loadingStatus = true;
|
|
|
+ try {
|
|
|
+ // const { data } = await queryCourseware({
|
|
|
+ // coursewareDetailKnowledgeId: prepareStore.getSelectKey,
|
|
|
+ // subjectId: prepareStore.getSubjectId,
|
|
|
+ // page: 1,
|
|
|
+ // rows: 99
|
|
|
+ // });
|
|
|
+ // const tempRows = data.rows || [];
|
|
|
+ // const temp: any = [];
|
|
|
+ // tempRows.forEach((row: any) => {
|
|
|
+ // temp.push({
|
|
|
+ // id: row.id,
|
|
|
+ // materialId: row.materialId,
|
|
|
+ // coverImg: row.coverImg,
|
|
|
+ // type: row.materialType,
|
|
|
+ // title: row.materialName,
|
|
|
+ // isCollect: !!row.favoriteFlag,
|
|
|
+ // isSelected: row.source === 'PLATFORM' ? true : false,
|
|
|
+ // content: row.content,
|
|
|
+ // removeFlag: row.removeFlag
|
|
|
+ // });
|
|
|
+ // });
|
|
|
+ // prepareStore.setCoursewareList(temp || []);
|
|
|
+ // const tempCourse: any = [];
|
|
|
+ // temp.forEach((item: any) => {
|
|
|
+ // if (!forms.removeIds.includes(item.id)) {
|
|
|
+ // tempCourse.push(item);
|
|
|
+ // }
|
|
|
+ // });
|
|
|
+ // forms.coursewareList = tempCourse;
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ forms.loadingStatus = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 删除
|
|
|
+ const onDelete = (item: any) => {
|
|
|
+ //
|
|
|
+ forms.removeIds.push(item.id);
|
|
|
+ const index = forms.coursewareList.findIndex(
|
|
|
+ (c: any) => c.id === item.id
|
|
|
+ );
|
|
|
+ forms.coursewareList.splice(index, 1);
|
|
|
+ };
|
|
|
+
|
|
|
+ // 完成编辑
|
|
|
+ const onOverEdit = async () => {
|
|
|
+ try {
|
|
|
+ const temp: any = [];
|
|
|
+ forms.coursewareList.forEach((item: any) => {
|
|
|
+ temp.push({
|
|
|
+ materialName: item.name,
|
|
|
+ materialType: item.type,
|
|
|
+ materialId: item.materialId,
|
|
|
+ id: item.id
|
|
|
+ });
|
|
|
+ });
|
|
|
+ // 保存课件
|
|
|
+ // 判断是否编辑,如果编辑则取选择的声部
|
|
|
+ await saveCourseware({
|
|
|
+ coursewareDetailKnowledgeId: prepareStore.getSelectKey,
|
|
|
+ lessonCoursewareId: prepareStore.getLessonCoursewareId,
|
|
|
+ lessonCoursewareDetailId: prepareStore.getLessonCoursewareDetailId,
|
|
|
+ // subjectId: forms.isEdit
|
|
|
+ // ? forms.editSubjectIds
|
|
|
+ // : prepareStore.getSubjectId,
|
|
|
+ materialList: [...temp]
|
|
|
+ });
|
|
|
+
|
|
|
+ message.success('编辑成功');
|
|
|
+ forms.removeVisiable = false;
|
|
|
+ prepareStore.setIsEditResource(false);
|
|
|
+ // 重置临时删除编号
|
|
|
+ forms.removeIds = [];
|
|
|
+ await getList();
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const isPointInsideElement = (element: any, x: number, y: number) => {
|
|
|
+ const rect = element.getBoundingClientRect();
|
|
|
+ return (
|
|
|
+ x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
|
|
|
+ );
|
|
|
+ };
|
|
|
+ const isPointOnLeft = (element: any, x: number) => {
|
|
|
+ const rect = element.getBoundingClientRect();
|
|
|
+ const elementCenterX = rect.left + rect.width / 2;
|
|
|
+ return x < elementCenterX;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 操作
|
|
|
+ const onChangePoint = (type: string, index: number) => {
|
|
|
+ if (type === 'up') {
|
|
|
+ //
|
|
|
+ } else if (type === 'down') {
|
|
|
+ //
|
|
|
+ } else if (type === 'remove') {
|
|
|
+ forms.messageOperation = {
|
|
|
+ visiable: true,
|
|
|
+ type: 'delete',
|
|
|
+ contentDirection: 'left',
|
|
|
+ title: '删除知识点',
|
|
|
+ content:
|
|
|
+ '请确认是否删除该知识点,删除知识点后将同步删除知识点下的资源',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ index
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ //
|
|
|
+ const onMessageConfirm = async () => {
|
|
|
+ const type = forms.messageOperation.type;
|
|
|
+ if (type === 'delete') {
|
|
|
+ forms.coursewareList.splice(forms.messageOperation.index, 1);
|
|
|
+ } else if (type === 'addItem') {
|
|
|
+ forms.coursewareList.push({ name: '', list: [] });
|
|
|
+ addCoursewareItem(forms.addCoursewareItem);
|
|
|
+ } else if (type === 'save') {
|
|
|
+ await onSaveCourseWare();
|
|
|
+ }
|
|
|
+ forms.messageOperation.visiable = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ const addCoursewareItem = (item: any, point?: any) => {
|
|
|
+ nextTick(() => {
|
|
|
+ if (point) {
|
|
|
+ const dom = document.querySelectorAll('.row-nav');
|
|
|
+ let isAdd = false;
|
|
|
+ dom.forEach((child: any, index: number) => {
|
|
|
+ const status = isPointInsideElement(child, point.x, point.y);
|
|
|
+ if (status) {
|
|
|
+ const array: any = forms.coursewareList;
|
|
|
+ const left = isPointOnLeft(child, point.x);
|
|
|
+ if (!left) {
|
|
|
+ array.splice(index + 1, 0, item);
|
|
|
+ } else {
|
|
|
+ array.splice(index, 0, item);
|
|
|
+ }
|
|
|
+ isAdd = true;
|
|
|
+ forms.coursewareList[item.index || 0].list = array;
|
|
|
+ prepareStore.setCoursewareList(forms.coursewareList);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (!isAdd) {
|
|
|
+ forms.coursewareList[item.index || 0].list.push(item);
|
|
|
+ prepareStore.setCoursewareList(forms.coursewareList);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ forms.coursewareList[0].list.push(item);
|
|
|
+ console.log(forms.coursewareList);
|
|
|
+ prepareStore.setCoursewareList(forms.coursewareList);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ // 提交
|
|
|
+ const onSubmit = async () => {
|
|
|
+ try {
|
|
|
+ if (!forms.name) {
|
|
|
+ message.error('请输入课件标题');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (forms.subjects.length <= 0) {
|
|
|
+ message.error('请选择声部');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ let isNotAdd = false;
|
|
|
+ for (const item of forms.coursewareList) {
|
|
|
+ if (!item.name) {
|
|
|
+ message.error('请输入知识点名称');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (Array.isArray(item.list) && item.list.length <= 0) {
|
|
|
+ isNotAdd = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isNotAdd) {
|
|
|
+ message.error('请至少添加一个资源');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ forms.messageOperation = {
|
|
|
+ visiable: true,
|
|
|
+ type: 'save',
|
|
|
+ contentDirection: 'center',
|
|
|
+ title: '保存课件',
|
|
|
+ content: '当前课件暂未保存,是否保存?',
|
|
|
+ cancelButtonText: '不保存',
|
|
|
+ confirmButtonText: '保存',
|
|
|
+ index: 0
|
|
|
+ };
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let isLock = false;
|
|
|
+ const onSaveCourseWare = async () => {
|
|
|
+ try {
|
|
|
+ if (isLock) return;
|
|
|
+ isLock = true;
|
|
|
+ const params = {
|
|
|
+ name: forms.name,
|
|
|
+ subjectIds: forms.subjects.join(','),
|
|
|
+ openFlag: forms.openFlag,
|
|
|
+ coursewareDetailKnowledgeId: prepareStore.getSelectKey,
|
|
|
+ chapterKnowledgeList: [] as any
|
|
|
+ };
|
|
|
+
|
|
|
+ forms.coursewareList.forEach((item: any) => {
|
|
|
+ let tempItem: any = [];
|
|
|
+ if (Array.isArray(item.list) && item.list.length > 0) {
|
|
|
+ tempItem = item.list.map((child: any) => {
|
|
|
+ return {
|
|
|
+ bizId: child.materialId,
|
|
|
+ type: child.type,
|
|
|
+ dataJson: ''
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ params.chapterKnowledgeList.push({
|
|
|
+ name: item.name,
|
|
|
+ chapterKnowledgeMaterialList: tempItem
|
|
|
+ });
|
|
|
+ });
|
|
|
+ await api_add(params);
|
|
|
+ message.success('添加成功');
|
|
|
+ emit('change', { status: false });
|
|
|
+ eventGlobal.emit('teacher-slideshow', false);
|
|
|
+ setTimeout(() => {
|
|
|
+ isLock = false;
|
|
|
+ }, 100);
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const addItem = (item: any, point?: any) => {
|
|
|
+ if (forms.coursewareList.length <= 0) {
|
|
|
+ // 添加到临时对象
|
|
|
+ forms.addCoursewareItem = item;
|
|
|
+ forms.messageOperation = {
|
|
|
+ visiable: true,
|
|
|
+ type: 'addItem',
|
|
|
+ contentDirection: 'center',
|
|
|
+ title: '添加到知识点',
|
|
|
+ content: '当前课件暂无知识点,请添加知识点后操作',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ confirmButtonText: '添加知识点',
|
|
|
+ index: 0
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ addCoursewareItem(item, point);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ onMounted(async () => {
|
|
|
+ await getList();
|
|
|
+
|
|
|
+ // 动态添加数据
|
|
|
+ eventGlobal.on('onPrepareAddItem', addItem);
|
|
|
+ });
|
|
|
+
|
|
|
+ onUnmounted(() => {
|
|
|
+ eventGlobal.off('onPrepareAddItem', addItem);
|
|
|
+ });
|
|
|
+
|
|
|
+ return () => (
|
|
|
+ <div class={styles.coursewareModal}>
|
|
|
+ <div class={styles.btnGroup}>
|
|
|
+ <NSpace>
|
|
|
+ <div class={styles.btnItem}>
|
|
|
+ <span class={styles.btnTitle}>
|
|
|
+ <span>*</span>标题:
|
|
|
+ </span>
|
|
|
+ <NInput placeholder="请输入课件标题" v-model:value={forms.name} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.btnItem}>
|
|
|
+ <span class={styles.btnTitle}>
|
|
|
+ <span>*</span>声部:
|
|
|
+ </span>
|
|
|
+ <NSelect
|
|
|
+ placeholder="请选择声部(可多选)"
|
|
|
+ class={styles.btnSubjectList}
|
|
|
+ options={prepareStore.getSubjectList}
|
|
|
+ labelField="name"
|
|
|
+ valueField="id"
|
|
|
+ multiple
|
|
|
+ maxTagCount={1}
|
|
|
+ size="small"
|
|
|
+ v-model:value={forms.subjects}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class={styles.btnItem}>
|
|
|
+ <span class={styles.btnTitle}>公开:</span>
|
|
|
+ <NSwitch v-model:value={forms.openFlag} />
|
|
|
+ </div>
|
|
|
+ </NSpace>
|
|
|
+
|
|
|
+ {/* 编辑 */}
|
|
|
+ <NSpace>
|
|
|
+ <NButton
|
|
|
+ type="error"
|
|
|
+ onClick={() => {
|
|
|
+ emit('change', { status: false });
|
|
|
+ eventGlobal.emit('teacher-slideshow', false);
|
|
|
+ }}>
|
|
|
+ 取消
|
|
|
+ </NButton>
|
|
|
+ <NButton type="primary" onClick={onSubmit}>
|
|
|
+ 保存课件
|
|
|
+ </NButton>
|
|
|
+ </NSpace>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <NScrollbar class={[styles.listContainer]} {...{ id: 'lessons-2' }}>
|
|
|
+ <NSpin show={forms.loadingStatus}>
|
|
|
+ <div class={[styles.listSection]}>
|
|
|
+ {forms.coursewareList.map((item: any, index: number) => (
|
|
|
+ <div
|
|
|
+ class={styles.listItems}
|
|
|
+ onDragenter={(e: any) => {
|
|
|
+ e.preventDefault();
|
|
|
+ }}
|
|
|
+ onDragover={(e: any) => {
|
|
|
+ e.preventDefault();
|
|
|
+ }}
|
|
|
+ onDrop={(e: any) => {
|
|
|
+ let dropItem = e.dataTransfer.getData('text');
|
|
|
+ dropItem = dropItem ? JSON.parse(dropItem) : {};
|
|
|
+ // 判断是否有数据
|
|
|
+ if (dropItem.id) {
|
|
|
+ // 获取拖拽的目标元素
|
|
|
+ eventGlobal.emit(
|
|
|
+ 'onPrepareAddItem',
|
|
|
+ {
|
|
|
+ materialId: dropItem.id,
|
|
|
+ coverImg: dropItem.coverImg,
|
|
|
+ type: dropItem.type,
|
|
|
+ title: dropItem.name,
|
|
|
+ isCollect: dropItem.isCollect,
|
|
|
+ isSelected: dropItem.isSelected,
|
|
|
+ content: dropItem.content,
|
|
|
+ removeFlag: false,
|
|
|
+ index
|
|
|
+ },
|
|
|
+ {
|
|
|
+ x: e.clientX,
|
|
|
+ y: e.clientY
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }}>
|
|
|
+ <div class={styles.knowledgePoint}>
|
|
|
+ <div class={styles.btnItem}>
|
|
|
+ <span class={styles.btnTitle}>
|
|
|
+ <span>*</span>知识点名称:
|
|
|
+ </span>
|
|
|
+ <NInput
|
|
|
+ placeholder="未命名知识点"
|
|
|
+ v-model:value={item.name}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <NSpace class={styles.operationGroup}>
|
|
|
+ {index > 0 && (
|
|
|
+ <NTooltip>
|
|
|
+ {{
|
|
|
+ trigger: () => (
|
|
|
+ <i
|
|
|
+ class={styles.iconCUp}
|
|
|
+ onClick={() => onChangePoint('up', index)}></i>
|
|
|
+ ),
|
|
|
+ default: '上移知识点'
|
|
|
+ }}
|
|
|
+ </NTooltip>
|
|
|
+ )}
|
|
|
+ {forms.coursewareList.length > 1 && (
|
|
|
+ <NTooltip>
|
|
|
+ {{
|
|
|
+ trigger: () => (
|
|
|
+ <i
|
|
|
+ class={styles.iconCDown}
|
|
|
+ onClick={() => onChangePoint('down', index)}></i>
|
|
|
+ ),
|
|
|
+ default: '下移知识点'
|
|
|
+ }}
|
|
|
+ </NTooltip>
|
|
|
+ )}
|
|
|
+ <NTooltip>
|
|
|
+ {{
|
|
|
+ trigger: () => (
|
|
|
+ <i
|
|
|
+ class={styles.iconCRemove}
|
|
|
+ onClick={() => onChangePoint('remove', index)}></i>
|
|
|
+ ),
|
|
|
+ default: '删除知识点'
|
|
|
+ }}
|
|
|
+ </NTooltip>
|
|
|
+ </NSpace>
|
|
|
+
|
|
|
+ {item.list.length > 0 && (
|
|
|
+ <Draggable
|
|
|
+ v-model:modelValue={item.list}
|
|
|
+ itemKey="id"
|
|
|
+ componentData={{
|
|
|
+ itemKey: 'id',
|
|
|
+ tag: 'div',
|
|
|
+ animation: 200,
|
|
|
+ group: 'description',
|
|
|
+ disabled: false
|
|
|
+ }}
|
|
|
+ class={styles.list}>
|
|
|
+ {{
|
|
|
+ item: (element: any) => {
|
|
|
+ const item = element.element;
|
|
|
+ return (
|
|
|
+ <div
|
|
|
+ data-id={item.id}
|
|
|
+ class={[
|
|
|
+ styles.itemWrap,
|
|
|
+ styles.itemBlock,
|
|
|
+ 'row-nav'
|
|
|
+ ]}>
|
|
|
+ <div class={styles.itemWrapBox}>
|
|
|
+ <CardType
|
|
|
+ class={[styles.itemContent]}
|
|
|
+ isShowCollect={false}
|
|
|
+ offShelf={item.removeFlag ? true : false}
|
|
|
+ // onOffShelf={() => onRemove(item)}
|
|
|
+ item={item}
|
|
|
+ />
|
|
|
+ <div class={styles.itemOperation}>
|
|
|
+ <img
|
|
|
+ src={iconDelete}
|
|
|
+ class={styles.iconDelete}
|
|
|
+ onClick={(e: MouseEvent) => {
|
|
|
+ e.stopPropagation();
|
|
|
+ onDelete(item);
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ },
|
|
|
+ footer: () => (
|
|
|
+ <div class={styles.itemWrap}>
|
|
|
+ <div class={styles.itemWrapBox}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.itemContent,
|
|
|
+ styles.addMusicItem,
|
|
|
+ 'handle'
|
|
|
+ ]}
|
|
|
+ onClick={() => {
|
|
|
+ // 直接跳转到制谱页面 (临时存储数据)
|
|
|
+ sessionStorage.setItem(
|
|
|
+ 'notation-open-create',
|
|
|
+ '1'
|
|
|
+ );
|
|
|
+ router.push('/notation');
|
|
|
+ }}>
|
|
|
+ <img src={iconAddMusic} />
|
|
|
+
|
|
|
+ <p class={styles.addMusicName}>添加功能</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Draggable>
|
|
|
+ )}
|
|
|
+ {item.list <= 0 && (
|
|
|
+ <div class={styles.list}>
|
|
|
+ <div class={styles.itemWrap}>
|
|
|
+ <div class={styles.itemWrapBox}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.itemContent,
|
|
|
+ styles.addMusicItem,
|
|
|
+ 'handle'
|
|
|
+ ]}
|
|
|
+ onClick={() => {
|
|
|
+ // 直接跳转到制谱页面 (临时存储数据)
|
|
|
+ sessionStorage.setItem(
|
|
|
+ 'notation-open-create',
|
|
|
+ '1'
|
|
|
+ );
|
|
|
+ router.push('/notation');
|
|
|
+ }}>
|
|
|
+ <img src={iconAddMusic} />
|
|
|
+
|
|
|
+ <p class={styles.addMusicName}>添加功能</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+
|
|
|
+ <NButton
|
|
|
+ block
|
|
|
+ type="primary"
|
|
|
+ secondary
|
|
|
+ class={styles.addKnowledgePoint}
|
|
|
+ onClick={() => {
|
|
|
+ forms.coursewareList.push({
|
|
|
+ name: '',
|
|
|
+ list: []
|
|
|
+ });
|
|
|
+ }}>
|
|
|
+ <i class={styles.iconCAdd}></i>
|
|
|
+ 添加知识点
|
|
|
+ </NButton>
|
|
|
+ </div>
|
|
|
+ </NSpin>
|
|
|
+ </NScrollbar>
|
|
|
+
|
|
|
+ {/* 弹窗查看 */}
|
|
|
+ <CardPreview v-model:show={forms.show} item={forms.item} />
|
|
|
+
|
|
|
+ <NModal
|
|
|
+ v-model:show={forms.removeVisiable}
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle', styles.removeVisiable]}
|
|
|
+ title={'提示'}>
|
|
|
+ <div class={styles.studentRemove}>
|
|
|
+ <p>是否完成编辑?</p>
|
|
|
+
|
|
|
+ <NSpace class={styles.btnGroupModal} justify="center">
|
|
|
+ <NButton round type="primary" onClick={onOverEdit}>
|
|
|
+ 确定
|
|
|
+ </NButton>
|
|
|
+ <NButton round onClick={() => (forms.removeVisiable = false)}>
|
|
|
+ 取消
|
|
|
+ </NButton>
|
|
|
+ </NSpace>
|
|
|
+ </div>
|
|
|
+ </NModal>
|
|
|
+
|
|
|
+ <NModal
|
|
|
+ v-model:show={forms.messageOperation.visiable}
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle', styles.removeVisiable1]}
|
|
|
+ title={forms.messageOperation.title}>
|
|
|
+ <TheMessageDialog
|
|
|
+ content={forms.messageOperation.content}
|
|
|
+ contentDirection={forms.messageOperation.contentDirection}
|
|
|
+ cancelButtonText={forms.messageOperation.cancelButtonText}
|
|
|
+ confirmButtonText={forms.messageOperation.confirmButtonText}
|
|
|
+ onClose={() => (forms.messageOperation.visiable = false)}
|
|
|
+ onConfirm={() => onMessageConfirm()}
|
|
|
+ />
|
|
|
+ </NModal>
|
|
|
+
|
|
|
+ <PreviewWindow
|
|
|
+ v-model:show={forms.previewModal}
|
|
|
+ type="attend"
|
|
|
+ params={forms.previewParams}
|
|
|
+ />
|
|
|
+
|
|
|
+ {/* 完成编辑时,选择声部 */}
|
|
|
+ <NModal
|
|
|
+ v-model:show={forms.subjectSyncVisiable}
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle background', styles.subjectSyncModal]}
|
|
|
+ title={'同步声部'}>
|
|
|
+ <SubjectSync
|
|
|
+ subjectId={prepareStore.getSubjectId as any}
|
|
|
+ onClose={() => (forms.subjectSyncVisiable = false)}
|
|
|
+ onConfirm={async (subjectIds: any) => {
|
|
|
+ //
|
|
|
+ try {
|
|
|
+ forms.editSubjectIds = subjectIds.join(',');
|
|
|
+ await onOverEdit();
|
|
|
+ forms.subjectSyncVisiable = false;
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </NModal>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+});
|