django-vue-admin/web/src/layout/header-aside/components/header-user/userinfo.vue

300 lines
9.5 KiB
Vue

<!--
* @创建文件时间: 2021-07-26 23:08:16
* @Auther: 猿小天
* @最后修改人: 猿小天
* @最后修改时间: 2021-08-12 11:32:30
* 联系Qq:1638245306
* @文件介绍: 用户信息
-->
<template>
<d2-container class="page">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="用户设置" name="userInfo">
<el-row :gutter="20">
<el-col :span="10" :offset="6">
<el-form
ref="userInfoForm"
:model="userInfo"
required-asterisk
:rules="userInforules"
:label-position="position"
center
>
<el-form-item prop="avatar" required label="头像">
<el-upload
class="avatar-uploader"
list-type="picture-card"
:file-list="fileList"
:action="action"
:headers="headers"
:limit="1"
:disabled="fileList.length === 1"
:on-success="handleAvatarSuccess"
>
<!-- <el-image
v-if="userInfo.avatar"
:src="userInfo.avatar"
:preview-src-list="[userInfo.avatar]"
style="width: 100px; height: 100px"
alt="头像"
></el-image>
<i
v-else
class="el-icon-plus avatar-uploader-icon"
style="width: 100px; height: 100px"
></i> -->
<i class="el-icon-plus"></i>
</el-upload>
</el-form-item>
<el-form-item prop="name" required label="昵称">
<el-input v-model="userInfo.name" clearable></el-input>
</el-form-item>
<el-form-item label="电话号码" prop="mobile">
<el-input v-model="userInfo.mobile" clearable></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="userInfo.email" clearable></el-input>
</el-form-item>
<el-form-item label="性別" prop="gender">
<el-radio-group v-model="userInfo.gender">
<el-radio :label="1">男</el-radio>
<el-radio :label="0">女</el-radio>
<el-radio :label="-1">未知</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button @click="updateInfo" type="primary">
<i class="fa fa-check"></i>
更新
</el-button>
<el-button @click="resetForm('info')" type="info">
<i class="fa fa-reply-all"></i>
重置
</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-tab-pane>
<el-tab-pane label="密码设置" name="passwrod">
<el-row :gutter="20">
<el-col :span="10" :offset="6">
<el-form
ref="userPasswordForm"
:model="userPasswordInfo"
required-asterisk
:label-position="position"
:rules="passwordRules"
center
>
<el-form-item label="原密码" required prop="oldPassword">
<el-input
v-model="userPasswordInfo.oldPassword"
clearable
></el-input>
</el-form-item>
<el-form-item required prop="newPassword" label="新密码">
<el-input
type="password"
v-model="userPasswordInfo.newPassword"
clearable
></el-input>
</el-form-item>
<el-form-item required prop="newPassword2" label="确认密码">
<el-input
type="password"
v-model="userPasswordInfo.newPassword2"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="settingPassword">
<i class="fa fa-check"></i>提交
</el-button>
<el-button @click="resetForm('passwordForm')" type="info">
<i class="fa fa-reply-all"></i>
</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</d2-container>
</template>
<script>
import util from "@/libs/util.js";
import { request } from "@/api/service";
import { mapActions } from "vuex";
export default {
name: "userInfo",
data() {
var validatePass = (rule, value, callback) => {
const pwdRegex = new RegExp("(?=.*[0-9])(?=.*[a-zA-Z]).{8,30}");
if (value === "") {
callback(new Error("请输入密码"));
} else if (value === this.userPasswordInfo.oldPassword) {
callback(new Error("原密码与新密码一致"));
} else if (!pwdRegex.test(value)) {
callback(new Error("您的密码复杂度太低(密码中必须包含字母、数字)"));
} else {
if (this.userPasswordInfo.newPassword2 !== "") {
this.$refs.userPasswordForm.validateField("newPassword2");
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === "") {
callback(new Error("请再次输入密码"));
} else if (value !== this.userPasswordInfo.newPassword) {
callback(new Error("两次输入密码不一致!"));
} else {
callback();
}
};
return {
position: "left",
activeName: "userInfo",
action: util.baseURL() + "api/system/file/",
headers: {
Authorization: "JWT " + util.cookies.get("token"),
},
fileList: [],
userInfo: {
name: "",
gender: "",
mobile: "",
avatar: "",
email: "",
},
userInforules: {
name: [{ required: true, message: "请输入昵称", trigger: "blur" }],
mobile: [{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确手机号" }],
},
userPasswordInfo: {
oldPassword: "",
newPassword: "",
newPassword2: "",
},
passwordRules: {
oldPassword: [
{
required: true,
message: "请输入原密码",
trigger: "blur",
},
],
newPassword: [{ validator: validatePass, trigger: "blur" }],
newPassword2: [{ validator: validatePass2, trigger: "blur" }],
},
};
},
mounted() {
this.getCurrentUserInfo();
},
methods: {
...mapActions("d2admin/account", ["logout"]),
/**
* 获取当前用户信息
*/
getCurrentUserInfo() {
const _self = this;
return request({
url: "/api/system/user/user_info/",
method: "get",
params: {},
}).then((res) => {
_self.userInfo = res.data;
_self.fileList = res.data.avatar
? [{ name: "avatar.png", url: res.data.avatar }]
: [];
});
},
/**
* 更新用户信息
*/
updateInfo() {
const _self = this;
_self.$refs.userInfoForm.validate((valid) => {
if (valid) {
request({
url: "/api/system/user/update_user_info/",
method: "put",
data: _self.userInfo,
}).then((res) => {
_self.$message.success("修改成功");
_self.getCurrentUserInfo();
});
} else {
// 校验失败
// 登录表单校验失败
this.$message.error("表单校验失败,请检查");
}
});
},
// 重置
resetForm(name) {
const _self = this;
if (name === "info") {
_self.getCurrentUserInfo();
} else {
_self.userPasswordForm = {};
}
},
// tab切换
handleClick(tab, event) {
const _self = this;
if (tab.paneName === "userInfo") {
_self.$refs.userPasswordForm.resetFields();
_self.getCurrentUserInfo();
} else {
_self.$refs.userInfoForm.resetFields();
}
},
/**
* 重新设置密码
*/
settingPassword() {
const _self = this;
_self.$refs.userPasswordForm.validate((valid) => {
if (valid) {
const userId = util.cookies.get("uuid");
if (userId) {
const params = JSON.parse(JSON.stringify(_self.userPasswordInfo));
params.oldPassword = _self.$md5(params.oldPassword);
params.newPassword = _self.$md5(params.newPassword);
params.newPassword2 = _self.$md5(params.newPassword2);
request({
url: "/api/system/user/" + userId + "/change_password/",
method: "put",
data: params,
}).then((res) => {
_self.activeName = "userInfo";
_self.$message.success("修改成功");
_self.logout({});
});
}
} else {
// 校验失败
// 登录表单校验失败
this.$message.error("表单校验失败,请检查");
}
});
},
/**
* 头像上传
* @param res
* @param file
*/
handleAvatarSuccess(res, file) {
console.log(11, res);
this.fileList = [{ url: util.baseURL() + res.data.url, name: file.name }];
this.userInfo.avatar = util.baseURL() + res.data.url;
},
},
};
</script>