12. Vue3管理系统开发个人信息、修改密码页面
当你集成完登录功能后会出现白屏
为什么?

怎么解决?
把默认的路由重定向到 /login,让用户每次启动项目后重新登录

管理员相关的增删改查
admin 的 sql
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '账号',
`password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称',
`role` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '角色',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员信息';
后端接口
entity、controller、service、mapper、mapper.xml
前端页面
页面、路由、菜单
未找到接口错误
- 前端写错接口了
- 后端没重启
系统错误

退出登录逻辑

const logout = () => {
localStorage.removeItem('xm-pro-user') // 清除当前登录的用户缓存数据
location.href = '/login' // 退出到登录页面
}
管理员登录
/**
* 管理员/员工登录
*/
@PostMapping("/login")
public Result login(@RequestBody Account account) {
Account result = null;
if ("ADMIN".equals(account.getRole())) { // 管理员登录
result = adminService.login(account);
} else if ("EMP".equals(account.getRole())) {
result = employeeService.login(account);
}
return Result.success(result);
}
个人中心页面
子组件发送请求更新父组件的数据
const emit = defineEmits(['updateUser'])
// 更新缓存数据
localStorage.setItem('xm-pro-user', JSON.stringify(data.form))
emit('updateUser')


const updateUser = () => {
data.user = JSON.parse(localStorage.getItem('xm-pro-user'))
}
个人信息页面源码
<template>
<div class="card" style="width: 50%; padding: 40px 20px">
<el-form ref="formRef" :rules="data.rules" :model="data.form" label-width="80px" style="padding-right: 40px; padding-top: 20px">
<el-form-item label="账号" prop="username">
<el-input disabled v-model="data.form.username" autocomplete="off" placeholder="请输入账号" />
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="data.form.name" autocomplete="off" placeholder="请输入名称" />
</el-form-item>
<div v-if="data.user.role === 'EMP'">
<el-form-item label="性别">
<el-radio-group v-model="data.form.sex">
<el-radio value="男" label="男"></el-radio>
<el-radio value="女" label="女"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="工号" prop="no">
<el-input disabled v-model="data.form.no" autocomplete="off" placeholder="请输入工号" />
</el-form-item>
<el-form-item label="年龄">
<el-input-number style="width: 180px" :min="18" v-model="data.form.age" autocomplete="off" placeholder="请输入年龄" />
</el-form-item>
<el-form-item label="个人介绍">
<el-input :rows="3" type="textarea" v-model="data.form.description" autocomplete="off" placeholder="请输入个人介绍" />
</el-form-item>
</div>
<div style="text-align: center">
<el-button @click="updateUser" type="primary" style="padding: 20px 30px">更新个人信息</el-button>
</div>
</el-form>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import request from "@/utils/request.js";
import {ElMessage} from "element-plus";
const formRef = ref()
const data = reactive({
user: JSON.parse(localStorage.getItem('xm-pro-user')),
form: {},
rules: {
username: [
{ required: true, message: '请输入账号', trigger: 'blur' }
],
name: [
{ required: true, message: '请输入名称', trigger: 'blur' }
],
no: [
{ required: true, message: '请输入工号', trigger: 'blur' }
]
}
})
const emit = defineEmits(['updateUser'])
if (data.user.role === 'EMP') {
request.get('/employee/selectById/' + data.user.id).then(res => {
data.form = res.data
})
} else {
data.form = data.user
}
const updateUser = () => {
if (data.user.role === 'EMP') {
request.put('/employee/update', data.form).then(res => {
if (res.code === '200') {
ElMessage.success('更新成功')
// 更新缓存数据
localStorage.setItem('xm-pro-user', JSON.stringify(data.form))
// 触发父级从缓存里面取到最新的数据
emit('updateUser')
} else {
ElMessage.error(res.msg)
}
})
} else {
request.put('/admin/update', data.form).then(res => {
if (res.code === '200') {
ElMessage.success('更新成功')
// 更新缓存数据
localStorage.setItem('xm-pro-user', JSON.stringify(data.form))
// 触发父级从缓存里面取到最新的数据
emit('updateUser')
} else {
ElMessage.error(res.msg)
}
})
}
}
</script>
修改密码
/**
* 修改密码
*/
@PutMapping("/updatePassword")
public Result updatePassword(@RequestBody Account account) {
if ("ADMIN".equals(account.getRole())) { // 管理员登录
adminService.updatePassword(account);
} else if ("EMP".equals(account.getRole())) {
employeeService.updatePassword(account);
}
return Result.success();
}
public void updatePassword(Account account) {
Integer id = account.getId();
Admin admin = this.selectById(id);
if (!admin.getPassword().equals(account.getPassword())) { // 页面传来的原密码跟数据库密码对比 不匹配就报错
throw new CustomException("500", "对不起,原密码错误");
}
admin.setPassword(account.getNewPassword()); // 设置新密码
this.update(admin);
}
修改密码的前端页面
<template>
<div class="card" style="width: 50%; padding: 40px 20px;">
<el-form ref="formRef" :rules="data.rules" :model="data.form" label-width="100px" style="padding-right: 40px; padding-top: 20px">
<el-form-item label="原密码" prop="password">
<el-input show-password v-model="data.form.password" autocomplete="off" placeholder="请输入原密码" />
</el-form-item>
<el-form-item label="新密码" prop="newPassword">
<el-input show-password v-model="data.form.newPassword" autocomplete="off" placeholder="请输入新密码" />
</el-form-item>
<el-form-item label="确认新密码" prop="confirmPassword" required>
<el-input show-password v-model="data.form.confirmPassword" autocomplete="off" placeholder="请再次确认新密码" />
</el-form-item>
<div style="text-align: center">
<el-button @click="updatePassword" type="primary" style="padding: 20px 30px">立即修改</el-button>
</div>
</el-form>
</div>
</template>
<script setup>
import {reactive, ref} from "vue";
import request from "@/utils/request.js";
import {ElMessage} from "element-plus";
const validatePass = (rule, value, callback) => {
if (!value) {
callback(new Error('请再次确认新密码'))
} else if (value !== data.form.newPassword) {
callback(new Error("两次输入的密码不一致"))
} else {
callback()
}
}
const formRef = ref()
const data = reactive({
user: JSON.parse(localStorage.getItem('xm-pro-user')),
form: {},
rules: {
password: [
{required: true, message: '请输入原密码', trigger: 'blur'}
],
newPassword: [
{required: true, message: '请输入新密码', trigger: 'blur'}
],
confirmPassword: [
{ validator: validatePass, trigger: 'blur'}
],
}
})
const updatePassword = () => {
data.form.id = data.user.id
data.form.role = data.user.role
formRef.value.validate((valid) => {
if (valid) {
request.put('/updatePassword', data.form).then(res => {
if (res.code === '200') {
ElMessage.success('修改成功')
localStorage.removeItem('xm-pro-user')
setTimeout(() => {
location.href = '/login'
}, 500)
} else {
ElMessage.error(res.msg)
}
})
}
})
}
</script>