|
@@ -4,37 +4,47 @@
|
|
|
<div class="left-wrap">
|
|
<div class="left-wrap">
|
|
|
<div class="user-wrap box-style">
|
|
<div class="user-wrap box-style">
|
|
|
<img class="bg" src="@imgs/user/bg.webp" />
|
|
<img class="bg" src="@imgs/user/bg.webp" />
|
|
|
- <img class="avatar" src="@imgs/user/avatar.webp" />
|
|
|
|
|
|
|
+ <el-upload
|
|
|
|
|
+ :file-list="[]"
|
|
|
|
|
+ class="upload-demo"
|
|
|
|
|
+ name="avatar"
|
|
|
|
|
+ accept="jpg,jpeg,png,webp"
|
|
|
|
|
+ :action="uploadServer"
|
|
|
|
|
+ :headers="{Authorization: useUserStore().accessToken}"
|
|
|
|
|
+ :on-success="handleSuccess"
|
|
|
|
|
+ >
|
|
|
|
|
+ <img class="avatar" :src="userInfo.avatar || '@imgs/user/avatar.webp'" />
|
|
|
|
|
+ </el-upload>
|
|
|
<h2 class="name">{{ userInfo.username }}</h2>
|
|
<h2 class="name">{{ userInfo.username }}</h2>
|
|
|
- <p class="des">逐趣CRM 是一款漂亮的后台管理系统模版.</p>
|
|
|
|
|
|
|
+<!-- <p class="des">逐趣CRM 是一款漂亮的后台管理系统模版.</p>-->
|
|
|
|
|
|
|
|
<div class="outer-info">
|
|
<div class="outer-info">
|
|
|
<div>
|
|
<div>
|
|
|
- <i class="iconfont-sys"></i>
|
|
|
|
|
- <span>jdkjjfnndf@mall.com</span>
|
|
|
|
|
|
|
+ <i class="iconfont-sys"></i>
|
|
|
|
|
+ <span>{{ form.sex ? '女' : '男' }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
<div>
|
|
<div>
|
|
|
- <i class="iconfont-sys"></i>
|
|
|
|
|
- <span>交互专家</span>
|
|
|
|
|
|
|
+ <i class="iconfont-sys"></i>
|
|
|
|
|
+ <span>{{ form.phone }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
<div>
|
|
<div>
|
|
|
- <i class="iconfont-sys"></i>
|
|
|
|
|
- <span>广东省深圳市</span>
|
|
|
|
|
|
|
+ <i class="iconfont-sys"></i>
|
|
|
|
|
+ <span>{{ form.email }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
<div>
|
|
<div>
|
|
|
<i class="iconfont-sys"></i>
|
|
<i class="iconfont-sys"></i>
|
|
|
- <span>字节跳动-某某平台部-UED</span>
|
|
|
|
|
|
|
+ <span>{{ form.descr}}</span>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div class="lables">
|
|
|
|
|
|
|
+<!-- <div class="lables">
|
|
|
<h3>标签</h3>
|
|
<h3>标签</h3>
|
|
|
<div>
|
|
<div>
|
|
|
<div v-for="item in lableList" :key="item">
|
|
<div v-for="item in lableList" :key="item">
|
|
|
{{ item }}
|
|
{{ item }}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div>-->
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- <el-carousel class="gallery" height="160px"
|
|
<!-- <el-carousel class="gallery" height="160px"
|
|
@@ -59,8 +69,8 @@
|
|
|
label-position="top"
|
|
label-position="top"
|
|
|
>
|
|
>
|
|
|
<ElRow>
|
|
<ElRow>
|
|
|
- <ElFormItem label="姓名" prop="realName">
|
|
|
|
|
- <el-input v-model="form.realName" :disabled="!isEdit" />
|
|
|
|
|
|
|
+ <ElFormItem label="用户名" prop="realName">
|
|
|
|
|
+ <el-input v-model="form.username" :disabled="!isEdit" />
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
<ElFormItem label="性别" prop="sex" class="right-input">
|
|
<ElFormItem label="性别" prop="sex" class="right-input">
|
|
|
<ElSelect v-model="form.sex" placeholder="Select" :disabled="!isEdit">
|
|
<ElSelect v-model="form.sex" placeholder="Select" :disabled="!isEdit">
|
|
@@ -75,25 +85,16 @@
|
|
|
</ElRow>
|
|
</ElRow>
|
|
|
|
|
|
|
|
<ElRow>
|
|
<ElRow>
|
|
|
- <ElFormItem label="昵称" prop="nikeName">
|
|
|
|
|
- <ElInput v-model="form.nikeName" :disabled="!isEdit" />
|
|
|
|
|
|
|
+ <ElFormItem label="手机" prop="phone">
|
|
|
|
|
+ <ElInput v-model="form.phone" :disabled="!isEdit" />
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
<ElFormItem label="邮箱" prop="email" class="right-input">
|
|
<ElFormItem label="邮箱" prop="email" class="right-input">
|
|
|
<ElInput v-model="form.email" :disabled="!isEdit" />
|
|
<ElInput v-model="form.email" :disabled="!isEdit" />
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
</ElRow>
|
|
</ElRow>
|
|
|
|
|
|
|
|
- <ElRow>
|
|
|
|
|
- <ElFormItem label="手机" prop="mobile">
|
|
|
|
|
- <ElInput v-model="form.mobile" :disabled="!isEdit" />
|
|
|
|
|
- </ElFormItem>
|
|
|
|
|
- <ElFormItem label="地址" prop="address" class="right-input">
|
|
|
|
|
- <ElInput v-model="form.address" :disabled="!isEdit" />
|
|
|
|
|
- </ElFormItem>
|
|
|
|
|
- </ElRow>
|
|
|
|
|
-
|
|
|
|
|
- <ElFormItem label="个人介绍" prop="des" :style="{ height: '130px' }">
|
|
|
|
|
- <ElInput type="textarea" :rows="4" v-model="form.des" :disabled="!isEdit" />
|
|
|
|
|
|
|
+ <ElFormItem label="个人介绍" prop="des">
|
|
|
|
|
+ <ElInput type="text" v-model="form.descr" :disabled="!isEdit" />
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
|
|
|
|
|
<div class="el-form-item-right">
|
|
<div class="el-form-item-right">
|
|
@@ -107,7 +108,7 @@
|
|
|
<div class="info box-style" style="margin-top: 20px">
|
|
<div class="info box-style" style="margin-top: 20px">
|
|
|
<h1 class="title">更改密码</h1>
|
|
<h1 class="title">更改密码</h1>
|
|
|
|
|
|
|
|
- <ElForm :model="pwdForm" class="form" label-width="86px" label-position="top">
|
|
|
|
|
|
|
+ <ElForm ref="pwdFormRef" :model="pwdForm" :rules="pwdRules" class="form" label-width="86px" label-position="top">
|
|
|
<ElFormItem label="当前密码" prop="password">
|
|
<ElFormItem label="当前密码" prop="password">
|
|
|
<ElInput
|
|
<ElInput
|
|
|
v-model="pwdForm.password"
|
|
v-model="pwdForm.password"
|
|
@@ -149,56 +150,77 @@
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
import { useUserStore } from '@/store/modules/user'
|
|
import { useUserStore } from '@/store/modules/user'
|
|
|
- import { ElForm, FormInstance, FormRules } from 'element-plus'
|
|
|
|
|
|
|
+ import {ElForm, ElMessage, FormInstance, FormRules, UploadProps} from 'element-plus'
|
|
|
|
|
+ import {commonApi} from "@/api/commonApi";
|
|
|
|
|
+ import {UserService} from "@/api/usersApi";
|
|
|
|
|
+ import {computed} from "vue";
|
|
|
|
|
|
|
|
defineOptions({ name: 'UserCenter' })
|
|
defineOptions({ name: 'UserCenter' })
|
|
|
|
|
|
|
|
|
|
+ const uploadServer = computed(() => import.meta.env.VITE_API_URL + import.meta.env.VITE_UPLOAD_URL)
|
|
|
const userStore = useUserStore()
|
|
const userStore = useUserStore()
|
|
|
const userInfo = computed(() => userStore.getUserInfo)
|
|
const userInfo = computed(() => userStore.getUserInfo)
|
|
|
|
|
|
|
|
const isEdit = ref(false)
|
|
const isEdit = ref(false)
|
|
|
const isEditPwd = ref(false)
|
|
const isEditPwd = ref(false)
|
|
|
const date = ref('')
|
|
const date = ref('')
|
|
|
- const form = reactive({
|
|
|
|
|
- realName: 'John Snow',
|
|
|
|
|
- nikeName: '皮卡丘',
|
|
|
|
|
- email: '59301283@mall.com',
|
|
|
|
|
- mobile: '18888888888',
|
|
|
|
|
- address: '广东省深圳市宝安区西乡街道101栋201',
|
|
|
|
|
- sex: '2',
|
|
|
|
|
- des: '逐趣CRM 是一款漂亮的后台管理系统模版.'
|
|
|
|
|
|
|
+ const form = reactive<Form.User>({
|
|
|
|
|
+ username: userInfo.value.username || '',
|
|
|
|
|
+ email: userInfo.value.email || '',
|
|
|
|
|
+ phone: userInfo.value.phone || '',
|
|
|
|
|
+ sex: userInfo.value.sex || 0,
|
|
|
|
|
+ descr: userInfo.value.descr || '',
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- const pwdForm = reactive({
|
|
|
|
|
- password: '123456',
|
|
|
|
|
- newPassword: '123456',
|
|
|
|
|
- confirmPassword: '123456'
|
|
|
|
|
|
|
+ const handleSuccess: UploadProps['onSuccess'] = (response, uploadFile) => {
|
|
|
|
|
+ if (response.code === 200) {
|
|
|
|
|
+ ElMessage.success('上传成功!')
|
|
|
|
|
+ userInfo.value.avatar = response.data.url
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ElMessage.error(response.msg)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const pwdForm = reactive<Form.ChangePassword>({
|
|
|
|
|
+ password: '',
|
|
|
|
|
+ newPassword: '',
|
|
|
|
|
+ confirmPassword: ''
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const ruleFormRef = ref<FormInstance>()
|
|
const ruleFormRef = ref<FormInstance>()
|
|
|
|
|
+ const pwdFormRef = ref<FormInstance>()
|
|
|
|
|
+
|
|
|
|
|
+ const pwdRules = reactive<FormRules>({
|
|
|
|
|
+ password: [
|
|
|
|
|
+ {required: true, message: '请输入密码', trigger: 'blur'},
|
|
|
|
|
+ {min: 1, max: 12, message: '长度在 1 到 12 个字符', trigger: 'blur'}
|
|
|
|
|
+ ],
|
|
|
|
|
+ newPassword: [
|
|
|
|
|
+ {required: true, message: '请输入新密码', trigger: 'blur'},
|
|
|
|
|
+ {min: 6, max: 12, message: '长度在 6 到 12 个字符', trigger: 'blur'}
|
|
|
|
|
+ ],
|
|
|
|
|
+ confirmPassword: [{required: true, message: '请确认新密码', trigger: 'blur'}],
|
|
|
|
|
+ })
|
|
|
|
|
|
|
|
const rules = reactive<FormRules>({
|
|
const rules = reactive<FormRules>({
|
|
|
- realName: [
|
|
|
|
|
- { required: true, message: '请输入昵称', trigger: 'blur' },
|
|
|
|
|
- { min: 2, max: 50, message: '长度在 2 到 30 个字符', trigger: 'blur' }
|
|
|
|
|
|
|
+ username: [
|
|
|
|
|
+ { required: true, message: '请输入用户名', trigger: 'blur' },
|
|
|
|
|
+ { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
|
|
|
],
|
|
],
|
|
|
- nikeName: [
|
|
|
|
|
- { required: true, message: '请输入昵称', trigger: 'blur' },
|
|
|
|
|
- { min: 2, max: 50, message: '长度在 2 到 30 个字符', trigger: 'blur' }
|
|
|
|
|
|
|
+ descr: [
|
|
|
|
|
+ { max: 20, message: '长度最多20个字符', trigger: 'blur' }
|
|
|
],
|
|
],
|
|
|
- email: [{ required: true, message: '请输入昵称', trigger: 'blur' }],
|
|
|
|
|
- mobile: [{ required: true, message: '请输入手机号码', trigger: 'blur' }],
|
|
|
|
|
- address: [{ required: true, message: '请输入地址', trigger: 'blur' }],
|
|
|
|
|
- sex: [{ type: 'array', required: true, message: '请选择性别', trigger: 'blur' }]
|
|
|
|
|
|
|
+ phone: [{ required: true, message: '请输入手机号码', trigger: 'blur' }],
|
|
|
|
|
+ email: [{ type: 'email', message: '请输入正确邮箱', trigger: 'blur' }],
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const options = [
|
|
const options = [
|
|
|
{
|
|
{
|
|
|
- value: '1',
|
|
|
|
|
|
|
+ value: 0,
|
|
|
label: '男'
|
|
label: '男'
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- value: '2',
|
|
|
|
|
|
|
+ value: 1,
|
|
|
label: '女'
|
|
label: '女'
|
|
|
}
|
|
}
|
|
|
]
|
|
]
|
|
@@ -231,12 +253,42 @@
|
|
|
date.value = text
|
|
date.value = text
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const edit = () => {
|
|
|
|
|
|
|
+ const edit = async () => {
|
|
|
isEdit.value = !isEdit.value
|
|
isEdit.value = !isEdit.value
|
|
|
|
|
+ if (!isEdit.value) {
|
|
|
|
|
+ if (!ruleFormRef.value) return
|
|
|
|
|
+ await ruleFormRef.value.validate((valid) => {
|
|
|
|
|
+ if (valid) {
|
|
|
|
|
+ commonApi.editUSer(form)
|
|
|
|
|
+ .then(() => {
|
|
|
|
|
+ ElMessage.success('修改成功')
|
|
|
|
|
+ userStore.setUserForm(form)
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch(() => {
|
|
|
|
|
+ ElMessage.error('操作失败')
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const editPwd = () => {
|
|
|
|
|
|
|
+ const editPwd = async () => {
|
|
|
isEditPwd.value = !isEditPwd.value
|
|
isEditPwd.value = !isEditPwd.value
|
|
|
|
|
+ if (!isEditPwd.value) {
|
|
|
|
|
+ if (!pwdFormRef.value) return
|
|
|
|
|
+ // 保存密码
|
|
|
|
|
+ await pwdFormRef.value.validate((valid) => {
|
|
|
|
|
+ if (valid) {
|
|
|
|
|
+ commonApi.changePassword(pwdForm)
|
|
|
|
|
+ .then(() => {
|
|
|
|
|
+ ElMessage.success('密码修改成功')
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch(() => {
|
|
|
|
|
+ ElMessage.error('操作失败')
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|