SpringBoot实现点餐系统的登录与退出功能流程详解

 更新时间:2022年10月12日 14:30:32   作者:懒羊羊.java  
结束了Springboot+MyBatisPlus也是开始了项目之旅,将从后端的角度出发来整理这个项目中重点业务功能的梳理与实现

一.登录功能前置

首先,我们需要在数据库中建立对应的表…

基于人员登录功能,OOP的模式告诉我们要创建员工对应的实体类(Lombok自动生成getter,setter)就像这样:

@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;
}

数据层设计:

基于SpringBoot+MP配置工作变得十分的简单,对于数据层我们只需要通过继承mp的接口即可:

二.登录流程设计

首先进行的应该是前后端协议联调,需要把返回给前端的数据封装成一个实体R,R中定义各种状态码,登陆成功则调用成功方法返回数据对象,失败则调用失败方法返回一则自定义消息

@Data
public class R<T> {
    private Integer code; //编码:1成功,0和其它数字为失败
    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;
    }
}

对于登录的请求路径,我们设置为“login”,登陆方法也同名

当我们输入了密码点击了登录也就对应一次请求的发生,其次就是Controller层对于登录流程的开发

1、将页面提交的密码password进行md5加密处理

2、根据页面提交的用户名username查询数据库

3、如果没有查询到则返回登录失败结果

4、密码比对,如果不一致则返回登录失败结果

5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果

6、登录成功,将员工id存入Session并返回登录成功结果

首先,对于加密操作:

我们通过boot注入Service层的实体类后,就可以从每一次的请求成功中而获得的对象里拿到密码,然后进行加密操作

加密完成后,我们需要从对象里拿到username来查数据库,由于mp的优势,以前复杂的SQL操作现在就变得十分简单:

注:这里为什么可以直接getOne()?大家想过吗

因为在建表之初,对于username设置了unique索引,进行了唯一约束,所以可以直接getOne,得到employee对象

其次,针对查询完成后的结果emp,又有了以下几种判定

① 如果数据库中没有查询到则返回登录失败

        if (emp == null) {
            return R.error("登陆失败啦~");
        }

②如果在查询成功后密码比对不一致则返回登陆失败

if (!(emp.getPassword().equals(passWord))) {
            return R.error("登陆成功啦~");
        }

③如果员工状态不正确,则返回登陆失败

        if (emp.getStatus() == 0) {
            return R.error("您的账号已被禁用,请稍后重试!");
        }

④如果上述三个if都不满足,则登陆成功就将员工id存入Session并返回登陆成功结果

    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        //清理Session中保存的当前登录员工的id
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    }

完整的登录流程如下:

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;
    /**
     * 登陆开发
     */
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) {
        // 页面提交的密码进行MD5加密
        String passWord = employee.getPassword();
        passWord = DigestUtils.md5DigestAsHex(passWord.getBytes());
        //根据页面提交的用户名来查询数据库
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Employee::getUsername, employee.getUsername());
        Employee emp = employeeService.getOne(lqw);
        //如果数据库中没有查询到则返回登录失败
        if (emp == null) {
            return R.error("登陆失败啦~");
        }
        //在查询成功后进行密码比对
        if (!(emp.getPassword().equals(passWord))) {
            return R.error("登陆失败啦~");
        }
        //查看员工状态
        if (emp.getStatus() == 0) {
            return R.error("您的账号已被禁用,请稍后重试!");
        }
        //登陆成功就将员工id存入Session并返回登陆成功结果
        request.getSession().setAttribute("employee", emp.getId());
        return R.success(emp); //登陆成功并返回对象
    }
}

从后端的角度,当我完成查询操作也就是登陆成功后,控制台就会输出如下信息,查到了实体数据说明登陆成功!

三.退出登录功能

同样,在Controller中对于退出的请求路径我们设置为logout,方法也同名,对于后端人员来说我们要做的就是:

1.清理Session中存储的id

2.返回一个退出的结果

    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        //清理Session中保存的当前登录员工的id
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    }

对于这种前后端分离的项目,还有很大一部分需要结合前端来设计,但是作为一个对后端感兴趣的小伙儿就不聊前端了~

到此这篇关于SpringBoot实现点餐系统的登录与退出功能流程详解的文章就介绍到这了,更多相关SpringBoot点餐系统内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 字符串压缩与解压的开发记录

    Java 字符串压缩与解压的开发记录

    这篇文章主要介绍了Java 字符串压缩与解压的开发记录,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • spring使用WebSocket注入service层失败问题及解决

    spring使用WebSocket注入service层失败问题及解决

    这篇文章主要介绍了spring使用WebSocket注入service层失败问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java中如何判断中文字符串长度

    Java中如何判断中文字符串长度

    这篇文章主要介绍了Java中如何判断中文字符串长度问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  •  java中Thread.sleep()的具体使用

     java中Thread.sleep()的具体使用

    本文主要介绍了 java中Thread.sleep()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • @RequestBody的使用案例代码

    @RequestBody的使用案例代码

    @RequestBody主要用来接收前端传递给后端的json字符串中的数据的,这篇文章主要介绍了@RequestBody的使用,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Retrofit+Rxjava下载文件进度的实现

    Retrofit+Rxjava下载文件进度的实现

    这篇文章主要介绍了Retrofit+Rxjava下载文件进度的实现,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • Java解析json报文实例解析

    Java解析json报文实例解析

    这篇文章主要介绍了Java解析json报文实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 在SpringBoot中实现断点续传的实例代码

    在SpringBoot中实现断点续传的实例代码

    在 Spring Boot 或任何其他 web 开发框架中,断点续传是一种技术,允许文件的传输在中断后可以从中断点重新开始,而不是从头开始,种技术在处理大文件或在不稳定的网络环境中尤为重要,本文给大家介绍了SpringBoot中实现断点续传的实例代码,需要的朋友可以参考下
    2024-07-07
  • Java线程的6种状态及切换教程

    Java线程的6种状态及切换教程

    这篇文章主要给大家介绍了关于Java线程的6种状态及切换教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 详解Mybatis Generator的具体使用教程

    详解Mybatis Generator的具体使用教程

    Mybatis Generator可以帮助我们自动生成很多结构化的代码,比如每张表对应的Entity、Mapper接口和Xml文件,可以省去很多繁琐的工作,今天通过本文给大家介绍Mybatis Generator的具体使用教程,感兴趣的朋友一起看看吧
    2022-02-02

最新评论