一.登录注册实现思路
实现注册功能分为以下几个步骤:
- 设计数据库用户表:包含,用户ID,用户名,用户密码等字段。
- 创建SpringBoot项目:使用https://start.spring.io/官网创建或者Idea里面直接创建,并添加相关依赖,如:MySQL Driver,Spring Web 。
- 编写实体类:根据数据库表结构编写相应的实体类,用于映射数据库表。
- 编写Controller:创建Controller来处理用户的登录和注册请求。Controller接收请求参数,调用Service层方法完成相应的业务逻辑。
- 编写Service层:创建一个Service层,包含业务逻辑,比如验证用户登录,注册新用户等。在这个层次你可以加入密码加密、验证等逻辑。
- 编写Mapper接口:创建Controller来处理用户的登录和注册请求。Controller接收请求参数,调用Service层方法完成相应的业务逻辑。
- 编写前端vue3页面:创建Vue页面用于用户登录和注册。可以使用表单来收集用户信息,并通过Axios来发送数据到后端。
二.后端具体实现步骤
1.设计并创建数据库表
2. 创建SpringBoot项目
3.在pom.xml添加依赖
<!-- web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!-- mysql驱动依赖-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- lombok依赖,可将实体类getter,setter,toString,equals,hashCode自动生成-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
4.连接数据库
将项目中的application.properties文件改成application.yml ,并添加如下配置连接数据库
5.编写实体类
package com.example.demo.pojo;
import lombok.Data;
@Data // 自动生成getter/setter/toString/hashCode/equals等方法
public class User {
private Integer id;
private String username;
private String password;
}
6. 创建统一返回结果类
package com.example.demo.Result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Result<T> {
private Integer code;
private String message;
private T data;
public static <E> Result<E> success (E data) {
return new Result<>(0,"操作成功",data);
}
public static Result success() {
return new Result(0,"操作成功",null);
}
public static Result error(String message) {
return new Result(1,message,null);
}
}
7.创建Controller
@RestController
@RequestMapping("/user")
@CrossOrigin //解决跨域问题
public class UserController {
//注入userService
@Autowired
private UserService userService;
/**
* 用户注册接口
* @param user 包含用户名和密码的用户对象,通过RequestBody接收前端传来的JSON数据
* @return 返回注册结果,如果用户名不存在,则返回注册成功结果;否则返回错误信息
* 对参数没有进行验证,仅用于演示
*/
@PostMapping("/register")
public Result register (@RequestBody User user) {
String uname = user.getUsername();
String psw = user.getPassword();
User byuser = userService.findByUser(uname);
//查询数据库判断该用户是否存在
if (byuser == null){
//不存在则注册成功,将用户名和密码添加到数据库中
userService.register(uname,psw);
return Result.success("注册成功!");
}
return Result.error("用户名已被占用!");
}
/**
* 用户登录接口
* @param user 包含用户名和密码的用户对象,通过RequestBody接收前端传来的JSON数据
* @return 返回登录结果,如果用户名正确且密码匹配,则返回登录成功结果;否则返回错误信息
* 此登陆接口没有涉及对密码的加密,因此仅用于演示,在实际应用中应使用加密技术保护密码
* 也没有设计token,因此登录成功后,用户无法退出,需要手动关闭浏览器或重新打开浏览器
*/
@PostMapping("/login")
public Result log(@RequestBody User user){
// 提取用户名和密码
String uname = user.getUsername();
String pword = user.getPassword();
// 根据用户名查找用户
User byUser = userService.findByUser(uname);
if (byUser == null){
// 如果用户名不存在,则返回用户名错误信息
return Result.error("用户名错误");
}
if (pword.equals(byUser.getPassword())){
// // 如果密码匹配,则登录成功
return Result.success();
}
// 如果密码不匹配,则返回密码错误信息
return Result.error("密码错误!");
}
}
8.创建service层接口
public interface UserService {
//根据用户名查询数据库
User findByUser(String uname);
//注册 将用户名和密码添加到数据库中
void register(String uname, String psw);
}
9.创建servicelmpl接口实现类
@Service
public class UserServiceimpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findByUser(String uname) {
User u = userMapper.findByUser(uname);
return u;
}
@Override
public void register(String uname, String psw) {
userMapper.add(uname,psw);
}
}
10.编写Mapper接口
@Mapper
public interface UserMapper {
//查询
@Select("select * from users where username = #{uname}")
User findByUser(String uname);
//新增
@Insert("insert into users(username, password)" +"values (#{uname},#{psw})")
void add(String uname, String psw);
}
三.前端实现步骤
1.创建Vue项目,安装axios,具体安装如下
使用 npm:
npm install axios
使用 cdn:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
推荐使用npm安装
2.前端具体代码如下
前端部分没有做过多页面效果,仅用于演示功能部分
注册:
<script setup>
import { ref } from "vue";
// 导入axios
import axios from "axios";
import {ElMessage } from "element-plus";
const formModel = ref({
username: "",
password: "",
});
const form = ref();
const rules = {
username: [
{ required: true, message: "请输入用户名", trigger: "blur" },
{ min: 3, max: 10, message: "用户名必须是 5-10位 的字符", trigger: "blur" },
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ message: "密码必须是 6-15位 的非空字符", trigger: "blur" },
],
};
const reset = () =>{
formModel.value.username='',
formModel.value.password=''
}
const onSubmit = async () => {
console.log(1111);
await form.value.validate()
const res = await axios.post('http://localhost:8080/user/register', formModel.value)
if(res.data.code == 0){
ElMessage.success("注册成功!")
reset()
}else{
ElMessage.error(res.data.message)
}
}
</script>
<template>
<div style="width: 400px">
<el-form
:model="formModel"
:rules="rules"
ref="form"
size="large"
autocomplete="off"
label-width="50px"
>
<el-form-item>
<h1 style="margin: 0 auto">注册</h1>
</el-form-item>
<el-form-item prop="username" label-width="50px">
<el-input
v-model="formModel.username"
placeholder="请输入用户名"
></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="formModel.password"
type="password"
placeholder="请输入密码"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
<el-button @click="reset">重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<style scoped>
</style>
登录:
<script setup>
import { ref } from "vue";
// 导入axios
import axios from "axios";
import {ElMessage } from "element-plus";
const formModel = ref({
username: "",
password: "",
});
const form = ref();
const rules = {
username: [
{ required: true, message: "请输入用户名", trigger: "blur" },
{ min: 3, max: 10, message: "用户名必须是 5-10位 的字符", trigger: "blur" },
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ message: "密码必须是 6-15位 的非空字符", trigger: "blur" },
],
};
const reset = () =>{
formModel.value.username='',
formModel.value.password=''
}
const onSubmit = async () => {
console.log(1111);
await form.value.validate()
const res = await axios.post('http://localhost:8080/user/login', formModel.value)
if(res.data.code == 0){
ElMessage.success("登录成功!")
reset()
}else{
ElMessage.error(res.data.message)
}
}
</script>
<template>
<div style="width: 400px">
<el-form
:model="formModel"
:rules="rules"
ref="form"
size="large"
autocomplete="off"
label-width="50px"
>
<el-form-item>
<h1 style="margin: 0 auto">登录</h1>
</el-form-item>
<el-form-item prop="username" label-width="50px">
<el-input
v-model="formModel.username"
placeholder="请输入用户名"
></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="formModel.password"
type="password"
placeholder="请输入密码"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
<el-button @click="reset">重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<style scoped>
</style>
!!!注意:Vue3前端在页面中一定要进行axios的导入 import axios from "axios"
后端整体项目结构如下