Files
learning-system-portal/src/views/user/Setting.vue
2022-10-12 14:55:01 +08:00

535 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="personSetting">
<el-button type="text" class="passWard-btn" @click="openPassword"><svg-icon icon-class="passWard-edit" style="margin-right: 10px;font-size: 22px;"></svg-icon>修改密码</el-button>
<div class="avatar" @click="openAvatar">
<el-avatar :src="avatar" :size="116" alt=""></el-avatar>
<!-- <span>{{userInfo.name}}</span> -->
<!-- <el-button type="primary" @click="openAvatar">修改头像</el-button> -->
</div>
<!-- <el-form :model="form" label-position="right" label-width="80px"> -->
<div class="informationItem">
<div class="information-header">
<h4>基础信息</h4>
</div>
<ul class="base-info">
<li><label class="label" style="width:32px">姓名</label><span class="info-text">{{form.name}}</span></li>
<li><label class="label">性别</label><span class="info-text">{{form.gender == 1?'男':'女'}}</span></li>
<li><label class="label">所属部门</label><span class="info-text">{{form.departName}}</span></li>
</ul>
<ul class="base-info">
<li><label class="label" style="width:32px">生日</label><span class="info-text">{{form.birthday}}</span></li>
<li><label class="label">手机号</label><span class="info-text">{{form.account.mobile}}</span></li>
<li><label class="label">邮箱</label><span class="info-text">{{form.account.email}}</span></li>
</ul>
</div>
<div class="informationItem">
<div class="information-header">
<h4>个人签名</h4>
</div>
<div class="base-info">
<label class="label" style="width:70px;text-align: left;">我的签名</label>
<p class="info-text" style="width:540px" v-show="!signData.isEdit">{{form.sign}}</p>
<el-input v-show="signData.isEdit" style="width:40%;height:40px" type="textarea" v-model="signData.sign" :rows="1"></el-input>
<el-button v-show="signData.isEdit" style="margin-left:110px" @click="signData.isEdit = false">取消</el-button>
<el-button v-show="signData.isEdit" type="primary" @click="saveSign()">保存</el-button>
<el-button v-show="!signData.isEdit" style="margin-left:110px" type="primary" @click="signData.isEdit = true">编辑</el-button>
</div>
</div>
<div class="informationItem">
<div class="information-header">
<h4>动态可见范围</h4>
</div>
<div class="dynamic-range">
<el-radio v-model="form.dynamic" :label="1">全部动态</el-radio>
<el-radio v-model="form.dynamic" :label="2">最近半年动态</el-radio>
<el-radio v-model="form.dynamic" :label="3">最近三个月动态</el-radio>
<!-- <el-button v-show="dynamicData.isEdit" style="margin-left:110px" @click="dynamicData.isEdit = false">取消</el-button> -->
<el-button style="margin-left:110px" type="primary" @click="saveDynamic()">保存</el-button>
<!-- <el-button v-show="!dynamicData.isEdit" style="margin-left:110px" type="primary" @click="dynamicData.isEdit = true">编辑</el-button> -->
</div>
</div>
<h4>兴趣爱好</h4>
<div class="interest" v-show="!interestIsEdit">
<ul class="interest-ul">
<li class="interest-li" v-for="int in interestList" :key="int.id">{{int.name}}</li>
</ul>
</div>
<div v-show="interestIsEdit">
<div class="interest" v-for="(sys,index) in sysTypeListMap" :key="sys.id">
<span class="interest-title">{{sys.name}}</span>
<div style="width:100%">
<el-checkbox-group v-model="checkboxGroup" v-if="sys.children.length > 0">
<el-checkbox size="medium" border v-for="ch in sys.children" :label="ch.id" :key="ch.id">{{ch.name}}</el-checkbox>
</el-checkbox-group>
</div>
</div>
</div>
<div style="text-align: center;margin-top:56px">
<el-button v-show="interestIsEdit" @click="interestIsEdit = false">取消</el-button>
<el-button v-show="interestIsEdit" type="primary" @click="saveHobby()">保存</el-button>
<el-button v-show="!interestIsEdit" type="primary" @click="interestIsEdit = true">编辑</el-button>
</div>
<!-- </div> -->
<!-- </el-form> -->
<el-dialog
title="上传头像"
:visible.sync="dialogVisibleAvatar"
:close-on-click-modal="false"
center
width="30%"
custom-class="g-dialog">
<div>
<p>图片尺寸建议在宽100px,高100px</p>
<p>图片大小不超过500KB</p>
<p>图片类型.jpg.gif.png.jpeg.bmp</p>
<imageUpload width="240px" height="240px" :value="avatarUrl" fileSizeLimit="500KB" :compress="0.7" :compressAccurately="20" @success="handleUploadSuccess" @remove="removeHandle"></imageUpload>
<div class="dialog-btn">
<el-button type="primary" @click="updateAvatar">确定</el-button>
<el-button @click="dialogVisibleAvatar=false">取消</el-button>
</div>
</div>
</el-dialog>
<el-dialog
title="设置密码"
:visible.sync="dialogVisiblePassword"
:close-on-click-modal="false"
center
width="30%"
custom-class="g-dialog">
<el-form ref="form" :model="passwordForm" :rules="rules" status-icon label-position="right" label-width="80px">
<p>规则密码由8-16位大写字母小写字母数字或符号</p>
<p>任意三种的组合密码不能单独使用字母数字或符号</p>
<el-form-item style="margin-top: 22px" label="旧密码">
<el-input show-password type="password" placeholder="请输入旧密码" v-model="passwordForm.oldPass"></el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPass">
<el-input show-password type="password" placeholder="请输入新密码" v-model="passwordForm.newPass"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="confirmPass">
<el-input show-password type="password" placeholder="请再次确认新密码" v-model="passwordForm.confirmPass"></el-input>
</el-form-item>
<div class="dialog-btn">
<el-button type="primary" @click="updatePassword">提交</el-button>
<el-button @click="dialogVisiblePassword=false">取消</el-button>
</div>
</el-form>
</el-dialog>
</div>
</template>
<script>
import { mapGetters, mapActions } from 'vuex';
import userApi from "@/api/system/user";
import accountApi from "@/api/account";
import apiPassword from '@/api/boe/login.js'
import imageUpload from '@/components/ImageUpload/index.vue';
import apiUserhobby from "@/api/phase2/userhobby.js"
const cityOptions = ['上海', '北京', '广州', '深圳'];
export default{
components:{imageUpload},
data(){
var testPassword =/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{8,16}$/;
var validatePass = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入旧密码'));
} else if(!testPassword.test(value)){
callback(new Error('请输入由8-16位大写字母、小写字母、数字或符号任意三种的组合密码'));
}else{
if (this.passwordForm.newPass !== '') {
this.$refs.form.validateField('newPass');
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入新密码'));
} else if(!testPassword.test(value)){
callback(new Error('请输入由8-16位大写字母、小写字母、数字或符号任意三种的组合密码'));
} else {
if (this.passwordForm.confirmPass !== '') {
this.$refs.form.validateField('confirmPass');
}
callback();
}
};
var validatePass3 = (rule, value, callback) => {
if (!value) {
callback(new Error('请再次输入新密码'));
} else if(!testPassword.test(value)){
callback(new Error('请输入由8-16位大写字母、小写字母、数字或符号任意三种的组合密码'));
} else if(value!=this.passwordForm.newPass){
callback(new Error('新密码和再次确认密码不一致!'));
}else{
callback();
}
};
return {
signData:{
sign:'',
isEdit:false
},
cities: cityOptions,
checkboxGroup: [],
radio: '1',
form:{
account:{}
},
dialogVisibleAvatar:false,
dialogVisiblePassword:false,
avatarUrl:'',
passwordForm:{},
rules:{
newPass: [
{ validator: validatePass2, trigger: 'blur' }
],
confirmPass: [
{ validator: validatePass3, trigger: 'blur' }
]
},
sysTypeListMap:[],
interestList:[],//已有兴趣爱好列表
interestIsEdit:false,
}
},
computed: {
...mapGetters(['userInfo','sysTypeMap']),
avatar(){
if(this.userInfo.avatar){
if(this.userInfo.avatar.indexOf('http')==-1){
return this.baseUrl+this.userInfo.avatar
}else{
return this.userInfo.avatar
}
}else{
if(this.userInfo.sex==2){
return this.webBaseUrl + '/images/Avatarwoman.png'
}else{
return this.webBaseUrl + '/images/Avatarman.png'
}
}
}
},
watch:{
dialogVisiblePassword(val) {
if(!val) {
this.passwordForm={};
}
}
},
mounted(){
if(this.userInfo.avatar){
this.avatarUrl = this.avatar;
}
this.load();
this.getInfo();
this.getSysTypeTree().then(rs => {
this.sysTypeListMap = rs;
});
},
methods:{
saveDynamic() {
userApi.updateDynamic(this.form.dynamic).then(res=>{
if(res.status == 200) {
this.$message.success('修改动态可见范围成功');
}
})
},
saveSign() {
userApi.updateSign(this.signData.sign).then(res=>{
if(res.status == 200){
this.$message.success('我的签名修改成功');
this.form.sign = this.signData.sign;
this.signData.isEdit = false;
}
})
},
getInfo() { //获取用户兴趣关联的id
this.checkboxGroup = [];
apiUserhobby.info(this.userInfo.aid).then(res=>{
if(res.status == 200) {
res.result.forEach(item=>{
this.checkboxGroup.push(item.refId);
item.name = this.sysTypeName(item.refId)
})
this.interestList = res.result;
}
})
},
sysTypeName(code){
if(code==''){return '';}
return this.sysTypeMap.get(code);
},
saveHobby(){
let data = []
if(this.checkboxGroup.length == 0) {
this.$message.error('请选择爱好!')
return
}
this.checkboxGroup.forEach(item=>{
data.push({
type:1,
refId:item
})
})
apiUserhobby.update(data).then(res=>{
if(res.status == 200) {
this.interestIsEdit = false;
this.getInfo();
this.$message.success('更改成功!')
} else {
this.$message.error("更改失败!")
}
})
},
...mapActions({
getResOwnerTree: 'resOwner/getResOwnerTree',
loadResOwners: 'resOwner/loadResOwners',
getSysTypeTree: 'sysType/getSysTypeTree',
loadSysTypes: 'sysType/loadSysTypes'
}),
load(){
userApi.detail(this.userInfo.aid).then(res=>{
if(res.status==200){
this.form=res.result;
this.signData.sign = res.result.sign;
if(res.result.dynamic == '') {
this.form.dynamic = 0;
}
}
});
},
openAvatar(){
this.dialogVisibleAvatar=true
},
openPassword(){
this.dialogVisiblePassword=true
},
handleUploadSuccess(res){
this.form.account.avatar = res.result.filePath;
this.avatarUrl= res.result.httpPath;
},
removeHandle(){
this.avatarUrl='';
this.form.account.avatar = '';
},
updateAvatar(){
// if(!this.avatarUrl){
// return this.$message.error('请上传图片')
// }
accountApi.updateAvatar({id:this.form.id,avatar:this.form.account.avatar}).then(res=>{
if(res.status==200){
this.$store.dispatch('InitData');
this.$message.success("保存图片成功")
this.dialogVisibleAvatar=false;
}else{
this.$message.error("保存图片失败")
}
})
},
updatePassword(){
this.$refs.form.validate((valid) => {
if (valid) {
apiPassword.modifyPassword({oldPassword:this.passwordForm.oldPass,newPassword:this.passwordForm.newPass,confirmPassword:this.passwordForm.confirmPass}).then(res=>{
if(res.status==200){
this.$message.success('修改密码成功')
this.dialogVisiblePassword = false;
}else{
this.$message.error(res.message);
}
})
} else {
return false;
}
});
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-checkbox-button--medium .el-checkbox-button__inner{
// padding: 10px 40px !important;
width: 146px;
height: 44px;
line-height: 24px;
}
::v-deep .el-checkbox-button.is-checked .el-checkbox-button__inner {
background-color: rgba(0,0,0,0) !important;
color: #387DF8 !important;
}
::v-deep .el-checkbox-button.is-focus .el-checkbox-button__inner{
// border-color:#fff !important;
outline: none;
}
// ::v-deep .el-checkbox-button.is-focus{
// border-color:none !important;
// outline: none !important;
// }
::v-deep .el-checkbox-button:first-child .el-checkbox-button__inner{
border-left:none;
}
.el-checkbox-button, .el-checkbox-button__inner {
margin-right: 40px;
background: #FFFFFF;
border-radius: 4px;
box-shadow: none;
border-left: 1px solid rgba(151,151,151,0.3);
box-shadow: 1px 0 0 0 #fff;
}
.interest{
display: flex;
padding-left: 20px;
.interest-ul{
display: flex;
flex-wrap: wrap;
.interest-li{
width: 146px;
height: 44px;
text-align: center;
line-height: 44px;
font-size: 14px;
color: #333333;
border: 1px solid rgba($color: #979797, $alpha: 0.3);
border-radius: 4px;
margin-right: 44px;
margin-bottom: 22px;
}
}
.interest-title{
width: 70px;
margin-right: 17px;
color: #333333;
font-size: 14px;
margin-bottom: 20px;
}
::v-deep .el-checkbox__input{
display: none;
}
::v-deep .el-checkbox{
width: 146px;
height: 44px;
margin-bottom: 22px;
text-align: center;
line-height: 26px;
margin-left: 0px;
margin-right: 48px;
}
::v-deep .el-checkbox+.el-checkbox.is-bordered{
margin-left: 0px;
}
}
.dynamic-range{
span{
font-size: 14px;
color: #333333;
margin-right: 10px;
}
}
.depart{
font-size: 14px;
color: #999999;
}
::v-deep .el-radio-button:first-child .el-radio-button__inner {
border: none !important;
}
.personSetting{
background-color: #fff;
box-sizing: border-box;
// padding: 30px 0px 0px 247px;
padding: 30px 0 10% 20%;
// margin: 0 auto;
position: relative;
.avatar{
position: absolute;
left: 5%;
top:56px;
}
.passWard-btn{
position: absolute;
font-size: 16px;
top:45px;
right:45px;
}
::v-deep .el-radio-button__inner{
background: #F4F4F4 !important;
border-radius: 4px !important;
}
::v-deep .el-radio-button__orig-radio:checked+.el-radio-button__inner{
color: #FFF;
background-color: #387DF7 !important;
border-color: #387DF7;
box-shadow: -1px 0 0 0 #387DF7;
}
.informationItem{
min-width: 600px;
padding-right: 10%;
margin-bottom: 82px;
.information-header{
// display: flex;
// justify-content: space-between;
// align-items: center;
// padding: 10px 0;
margin-bottom: 35px;
}
.base-info{
margin: 0;
display: flex;
margin-bottom: 46px;
// flex-direction: row;
// flex-wrap: nowrap;
li{
width: 260px;
// flex-grow: 2;
}
.label{
display: inline-block;
font-size: 16px;
font-weight: 400;
color: #333333;
width: 64px;
margin-right: 20px;
text-align: right;
}
.info-text{
font-size: 14px;
color: #999999;
}
}
}
::v-deep .el-dialog{
.el-dialog__body{
display: flex;
justify-content: center;
align-items: center;
p{
line-height: 24px;
}
.component-upload-image{
margin: 20px 0;
}
.dialog-btn{
display: flex;
justify-content: space-evenly;
align-items: center;
.el-button{
width: 102px;
height: 36px;
}
}
.el-form-item{
margin-bottom: 36px;
}
}
}
}
</style>