前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >还在从零开始搭建项目?试试这款基于SpringBoot 3的快速开发脚手架!

还在从零开始搭建项目?试试这款基于SpringBoot 3的快速开发脚手架!

作者头像
macrozheng
发布2023-11-08 14:35:14
7150
发布2023-11-08 14:35:14
举报
文章被收录于专栏:mall学习教程mall学习教程

mall学习教程官网:macrozheng.com

关注我Github的小伙伴应该了解,之前我开源了一款快速开发脚手架mall-tiny,该脚手架完整继承了mall项目的技术栈,拥有完整的权限管理功能。最近抽空把该项目支持了Spring Boot 3,今天再和大家聊聊这个脚手架,同时聊聊升级项目到Spring Boot 3 的一些注意点,希望对大家有所帮助!

聊聊mall-tiny项目

可能有些小伙伴还不了解这个脚手架,我们先来聊聊它!

项目简介

mall-tiny是一款基于SpringBoot+MyBatis-Plus的快速开发脚手架,目前在Github上已有1600+Star。它拥有完整的权限管理功能,支持使用MyBatis-Plus代码生成器生成代码,可对接mall项目的Vue前端,开箱即用。

项目地址:https://github.com/macrozheng/mall-tiny

项目演示

mall-tiny项目可无缝对接mall-admin-web前端项目,秒变前后端分离脚手架,由于mall-tiny项目仅实现了基础的权限管理功能,所以前端对接后只会展示了权限管理相关菜单。

前端项目地址:https://github.com/macrozheng/mall-admin-web

技术选型

这次升级不仅支持了Spring Boot 3,其他依赖版本也升级了。

技术

版本

说明

SpringBoot

3.1.5

容器+MVC框架

SpringSecurity

6.1.5

认证和授权框架

MyBatis

3.5.10

ORM框架

MyBatis-Plus

3.5.3

MyBatis增强工具

MyBatis-Plus Generator

3.5.3

数据层代码生成器

SpringDoc

2.0.2

文档生产工具

Redis

5.0

分布式缓存

Docker

18.09.0

应用容器引擎

Druid

1.2.14

数据库连接池

Hutool

5.8.9

Java工具类库

JWT

0.9.1

JWT登录支持

Lombok

1.18.30

简化对象封装工具

数据库表结构

化繁为简,仅保留了权限管理功能相关的9张表,业务简单更加方便定制开发,觉得mall项目学习太复杂的小伙伴可以先学习下mall-tiny。

接口文档

由于Swagger依赖从SpringFox升级到了SpringDoc,原来的接口文档访问路径已经改变,最新访问地址:http://localhost:8080/swagger-ui/index.html

使用流程

升级版本基本不影响之前的使用方式,具体使用流程可以参考最新版README文件:https://github.com/macrozheng/mall-tiny

升级过程

接下来我们再来聊聊mall-tiny项目升级Spring Boot 3 版本主要的过程,如果你的项目也想升级Spring Boot 3 的话,了解下应该会有所帮助!

升级JDK 17

由于Spring Boot 3 版本最低要求为Java 17,所以我们在运行项目时需要修改项目使用的SDK为JDK 17。

升级SpringDoc

  • 由于之前使用的SpringFox提供的Swagger库,已经三年多没更新了,也不支持Spring Boot 3,所以我们需要迁移到能支持Spring Boot 3 的SpringDoc去。
  • 我们需要修改项目的依赖,从SpringFox迁移到SpringDoc,
代码语言:javascript
复制
<!--SpringDoc 官方Starter-->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
</dependency>
  • 然后修改Controller和实体类上使用的SpringFox注释,主要是替换@Api@ApiOperation@ApiModel@ApiModelProperty注解,具体替换参考下表。

SpringFox

SpringDoc

@Api

@Tag

@ApiIgnore

@Parameter(hidden = true)or@Operation(hidden = true)or@Hidden

@ApiImplicitParam

@Parameter

@ApiImplicitParams

@Parameters

@ApiModel

@Schema

@ApiModelProperty

@Schema

@ApiOperation(value = "foo", notes = "bar")

@Operation(summary = "foo", description = "bar")

@ApiParam

@Parameter

@ApiResponse(code = 404, message = "foo")

ApiResponse(responseCode = "404", description = "foo")

升级Spring Security 6

从Spring Security 5升级到6,有很多之前使用的API都废弃了,我们需要把这些废弃的用法改成Spring Security 6的新用法。

例如在SecurityConfig类中,就有这些方法已经弃用了,我们需要修改下。

还有就是之前实现动态权限的DynamicAccessDecisionManager和DynamicSecurityFilter类也已经被弃用了。

我们需要写一个类实现AuthorizationManager接口用于实现我们之前的动态权限逻辑,其实写法比以前更简洁了。

代码语言:javascript
复制
/**
 * 动态鉴权管理器,用于判断是否有资源的访问权限
 * Created by macro on 2023/11/3.
 */
public class DynamicAuthorizationManager implements AuthorizationManager<RequestAuthorizationContext> {

    @Autowired
    private DynamicSecurityMetadataSource securityDataSource;
    @Autowired
    private IgnoreUrlsConfig ignoreUrlsConfig;

    @Override
    public void verify(Supplier<Authentication> authentication, RequestAuthorizationContext object) {
        AuthorizationManager.super.verify(authentication, object);
    }

    @Override
    public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext requestAuthorizationContext) {
        HttpServletRequest request = requestAuthorizationContext.getRequest();
        String path = request.getRequestURI();
        PathMatcher pathMatcher = new AntPathMatcher();
        //白名单路径直接放行
        List<String> ignoreUrls = ignoreUrlsConfig.getUrls();
        for (String ignoreUrl : ignoreUrls) {
            if (pathMatcher.match(ignoreUrl, path)) {
                return new AuthorizationDecision(true);
            }
        }
        //对应跨域的预检请求直接放行
        if(request.getMethod().equals(HttpMethod.OPTIONS.name())){
            return new AuthorizationDecision(true);
        }
        //权限校验逻辑
        List<ConfigAttribute> configAttributeList = securityDataSource.getConfigAttributesWithPath(path);
        List<String> needAuthorities = configAttributeList.stream()
                .map(ConfigAttribute::getAttribute)
                .collect(Collectors.toList());
        Authentication currentAuth = authentication.get();
        //判定是否已经实现登录认证
        if(currentAuth.isAuthenticated()){
            Collection<? extends GrantedAuthority> grantedAuthorities = currentAuth.getAuthorities();
            List<? extends GrantedAuthority> hasAuth = grantedAuthorities.stream()
                    .filter(item -> needAuthorities.contains(item.getAuthority()))
                    .collect(Collectors.toList());
            if(CollUtil.isNotEmpty(hasAuth)){
                return new AuthorizationDecision(true);
            }else{
                return new AuthorizationDecision(false);
            }
        }else{
            return new AuthorizationDecision(false);
        }
    }
}

升级MyBatis-Plus

  • mall-tiny脚手架使用了Mybatis-Plus,需要升级到3.5.3版本支持SpringBoot 3;
代码语言:javascript
复制
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3</version>
</dependency>
  • Mybatis-Plus代码生成器还需配置支持SpringDoc。

总结

今天分享了下我的开源项目脚手架mall-tiny,以及它升级Spring Boot 3 的过程。我们在写代码的时候,如果有些用法已经废弃,应该尽量去寻找新的用法来使用,这样才能保证我们的代码足够优雅!

项目地址

开源不易,觉得项目有帮助的小伙伴点个Star支持下吧,Spring Boot 3 版本目前在3.x分支下。

https://github.com/macrozheng/mall-tiny/tree/3.x

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 macrozheng 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 聊聊mall-tiny项目
    • 项目简介
      • 项目演示
        • 技术选型
          • 数据库表结构
            • 接口文档
              • 使用流程
              • 升级过程
                • 升级JDK 17
                  • 升级SpringDoc
                    • 升级Spring Security 6
                      • 升级MyBatis-Plus
                      • 总结
                      • 项目地址
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档