数通互联化工云平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

318 lines
8.8 KiB

<!--
@ 作者: 秦东
@ 时间: 2024-09-12 10:44:17
@ 备注: 图片
-->
1 year ago
<script lang="ts" setup>
import {
AnalysisCss,
AnalysisInputCss,
} from "@/components/DesignForm/public/form/calculate/cssInfo.ts";
import errimg from "@/assets/404_images/imgNotFound.png";
import { uploadUrl, getRequest } from "@/api/DesignForm";
7 months ago
import { ref,useAttrs } from 'vue'
import { Plus } from '@element-plus/icons-vue'
import type { UploadProps, UploadUserFile } from 'element-plus'
const attrs = useAttrs()
const props = withDefaults(
1 year ago
defineProps<{
modelValue?: string;
disabled?: boolean;
tablekey?: Object;
data?: Object;
formTableSetUp?: Object;
imgUrl?: string;
}>(),
{}
);
const emits = defineEmits<{
1 year ago
(e: "update:modelValue", value: string): void;
}>();
const value = computed({
1 year ago
get: () => {
if (props.data.control.imgUrl == "") {
return props.modelValue ? props.modelValue : errimg;
} else {
return props.data.control.imgUrl;
}
},
set: (newVal: any) => {
emits("update:modelValue", newVal);
return newVal;
},
});
7 months ago
/* const value = computed(() => {
if(props.data.control.useDefaultImg){
return props.data.control.imgUrl
}else{
return props.modelValue ? props.modelValue : errimg;
}
}); */
onMounted(()=>{
if(props.data.control.useDefaultImg){
emits("update:modelValue", props.data.control.imgUrl);
}else{
}
})
//组件css部分
const configStyle = computed(() => {
1 year ago
return props.data.styles || {};
});
1 year ago
const imgLoading = ref(false);
const imgPath = ref(errimg);
//文件上传的格式与大小
7 months ago
const beforeAvatarUpload = (rawFile: { type: string; size: number; }) => {
1 year ago
imgLoading.value = true;
// console.log("文件上传的格式与大小",rawFile.type)
1 year ago
let imgType = ["image/jpeg", "image/jpg", "image/png", "image/gif", "image/svg"];
if (!imgType.includes(rawFile.type)) {
1 year ago
ElMessage.error("您上传的不是图片!");
imgLoading.value = false;
return false;
} else if (rawFile.size / 1024 / 1024 > 200) {
1 year ago
ElMessage.error("您上传到额图片大于 200MB!");
imgLoading.value = false;
return false;
}
1 year ago
return true;
};
//上传成功回调
7 months ago
const handleAvatarSuccess = (response: { data: { url: string; }; }, uploadFile: any) => {
// imageUrl.value = URL.createObjectURL(uploadFile.raw!)
// console.log("上传成功回调", value);
1 year ago
emits("update:modelValue", response.data.url);
imgPath.value = response.data.url;
value.value = response.data.url;
// console.log("上传成功回调---------->", value.value);
1 year ago
// let oldFormSetUp = props.formTableSetUp
// if(props.formTableSetUp && props.formTableSetUp.list && props.formTableSetUp.list.length > 0){
// oldFormSetUp.list.forEach((item)=>{
// if(item.name && item.name == props.data.name){
// // value.value = response.data.url
// // item.control.link = response.data.url
// value.set(response.data.url)
// emits('update:modelValue', response.data.url)
// console.log("上传成功回调------>",response.data.url)
// }
// })
// }
// props.setimgurl=response.data.url
// emits("update:imgUrl",response.data.url)
// console.log("上传成功回调------>",url.value)
// emits("updateCont",response.data.url)
imgLoading.value = false;
};
const getFormItemInputStyle = (ele: any, sty: number) => {
if (ele?.inputStyle) {
// console.log("返回栅格宽度4", AnalysisInputCss(ele?.inputStyle, sty));
1 year ago
return AnalysisInputCss(ele?.inputStyle, sty);
}
};
7 months ago
const showUpload = computed(() => {
if(!value||value.value == ""||value.value=="/src/assets/404_images/imgNotFound.png"){
return true
}else{
return false
}
});
const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
console.log(uploadFile, uploadFiles)
let arrStr = ''
uploadFiles.forEach((element) => {
//console.log(element.response.data.url)
arrStr+= element.response.data.url+","
});
arrStr = arrStr.slice(0, -1);
console.log(arrStr)
emits("update:modelValue", arrStr);
}
const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
dialogImageUrl.value = uploadFile.url!
dialogVisible.value = true
}
const dialogImageUrl = ref('')
const dialogVisible = ref(false)
const valueArr = computed(()=>{
return value.value.split(',');
})
//上传成功回调
const handleAvatarSuccess1 = (response: any, uploadFile: any) => {
// imageUrl.value = URL.createObjectURL(uploadFile.raw!)
// console.log("上传成功回调", value);
/* console.log(response.data.url)
console.log(uploadFile) */
let arrStr = ''
props.data.control.uploadedImgs.forEach((element: { url: any; }) => {
//console.log(element.response.data.url)
arrStr+= element.response.data.url+","
});
arrStr = arrStr.slice(0, -1);
console.log(arrStr)
emits("update:modelValue", arrStr);
/*imgPath.value = response.data.url;
value.value = response.data.url; */
imgLoading.value = false;
};
const fileUpload = ref(null);
function selectFile(){
//fileUpload.value.$refs.input.click();
//console.log()
//fileUpload.handleStart();
fileUpload.value.$el.querySelector('input[type="file"]').click();
}
</script>
<template>
7 months ago
<img
v-if="props.data.control.useDefaultImg"
:src="value"
class="avatar"
:style="getFormItemInputStyle(configStyle, 2)"
/>
<!-- <img referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" /> -->
<!-- <div></div> -->
<!-- <el-upload
1 year ago
v-bind="$props"
class="upload-demo"
:action="uploadUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
v-loading="imgLoading"
>
7 months ago
<el-icon v-if="!props.data.control.useDefaultImg" class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload> -->
<!--
-->
<!-- <el-upload
v-if="!props.data.control.useDefaultImg"
v-model:file-list="props.data.control.uploadedImgs"
:action="uploadUrl"
list-type="picture-card"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:before-upload="beforeAvatarUpload"
v-loading="imgLoading"
:on-success="handleAvatarSuccess1"
>
<el-icon><Plus /></el-icon>
</el-upload> -->
7 months ago
<div v-if="!props.data.control.useDefaultImg&&attrs.type!=4&&props.data.control.onSiteShot==''" style="width: 100%; ">
7 months ago
<el-button @click="selectFile" style="color:grey;font-weight: bolder;"><el-icon style="margin-right: 7px;font-weight: bolder;"><Plus /></el-icon></el-button>
</div>
<div v-if="!props.data.control.useDefaultImg&&attrs.type!=4&&props.data.control.onSiteShot&&props.data.control.onSiteShot=='1'" style="width: 100%; color:orangered">
7 months ago
<div v-if="attrs.type==5">仅允许现场手机拍照上传</div>
<div v-else ><el-button @click="selectFile" style="color:grey;font-weight: bolder;"><el-icon style="margin-right: 7px;font-weight: bolder;"><Plus /></el-icon></el-button></div>
</div>
7 months ago
<el-upload
ref="fileUpload"
v-if="!props.data.control.useDefaultImg"
:auto-upload="true"
v-model:file-list="props.data.control.uploadedImgs"
:action="uploadUrl"
list-type="picture-card"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:before-upload="beforeAvatarUpload"
v-loading="imgLoading"
:on-success="handleAvatarSuccess1"
style="margin-top: 10px;"
>
<template #trigger>
<div style="display: none;">
<el-button>默认选择按钮</el-button>
</div>
</template>
1 year ago
</el-upload>
7 months ago
<!-- 详情页略缩图列表 -->
<div v-if ="!props.data.control.useDefaultImg&&attrs.type==4" v-for="url in valueArr" class="demo-image__preview">
<el-image
style="width: 100px; height: 100px;margin: 4px;border: #DCDFE6 1px solid; border-radius: 8px;"
:src="url"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="valueArr"
show-progress
:initial-index="4"
fit="cover"
/>
</div>
<el-dialog v-model="dialogVisible">
<img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
</template>
7 months ago
<style lang="scss" >
/* .upload-demo {
1 year ago
img {
min-width: 150px;
max-width: 300px;
1 year ago
}
7 months ago
} */
.avatar {
7 months ago
width: 100%
}
.el-upload-list--picture-card {
--el-upload-list-picture-card-size: 109px;
}
.el-upload--picture-card {
--el-upload-picture-card-size: 0px !important;
align-items: center;
background-color: var(--el-fill-color-lighter);
border: 0px dashed var(--el-border-color-darker) !important;
border-radius: 6px;
box-sizing: border-box;
cursor: none !important;
display: inline-flex;
height: var(--el-upload-picture-card-size);
justify-content: center;
vertical-align: top;
width: var(--el-upload-picture-card-size);
}
</style>