瑞吉外卖-第一章节-R-员工登录与退出

1.R-封装结果类

@Data
public class R {

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据-->T 泛型类型,表示任意类型

    private Map map = new HashMap(); //动态数据
    //静态方法可以直接通过类名.方法名来调用。

    public static  R success(T object) {
        R r = new R();
        r.data = object;
        r.code = 1;
        return r;
    }

    public static  R error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}
@Data:

@Data注解是Lombok库中的一个注解,它提供了一些方便的方法来自动生成Java类的一些常用方法,如toString()equals()hashCode()gettersetter等。使用@Data注解可以简化Java类的编写,减少重复代码。

R:

泛型类,表示该类可以是任意类型;用于封装返回结果。其中T表示任意类型。可以是String,Integer等。

static

在Java中,static 表示一个泛型静态方法。其中,static关键字表示该方法属于类而不是实例,可以直接通过类名调用而不需要创建类的实例表示这是一个泛型方法,可以接收任意类型的参数。

2.EmployController-处理员工登录请求

@Slf4j //表示使用SLF4J日志框架进行日志记录
@RestController //表示这是一个RESTful风格的控制器,用于处理HTTP请求并返回JSON格式的数据。
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /**
     * 登录功能
     * @param request  HttpServletRequest 对象专门用于封装 HTTP 请求消息
     * @param employee 前端页面返回给我们的是json数据,@RequestBody的作用其实是将json格式的数据转为java对象
     * @param
     * @return
     */
    @PostMapping("/login")
    public R login(HttpServletRequest request, @RequestBody Employee employee) {
// 1.将页面提交的密码password进行md5加密处理, 得到加密后的字符串
        //获取页面提交的password;
        String password = employee.getPassword();
        //将密码加密
        password = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
// 2.根据页面提交的用户名username查询数据库中员工数据信息
        //获取页面提交的用户名
        String username = employee.getUsername();
        //根据此用户名来在数据库中是否有此用户
        //LambdaQueryWrapper:Mybatis-plus 条件构造器
        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
        //Employee::getUsername->相当于创建一个Employee对象,并调用此对象的getUsername()方法
        //eq()->此方法相当于赋值,把employee.getUsername()赋值给前者
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
        //通过用户名查询
        Employee emp = employeeService.getOne(queryWrapper);
// 3.如果没有查询到, 则返回登录失败结果
        if (emp == null) {
            return R.error("登录失败");
        }
// 4.密码比对,如果不一致, 则返回登录失败结果
        //判断两个字符串的值是否相等,使用equals
        //不能使用==,这是在比较两个字符串的索引值是否相同
        if (!emp.getPassword().equals(password)) {
            return R.error("登录失败");
        }

// 5. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果
        if (emp.getStatus() == 0) {
            return R.error("该用户已被禁用");
        }
// 6.登录成功,将员工id存入Session, 并返回登录成功结果
        //采用键值对存储
        request.getSession().setAttribute("employee", emp.getId());
        return R.success(emp);
    }
}
@Slf4j:

表示使用SLF4J日志框架进行日志记录。

@RestController
表示这是一个RESTful风格的控制器,用于处理HTTP请求并返回JSON格式的数据。

RestController是一个由@Controller和@ResponseBody两个注解组合而成的特殊注解。@Controller用于标识一个类为控制器,而@ResponseBody则负责将方法返回的对象转换为JSON、XML等格式并直接写入到HTTP响应体中。也就是说,使用@RestController标记的类表示这是一个RESTful风格的控制器,它可以处理HTTP请求并返回对应格式的响应。

RESTful风格控制器

RESTful风格的控制器是一种设计模式,它遵循了REST(Representational State Transfer)架构风格的主要原则。这种风格并非标准,只是提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。在Spring MVC框架中,一个RESTful风格的控制器通常负责处理用户的请求并返回相应的数据

具体来说,一个RESTful风格的控制器通常包含一个或多个方法,每个方法负责处理一种特定的用户请求。这些方法通过接口定义或注解定义来实现。例如,在一个处理员工登录的控制器中,可能会有一个处理GET请求的方法用于显示登录页面,以及一个处理POST请求的方法用于处理用户提交的登录表单。

此外,RESTful风格强调使用HTTP动词来表示对资源的操作(如GET、POST、PUT、PATCH、DELETE等),并通过URI(Uniform Resource Identifier)表示资源的唯一标识符。例如,在上面提到的员工登录控制器中,可能会有一个URL为"/employee/login"的方法用于处理用户提交的登录请求。

@RequestMapping("/employee")

表示该控制器处理以"/employee"为前缀的URL请求

@RequestMapping是Spring MVC框架中的一个注解,用于映射HTTP请求到特定的处理方法。它通常与@Controller注解一起使用,以便将请求映射到控制器类的方法。

@Autowired

使用了@Autowired注解来自动注入一个名为employeeService的服务对象。这个服务对象负责处理与员工相关的业务逻辑。

@Autowired是Spring框架中的一个注解,用于自动装配bean。它可以将一个bean注入到另一个bean中,或者将一个bean注入到一个字段、构造函数或setter方法中。使用@Autowired注解可以简化依赖注入的过程,提高代码的可读性和可维护性。

@PostMapping("/login")
由于需求分析时 , 我们看到前端发起的请求为 post 请求 , 所以服务端需要使用注解
@PostMapping

@PostMapping("/login")是Spring框架中的一个注解,用于处理HTTP POST请求。它通常与@Controller注解一起使用,以便将请求映射到特定的处理方法。在这个例子中,/login路径将被映射到名为login的方法上。

HttpServletRequest

HttpServletRequest是Java Servlet API中的一个接口,用于表示客户端发送给服务器的HTTP请求。它包含了请求的各种信息,如请求方法、请求URI、请求头、请求参数等。在Java Web开发中,我们可以通过HttpServletRequest对象来获取这些信息,以便对请求进行处理和响应。

ServletRequest与HttpServletRequest的区别

ServletRequest和HttpServletRequest都是Java Servlet API中的接口,它们有一些区别。ServletRequest是Servlet规范定义的通用请求接口,定义了所有Servlet请求对象必须遵循的通用行为和功能。而HttpServletRequest则是ServletRequest的子接口,它继承了ServletRequest并添加了一些特定于HTTP协议的方法,如getHeader()、getMethod()等。总的来说,ServletRequest是一种更广义的请求接口,而HttpServletRequest是针对HTTP协议的专用接口

@RequestBody
由于前端传递的请求参数为 json 格式的数据 , 这里使用 Employee 对象接收 , 但是将 json 格式数
据封装到实体类中 , 在形参前需要加注解 @RequestBody

@RequestBody是Spring框架中的一个注解,用于将请求体中的数据绑定到方法参数上。它通常与@RestController或@Controller一起使用,以便将客户端发送的JSON、XML或其他格式的数据解析为Java对象,并将其作为方法参数传递。这样,我们可以在控制器方法中直接处理这些数据,而无需手动解析请求体

密码加密
password = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));

这段代码是使用Apache Commons Codec库中的DigestUtils类对密码进行MD5加密。首先,它将密码转换为UTF-8编码的字节数组,然后使用md5DigestAsHex方法将字节数组转换为16进制字符串表示的MD5哈希值。最后,将加密后的密码赋值给变量password。

LambdaQueryWrapper
LambdaQueryWrapper:Mybatis-plus 条件构造器,用于构建复杂的查询条件。它提供了链式调用的方式,可以方便地组合多个查询条件。
条件查询
  //获取页面提交的用户名
        String username = employee.getUsername();
        //根据此用户名来在数据库中是否有此用户
        //LambdaQueryWrapper:Mybatis-plus 条件构造器
        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
        //Employee::getUsername->相当于创建一个Employee对象,并调用此对象的getUsername()方法
        //eq()->此方法相当于赋值,把employee.getUsername()赋值给前者
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
        //通过用户名查询
        Employee emp = employeeService.getOne(queryWrapper);

首先创建一个条件构造器,

Employee::getUsername->相当于创建一个Employee对象,并调用此对象的getUsername()方法
LambdaQueryWrapper的eq方法用于添加一个等于查询条件,表示查询Employee实体类中的username字段等于传入的employee对象的username属性。因此,使用get方法来获取employee对象的username属性值,而不是set方法来设置该属性值。字段等于值
getOne()

getOne()是Mybatis-Plus中的一个通用查询方法,用于根据指定的查询条件查询一条记录。它接收一个QueryWrapper对象作为参数,返回一个实体类对象。

equals()
//判断两个字符串的值是否相等,使用equals
//不能使用==,这是在比较两个字符串的索引值是否相同
员工id存入session
request.getSession().setAttribute("employee", emp.getId());

将员工id存入Session

这段代码是Java Web开发中的一部分,用于将一个名为"employee"的属性值设置为emp对象的id。

具体来说,request.getSession() 获取当前请求的会话对象,然后使用 setAttribute() 方法将 "employee" 属性的值设置为 emp 对象的 id。这样,在后续的请求处理过程中,可以通过 request.getSession().getAttribute("employee") 来获取该属性的值。

EmployeeController-员工退出

瑞吉外卖-第一章节-R-员工登录与退出_第1张图片

瑞吉外卖-第一章节-R-员工登录与退出_第2张图片

瑞吉外卖-第一章节-R-员工登录与退出_第3张图片

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

你可能感兴趣的:(瑞吉外卖,java,数据库,前端)