这篇文章主要讲解了“Java后端登录功能如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java后端登录功能如何实现”吧!
一. 登录需求分析
页面原型
1. 登录页面展示:项目路径( esourcesackendpageloginlogin.html)
员工点击登录按钮进行后管平台的登录操作,登录正确以外方式不可登录。
登录处理逻辑
将页面提交的密码进行MD5加密
根据用户名查数据库(查不到返回结果)
比对密码(密码错误返回结果)
查询员工状态,员工状态禁用下不可登录
登录成功,写入session中,返回结果。
二. 配置返回通用结果类
package com.itheima.reggie.common; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * 返回通用类 * @author jekong * @date 2022/4/22 */ @Data public class R<T> { /** 编码:1成功,0和其它数字为失败*/ private Integer code; /** 信息返回*/ private String msg; /** 信息返回数据*/ private T data; /** 动态数据*/ private Map map = new HashMap(); public static <T> R<T> success(T object) { R<T> r = new R<T>(); r.data = object; r.code = 1; return r; } public static <T> R<T> error(String msg) { R r = new R(); r.msg = msg; r.code = 0; return r; } public R<T> add(String key, Object value) { this.map.put(key, value); return this; } }
三. 登录请求API
说明 | 值 |
请求URL | /employee/login |
请求数据 | { "username": "admin", "password": "123456" } |
返回数据 | { "code": 0, "msg": "登录成功", "data": null, "map": {} } |
四. 创建实体类并实现登录逻辑
entity: 创建实体类
创建Employee.java(员工对象)
package com.itheima.reggie.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; /** * 员工实体类 * @author jektong * @date 2022/4/21 */ @Data public class Employee implements Serializable { /** 序列号*/ private static final long serialVersionUID = 1L; /**唯一主键*/ private Long id; /**用户名*/ private String username; /**姓名*/ private String name; /**密码*/ private String password; /**电话*/ private String phone; /**性别*/ private String sex; /**身份证号码*/ private String idNumber; /**状态*/ private Integer status; /**创建时间*/ private LocalDateTime createTime; /**更新时间*/ private LocalDateTime updateTime; /**添加用户时使用*/ @TableField(fill = FieldFill.INSERT) private Long createUser; /**更新用户时使用*/ @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; }
mapper数据库交互层
package com.itheima.reggie.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.itheima.reggie.entity.Employee; import org.apache.ibatis.annotations.Mapper; /** * EmployeeMapper * @author jektong * @date 2022/4/21 */ @Mapper public interface EmployeeMapper extends BaseMapper<Employee> { }
service业务层接口
package com.itheima.reggie.service; import com.baomidou.mybatisplus.extension.service.IService; import com.itheima.reggie.entity.Employee; import org.springframework.stereotype.Service; /** * @author jektong * @date 2022/4/21 */ public interface EmployeeService extends IService<Employee> { }
业务层实现类
package com.itheima.reggie.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.itheima.reggie.entity.Employee; import com.itheima.reggie.mapper.EmployeeMapper; import com.itheima.reggie.service.EmployeeService; import org.springframework.stereotype.Service; /** * @author jektong * @date 2022/4/21 */ @Service public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService { }
controller控制层
package com.itheima.reggie.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.itheima.reggie.common.CommonsConst; import com.itheima.reggie.common.R; import com.itheima.reggie.entity.Employee; import com.itheima.reggie.service.EmployeeService; import lombok.extern.slf4j.Slf4j; import org.springframework.util.DigestUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; /** * 员工控制类 * * @author tongbing * @date 2022/4/21 */ @Slf4j @RestController @RequestMapping("/employee") public class EmployeeController { @Resource private EmployeeService employeeService = null; /** * 登录请求处理 * TODO 后续改进将业务处理的代码放入业务层,这里只做数据请求与返回 * @param request * @param employee * @return */ @PostMapping("/login") public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) { // 将页面提交的密码进行MD5加密 String password = employee.getPassword(); password = DigestUtils.md5DigestAsHex(password.getBytes()); // 根据用户名查数据库 LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<Employee>(); queryWrapper.eq(Employee::getUsername, employee.getUsername()); Employee emp = employeeService.getOne(queryWrapper); // 查不到返回登录失败结果 if(emp == null){ return R.error(CommonsConst.LOGIN_FAIL); } // 比对密码 if(!emp.getPassword().equals(password)){ return R.error(CommonsConst.LOGIN_FAIL); } // 查看员工状态 if(emp.getStatus() == CommonsConst.EMPLOYEE_STATUS_NO){ return R.error(CommonsConst.LOGIN_ACCOUNT_STOP); } // 登录成功将员工的ID放入session中 request.getSession().setAttribute("employeeId",emp.getId()); return R.success(emp); } }
五. 功能测试
Debug测试时主要测试以下几点:
用户名与密码的校验
用户状态禁用情况下
数据是否正确返回
附录
常量类:
package com.itheima.reggie.common; /** * 常量定义 * @author jektong * @date 2022/4/23 */ public class CommonsConst { // 登录失败 public static final String LOGIN_FAIL = "登录失败"; // 账号禁用 public static final String LOGIN_ACCOUNT_STOP = "账号禁止使用"; // 员工账号禁用状态 0:禁用 public static final Integer EMPLOYEE_STATUS_NO = 0; // 员工账号正常状态 1:正常使用 public static final Integer EMPLOYEE_STATUS_YES = 1; }