<template> <el-row> <el-col> <el-form :model="user" :rules="rules" ref="user" label-width="100px"> <el-form-item style="align-items: center;text-align: center;"> <el-upload class="avatar-uploader" :action="tokenURL.URL" :multiple="true" :with-credentials="true" :headers="uploadHeaders" :show-file-list="false" :data="uploadOption" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload"> <div v-if="svgShow"> <Avataaars id="avatarSvg" style="width: 178px; height: 178px;" :avatarStyle='avatar.acatarStyle' :topType='avatar.topType' :accessoriesType='avatar.accessoriesType' :hairColor='avatar.hairColor' :facialHairType='avatar.facialHairType' :clotheType='avatar.clotheType' :clotheColor='avatar.clotheColor' :eyeType='avatar.eyeType' :eyebrowType='avatar.eyebrowType' :mouthType='avatar.mouthType' :skinColor='avatar.skinColor'> </Avataaars> </div> <div v-else> <el-avatar v-if="avatarUrl" class="avatar" :src="avatarUrl"></el-avatar> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </div> </el-upload> <el-button style="margin-top: 1rem;" type="primary" round @click="genAvatar">随机</el-button> </el-form-item> <el-form-item label="昵称" prop="nickname"> <el-input v-model="user.nickname" @blur="checkNickname"></el-input> </el-form-item> <el-form-item label="邮箱" prop="email"> <el-input type="email" v-model="user.email" :disabled="true"></el-input> </el-form-item> <el-form-item label="性别"> <el-radio-group v-model="user.sex"> <el-radio border label="0">保密</el-radio> <el-radio border label="1">男</el-radio> <el-radio border label="2">女</el-radio> </el-radio-group> </el-form-item> <el-form-item label="个人介绍" prop="signature"> <el-input type="textarea" v-model="user.signature"></el-input> </el-form-item> <el-form-item style="text-align: right;"> <el-button type="primary" round @click="updateUserInfo">保存</el-button> </el-form-item> </el-form> </el-col> </el-row> </template> <script> import {mapState} from 'vuex'; import Avataaars from 'vuejs-avataaars'; import saveSvg from 'save-svg-as-png'; const {generateRandomAvatar} = require('~/plugins/avataaars/generator/generateAvatar'); export default { name: "account", components: { Avataaars }, computed: { ...mapState({ uploadHeaders: state => { return {'X-Upload-Token': state.uploadHeaders} }, idUser: state => state.oauth.idUser }) }, data() { return { user: {}, rules: { nickname: [ {required: true, message: '请输入昵称', trigger: 'blur'}, {min: 1, max: 32, message: '长度在 1 到 32 个字符', trigger: 'blur'} ], email: [ {required: true, message: '请输入邮箱地址', trigger: 'blur'}, {type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change']} ] }, loading: false, svgShow: false, tokenURL: { URL: '', token: '' }, avatarUrl: '', avatar: {}, fileList: [], uploadOption: { type: 0 } } }, methods: { genAvatar() { let _ts = this; _ts.$set(_ts, 'svgShow', true); const avatar = generateRandomAvatar(); _ts.$set(_ts, 'avatar', avatar); }, handleAvatarSuccess(res) { let _ts = this; if (res && res.data && res.data.url) { let user = _ts.user; user.avatarUrl = res.data.url; user.avatarType = '0'; _ts.$set(_ts, 'user', user); _ts.$set(_ts, 'svgShow', false); _ts.$set(_ts, 'avatarUrl', res.data.url); } else { _ts.$message.error('上传失败!'); } }, beforeAvatarUpload(file) { const isJPG = file.type === 'image/jpeg'; const isPNG = file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!(isJPG || isPNG)) { this.$message.error('上传图标只能是 JPG 或者 PNG 格式!'); } if (!isLt2M) { this.$message.error('上传图标大小不能超过 2MB!'); } return (isJPG || isPNG) && isLt2M; }, getData() { let _ts = this; _ts.$axios.$get('/api/user-info/detail/' + _ts.idUser).then(function (res) { if (res) { if (res.message) { _ts.$message.error(res.message); } else { _ts.$set(_ts, 'user', res.user); _ts.$set(_ts, 'avatarUrl', res.user.avatarUrl); _ts.$set(_ts, 'svgShow', false); } } }) }, checkNickname() { let _ts = this; _ts.$axios.$get('/api/user-info/check-nickname', { params: { idUser: _ts.user.idUser, nickname: _ts.user.nickname } }).then(function (res) { if (res && res.message) { _ts.$message.error(res.message); } }) }, updateUserInfo() { let _ts = this; let svgShow = _ts.svgShow; let user = _ts.user; if (svgShow) { saveSvg.svgAsPngUri(document.getElementById('avatarSvg'), {}).then(uri => { if (uri) { user.avatarType = 1; user.avatarUrl = uri; _ts.updateUser(user); } else { _ts.$message.error('头像上传失败 !'); } }); } else { _ts.updateUser(user); } }, updateUser(user) { let _ts = this; _ts.$refs['user'].validate((valid) => { if (valid) { _ts.$axios.$patch('/api/user-info/update', user).then(function (res) { if (res) { if (res.message) { _ts.$message.error(res.message); } else { _ts.$set(_ts, 'user', res.user); _ts.$set(_ts, 'avatarUrl', res.user.avatarUrl); _ts.$set(_ts, 'svgShow', false); _ts.$store.commit('setUserInfo', res.user); _ts.$message.success('更新成功 !'); } } }) } else { _ts.$message.error('数据异常 !'); } }); } }, mounted() { let _ts = this; this.$store.commit('setActiveMenu', 'account'); this.$axios.$get('/api/upload/simple/token').then(function (res) { if (res) { _ts.$store.commit('setUploadHeaders', res.uploadToken); _ts.$set(_ts, 'tokenURL', { token: res.uploadToken || '', URL: res.uploadURL || '', }) } }); this.getData(); } } </script> <style scoped> .avatar-uploader .el-upload { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; position: relative; overflow: hidden; } .avatar-uploader .el-upload:hover { border-color: #409EFF; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 178px; height: 178px; line-height: 178px; text-align: center; } .avatar { width: 178px; height: 178px; display: block; } </style>