WebController
package com.example.controller;
import com.example.common.Result;
import com.example.entity.Account;
import com.example.entity.User;
import com.example.service.AdminService;
import com.example.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
@RestController
public class WebController {
@Resource
private AdminService adminService;
@Resource
private UserService userService;
/**
* 默认请求接口
*/
@GetMapping("/")
public Result hello() {
return Result.success();
}
/**
* 登录
*/
@PostMapping("/login")
public Result login(@RequestBody Account account) {
Account ac = null;
if ("管理员".equals(account.getRole())) {
ac = adminService.login(account);
}
if ("普通用户".equals(account.getRole())) {
ac = userService.login(account);
}
return Result.success(ac);
}
/**
* 注册
*/
@PostMapping("/register")
public Result register(@RequestBody User user) {
userService.add(user);
return Result.success();
}
/**
* 修改密码
*/
@PutMapping("/updatePassword")
public Result updatePassword(@RequestBody Account account) {
if ("管理员".equals(account.getRole())) {
adminService.updatePassword(account);
}
if ("普通用户".equals(account.getRole())) {
userService.updatePassword(account);
}
return Result.success();
}
}
前端 Login.vue
<template>
<div class="login-container">
<div class="login-box">
<div style="font-weight: bold; font-size: 30px; text-align: center; margin-bottom: 30px; color: #1967e3">欢 迎 登 录</div>
<el-form :model="data.form" ref="formRef" :rules="data.rules">
<el-form-item prop="username">
<el-input :prefix-icon="User" size="large" v-model="data.form.username" placeholder="请输入账号" />
</el-form-item>
<el-form-item prop="password">
<el-input :prefix-icon="Lock" size="large" v-model="data.form.password" placeholder="请输入密码" show-password />
</el-form-item>
<el-form-item prop="role">
<el-select size="large" style="width: 100%" v-model="data.form.role">
<el-option value="管理员" label="管理员"></el-option>
<el-option value="普通用户" label="普通用户"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button size="large" type="primary" style="width: 100%" @click="login">登 录</el-button>
</el-form-item>
</el-form>
<div style="text-align: right;">
还没有账号?请 <a href="/register">注册</a>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { User, Lock } from "@element-plus/icons-vue";
import request from "@/utils/request";
import {ElMessage} from "element-plus";
import router from "@/router";
const data = reactive({
form: { role: '管理员' },
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') {
ElMessage.success("登录成功")
router.push('/manager/home')
localStorage.setItem('system-user', JSON.stringify(res.data))
} else {
ElMessage.error(res.msg)
}
})
}
})).catch(error => {
console.error(error)
})
}
</script>
<style scoped>
.login-container {
height: 100vh;
overflow:hidden;
display: flex;
justify-content: center;
align-items: center;
background: #2e3143;
background-size: cover;
}
.login-box {
width: 350px;
padding: 50px 30px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(255, 255, 255, 0.3);
background-color: #fff;
}
</style>
前端注册 Register.vue
<template>
<div class="login-container">
<div class="login-box">
<div style="font-weight: bold; font-size: 30px; text-align: center; margin-bottom: 30px; color: #1967e3">欢 迎 注 册</div>
<el-form :model="data.form" ref="formRef" :rules="data.rules">
<el-form-item prop="username">
<el-input :prefix-icon="User" size="large" v-model="data.form.username" placeholder="请输入账号" />
</el-form-item>
<el-form-item prop="password">
<el-input :prefix-icon="Lock" size="large" v-model="data.form.password" placeholder="请输入密码" show-password />
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input :prefix-icon="Lock" size="large" v-model="data.form.confirmPassword" placeholder="请确认密码" show-password />
</el-form-item>
<el-form-item>
<el-button size="large" type="primary" style="width: 100%" @click="register">注 册</el-button>
</el-form-item>
</el-form>
<div style="text-align: right;">
还没有账号?请 <a href="/login">登录</a>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { User, Lock } from "@element-plus/icons-vue";
import request from "@/utils/request";
import {ElMessage} from "element-plus";
import router from "@/router";
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: { role: 'USER' },
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("注册成功")
router.push('/login')
} else {
ElMessage.error(res.msg)
}
})
}
})).catch(error => {
console.error(error)
})
}
</script>
<style scoped>
.login-container {
height: 100vh;
overflow:hidden;
display: flex;
justify-content: center;
align-items: center;
background: #2e3143;
background-size: cover;
}
.login-box {
width: 350px;
padding: 50px 30px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(255, 255, 255, 0.3);
background-color: #fff;
}
</style>
前端 Person.vue
<template>
<div style="width: 40%">
<div class="card" style="padding: 30px">
<el-form ref="formRef" :model="data.user" :rules="data.rules" label-width="100px" style="padding-right: 50px">
<div style="margin: 20px 0; text-align: center">
<el-upload :show-file-list="false" class="avatar-uploader" :action="uploadUrl" :on-success="handleFileUpload">
<img v-if="data.user.avatar" :src="data.user.avatar" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</div>
<el-form-item label="账号" prop="username">
<el-input disabled v-model="data.user.username" autocomplete="off" />
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="data.user.name" autocomplete="off" />
</el-form-item>
<div v-if="data.user.role === '普通用户'">
<el-form-item label="手机号" prop="phone">
<el-input placeholder="请输入手机号" v-model="data.user.phone" autocomplete="off" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input placeholder="请输入邮箱" v-model="data.user.email" autocomplete="off" />
</el-form-item>
</div>
<div style="text-align: center">
<el-button type="primary" @click="save">保存</el-button>
</div>
</el-form>
</div>
</div>
</template>
<script setup>
import {reactive, ref} from "vue"
import request from "@/utils/request";
import {ElMessage} from "element-plus";
// 文件上传的接口地址
const uploadUrl = import.meta.env.VITE_BASE_URL + '/files/upload'
const formRef = ref()
const data = reactive({
user: JSON.parse(localStorage.getItem('system-user') || '{}'),
rules: {
username: [
{required: true, message: '请输入账号', trigger: 'blur'}
],
name: [
{required: true, message: '请输入名称', trigger: 'blur'}
],
}
})
const handleFileUpload = (file) => {
data.user.avatar = file.data
}
const emit = defineEmits(["updateUser"])
// 把当前修改的用户信息存储到后台数据库
const save = () => {
formRef.value.validate(valid => {
if (valid) {
if (data.user.role === '管理员') {
request.put('/admin/update', data.user).then(res => {
if (res.code === '200') {
ElMessage.success('更新成功')
//把更新后的用户信息存储到缓存
localStorage.setItem('system-user', JSON.stringify(data.user))
emit('updateUser')
} else {
ElMessage.error(res.msg)
}
})
}
if (data.user.role === '普通用户') {
request.put('/user/update', data.user).then(res => {
if (res.code === '200') {
ElMessage.success('更新成功')
//把更新后的用户信息存储到缓存
localStorage.setItem('system-user', JSON.stringify(data.user))
emit('updateUser')
} else {
ElMessage.error(res.msg)
}
})
}
}
})
}
</script>
<style scoped>
.avatar-uploader .avatar {
width: 120px;
height: 120px;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 120px;
height: 120px;
text-align: center;
}
</style>
前端 Password.vue
<template>
<div style="width: 40%">
<div class="card" style="padding: 30px">
<el-form ref="formRef" :rules="data.rules" :model="data.user" label-width="100px" style="padding-right: 50px">
<el-form-item label="原密码" prop="password">
<el-input v-model="data.user.password" show-password />
</el-form-item>
<el-form-item label="新密码" prop="newPassword">
<el-input v-model="data.user.newPassword" show-password />
</el-form-item>
<el-form-item label="确认新密码" prop="confirmPassword">
<el-input v-model="data.user.confirmPassword" show-password />
</el-form-item>
<div style="text-align: center">
<el-button type="primary" @click="save">保存</el-button>
</div>
</el-form>
</div>
</div>
</template>
<script setup>
import {reactive, ref} from "vue"
import request from "@/utils/request";
import {ElMessage} from "element-plus";
import router from "@/router";
const formRef = ref()
const data = reactive({
user: JSON.parse(localStorage.getItem('system-user') || '{}'),
rules: {
password: [
{required: true, message: '请输入原密码', trigger: 'blur'}
],
newPassword: [
{required: true, message: '请输入新密码', trigger: 'blur'}
],
confirmPassword: [
{required: true, message: '请确认新密码', trigger: 'blur'}
],
}
})
// 把当前修改的用户信息存储到后台数据库
const save = () => {
formRef.value.validate(valid => {
if (valid) {
if (data.user.password === data.user.newPassword) {
ElMessage.error('新密码不能和原密码一致')
return
}
if (data.user.newPassword !== data.user.confirmPassword) {
ElMessage.error('确认新密码错误')
return
}
request.put('/updatePassword', data.user).then(res => {
if (res.code === '200') {
ElMessage.success('修改密码成功')
//把更新后的用户信息存储到缓存
localStorage.setItem('system-user', JSON.stringify(data.user))
router.push('/login')
} else {
ElMessage.error(res.msg)
}
})
}
})
}
</script>