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

416 lines
12 KiB
Vue
Raw Normal View History

2022-11-04 14:22:46 +08:00
<template>
<div>
2023-04-27 16:17:41 +08:00
<div class="user-info-head" :class="video.VideoPath ? 'wihi' : ''" @click="editCropper()">
2023-02-15 09:03:08 +08:00
<video
style="width: 208px; height: 208px"
v-if="video.VideoPath"
v-bind:src="video.VideoPath"
class="avatar video-avatar"
controls="controls"
2023-04-27 16:17:41 +08:00
>您的浏览器不支持视频播放</video>
2022-11-04 14:22:46 +08:00
<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
2023-02-15 17:28:52 +08:00
v-else-if="!options.img && !video.VideoPath"
2022-11-04 14:22:46 +08:00
class="el-icon-plus avatar-uploader-icon"
style="
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
"
></i>
</div>
<el-dialog
2023-02-15 09:03:08 +08:00
:title="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">
2023-02-15 09:03:08 +08:00
<video
style="width: 100%; height: 100%"
2023-02-15 16:00:47 +08:00
v-if="videoForm.showVideoPath"
2023-02-15 09:03:08 +08:00
v-bind:src="videoForm.showVideoPath"
class="avatar video-avatar"
controls="controls"
2023-04-27 16:17:41 +08:00
>您的浏览器不支持视频播放</video>
<img style="width: 100%; height: 100%" v-if="previews.url" :src="previews.url" />
2022-11-16 13:21:48 +08:00
<div v-else></div>
2022-11-04 14:22:46 +08:00
</div>
2023-03-31 09:06:58 +08:00
<div
class="title"
2023-04-23 16:36:14 +08:00
v-if="
types != 'posterVideoUrl' &&
types != 'posterPictureUrl' &&
types != 'itemDirectoryUrl'
"
2023-04-27 16:17:41 +08:00
>请上传图片为800x800px的正方形</div>
2022-11-04 14:22:46 +08:00
</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>
2022-12-30 14:10:25 +08:00
<!-- <el-col :lg="{ span: 1, offset: 2 }" :md="2">
2022-11-04 14:22:46 +08:00
<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>
2023-03-31 09:06:58 +08:00
</el-col>-->
2023-04-27 15:54:48 +08:00
<el-col :lg="{ span: 2, offset: 19 }" :md="2">
2023-04-27 16:17:41 +08:00
<el-button v-if="uploadbtn" type="primary" size="small" @click="uploadImg()"> </el-button>
<el-button v-else :loading="!uploadbtn" type="primary" size="small"> ...</el-button>
2022-11-04 14:22:46 +08:00
</el-col>
</el-row>
</el-dialog>
</div>
</template>
<script>
import { VueCropper } from "vue-cropper";
import baseurl from "@/api/baseurl.js";
2023-02-15 09:03:08 +08:00
import {
updateNurseStationHeads,
posts,
2023-04-23 16:36:14 +08:00
uploadVideoUrl,
uploadTrainingCategoryPicture,
updatePoserHeads,
2023-04-27 16:17:41 +08:00
uploadUrl
2023-02-15 09:03:08 +08:00
} from "@/api/system/stationAvatar.js";
2022-11-04 14:22:46 +08:00
export default {
components: { VueCropper },
2023-02-15 16:00:47 +08:00
props: ["img", "type", "item", "tovideo"],
2022-11-04 14:22:46 +08:00
data() {
return {
2023-04-27 11:30:02 +08:00
uploadbtn: true, //上传中不允许点击
2022-11-04 14:22:46 +08:00
imageUrl: "",
types: "",
// 是否显示弹出层
openimg: false,
// 是否显示cropper
visible: false,
// 弹出层标题
2023-02-15 09:03:08 +08:00
title: "上传图片/视频",
2022-11-04 14:22:46 +08:00
options: {
img: null, //裁剪图片的地址
autoCrop: true, // 是否默认生成截图框
2022-11-16 13:21:48 +08:00
autoCropWidth: 300, // 默认生成截图框宽度
autoCropHeight: 300, // 默认生成截图框高度
2023-04-27 16:17:41 +08:00
fixedBox: true // 固定截图框大小 不允许改变
2022-11-04 14:22:46 +08:00
},
previews: {},
items: {},
2023-02-15 09:03:08 +08:00
//显示上传按钮
videoForm: {
2023-04-27 16:17:41 +08:00
showVideoPath: null //回显的变量
2023-02-15 09:03:08 +08:00
},
video: {
2023-04-27 16:17:41 +08:00
VideoPath: null //回显的变量
}
2022-11-04 14:22:46 +08:00
};
},
created() {
this.types = this.type;
this.items = this.item;
2023-02-15 16:09:16 +08:00
if (this.tovideo == null) {
this.video.VideoPath = null;
} else if (this.tovideo == "") {
this.video.VideoPath = null;
} else {
this.video.VideoPath = baseurl + this.tovideo;
}
2022-11-04 14:22:46 +08:00
if (this.img == null) {
this.options.img = null;
} else if (this.img == "") {
this.options.img = null;
} else {
this.options.img = baseurl + this.img;
}
2023-04-23 16:36:14 +08:00
if (this.types == "posterVideoUrl" || this.types == "itemDirectoryUrl") {
2023-02-15 09:03:08 +08:00
this.title = "上传视频";
} else {
this.title = "上传图片";
}
2022-11-04 14:22:46 +08:00
},
watch: {
2023-02-15 16:00:47 +08:00
tovideo: {
2023-04-27 16:17:41 +08:00
handler(newimg, oldimg) {}
2023-02-15 16:00:47 +08:00
},
2022-11-04 14:22:46 +08:00
item: {
handler(newimg, oldimg) {
this.items = this.item;
2023-04-27 16:17:41 +08:00
}
2022-11-04 14:22:46 +08:00
},
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;
}
2023-04-27 16:17:41 +08:00
}
2022-11-04 14:22:46 +08:00
},
type: {
handler(newimg, oldimg) {
this.types = this.type;
2023-04-27 16:17:41 +08:00
}
}
2022-11-04 14:22:46 +08:00
},
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) {
2023-04-23 16:36:14 +08:00
if (this.types == "posterVideoUrl" || this.types == "itemDirectoryUrl") {
2022-11-04 14:22:46 +08:00
const reader = new FileReader();
2022-11-16 13:21:48 +08:00
this.previews.data = file;
this.previews.url = URL.createObjectURL(file);
2023-02-15 09:03:08 +08:00
this.videoForm.showVideoPath = 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
};
2023-02-15 09:03:08 +08:00
} else {
if (file.type.indexOf("image/") == -1) {
this.$modal.msgError(
"文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。"
);
} else {
const reader = new FileReader();
this.previews.data = file;
this.previews.url = URL.createObjectURL(file);
reader.readAsDataURL(file);
reader.onload = () => {
// this.options.img = reader.result;
};
}
2022-11-04 14:22:46 +08:00
}
},
// 上传图片
uploadImg() {
2023-04-27 11:31:32 +08:00
this.uploadbtn = true;
2022-11-16 13:21:48 +08:00
let formData = new FormData();
2022-12-30 14:01:41 +08:00
if (this.previews.data) {
formData.append("file", this.previews.data);
formData.append("type", this.types);
2023-04-23 16:36:14 +08:00
if (this.types == "itemDirectoryUrl") {
2023-04-27 11:26:44 +08:00
this.$modal.msgSuccess("上传视频中,请耐心等待");
2023-04-27 11:30:02 +08:00
this.uploadbtn = false;
2023-04-27 16:17:41 +08:00
uploadVideoUrl(formData).then(response => {
2023-04-27 15:54:48 +08:00
if (response.code == 200) {
this.video.VideoPath = baseurl + response.imgUrl;
this.$emit("imgUrl", response.imgUrl);
this.items.itemDirectoryUrl = response.imgUrl;
this.$emit("item", JSON.stringify(this.items));
this.openimg = false;
} else {
this.$emit("item", "false");
2023-04-27 16:17:41 +08:00
setTimeout(e => {
2023-04-27 15:54:48 +08:00
this.openimg = false;
}, 1000);
}
2023-04-27 11:30:02 +08:00
this.uploadbtn = true;
2023-04-23 16:36:14 +08:00
});
} else if (
this.types == "trainingItemCoverUrl" ||
this.types == "trainingItemContentUrl" ||
this.types == "trainingItemPosterUrl"
) {
2023-04-27 16:17:41 +08:00
uploadUrl(formData).then(response => {
2023-04-23 16:36:14 +08:00
this.options.img = baseurl + response.imgUrl;
this.$emit("imgUrl", response.imgUrl);
this.openimg = false;
});
} else if (this.types == "trainingCategoryPictureUrl") {
2023-04-27 16:17:41 +08:00
uploadTrainingCategoryPicture(formData).then(response => {
2023-04-23 16:36:14 +08:00
this.options.img = baseurl + response.imgUrl;
this.$emit("imgUrl", response.imgUrl);
this.openimg = false;
});
} else if (this.types == "posterVideoUrl") {
2023-04-27 16:17:41 +08:00
updatePoserHeads(formData).then(response => {
2023-02-15 09:03:08 +08:00
this.video.VideoPath = baseurl + response.imgUrl;
this.$emit("imgUrl", response.imgUrl);
this.openimg = false;
});
} else {
2023-04-27 16:17:41 +08:00
updateNurseStationHeads(formData).then(response => {
2023-02-15 09:03:08 +08:00
this.options.img = baseurl + response.imgUrl;
this.$emit("imgUrl", response.imgUrl);
if (this.types == "attributePitureUrl") {
this.items.attributePitureUrl = response.imgUrl;
this.$emit("item", JSON.stringify(this.items));
}
if (this.types == "nurseItemClassifyUrl") {
this.items.classifyPictureUrl = response.imgUrl;
this.$emit("item", JSON.stringify(this.items));
}
if (this.types == "nurseStationClassifyUrl") {
this.items.classifyPictureUrl = response.imgUrl;
this.$emit("item", JSON.stringify(this.items));
}
if (this.types == "posterPictureUrl") {
2023-02-15 16:00:47 +08:00
this.items.posterPictureUrl = response.imgUrl;
2023-02-15 09:03:08 +08:00
this.$emit("item", JSON.stringify(this.items));
}
2023-03-31 09:06:58 +08:00
if (this.types == "certificateUrl") {
2023-02-28 14:03:45 +08:00
this.items.certificateUrl = response.imgUrl;
this.$emit("item", JSON.stringify(this.items));
2023-03-13 10:16:25 +08:00
}
2023-03-31 09:06:58 +08:00
if (this.types == "personCertificateUrl") {
this.items.certificateUrl = response.imgUrl;
2023-03-13 10:16:25 +08:00
this.$emit("item", JSON.stringify(this.items));
2023-02-28 14:03:45 +08:00
}
2023-02-15 09:03:08 +08:00
this.openimg = false;
});
}
2022-12-30 14:01:41 +08:00
} else {
2022-11-16 13:21:48 +08:00
this.openimg = false;
2022-12-30 14:01:41 +08:00
}
2023-04-27 16:42:22 +08:00
this.videoForm.showVideoPath = null;
this.previews.data = null;
2022-11-04 14:22:46 +08:00
},
// 实时预览
realTime(data) {
this.previews = data;
},
// 关闭窗口
closeDialog() {
this.imgs = "";
this.visible = false;
2023-04-27 16:17:41 +08:00
}
}
2022-11-04 14:22:46 +08:00
};
</script>
<style scoped lang="scss">
2022-12-01 09:59:28 +08:00
.title {
position: absolute;
bottom: 5%;
left: 50%;
transform: translate(-50%, 0%);
}
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;
background: #fafafa;
2023-02-15 09:03:08 +08:00
width: 100px;
height: 100px;
2022-11-04 14:22:46 +08:00
}
.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%;
}
2023-02-15 09:03:08 +08:00
.wihi {
2023-02-15 17:28:52 +08:00
background-color: #fff;
2023-02-15 09:03:08 +08:00
width: 100px;
height: 100px;
}
.wihi:hover:after {
transform: translate(50%, 50%);
}
2022-12-01 09:59:28 +08:00
</style>