• SpringBoot( 扩展篇 ==> 使用枚举完成前后端数据传输规范


    本章导学:

    • Result类设计
    • enum设计
    • controller层设计
    • service与mapper层设计

    在我们平时的开发中,后端响应回给前端的请求一般都需要规范成统一的格式,比如下图的这种格式,当然,也可以按照实际的需求进行修改。

    • data:响应回来的数据
    • msg:响应返回的消息
    • code:接口执行后返回的状态码(用于判断访问成功或失败)

    一、enum枚举设计

    先看看不使用枚举我们怎么处理code

    可以看的出,是比较麻烦和重复的,而且也只定义了code没有定义msg 

    接下来我们定义一个枚举类来统一处理code和msg

    1. package com.brrbaii.reggie.common;
    2. import lombok.Getter;
    3. @Getter
    4. public enum CommontEnum {
    5. LOGIN_SUCCESS(20001,"登陆成功!"),
    6. LOGIN_ERROR(20002,"登录失败,请检查用户名或密码!");
    7. private Integer code;
    8. private String msg;
    9. CommontEnum(Integer code, String msg) {
    10. this.code = code;
    11. this.msg = msg;
    12. }
    13. }

    我们把code和msg封装在一起

    二、定义Result类

    1. package com.brrbaii.reggie.common;
    2. import lombok.Data;
    3. import lombok.extern.slf4j.Slf4j;
    4. @Slf4j
    5. @Data
    6. /**
    7. * 通用返回类
    8. * @author brrbaii
    9. * @date 2022/9/24
    10. */
    11. public class Result {
    12. //响应数据
    13. private T data;
    14. //响应消息
    15. private String msg;
    16. //响应代码
    17. private Integer code;
    18. /**
    19. * 请求成功
    20. * @param msg
    21. * @param data
    22. * @return
    23. */
    24. public static Result success(CommontEnum commontEnum,Object data){
    25. Result result = new Result();
    26. result.setMsg(commontEnum.getMsg());
    27. result.setData(data);
    28. result.setCode(commontEnum.getCode());
    29. return result;
    30. }
    31. /**
    32. * 请求失败
    33. * @param msg
    34. * @return
    35. */
    36. public static Result error(CommontEnum commontEnum){
    37. Result result = new Result();
    38. result.setMsg(commontEnum.getMsg());
    39. result.setCode(commontEnum.getCode());
    40. return result;
    41. }
    42. }

     在Result类里,我们定义了两个静态方法success和error,用于处理成功和失败的情况

     在success里,我们传输先前定义的枚举对象commontEnum,和data

    commontEnum里有我们需要的code和msg信息,data用来接收mapper处理后返回的数据

    三、编写Controller层

    1. package com.brrbaii.reggie.contorller;
    2. import com.brrbaii.reggie.common.CommontEnum;
    3. import com.brrbaii.reggie.common.Result;
    4. import com.brrbaii.reggie.entity.Employee;
    5. import com.brrbaii.reggie.service.EmployeeService;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.web.bind.annotation.*;
    8. import javax.servlet.http.HttpServletRequest;
    9. /**
    10. * 员工控制类
    11. * @author brrbaii
    12. * @date 2022/9/24
    13. */
    14. @RestController
    15. @RequestMapping("/employee")
    16. public class EmployeeController {
    17. @Autowired
    18. private EmployeeService employeeService;
    19. /**
    20. * 登录请求处理
    21. * @param employee
    22. * @return
    23. */
    24. @PostMapping("/login")
    25. public Result login(HttpServletRequest req, @RequestBody Employee employee){
    26. Employee result = employeeService.login(req, employee);
    27. if(result == null){
    28. return Result.error(CommontEnum.LOGIN_ERROR);
    29. }
    30. else{
    31. //登录成功后把ID设置到Session里方便后续使用
    32. req.getSession().setAttribute("EmployeeId",result.getId());
    33. return Result.success(CommontEnum.LOGIN_SUCCESS,result);
    34. }
    35. }
    36. }

     在controller层,我们只需要判断service返回的数据传枚举类里对应的属性就好了

     用postMan测试一下,看看返回的数据格式是什么

    这样前端访问我们接口返回的数据只用使用如下格式就行了

    axios.post("/接口","数据模型").then((res)=>{

            res.data.data        //获取data数据
            res.data.msg        //获取msg消息
            res.data.code        //获取状态码code

    })

    四、service层与Mapper

    Service接口:

    1. package com.brrbaii.reggie.service;
    2. import com.brrbaii.reggie.entity.Employee;
    3. import javax.servlet.http.HttpServletRequest;
    4. /**
    5. * 员工业务接口
    6. * @author brrbaii
    7. * @date 2022/9/24
    8. */
    9. public interface EmployeeService {
    10. Employee login(HttpServletRequest req, Employee employee);
    11. }

     Service实现类

    1. package com.brrbaii.reggie.service.Impl;
    2. import com.brrbaii.reggie.entity.Employee;
    3. import com.brrbaii.reggie.mapper.EmployeeMapper;
    4. import com.brrbaii.reggie.service.EmployeeService;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import org.springframework.util.DigestUtils;
    8. import javax.servlet.http.HttpServletRequest;
    9. @Service
    10. public class EmployeeServiceImpl implements EmployeeService {
    11. @Autowired
    12. private EmployeeMapper employeeMapper;
    13. /**
    14. * 登录模块
    15. * @param req
    16. * @param employee
    17. * @return
    18. */
    19. @Override
    20. public Employee login(HttpServletRequest req, Employee employee) {
    21. //1、获取密码,并进行MD5加密
    22. String password = DigestUtils.md5DigestAsHex(employee.getPassword().getBytes());
    23. //2、根据前台传过来的用户名查询数据库是否存在当前用户
    24. Employee resultEmp = employeeMapper.selectByName(employee);
    25. //3、密码正确则返回
    26. if(resultEmp.getPassword().equals(password)){
    27. return resultEmp;
    28. }
    29. return null;
    30. }
    31. }

    mapper: 

     Mapper接口:

    1. package com.brrbaii.reggie.mapper;
    2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    3. import com.brrbaii.reggie.entity.Employee;
    4. import org.springframework.stereotype.Repository;
    5. /**
    6. * 员工数据层
    7. * @author brrbaii
    8. * @date 2022/9/24
    9. */
    10. @Repository
    11. public interface EmployeeMapper extends BaseMapper {
    12. Employee selectByName(Employee employee);
    13. }

     MapperXml:

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.brrbaii.reggie.mapper.EmployeeMapper">
    6. <select id="selectByName" resultType="employee">
    7. select * from employee where username = #{username}
    8. select>
    9. mapper>

  • 相关阅读:
    初识MySQL
    手把手教你君正X2000开发板的OpenHarmony环境搭建
    Java基础——初始Java(2)数据类型+运算符
    C#软件架构设计原则
    c语言程序设计课后习题答案
    fatal error: H5Cpp.h: No such file or directory #include “H5Cpp.h“
    每日一题 2511. 最多可以摧毁的敌人城堡数目
    安装nodejs
    java从键盘输入Scanner
    个人做量化交易一定不靠谱?
  • 原文地址:https://blog.csdn.net/weixin_48841931/article/details/127115494