SpringBoot瑞吉外卖项目实战(1)——登录功能实现

目录

一、管理员登录

二、管理员退出

三、网页拦截器


一、管理员登录

        1、实体创建

                按照Java面向对象的编程属性,我们首先需要创建一个实体类,在这个类中包含了该对象的所有属性,以及在必要时的方法。同时在实体类中的属性也能和数据库中该对象数据的索引对应。

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

}

由于目前实现的是后端管理页面,因此创建一个员工类,并在该类中定义员工的所有属性,其中包括员工ID、用户名、密码等信息。 

        2、创建Mapper

                Mapper的目的是将实体类中的属性和数据库中表的索引一一对应,实现方法如下:

import Reggie.entity.Employee;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}

首先需要创建一个Mapper的接口用来实现BaseMapper,在这里BaseMapper会提供一个数据输入的泛型,在这里将之前创建好的实体类导入即可。

        3、创建service

                service层相当于中间层,它为controller提供了接口,在这里我们的目的是查询数据库,因此在这里service主要提供的是数据库查询接口,当controller调用service后,service会拉取Mapper的映射去查询数据库,创建方法如下:

                创建一个service的接口实现IService

import Reggie.entity.Employee;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.stereotype.Service;

@Service
public interface EmployeeService extends IService<Employee> {
}

 这里的IService同样需要一个泛型,将之前创建的Employee输入即可

                接下来创建一个impl的类用于实现service接口

import Reggie.entity.Employee;
import Reggie.mapper.EmployeeMapper;
import Reggie.service.EmployeeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper , Employee> implements EmployeeService {
}
         4、创建controller

                controller用于和前端进行交互,同时拉取后端。

登录页面在点击按钮后生成了Post请求,因此在controller中的对应方法需要添加Post的注解。代码如下

import Reggie.common.R;
import Reggie.entity.Employee;
import Reggie.service.EmployeeService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /*
    1、判断用户名
    2、判断密码
    3、判断用户是否被禁用
     */
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request , @RequestBody Employee employee){
        //1、加密处理
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        //2、查用户名
        //将网页中的数据进行封装
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        //数据库查询,通过等值查询判断是否有此人
        queryWrapper.eq(Employee::getUsername , employee.getUsername());//等值查询
        //接收数据库查询的返回值
        Employee emp = employeeService.getOne(queryWrapper);
        if (emp == null) {
            return R.error("登录失败");
        }

        //3、密码比对
        if(!emp.getPassword().equals(password)){
            return R.error("密码错误");
        }

        //4、账号状态判断
        if (emp.getStatus() == 0) {
            return R.error("该账号已禁用");
        }

        //5、比对均通过后放行
        request.getSession().setAttribute("employee" , emp.getId());
        return R.success(emp);
    }
}

首先我们需要实例化一个EmployeeService对象用于和数据库交互,之后创建一个用于处理登录事件的方法并添加PostMapping注解,括号中加入请求的页面。之后是从网页发送回来的请求体中获取用户名和密码(此处密码进行MD5加密处理)之后是数据库查询该用户密码并判断是否放行。

 

二、管理员退出

        退出功能和登录功能是成对出现的,接下来我们将实现管理员页面的退出功能。退出功能只需要我们清除当前登录对象的session对象并退出即可。

        首先查询登录请求的页面

 当点击退出按钮后,在控制台中可以看见请求的URL地址为logout,方式为Post。因此在PostMapping中需要将该页面添加过去

 //用户退出
    @PostMapping("/logout")//网页退出的请求方式为post
    private R<String> logout(HttpServletRequest request){
        //清除session数据
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
        //退出时需要返回界面同时清除浏览器会话中的数据
    }

三、网页拦截器

        管理员界面由于隐私的问题,我们需要让未登录、未注册的用户无法访问某些关键页面,因此需要设置一个拦截器,当用户直接访问这些页面时就需要返回指定的页面。

@WebFilter
public class LoginCheckFilter implements Filter {
    //路径匹配
    public static final AntPathMatcher pathMatcher = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //获取访问路径
        String requestURI = request.getRequestURI();

        //设置无需拦截的页面
        String path [] = new String[]{
          "/employee/login",
          "/employee/logout",
          "/backend/**",
          "/front/**"
        };

        boolean filterStatus = check(path , requestURI);

        //1、状态1:直接放行
        if (filterStatus){
            filterChain.doFilter(request , response);
            return;
        }

        //2、状态2:用户已登录时放行(上述未通过)
        if (request.getSession().getAttribute("employee") != null){
            filterChain.doFilter(request , response);
            return;
        }

    }

    public boolean check(String [] url , String requestURI){
        for (String s : url) {
            boolean match = pathMatcher.match(s , requestURI);
            if (match) {
                return true;
            }
        }
        return false;
    }
}

(持续更新)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值