• 前后端分离


    目录

    1.后端工程的pom文件

    2.后端工程的application.properties配置文件

    application.properties

    application-dev.properties

    application-prod.properties

    3.准备日志的配置文件

    4.创建工程子包

    5.创建配置类

    创建MyBatisPlusConfig配置类

    创建CrossOriginConfig跨域配置类

    创建InterceptorConfig拦截器配置类

    6.创建统一返回数据相关类

    创建响应信息枚举类ResponseMsg

    创建统一响应数据封装类ResponseData

    创建统一的自定义运行时异常类CustomException

    7.创建统一的全局异常处理器类

    8.创建用户身份令牌工具类TokenUtil

    9.创建用户身份令牌拦截器类

    10.创建实体类

    11.创建Mapper接口和Mapper.xml文件

    12.创建Srevice接口和ServiceImpl实现类

    13.创建Rest风格的控制器类

    14.创建自定义的分页器类

    15.API接口文档


    1.后端工程的pom文件

    1. <!--springboot工程web开发启动器-->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-web</artifactId>
    5. </dependency>
    6. <!--mybatisplus开发启动器-->
    7. <dependency>
    8. <groupId>com.baomidou</groupId>
    9. <artifactId>mybatis-plus-boot-starter</artifactId>
    10. <version>3.4.2</version>
    11. </dependency>
    12. <!--devtools热启动工具(修改Java代码后无需重启, 只需maven编译即可)-->
    13. <dependency>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-devtools</artifactId>
    16. <scope>runtime</scope>
    17. <optional>true</optional>
    18. </dependency>
    19. <!--mysql驱动包, 降低版本到5.1.47-->
    20. <dependency>
    21. <groupId>mysql</groupId>
    22. <artifactId>mysql-connector-java</artifactId>
    23. <version>5.1.47</version>
    24. <scope>runtime</scope>
    25. </dependency>
    26. <!--lombok (实体类注解, @Sl4j日志注解)-->
    27. <dependency>
    28. <groupId>org.projectlombok</groupId>
    29. <artifactId>lombok</artifactId>
    30. <optional>true</optional>
    31. </dependency>
    32. <!--jwt (创建和校验token令牌)-->
    33. <dependency>
    34. <groupId>com.auth0</groupId>
    35. <artifactId>java-jwt</artifactId>
    36. <version>3.4.0</version>
    37. </dependency>
    38. <!--springboot单元测试依赖-->
    39. <dependency>
    40. <groupId>org.springframework.boot</groupId>
    41. <artifactId>spring-boot-starter-test</artifactId>
    42. <scope>test</scope>
    43. <exclusions>
    44. <exclusion>
    45. <groupId>org.junit.vintage</groupId>
    46. <artifactId>junit-vintage-engine</artifactId>
    47. </exclusion>
    48. </exclusions>
    49. </dependency>

    2.后端工程的application.properties配置文件

    application.properties

    1. spring.application.name=back
    2. spring.profiles.active=dev
    3. logging.config=classpath:log.xml

    application-dev.properties

    1. server.port=8888
    2. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    3. spring.datasource.name=defaultDataSource
    4. spring.datasource.url=jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8&useSSL=false
    5. spring.datasource.username=root
    6. spring.datasource.password=root
    7. mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    8. mybatis-plus.type-aliases-package=com.example.back.entity
    9. mybatis-plus.configuration.auto-mapping-behavior=full

    application-prod.properties

    
    

    3.准备日志的配置文件

    1. 4.创建工程子包

    创建在src/main/java/com.example.shopback中

    1. config (配置类包)

    2. controller (控制器包)

    3. entity (实体类包)

    4. exception (全局异常处理包)

    5. interceptor (拦截器包)

    6. mapper (mybatisplus接管的mapper层接口包)

    7. page (自定义的分页器包)

    8. response (自定义的统一返回数据格式包)

    9. service (业务层包)

    10. util (工具包)

    创建在src/main/resources中

    mapper (用来编写SQL语句的mapper.xml文件目录)

    添加src/main/resources目录中的xml文件打包的配置

    1. <build>
    2. ..........
    3. <resources>
    4. <resource>
    5. <directory>src/main/resources</directory>
    6. <includes>
    7. <include>**/*.xml</include>
    8. <include>**/*.properties</include>
    9. </includes>
    10. </resource>
    11. </resources>
    12. </build>

    5.创建配置类

    创建MyBatisPlusConfig配置类

    这个配置类的作用是配置分页的时候SQL语句使用MySQL的limit语法

    1. @Configuration
    2. public class MyBatisPlusConfig {
    3. @Bean
    4. public MybatisPlusInterceptor mybatisPlusInterceptor(){
    5. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
    6. PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
    7. mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
    8. return mybatisPlusInterceptor;
    9. }
    10. }

    创建CrossOriginConfig跨域配置类

    1. @Configuration
    2. public class CrossOriginConfig implements WebMvcConfigurer {
    3. @Override
    4. public void addCorsMappings(CorsRegistry registry) {
    5. registry.addMapping("/**")
    6. .allowedOrigins("*")
    7. .allowedHeaders("*")
    8. .allowedMethods("*")
    9. .allowCredentials(true);
    10. WebMvcConfigurer.super.addCorsMappings(registry);
    11. }
    12. }

    创建InterceptorConfig拦截器配置类

    1. @Configuration
    2. public class InterceptorConfig implements WebMvcConfigurer {
    3. @Override
    4. public void addInterceptors(InterceptorRegistry registry) {
    5. }
    6. }

    6.创建统一返回数据相关类

    创建响应信息枚举类ResponseMsg

    信息代码code和信息内容msg参考了《阿里巴巴开发手册》

    枚举类型ResponseMsg可以作为变量的数据类型

    SUCCESS("000000", "一切ok") 这行代码等同于

    public static final ResponseMsg SUCCESS = new ResponseMsg("000000", "一切ok");

    1. public enum ResponseMsg {
    2. SUCCESS("000000", "一切ok"),
    3. USER_ALREADY_EXIST("A0111","用户名已存在"),
    4. USER_NOT_EXIST("A0201","用户账户不存在"),
    5. PASSWORD_ERROR("A0210","用户密码错误"),
    6. TOKEN_ERROR("A0220","用户令牌失效"),
    7. SYSTEM_ERROR("B0001","系统执行出错"),
    8. DATABASE_ERROR("C0300","数据库服务出错");
    9. private String code;
    10. private String msg;
    11. ResponseMsg(String code, String msg){
    12. this.code = code;
    13. this.msg = msg;
    14. }
    15. public String getCode() {
    16. return code;
    17. }
    18. public String getMsg() {
    19. return msg;
    20. }
    21. }

    创建统一响应数据封装类ResponseData

    这个类用于Rest风格的控制器中方法的返回值类型

    也就是说所有的Rest风格的控制器中的方法全部统一返回ResponseData类型

    因为Rest风格的控制器不做转发和重定向,只需返回json格式的数据给前端的ajax

    这个相对于用ResponseData类统一了json数据的格式

    该类有三个成员变量

    code 信息代码

    msg 信息内容

    data 响应数据

    该类有两个静态方法

    success() 接收一个Object类型的任意对象作为参数(改参数就是返回的数据), 返回一个请求成功的结果, 携带数据, json格式大概是这样的

    1. {
    2. "code": "000000",
    3. "msg" "一切ok",
    4. "data": 任意类型的数据
    5. }

    failure() 接收一个枚举类型ResponseMsg作为参数(该类型包含code和msg), 返回一个请求失败的结果, 携带错误信息, json格式大概是这样的

    1. {
    2. "code": 枚举的任意信息代码,
    3. "msg" 枚举的任意信息内容
    4. }

    1. @Data
    2. public class ResponseData {
    3. private String code;
    4. private String msg;
    5. private Object data;
    6. public static ResponseData success(Object data){
    7. ResponseData responseData = new ResponseData();
    8. responseData.setCode(ResponseMsg.SUCCESS.getCode());
    9. responseData.setMsg(ResponseMsg.SUCCESS.getMsg());
    10. responseData.setData(data);
    11. return responseData;
    12. }
    13. public static ResponseData failure (ResponseMsg responseMsg){
    14. ResponseData responseData = new ResponseData();
    15. responseData.setCode(responseMsg.getCode());
    16. responseData.setMsg(responseMsg.getMsg());
    17. return responseData;
    18. }
    19. }

    创建统一的自定义运行时异常类CustomException

    这个类中有一个ResponseMsg枚举类型的成员变量

    提供构造方法和get方法

    1. public class CustomException extends RuntimeException{
    2. private ResponseMsg responseMsg;
    3. public CustomException(ResponseMsg responseMsg){
    4. super(responseMsg.getCode() + ":" + responseMsg.getMsg());
    5. this.responseMsg = responseMsg;
    6. }
    7. public ResponseMsg getResponseMsg() {
    8. return responseMsg;
    9. }
    10. }

    7.创建统一的全局异常处理器类

    这个类使用了@RestControllerAdvice注解, 该注解是基于AOP面向切面, 代理了全局任意地方的异常捕捉和处理, 也就说, 无论是娜个拦截器,控制器,Srevice,Mapper, ......中任何方法中出现了异常,都会被这个类捕捉到

    那么有了这个全局异常处理器, 我们就可以优雅的处理程序中的异常, 不需要自己写try...catch

    也不需要throws向上抛出

    这个类中有两个方法

    1. customExceptionHandler() 这个方法用于捕捉和处理我们自定义的异常CustomException

    2. globalExceptionHandler() 这个方法用于捕捉和处理除了我们自定义的异常之外所有的其他异常

    1. @Slf4j
    2. @RestControllerAdvice
    3. public class GlobalExceptionAdvice {
    4. @ExceptionHandler({CustomException.class})
    5. public ResponseData customExceptionHandler(CustomException e) {
    6. e.printStackTrace();
    7. return ResponseData.failure(e.getResponseMsg());
    8. }
    9. @ExceptionHandler({Exception.class})
    10. public ResponseData globalExceptionHandler(Exception e) {
    11. log.error(e.getMessage(), e);
    12. if (e instanceof SQLException){
    13. return ResponseData.failure(ResponseMsg.DATABASE_ERROR);
    14. }else {
    15. return ResponseData.failure(ResponseMsg.SYSTEM_ERROR);
    16. }
    17. }
    18. }

    8.创建用户身份令牌工具类TokenUtil

    注意: 需要安装jwt依赖

    需要有User实体类 (包含id和username属性即可)

    1. public class TokenUtil {
    2. private static final String secret = "!A@B#F$G%K^U&E*L";
    3. private static Algorithm getAlg(){
    4. return Algorithm.HMAC256(secret);
    5. }
    6. public static String getToken(User user){
    7. System.out.println(user);
    8. Calendar calendar = Calendar.getInstance();
    9. calendar.add(Calendar.SECOND,60 * 30);
    10. return JWT.create()
    11. .withClaim("id", user.getId())
    12. .withClaim("username", user.getUsername())
    13. .withExpiresAt(calendar.getTime())
    14. .sign(getAlg());
    15. }
    16. public static User verityToken(String token){
    17. User user = new User();
    18. DecodedJWT jwt = JWT.require(getAlg()).build().verify(token);
    19. user.setId(Integer.parseInt(jwt.getClaim("id").asString()));
    20. user.setUsername(jwt.getClaim("username").asString());
    21. return user;
    22. }
    23. }

    9.创建用户身份令牌拦截器类

    1. public class TokenInterceptor implements HandlerInterceptor {
    2. @Override
    3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    4. String token = request.getHeader("token");
    5. try {
    6. TokenUtil.verityToken(token);
    7. }catch (Exception e){
    8. e.printStackTrace();
    9. throw new CustomException(ResponseMsg.TOKEN_ERROR);
    10. }
    11. return true;
    12. }
    13. }

    用户身份令牌拦截器类创建好以后, 要去拦截器配置类中配置一下拦截地址和放行地址

    1. @Configuration
    2. public class InterceptorConfig implements WebMvcConfigurer {
    3. @Override
    4. public void addInterceptors(InterceptorRegistry registry) {
    5. registry.addInterceptor(new TokenInterceptor())
    6. .addPathPatterns("/api/**")
    7. .excludePathPatterns("/api/user/login");
    8. }
    9. }

    10.创建实体类

    BaseEntity 实体类父类

    1. @Data
    2. public class BaseEntity {
    3. @TableId(type = IdType.AUTO)
    4. private Integer id;
    5. private Integer isDelete;
    6. private String createDate;
    7. private String modifyDate;
    8. }

    User 用户实体类继承BaseEntity

    1. @Data
    2. public class User extends BaseEntity{
    3. private String username;
    4. private String sex;
    5. private String mobile;
    6. private String idCode;
    7. private String avatar;
    8. private String password;
    9. private String idCardFront;
    10. private String idCardBack;
    11. @TableField(exist = false)
    12. private String token;
    13. }

    实体类中的命名与数据库表中的命名满足驼峰和全小写加_连字符的规范, 就不需要添加

    @TableField注解进行名称映射,如果不满足规范,需要添加注解映射

    其他实体类省略........

    11.创建Mapper接口和Mapper.xml文件

    UserMapper接口

    1. public interface UserMapper extends BaseMapper<User> {
    2. }

    UserMapper.xml文件 (通过namespace与接口绑定)

    1. "1.0" encoding="UTF-8" ?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.example.back.mapper.UserMapper">
    5. mapper>

    其他Mapper接口和Mapper.xml文件省略........

    注意: 启动类上添加@MapperScan()注解

    1. 12.创建Srevice接口和ServiceImpl实现类

    UserService接口

    1. public interface UserService {
    2. }

    UserServiceImpl实现类

    1. 添加Service注解让IoC发现

    2. 添加@Resource注解注入userMapper对象

    1. @Service
    2. public class UserServiceImpl implements UserService {
    3. @Resource
    4. private UserMapper userMapper;
    5. }

    13.创建Rest风格的控制器类

    UserController控制器类

    1. 前后端分离, 所有的控制器全部使用@RestController (前后端不分离使用@Controller)

    2. 所有的控制器类上使用@RequestMapper绑定的url地址, 全部以"/api"为前缀

    例如, 用户控制器类的url是 "/api/user"

    商品控制器类的url是 "/api/product"

    api有两个意思:

    1. 某些三方库里面的接口,类可以称为 "xxx框架的API",或者官方JDK里面的接口,类可以称为"官方JDK API"

    2. 后端程序的请求地址,可以称为"xxx数据接口api"

    这里说的api自然是第二种意思, 就是数据接口的意思

    1. @RestController
    2. @RequestMapping("/api/user")
    3. public class UserController {
    4. @Resource
    5. private UserService userService;
    6. }

    其他控制器省略......

    14.创建自定义的分页器类

    UserPage分页器类

    1. 继承MyBatisPlus提供的Page分页器类

    2. 自定义成员变量, 用于接收查询参数

    1. @Data
    2. public class UserPage extends Page {
    3. private String username;
    4. private String idCode;
    5. private String mobile;
    6. }

    其他分页器类省略.......

    15.API接口文档

     

  • 相关阅读:
    halcon深度学习中的样本增强
    ubuntu安装配置mantis
    jQuery 效果- 动画
    SOCKS5代理、代理IP、HTTP与网络安全
    .NET周报【11月第3期 2022-11-22】
    达梦(DM)数据库管理表
    API响应状态
    接口自动化测试框架postman tests常用方法
    Alfred v5.1.2(Mac应用快速启动)
    人机环境系统智能有利于防止人工智能失控
  • 原文地址:https://blog.csdn.net/m0_56017821/article/details/126752951