今天要完成的任务是先创建一个专门用于封装统一返回的工具类,还有注册和登录页面以及接口的实现。(前端页面我只提供效果图,逻辑还是会写的)
注册和登录路由命名为register和login
前端简单带过一下,先做后端再传递响应数据给前端。
提前说一下 后端一般最好把响应数据统一一下,这样更方便于接口测试。
创建的类为Result.java以下是类的代码:
package com.campusvolunteering.badmintonafter.common;
import lombok.Data;
@Data
public class Result {
// 静态属性
private static final String SUCCESS = "200";
private static final String ERROR = "0";
// 类的属性
private String code;
private String msg;
private Object data;
// 自定义方法
public static Result success() {
// 创建了一个Result对象
Result result = new Result();
result.setCode(SUCCESS); // 把success的值设置为code的值
result.setMsg("查询成功");
return result;
}
public static Result success(Object data, String msg) {
Result result = new Result();
// 设置code 和数据
result.setCode(SUCCESS);
result.setData(data);
result.setMsg(msg);
return result;
}
public static Result error(String msg) {
Result result = new Result();
// 设置code值和报错信息
result.setCode(ERROR);
result.setMsg(msg);
return result;
}
}
在这里我设置了静态的变量 一个是成功的编号为200 一个是失败的编号为0;还有三个方法,一个成功的无参方法,一个是成功的带参方法,还有一个就是失败的方法。
在这里我设置注册和登录接口方式为Post,接口路径为/register(注册接口)
在AdminController文件中我先获取了role权限值(1代表管理员2代表用户),之后继续判断是否为用户(正常管理员是不可以直接注册的,是需要管理员权限进入系统手动添加),判断是用户之后进行调用Service层的方法(这里引入了UserService层的 私有属性 当然引入也需要注解@Resource),调用UserService层中的userRegister方法,在Service层中进行写插入语句,这样将数据插入数据表就相当于创建一个用户(但是在这需要校验是否用户名唯一性,以及是否存在用户名输入为空的情况),校验用户名唯一性,需要先获取前端请求数据的用户名,通过获取的用户名进行查询用户数据库是否存在符合这个用户的,用变量dbAdmin来接收用户的信息,之后通过ObjectUtils工具类提供是否为空(isNotEmpty),如果满足了这个条件说明用户名已经被注册过了,这时需要报异常,提示用户名已存在。如果上面都满足了直接使用insertSelective方法,这样系统会自动的运行插入语句,进行完成注册。
AdminController
@PostMapping("/register")
public Result register(@RequestBody Account account){
// 这里获取权限值
Integer role = account.getRole();
Account register = new Account();
// 因为注册只有用户可以主动注册 所以只判断了用户的权限值
if(2 == role){
User user = new User();
BeanUtils.copyProperties(account, user);
register = userService.userRegister(user);
}
return Result.success(register, "注册成功!");
}
AdminService
public User userRegister(User user) {
// 获取用户名
String userName = user.getUserName();
// 查询是否存在该用户名的用户信息
User dbUser = userMapper.findByName(userName);
// 存在抛出异常
if(ObjectUtil.isNotEmpty(dbUser)){
throw new CustomException(ResultCode.USER_EXIST_ERROR);
}
// 不存在直接插入数据
userMapper.insertSelective(user);
// 返回数据
return user;
}
而在这里我使用了快捷方法,所以在Mapper层没有写代码。
在前端方面也判断了输入框中的数据 是否为空和两次输入的密码是否一致 还有角色是否已经选择上了。
register() {
if (!this.form.userName) {
this.$notify.error("用户名不能为空")
return
}
if (!this.form.password || !this.form.newPassword) {
this.$notify.error("密码不能为空")
return
}
if (this.form.password !== this.form.newPassword) {
this.$notify.error("两次输入密码不一致")
return
}
if (!this.form.role) {
this.$notify.error("请选择角色")
return
}
request.post("/account/register", this.form).then(res => {
if (res.code === '200') {
this.$message.success(res.msg)
this.$router.push("/manager/user")
} else {
this.$message.error(res.msg)
}
})
}
this.form就是上面表单标签传递下来的值
登录接口方面的功能实现以及前端逻辑如下:
接口路径设计为/login,还是像注册一样,先获取一下权限值,是用户还是管理员,在这里会有两个角色登录,如果用户登录就在UserController文件中写,管理员登录即在AdminController文件中写,之后在AdminService文件中通过用户名获取用户信息,在这里还是自定义是否存在该用户以及判断密码是否正确。校验密码是否正确需要先拿出来输入的密码和查询到的用户信息里的密码进行相比较,是否相同,相同登录成功,不相同登录失败;登录成功后把查询到的用户信息都返回给前端。
AdminController
@PostMapping("/login")
public Result Login(@RequestBody Account account){
// 获取role权限值
Integer role = account.getRole();
// 之后进行判断是用户登录还是管理员登录
if(1 == role){
Admin admin = new Admin();
return Result.success(adminService.adminLogin(admin), "登录成功!");
AdminService
public Admin adminLogin(Admin admin) {
// 获取用户名 是否存在该用户
String userName = admin.getUserName();
Admin dbAdmin = adminMapper.findByName(userName);
if(ObjectUtil.isEmpty(dbAdmin)){
throw new CustomException(ResultCode.USER_NOT_EXIST_ERROR);
}
// 判断输入的密码和数据库中密码是否相对应
String password = admin.getPassword();
String dbPassword = dbAdmin.getPassword();
if(!password.equalsIgnoreCase(dbPassword)){
throw new CustomException(ResultCode.USER_PASSWORD_ERROR);
}
// 如果上面流程没异常 则传过去该用户信息
return dbAdmin;
}
AdminMapper
@Repository
public interface AdminMapper extends Mapper<Admin> {
@Select("select * from admin where userName = #{userName}")
Admin findByName(@Param("userName") String userName);
}
在前端登录逻辑跟注册相同,代码如下:
login() {
if (!this.form.userName) {
this.$notify.error("用户名不能为空")
return
}
if (!this.form.password) {
this.$notify.error("密码不能为空")
return
}
if (!this.form.role) {
this.$notify.error("请选择角色")
return
}
request.post("/account/login", this.form).then(res => {
if (res.code === '200') {
let token = res.data.token
let user = res.data.user
localStorage.setItem("token", token)
localStorage.setItem("user", JSON.stringify(user))
this.$message.success(res.msg)
this.$router.push("/manager/admin")
} else {
this.$message.error(res.msg)
}
})
}
今天的任务总结下来相当于只完成了一个功能模块,注册和登录功能如出一辙,所以在登录功能模块解释了简洁了一些。有什么见解以及代码问题可以发布在评论区或者私信作者。要代码请关注私信。