上传图片压缩

This commit is contained in:
BOOL\25024
2023-07-18 10:59:28 +08:00
parent fa44dc7ca6
commit 2feb006554
2 changed files with 513 additions and 385 deletions

View File

@@ -647,6 +647,7 @@
:action="actionUrl" :action="actionUrl"
:headers="headers" :headers="headers"
:on-success="idCardSuccess" :on-success="idCardSuccess"
:before-upload="beforeUpload"
:on-remove="idCardRemove" :on-remove="idCardRemove"
:file-list="idCardList" :file-list="idCardList"
:limit="1" :limit="1"
@@ -665,6 +666,7 @@
:action="actionUrl" :action="actionUrl"
:headers="headers" :headers="headers"
:on-success="sideCardSuccess" :on-success="sideCardSuccess"
:before-upload="getBefore"
:on-remove="sideCardRemove" :on-remove="sideCardRemove"
:file-list="sideCardList" :file-list="sideCardList"
list-type="picture-card" list-type="picture-card"
@@ -684,6 +686,7 @@
:action="actionUrl" :action="actionUrl"
:headers="headers" :headers="headers"
:on-success="depositBankSuccess" :on-success="depositBankSuccess"
:before-upload="beforeData"
:on-remove="depositBankRemove" :on-remove="depositBankRemove"
:file-list="depositBankList" :file-list="depositBankList"
list-type="picture-card" list-type="picture-card"
@@ -703,6 +706,7 @@
:action="actionUrl" :action="actionUrl"
:headers="headers" :headers="headers"
:on-success="businessSuccess" :on-success="businessSuccess"
:before-upload="beforeFormer"
:on-remove="businessRemove" :on-remove="businessRemove"
:file-list="businessList" :file-list="businessList"
list-type="picture-card" list-type="picture-card"

View File

@@ -8,13 +8,14 @@
:on-preview="handlePictureCardPreview" :on-preview="handlePictureCardPreview"
:on-remove="handleRemove" :on-remove="handleRemove"
:on-success="handleSuccess" :on-success="handleSuccess"
:before-upload="beforeUpload"
:file-list="fileList" :file-list="fileList"
style="margin: 10px 0" style="margin: 10px 0"
> >
<i class="el-icon-plus"></i> <i class="el-icon-plus"></i>
</el-upload> </el-upload>
<el-dialog :visible.sync="dialogVisible"> <el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt=""> <img width="100%" :src="dialogImageUrl" alt="" />
</el-dialog> </el-dialog>
<el-form <el-form
:label-position="labelPosition" :label-position="labelPosition"
@@ -57,7 +58,11 @@
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="matchCars" label="适配车辆类型"> <el-form-item prop="matchCars" label="适配车辆类型">
<el-select v-model="station.selectMatchCars" multiple placeholder="请选择"> <el-select
v-model="station.selectMatchCars"
multiple
placeholder="请选择"
>
<el-option <el-option
v-for="item in dict.type.match_cars" v-for="item in dict.type.match_cars"
:key="item.value" :key="item.value"
@@ -69,7 +74,10 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="publicFlag" label="是否对外开放"> <el-form-item prop="publicFlag" label="是否对外开放">
<el-select v-model="station.publicFlag" placeholder="请选择"> <el-select
v-model="station.publicFlag"
placeholder="请选择"
>
<el-option <el-option
v-for="item in publicFlagOptions" v-for="item in publicFlagOptions"
:key="item.value" :key="item.value"
@@ -82,7 +90,10 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="openFlag" label="是否营业中"> <el-form-item prop="openFlag" label="是否营业中">
<el-select v-model="station.openFlag" placeholder="请选择"> <el-select
v-model="station.openFlag"
placeholder="请选择"
>
<el-option <el-option
v-for="item in openFlagOptions" v-for="item in openFlagOptions"
:key="item.value" :key="item.value"
@@ -109,19 +120,27 @@
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="stationLng" label="经度"> <el-form-item prop="stationLng" label="经度">
<el-input v-model="station.stationLng" disabled></el-input> <el-input
v-model="station.stationLng"
disabled
></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="stationLat" label="纬度"> <el-form-item prop="stationLat" label="纬度">
<el-input v-model="station.stationLat" disabled></el-input> <el-input
v-model="station.stationLat"
disabled
></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="merchantName" label="运营商"> <el-form-item prop="merchantName" label="运营商">
<el-input <el-input
:value=" :value="
station.merchantName === null ? '无' : station.merchantName station.merchantName === null
? '无'
: station.merchantName
" "
disabled disabled
></el-input> ></el-input>
@@ -129,7 +148,10 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="stationType" label="站点类型"> <el-form-item prop="stationType" label="站点类型">
<el-select v-model="station.stationType" placeholder="请选择"> <el-select
v-model="station.stationType"
placeholder="请选择"
>
<el-option <el-option
v-for="item in dict.type.station_type" v-for="item in dict.type.station_type"
:key="item.value" :key="item.value"
@@ -144,7 +166,10 @@
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="construction" label="建设场所"> <el-form-item prop="construction" label="建设场所">
<el-select v-model="station.construction" placeholder="请选择"> <el-select
v-model="station.construction"
placeholder="请选择"
>
<el-option <el-option
v-for="item in dict.type.construction_type" v-for="item in dict.type.construction_type"
:key="item.value" :key="item.value"
@@ -157,7 +182,10 @@
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="electricityPrice" label="充电费率"> <el-form-item prop="electricityPrice" label="充电费率">
<el-input <el-input
:value="station.electricityPrice === null ? 0 : station.electricityPrice :value="
station.electricityPrice === null
? 0
: station.electricityPrice
" "
disabled disabled
></el-input> ></el-input>
@@ -166,7 +194,11 @@
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="servicePrice" label="服务费率"> <el-form-item prop="servicePrice" label="服务费率">
<el-input <el-input
:value="station.servicePrice === null ? 0 : station.servicePrice" :value="
station.servicePrice === null
? 0
: station.servicePrice
"
disabled disabled
></el-input> ></el-input>
</el-form-item> </el-form-item>
@@ -178,15 +210,18 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<el-button type="primary" style="margin-left: 94%" @click="present" v-has-permi = "['pile:station:edit']">提交</el-button> <el-button
type="primary"
style="margin-left: 94%"
@click="present"
v-has-permi="['pile:station:edit']"
>提交</el-button
>
</div> </div>
</template> </template>
<script> <script>
import { import { getStationInfo, updateStation } from "@/api/pile/station.js";
getStationInfo,
updateStation,
} from "@/api/pile/station.js";
import bus from "@/bus/bus"; import bus from "@/bus/bus";
import { regionData } from "element-china-area-data"; import { regionData } from "element-china-area-data";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
@@ -195,13 +230,13 @@ export default {
dicts: ["station_type", "match_cars", "construction_type"], dicts: ["station_type", "match_cars", "construction_type"],
data() { data() {
return { return {
actionUrl:process.env.VUE_APP_BASE_API+'/common/uploadOSS', actionUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
dialogVisible: false, dialogVisible: false,
headers: { headers: {
Authorization: "Bearer " + getToken() Authorization: "Bearer " + getToken(),
}, },
imageUrl: null, imageUrl: null,
dialogImageUrl:'', dialogImageUrl: "",
options: regionData, options: regionData,
labelPosition: "right", labelPosition: "right",
station: { station: {
@@ -247,25 +282,45 @@ export default {
], ],
rules: { rules: {
stationName: [ stationName: [
{ required: true, message: "请输入站点名称", trigger: "blur" }, {
required: true,
message: "请输入站点名称",
trigger: "blur",
},
], ],
areaCode: [ areaCode: [
{ required: true, message: "请输入站点区域", trigger: "blur" }, {
required: true,
message: "请输入站点区域",
trigger: "blur",
},
], ],
address: [ address: [
{ required: true, message: "请输入地址", trigger: "blur" } { required: true, message: "请输入地址", trigger: "blur" },
], ],
stationTel: [ stationTel: [
{ required: true, message: "请输入联系电话", trigger: "blur" }, {
required: true,
message: "请输入联系电话",
trigger: "blur",
},
], ],
matchCars: [ matchCars: [
{ required: true, message: "请输入适配车辆类型", trigger: "blur" }, {
required: true,
message: "请输入适配车辆类型",
trigger: "blur",
},
], ],
publicFlag: [ publicFlag: [
{ required: true, message: "请填写是否对外开放", trigger: "blur" }, {
required: true,
message: "请填写是否对外开放",
trigger: "blur",
},
], ],
openFlag: [ openFlag: [
{ required: true, message: "是否营业中", trigger: "blur" } { required: true, message: "是否营业中", trigger: "blur" },
], ],
// merchantAdminName: [ // merchantAdminName: [
// { required: true, message: "请输入管理员", trigger: "blur" }, // { required: true, message: "请输入管理员", trigger: "blur" },
@@ -280,29 +335,98 @@ export default {
// { required: true, message: "请输入管理员", trigger: "blur" }, // { required: true, message: "请输入管理员", trigger: "blur" },
// ], // ],
stationType: [ stationType: [
{ required: true, message: "请输入站点类型", trigger: "blur" }, {
required: true,
message: "请输入站点类型",
trigger: "blur",
},
], ],
construction: [ construction: [
{ required: true, message: "请输入建设场所", trigger: "blur" }, {
required: true,
message: "请输入建设场所",
trigger: "blur",
},
], ],
region: [ region: [
{ required: true, message: "请输入充电费率", trigger: "blur" }, {
required: true,
message: "请输入充电费率",
trigger: "blur",
},
], ],
type: [ type: [
{ required: true, message: "请输入服务费率", trigger: "blur" } {
required: true,
message: "请输入服务费率",
trigger: "blur",
},
], ],
businessHours: [ businessHours: [
{ required: true, message: "请输入营业时间", trigger: "blur" }, {
required: true,
message: "请输入营业时间",
trigger: "blur",
},
], ],
}, },
fileList: [], // 用于图片回显 fileList: [], // 用于图片回显
// dialogVisible: null, // dialogVisible: null,
}; };
}, },
created() { created() {},
},
methods: { methods: {
// 对图片进行上传前处理压缩
beforeUpload(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
// 将图片绘制到一个canvas画布上并设定压缩后的宽度和高度。
reader.onload = (e) => {
const img = new Image();
img.onload = () => {
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
const maxWidth = 800; // 设置压缩后的最大宽度
const maxHeight = 600; // 设置压缩后的最大高度
let width = img.width;
let height = img.height;
if (width > height) {
if (width > maxWidth) {
height *= maxWidth / width;
width = maxWidth;
}
} else {
if (height > maxHeight) {
width *= maxHeight / height;
height = maxHeight;
}
}
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);
// 将canvas画布中的内容转换为Blob对象
canvas.toBlob(
(blob) => {
const compressedFile = new File(
[blob],
file.name,
{ type: blob.type }
);
resolve(compressedFile);
},
file.type,
0.8
); // 设置压缩质量这里设为0.8
};
img.src = e.target.result;
};
reader.readAsDataURL(file);
});
},
handleSuccess(res, file) { handleSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw); this.imageUrl = URL.createObjectURL(file.raw);
console.log("图片上传成功 url", this.imageUrl); console.log("图片上传成功 url", this.imageUrl);
@@ -312,13 +436,13 @@ export default {
handleRemove(file, fileList) { handleRemove(file, fileList) {
console.log("移除图片", file, fileList); console.log("移除图片", file, fileList);
// 从pics数组中找到图片对应的索引值 // 从pics数组中找到图片对应的索引值
const i = this.fileList.findIndex(x => x.uid === file.uid); const i = this.fileList.findIndex((x) => x.uid === file.uid);
// 调用splice方法移除图片信息 // 调用splice方法移除图片信息
this.fileList.splice(i, 1); this.fileList.splice(i, 1);
}, },
handlePictureCardPreview(file) { handlePictureCardPreview(file) {
this.dialogImageUrl = file.url; this.dialogImageUrl = file.url;
console.log(this.dialogImageUrl) console.log(this.dialogImageUrl);
this.dialogVisible = true; this.dialogVisible = true;
}, },
handleChange() { handleChange() {
@@ -330,9 +454,9 @@ export default {
console.log(res); console.log(res);
this.station = res.data; this.station = res.data;
if (res.data.pictures != null) { if (res.data.pictures != null) {
var pictures = res.data.pictures.split(','); var pictures = res.data.pictures.split(",");
for (let i = 0; i < pictures.length; i++) { for (let i = 0; i < pictures.length; i++) {
this.fileList.push({"url": pictures[i]}); this.fileList.push({ url: pictures[i] });
} }
} }
console.log("queryStationInfo表格数据", this.station); console.log("queryStationInfo表格数据", this.station);
@@ -341,7 +465,7 @@ export default {
present() { present() {
// 赋值 // 赋值
this.station.matchCars = this.station.selectMatchCars.join(","); this.station.matchCars = this.station.selectMatchCars.join(",");
this.station.pictures = this.pictureList.join(','); this.station.pictures = this.pictureList.join(",");
// console.log("matchCars赋值后", this.station.matchCars); // console.log("matchCars赋值后", this.station.matchCars);
this.$refs.stationRef.validate((valid) => { this.$refs.stationRef.validate((valid) => {
if (valid) { if (valid) {
@@ -394,7 +518,7 @@ export default {
pictureList.push(this.fileList[i].url); pictureList.push(this.fileList[i].url);
} }
return pictureList; return pictureList;
} },
}, },
}; };
</script> </script>