重构配置文件视图以使用 Pinia 用户存储进行数据管理 - 在本地存储和配置文件表单之间同步用户信息

This commit is contained in:
wzclm 2025-03-09 16:18:03 +08:00
parent 3ff03864d6
commit 61dd6f86a9
3 changed files with 48 additions and 22 deletions

View File

@ -172,7 +172,6 @@ const isActive = ref(true);
//
const monitorPerformance = () => {
const loadTime = Date.now() - componentLoadTime.value;
console.log(`[Performance] AdminLayout loaded in ${loadTime}ms`);
};
//

View File

@ -59,6 +59,7 @@ const handleLogin = async (formEl) => {
status: "成功",
detail: "用户登录成功",
});
console.log(userStore.userInfo)
//
ElMessage.success({

View File

@ -1,19 +1,23 @@
<script setup>
import { ref, reactive } from 'vue'
import { ref, reactive, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { User, Lock, Message, Phone } from '@element-plus/icons-vue'
import { useUserStore } from '@/stores/user'
//
const userStore = useUserStore()
//
const userInfo = reactive({
username: 'admin',
nickname: '管理员',
email: 'admin@example.com',
phone: '13800138000',
avatar: '',
role: '超级管理员',
createTime: '2023-01-01',
lastLoginTime: '2024-03-20 10:00:00',
lastLoginIp: '192.168.1.100'
username: userStore.userInfo?.username || '',
real_name: userStore.userInfo?.real_name || '',
email: userStore.userInfo?.email || '',
phone: userStore.userInfo?.phone || '',
avatar: userStore.userInfo?.avatar || '',
role: userStore.userInfo?.role || '',
createTime: userStore.userInfo?.create_time || '',
lastLoginTime: userStore.userInfo?.last_login_time || '',
lastLoginIp: userStore.userInfo?.last_login_ip || ''
})
//
@ -50,14 +54,14 @@ const passwordRules = {
//
const profileForm = reactive({
nickname: userInfo.nickname,
real_name: userInfo.real_name,
email: userInfo.email,
phone: userInfo.phone
})
//
const profileRules = {
nickname: [
real_name: [
{ required: true, message: '请输入昵称', trigger: 'blur' },
{ min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
],
@ -81,7 +85,7 @@ const handleChangePassword = async () => {
await passwordFormRef.value.validate((valid) => {
if (valid) {
ElMessage.success('密码修改成功(这是模拟消息)')
ElMessage.success('密码修改成功')
//
passwordForm.oldPassword = ''
passwordForm.newPassword = ''
@ -96,11 +100,20 @@ const handleUpdateProfile = async () => {
await profileFormRef.value.validate((valid) => {
if (valid) {
ElMessage.success('个人信息更新成功(这是模拟消息)')
ElMessage.success('个人信息更新成功')
//
userInfo.nickname = profileForm.nickname
userInfo.real_name = profileForm.real_name
userInfo.email = profileForm.email
userInfo.phone = profileForm.phone
// store
const updatedUserInfo = {
...userStore.userInfo,
real_name: profileForm.real_name,
email: profileForm.email,
phone: profileForm.phone
}
localStorage.setItem('userInfo', JSON.stringify(updatedUserInfo))
}
})
}
@ -108,7 +121,13 @@ const handleUpdateProfile = async () => {
//
const handleAvatarSuccess = (response) => {
userInfo.avatar = response.url
ElMessage.success('头像上传成功(这是模拟消息)')
// store
const updatedUserInfo = {
...userStore.userInfo,
avatar: response.url
}
localStorage.setItem('userInfo', JSON.stringify(updatedUserInfo))
ElMessage.success('头像上传成功')
}
//
@ -124,6 +143,13 @@ const beforeAvatarUpload = (file) => {
}
return isJPG && isLt2M
}
//
onMounted(() => {
profileForm.real_name = userInfo.real_name
profileForm.email = userInfo.email
profileForm.phone = userInfo.phone
})
</script>
<template>
@ -167,8 +193,8 @@ const beforeAvatarUpload = (file) => {
<el-form-item label="用户名">
<el-input v-model="userInfo.username" disabled />
</el-form-item>
<el-form-item label="昵称" prop="nickname">
<el-input v-model="profileForm.nickname" />
<el-form-item label="昵称" prop="real_name">
<el-input v-model="profileForm.real_name" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="profileForm.email">
@ -185,7 +211,7 @@ const beforeAvatarUpload = (file) => {
</el-input>
</el-form-item>
<el-form-item label="角色">
<el-input v-model="userInfo.role" disabled />
<el-input v-model="userInfo.real_name" disabled />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleUpdateProfile">保存修改</el-button>
@ -251,7 +277,7 @@ const beforeAvatarUpload = (file) => {
</el-form>
<!-- 登录信息 -->
<div class="login-info">
<!-- <div class="login-info">
<div class="info-item">
<span class="label">上次登录时间</span>
<span class="value">{{ userInfo.lastLoginTime }}</span>
@ -260,7 +286,7 @@ const beforeAvatarUpload = (file) => {
<span class="label">上次登录IP</span>
<span class="value">{{ userInfo.lastLoginIp }}</span>
</div>
</div>
</div> -->
</el-card>
</div>
</template>