11. Vue3开发登录注册页面
在 employee 表加 3 个字段


登录页面的设计思路

登录逻辑
@PostMapping("/login")
public Result login(@RequestBody Employee employee) {
employeeService.login(employee);
return Result.success();
}
public Employee login(Employee employee) {
String username = employee.getUsername(); // 账号
Employee dbEmployee = employeeMapper.selectByUsername(username);
if (dbEmployee == null) { // 没查询到任何用户 说明没有这个账号
throw new CustomException("500", "账号不存在");
}
// 数据库存在这个账号
String password = employee.getPassword();
if (!dbEmployee.getPassword().equals(password)) { // 用户输入的密码跟数据库账号的密码不匹配
throw new CustomException("500", "账号或密码错误");
}
return dbEmployee;
}
注册逻辑
@PostMapping("/register")
public Result register(@RequestBody Employee employee) {
employeeService.register(employee);
return Result.success();
}
public void add(Employee employee) {
String username = employee.getUsername(); // 账号
Employee dbEmployee = employeeMapper.selectByUsername(username);
if (dbEmployee != null) { // 注册的账号已存在 无法注册
throw new CustomException("500", "账号已存在,请更换别的账号");
}
if (StrUtil.isBlank(employee.getPassword())) { // 密码没填
employee.setPassword("123"); // 默认密码 123
}
if (StrUtil.isBlank(employee.getName())) { // 名字没填
employee.setName(employee.getUsername()); // 默认名称
}
// 一定要设置角色
employee.setRole("EMP"); // 员工的角色
employeeMapper.insert(employee);
}
hutool 工具包
https://doc.hutool.cn/pages/index/
<!-- hutool 插件包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>
本节课登录页面
<template>
<div class="login-container">
<div class="login-box">
<div style="padding: 50px 30px; background-color: white; margin-left: 100px; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.2)">
<el-form ref="formRef" :rules="data.rules" :model="data.form" style="width: 300px">
<div style="margin-bottom: 30px; font-size: 24px; text-align: center; color: #0742b1; font-weight: bold">欢迎登录后台管理系统</div>
<el-form-item prop="username">
<el-input size="large" v-model="data.form.username" placeholder="请输入账号" prefix-icon="User"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input show-password size="large" v-model="data.form.password" placeholder="请输入密码" prefix-icon="Lock"></el-input>
</el-form-item>
<div style="margin-bottom: 20px">
<el-button @click="login" size="large" style="width: 100%" type="primary">登 录</el-button>
</div>
<div style="text-align: right">还没有账号?请 <a style="color: #0742b1; text-decoration: none" href="/register">注册</a></div>
</el-form>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { User, Lock } from "@element-plus/icons-vue"
import request from "@/utils/request.js";
import {ElMessage} from "element-plus";
const data = reactive({
form: {},
rules: {
username: [
{ required: true, message: '请输入账号', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
]
}
})
const formRef = ref()
const login = () => {
formRef.value.validate((valid) => {
if (valid) {
request.post('/login', data.form).then(res => {
if (res.code === '200') { // 登录成功
// 存储后台返回的用户数据信息
localStorage.setItem('xm-pro-user', JSON.stringify(res.data)) // 把json对象转换成 json字符串存储
ElMessage.success('登录成功')
setTimeout(() => {
location.href = '/manager/home'
}, 500)
} else {
ElMessage.error(res.msg)
}
})
}
})
}
</script>
<style scoped>
.login-container {
height: 100vh;
overflow: hidden;
background-image: url("@/assets/bg.jpg");
background-size: cover;
background-position: 0 -50px;
}
.login-box {
width: 50%;
height: 100%;
display: flex;
align-items: center;
right: 0;
position: absolute;
}
</style>
本节课注册页面
<template>
<div class="login-container">
<div class="login-box">
<div style="padding: 50px 30px; background-color: white; margin-left: 100px; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.2)">
<el-form ref="formRef" :rules="data.rules" :model="data.form" style="width: 300px">
<div style="margin-bottom: 30px; font-size: 24px; text-align: center; color: #0742b1; font-weight: bold">欢 迎 注 册</div>
<el-form-item prop="username">
<el-input size="large" v-model="data.form.username" placeholder="请输入账号" prefix-icon="User"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input show-password size="large" v-model="data.form.password" placeholder="请输入密码" prefix-icon="Lock"></el-input>
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input show-password size="large" v-model="data.form.confirmPassword" placeholder="请确认密码" prefix-icon="Lock"></el-input>
</el-form-item>
<div style="margin-bottom: 20px">
<el-button @click="register" size="large" style="width: 100%" type="primary">注 册</el-button>
</div>
<div style="text-align: right">已有账号?请 <a style="color: #0742b1; text-decoration: none" href="/login">登录</a></div>
</el-form>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { User, Lock } from "@element-plus/icons-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.password) {
callback(new Error("两次输入的密码不一致"))
} else {
callback()
}
}
const data = reactive({
form: {},
rules: {
username: [
{ required: true, message: '请输入账号', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
],
confirmPassword: [
{ validator: validatePass, trigger: 'blur'}
]
}
})
const formRef = ref()
const register = () => {
formRef.value.validate((valid) => {
if (valid) {
request.post('/register', data.form).then(res => {
if (res.code === '200') { // 注册成功
ElMessage.success('注册成功')
setTimeout(() => {
location.href = '/login'
}, 500)
} else {
ElMessage.error(res.msg)
}
})
}
})
}
</script>
<style scoped>
.login-container {
height: 100vh;
overflow: hidden;
background-image: url("@/assets/bg.jpg");
background-size: cover;
background-position: 0 -50px;
}
.login-box {
width: 50%;
height: 100%;
display: flex;
align-items: center;
right: 0;
position: absolute;
}
</style>