springboot+vue前后端分离项目-项目搭建4
1.修改vue布局,app.vue为入口,只引入路由,路由控制页面显示
改造后app.vue

新增layout.vue

修改/router/index.js,默认访问路径 / 对应layout.vue,layout里的路由是嵌套路由,/home匹配到HomeView.vue

新增vue/src/views/LoginView.vue

效果



2.优化登录页面LoginView.vue
<template>
<div style="width: 100%; height: 100vh; background-color: darkslateblue; overflow: hidden">
<div style="width: 400px; margin: 150px auto">
<div style="color: #cccccc; font-size: 30px; text-align: center; padding: 30px 0">欢迎登录</div>
<el-form label-position="right" :model="form" size="normal">
<el-form-item >
<el-input :prefix-icon="Avatar" v-model="form.username"/>
</el-form-item>
<el-form-item >
<el-input :prefix-icon="Lock" v-model="form.password" show-password/>
</el-form-item>
<el-form-item>
<el-button style="width: 100%;" type="primary" @click="login">登 录</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
export default {
name: "LoginView",
data(){
return {
form: {}
}
},
methods: {
login() {
request.post("/user/login", this.form).then(res => {
console.log(res)
if (res.code === '0') {
this.$message({
type: "success",
message: "登录成功"
})
this.$router.push("/") //登陆成功后跳转到主页
} else {
this.$message({
type: "error",
message: "res.msg"
})
}
});
}
}
}
</script>
<script setup>
import { Avatar,Lock } from '@element-plus/icons-vue'
</script>
<style scoped>
</style>
效果:

3.后台增加登录处理,UserController
@PostMapping("/login")
public Result<?> login(@RequestBody User user){
User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()).eq(User::getPassword, user.getPassword()));
if(res == null){
return Result.error("-1", "用户名或密码错误");
}
return Result.success();
}
效果:


4.增加退出系统功能,添加按钮,路由转到/login

5.新增注册页面,vue/src/views/Register.vue,增加rules校验,注册页面编写后测试,validate位置报错,排查发现el-form属性里必须要有ref="form",然后才能支持this.$refs.form.validate
<template>
<div style="width: 100%; height: 100vh; background-color: darkslateblue; overflow: hidden">
<div style="width: 400px; margin: 150px auto">
<div style="color: #cccccc; font-size: 30px; text-align: center; padding: 30px 0">欢迎登录</div>
<el-form :model="form" size="normal" :rules="rules" ref="form">
<el-form-item prop="username">
<el-input :prefix-icon="Avatar" v-model="form.username"/>
</el-form-item>
<el-form-item prop="password">
<el-input :prefix-icon="Lock" v-model="form.password" show-password/>
</el-form-item>
<el-form-item prop="confirm">
<el-input :prefix-icon="Lock" v-model="form.confirm" show-password/>
</el-form-item>
<el-form-item>
<el-button style="width: 100%;" type="primary" @click="register">注 册</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
export default {
name: "Register",
data(){
return {
form: {},
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
],
confirm: [
{ required: true, message: '请确认密码', trigger: 'blur' }
]
}
}
},
methods: {
register() {
if(this.form.password !== this.form.confirm){
this.$message({
type: "error",
message: "2次密码输入不一致"
})
return
}
this.$refs.form.validate((valid) => {
if(valid){
request.post("/user/register", this.form).then(res => {
console.log(res)
if (res.code === '0') {
this.$message({
type: "success",
message: "注册成功"
})
this.$router.push("/login") //注册成功后跳转到主页
} else {
this.$message({
type: "error",
message: res.msg
})
}
})
} else {
this.$message({
type: "error",
message: "输入信息有误"
})
}
})
}
}
}
</script>
<script setup>
import { Avatar,Lock } from '@element-plus/icons-vue'
</script>
<style scoped>
</style>
6.后台增加注册处理
@PostMapping("/register")
public Result<?> register(@RequestBody User user){
User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()));
if(res != null){
return Result.error("-1", "用户名重复");
}
if(user.getPassword() == null){
user.setPassword("123456");
}
userMapper.insert(user);
return Result.success();
}
7.调整路由

效果:

8.优化新增和编辑的form显示,优化前label右边不对齐,优化后所有label都对齐,只需要增加label-width="auto"



以上仅供参考,如有疑问,留言联系

浙公网安备 33010602011771号