committed by
Gitee
2 changed files with 459 additions and 445 deletions
@ -1,273 +1,274 @@ |
|||
/** |
|||
* 通用css样式布局处理 |
|||
* Copyright (c) 2019 ruoyi |
|||
*/ |
|||
|
|||
/** 基础通用 **/ |
|||
.pt5 { |
|||
padding-top: 5px; |
|||
} |
|||
.pr5 { |
|||
padding-right: 5px; |
|||
} |
|||
.pb5 { |
|||
padding-bottom: 5px; |
|||
} |
|||
.mt5 { |
|||
margin-top: 5px; |
|||
} |
|||
.mr5 { |
|||
margin-right: 5px; |
|||
} |
|||
.mb5 { |
|||
margin-bottom: 5px; |
|||
} |
|||
.mb8 { |
|||
margin-bottom: 8px; |
|||
} |
|||
.ml5 { |
|||
margin-left: 5px; |
|||
} |
|||
.mt10 { |
|||
margin-top: 10px; |
|||
} |
|||
.mr10 { |
|||
margin-right: 10px; |
|||
} |
|||
.mb10 { |
|||
margin-bottom: 10px; |
|||
} |
|||
.ml10 { |
|||
margin-left: 10px; |
|||
} |
|||
.mt20 { |
|||
margin-top: 20px; |
|||
} |
|||
.mr20 { |
|||
margin-right: 20px; |
|||
} |
|||
.mb20 { |
|||
margin-bottom: 20px; |
|||
} |
|||
.ml20 { |
|||
margin-left: 20px; |
|||
} |
|||
|
|||
.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { |
|||
font-family: inherit; |
|||
font-weight: 500; |
|||
line-height: 1.1; |
|||
color: inherit; |
|||
} |
|||
|
|||
.el-dialog:not(.is-fullscreen) { |
|||
margin-top: 6vh !important; |
|||
} |
|||
|
|||
.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { |
|||
overflow: auto; |
|||
overflow-x: hidden; |
|||
max-height: 70vh; |
|||
padding: 10px 20px 0; |
|||
} |
|||
|
|||
.el-table { |
|||
.el-table__header-wrapper, .el-table__fixed-header-wrapper { |
|||
th { |
|||
word-break: break-word; |
|||
background-color: #f8f8f9; |
|||
color: #515a6e; |
|||
height: 40px; |
|||
font-size: 13px; |
|||
} |
|||
} |
|||
.el-table__body-wrapper { |
|||
.el-button [class*="el-icon-"] + span { |
|||
margin-left: 1px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** 表单布局 **/ |
|||
.form-header { |
|||
font-size:15px; |
|||
color:#6379bb; |
|||
border-bottom:1px solid #ddd; |
|||
margin:8px 10px 25px 10px; |
|||
padding-bottom:5px |
|||
} |
|||
|
|||
/** 表格布局 **/ |
|||
.pagination-container { |
|||
position: relative; |
|||
height: 25px; |
|||
margin-bottom: 10px; |
|||
margin-top: 15px; |
|||
padding: 10px 20px !important; |
|||
} |
|||
|
|||
/* tree border */ |
|||
.tree-border { |
|||
margin-top: 5px; |
|||
border: 1px solid #e5e6e7; |
|||
background: #FFFFFF none; |
|||
border-radius:4px; |
|||
} |
|||
|
|||
.pagination-container .el-pagination { |
|||
right: 0; |
|||
position: absolute; |
|||
} |
|||
|
|||
@media ( max-width : 768px) { |
|||
.pagination-container .el-pagination > .el-pagination__jump { |
|||
display: none !important; |
|||
} |
|||
.pagination-container .el-pagination > .el-pagination__sizes { |
|||
display: none !important; |
|||
} |
|||
} |
|||
|
|||
.el-table .fixed-width .el-button--mini { |
|||
padding-left: 0; |
|||
padding-right: 0; |
|||
width: inherit; |
|||
} |
|||
|
|||
/** 表格更多操作下拉样式 */ |
|||
.el-table .el-dropdown-link { |
|||
cursor: pointer; |
|||
color: #409EFF; |
|||
margin-left: 5px; |
|||
} |
|||
|
|||
.el-table .el-dropdown, .el-icon-arrow-down { |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.el-tree-node__content > .el-checkbox { |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.list-group-striped > .list-group-item { |
|||
border-left: 0; |
|||
border-right: 0; |
|||
border-radius: 0; |
|||
padding-left: 0; |
|||
padding-right: 0; |
|||
} |
|||
|
|||
.list-group { |
|||
padding-left: 0px; |
|||
list-style: none; |
|||
} |
|||
|
|||
.list-group-item { |
|||
border-bottom: 1px solid #e7eaec; |
|||
border-top: 1px solid #e7eaec; |
|||
margin-bottom: -1px; |
|||
padding: 11px 0px; |
|||
font-size: 13px; |
|||
} |
|||
|
|||
.pull-right { |
|||
float: right !important; |
|||
} |
|||
|
|||
.el-card__header { |
|||
padding: 14px 15px 7px; |
|||
min-height: 40px; |
|||
} |
|||
|
|||
.el-card__body { |
|||
padding: 15px 20px 20px 20px; |
|||
} |
|||
|
|||
.card-box { |
|||
padding-right: 15px; |
|||
padding-left: 15px; |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
/* button color */ |
|||
.el-button--cyan.is-active, |
|||
.el-button--cyan:active { |
|||
background: #20B2AA; |
|||
border-color: #20B2AA; |
|||
color: #FFFFFF; |
|||
} |
|||
|
|||
.el-button--cyan:focus, |
|||
.el-button--cyan:hover { |
|||
background: #48D1CC; |
|||
border-color: #48D1CC; |
|||
color: #FFFFFF; |
|||
} |
|||
|
|||
.el-button--cyan { |
|||
background-color: #20B2AA; |
|||
border-color: #20B2AA; |
|||
color: #FFFFFF; |
|||
} |
|||
|
|||
/* text color */ |
|||
.text-navy { |
|||
color: #1ab394; |
|||
} |
|||
|
|||
.text-primary { |
|||
color: inherit; |
|||
} |
|||
|
|||
.text-success { |
|||
color: #1c84c6; |
|||
} |
|||
|
|||
.text-info { |
|||
color: #23c6c8; |
|||
} |
|||
|
|||
.text-warning { |
|||
color: #f8ac59; |
|||
} |
|||
|
|||
.text-danger { |
|||
color: #ed5565; |
|||
} |
|||
|
|||
.text-muted { |
|||
color: #888888; |
|||
} |
|||
|
|||
/* image */ |
|||
.img-circle { |
|||
border-radius: 50%; |
|||
} |
|||
|
|||
.img-lg { |
|||
width: 120px; |
|||
height: 120px; |
|||
} |
|||
|
|||
.avatar-upload-preview { |
|||
position: absolute; |
|||
top: 50%; |
|||
transform: translate(50%, -50%); |
|||
width: 200px; |
|||
height: 200px; |
|||
border-radius: 50%; |
|||
box-shadow: 0 0 4px #ccc; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
/* 拖拽列样式 */ |
|||
.sortable-ghost{ |
|||
opacity: .8; |
|||
color: #fff!important; |
|||
background: #42b983!important; |
|||
} |
|||
|
|||
.top-right-btn { |
|||
position: relative; |
|||
float: right; |
|||
} |
|||
/** |
|||
* 通用css样式布局处理 |
|||
* Copyright (c) 2019 ruoyi |
|||
*/ |
|||
|
|||
/** 基础通用 **/ |
|||
.pt5 { |
|||
padding-top: 5px; |
|||
} |
|||
.pr5 { |
|||
padding-right: 5px; |
|||
} |
|||
.pb5 { |
|||
padding-bottom: 5px; |
|||
} |
|||
.mt5 { |
|||
margin-top: 5px; |
|||
} |
|||
.mr5 { |
|||
margin-right: 5px; |
|||
} |
|||
.mb5 { |
|||
margin-bottom: 5px; |
|||
} |
|||
.mb8 { |
|||
margin-bottom: 8px; |
|||
} |
|||
.ml5 { |
|||
margin-left: 5px; |
|||
} |
|||
.mt10 { |
|||
margin-top: 10px; |
|||
} |
|||
.mr10 { |
|||
margin-right: 10px; |
|||
} |
|||
.mb10 { |
|||
margin-bottom: 10px; |
|||
} |
|||
.ml10 { |
|||
margin-left: 10px; |
|||
} |
|||
.mt20 { |
|||
margin-top: 20px; |
|||
} |
|||
.mr20 { |
|||
margin-right: 20px; |
|||
} |
|||
.mb20 { |
|||
margin-bottom: 20px; |
|||
} |
|||
.ml20 { |
|||
margin-left: 20px; |
|||
} |
|||
|
|||
.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { |
|||
font-family: inherit; |
|||
font-weight: 500; |
|||
line-height: 1.1; |
|||
color: inherit; |
|||
} |
|||
|
|||
.el-dialog:not(.is-fullscreen) { |
|||
margin-top: 6vh !important; |
|||
} |
|||
|
|||
.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { |
|||
overflow: auto; |
|||
overflow-x: hidden; |
|||
max-height: 70vh; |
|||
padding: 10px 20px 0; |
|||
} |
|||
|
|||
.el-table { |
|||
.el-table__header-wrapper, .el-table__fixed-header-wrapper { |
|||
th { |
|||
word-break: break-word; |
|||
background-color: #f8f8f9; |
|||
color: #515a6e; |
|||
height: 40px; |
|||
font-size: 13px; |
|||
} |
|||
} |
|||
.el-table__body-wrapper { |
|||
.el-button [class*="el-icon-"] + span { |
|||
margin-left: 1px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** 表单布局 **/ |
|||
.form-header { |
|||
font-size:15px; |
|||
color:#6379bb; |
|||
border-bottom:1px solid #ddd; |
|||
margin:8px 10px 25px 10px; |
|||
padding-bottom:5px |
|||
} |
|||
|
|||
/** 表格布局 **/ |
|||
.pagination-container { |
|||
position: relative; |
|||
height: 25px; |
|||
margin-bottom: 10px; |
|||
margin-top: 15px; |
|||
padding: 10px 20px !important; |
|||
} |
|||
|
|||
/* tree border */ |
|||
.tree-border { |
|||
margin-top: 5px; |
|||
border: 1px solid #e5e6e7; |
|||
background: #FFFFFF none; |
|||
border-radius:4px; |
|||
} |
|||
|
|||
.pagination-container .el-pagination { |
|||
right: 0; |
|||
position: absolute; |
|||
} |
|||
|
|||
@media ( max-width : 768px) { |
|||
.pagination-container .el-pagination > .el-pagination__jump { |
|||
display: none !important; |
|||
} |
|||
.pagination-container .el-pagination > .el-pagination__sizes { |
|||
display: none !important; |
|||
} |
|||
} |
|||
|
|||
.el-table .fixed-width .el-button--mini { |
|||
padding-left: 0; |
|||
padding-right: 0; |
|||
width: inherit; |
|||
} |
|||
|
|||
/** 表格更多操作下拉样式 */ |
|||
.el-table .el-dropdown-link { |
|||
cursor: pointer; |
|||
color: #409EFF; |
|||
margin-left: 5px; |
|||
} |
|||
|
|||
.el-table .el-dropdown, .el-icon-arrow-down { |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.el-tree-node__content > .el-checkbox { |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.list-group-striped > .list-group-item { |
|||
border-left: 0; |
|||
border-right: 0; |
|||
border-radius: 0; |
|||
padding-left: 0; |
|||
padding-right: 0; |
|||
} |
|||
|
|||
.list-group { |
|||
padding-left: 0px; |
|||
list-style: none; |
|||
} |
|||
|
|||
.list-group-item { |
|||
border-bottom: 1px solid #e7eaec; |
|||
border-top: 1px solid #e7eaec; |
|||
margin-bottom: -1px; |
|||
padding: 11px 0px; |
|||
font-size: 13px; |
|||
} |
|||
|
|||
.pull-right { |
|||
float: right !important; |
|||
} |
|||
|
|||
.el-card__header { |
|||
padding: 14px 15px 7px; |
|||
min-height: 40px; |
|||
} |
|||
|
|||
.el-card__body { |
|||
padding: 15px 20px 20px 20px; |
|||
} |
|||
|
|||
.card-box { |
|||
padding-right: 15px; |
|||
padding-left: 15px; |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
/* button color */ |
|||
.el-button--cyan.is-active, |
|||
.el-button--cyan:active { |
|||
background: #20B2AA; |
|||
border-color: #20B2AA; |
|||
color: #FFFFFF; |
|||
} |
|||
|
|||
.el-button--cyan:focus, |
|||
.el-button--cyan:hover { |
|||
background: #48D1CC; |
|||
border-color: #48D1CC; |
|||
color: #FFFFFF; |
|||
} |
|||
|
|||
.el-button--cyan { |
|||
background-color: #20B2AA; |
|||
border-color: #20B2AA; |
|||
color: #FFFFFF; |
|||
} |
|||
|
|||
/* text color */ |
|||
.text-navy { |
|||
color: #1ab394; |
|||
} |
|||
|
|||
.text-primary { |
|||
color: inherit; |
|||
} |
|||
|
|||
.text-success { |
|||
color: #1c84c6; |
|||
} |
|||
|
|||
.text-info { |
|||
color: #23c6c8; |
|||
} |
|||
|
|||
.text-warning { |
|||
color: #f8ac59; |
|||
} |
|||
|
|||
.text-danger { |
|||
color: #ed5565; |
|||
} |
|||
|
|||
.text-muted { |
|||
color: #888888; |
|||
} |
|||
|
|||
/* image */ |
|||
.img-circle { |
|||
border-radius: 50%; |
|||
} |
|||
|
|||
.img-lg { |
|||
width: 120px; |
|||
height: 120px; |
|||
} |
|||
|
|||
.avatar-upload-preview { |
|||
position: relative; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
width: 200px; |
|||
height: 200px; |
|||
border-radius: 50%; |
|||
box-shadow: 0 0 4px #ccc; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
/* 拖拽列样式 */ |
|||
.sortable-ghost{ |
|||
opacity: .8; |
|||
color: #fff!important; |
|||
background: #42b983!important; |
|||
} |
|||
|
|||
.top-right-btn { |
|||
position: relative; |
|||
float: right; |
|||
} |
|||
|
@ -1,172 +1,185 @@ |
|||
<template> |
|||
<div> |
|||
<div class="user-info-head" @click="editCropper()"><img v-bind:src="options.img" title="点击上传头像" class="img-circle img-lg" /></div> |
|||
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog"> |
|||
<el-row> |
|||
<el-col :xs="24" :md="12" :style="{height: '350px'}"> |
|||
<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"> |
|||
<img :src="previews.url" :style="previews.img" /> |
|||
</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 store from "@/store"; |
|||
import { VueCropper } from "vue-cropper"; |
|||
import { uploadAvatar } from "@/api/system/user"; |
|||
|
|||
export default { |
|||
components: { VueCropper }, |
|||
props: { |
|||
user: { |
|||
type: Object |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
// 是否显示弹出层 |
|||
open: false, |
|||
// 是否显示cropper |
|||
visible: false, |
|||
// 弹出层标题 |
|||
title: "修改头像", |
|||
options: { |
|||
img: store.getters.avatar, //裁剪图片的地址 |
|||
autoCrop: true, // 是否默认生成截图框 |
|||
autoCropWidth: 200, // 默认生成截图框宽度 |
|||
autoCropHeight: 200, // 默认生成截图框高度 |
|||
fixedBox: true // 固定截图框大小 不允许改变 |
|||
}, |
|||
previews: {} |
|||
}; |
|||
}, |
|||
methods: { |
|||
// 编辑头像 |
|||
editCropper() { |
|||
this.open = 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(); |
|||
reader.readAsDataURL(file); |
|||
reader.onload = () => { |
|||
this.options.img = reader.result; |
|||
}; |
|||
} |
|||
}, |
|||
// 上传图片 |
|||
uploadImg() { |
|||
this.$refs.cropper.getCropBlob(data => { |
|||
let formData = new FormData(); |
|||
formData.append("avatarfile", data); |
|||
uploadAvatar(formData).then(response => { |
|||
this.open = false; |
|||
this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl; |
|||
store.commit('SET_AVATAR', this.options.img); |
|||
this.$modal.msgSuccess("修改成功"); |
|||
this.visible = false; |
|||
}); |
|||
}); |
|||
}, |
|||
// 实时预览 |
|||
realTime(data) { |
|||
this.previews = data; |
|||
}, |
|||
// 关闭窗口 |
|||
closeDialog() { |
|||
this.options.img = store.getters.avatar |
|||
this.visible = false; |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
<style scoped lang="scss"> |
|||
.user-info-head { |
|||
position: relative; |
|||
display: inline-block; |
|||
height: 120px; |
|||
} |
|||
|
|||
.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> |
|||
<template> |
|||
<div> |
|||
<div class="user-info-head" @click="editCropper()"><img v-bind:src="options.img" title="点击上传头像" class="img-circle img-lg" /></div> |
|||
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog"> |
|||
<el-row> |
|||
<el-col :xs="24" :md="12" :style="{height: '350px'}"> |
|||
<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"> |
|||
<img :src="previews.url" :style="previews.img" /> |
|||
</div> |
|||
</el-col> |
|||
</el-row> |
|||
<br /> |
|||
<el-row> |
|||
<el-col :lg="2" :sm="3" :xs="3"> |
|||
<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}" :sm="2" :xs="2"> |
|||
<el-button icon="el-icon-plus" size="small" @click="changeScale(1)"></el-button> |
|||
</el-col> |
|||
<el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"> |
|||
<el-button icon="el-icon-minus" size="small" @click="changeScale(-1)"></el-button> |
|||
</el-col> |
|||
<el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"> |
|||
<el-button icon="el-icon-refresh-left" size="small" @click="rotateLeft()"></el-button> |
|||
</el-col> |
|||
<el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"> |
|||
<el-button icon="el-icon-refresh-right" size="small" @click="rotateRight()"></el-button> |
|||
</el-col> |
|||
<el-col :lg="{span: 2, offset: 6}" :sm="2" :xs="2"> |
|||
<el-button type="primary" size="small" @click="uploadImg()">提 交</el-button> |
|||
</el-col> |
|||
</el-row> |
|||
</el-dialog> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import store from "@/store"; |
|||
import { VueCropper } from "vue-cropper"; |
|||
import { uploadAvatar } from "@/api/system/user"; |
|||
import { debounce } from '@/utils' |
|||
|
|||
export default { |
|||
components: { VueCropper }, |
|||
props: { |
|||
user: { |
|||
type: Object |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
// 是否显示弹出层 |
|||
open: false, |
|||
// 是否显示cropper |
|||
visible: false, |
|||
// 弹出层标题 |
|||
title: "修改头像", |
|||
options: { |
|||
img: store.getters.avatar, //裁剪图片的地址 |
|||
autoCrop: true, // 是否默认生成截图框 |
|||
autoCropWidth: 200, // 默认生成截图框宽度 |
|||
autoCropHeight: 200, // 默认生成截图框高度 |
|||
fixedBox: true // 固定截图框大小 不允许改变 |
|||
}, |
|||
previews: {}, |
|||
resizeHandler: null |
|||
}; |
|||
}, |
|||
methods: { |
|||
// 编辑头像 |
|||
editCropper() { |
|||
this.open = true; |
|||
}, |
|||
// 打开弹出层结束时的回调 |
|||
modalOpened() { |
|||
this.visible = true; |
|||
if (!this.resizeHandler) { |
|||
this.resizeHandler = debounce(() => { |
|||
this.refresh() |
|||
}, 100) |
|||
} |
|||
window.addEventListener("resize", this.resizeHandler) |
|||
}, |
|||
// 刷新组件 |
|||
refresh() { |
|||
this.$refs.cropper.refresh(); |
|||
}, |
|||
// 覆盖默认的上传行为 |
|||
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(); |
|||
reader.readAsDataURL(file); |
|||
reader.onload = () => { |
|||
this.options.img = reader.result; |
|||
}; |
|||
} |
|||
}, |
|||
// 上传图片 |
|||
uploadImg() { |
|||
this.$refs.cropper.getCropBlob(data => { |
|||
let formData = new FormData(); |
|||
formData.append("avatarfile", data); |
|||
uploadAvatar(formData).then(response => { |
|||
this.open = false; |
|||
this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl; |
|||
store.commit('SET_AVATAR', this.options.img); |
|||
this.$modal.msgSuccess("修改成功"); |
|||
this.visible = false; |
|||
}); |
|||
}); |
|||
}, |
|||
// 实时预览 |
|||
realTime(data) { |
|||
this.previews = data; |
|||
}, |
|||
// 关闭窗口 |
|||
closeDialog() { |
|||
this.options.img = store.getters.avatar |
|||
this.visible = false; |
|||
window.removeEventListener("resize", this.resizeHandler) |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
<style scoped lang="scss"> |
|||
.user-info-head { |
|||
position: relative; |
|||
display: inline-block; |
|||
height: 120px; |
|||
} |
|||
|
|||
.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> |
|||
|
Loading…
Reference in new issue