diff --git a/apps/web-antd/src/api/bpm/model/index.ts b/apps/web-antd/src/api/bpm/model/index.ts index 545a73c03..e0c033a44 100644 --- a/apps/web-antd/src/api/bpm/model/index.ts +++ b/apps/web-antd/src/api/bpm/model/index.ts @@ -30,6 +30,7 @@ export namespace BpmModelApi { deploymentTime: number; suspensionState: number; formType?: number; + formCustomCreatePath?: string; formCustomViewPath?: string; formFields?: string[]; } diff --git a/apps/web-antd/src/components/upload/file-upload.vue b/apps/web-antd/src/components/upload/file-upload.vue index b2a800785..3838642ea 100644 --- a/apps/web-antd/src/components/upload/file-upload.vue +++ b/apps/web-antd/src/components/upload/file-upload.vue @@ -51,12 +51,12 @@ const { getStringAccept } = useUploadType({ maxSizeRef: maxSize, }); -// 计算当前绑定的值,优先使用 modelValue +/** 计算当前绑定的值,优先使用 modelValue */ const currentValue = computed(() => { return props.modelValue === undefined ? props.value : props.modelValue; }); -// 判断是否使用 modelValue +/** 判断是否使用 modelValue */ const isUsingModelValue = computed(() => { return props.modelValue !== undefined; }); @@ -82,19 +82,21 @@ watch( } else { value.push(v); } - fileList.value = value.map((item, i) => { - if (item && isString(item)) { - return { - uid: `${-i}`, - name: item.slice(Math.max(0, item.lastIndexOf('/') + 1)), - status: UploadResultStatus.DONE, - url: item, - }; - } else if (item && isObject(item)) { - return item; - } - return null; - }) as UploadProps['fileList']; + fileList.value = value + .map((item, i) => { + if (item && isString(item)) { + return { + uid: `${-i}`, + name: item.slice(Math.max(0, item.lastIndexOf('/') + 1)), + status: UploadResultStatus.DONE, + url: item, + }; + } else if (item && isObject(item)) { + return item; + } + return null; + }) + .filter(Boolean) as UploadProps['fileList']; } if (!isFirstRender.value) { emit('change', value); @@ -107,6 +109,7 @@ watch( }, ); +/** 处理文件删除 */ async function handleRemove(file: UploadFile) { if (fileList.value) { const index = fileList.value.findIndex((item) => item.uid === file.uid); @@ -120,17 +123,17 @@ async function handleRemove(file: UploadFile) { } } -// 处理文件预览 +/** 处理文件预览 */ function handlePreview(file: UploadFile) { emit('preview', file); } -// 处理文件数量超限 +/** 处理文件数量超限 */ function handleExceed() { message.error($t('ui.upload.maxNumber', [maxNumber.value])); } -// 处理上传错误 +/** 处理上传错误 */ function handleUploadError(error: any) { console.error('上传错误:', error); message.error($t('ui.upload.uploadError')); @@ -138,6 +141,11 @@ function handleUploadError(error: any) { uploadNumber.value = Math.max(0, uploadNumber.value - 1); } +/** + * 上传前校验 + * @param file 待上传的文件 + * @returns 是否允许上传 + */ async function beforeUpload(file: File) { const fileContent = await file.text(); emit('returnText', fileContent); @@ -171,7 +179,8 @@ async function beforeUpload(file: File) { return true; } -async function customRequest(info: UploadRequestOption) { +/** 自定义上传请求 */ +async function customRequest(info: UploadRequestOption) { let { api } = props; if (!api || !isFunction(api)) { api = useUpload(props.directory).httpRequest; @@ -196,7 +205,11 @@ async function customRequest(info: UploadRequestOption) { } } -// 处理上传成功 +/** + * 处理上传成功 + * @param res 上传响应结果 + * @param file 上传的文件 + */ function handleUploadSuccess(res: any, file: File) { // 删除临时文件 const index = fileList.value?.findIndex((item) => item.name === file.name); @@ -228,6 +241,10 @@ function handleUploadSuccess(res: any, file: File) { } } +/** + * 获取当前文件列表的值 + * @returns 文件 URL 列表或字符串 + */ function getValue() { const list = (fileList.value || []) .filter((item) => item?.status === UploadResultStatus.DONE) diff --git a/apps/web-antd/src/components/upload/image-upload.vue b/apps/web-antd/src/components/upload/image-upload.vue index fe962f538..b78d8f15d 100644 --- a/apps/web-antd/src/components/upload/image-upload.vue +++ b/apps/web-antd/src/components/upload/image-upload.vue @@ -55,12 +55,12 @@ const { getStringAccept } = useUploadType({ maxSizeRef: maxSize, }); -// 计算当前绑定的值,优先使用 modelValue +/** 计算当前绑定的值,优先使用 modelValue */ const currentValue = computed(() => { return props.modelValue === undefined ? props.value : props.modelValue; }); -// 判断是否使用 modelValue +/** 判断是否使用 modelValue */ const isUsingModelValue = computed(() => { return props.modelValue !== undefined; }); @@ -89,19 +89,21 @@ watch( } else { value.push(v); } - fileList.value = value.map((item, i) => { - if (item && isString(item)) { - return { - uid: `${-i}`, - name: item.slice(Math.max(0, item.lastIndexOf('/') + 1)), - status: UploadResultStatus.DONE, - url: item, - }; - } else if (item && isObject(item)) { - return item; - } - return null; - }) as UploadProps['fileList']; + fileList.value = value + .map((item, i) => { + if (item && isString(item)) { + return { + uid: `${-i}`, + name: item.slice(Math.max(0, item.lastIndexOf('/') + 1)), + status: UploadResultStatus.DONE, + url: item, + }; + } else if (item && isObject(item)) { + return item; + } + return null; + }) + .filter(Boolean) as UploadProps['fileList']; } if (!isFirstRender.value) { emit('change', value); @@ -114,6 +116,7 @@ watch( }, ); +/** 将文件转换为 Base64 格式 */ function getBase64(file: File) { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -125,6 +128,7 @@ function getBase64(file: File) { }); } +/** 处理图片预览 */ async function handlePreview(file: UploadFile) { if (!file.url && !file.preview) { file.preview = await getBase64(file.originFileObj!); @@ -138,6 +142,7 @@ async function handlePreview(file: UploadFile) { ); } +/** 处理文件删除 */ async function handleRemove(file: UploadFile) { if (fileList.value) { const index = fileList.value.findIndex((item) => item.uid === file.uid); @@ -151,11 +156,17 @@ async function handleRemove(file: UploadFile) { } } +/** 关闭预览弹窗 */ function handleCancel() { previewOpen.value = false; previewTitle.value = ''; } +/** + * 上传前校验 + * @param file 待上传的文件 + * @returns 是否允许上传 + */ async function beforeUpload(file: File) { // 检查文件数量限制 if (fileList.value!.length >= props.maxNumber) { @@ -186,7 +197,8 @@ async function beforeUpload(file: File) { return true; } -async function customRequest(info: UploadRequestOption) { +/** 自定义上传请求 */ +async function customRequest(info: UploadRequestOption) { let { api } = props; if (!api || !isFunction(api)) { api = useUpload(props.directory).httpRequest; @@ -211,7 +223,11 @@ async function customRequest(info: UploadRequestOption) { } } -// 处理上传成功 +/** + * 处理上传成功 + * @param res 上传响应结果 + * @param file 上传的文件 + */ function handleUploadSuccess(res: any, file: File) { // 删除临时文件 const index = fileList.value?.findIndex((item) => item.name === file.name); @@ -243,14 +259,18 @@ function handleUploadSuccess(res: any, file: File) { } } -// 处理上传错误 +/** 处理上传错误 */ function handleUploadError(error: any) { console.error('上传错误:', error); - message.error('上传错误!!!'); + message.error($t('ui.upload.uploadError')); // 上传失败时减少计数器 uploadNumber.value = Math.max(0, uploadNumber.value - 1); } +/** + * 获取当前文件列表的值 + * @returns 文件 URL 列表或字符串 + */ function getValue() { const list = (fileList.value || []) .filter((item) => item?.status === UploadResultStatus.DONE) diff --git a/apps/web-antd/src/components/upload/input-upload.vue b/apps/web-antd/src/components/upload/input-upload.vue index 66495467a..90b2f4f7c 100644 --- a/apps/web-antd/src/components/upload/input-upload.vue +++ b/apps/web-antd/src/components/upload/input-upload.vue @@ -6,7 +6,7 @@ import type { FileUploadProps } from './typing'; import { computed } from 'vue'; import { useVModel } from '@vueuse/core'; -import { Col, Input, Row, Textarea } from 'ant-design-vue'; +import { Input, Textarea } from 'ant-design-vue'; import FileUpload from './file-upload.vue'; @@ -30,6 +30,7 @@ const modelValue = useVModel(props, 'modelValue', emits, { passive: true, }); +/** 处理文件内容返回 */ function handleReturnText(text: string) { modelValue.value = text; emits('change', modelValue.value); @@ -37,6 +38,7 @@ function handleReturnText(text: string) { emits('update:modelValue', modelValue.value); } +/** 计算输入框属性 */ const inputProps = computed(() => { return { ...props.inputProps, @@ -44,6 +46,7 @@ const inputProps = computed(() => { }; }); +/** 计算文本域属性 */ const textareaProps = computed(() => { return { ...props.textareaProps, @@ -51,6 +54,7 @@ const textareaProps = computed(() => { }; }); +/** 计算文件上传属性 */ const fileUploadProps = computed(() => { return { ...props.fileUploadProps, @@ -58,17 +62,17 @@ const fileUploadProps = computed(() => { });