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

1.R-封装结果类

@Data
public class R<T> {

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

    private String msg; //错误信息

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

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

}
@Data:

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

R<T>:

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

static <T>:

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

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<Employee> 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<Employee> 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<Employee> 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-员工退出

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值