Skip to content

Commit f88b26e

Browse files
author
puhui999
committed
多图上传组件优化
1 parent 948ef08 commit f88b26e

File tree

9 files changed

+134
-160
lines changed

9 files changed

+134
-160
lines changed

src/api/crm/followup/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export interface FollowUpRecordVO {
77
bizId: number // 数据编号
88
type: number // 跟进类型
99
content: string // 跟进内容
10+
picUrls: string[]
11+
fileUrls: string[]
1012
nextTime: Date // 下次联系时间
1113
businessIds: number[] // 关联的商机编号数组
1214
contactIds: number[] // 关联的联系人编号数组

src/components/UploadFile/src/UploadImgs.vue

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<Icon icon="ep:zoom-in" />
2929
<span>查看</span>
3030
</div>
31-
<div class="handle-icon" @click="handleRemove(file)" v-if="!disabled">
31+
<div v-if="!disabled" class="handle-icon" @click="handleRemove(file)">
3232
<Icon icon="ep:delete" />
3333
<span>删除</span>
3434
</div>
@@ -46,7 +46,6 @@
4646
</div>
4747
</template>
4848
<script lang="ts" setup>
49-
import { PropType } from 'vue'
5049
import type { UploadFile, UploadProps, UploadUserFile } from 'element-plus'
5150
import { ElNotification } from 'element-plus'
5251
@@ -70,10 +69,7 @@ type FileTypes =
7069
| 'image/x-icon'
7170
7271
const props = defineProps({
73-
modelValue: {
74-
type: Array as PropType<UploadUserFile[]>,
75-
required: true
76-
},
72+
modelValue: propTypes.oneOfType<string | string[]>([String, Array<String>]).isRequired,
7773
updateUrl: propTypes.string.def(import.meta.env.VITE_UPLOAD_URL),
7874
drag: propTypes.bool.def(true), // 是否支持拖拽上传 ==> 非必传(默认为 true)
7975
disabled: propTypes.bool.def(false), // 是否禁用上传组件 ==> 非必传(默认为 false)
@@ -91,18 +87,8 @@ const uploadHeaders = ref({
9187
})
9288
9389
const fileList = ref<UploadUserFile[]>([])
94-
// fix: 改为动态监听赋值解决图片回显问题
95-
watch(
96-
() => props.modelValue,
97-
(data) => {
98-
if (!data) return
99-
fileList.value = data
100-
},
101-
{
102-
deep: true,
103-
immediate: true
104-
}
105-
)
90+
const uploadNumber = ref<number>(0)
91+
const uploadList = ref<UploadUserFile[]>([])
10692
/**
10793
* @description 文件上传之前判断
10894
* @param rawFile 上传的文件
@@ -122,29 +108,61 @@ const beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {
122108
message: `上传图片大小不能超过 ${props.fileSize}M!`,
123109
type: 'warning'
124110
})
111+
uploadNumber.value++
125112
return imgType.includes(rawFile.type as FileTypes) && imgSize
126113
}
127114
128115
// 图片上传成功
129116
interface UploadEmits {
130-
(e: 'update:modelValue', value: UploadUserFile[]): void
117+
(e: 'update:modelValue', value: string[]): void
131118
}
132119
133120
const emit = defineEmits<UploadEmits>()
134-
const uploadSuccess = (response, uploadFile: UploadFile) => {
135-
if (!response) return
136-
// TODO 多图上传组件成功后只是把保存成功后的url替换掉组件选图时的文件路径,所以返回的fileList包含的是一个包含文件信息的对象列表
137-
uploadFile.url = response.data
138-
emit('update:modelValue', fileList.value)
121+
const uploadSuccess: UploadProps['onSuccess'] = (res: any): void => {
139122
message.success('上传成功')
123+
// 删除自身
124+
debugger
125+
const index = fileList.value.findIndex((item) => item.response?.data === res.data)
126+
fileList.value.splice(index, 1)
127+
uploadList.value.push({ name: res.data, url: res.data })
128+
if (uploadList.value.length == uploadNumber.value) {
129+
fileList.value.push(...uploadList.value)
130+
uploadList.value = []
131+
uploadNumber.value = 0
132+
emitUpdateModelValue()
133+
}
140134
}
141135
136+
// 监听模型绑定值变动
137+
watch(
138+
() => props.modelValue,
139+
(val: string | string[]) => {
140+
if (!val) {
141+
fileList.value = [] // fix:处理掉缓存,表单重置后上传组件的内容并没有重置
142+
return
143+
}
144+
145+
fileList.value = [] // 保障数据为空
146+
fileList.value.push(
147+
...(val as string[]).map((url) => ({ name: url.substring(url.lastIndexOf('/') + 1), url }))
148+
)
149+
},
150+
{ immediate: true, deep: true }
151+
)
152+
// 发送图片链接列表更新
153+
const emitUpdateModelValue = () => {
154+
let result: string[] = fileList.value.map((file) => file.url!)
155+
emit('update:modelValue', result)
156+
}
142157
// 删除图片
143158
const handleRemove = (uploadFile: UploadFile) => {
144159
fileList.value = fileList.value.filter(
145160
(item) => item.url !== uploadFile.url || item.name !== uploadFile.name
146161
)
147-
emit('update:modelValue', fileList.value)
162+
emit(
163+
'update:modelValue',
164+
fileList.value.map((file) => file.url!)
165+
)
148166
}
149167
150168
// 图片上传错误提示

src/views/crm/followup/FollowUpRecordForm.vue

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,49 +34,36 @@
3434
<!-- TODO @puhui999:不搞富文本哈;然后加个附件、图片两个 form-item 哈 -->
3535
<el-col :span="24">
3636
<el-form-item label="跟进内容" prop="content">
37-
<Editor v-model="formData.content" height="300px" />
37+
<el-input v-model="formData.content" :rows="3" type="textarea" />
38+
</el-form-item>
39+
</el-col>
40+
<el-col :span="24">
41+
<el-form-item label="图片" prop="content">
42+
<UploadImgs v-model="formData.picUrls" class="min-w-80px" />
43+
</el-form-item>
44+
</el-col>
45+
<el-col :span="24">
46+
<el-form-item label="附件" prop="content">
47+
<UploadFile v-model="formData.fileUrls" class="min-w-80px" />
3848
</el-form-item>
3949
</el-col>
40-
<!-- TODO @puhui999:因为不考虑编辑的情况,是不是关联要是个弹窗选择哈? -->
4150
<el-col :span="24">
4251
<el-form-item label="关联联系人" prop="contactIds">
43-
<el-select v-model="formData.contactIds" multiple placeholder="请选择">
44-
<el-option
45-
v-for="item in allContactList"
46-
:key="item.id"
47-
:label="item.name"
48-
:value="item.id"
49-
/>
50-
</el-select>
52+
<el-button @click="handleAddContact">
53+
<Icon class="mr-5px" icon="ep:plus" />
54+
添加联系人
55+
</el-button>
5156
<contact-list v-model:contactIds="formData.contactIds" />
5257
</el-form-item>
53-
<!-- <el-form-item label="关联联系人" prop="contactIds">-->
54-
<!-- <el-button @click="handleAddContact">-->
55-
<!-- <Icon class="mr-5px" icon="ep:plus" />-->
56-
<!-- 选择添加联系人-->
57-
<!-- </el-button>-->
58-
<!-- <contact-list v-model:contactIds="formData.contactIds" />-->
59-
<!-- </el-form-item>-->
6058
</el-col>
6159
<el-col :span="24">
6260
<el-form-item label="关联商机" prop="businessIds">
63-
<el-select v-model="formData.businessIds" multiple placeholder="请选择">
64-
<el-option
65-
v-for="item in allBusinessList"
66-
:key="item.id"
67-
:label="item.name"
68-
:value="item.id"
69-
/>
70-
</el-select>
61+
<el-button @click="handleAddBusiness">
62+
<Icon class="mr-5px" icon="ep:plus" />
63+
添加商机
64+
</el-button>
7165
<business-list v-model:businessIds="formData.businessIds" />
7266
</el-form-item>
73-
<!-- <el-form-item label="关联商机" prop="businessIds">-->
74-
<!-- <el-button @click="handleAddBusiness">-->
75-
<!-- <Icon class="mr-5px" icon="ep:plus" />-->
76-
<!-- 选择添加商机-->
77-
<!-- </el-button>-->
78-
<!-- <business-list v-model:businessIds="formData.businessIds" />-->
79-
<!-- </el-form-item>-->
8067
</el-col>
8168
</el-row>
8269
</el-form>
@@ -159,6 +146,8 @@ const submitForm = async () => {
159146
}
160147
}
161148
149+
const handleAddContact = () => {}
150+
const handleAddBusiness = () => {}
162151
/** 重置表单 */
163152
const resetForm = () => {
164153
formRef.value?.resetFields()

src/views/crm/message/tables/TodayCustomer.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@
1515
<el-select v-model="queryParams.contactStatus" class="!w-240px" placeholder="状态">
1616
<el-option
1717
v-for="(option, index) in CONTACT_STATUS"
18+
:key="index"
1819
:label="option.label"
1920
:value="option.value"
20-
:key="index"
2121
/>
2222
</el-select>
2323
</el-form-item>
2424
<el-form-item label="归属" prop="sceneType">
2525
<el-select v-model="queryParams.sceneType" class="!w-240px" placeholder="归属">
2626
<el-option
2727
v-for="(option, index) in SCENE_TYPES"
28+
:key="index"
2829
:label="option.label"
2930
:value="option.value"
30-
:key="index"
3131
/>
3232
</el-select>
3333
</el-form-item>
@@ -84,7 +84,7 @@
8484
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.dealStatus" />
8585
</template>
8686
</el-table-column>
87-
<!-- TODO @puhui999:距进入公海天数 -->
87+
<el-table-column align="center" label="距进入公海天数" prop="poolDay" width="100px" />
8888
<el-table-column
8989
:formatter="dateFormatter"
9090
align="center"
@@ -120,7 +120,7 @@
120120
</ContentWrap>
121121
</template>
122122

123-
<script lang="ts" setup name="TodayCustomer">
123+
<script lang="ts" name="TodayCustomer" setup>
124124
import { DICT_TYPE } from '@/utils/dict'
125125
import { dateFormatter } from '@/utils/formatTime'
126126
import * as MessageApi from '@/api/crm/message'

src/views/mall/product/comment/CommentForm.vue

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
<template>
2-
<Dialog title="添加虚拟评论" v-model="dialogVisible">
2+
<Dialog v-model="dialogVisible" title="添加虚拟评论">
33
<el-form
44
ref="formRef"
5+
v-loading="formLoading"
56
:model="formData"
67
:rules="formRules"
78
label-width="100px"
8-
v-loading="formLoading"
99
>
1010
<el-form-item label="商品" prop="spuId">
1111
<SpuShowcase v-model="formData.spuId" :limit="1" />
1212
</el-form-item>
13-
<el-form-item label="商品规格" prop="skuId" v-if="formData.spuId">
14-
<div @click="handleSelectSku" class="h-60px w-60px">
13+
<el-form-item v-if="formData.spuId" label="商品规格" prop="skuId">
14+
<div class="h-60px w-60px" @click="handleSelectSku">
1515
<div v-if="skuData && skuData.picUrl">
1616
<el-image :src="skuData.picUrl" />
1717
</div>
@@ -27,7 +27,7 @@
2727
<el-input v-model="formData.userNickname" placeholder="请输入用户名称" />
2828
</el-form-item>
2929
<el-form-item label="评论内容" prop="content">
30-
<el-input type="textarea" v-model="formData.content" />
30+
<el-input v-model="formData.content" type="textarea" />
3131
</el-form-item>
3232
<el-form-item label="描述星级" prop="descriptionScores">
3333
<el-rate v-model="formData.descriptionScores" />
@@ -40,13 +40,13 @@
4040
</el-form-item>
4141
</el-form>
4242
<template #footer>
43-
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
43+
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
4444
<el-button @click="dialogVisible = false">取 消</el-button>
4545
</template>
4646
</Dialog>
47-
<SkuTableSelect ref="skuTableSelectRef" @change="handleSkuChange" :spu-id="formData.spuId" />
47+
<SkuTableSelect ref="skuTableSelectRef" :spu-id="formData.spuId" @change="handleSkuChange" />
4848
</template>
49-
<script setup lang="ts">
49+
<script lang="ts" setup>
5050
import * as CommentApi from '@/api/mall/product/comment'
5151
import SpuShowcase from '@/views/mall/product/spu/components/SpuShowcase.vue'
5252
import * as ProductSpuApi from '@/api/mall/product/spu'
@@ -115,13 +115,8 @@ const submitForm = async () => {
115115
// 提交请求
116116
formLoading.value = true
117117
try {
118-
//处理评论图片
119-
const picUrls = formData.value.picUrls.map((item) => {
120-
return item?.url ? item.url : item
121-
})
122-
const data = { ...formData.value, picUrls }
123118
if (formType.value === 'create') {
124-
await CommentApi.createComment(data)
119+
await CommentApi.createComment(unref(formData.value) as any)
125120
message.success(t('common.createSuccess'))
126121
}
127122
dialogVisible.value = false

0 commit comments

Comments
 (0)