123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- import {
- computed,
- defineComponent,
- nextTick,
- onMounted,
- reactive,
- ref
- } from 'vue';
- import styles from './index.module.less';
- import {
- NButton,
- NForm,
- NFormItem,
- NImage,
- NInput,
- NScrollbar,
- NSelect,
- NSpace,
- NSwitch,
- useMessage
- } from 'naive-ui';
- import UploadFile from './upload-file';
- import { useCatchStore } from '/src/store/modules/catchData';
- import iconImage from '@common/images/icon-image.png';
- import iconVideo from '@common/images/icon-video.png';
- import iconAudio from '@common/images/icon-audio.png';
- import iconMusic from '@common/images/icon-music.png';
- import iconPPT from '@common/images/icon-ppt.png';
- import iconUploadDelete from '../../../images/btn-remove.png';
- import { materialSave, materialUpdateAll } from '../../../api';
- import { NaturalTypeEnum } from '@/enums/pageEnum';
- import { scrollToErrorForm } from '/src/utils';
- // 判断链接后辍
- export const formatUrlType = (url: string) => {
- if (!url) return '';
- if (url?.indexOf('.mp3') > -1) {
- return NaturalTypeEnum.SONG;
- } else if (url?.indexOf('.mp4') > -1) {
- return NaturalTypeEnum.VIDEO;
- } else if (url?.indexOf('.ppt') > -1) {
- return NaturalTypeEnum.PPT;
- } else {
- return NaturalTypeEnum.IMG;
- }
- };
- export default defineComponent({
- name: 'upload-modal',
- props: {
- list: {
- type: Array,
- default: () => []
- },
- editStatus: {
- type: Boolean,
- default: true
- }
- },
- emits: ['close', 'confirm'],
- setup(props, { emit }) {
- const catchStore = useCatchStore();
- const formRef = ref();
- const message = useMessage();
- const uploadRef = ref();
- const uploadList = ref([] as any);
- const uploadForms = reactive({
- list: [] as any[],
- uploading: false,
- uploadUrl: '',
- name: '',
- subjectIds: [] as any
- });
- // 判断类型
- const formatType = (type: string) => {
- let typeImg = iconImage;
- switch (type) {
- case 'IMG':
- typeImg = iconImage;
- break;
- case 'VIDEO':
- typeImg = iconVideo;
- break;
- case 'SONG':
- typeImg = iconAudio;
- break;
- case 'MUSIC':
- typeImg = iconMusic;
- break;
- case 'PPT':
- typeImg = iconPPT;
- break;
- }
- return typeImg;
- };
- const onSubmit = async () => {
- //
- formRef.value?.validate(async (err: any) => {
- if (err) {
- nextTick(scrollToErrorForm);
- return;
- }
- uploadForms.uploading = true;
- try {
- const body: any[] = [];
- uploadForms.list.forEach(item => {
- body.push({
- subjectIds: item.subjectIds.join(','),
- openFlag: item.openFlag,
- coverImg: item.coverImg,
- name: item.name,
- type: item.type,
- enableFlag: 1,
- content: item.content,
- id: item.id || null
- });
- });
- if (isUpdate.value) {
- await materialUpdateAll(body);
- } else {
- await materialSave(body);
- }
- uploadForms.list = [];
- message.success('保存成功');
- emit('close', true);
- emit('confirm');
- } catch {
- //
- }
- uploadForms.uploading = false;
- });
- };
- const handleRemove = (index: number) => {
- uploadForms.list.splice(index, 1);
- };
- const isUpdate = computed(() => (props.list.length > 0 ? true : false));
- onMounted(async () => {
- const list = props.list || [];
- const temps: any[] = [];
- list.forEach((item: any) => {
- temps.push({
- subjectIds: item.subjectId
- ? item.subjectId
- .split(',')
- .map((subjectId: any) => Number(subjectId))
- : [],
- openFlag: item.openFlag,
- coverImg: item.coverImg,
- name: item.title,
- type: item.type,
- sourceFrom: item.sourceFrom,
- enableFlag: item.enableFlag,
- content: item.content,
- id: item.id
- });
- });
- uploadForms.list = temps || [];
- console.log(temps, 'uploadForms');
- await catchStore.getSubjects();
- });
- // 全选
- const chioseAll = (item: any, list: any) => {
- item.subjectIds = list.map((item: any) => {
- return item.id;
- }) as any;
- };
- return () => (
- <div class={styles.uploadModal}>
- <NScrollbar style={{ 'max-height': '55vh' }}>
- <NForm
- ref={formRef}
- labelPlacement="left"
- labelWidth={120}
- model={uploadForms}
- class={styles.formModal}>
- <NSpace class={styles.formSpace}>
- {uploadForms.list.map((item: any, index: number) => (
- <div class={styles.formItem} key={index}>
- <div class={styles.previewModal}>
- <NImage
- class={[styles.titleType]}
- src={formatType(item.type)}
- previewDisabled
- objectFit="cover"
- />
- {/* 编辑时不能删除 */}
- {!isUpdate.value && (
- <img
- class={[styles.iconUploadDelete]}
- src={iconUploadDelete}
- onClick={() => handleRemove(index)}
- />
- )}
- <NImage
- class={[styles.cover, styles.image]}
- lazy
- previewDisabled
- src={item.coverImg}
- objectFit="cover"
- />
- <div class={styles.commonType}>
- 是否公开:
- <NSwitch
- size="small"
- v-model:value={item.openFlag}
- disabled={
- item.sourceFrom === 'TEACHER' && item.type === 'MUSIC'
- }
- />
- </div>
- </div>
- <NFormItem
- showFeedback={false}
- path={`list.${index}.name`}
- rule={[
- {
- required: true,
- message: '请输入资源名称',
- trigger: ['input', 'blur']
- }
- ]}>
- <NInput
- v-model:value={item.name}
- placeholder="请输入资源名称"
- maxlength={25}
- clearable
- />
- </NFormItem>
- <NFormItem
- path={`list[${index}].subjectIds`}
- showFeedback={false}
- rule={[
- {
- required: true,
- message: '请选择素材可用乐器',
- trigger: 'change',
- type: 'array'
- }
- ]}>
- <NSelect
- v-model:value={item.subjectIds}
- placeholder="请选择素材可用乐器(可多选)"
- options={catchStore.getSubjectList}
- labelField="name"
- valueField="id"
- multiple
- maxTagCount={2}
- clearable
- v-slots={{
- action: () => (
- <>
- <NButton
- text
- style=" --n-width: 100% "
- onClick={() =>
- chioseAll(item, catchStore.getSubjectList)
- }>
- 全选
- </NButton>
- </>
- )
- }}
- />
- </NFormItem>
- </div>
- ))}
- {/* {!isUpdate.value && (
- <div class={styles.formItem}>
- <UploadFile
- v-model:fileList={uploadForms.uploadUrl}
- accept=".jpg,jpeg,.png,audio/mp3,video/mp4"
- showFileList={false}
- ref={uploadRef}
- // cropper
- multiple
- max={10}
- // options={{
- // autoCropWidth: 320,
- // autoCropHeight: 180,
- // fixedBox: true
- // }}
- onFinished={(val: any) => {
- console.log(val, 'val');
- uploadList.value.push({
- subjectIds: uploadForms.subjectIds || [],
- openFlag: true,
- coverImg: val.coverImg,
- name: uploadForms.name || '',
- type: formatUrlType(val.content),
- enableFlag: 1,
- content: val.content
- });
- // uploadForms.list.push({
- // subjectIds: uploadForms.subjectIds || [],
- // openFlag: true,
- // coverImg: val.coverImg,
- // name: uploadForms.name || '',
- // type: formatUrlType(val.content),
- // enableFlag: 1,
- // content: val.content
- // });
- const timer = setTimeout(() => {
- uploadForms.list.push(...uploadList.value);
- uploadList.value = [];
- uploadForms.uploadUrl = '';
- uploadForms.name = '';
- uploadForms.subjectIds = [];
- uploadRef.value.handleClearFile();
- }, 1000);
- }}
- />
- <NFormItem showFeedback={false}>
- <NInput
- v-model:value={uploadForms.name}
- placeholder="请输入资源名称"
- maxlength={25}
- clearable
- />
- </NFormItem>
- <NFormItem showFeedback={false}>
- <NSelect
- v-model:value={uploadForms.subjectIds}
- placeholder="请选择素材可用乐器(可多选)"
- options={catchStore.getSubjectList}
- labelField="name"
- valueField="id"
- multiple
- maxTagCount={2}
- clearable
- v-slots={{
- action: () => (
- <>
- <NButton
- text
- style=" --n-width: 100% "
- onClick={() =>
- chioseAll(
- uploadForms,
- catchStore.getSubjectList
- )
- }>
- 全选
- </NButton>
- </>
- )
- }}
- />
- </NFormItem>
- </div>
- )} */}
- </NSpace>
- </NForm>
- </NScrollbar>
- <NSpace class={styles.btnGroup} justify="center">
- <NButton round onClick={() => emit('close')}>
- {props.editStatus ? '取消' : '上一步'}
- </NButton>
- <NButton
- round
- type="primary"
- loading={uploadForms.uploading}
- disabled={uploadForms.list.length === 0}
- onClick={onSubmit}>
- 确定
- </NButton>
- </NSpace>
- </div>
- );
- }
- });
|