NurseStationOperateUI/src/views/system/stationAvatar/index.vue

282 lines
7.0 KiB
Vue
Raw Normal View History

2022-11-04 14:22:46 +08:00
<template>
<div>
<div
class="user-info-head"
@click="editCropper()"
style="width: 100px; height: 100px"
>
<img
v-if="options.img"
v-bind:src="options.img"
2022-11-16 13:21:48 +08:00
title="点击上传图片"
2022-11-04 14:22:46 +08:00
style="width: 100px; height: 100px; line-height: 200px"
/>
<i
v-else
class="el-icon-plus avatar-uploader-icon"
style="
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
"
></i>
</div>
<el-dialog
2022-11-16 13:21:48 +08:00
title="上传图片"
2022-11-04 14:22:46 +08:00
:visible.sync="openimg"
2022-11-16 13:21:48 +08:00
width="950px"
2022-11-04 14:22:46 +08:00
append-to-body
@opened="modalOpened"
@close="closeDialog"
>
<el-row>
2022-11-16 13:21:48 +08:00
<el-col :xs="24" :md="0" :style="{ height: '350px' }">
2022-11-04 14:22:46 +08:00
<vue-cropper
ref="cropper"
:img="options.img"
:info="true"
:autoCrop="options.autoCrop"
:autoCropWidth="options.autoCropWidth"
:autoCropHeight="options.autoCropHeight"
:fixedBox="options.fixedBox"
@realTime="realTime"
v-if="visible"
/>
</el-col>
<el-col :xs="24" :md="12" :style="{ height: '350px' }">
<div class="avatar-upload-preview">
2022-11-16 13:21:48 +08:00
<img
style="width: 100%; height: 100%"
v-if="previews.url"
:src="previews.url"
/>
<div v-else></div>
2022-11-04 14:22:46 +08:00
</div>
</el-col>
</el-row>
<br />
<el-row>
<el-col :lg="2" :md="2">
<el-upload
action="#"
:http-request="requestUpload"
:show-file-list="false"
:before-upload="beforeUpload"
>
<el-button size="small">
选择
<i class="el-icon-upload el-icon--right"></i>
</el-button>
</el-upload>
</el-col>
<el-col :lg="{ span: 1, offset: 2 }" :md="2">
<el-button
icon="el-icon-plus"
size="small"
@click="changeScale(1)"
></el-button>
</el-col>
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
<el-button
icon="el-icon-minus"
size="small"
@click="changeScale(-1)"
></el-button>
</el-col>
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
<el-button
icon="el-icon-refresh-left"
size="small"
@click="rotateLeft()"
></el-button>
</el-col>
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
<el-button
icon="el-icon-refresh-right"
size="small"
@click="rotateRight()"
></el-button>
</el-col>
<el-col :lg="{ span: 2, offset: 6 }" :md="2">
<el-button type="primary" size="small" @click="uploadImg()"
> </el-button
>
</el-col>
</el-row>
</el-dialog>
</div>
</template>
<script>
import { VueCropper } from "vue-cropper";
import baseurl from "@/api/baseurl.js";
import { updateNurseStationHeads, posts } from "@/api/system/stationAvatar.js";
export default {
components: { VueCropper },
props: ["img", "type", "item"],
data() {
return {
imageUrl: "",
types: "",
// 是否显示弹出层
openimg: false,
// 是否显示cropper
visible: false,
// 弹出层标题
title: "上传头像",
options: {
img: null, //裁剪图片的地址
autoCrop: true, // 是否默认生成截图框
2022-11-16 13:21:48 +08:00
autoCropWidth: 300, // 默认生成截图框宽度
autoCropHeight: 300, // 默认生成截图框高度
2022-11-04 14:22:46 +08:00
fixedBox: true, // 固定截图框大小 不允许改变
},
previews: {},
items: {},
};
},
created() {
this.types = this.type;
this.items = this.item;
if (this.img == null) {
this.options.img = null;
} else if (this.img == "") {
this.options.img = null;
} else {
this.options.img = baseurl + this.img;
}
},
watch: {
item: {
handler(newimg, oldimg) {
this.items = this.item;
},
},
img: {
handler(newimg, oldimg) {
if (this.img == null) {
this.options.img = null;
} else if (this.img == "") {
this.options.img = null;
} else {
this.options.img = baseurl + this.img;
}
},
},
type: {
handler(newimg, oldimg) {
this.types = this.type;
},
},
},
methods: {
// 编辑头像
editCropper() {
this.openimg = true;
},
// 打开弹出层结束时的回调
modalOpened() {
this.visible = true;
},
// 覆盖默认的上传行为
requestUpload() {},
// 向左旋转
rotateLeft() {
this.$refs.cropper.rotateLeft();
},
// 向右旋转
rotateRight() {
this.$refs.cropper.rotateRight();
},
// 图片缩放
changeScale(num) {
num = num || 1;
this.$refs.cropper.changeScale(num);
},
// 上传预处理
beforeUpload(file) {
if (file.type.indexOf("image/") == -1) {
this.$modal.msgError(
"文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。"
);
} else {
const reader = new FileReader();
2022-11-16 13:21:48 +08:00
this.previews.data = file;
this.previews.url = URL.createObjectURL(file);
2022-11-04 14:22:46 +08:00
reader.readAsDataURL(file);
reader.onload = () => {
2022-11-16 13:21:48 +08:00
// this.options.img = reader.result;
2022-11-04 14:22:46 +08:00
};
}
},
// 上传图片
uploadImg() {
2022-11-16 13:21:48 +08:00
let formData = new FormData();
formData.append("file", this.previews.data);
formData.append("type", this.types);
updateNurseStationHeads(formData).then((response) => {
this.options.img = baseurl + response.imgUrl;
this.$emit("imgUrl", response.imgUrl);
console.log(this.items);
console.log(this.types);
if (this.types == "attributePitureUrl") {
this.items.attributePitureUrl = response.imgUrl;
this.$emit("item", JSON.stringify(this.items));
}
this.openimg = false;
2022-11-04 14:22:46 +08:00
});
},
// 实时预览
realTime(data) {
2022-11-16 13:21:48 +08:00
console.log(data);
2022-11-04 14:22:46 +08:00
this.previews = data;
},
// 关闭窗口
closeDialog() {
this.imgs = "";
this.visible = false;
},
},
};
</script>
<style scoped lang="scss">
2022-11-16 13:21:48 +08:00
.avatar-upload-preview {
position: absolute;
top: 0%;
left: 50%;
transform: translate(-50%, 0%);
width: 300px;
height: 300px;
border-radius: 0%;
box-shadow: 0 0 4px #ccc;
overflow: hidden;
}
2022-11-04 14:22:46 +08:00
.user-info-head {
position: relative;
display: inline-block;
height: 120px;
background: #fafafa;
}
.user-info-head:hover:after {
content: "";
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
color: #eee;
background: rgba(0, 0, 0, 0.5);
font-size: 24px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
cursor: pointer;
line-height: 110px;
border-radius: 50%;
}
</style>