From 7b1f488f9c67e39bceb23c97b9d5c7379e937cb9 Mon Sep 17 00:00:00 2001 From: liugongyu <290219706@qq.com> Date: Wed, 17 Dec 2025 10:18:34 +0800 Subject: [PATCH] 封装下图片上传 --- common/utils/useUploadImgs.ts | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ components/upload-image/upload-image.vue | 189 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pages-sub/daily/maintain-manage/add-record.vue | 606 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pages-sub/daily/quick-order/add-order.vue | 18 ++++-------------- pages-sub/problem/work-order-manage/index.vue | 547 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pages.json | 3 ++- pages/login/index.vue | 26 -------------------------- 7 files changed, 1039 insertions(+), 504 deletions(-) create mode 100644 common/utils/useUploadImgs.ts create mode 100644 pages-sub/problem/work-order-manage/index.vue diff --git a/common/utils/useUploadImgs.ts b/common/utils/useUploadImgs.ts new file mode 100644 index 0000000..6f17211 --- /dev/null +++ b/common/utils/useUploadImgs.ts @@ -0,0 +1,154 @@ +import { ref, type Ref } from 'vue' +import { uploadImages } from '@/common/utils/upload' +import type { UniFormRef } from '@/uni_modules/uview-plus/types' + +// 定义上传配置类型 +export interface UploadImgConfig { + maxCount?: number // 最大上传数量,默认3 + uploadText?: string // 上传按钮文案 + sizeType?: UniApp.UploadFileOption['sizeType'] // 图片压缩类型 + formRef: Ref // 表单ref,用于校验 + fieldName: string // 表单校验字段名(如problemImgs) +} + +// 定义图片项类型 +export interface UploadImgItem { + url: string + status: 'uploading' | 'success' | 'failed' + message: string + [key: string]: any // 兼容其他字段 +} + +/** + * 图片上传组合式函数(支持多实例复用) + * @param config 上传配置 + * @returns 上传相关方法和状态 + */ +export function useUploadImgs(config: UploadImgConfig) { + // 默认配置 + const defaultConfig = { + maxCount: 3, + uploadText: '选择图片', + sizeType: ['compressed'] as UniApp.UploadFileOption['sizeType'], + ...config + } + + // 图片列表 + const imgList = ref([]) + + /** + * 删除图片 + */ + const deleteImg = (event: { index: number }) => { + imgList.value.splice(event.index, 1) + // 删除后重新校验 + defaultConfig.formRef.value?.validateField(defaultConfig.fieldName) + uni.showToast({ title: '图片删除成功', icon: 'success' }) + } + + /** + * 上传图片 + */ + const uploadImgs = async (event: { file: UniApp.ChooseImageSuccessCallbackResult | UniApp.ChooseImageSuccessCallbackResult[] }) => { + const fileList = Array.isArray(event.file) ? event.file : [event.file] + const targetImgList = imgList.value + + // 过滤超出最大数量的图片 + if (targetImgList.length + fileList.length > defaultConfig.maxCount) { + uni.showToast({ title: `最多只能上传${defaultConfig.maxCount}张图片`, icon: 'none' }) + return + } + + const filePaths = fileList.map(item => item.url) + const tempItems = fileList.map(item => ({ + ...item, + status: 'uploading' as const, + message: '上传中' + })) + const startIndex = targetImgList.length + targetImgList.push(...tempItems) + + try { + const uploadResultUrls = await uploadImages({ + filePaths: filePaths, + ignoreError: true + }) + + // 更新上传成功的图片 + uploadResultUrls.forEach((url, index) => { + if (targetImgList[startIndex + index]) { + targetImgList.splice(startIndex + index, 1, { + ...fileList[index], + status: 'success' as const, + message: '', + url: url + }) + } + }) + + // 处理上传失败的图片 + if (uploadResultUrls.length < fileList.length) { + const failCount = fileList.length - uploadResultUrls.length + for (let i = uploadResultUrls.length; i < fileList.length; i++) { + if (targetImgList[startIndex + i]) { + targetImgList.splice(startIndex + i, 1, { + ...fileList[i], + status: 'failed' as const, + message: '上传失败' + }) + } + } + uni.showToast({ title: `成功上传${uploadResultUrls.length}张,失败${failCount}张`, icon: 'none' }) + } else { + uni.showToast({ title: `成功上传${fileList.length}张图片`, icon: 'success' }) + } + + // 上传完成后校验 + defaultConfig.formRef.value?.validateField(defaultConfig.fieldName) + } catch (err) { + console.error(`【${defaultConfig.fieldName}】图片上传失败:`, err) + // 标记所有上传失败 + for (let i = 0; i < fileList.length; i++) { + if (targetImgList[startIndex + i]) { + targetImgList.splice(startIndex + i, 1, { + ...fileList[i], + status: 'failed' as const, + message: '上传失败' + }) + } + } + uni.showToast({ title: '图片上传失败,请重试', icon: 'none' }) + // 上传失败后校验 + defaultConfig.formRef.value?.validateField(defaultConfig.fieldName) + } + } + + /** + * 获取成功上传的图片URL列表 + */ + const getSuccessImgUrls = () => { + return imgList.value.filter(item => item.status === 'success').map(item => item.url) + } + + /** + * 图片校验规则(供表单使用) + */ + const imgValidateRule = { + required: true, + message: `请上传${defaultConfig.uploadText.replace('选择', '')}`, + trigger: 'change', + validator: (rule: any, value: any, callback: (error?: Error) => void) => { + const hasSuccessImg = imgList.value.some(item => item.status === 'success') + hasSuccessImg ? callback() : callback(new Error(`请上传至少1张${defaultConfig.uploadText.replace('选择', '')}`)) + } + } + + return { + imgList, + uploadImgs, + deleteImg, + getSuccessImgUrls, + imgValidateRule, + uploadConfig: defaultConfig + } +} \ No newline at end of file diff --git a/components/upload-image/upload-image.vue b/components/upload-image/upload-image.vue index 7c75aed..8f42448 100644 --- a/components/upload-image/upload-image.vue +++ b/components/upload-image/upload-image.vue @@ -1,200 +1,11 @@ \ No newline at end of file diff --git a/pages-sub/daily/maintain-manage/add-record.vue b/pages-sub/daily/maintain-manage/add-record.vue index 0026e6f..9f26fac 100644 --- a/pages-sub/daily/maintain-manage/add-record.vue +++ b/pages-sub/daily/maintain-manage/add-record.vue @@ -1,66 +1,122 @@ +import { useUploadImgs } from '@/common/utils/useUploadImgs' // 引入公共上传逻辑 +import { getRoadListByLatLng } from '@/api/common' +import { createQuick } from '@/api/quick-order/quick-order' - \ No newline at end of file diff --git a/pages-sub/daily/quick-order/add-order.vue b/pages-sub/daily/quick-order/add-order.vue index fd822b7..82ba3cc 100644 --- a/pages-sub/daily/quick-order/add-order.vue +++ b/pages-sub/daily/quick-order/add-order.vue @@ -151,18 +151,11 @@ @@ -170,11 +163,7 @@ const workOrderFormRef = ref(null) import {getRoadListByLatLng} from '@/api/common' import {uploadImages} from '@/common/utils/upload'; import {createQuick} from '@/api/quick-order/quick-order' -// import { getCurrentInstance } from 'vue'; -// const { proxy } = getCurrentInstance(); -// const label = $dict.getDictLabel('ai_image_status', 10); -// const opdata = $dict.getDictLabel('ai_image_status'); -// console.log(opdata) + export default { data() { @@ -468,7 +457,8 @@ export default { orderName: this.workOrderForm.orderName, sourceId: 1, sourceName: '园林', - thirdWorkNo: '' + thirdWorkNo: '', + busiLine:'yl' } // 显示加载中 diff --git a/pages-sub/problem/work-order-manage/index.vue b/pages-sub/problem/work-order-manage/index.vue new file mode 100644 index 0000000..435ddcb --- /dev/null +++ b/pages-sub/problem/work-order-manage/index.vue @@ -0,0 +1,547 @@ + + + + + \ No newline at end of file diff --git a/pages.json b/pages.json index d92a32c..51125b4 100644 --- a/pages.json +++ b/pages.json @@ -119,8 +119,9 @@ { "root": "pages-sub/problem", "pages": [ + { - "path": "order-manage/index", + "path": "work-order-manage/index", "style": { "navigationBarTitleText": "工单管理" } }, { diff --git a/pages/login/index.vue b/pages/login/index.vue index 470d30a..e4b5616 100644 --- a/pages/login/index.vue +++ b/pages/login/index.vue @@ -308,30 +308,4 @@ const handleLogin = async () => { } } -// 登录按钮 -.login-btn { - width: 100%; - margin-top: 20rpx; - - // 按钮点击反馈 - &:active { - transform: scale(0.98); - transition: transform 0.1s ease; - } -} - -// 覆盖uview默认样式 -:deep(.up-input) { - border-radius: 8rpx !important; - height: 80rpx !important; - line-height: 80rpx !important; -} - -:deep(.up-input__prefix) { - margin-right: 15rpx !important; -} - -:deep(.up-button__loading) { - color: #fff !important; -} \ No newline at end of file -- libgit2 0.21.4