|  | @@ -1,467 +1,471 @@
 | 
	
		
			
				|  |  | -import {
 | 
	
		
			
				|  |  | -  NButton,
 | 
	
		
			
				|  |  | -  NCascader,
 | 
	
		
			
				|  |  | -  NForm,
 | 
	
		
			
				|  |  | -  NFormItem,
 | 
	
		
			
				|  |  | -  NInput,
 | 
	
		
			
				|  |  | -  NScrollbar,
 | 
	
		
			
				|  |  | -  NSelect,
 | 
	
		
			
				|  |  | -  NSpace,
 | 
	
		
			
				|  |  | -  useMessage
 | 
	
		
			
				|  |  | -} from 'naive-ui';
 | 
	
		
			
				|  |  | -import {
 | 
	
		
			
				|  |  | -  TransitionGroup,
 | 
	
		
			
				|  |  | -  defineComponent,
 | 
	
		
			
				|  |  | -  onMounted,
 | 
	
		
			
				|  |  | -  reactive,
 | 
	
		
			
				|  |  | -  ref
 | 
	
		
			
				|  |  | -} from 'vue';
 | 
	
		
			
				|  |  | -import styles from './index.module.less';
 | 
	
		
			
				|  |  | -import UploadFile from '@/components/upload-file';
 | 
	
		
			
				|  |  | -import { nextTick } from 'vue';
 | 
	
		
			
				|  |  | -import { scrollToErrorForm } from '@/utils';
 | 
	
		
			
				|  |  | -import { api_lessonCoursewareSave } from '../../api';
 | 
	
		
			
				|  |  | -import iconUpload from '../../images/icon-upload.png';
 | 
	
		
			
				|  |  | -import iconUpload2 from '../../images/icon-upload2.png';
 | 
	
		
			
				|  |  | -import iconAdd from '../../images/icon-add.png';
 | 
	
		
			
				|  |  | -import iconMenu from '../../images/icon-menu.png';
 | 
	
		
			
				|  |  | -import btnAdd from '../../images/btn-add.png';
 | 
	
		
			
				|  |  | -import btnDelete from '../../images/btn-delete.png';
 | 
	
		
			
				|  |  | -import btnUp from '../../images/btn-up.png';
 | 
	
		
			
				|  |  | -import btnDown from '../../images/btn-down.png';
 | 
	
		
			
				|  |  | -import btnRemove from '../../images/btn-remove.png';
 | 
	
		
			
				|  |  | -import { lessonCoursewareDetail } from '/src/views/prepare-lessons/api';
 | 
	
		
			
				|  |  | -import { useCatchStore } from '/src/store/modules/catchData';
 | 
	
		
			
				|  |  | -export const BOOK_DATA = {
 | 
	
		
			
				|  |  | -  grades: [
 | 
	
		
			
				|  |  | -    { label: '一年级', value: 1 },
 | 
	
		
			
				|  |  | -    { label: '二年级', value: 2 },
 | 
	
		
			
				|  |  | -    { label: '三年级', value: 3 },
 | 
	
		
			
				|  |  | -    { label: '四年级', value: 4 },
 | 
	
		
			
				|  |  | -    { label: '五年级', value: 5 },
 | 
	
		
			
				|  |  | -    { label: '六年级', value: 6 },
 | 
	
		
			
				|  |  | -    { label: '七年级', value: 7 },
 | 
	
		
			
				|  |  | -    { label: '八年级', value: 8 },
 | 
	
		
			
				|  |  | -    { label: '九年级', value: 9 }
 | 
	
		
			
				|  |  | -  ],
 | 
	
		
			
				|  |  | -  bookTypes: [
 | 
	
		
			
				|  |  | -    { label: '上册', value: 'LAST' },
 | 
	
		
			
				|  |  | -    { label: '下册', value: 'NEXT' }
 | 
	
		
			
				|  |  | -  ]
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/** 添加单元 */
 | 
	
		
			
				|  |  | -const createLesson = () => {
 | 
	
		
			
				|  |  | -  return {
 | 
	
		
			
				|  |  | -    key: 'item' + Date.now(),
 | 
	
		
			
				|  |  | -    name: '', // 单元名称
 | 
	
		
			
				|  |  | -    lessonTargetDesc: '', // 课时目标描述
 | 
	
		
			
				|  |  | -    knowledgeList: [
 | 
	
		
			
				|  |  | -      {
 | 
	
		
			
				|  |  | -        key: Date.now() + '' + 0,
 | 
	
		
			
				|  |  | -        name: '' // 章节名称
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    ] // 章节信息
 | 
	
		
			
				|  |  | -  };
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -const initState = () => ({
 | 
	
		
			
				|  |  | -  id: null, // 教材id
 | 
	
		
			
				|  |  | -  name: '',
 | 
	
		
			
				|  |  | -  currentGradeNum: null as any,
 | 
	
		
			
				|  |  | -  instrumentIds: null as any,
 | 
	
		
			
				|  |  | -  // bookType: null, // 上下册
 | 
	
		
			
				|  |  | -  coverImg: '', // 封面
 | 
	
		
			
				|  |  | -  instruemntIds: [] as any,
 | 
	
		
			
				|  |  | -  enableFlag: true, // 状态
 | 
	
		
			
				|  |  | -  type: 'COURSEWARE', // 教材类型:COURSEWARE,THEORY,可用值:COURSEWARE,THEORY
 | 
	
		
			
				|  |  | -  lessonList: [createLesson()] // 单元列表
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -export default defineComponent({
 | 
	
		
			
				|  |  | -  name: 'addNatural',
 | 
	
		
			
				|  |  | -  props: {
 | 
	
		
			
				|  |  | -    item: {
 | 
	
		
			
				|  |  | -      type: Object,
 | 
	
		
			
				|  |  | -      default: () => ({})
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  emits: ['close', 'confirm'],
 | 
	
		
			
				|  |  | -  setup(props, { emit }) {
 | 
	
		
			
				|  |  | -    const catchStore = useCatchStore();
 | 
	
		
			
				|  |  | -    const message = useMessage();
 | 
	
		
			
				|  |  | -    const data = reactive({
 | 
	
		
			
				|  |  | -      uploading: false,
 | 
	
		
			
				|  |  | -      subjectList: [] as any
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    const formRef = ref();
 | 
	
		
			
				|  |  | -    const form = reactive(initState());
 | 
	
		
			
				|  |  | -    const handleSave = () => {
 | 
	
		
			
				|  |  | -      formRef.value?.validate((err: any) => {
 | 
	
		
			
				|  |  | -        if (err) {
 | 
	
		
			
				|  |  | -          nextTick(scrollToErrorForm);
 | 
	
		
			
				|  |  | -          return;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        handleSubmit();
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    const handleSubmit = async () => {
 | 
	
		
			
				|  |  | -      data.uploading = true;
 | 
	
		
			
				|  |  | -      try {
 | 
	
		
			
				|  |  | -        const { currentGradeNum, instrumentIds, ...more } = form;
 | 
	
		
			
				|  |  | -        await api_lessonCoursewareSave({
 | 
	
		
			
				|  |  | -          currentGradeNum: currentGradeNum.join(','),
 | 
	
		
			
				|  |  | -          instrumentIds: instrumentIds.join(','),
 | 
	
		
			
				|  |  | -          ...more
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -        Object.assign(form, initState());
 | 
	
		
			
				|  |  | -        message.success(props.item.id ? '保存成功' : '添加成功');
 | 
	
		
			
				|  |  | -        emit('close', true);
 | 
	
		
			
				|  |  | -        emit('confirm');
 | 
	
		
			
				|  |  | -      } catch {
 | 
	
		
			
				|  |  | -        //
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      data.uploading = false;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    onMounted(async () => {
 | 
	
		
			
				|  |  | -      await catchStore.getSubjects();
 | 
	
		
			
				|  |  | -      if (props.item.id) {
 | 
	
		
			
				|  |  | -        const { data } = await lessonCoursewareDetail({ id: props.item.id });
 | 
	
		
			
				|  |  | -        form.id = data.id;
 | 
	
		
			
				|  |  | -        form.name = data.name;
 | 
	
		
			
				|  |  | -        form.currentGradeNum = data.currentGradeNum
 | 
	
		
			
				|  |  | -          ? data.currentGradeNum.split(',').map((item: any) => Number(item))
 | 
	
		
			
				|  |  | -          : null;
 | 
	
		
			
				|  |  | -        form.instrumentIds = data.instrumentIds
 | 
	
		
			
				|  |  | -          ? data.instrumentIds.split(',').map((item: any) => item)
 | 
	
		
			
				|  |  | -          : null;
 | 
	
		
			
				|  |  | -        // form.bookType = data.bookType;
 | 
	
		
			
				|  |  | -        form.coverImg = data.coverImg;
 | 
	
		
			
				|  |  | -        form.lessonList = [];
 | 
	
		
			
				|  |  | -        const lessonList = data.lessonList || [];
 | 
	
		
			
				|  |  | -        const tempLesson: any[] = [];
 | 
	
		
			
				|  |  | -        lessonList.forEach((item: any) => {
 | 
	
		
			
				|  |  | -          const tmpItem: any = {
 | 
	
		
			
				|  |  | -            id: item.id,
 | 
	
		
			
				|  |  | -            key: 'item' + Date.now() + '-' + Math.random() * 100,
 | 
	
		
			
				|  |  | -            name: item.name,
 | 
	
		
			
				|  |  | -            lessonTargetDesc: item.lessonTargetDesc,
 | 
	
		
			
				|  |  | -            knowledgeList: [] as any
 | 
	
		
			
				|  |  | -          };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          if (item.knowledgeList && item.knowledgeList.length) {
 | 
	
		
			
				|  |  | -            item.knowledgeList.forEach((knowledge: any) => {
 | 
	
		
			
				|  |  | -              tmpItem.knowledgeList.push({
 | 
	
		
			
				|  |  | -                id: knowledge.id,
 | 
	
		
			
				|  |  | -                key: Date.now() + '-' + Math.random() * 100,
 | 
	
		
			
				|  |  | -                name: knowledge.name
 | 
	
		
			
				|  |  | -              });
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          tempLesson.push(tmpItem);
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        form.lessonList = tempLesson;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      data.subjectList = catchStore.getEnableSingleAllSubjects(
 | 
	
		
			
				|  |  | -        form.instrumentIds
 | 
	
		
			
				|  |  | -      );
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    return () => (
 | 
	
		
			
				|  |  | -      <div class={styles.container}>
 | 
	
		
			
				|  |  | -        <NScrollbar style={{ 'max-height': '65vh' }}>
 | 
	
		
			
				|  |  | -          <NForm
 | 
	
		
			
				|  |  | -            ref={formRef}
 | 
	
		
			
				|  |  | -            labelPlacement="left"
 | 
	
		
			
				|  |  | -            labelWidth={120}
 | 
	
		
			
				|  |  | -            model={form}>
 | 
	
		
			
				|  |  | -            <div class={styles.topForms}>
 | 
	
		
			
				|  |  | -              <NFormItem
 | 
	
		
			
				|  |  | -                path="coverImg"
 | 
	
		
			
				|  |  | -                rule={[
 | 
	
		
			
				|  |  | -                  {
 | 
	
		
			
				|  |  | -                    required: true,
 | 
	
		
			
				|  |  | -                    message: '请上传教材封面',
 | 
	
		
			
				|  |  | -                    trigger: ['change']
 | 
	
		
			
				|  |  | -                  }
 | 
	
		
			
				|  |  | -                ]}>
 | 
	
		
			
				|  |  | -                <UploadFile
 | 
	
		
			
				|  |  | -                  cropper
 | 
	
		
			
				|  |  | -                  // tips="建议尺寸:210*297, 文件大小: 5MB以内;"
 | 
	
		
			
				|  |  | -                  v-model:fileList={form.coverImg}
 | 
	
		
			
				|  |  | -                  showType="custom"
 | 
	
		
			
				|  |  | -                  size={2}
 | 
	
		
			
				|  |  | -                  accept=".jpg,jpeg,.png"
 | 
	
		
			
				|  |  | -                  options={{
 | 
	
		
			
				|  |  | -                    autoCropWidth: 210,
 | 
	
		
			
				|  |  | -                    autoCropHeight: 297,
 | 
	
		
			
				|  |  | -                    fixedBox: true
 | 
	
		
			
				|  |  | -                  }}>
 | 
	
		
			
				|  |  | -                  {{
 | 
	
		
			
				|  |  | -                    custom: () => (
 | 
	
		
			
				|  |  | -                      <div class={styles.uploadContent}>
 | 
	
		
			
				|  |  | -                        <img src={iconUpload2} class={styles.iconUpload} />
 | 
	
		
			
				|  |  | -                        <p>请上传教材封面</p>
 | 
	
		
			
				|  |  | -                      </div>
 | 
	
		
			
				|  |  | -                    )
 | 
	
		
			
				|  |  | -                  }}
 | 
	
		
			
				|  |  | -                </UploadFile>
 | 
	
		
			
				|  |  | -              </NFormItem>
 | 
	
		
			
				|  |  | -              <div class={styles.topFormInput}>
 | 
	
		
			
				|  |  | -                <NFormItem
 | 
	
		
			
				|  |  | -                  style={{ minWidth: '360px' }}
 | 
	
		
			
				|  |  | -                  path="name"
 | 
	
		
			
				|  |  | -                  rule={[
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                      required: true,
 | 
	
		
			
				|  |  | -                      message: '请输入教材名称',
 | 
	
		
			
				|  |  | -                      trigger: ['blur', 'change']
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                  ]}>
 | 
	
		
			
				|  |  | -                  <NInput
 | 
	
		
			
				|  |  | -                    placeholder="请输入教材名称"
 | 
	
		
			
				|  |  | -                    maxlength={25}
 | 
	
		
			
				|  |  | -                    v-model:value={form.name}
 | 
	
		
			
				|  |  | -                    clearable></NInput>
 | 
	
		
			
				|  |  | -                </NFormItem>
 | 
	
		
			
				|  |  | -                <NFormItem
 | 
	
		
			
				|  |  | -                  path="currentGradeNum"
 | 
	
		
			
				|  |  | -                  rule={{
 | 
	
		
			
				|  |  | -                    required: true,
 | 
	
		
			
				|  |  | -                    message: '请选择年级',
 | 
	
		
			
				|  |  | -                    trigger: 'change',
 | 
	
		
			
				|  |  | -                    type: 'array'
 | 
	
		
			
				|  |  | -                  }}>
 | 
	
		
			
				|  |  | -                  <NSelect
 | 
	
		
			
				|  |  | -                    style={{ minWidth: '360px' }}
 | 
	
		
			
				|  |  | -                    placeholder="请选择年级"
 | 
	
		
			
				|  |  | -                    options={BOOK_DATA.grades}
 | 
	
		
			
				|  |  | -                    v-model:value={form.currentGradeNum}
 | 
	
		
			
				|  |  | -                    clearable
 | 
	
		
			
				|  |  | -                    multiple
 | 
	
		
			
				|  |  | -                    filterable
 | 
	
		
			
				|  |  | -                    maxTagCount={3}
 | 
	
		
			
				|  |  | -                  />
 | 
	
		
			
				|  |  | -                </NFormItem>
 | 
	
		
			
				|  |  | -                <NFormItem
 | 
	
		
			
				|  |  | -                  path="instrumentIds"
 | 
	
		
			
				|  |  | -                  style={{ width: '360px' }}
 | 
	
		
			
				|  |  | -                  rule={{
 | 
	
		
			
				|  |  | -                    required: true,
 | 
	
		
			
				|  |  | -                    message: '请选择乐器',
 | 
	
		
			
				|  |  | -                    trigger: 'change',
 | 
	
		
			
				|  |  | -                    type: 'array'
 | 
	
		
			
				|  |  | -                  }}>
 | 
	
		
			
				|  |  | -                  <NCascader
 | 
	
		
			
				|  |  | -                    placeholder="请选择乐器"
 | 
	
		
			
				|  |  | -                    options={data.subjectList}
 | 
	
		
			
				|  |  | -                    v-model:value={form.instrumentIds}
 | 
	
		
			
				|  |  | -                    checkStrategy="child"
 | 
	
		
			
				|  |  | -                    showPath={false}
 | 
	
		
			
				|  |  | -                    childrenField="instruments"
 | 
	
		
			
				|  |  | -                    expandTrigger="hover"
 | 
	
		
			
				|  |  | -                    labelField="name"
 | 
	
		
			
				|  |  | -                    valueField="id"
 | 
	
		
			
				|  |  | -                    clearable
 | 
	
		
			
				|  |  | -                    filterable
 | 
	
		
			
				|  |  | -                    multiple
 | 
	
		
			
				|  |  | -                    maxTagCount="responsive"
 | 
	
		
			
				|  |  | -                    style={{ width: '400px' }}
 | 
	
		
			
				|  |  | -                  />
 | 
	
		
			
				|  |  | -                </NFormItem>
 | 
	
		
			
				|  |  | -                {/* <NFormItem
 | 
	
		
			
				|  |  | -                  path="bookType"
 | 
	
		
			
				|  |  | -                  style={{ width: '360px' }}
 | 
	
		
			
				|  |  | -                  rule={{
 | 
	
		
			
				|  |  | -                    required: true,
 | 
	
		
			
				|  |  | -                    message: '请选择册别',
 | 
	
		
			
				|  |  | -                    trigger: 'change'
 | 
	
		
			
				|  |  | -                  }}>
 | 
	
		
			
				|  |  | -                  <NSelect
 | 
	
		
			
				|  |  | -                    placeholder="请选择册别"
 | 
	
		
			
				|  |  | -                    options={BOOK_DATA.bookTypes}
 | 
	
		
			
				|  |  | -                    v-model:value={form.bookType}
 | 
	
		
			
				|  |  | -                    clearable
 | 
	
		
			
				|  |  | -                  />
 | 
	
		
			
				|  |  | -                </NFormItem> */}
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -            </div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            <div class={styles.menuTitle}>
 | 
	
		
			
				|  |  | -              <img src={iconMenu} class={styles.iconMenu} />
 | 
	
		
			
				|  |  | -              目录
 | 
	
		
			
				|  |  | -            </div>
 | 
	
		
			
				|  |  | -            <TransitionGroup name="list" tag="div">
 | 
	
		
			
				|  |  | -              {form.lessonList.map((item, index) => {
 | 
	
		
			
				|  |  | -                return (
 | 
	
		
			
				|  |  | -                  <NSpace
 | 
	
		
			
				|  |  | -                    class={styles.lessonItem}
 | 
	
		
			
				|  |  | -                    wrap={false}
 | 
	
		
			
				|  |  | -                    wrapItem={false}
 | 
	
		
			
				|  |  | -                    align="start"
 | 
	
		
			
				|  |  | -                    key={item.key}>
 | 
	
		
			
				|  |  | -                    <NFormItem
 | 
	
		
			
				|  |  | -                      label="单元名称"
 | 
	
		
			
				|  |  | -                      labelPlacement="top"
 | 
	
		
			
				|  |  | -                      path={`lessonList[${index}].name`}
 | 
	
		
			
				|  |  | -                      rule={{
 | 
	
		
			
				|  |  | -                        required: true,
 | 
	
		
			
				|  |  | -                        message: '填写单元名称',
 | 
	
		
			
				|  |  | -                        trigger: ['blur', 'change']
 | 
	
		
			
				|  |  | -                      }}>
 | 
	
		
			
				|  |  | -                      <NInput
 | 
	
		
			
				|  |  | -                        placeholder="填写单元名称"
 | 
	
		
			
				|  |  | -                        maxlength={25}
 | 
	
		
			
				|  |  | -                        v-model:value={item.name}
 | 
	
		
			
				|  |  | -                        clearable></NInput>
 | 
	
		
			
				|  |  | -                    </NFormItem>
 | 
	
		
			
				|  |  | -                    <TransitionGroup name="list" tag="div">
 | 
	
		
			
				|  |  | -                      {item.knowledgeList.map((know, knowIndex) => {
 | 
	
		
			
				|  |  | -                        return (
 | 
	
		
			
				|  |  | -                          <NFormItem
 | 
	
		
			
				|  |  | -                            style={{
 | 
	
		
			
				|  |  | -                              '--n-label-height': knowIndex === 0 ? '26px' : '0'
 | 
	
		
			
				|  |  | -                            }}
 | 
	
		
			
				|  |  | -                            labelPlacement="top"
 | 
	
		
			
				|  |  | -                            label={knowIndex === 0 ? '章节名称' : ''}
 | 
	
		
			
				|  |  | -                            key={know.key}
 | 
	
		
			
				|  |  | -                            path={`lessonList[${index}].knowledgeList[${knowIndex}].name`}
 | 
	
		
			
				|  |  | -                            rule={{
 | 
	
		
			
				|  |  | -                              required: true,
 | 
	
		
			
				|  |  | -                              message: '填写章节名称',
 | 
	
		
			
				|  |  | -                              trigger: ['blur', 'change']
 | 
	
		
			
				|  |  | -                            }}>
 | 
	
		
			
				|  |  | -                            <NSpace
 | 
	
		
			
				|  |  | -                              wrap={false}
 | 
	
		
			
				|  |  | -                              align="center"
 | 
	
		
			
				|  |  | -                              class={styles.btnGroupAll}
 | 
	
		
			
				|  |  | -                              wrapItem={false}>
 | 
	
		
			
				|  |  | -                              <NInput
 | 
	
		
			
				|  |  | -                                maxlength={25}
 | 
	
		
			
				|  |  | -                                placeholder="填写章节名称"
 | 
	
		
			
				|  |  | -                                v-model:value={know.name}
 | 
	
		
			
				|  |  | -                                clearable></NInput>
 | 
	
		
			
				|  |  | -                              <NButton
 | 
	
		
			
				|  |  | -                                quaternary
 | 
	
		
			
				|  |  | -                                circle
 | 
	
		
			
				|  |  | -                                onClick={() => {
 | 
	
		
			
				|  |  | -                                  item.knowledgeList.splice(knowIndex + 1, 0, {
 | 
	
		
			
				|  |  | -                                    name: '',
 | 
	
		
			
				|  |  | -                                    key: Date.now() + '' + knowIndex
 | 
	
		
			
				|  |  | -                                  });
 | 
	
		
			
				|  |  | -                                }}>
 | 
	
		
			
				|  |  | -                                {{
 | 
	
		
			
				|  |  | -                                  icon: () => (
 | 
	
		
			
				|  |  | -                                    <img src={btnAdd} class={styles.btnImg} />
 | 
	
		
			
				|  |  | -                                  )
 | 
	
		
			
				|  |  | -                                }}
 | 
	
		
			
				|  |  | -                              </NButton>
 | 
	
		
			
				|  |  | -                              <NButton
 | 
	
		
			
				|  |  | -                                quaternary
 | 
	
		
			
				|  |  | -                                circle
 | 
	
		
			
				|  |  | -                                disabled={item.knowledgeList.length < 2}
 | 
	
		
			
				|  |  | -                                onClick={() => {
 | 
	
		
			
				|  |  | -                                  item.knowledgeList.splice(knowIndex, 1);
 | 
	
		
			
				|  |  | -                                }}>
 | 
	
		
			
				|  |  | -                                {{
 | 
	
		
			
				|  |  | -                                  icon: () => (
 | 
	
		
			
				|  |  | -                                    <img
 | 
	
		
			
				|  |  | -                                      src={btnDelete}
 | 
	
		
			
				|  |  | -                                      class={styles.btnImg}
 | 
	
		
			
				|  |  | -                                    />
 | 
	
		
			
				|  |  | -                                  )
 | 
	
		
			
				|  |  | -                                }}
 | 
	
		
			
				|  |  | -                              </NButton>
 | 
	
		
			
				|  |  | -                              <NButton
 | 
	
		
			
				|  |  | -                                quaternary
 | 
	
		
			
				|  |  | -                                circle
 | 
	
		
			
				|  |  | -                                disabled={knowIndex === 0}
 | 
	
		
			
				|  |  | -                                onClick={() => {
 | 
	
		
			
				|  |  | -                                  if (knowIndex === 0) return;
 | 
	
		
			
				|  |  | -                                  const tmp = item.knowledgeList[knowIndex - 1];
 | 
	
		
			
				|  |  | -                                  item.knowledgeList[knowIndex - 1] =
 | 
	
		
			
				|  |  | -                                    item.knowledgeList[knowIndex];
 | 
	
		
			
				|  |  | -                                  item.knowledgeList[knowIndex] = tmp;
 | 
	
		
			
				|  |  | -                                }}>
 | 
	
		
			
				|  |  | -                                {{
 | 
	
		
			
				|  |  | -                                  icon: () => (
 | 
	
		
			
				|  |  | -                                    <img src={btnUp} class={styles.btnImg} />
 | 
	
		
			
				|  |  | -                                  )
 | 
	
		
			
				|  |  | -                                }}
 | 
	
		
			
				|  |  | -                              </NButton>
 | 
	
		
			
				|  |  | -                              <NButton
 | 
	
		
			
				|  |  | -                                quaternary
 | 
	
		
			
				|  |  | -                                circle
 | 
	
		
			
				|  |  | -                                disabled={
 | 
	
		
			
				|  |  | -                                  knowIndex === item.knowledgeList.length - 1
 | 
	
		
			
				|  |  | -                                }
 | 
	
		
			
				|  |  | -                                onClick={() => {
 | 
	
		
			
				|  |  | -                                  if (
 | 
	
		
			
				|  |  | -                                    knowIndex ===
 | 
	
		
			
				|  |  | -                                    item.knowledgeList.length - 1
 | 
	
		
			
				|  |  | -                                  )
 | 
	
		
			
				|  |  | -                                    return;
 | 
	
		
			
				|  |  | -                                  const tmp = item.knowledgeList[knowIndex + 1];
 | 
	
		
			
				|  |  | -                                  item.knowledgeList[knowIndex + 1] =
 | 
	
		
			
				|  |  | -                                    item.knowledgeList[knowIndex];
 | 
	
		
			
				|  |  | -                                  item.knowledgeList[knowIndex] = tmp;
 | 
	
		
			
				|  |  | -                                }}>
 | 
	
		
			
				|  |  | -                                {{
 | 
	
		
			
				|  |  | -                                  icon: () => (
 | 
	
		
			
				|  |  | -                                    <img src={btnDown} class={styles.btnImg} />
 | 
	
		
			
				|  |  | -                                  )
 | 
	
		
			
				|  |  | -                                }}
 | 
	
		
			
				|  |  | -                              </NButton>
 | 
	
		
			
				|  |  | -                            </NSpace>
 | 
	
		
			
				|  |  | -                          </NFormItem>
 | 
	
		
			
				|  |  | -                        );
 | 
	
		
			
				|  |  | -                      })}
 | 
	
		
			
				|  |  | -                    </TransitionGroup>
 | 
	
		
			
				|  |  | -                    <NButton
 | 
	
		
			
				|  |  | -                      class={styles.closeBtn}
 | 
	
		
			
				|  |  | -                      secondary
 | 
	
		
			
				|  |  | -                      circle
 | 
	
		
			
				|  |  | -                      size="small"
 | 
	
		
			
				|  |  | -                      disabled={form.lessonList.length < 2}
 | 
	
		
			
				|  |  | -                      onClick={() => {
 | 
	
		
			
				|  |  | -                        form.lessonList.splice(index, 1);
 | 
	
		
			
				|  |  | -                      }}>
 | 
	
		
			
				|  |  | -                      <img src={btnRemove} />
 | 
	
		
			
				|  |  | -                    </NButton>
 | 
	
		
			
				|  |  | -                  </NSpace>
 | 
	
		
			
				|  |  | -                );
 | 
	
		
			
				|  |  | -              })}
 | 
	
		
			
				|  |  | -            </TransitionGroup>
 | 
	
		
			
				|  |  | -            <div class={styles.line}></div>
 | 
	
		
			
				|  |  | -            <NButton
 | 
	
		
			
				|  |  | -              block
 | 
	
		
			
				|  |  | -              class={styles.addUnitBtn}
 | 
	
		
			
				|  |  | -              ghost
 | 
	
		
			
				|  |  | -              color="#198CFE"
 | 
	
		
			
				|  |  | -              onClick={() => {
 | 
	
		
			
				|  |  | -                form.lessonList.push(createLesson());
 | 
	
		
			
				|  |  | -              }}>
 | 
	
		
			
				|  |  | -              {{
 | 
	
		
			
				|  |  | -                icon: () => <img src={iconAdd} />,
 | 
	
		
			
				|  |  | -                default: () => '新增单元'
 | 
	
		
			
				|  |  | -              }}
 | 
	
		
			
				|  |  | -            </NButton>
 | 
	
		
			
				|  |  | -          </NForm>
 | 
	
		
			
				|  |  | -        </NScrollbar>
 | 
	
		
			
				|  |  | -        <NSpace class={styles.btnGroup} justify="center">
 | 
	
		
			
				|  |  | -          <NButton round onClick={() => emit('close')}>
 | 
	
		
			
				|  |  | -            取消
 | 
	
		
			
				|  |  | -          </NButton>
 | 
	
		
			
				|  |  | -          <NButton
 | 
	
		
			
				|  |  | -            round
 | 
	
		
			
				|  |  | -            loading={data.uploading}
 | 
	
		
			
				|  |  | -            type="primary"
 | 
	
		
			
				|  |  | -            onClick={() => handleSave()}>
 | 
	
		
			
				|  |  | -            保存
 | 
	
		
			
				|  |  | -          </NButton>
 | 
	
		
			
				|  |  | -        </NSpace>
 | 
	
		
			
				|  |  | -      </div>
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  NButton,
 | 
	
		
			
				|  |  | +  NCascader,
 | 
	
		
			
				|  |  | +  NForm,
 | 
	
		
			
				|  |  | +  NFormItem,
 | 
	
		
			
				|  |  | +  NInput,
 | 
	
		
			
				|  |  | +  NScrollbar,
 | 
	
		
			
				|  |  | +  NSelect,
 | 
	
		
			
				|  |  | +  NSpace,
 | 
	
		
			
				|  |  | +  useMessage
 | 
	
		
			
				|  |  | +} from 'naive-ui';
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  TransitionGroup,
 | 
	
		
			
				|  |  | +  defineComponent,
 | 
	
		
			
				|  |  | +  onMounted,
 | 
	
		
			
				|  |  | +  reactive,
 | 
	
		
			
				|  |  | +  ref
 | 
	
		
			
				|  |  | +} from 'vue';
 | 
	
		
			
				|  |  | +import styles from './index.module.less';
 | 
	
		
			
				|  |  | +import UploadFile from '@/components/upload-file';
 | 
	
		
			
				|  |  | +import { nextTick } from 'vue';
 | 
	
		
			
				|  |  | +import { scrollToErrorForm } from '@/utils';
 | 
	
		
			
				|  |  | +import { api_lessonCoursewareSave } from '../../api';
 | 
	
		
			
				|  |  | +import iconUpload from '../../images/icon-upload.png';
 | 
	
		
			
				|  |  | +import iconUpload2 from '../../images/icon-upload2.png';
 | 
	
		
			
				|  |  | +import iconAdd from '../../images/icon-add.png';
 | 
	
		
			
				|  |  | +import iconMenu from '../../images/icon-menu.png';
 | 
	
		
			
				|  |  | +import btnAdd from '../../images/btn-add.png';
 | 
	
		
			
				|  |  | +import btnDelete from '../../images/btn-delete.png';
 | 
	
		
			
				|  |  | +import btnUp from '../../images/btn-up.png';
 | 
	
		
			
				|  |  | +import btnDown from '../../images/btn-down.png';
 | 
	
		
			
				|  |  | +import btnRemove from '../../images/btn-remove.png';
 | 
	
		
			
				|  |  | +import { lessonCoursewareDetail } from '/src/views/prepare-lessons/api';
 | 
	
		
			
				|  |  | +import { useCatchStore } from '/src/store/modules/catchData';
 | 
	
		
			
				|  |  | +export const BOOK_DATA = {
 | 
	
		
			
				|  |  | +  grades: [
 | 
	
		
			
				|  |  | +    { label: '一年级', value: 1 },
 | 
	
		
			
				|  |  | +    { label: '二年级', value: 2 },
 | 
	
		
			
				|  |  | +    { label: '三年级', value: 3 },
 | 
	
		
			
				|  |  | +    { label: '四年级', value: 4 },
 | 
	
		
			
				|  |  | +    { label: '五年级', value: 5 },
 | 
	
		
			
				|  |  | +    { label: '六年级', value: 6 },
 | 
	
		
			
				|  |  | +    { label: '七年级', value: 7 },
 | 
	
		
			
				|  |  | +    { label: '八年级', value: 8 },
 | 
	
		
			
				|  |  | +    { label: '九年级', value: 9 }
 | 
	
		
			
				|  |  | +  ],
 | 
	
		
			
				|  |  | +  bookTypes: [
 | 
	
		
			
				|  |  | +    { label: '上册', value: 'LAST' },
 | 
	
		
			
				|  |  | +    { label: '下册', value: 'NEXT' }
 | 
	
		
			
				|  |  | +  ]
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/** 添加单元 */
 | 
	
		
			
				|  |  | +const createLesson = () => {
 | 
	
		
			
				|  |  | +  return {
 | 
	
		
			
				|  |  | +    key: 'item' + Date.now(),
 | 
	
		
			
				|  |  | +    name: '', // 单元名称
 | 
	
		
			
				|  |  | +    lessonTargetDesc: '', // 课时目标描述
 | 
	
		
			
				|  |  | +    knowledgeList: [
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        key: Date.now() + '' + 0,
 | 
	
		
			
				|  |  | +        name: '' // 章节名称
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    ] // 章节信息
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +const initState = () => ({
 | 
	
		
			
				|  |  | +  id: null, // 教材id
 | 
	
		
			
				|  |  | +  name: '',
 | 
	
		
			
				|  |  | +  currentGradeNum: null as any,
 | 
	
		
			
				|  |  | +  instrumentIds: null as any,
 | 
	
		
			
				|  |  | +  // bookType: null, // 上下册
 | 
	
		
			
				|  |  | +  coverImg: '', // 封面
 | 
	
		
			
				|  |  | +  instruemntIds: [] as any,
 | 
	
		
			
				|  |  | +  enableFlag: true, // 状态
 | 
	
		
			
				|  |  | +  type: 'COURSEWARE', // 教材类型:COURSEWARE,THEORY,可用值:COURSEWARE,THEORY
 | 
	
		
			
				|  |  | +  lessonList: [] as any // 单元列表
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'addNatural',
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    item: {
 | 
	
		
			
				|  |  | +      type: Object,
 | 
	
		
			
				|  |  | +      default: () => ({})
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  emits: ['close', 'confirm'],
 | 
	
		
			
				|  |  | +  setup(props, { emit }) {
 | 
	
		
			
				|  |  | +    const catchStore = useCatchStore();
 | 
	
		
			
				|  |  | +    const message = useMessage();
 | 
	
		
			
				|  |  | +    const data = reactive({
 | 
	
		
			
				|  |  | +      uploading: false,
 | 
	
		
			
				|  |  | +      subjectList: [] as any
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const formRef = ref();
 | 
	
		
			
				|  |  | +    const form = reactive(initState());
 | 
	
		
			
				|  |  | +    const handleSave = () => {
 | 
	
		
			
				|  |  | +      formRef.value?.validate((err: any) => {
 | 
	
		
			
				|  |  | +        if (err) {
 | 
	
		
			
				|  |  | +          nextTick(scrollToErrorForm);
 | 
	
		
			
				|  |  | +          return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        handleSubmit();
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const handleSubmit = async () => {
 | 
	
		
			
				|  |  | +      data.uploading = true;
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        const { currentGradeNum, instrumentIds, ...more } = form;
 | 
	
		
			
				|  |  | +        await api_lessonCoursewareSave({
 | 
	
		
			
				|  |  | +          currentGradeNum: currentGradeNum.join(','),
 | 
	
		
			
				|  |  | +          instrumentIds: instrumentIds.join(','),
 | 
	
		
			
				|  |  | +          ...more
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        Object.assign(form, initState());
 | 
	
		
			
				|  |  | +        message.success(props.item.id ? '保存成功' : '添加成功');
 | 
	
		
			
				|  |  | +        emit('close', true);
 | 
	
		
			
				|  |  | +        emit('confirm');
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      data.uploading = false;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onMounted(async () => {
 | 
	
		
			
				|  |  | +      if (!props.item.id) {
 | 
	
		
			
				|  |  | +        form.lessonList = [createLesson()];
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      await catchStore.getSubjects();
 | 
	
		
			
				|  |  | +      if (props.item.id) {
 | 
	
		
			
				|  |  | +        // form.lessonList = [];
 | 
	
		
			
				|  |  | +        const { data } = await lessonCoursewareDetail({ id: props.item.id });
 | 
	
		
			
				|  |  | +        form.id = data.id;
 | 
	
		
			
				|  |  | +        form.name = data.name;
 | 
	
		
			
				|  |  | +        form.currentGradeNum = data.currentGradeNum
 | 
	
		
			
				|  |  | +          ? data.currentGradeNum.split(',').map((item: any) => Number(item))
 | 
	
		
			
				|  |  | +          : null;
 | 
	
		
			
				|  |  | +        form.instrumentIds = data.instrumentIds
 | 
	
		
			
				|  |  | +          ? data.instrumentIds.split(',').map((item: any) => item)
 | 
	
		
			
				|  |  | +          : null;
 | 
	
		
			
				|  |  | +        // form.bookType = data.bookType;
 | 
	
		
			
				|  |  | +        form.coverImg = data.coverImg;
 | 
	
		
			
				|  |  | +        form.lessonList = [];
 | 
	
		
			
				|  |  | +        const lessonList = data.lessonList || [];
 | 
	
		
			
				|  |  | +        const tempLesson: any[] = [];
 | 
	
		
			
				|  |  | +        lessonList.forEach((item: any) => {
 | 
	
		
			
				|  |  | +          const tmpItem: any = {
 | 
	
		
			
				|  |  | +            id: item.id,
 | 
	
		
			
				|  |  | +            key: 'item' + Date.now() + '-' + Math.random() * 100,
 | 
	
		
			
				|  |  | +            name: item.name,
 | 
	
		
			
				|  |  | +            lessonTargetDesc: item.lessonTargetDesc,
 | 
	
		
			
				|  |  | +            knowledgeList: [] as any
 | 
	
		
			
				|  |  | +          };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          if (item.knowledgeList && item.knowledgeList.length) {
 | 
	
		
			
				|  |  | +            item.knowledgeList.forEach((knowledge: any) => {
 | 
	
		
			
				|  |  | +              tmpItem.knowledgeList.push({
 | 
	
		
			
				|  |  | +                id: knowledge.id,
 | 
	
		
			
				|  |  | +                key: Date.now() + '-' + Math.random() * 100,
 | 
	
		
			
				|  |  | +                name: knowledge.name
 | 
	
		
			
				|  |  | +              });
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          tempLesson.push(tmpItem);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        form.lessonList = tempLesson;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      data.subjectList = catchStore.getEnableSingleAllSubjects(
 | 
	
		
			
				|  |  | +        form.instrumentIds
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return () => (
 | 
	
		
			
				|  |  | +      <div class={styles.container}>
 | 
	
		
			
				|  |  | +        <NScrollbar style={{ 'max-height': '65vh' }}>
 | 
	
		
			
				|  |  | +          <NForm
 | 
	
		
			
				|  |  | +            ref={formRef}
 | 
	
		
			
				|  |  | +            labelPlacement="left"
 | 
	
		
			
				|  |  | +            labelWidth={120}
 | 
	
		
			
				|  |  | +            model={form}>
 | 
	
		
			
				|  |  | +            <div class={styles.topForms}>
 | 
	
		
			
				|  |  | +              <NFormItem
 | 
	
		
			
				|  |  | +                path="coverImg"
 | 
	
		
			
				|  |  | +                rule={[
 | 
	
		
			
				|  |  | +                  {
 | 
	
		
			
				|  |  | +                    required: true,
 | 
	
		
			
				|  |  | +                    message: '请上传教材封面',
 | 
	
		
			
				|  |  | +                    trigger: ['change']
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                ]}>
 | 
	
		
			
				|  |  | +                <UploadFile
 | 
	
		
			
				|  |  | +                  cropper
 | 
	
		
			
				|  |  | +                  // tips="建议尺寸:210*297, 文件大小: 5MB以内;"
 | 
	
		
			
				|  |  | +                  v-model:fileList={form.coverImg}
 | 
	
		
			
				|  |  | +                  showType="custom"
 | 
	
		
			
				|  |  | +                  size={2}
 | 
	
		
			
				|  |  | +                  accept=".jpg,jpeg,.png"
 | 
	
		
			
				|  |  | +                  options={{
 | 
	
		
			
				|  |  | +                    autoCropWidth: 210,
 | 
	
		
			
				|  |  | +                    autoCropHeight: 297,
 | 
	
		
			
				|  |  | +                    fixedBox: true
 | 
	
		
			
				|  |  | +                  }}>
 | 
	
		
			
				|  |  | +                  {{
 | 
	
		
			
				|  |  | +                    custom: () => (
 | 
	
		
			
				|  |  | +                      <div class={styles.uploadContent}>
 | 
	
		
			
				|  |  | +                        <img src={iconUpload2} class={styles.iconUpload} />
 | 
	
		
			
				|  |  | +                        <p>请上传教材封面</p>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                </UploadFile>
 | 
	
		
			
				|  |  | +              </NFormItem>
 | 
	
		
			
				|  |  | +              <div class={styles.topFormInput}>
 | 
	
		
			
				|  |  | +                <NFormItem
 | 
	
		
			
				|  |  | +                  style={{ minWidth: '360px' }}
 | 
	
		
			
				|  |  | +                  path="name"
 | 
	
		
			
				|  |  | +                  rule={[
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                      required: true,
 | 
	
		
			
				|  |  | +                      message: '请输入教材名称',
 | 
	
		
			
				|  |  | +                      trigger: ['blur', 'change']
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                  ]}>
 | 
	
		
			
				|  |  | +                  <NInput
 | 
	
		
			
				|  |  | +                    placeholder="请输入教材名称"
 | 
	
		
			
				|  |  | +                    maxlength={25}
 | 
	
		
			
				|  |  | +                    v-model:value={form.name}
 | 
	
		
			
				|  |  | +                    clearable></NInput>
 | 
	
		
			
				|  |  | +                </NFormItem>
 | 
	
		
			
				|  |  | +                <NFormItem
 | 
	
		
			
				|  |  | +                  path="currentGradeNum"
 | 
	
		
			
				|  |  | +                  rule={{
 | 
	
		
			
				|  |  | +                    required: true,
 | 
	
		
			
				|  |  | +                    message: '请选择年级',
 | 
	
		
			
				|  |  | +                    trigger: 'change',
 | 
	
		
			
				|  |  | +                    type: 'array'
 | 
	
		
			
				|  |  | +                  }}>
 | 
	
		
			
				|  |  | +                  <NSelect
 | 
	
		
			
				|  |  | +                    style={{ minWidth: '360px' }}
 | 
	
		
			
				|  |  | +                    placeholder="请选择年级"
 | 
	
		
			
				|  |  | +                    options={BOOK_DATA.grades}
 | 
	
		
			
				|  |  | +                    v-model:value={form.currentGradeNum}
 | 
	
		
			
				|  |  | +                    clearable
 | 
	
		
			
				|  |  | +                    multiple
 | 
	
		
			
				|  |  | +                    filterable
 | 
	
		
			
				|  |  | +                    maxTagCount={3}
 | 
	
		
			
				|  |  | +                  />
 | 
	
		
			
				|  |  | +                </NFormItem>
 | 
	
		
			
				|  |  | +                <NFormItem
 | 
	
		
			
				|  |  | +                  path="instrumentIds"
 | 
	
		
			
				|  |  | +                  style={{ width: '360px' }}
 | 
	
		
			
				|  |  | +                  rule={{
 | 
	
		
			
				|  |  | +                    required: true,
 | 
	
		
			
				|  |  | +                    message: '请选择乐器',
 | 
	
		
			
				|  |  | +                    trigger: 'change',
 | 
	
		
			
				|  |  | +                    type: 'array'
 | 
	
		
			
				|  |  | +                  }}>
 | 
	
		
			
				|  |  | +                  <NCascader
 | 
	
		
			
				|  |  | +                    placeholder="请选择乐器"
 | 
	
		
			
				|  |  | +                    options={data.subjectList}
 | 
	
		
			
				|  |  | +                    v-model:value={form.instrumentIds}
 | 
	
		
			
				|  |  | +                    checkStrategy="child"
 | 
	
		
			
				|  |  | +                    showPath={false}
 | 
	
		
			
				|  |  | +                    childrenField="instruments"
 | 
	
		
			
				|  |  | +                    expandTrigger="hover"
 | 
	
		
			
				|  |  | +                    labelField="name"
 | 
	
		
			
				|  |  | +                    valueField="id"
 | 
	
		
			
				|  |  | +                    clearable
 | 
	
		
			
				|  |  | +                    filterable
 | 
	
		
			
				|  |  | +                    multiple
 | 
	
		
			
				|  |  | +                    maxTagCount="responsive"
 | 
	
		
			
				|  |  | +                    style={{ width: '400px' }}
 | 
	
		
			
				|  |  | +                  />
 | 
	
		
			
				|  |  | +                </NFormItem>
 | 
	
		
			
				|  |  | +                {/* <NFormItem
 | 
	
		
			
				|  |  | +                  path="bookType"
 | 
	
		
			
				|  |  | +                  style={{ width: '360px' }}
 | 
	
		
			
				|  |  | +                  rule={{
 | 
	
		
			
				|  |  | +                    required: true,
 | 
	
		
			
				|  |  | +                    message: '请选择册别',
 | 
	
		
			
				|  |  | +                    trigger: 'change'
 | 
	
		
			
				|  |  | +                  }}>
 | 
	
		
			
				|  |  | +                  <NSelect
 | 
	
		
			
				|  |  | +                    placeholder="请选择册别"
 | 
	
		
			
				|  |  | +                    options={BOOK_DATA.bookTypes}
 | 
	
		
			
				|  |  | +                    v-model:value={form.bookType}
 | 
	
		
			
				|  |  | +                    clearable
 | 
	
		
			
				|  |  | +                  />
 | 
	
		
			
				|  |  | +                </NFormItem> */}
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <div class={styles.menuTitle}>
 | 
	
		
			
				|  |  | +              <img src={iconMenu} class={styles.iconMenu} />
 | 
	
		
			
				|  |  | +              目录
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +            <TransitionGroup name="list" tag="div">
 | 
	
		
			
				|  |  | +              {form.lessonList.map((item, index) => {
 | 
	
		
			
				|  |  | +                return (
 | 
	
		
			
				|  |  | +                  <NSpace
 | 
	
		
			
				|  |  | +                    class={styles.lessonItem}
 | 
	
		
			
				|  |  | +                    wrap={false}
 | 
	
		
			
				|  |  | +                    wrapItem={false}
 | 
	
		
			
				|  |  | +                    align="start"
 | 
	
		
			
				|  |  | +                    key={item.key}>
 | 
	
		
			
				|  |  | +                    <NFormItem
 | 
	
		
			
				|  |  | +                      label="单元名称"
 | 
	
		
			
				|  |  | +                      labelPlacement="top"
 | 
	
		
			
				|  |  | +                      path={`lessonList[${index}].name`}
 | 
	
		
			
				|  |  | +                      rule={{
 | 
	
		
			
				|  |  | +                        required: true,
 | 
	
		
			
				|  |  | +                        message: '填写单元名称',
 | 
	
		
			
				|  |  | +                        trigger: ['blur', 'change']
 | 
	
		
			
				|  |  | +                      }}>
 | 
	
		
			
				|  |  | +                      <NInput
 | 
	
		
			
				|  |  | +                        placeholder="填写单元名称"
 | 
	
		
			
				|  |  | +                        maxlength={25}
 | 
	
		
			
				|  |  | +                        v-model:value={item.name}
 | 
	
		
			
				|  |  | +                        clearable></NInput>
 | 
	
		
			
				|  |  | +                    </NFormItem>
 | 
	
		
			
				|  |  | +                    <TransitionGroup name="list" tag="div">
 | 
	
		
			
				|  |  | +                      {item.knowledgeList.map((know, knowIndex) => {
 | 
	
		
			
				|  |  | +                        return (
 | 
	
		
			
				|  |  | +                          <NFormItem
 | 
	
		
			
				|  |  | +                            style={{
 | 
	
		
			
				|  |  | +                              '--n-label-height': knowIndex === 0 ? '26px' : '0'
 | 
	
		
			
				|  |  | +                            }}
 | 
	
		
			
				|  |  | +                            labelPlacement="top"
 | 
	
		
			
				|  |  | +                            label={knowIndex === 0 ? '章节名称' : ''}
 | 
	
		
			
				|  |  | +                            key={know.key}
 | 
	
		
			
				|  |  | +                            path={`lessonList[${index}].knowledgeList[${knowIndex}].name`}
 | 
	
		
			
				|  |  | +                            rule={{
 | 
	
		
			
				|  |  | +                              required: true,
 | 
	
		
			
				|  |  | +                              message: '填写章节名称',
 | 
	
		
			
				|  |  | +                              trigger: ['blur', 'change']
 | 
	
		
			
				|  |  | +                            }}>
 | 
	
		
			
				|  |  | +                            <NSpace
 | 
	
		
			
				|  |  | +                              wrap={false}
 | 
	
		
			
				|  |  | +                              align="center"
 | 
	
		
			
				|  |  | +                              class={styles.btnGroupAll}
 | 
	
		
			
				|  |  | +                              wrapItem={false}>
 | 
	
		
			
				|  |  | +                              <NInput
 | 
	
		
			
				|  |  | +                                maxlength={25}
 | 
	
		
			
				|  |  | +                                placeholder="填写章节名称"
 | 
	
		
			
				|  |  | +                                v-model:value={know.name}
 | 
	
		
			
				|  |  | +                                clearable></NInput>
 | 
	
		
			
				|  |  | +                              <NButton
 | 
	
		
			
				|  |  | +                                quaternary
 | 
	
		
			
				|  |  | +                                circle
 | 
	
		
			
				|  |  | +                                onClick={() => {
 | 
	
		
			
				|  |  | +                                  item.knowledgeList.splice(knowIndex + 1, 0, {
 | 
	
		
			
				|  |  | +                                    name: '',
 | 
	
		
			
				|  |  | +                                    key: Date.now() + '' + knowIndex
 | 
	
		
			
				|  |  | +                                  });
 | 
	
		
			
				|  |  | +                                }}>
 | 
	
		
			
				|  |  | +                                {{
 | 
	
		
			
				|  |  | +                                  icon: () => (
 | 
	
		
			
				|  |  | +                                    <img src={btnAdd} class={styles.btnImg} />
 | 
	
		
			
				|  |  | +                                  )
 | 
	
		
			
				|  |  | +                                }}
 | 
	
		
			
				|  |  | +                              </NButton>
 | 
	
		
			
				|  |  | +                              <NButton
 | 
	
		
			
				|  |  | +                                quaternary
 | 
	
		
			
				|  |  | +                                circle
 | 
	
		
			
				|  |  | +                                disabled={item.knowledgeList.length < 2}
 | 
	
		
			
				|  |  | +                                onClick={() => {
 | 
	
		
			
				|  |  | +                                  item.knowledgeList.splice(knowIndex, 1);
 | 
	
		
			
				|  |  | +                                }}>
 | 
	
		
			
				|  |  | +                                {{
 | 
	
		
			
				|  |  | +                                  icon: () => (
 | 
	
		
			
				|  |  | +                                    <img
 | 
	
		
			
				|  |  | +                                      src={btnDelete}
 | 
	
		
			
				|  |  | +                                      class={styles.btnImg}
 | 
	
		
			
				|  |  | +                                    />
 | 
	
		
			
				|  |  | +                                  )
 | 
	
		
			
				|  |  | +                                }}
 | 
	
		
			
				|  |  | +                              </NButton>
 | 
	
		
			
				|  |  | +                              <NButton
 | 
	
		
			
				|  |  | +                                quaternary
 | 
	
		
			
				|  |  | +                                circle
 | 
	
		
			
				|  |  | +                                disabled={knowIndex === 0}
 | 
	
		
			
				|  |  | +                                onClick={() => {
 | 
	
		
			
				|  |  | +                                  if (knowIndex === 0) return;
 | 
	
		
			
				|  |  | +                                  const tmp = item.knowledgeList[knowIndex - 1];
 | 
	
		
			
				|  |  | +                                  item.knowledgeList[knowIndex - 1] =
 | 
	
		
			
				|  |  | +                                    item.knowledgeList[knowIndex];
 | 
	
		
			
				|  |  | +                                  item.knowledgeList[knowIndex] = tmp;
 | 
	
		
			
				|  |  | +                                }}>
 | 
	
		
			
				|  |  | +                                {{
 | 
	
		
			
				|  |  | +                                  icon: () => (
 | 
	
		
			
				|  |  | +                                    <img src={btnUp} class={styles.btnImg} />
 | 
	
		
			
				|  |  | +                                  )
 | 
	
		
			
				|  |  | +                                }}
 | 
	
		
			
				|  |  | +                              </NButton>
 | 
	
		
			
				|  |  | +                              <NButton
 | 
	
		
			
				|  |  | +                                quaternary
 | 
	
		
			
				|  |  | +                                circle
 | 
	
		
			
				|  |  | +                                disabled={
 | 
	
		
			
				|  |  | +                                  knowIndex === item.knowledgeList.length - 1
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                                onClick={() => {
 | 
	
		
			
				|  |  | +                                  if (
 | 
	
		
			
				|  |  | +                                    knowIndex ===
 | 
	
		
			
				|  |  | +                                    item.knowledgeList.length - 1
 | 
	
		
			
				|  |  | +                                  )
 | 
	
		
			
				|  |  | +                                    return;
 | 
	
		
			
				|  |  | +                                  const tmp = item.knowledgeList[knowIndex + 1];
 | 
	
		
			
				|  |  | +                                  item.knowledgeList[knowIndex + 1] =
 | 
	
		
			
				|  |  | +                                    item.knowledgeList[knowIndex];
 | 
	
		
			
				|  |  | +                                  item.knowledgeList[knowIndex] = tmp;
 | 
	
		
			
				|  |  | +                                }}>
 | 
	
		
			
				|  |  | +                                {{
 | 
	
		
			
				|  |  | +                                  icon: () => (
 | 
	
		
			
				|  |  | +                                    <img src={btnDown} class={styles.btnImg} />
 | 
	
		
			
				|  |  | +                                  )
 | 
	
		
			
				|  |  | +                                }}
 | 
	
		
			
				|  |  | +                              </NButton>
 | 
	
		
			
				|  |  | +                            </NSpace>
 | 
	
		
			
				|  |  | +                          </NFormItem>
 | 
	
		
			
				|  |  | +                        );
 | 
	
		
			
				|  |  | +                      })}
 | 
	
		
			
				|  |  | +                    </TransitionGroup>
 | 
	
		
			
				|  |  | +                    <NButton
 | 
	
		
			
				|  |  | +                      class={styles.closeBtn}
 | 
	
		
			
				|  |  | +                      secondary
 | 
	
		
			
				|  |  | +                      circle
 | 
	
		
			
				|  |  | +                      size="small"
 | 
	
		
			
				|  |  | +                      disabled={form.lessonList.length < 2}
 | 
	
		
			
				|  |  | +                      onClick={() => {
 | 
	
		
			
				|  |  | +                        form.lessonList.splice(index, 1);
 | 
	
		
			
				|  |  | +                      }}>
 | 
	
		
			
				|  |  | +                      <img src={btnRemove} />
 | 
	
		
			
				|  |  | +                    </NButton>
 | 
	
		
			
				|  |  | +                  </NSpace>
 | 
	
		
			
				|  |  | +                );
 | 
	
		
			
				|  |  | +              })}
 | 
	
		
			
				|  |  | +            </TransitionGroup>
 | 
	
		
			
				|  |  | +            <div class={styles.line}></div>
 | 
	
		
			
				|  |  | +            <NButton
 | 
	
		
			
				|  |  | +              block
 | 
	
		
			
				|  |  | +              class={styles.addUnitBtn}
 | 
	
		
			
				|  |  | +              ghost
 | 
	
		
			
				|  |  | +              color="#198CFE"
 | 
	
		
			
				|  |  | +              onClick={() => {
 | 
	
		
			
				|  |  | +                form.lessonList.push(createLesson());
 | 
	
		
			
				|  |  | +              }}>
 | 
	
		
			
				|  |  | +              {{
 | 
	
		
			
				|  |  | +                icon: () => <img src={iconAdd} />,
 | 
	
		
			
				|  |  | +                default: () => '新增单元'
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            </NButton>
 | 
	
		
			
				|  |  | +          </NForm>
 | 
	
		
			
				|  |  | +        </NScrollbar>
 | 
	
		
			
				|  |  | +        <NSpace class={styles.btnGroup} justify="center">
 | 
	
		
			
				|  |  | +          <NButton round onClick={() => emit('close')}>
 | 
	
		
			
				|  |  | +            取消
 | 
	
		
			
				|  |  | +          </NButton>
 | 
	
		
			
				|  |  | +          <NButton
 | 
	
		
			
				|  |  | +            round
 | 
	
		
			
				|  |  | +            loading={data.uploading}
 | 
	
		
			
				|  |  | +            type="primary"
 | 
	
		
			
				|  |  | +            onClick={() => handleSave()}>
 | 
	
		
			
				|  |  | +            保存
 | 
	
		
			
				|  |  | +          </NButton>
 | 
	
		
			
				|  |  | +        </NSpace>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 |