|
@@ -1,53 +1,82 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <main class="safety-platform-container__main">
|
|
|
|
|
- <BasicForm ref="basicFormRef" :formData="ruleFormData" :formRules="isViewMode ? undefined : formRules"
|
|
|
|
|
- :formConfig="computedFormConfig">
|
|
|
|
|
- <template #fileFormat>
|
|
|
|
|
- <el-radio-group v-model="ruleFormData.fileFormat" :disabled="isViewMode">
|
|
|
|
|
- <el-radio value="PDF">PDF</el-radio>
|
|
|
|
|
- <el-radio value="WORD">WORD</el-radio>
|
|
|
|
|
- </el-radio-group>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template #fileUrl>
|
|
|
|
|
- <UploadFiles label="上传文件" :maxCount="1" :file-list="ruleFormData.fileUrlList" :disabled="isViewMode"
|
|
|
|
|
- :allow-all-file-types="true" @uploadSuccess="handleUploadSuccess" />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template #content>
|
|
|
|
|
- <div class="editor-container">
|
|
|
|
|
- <Toolbar style="border-bottom: 1px solid #dcdfe6" :editor="editorRef" />
|
|
|
|
|
- <Editor style="height: 400px; overflow-y: auto" v-model="ruleFormData.content" mode="default"
|
|
|
|
|
- :defaultConfig="editorConfig" @on-created="handleEditorCreated"
|
|
|
|
|
- @on-change="handleEditorChange" />
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template #imageFileUrl>
|
|
|
|
|
- <el-upload class="image-uploader" action="/api/admin/minio/uploadFile"
|
|
|
|
|
- :file-list="ruleFormData.imageFileUrl" :disabled="isViewMode" :limit="5"
|
|
|
|
|
- :on-success="handleImageUploadSuccess" :on-remove="handleImageRemove" list-type="picture-card">
|
|
|
|
|
- <el-icon>
|
|
|
|
|
- <Plus />
|
|
|
|
|
- </el-icon>
|
|
|
|
|
- <template #tip>
|
|
|
|
|
- <div class="el-upload__tip">
|
|
|
|
|
- 支持格式:.rar .zip .doc .docx .pdf ,单个文件不能超过20MB
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-upload>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template #status>
|
|
|
|
|
- <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode">
|
|
|
|
|
- <el-radio :value="1">启用</el-radio>
|
|
|
|
|
- <el-radio :value="0">禁用</el-radio>
|
|
|
|
|
- </el-radio-group>
|
|
|
|
|
- </template>
|
|
|
|
|
- </BasicForm>
|
|
|
|
|
- </main>
|
|
|
|
|
- <footer class="safety-platform-container__footer">
|
|
|
|
|
- <el-button @click="router.back()">返回</el-button>
|
|
|
|
|
- <el-button v-if="!isViewMode" type="primary" @click="handleSubmit">
|
|
|
|
|
- {{ isCreateMode ? '提交' : '保存' }}
|
|
|
|
|
- </el-button>
|
|
|
|
|
- </footer>
|
|
|
|
|
|
|
+ <main class="safety-platform-container__main">
|
|
|
|
|
+ <BasicForm ref="basicFormRef" :formData="ruleFormData" :formRules="isViewMode ? undefined : formRules"
|
|
|
|
|
+ :formConfig="computedFormConfig">
|
|
|
|
|
+ <template #fileFormat>
|
|
|
|
|
+ <el-radio-group v-model="ruleFormData.fileFormat" :disabled="isViewMode">
|
|
|
|
|
+ <el-radio value="PDF">PDF</el-radio>
|
|
|
|
|
+ <el-radio value="WORD">WORD</el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template #fileUrl>
|
|
|
|
|
+ <!-- <UploadFiles label="上传文件" :maxCount="1" :file-list="ruleFormData.fileUrlList" :disabled="isViewMode"
|
|
|
|
|
+ :allow-all-file-types="true" @uploadSuccess="handleUploadSuccess" /> -->
|
|
|
|
|
+
|
|
|
|
|
+ <UploadFiles
|
|
|
|
|
+ v-if="!isViewMode"
|
|
|
|
|
+ label="上传文件"
|
|
|
|
|
+ :maxCount="1"
|
|
|
|
|
+ :file-list="ruleFormData.attachmentUrl"
|
|
|
|
|
+ :disabled="isViewMode"
|
|
|
|
|
+ :allow-all-file-types="true"
|
|
|
|
|
+ @uploadSuccess="(list: FileItem[]) => handleUploadSuccess(list)"
|
|
|
|
|
+ />
|
|
|
|
|
+ <div class="file-list" v-else>
|
|
|
|
|
+ <div class="file-item" v-for="file in ruleFormData.attachmentUrl" :key="file.fileId">
|
|
|
|
|
+ <span class="file-item--name">{{ file.fileName }}</span>
|
|
|
|
|
+ <div class="file-item--footer">
|
|
|
|
|
+ <el-button link type="primary" @click="previewOnline(file.fileUrl, file.fileType)"
|
|
|
|
|
+ >预览</el-button
|
|
|
|
|
+ >
|
|
|
|
|
+ <!-- <el-button link type="primary" @click.stop="downloadFile(file.fileUrl, file.fileName)"
|
|
|
|
|
+ >下载</el-button
|
|
|
|
|
+ > -->
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template #content>
|
|
|
|
|
+ <div class="editor-container">
|
|
|
|
|
+ <Toolbar style="border-bottom: 1px solid #dcdfe6" :editor="editorRef" />
|
|
|
|
|
+ <Editor style="height: 400px; overflow-y: auto" v-model="ruleFormData.content" mode="default"
|
|
|
|
|
+ :defaultConfig="editorConfig" @on-created="handleEditorCreated" @on-change="handleEditorChange" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template #imageFileUrl>
|
|
|
|
|
+ <!-- <el-upload class="image-uploader" action="/api/admin/minio/uploadFile" :file-list="ruleFormData.imageFileUrl"
|
|
|
|
|
+ :disabled="isViewMode" :limit="5" :on-success="handleImageUploadSuccess" :on-remove="handleImageRemove"
|
|
|
|
|
+ list-type="picture-card">
|
|
|
|
|
+ <el-icon>
|
|
|
|
|
+ <Plus />
|
|
|
|
|
+ </el-icon>
|
|
|
|
|
+ <template #tip>
|
|
|
|
|
+ <div class="el-upload__tip">
|
|
|
|
|
+ 支持格式:.rar .zip .doc .docx .pdf ,单个文件不能超过20MB
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-upload> -->
|
|
|
|
|
+ <UploadImages
|
|
|
|
|
+ ref="uploadImagesRef"
|
|
|
|
|
+ :maxCount="1"
|
|
|
|
|
+ :image-list="approvalImageList"
|
|
|
|
|
+ @upload-success="handleApprovalUploadChange"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template #status>
|
|
|
|
|
+ <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode">
|
|
|
|
|
+ <el-radio :value="1">启用</el-radio>
|
|
|
|
|
+ <el-radio :value="0">禁用</el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </BasicForm>
|
|
|
|
|
+ <PreviewOnline ref="previewOnlineRef" />
|
|
|
|
|
+ </main>
|
|
|
|
|
+ <footer class="safety-platform-container__footer">
|
|
|
|
|
+ <el-button @click="router.back()">返回</el-button>
|
|
|
|
|
+ <el-button v-if="!isViewMode" type="primary" @click="handleSubmit">
|
|
|
|
|
+ {{ isCreateMode ? '提交' : '保存' }}
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </footer>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
@@ -61,14 +90,16 @@ import '@wangeditor/editor/dist/css/style.css';
|
|
|
import { useFormConfigHook } from '@/hooks/useFormConfigHook';
|
|
import { useFormConfigHook } from '@/hooks/useFormConfigHook';
|
|
|
import { ACADEMY_FILE_FORM_CONFIG, ACADEMY_FILE_FORM_DATA, ACADEMY_FILE_FORM_RULES } from '../configs/form';
|
|
import { ACADEMY_FILE_FORM_CONFIG, ACADEMY_FILE_FORM_DATA, ACADEMY_FILE_FORM_RULES } from '../configs/form';
|
|
|
import {
|
|
import {
|
|
|
- queryAcademyFileById,
|
|
|
|
|
- saveAcademyFile,
|
|
|
|
|
- updateAcademyFile,
|
|
|
|
|
- type safetyCultureFile,
|
|
|
|
|
|
|
+ queryAcademyFileById,
|
|
|
|
|
+ saveAcademyFile,
|
|
|
|
|
+ updateAcademyFile,
|
|
|
|
|
+ type safetyCultureFile,
|
|
|
} from '@/api/safety-culture';
|
|
} from '@/api/safety-culture';
|
|
|
import type { FileItem } from '@/components/UploadFiles/types';
|
|
import type { FileItem } from '@/components/UploadFiles/types';
|
|
|
import { formatAttachmentList } from '@/components/UploadFiles/utils';
|
|
import { formatAttachmentList } from '@/components/UploadFiles/utils';
|
|
|
import { Plus, Delete } from '@element-plus/icons-vue';
|
|
import { Plus, Delete } from '@element-plus/icons-vue';
|
|
|
|
|
+import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
|
|
|
|
|
+import UploadImages from '@/components/UploadImages/UploadImages.vue';
|
|
|
|
|
|
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
const route = useRoute();
|
|
@@ -79,225 +110,194 @@ const currentId = computed(() => Number(route.query.id));
|
|
|
const isCreateMode = computed(() => operate.value === 'safety-culture-material-create');
|
|
const isCreateMode = computed(() => operate.value === 'safety-culture-material-create');
|
|
|
const isEditMode = computed(() => operate.value === 'safety-culture-material-edit');
|
|
const isEditMode = computed(() => operate.value === 'safety-culture-material-edit');
|
|
|
const isViewMode = computed(() => operate.value === 'safety-culture-material-view');
|
|
const isViewMode = computed(() => operate.value === 'safety-culture-material-view');
|
|
|
|
|
+const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
|
|
|
|
|
+const uploadImagesRef = ref<InstanceType<typeof UploadImages>>();
|
|
|
|
|
+const approvalImageList = ref([])
|
|
|
|
|
|
|
|
const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData, beforeRouteLeave } =
|
|
const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData, beforeRouteLeave } =
|
|
|
- useFormConfigHook(ACADEMY_FILE_FORM_CONFIG, ACADEMY_FILE_FORM_DATA, ACADEMY_FILE_FORM_RULES);
|
|
|
|
|
|
|
+ useFormConfigHook(ACADEMY_FILE_FORM_CONFIG, ACADEMY_FILE_FORM_DATA, ACADEMY_FILE_FORM_RULES);
|
|
|
|
|
|
|
|
// 查看模式下,所有字段设为只读
|
|
// 查看模式下,所有字段设为只读
|
|
|
const viewFormConfig = ref(
|
|
const viewFormConfig = ref(
|
|
|
- ACADEMY_FILE_FORM_CONFIG.map((item) => ({
|
|
|
|
|
- ...item,
|
|
|
|
|
- componentProps: {
|
|
|
|
|
- ...item.componentProps,
|
|
|
|
|
- disabled: true,
|
|
|
|
|
- },
|
|
|
|
|
- })),
|
|
|
|
|
|
|
+ ACADEMY_FILE_FORM_CONFIG.map((item) => ({
|
|
|
|
|
+ ...item,
|
|
|
|
|
+ componentProps: {
|
|
|
|
|
+ ...item.componentProps,
|
|
|
|
|
+ disabled: true,
|
|
|
|
|
+ },
|
|
|
|
|
+ })),
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
const computedFormConfig = computed(() => {
|
|
const computedFormConfig = computed(() => {
|
|
|
- if (isViewMode.value) {
|
|
|
|
|
- return viewFormConfig.value;
|
|
|
|
|
- }
|
|
|
|
|
- return ruleFormConfig.value;
|
|
|
|
|
|
|
+ if (isViewMode.value) {
|
|
|
|
|
+ return viewFormConfig.value;
|
|
|
|
|
+ }
|
|
|
|
|
+ return ruleFormConfig.value;
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const basicFormRef = ref<InstanceType<typeof BasicForm>>();
|
|
const basicFormRef = ref<InstanceType<typeof BasicForm>>();
|
|
|
|
|
|
|
|
|
|
+
|
|
|
// 富文本编辑器
|
|
// 富文本编辑器
|
|
|
const editorRef = shallowRef();
|
|
const editorRef = shallowRef();
|
|
|
const editorConfig = computed(() => ({
|
|
const editorConfig = computed(() => ({
|
|
|
- placeholder: '请输入文档内容',
|
|
|
|
|
- MENU_CONF: {},
|
|
|
|
|
|
|
+ placeholder: '请输入文档内容',
|
|
|
|
|
+ MENU_CONF: {},
|
|
|
}));
|
|
}));
|
|
|
|
|
|
|
|
const handleEditorCreated = (editor: any) => {
|
|
const handleEditorCreated = (editor: any) => {
|
|
|
- editorRef.value = editor;
|
|
|
|
|
|
|
+ editorRef.value = editor;
|
|
|
|
|
+ if (isViewMode.value) {
|
|
|
|
|
+ editor.disable();
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleEditorChange = () => {
|
|
const handleEditorChange = () => {
|
|
|
- // 编辑器内容变化时的处理
|
|
|
|
|
|
|
+ // 编辑器内容变化时的处理
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 文件上传
|
|
// 文件上传
|
|
|
const handleUploadSuccess = (files: FileItem[]) => {
|
|
const handleUploadSuccess = (files: FileItem[]) => {
|
|
|
- ruleFormData.fileUrlList = files;
|
|
|
|
|
|
|
+ ruleFormData.attachmentUrl = files;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 将逗号分隔的URL字符串转换为FileItem数组
|
|
// 将逗号分隔的URL字符串转换为FileItem数组
|
|
|
const convertFileUrlToFileItems = (fileUrl: string): FileItem[] => {
|
|
const convertFileUrlToFileItems = (fileUrl: string): FileItem[] => {
|
|
|
- if (!fileUrl || !fileUrl.trim()) {
|
|
|
|
|
- return [];
|
|
|
|
|
|
|
+ if (!fileUrl || !fileUrl.trim()) {
|
|
|
|
|
+ return [];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 按逗号分割URL
|
|
|
|
|
+ const urls = fileUrl.split(',').map(url => url.trim()).filter(url => url);
|
|
|
|
|
+
|
|
|
|
|
+ return urls.map((url, index) => {
|
|
|
|
|
+ // 从URL中提取文件名
|
|
|
|
|
+ const urlParts = url.split('/');
|
|
|
|
|
+ const fileName = urlParts[urlParts.length - 1] || `附件${index + 1}`;
|
|
|
|
|
+
|
|
|
|
|
+ // 根据文件扩展名判断文件类型
|
|
|
|
|
+ const extension = fileName.split('.').pop()?.toLowerCase() || '';
|
|
|
|
|
+ let fileType = 'pdf';
|
|
|
|
|
+ if (extension === 'doc' || extension === 'docx') {
|
|
|
|
|
+ fileType = 'word';
|
|
|
|
|
+ } else if (extension === 'xls' || extension === 'xlsx') {
|
|
|
|
|
+ fileType = 'excel';
|
|
|
|
|
+ } else if (extension === 'ppt' || extension === 'pptx') {
|
|
|
|
|
+ fileType = 'ppt';
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 按逗号分割URL
|
|
|
|
|
- const urls = fileUrl.split(',').map(url => url.trim()).filter(url => url);
|
|
|
|
|
-
|
|
|
|
|
- return urls.map((url, index) => {
|
|
|
|
|
- // 从URL中提取文件名
|
|
|
|
|
- const urlParts = url.split('/');
|
|
|
|
|
- const fileName = urlParts[urlParts.length - 1] || `附件${index + 1}`;
|
|
|
|
|
-
|
|
|
|
|
- // 根据文件扩展名判断文件类型
|
|
|
|
|
- const extension = fileName.split('.').pop()?.toLowerCase() || '';
|
|
|
|
|
- let fileType = 'pdf';
|
|
|
|
|
- if (extension === 'doc' || extension === 'docx') {
|
|
|
|
|
- fileType = 'word';
|
|
|
|
|
- } else if (extension === 'xls' || extension === 'xlsx') {
|
|
|
|
|
- fileType = 'excel';
|
|
|
|
|
- } else if (extension === 'ppt' || extension === 'pptx') {
|
|
|
|
|
- fileType = 'ppt';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return {
|
|
|
|
|
- fileId: Date.now() + index,
|
|
|
|
|
- fileName,
|
|
|
|
|
- fileType,
|
|
|
|
|
- fileSize: '0',
|
|
|
|
|
- fileUrl: url,
|
|
|
|
|
- };
|
|
|
|
|
- });
|
|
|
|
|
|
|
+
|
|
|
|
|
+ return {
|
|
|
|
|
+ fileId: Date.now() + index,
|
|
|
|
|
+ fileName,
|
|
|
|
|
+ fileType,
|
|
|
|
|
+ fileSize: '0',
|
|
|
|
|
+ fileUrl: url,
|
|
|
|
|
+ };
|
|
|
|
|
+ });
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleValidate = async () => {
|
|
const handleValidate = async () => {
|
|
|
- if (!basicFormRef.value) return;
|
|
|
|
|
- const res = await basicFormRef.value.validateForm();
|
|
|
|
|
- return res;
|
|
|
|
|
|
|
+ if (!basicFormRef.value) return;
|
|
|
|
|
+ const res = await basicFormRef.value.validateForm();
|
|
|
|
|
+ return res;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const getDetail = async () => {
|
|
const getDetail = async () => {
|
|
|
- if (!currentId.value) return;
|
|
|
|
|
- try {
|
|
|
|
|
- const res = await queryAcademyFileById(currentId.value);
|
|
|
|
|
- if (res) {
|
|
|
|
|
- // 映射接口字段到表单字段
|
|
|
|
|
- ruleFormData.fileName = res.fileName || '';
|
|
|
|
|
- ruleFormData.categoryName = res.categoryName || '';
|
|
|
|
|
- ruleFormData.fileCode = res.fileCode || '';
|
|
|
|
|
- ruleFormData.fileVersion = res.fileVersion || '';
|
|
|
|
|
- ruleFormData.fileFormat = res.fileFormat === 1 ? 'PDF' : 'WORD';
|
|
|
|
|
- ruleFormData.publishDate = res.publishDate || '';
|
|
|
|
|
- ruleFormData.fileUrl = res.fileUrl || '';
|
|
|
|
|
- ruleFormData.content = res.content || '';
|
|
|
|
|
- ruleFormData.status = res.status ?? 1;
|
|
|
|
|
-
|
|
|
|
|
- // 如果有文件URL,转换为FileItem格式
|
|
|
|
|
- ruleFormData.fileUrlList = convertFileUrlToFileItems(res.fileUrl || '');
|
|
|
|
|
- }
|
|
|
|
|
- cloneRuleFormData();
|
|
|
|
|
- } catch (e) {
|
|
|
|
|
- console.error('获取院级文件详情失败:', e);
|
|
|
|
|
- ElMessage.error('获取详情失败');
|
|
|
|
|
|
|
+ if (!currentId.value) return;
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await queryAcademyFileById(currentId.value);
|
|
|
|
|
+ if (res) {
|
|
|
|
|
+ // 映射接口字段到表单字段
|
|
|
|
|
+ ruleFormData.fileName = res.fileName || '';
|
|
|
|
|
+ ruleFormData.categoryName = res.categoryName || '';
|
|
|
|
|
+ ruleFormData.fileCode = res.fileCode || '';
|
|
|
|
|
+ ruleFormData.fileVersion = res.fileVersion || '';
|
|
|
|
|
+ ruleFormData.fileFormat = res.fileFormat === 1 ? 'PDF' : 'WORD';
|
|
|
|
|
+ ruleFormData.publishDate = res.publishDate || '';
|
|
|
|
|
+ ruleFormData.content = res.content || '';
|
|
|
|
|
+ ruleFormData.status = res.status ?? 1;
|
|
|
|
|
+ ruleFormData.imageUrls = JSON.parse(res.imageUrls);
|
|
|
|
|
+ approvalImageList.value = ruleFormData.imageUrls;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 如果有文件URL,转换为FileItem格式
|
|
|
|
|
+ ruleFormData.attachmentUrl = JSON.parse(res.attachmentUrl || res.fileUrl || '');
|
|
|
}
|
|
}
|
|
|
|
|
+ cloneRuleFormData();
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('获取院级文件详情失败:', e);
|
|
|
|
|
+ ElMessage.error('获取详情失败');
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const handleSubmit = async () => {
|
|
|
|
|
- const res = await handleValidate();
|
|
|
|
|
- if (!res) return;
|
|
|
|
|
|
|
+ const handleApprovalUploadChange = async () => {
|
|
|
|
|
+ ruleFormData.imageUrls = uploadImagesRef.value!.getUploadedImages();
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- // 验证文件上传(必填)
|
|
|
|
|
- if (!ruleFormData.fileUrlList || ruleFormData.fileUrlList.length === 0) {
|
|
|
|
|
- ElMessage.warning('请上传文件');
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- try {
|
|
|
|
|
- // 处理文件上传:先上传文件获取 URL,然后提取 fileUrl
|
|
|
|
|
- let fileUrl = '';
|
|
|
|
|
- if (ruleFormData.fileUrlList && ruleFormData.fileUrlList.length > 0) {
|
|
|
|
|
- // 分离已有URL的文件和新上传的文件
|
|
|
|
|
- const existingFiles: string[] = [];
|
|
|
|
|
- const newFiles: FileItem[] = [];
|
|
|
|
|
-
|
|
|
|
|
- ruleFormData.fileUrlList.forEach((file: FileItem) => {
|
|
|
|
|
- // 如果文件已经有 fileUrl 且没有 file 对象,说明是已有文件
|
|
|
|
|
- if (file.fileUrl && !file.file) {
|
|
|
|
|
- existingFiles.push(file.fileUrl);
|
|
|
|
|
- } else {
|
|
|
|
|
- // 否则是需要上传的新文件
|
|
|
|
|
- newFiles.push(file);
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- // 上传新文件
|
|
|
|
|
- let uploadedUrls: string[] = [];
|
|
|
|
|
- if (newFiles.length > 0) {
|
|
|
|
|
- const uploadedFiles = await formatAttachmentList(newFiles);
|
|
|
|
|
- uploadedUrls = uploadedFiles
|
|
|
|
|
- .map((file: any) => file.fileUrl || file.url || '')
|
|
|
|
|
- .filter((url: string) => url);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 合并已有URL和新上传的URL,取第一个作为fileUrl
|
|
|
|
|
- const allUrls = [...existingFiles, ...uploadedUrls].filter((url: string) => url);
|
|
|
|
|
- fileUrl = allUrls.length > 0 ? allUrls[0] : '';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- const basePayload: safetyCultureFile = {
|
|
|
|
|
- fileName: ruleFormData.fileName,
|
|
|
|
|
- classifyName: ruleFormData.classifyName,
|
|
|
|
|
- categoryName: ruleFormData.categoryName,
|
|
|
|
|
- fileCode: ruleFormData.fileCode,
|
|
|
|
|
- fileVersion: ruleFormData.fileVersion,
|
|
|
|
|
- fileFormat: ruleFormData.fileFormat === 'PDF' ? 1 : 2,
|
|
|
|
|
- publishDate: ruleFormData.publishDate,
|
|
|
|
|
- attachmentUrl: fileUrl || '',
|
|
|
|
|
- content: ruleFormData.content || undefined,
|
|
|
|
|
- status: ruleFormData.status ?? 1,
|
|
|
|
|
- releaseDate: ruleFormData.publishDate,
|
|
|
|
|
- description: '',
|
|
|
|
|
- caseName: '',
|
|
|
|
|
- imageUrls: ruleFormData.imageFileUrl.map(item => item.fileUrl || item.url || '').join(',') || '',
|
|
|
|
|
- };
|
|
|
|
|
- if (isCreateMode.value) {
|
|
|
|
|
- await saveAcademyFile(basePayload);
|
|
|
|
|
- ElMessage.success('创建成功');
|
|
|
|
|
- } else if (isEditMode.value && currentId.value) {
|
|
|
|
|
- await updateAcademyFile({
|
|
|
|
|
- id: currentId.value,
|
|
|
|
|
- ...basePayload,
|
|
|
|
|
- });
|
|
|
|
|
- ElMessage.success('保存成功');
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- router.back();
|
|
|
|
|
- } catch (e) {
|
|
|
|
|
- console.error('保存院级文件失败:', e);
|
|
|
|
|
- ElMessage.error('保存失败,请重试');
|
|
|
|
|
|
|
+const handleSubmit = async () => {
|
|
|
|
|
+ const res = await handleValidate();
|
|
|
|
|
+ if (!res) return;
|
|
|
|
|
+
|
|
|
|
|
+ // 验证文件上传(必填)
|
|
|
|
|
+ if (!ruleFormData.attachmentUrl || ruleFormData.attachmentUrl.length === 0) {
|
|
|
|
|
+ ElMessage.warning('请上传文件');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ try {
|
|
|
|
|
+ const uploadedFileList = await formatAttachmentList(ruleFormData.attachmentUrl);
|
|
|
|
|
+
|
|
|
|
|
+ const basePayload: any = {
|
|
|
|
|
+ fileName: ruleFormData.fileName,
|
|
|
|
|
+ classifyName: ruleFormData.classifyName,
|
|
|
|
|
+ categoryName: ruleFormData.categoryName,
|
|
|
|
|
+ fileCode: ruleFormData.fileCode,
|
|
|
|
|
+ fileVersion: ruleFormData.fileVersion,
|
|
|
|
|
+ fileFormat: ruleFormData.fileFormat === 'PDF' ? 1 : 2,
|
|
|
|
|
+ publishDate: ruleFormData.publishDate,
|
|
|
|
|
+ attachmentUrl:JSON.stringify(uploadedFileList),
|
|
|
|
|
+ content: ruleFormData.content || undefined,
|
|
|
|
|
+ status: ruleFormData.status ?? 1,
|
|
|
|
|
+ releaseDate: ruleFormData.publishDate,
|
|
|
|
|
+ description: '',
|
|
|
|
|
+ caseName: '',
|
|
|
|
|
+ imageUrls: JSON.stringify(ruleFormData.imageUrls)
|
|
|
|
|
+ };
|
|
|
|
|
+ if (isCreateMode.value) {
|
|
|
|
|
+ await saveAcademyFile(basePayload);
|
|
|
|
|
+ ElMessage.success('创建成功');
|
|
|
|
|
+ } else if (isEditMode.value && currentId.value) {
|
|
|
|
|
+ await updateAcademyFile({
|
|
|
|
|
+ id: currentId.value,
|
|
|
|
|
+ ...basePayload,
|
|
|
|
|
+ });
|
|
|
|
|
+ ElMessage.success('保存成功');
|
|
|
}
|
|
}
|
|
|
-};
|
|
|
|
|
|
|
|
|
|
-const handleImageUploadSuccess = (response: any, file: any, fileList: any[]) => {
|
|
|
|
|
- const imageUrl = response.data?.url || file.url;
|
|
|
|
|
- ruleFormData.imageFileUrl = fileList.map(item => ({
|
|
|
|
|
- fileId: Date.now() + Math.random(),
|
|
|
|
|
- fileName: item.name,
|
|
|
|
|
- fileType: 'image',
|
|
|
|
|
- fileSize: (item.size / 1024).toFixed(2) + 'KB',
|
|
|
|
|
- fileUrl: imageUrl || item.url
|
|
|
|
|
- }));
|
|
|
|
|
|
|
+ router.back();
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('保存院级文件失败:', e);
|
|
|
|
|
+ ElMessage.error('保存失败,请重试');
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const handleImageRemove = (file: any, fileList: any[]) => {
|
|
|
|
|
- ruleFormData.imageFileUrl = fileList.map(item => ({
|
|
|
|
|
- fileId: item.fileId || Date.now() + Math.random(),
|
|
|
|
|
- fileName: item.name || item.fileName,
|
|
|
|
|
- fileType: 'image',
|
|
|
|
|
- fileSize: item.size ? (item.size / 1024).toFixed(2) + 'KB' : item.fileSize,
|
|
|
|
|
- fileUrl: item.url || item.fileUrl
|
|
|
|
|
- }));
|
|
|
|
|
|
|
+const previewOnline = (url: string | undefined, type) => {
|
|
|
|
|
+ if (url) {
|
|
|
|
|
+ previewOnlineRef.value?.open(url, type);
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
- cloneRuleFormData();
|
|
|
|
|
- // beforeRouteLeave();
|
|
|
|
|
- if (isEditMode.value || isViewMode.value) {
|
|
|
|
|
- getDetail();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ cloneRuleFormData();
|
|
|
|
|
+ // beforeRouteLeave();
|
|
|
|
|
+ if (isEditMode.value || isViewMode.value) {
|
|
|
|
|
+ getDetail();
|
|
|
|
|
+ }
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
onBeforeUnmount(() => {
|
|
onBeforeUnmount(() => {
|
|
|
- const editor = editorRef.value;
|
|
|
|
|
- if (editor == null) return;
|
|
|
|
|
- editor.destroy();
|
|
|
|
|
|
|
+ const editor = editorRef.value;
|
|
|
|
|
+ if (editor == null) return;
|
|
|
|
|
+ editor.destroy();
|
|
|
});
|
|
});
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
@@ -305,45 +305,57 @@ onBeforeUnmount(() => {
|
|
|
@use '@/styles/page-details-layout.scss' as *;
|
|
@use '@/styles/page-details-layout.scss' as *;
|
|
|
|
|
|
|
|
.editor-container {
|
|
.editor-container {
|
|
|
- width: 100%;
|
|
|
|
|
- border: 1px solid #dcdfe6;
|
|
|
|
|
- border-radius: 4px;
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ border: 1px solid #dcdfe6;
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+ overflow: hidden;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.content-display {
|
|
.content-display {
|
|
|
- min-height: 200px;
|
|
|
|
|
- padding: 12px;
|
|
|
|
|
- border: 1px solid #dcdfe6;
|
|
|
|
|
- border-radius: 4px;
|
|
|
|
|
- background-color: #f5f7fa;
|
|
|
|
|
|
|
+ min-height: 200px;
|
|
|
|
|
+ padding: 12px;
|
|
|
|
|
+ border: 1px solid #dcdfe6;
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+ background-color: #f5f7fa;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.file-display {
|
|
.file-display {
|
|
|
- .file-link {
|
|
|
|
|
- color: #409eff;
|
|
|
|
|
- text-decoration: none;
|
|
|
|
|
|
|
+ .file-link {
|
|
|
|
|
+ color: #409eff;
|
|
|
|
|
+ text-decoration: none;
|
|
|
|
|
|
|
|
- &:hover {
|
|
|
|
|
- text-decoration: underline;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ text-decoration: underline;
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.no-file {
|
|
.no-file {
|
|
|
- color: rgba(0, 0, 0, 0.65);
|
|
|
|
|
|
|
+ color: rgba(0, 0, 0, 0.65);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.image-uploader {
|
|
.image-uploader {
|
|
|
- :deep(.el-upload--picture-card) {
|
|
|
|
|
- width: 80px !important;
|
|
|
|
|
- height: 80px !important;
|
|
|
|
|
- line-height: 80px;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ :deep(.el-upload--picture-card) {
|
|
|
|
|
+ width: 80px !important;
|
|
|
|
|
+ height: 80px !important;
|
|
|
|
|
+ line-height: 80px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.el-upload-list--picture-card .el-upload-list__item) {
|
|
|
|
|
+ width: 80px !important;
|
|
|
|
|
+ height: 80px !important;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|
|
|
|
|
|
|
|
- :deep(.el-upload-list--picture-card .el-upload-list__item) {
|
|
|
|
|
- width: 80px !important;
|
|
|
|
|
- height: 80px !important;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+<style lang="scss">
|
|
|
|
|
+.w-e-full-screen-container {
|
|
|
|
|
+ inset: 0 !important;
|
|
|
|
|
+ z-index: 3000 !important;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.w-e-full-screen-container .w-e-text-container {
|
|
|
|
|
+ height: calc(100vh - 42px) !important;
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|