• 小型框架集合


    一、VUE框架qs框架

    formdata数据格式转换

    npm i qs -S

    添加(main.js)

    import qs from 'qs';

    Vue.prototype.qs=qs;

    使用:let formData= this.qs.stringify(this.ruleForm);;主要功能代替JSON对象转换为fromdata数据往后台传输,后台不用添加@RequestBody

    二、jackson框架

    主要用于序列化和反序列化(SpringMVC自动加载)

    使用:#jackson:JSON中有null值时不显示空值

    jackson: default-property-inclusion: non_null

    三、在线文档 Knife4j

    Knife4j是一款基于Swagger 2的在线API文档框架。当前建议使用的Knife4j版本,只适用于Spring Boot 2.6以下版本,不含Spring Boot 2.6, 在主配置文件(application.yml)中开启Knife4j的增强模式, 添加Knife4j的配置类,进行必要的配置, 必须指定控制器的包。

            添加依赖



        com.github.xiaoymin
        knife4j-spring-boot-starter
        2.0.9

             主配置文件

    在`application.yml`中添加配置:
     
    ```yaml
    knife4j:
      enable: true

            添加配置类config

    1. package cn.tedu.csmall.passport.config;
    2. import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.Configuration;
    7. import springfox.documentation.builders.ApiInfoBuilder;
    8. import springfox.documentation.builders.PathSelectors;
    9. import springfox.documentation.builders.RequestHandlerSelectors;
    10. import springfox.documentation.service.ApiInfo;
    11. import springfox.documentation.service.Contact;
    12. import springfox.documentation.spi.DocumentationType;
    13. import springfox.documentation.spring.web.plugins.Docket;
    14. import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
    15. /**
    16. * Knife4j配置类
    17. *
    18. * @author java@tedu.cn
    19. * @version 0.0.1
    20. */
    21. @Slf4j
    22. @Configuration
    23. @EnableSwagger2WebMvc
    24. public class Knife4jConfiguration {
    25. /**
    26. * 【重要】指定Controller包路径
    27. */
    28. private String basePackage = "cn.tedu.csmall.passport.controller";
    29. /**
    30. * 分组名称
    31. */
    32. private String groupName = "passport";
    33. /**
    34. * 主机名
    35. */
    36. private String host = "http://xxxxx.cn";
    37. /**
    38. * 标题
    39. */
    40. private String title = "酷鲨商城在线API文档--管理员管理";
    41. /**
    42. * 简介
    43. */
    44. private String description = "酷鲨商城在线API文档--管理员管理";
    45. /**
    46. * 服务条款URL
    47. */
    48. private String termsOfServiceUrl = "http://www.apache.org/licenses/LICENSE-2.0";
    49. /**
    50. * 联系人
    51. */
    52. private String contactName = "wk";
    53. /**
    54. * 联系网址
    55. */
    56. private String contactUrl = "http://xxxxx.cn";
    57. /**
    58. * 联系邮箱
    59. */
    60. private String contactEmail = "java@xxxx.cn";
    61. /**
    62. * 版本号
    63. */
    64. private String version = "1.0.0";
    65. @Autowired
    66. private OpenApiExtensionResolver openApiExtensionResolver;
    67. public Knife4jConfiguration() {
    68. log.debug("加载配置类:Knife4jConfiguration");
    69. }
    70. @Bean
    71. public Docket docket() {
    72. String groupName = "1.0.0";
    73. Docket docket = new Docket(DocumentationType.SWAGGER_2)
    74. .host(host)
    75. .apiInfo(apiInfo())
    76. .groupName(groupName)
    77. .select()
    78. .apis(RequestHandlerSelectors.basePackage(basePackage))
    79. .paths(PathSelectors.any())
    80. .build()
    81. .extensions(openApiExtensionResolver.buildExtensions(groupName));
    82. return docket;
    83. }
    84. private ApiInfo apiInfo() {
    85. return new ApiInfoBuilder()
    86. .title(title)
    87. .description(description)
    88. .termsOfServiceUrl(termsOfServiceUrl)
    89. .contact(new Contact(contactName, contactUrl, contactEmail))
    90. .version(version)
    91. .build();
    92. }
    93. }

            在Controller层中的应用 :

    @Api(tags = "1管理员管理模块") :配置模块的名称

    @ApiOperation("添加管理员"):配置业务的名称

    @ApiOperationSupport(order = 100):给业务添加编号

    1. @Api(tags = "1管理员管理模块")
    2. @RestController
    3. @RequestMapping("/admins")
    4. public class AdminController {
    5. @Autowired
    6. IAdminService iAdminService;
    7. @ApiOperation("添加管理员")
    8. @ApiOperationSupport(order = 100)
    9. @PostMapping("/add-new")
    10. public JSONResult addNew(AdminAddNewDTO adminAddNewDTO) {
    11. iAdminService.addNew(adminAddNewDTO);
    12. return JSONResult.ok();
    13. }
    14. }

    完成后,启动项目,通过 http://localhost:9081/doc.html 即可访问在线API文档!

    四、spring-validation框架(检查封装在pojo中的对象)

    1. <!--检查格式-->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-validation</artifactId>
    5. </dependency>
    1. public class AlbumAddNewDTO {
    2. @NotNull(message = "添加失败,数据不能为空")
    3. private String name;
    4. private String description;
    5. private Integer sort;
    6. }

            在请求前添加@Valid注解,用于判断字符是否符合规范 

    @ApiOperation("添加相册")
    @ApiOperationSupport(order = 400)
    //在类上添加ResquestMaping 会将路径拼接起来全名("/albim/add-new")
    @PostMapping(value = "/add-new")
    public JSONResult addNew(@Valid AlbumAddNewDTO albumAddNewDTO) {
        albumService.addNew(albumAddNewDTO);
        log.trace(albumAddNewDTO.toString());
        return JSONResult.ok();
    }

            **配置快速失败,遇到一个不符合规范的立马停止检查

    1. @Configuration
    2. @Slf4j
    3. public class ValidationConfiguration {
    4. public ValidationConfiguration() {
    5. System.out.println("ValidationConfiguration配置类开始启动");
    6. }
    7. //快速失败,遇到错误立马输出并停止不载向后检查
    8. @Bean
    9. public javax.validation.Validator validator() {
    10. return Validation.byProvider(HibernateValidator.class)
    11. .configure()
    12. .failFast(true)
    13. .buildValidatorFactory()
    14. .getValidator();
    15. }
    16. }

    五、安全框架Spring-Security

            添加依赖

    1. org.springframework.boot
    2. spring-boot-starter-security

            添加配置类

    1. @Slf4j
    2. @Configuration
    3. public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    4. @Bean //https://gitee.com/chengheng2022/jsd2206-csmall-passport-teacher.git
    5. public PasswordEncoder passwordEncoder() {
    6. log.debug("创建@Bean方法定义的对象:PasswordEncoder");
    7. // return new BCryptPasswordEncoder();
    8. return NoOpPasswordEncoder.getInstance(); // 无操作的密码编码器,即:不会执行加密处理
    9. }
    10. @Override
    11. protected void configure(HttpSecurity http) throws Exception {
    12. // 【配置白名单】
    13. // 在配置路径时,星号是通配符
    14. // 1个星号只能匹配任何文件夹或文件的名称,但不能跨多个层级
    15. // 例如:/*/test.js,可以匹配到 /a/test.js 和 /b/test.js,但不可以匹配到 /a/b/test.js
    16. // 2个连续的星号可以匹配若干个文件夹的层级
    17. // 例如:/**/test.js,可以匹配 /a/test.js 和 /b/test.js 和 /a/b/test.js
    18. String[] urls = {
    19. "/doc.html",
    20. "/**/*.js",
    21. "/**/*.css",
    22. "/swagger-resources",
    23. "/v2/api-docs"
    24. };
    25. http.csrf().disable(); // 禁用CSRF(防止伪造的跨域攻击)
    26. http.authorizeRequests() // 对请求执行认证与授权
    27. .antMatchers(urls) // 匹配某些请求路径
    28. .permitAll() // (对此前匹配的请求路径)不需要通过认证即允许访问
    29. .anyRequest() // 除以上配置过的请求路径以外的所有请求路径
    30. .authenticated(); // 要求是已经通过认证的
    31. http.formLogin(); // 开启表单验证,即视为未通过认证时,将重定向到登录表单,如果无此配置,则直接响应403
    32. }
    33. }

            通过Security框架对明文加密

    1. // TODO 从Admin对象获取密码,加密,并将密文封装回Admin中
    2. String rowPassword = a.getPassword();
    3. String encode = new BCryptPasswordEncoder().encode(rowPassword);
    4. //passwordEncoder.encode(rowPassword);
    5. a.setPassword(encode);
    6. log.trace("原文:" + rowPassword, "密文:" + encode);

    六、JWT认证

    1. <!-- JWT生成解析 -->
    2. <dependency>
    3. <groupId>io.jsonwebtoken</groupId>
    4. <artifactId>jjwt</artifactId>
    5. <version>0.9.1</version>
    6. </dependency>

            生成令牌 

    1. Map claims = new HashMap<>();
    2. claims.put("id", 9527);
    3. claims.put("username", "liucangsong");
    4. claims.put("email", "liucangsong@163.com");
    5. Date date = new Date(System.currentTimeMillis() + 10 * 60 * 1000);
    6. System.out.println("过期时间" + date);
    7. String secretKey = "kns439a}fdLK34jsmfd{MF5-8DJSsLKhJNFDSjn";
    8. String jwt = Jwts.builder()
    9. //header 加密方式和类型
    10. .setHeaderParam("alg", "HS256")
    11. .setHeaderParam("typ", "JWT")
    12. //payload 携带参数和过期时间
    13. .setClaims(claims)
    14. .setExpiration(date)
    15. //Signature 加密方式和盐值
    16. .signWith(SignatureAlgorithm.HS256, secretKey)
    17. //整合
    18. .compact();
    19. System.out.println(jwt);

             解析令牌

    1. String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTUyNywiZXhwIjoxNjY1NTc4ODc1LCJlbWFpbCI6ImxpdWNhbmdzb25nQDE2My5jb20iLCJ1c2VybmFtZSI6ImxpdWNhbmdzb25nIn0.FrFo3EXmg9bzCmh6YhlBFAGkOUOS8plv5K7PmncW7FU";
    2. String secretKey = "kns439a}fdLK34jsmfd{MF5-8DJSsLKhJNFDSjn";
    3. Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();
    4. Long id = claims.get("id",Long.class);
    5. String username = claims.get("username", String.class);
    6. String email = claims.get("email", String.class);
    7. System.out.println("id: " + id + "," + username + "," + email);

    七、fastjson转换对象为Json 数据

    1. <!-- fastjson:实现对象与JSON的相互转换 -->
    2. <dependency>
    3. <groupId>com.alibaba</groupId>
    4. <artifactId>fastjson</artifactId>
    5. <version>1.2.75</version>
    6. </dependency>
    String jsonResultString = JSON.toJSONString(jsonResult);

            toJSONString(需要被转换的内容)

    八、Aop面向切面

            实现获取任务运行时间

            导入依赖

    1. org.springframework.boot
    2. spring-boot-starter-aop

            在类上添加@Aspect 

    1. @Slf4j
    2. @Component
    3. @Aspect
    4. public class TinerAspect {
    5. public TinerAspect() {
    6. log.trace("Aop切面类开始执行");
    7. }
    8. // 关于ProceedingJoinPoint
    9. // 必须调用proceed()方法,表示执行表达式匹配到的方法
    10. // 调用proceed()方法必须获取返回值,且作为当前方法的返回值,表示返回表达式匹配的方法的返回值
    11. // 调用proceed()方法时的异常必须抛出,不可以使用try...catch进行捕获并处理
    12. // ---------------------------------------------------
    13. // 关于execution表达式:用于匹配在何时执行AOP相关代码
    14. // 表达式中的星号:匹配任意内容,只能匹配1次
    15. // 表达式中的2个连续的小数点:匹配任意内容,可以匹配0~n次,只能用于包名和参数列表部分
    16. // 表达式中的包是根包,会自动包含其子孙包中的匹配项
    17. @Around("execution(* cn.tude.csmall.product.service.*.*(..))")
    18. // ↑ 无论方法的返回值类型是什么
    19. // ↑ 无论是哪个类
    20. // ↑ 无论是哪个方法
    21. // ↑ 2个小数点表示任何参数列表
    22. public Object xx(ProceedingJoinPoint pjp) throws Throwable {
    23. log.trace("执行TimerAspe类中的方法");
    24. long start = System.currentTimeMillis();
    25. Object proceed = pjp.proceed();//执行连接点方法
    26. long end = System.currentTimeMillis();
    27. log.debug("【{}】类型的对象调用了【{}】方法,方法的参数值为【{}】",
    28. pjp.getTarget().getClass().getName(),
    29. pjp.getSignature().getName(),
    30. pjp.getArgs());
    31. log.trace("执行耗时:{} 毫秒", (end - start));
    32. return proceed;//执行返回请求结果,没有的话请求只有传没有取
    33. }
    34. }

    九、Dubbo框架

            该框架将方法接口的调用范围从Spring容器提升到全分布服务器

    1. com.alibaba.cloud
    2. spring-cloud-starter-dubbo

    配置文件

    1. dubbo:
    2. protocol:
    3. # port设置为-1 表示当前dubbo框架使用的端口自动寻找
    4. # 使用端口的规则是从20880开始寻找可用端口,如果当前端口号占用,就继续加1来使用,直到找到可用的为止
    5. port: -1
    6. # 设置连接的名称,一般固定为dubbo即可
    7. name: dubbo
    8. registry:
    9. # 指定当前Dubbo服务注册中心的类型和位置
    10. address: nacos://localhost:8848

    启动类的配置,生产者需要添加@EnableDubbo注解

    1. //此服务为生产者,添加了此注解才能被注册到Nacos中
    2. @EnableDubbo
    3. @SpringBootApplication
    4. public class CsmallStockWebapiApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(CsmallStockWebapiApplication.class, args);
    7. }
    8. }

     微服务方法的调用,@DubboService注解会将此类下的方法注册到Nacos中共享到全部服务器

    1. //以类为单位共享给Nacos,其他服务可以调用这个类下的方法
    2. @DubboService
    3. @Service
    4. @Slf4j
    5. public class StockServiceImpl implements IStockService {

            调用注册过的方法

    1. @DubboReference
    2. private IStockService iStockService;

    Mybatis框架

    1. org.mybatis.spring.boot
    2. mybatis-spring-boot-starter
    3. 2.2.2
    4. mysql
    5. mysql-connector-java
    6. runtime
    1. server.port=9082
    2. spring.datasource.url=jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
    3. spring.datasource.username=root
    4. spring.datasource.password=root
    5. #mybatis
    6. mybatis.mapper-locations=mapper/*.xml
    1. @Configuration
    2. @MapperScan("cn.tedu.csmall.passport.mapper")
    3. public class MybatisConfiguration {
    4. public MybatisConfiguration() {
    5. System.out.println("配置类启动成功");
    6. }
    7. }

    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="cn.tedu.csmall.passport.mapper.RoleMapper">
    6. <select id="list" resultMap="ListResultMap">
    7. SELECT
    8. <include refid="ListQueryFields"/>
    9. FROM
    10. ams_role
    11. ORDER BY
    12. sort DESC, id
    13. select>
    14. <sql id="ListQueryFields">
    15. <if test="true">
    16. id, name, description, sort
    17. if>
    18. sql>
    19. <resultMap id="ListResultMap" type="cn.tedu.csmall.passport.pojo.vo.RoleListItemVO">
    20. <id column="id" property="id"/>
    21. <result column="name" property="name"/>
    22. <result column="description" property="description"/>
    23. <result column="sort" property="sort"/>
    24. resultMap>
    25. mapper>

  • 相关阅读:
    自定义注解实现验证信息的功能
    阿里云国际站:阿里云Linux系统磁盘扩容操作实例
    pycharm中出现这个的原因是什么,如何解决?
    QT:SQLITE数据库编程
    第十三章---枚举类型与泛型
    Linux文件属性
    面试Java高级工程师之应用框架总结
    ES|使用Postman更新ES内所有文档的指定字段
    Java方法的重载
    C#.Net筑基-String字符串超全总结 [深度好文]
  • 原文地址:https://blog.csdn.net/weixin_51722520/article/details/127111187