Swagger 接口统一管理工具+EasyCode模板v2

举报
S-X-S 发表于 2025/01/09 11:02:24 2025/01/09
【摘要】 1.模块搭建 1.sun-common下新建sun-common-swagger模块 2.修改pom.xml 不跟父模块进行耦合<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/X...

1.模块搭建

1.sun-common下新建sun-common-swagger模块

2.修改pom.xml 不跟父模块进行耦合

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- 不跟父模块进行耦合 -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sunxiansheng</groupId>
    <artifactId>sun-common-swagger</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

3.发现交给了sun-frame模块管理,就相当于跟common是同一层级了

CleanShot 2024-07-17 at 14.57.36@2x

CleanShot 2024-07-17 at 14.57.48@2x

4.引入swagger依赖

    <dependencies>
        <!-- swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
    </dependencies>

2.配置Swagger

1.编写配置类 SwaggerConfig.java

package com.sunxiansheng.swagger.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * Description: Swagger2 配置类
 * @Author sun
 * @Create 2024/7/17 15:02
 * @Version 1.0
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    /**
     * 注入配置的对象逻辑
     *
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sunxiansheng")) // 扫描的包
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 构建一个apiInfo
     *
     * @return
     */
    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("sun-frame")
                .contact(new Contact("孙显圣", "url地址", "sunxiansehng@gmail.com"))
                .version("v1.0")
                .description("开箱即用的脚手架")
                .build();
    }

}

CleanShot 2024-07-17 at 15.25.36@2x

2.sun-user 引入Swagger模块

        <!-- swagger模块 -->
        <dependency>
            <groupId>com.sunxiansheng</groupId>
            <artifactId>sun-common-swagger</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

3.将mapper.xml统一放到resources/mapper下管理

1.移动UserMapper.xml

CleanShot 2024-07-17 at 15.27.01@2x

2.application.yml 配置扫描

CleanShot 2024-07-17 at 15.27.22@2x

4.启动sun-user访问http://localhost:8080/swagger-ui.html

CleanShot 2024-07-17 at 15.28.04@2x

3.EasyCode模板v2(Mapper新增方法)

1.Mapper.java

## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.java"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/java/$!{tableInfo.savePackageName.replace('.','/')}/mapper"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

package $!{tableInfo.savePackageName}.mapper;

import $!{tableInfo.savePackageName}.entity.po.$!{tableInfo.name}Po;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * ($!{tableInfo.name})表数据库访问层
 *
 * @author $!{author}
 * @since $!{time.currTime('yyyy-MM-dd HH:mm:ss')}
 */
public interface $!{tableInfo.name}Mapper {

    /**
     * 根据主键查询单条数据
     *
     * @param $!{pk.name} 主键
     * @return 实例对象
     */
    $!{tableInfo.name}Po queryById($!{pk.shortType} $!{pk.name});

    /**
     * 分页查询
     *
     * @param po 查询条件
     * @param offset 偏移量:计算公式 (pageNo - 1) * pageSize
     * @param pageSize 页面大小
     * @return 对象列表
     */
    List<$!{tableInfo.name}Po> queryPage(@Param("po") $!{tableInfo.name}Po po, @Param("offset") Integer offset, @Param("pageSize") Integer pageSize);

    /**
     * 根据条件查询记录
     *
     * @param po 查询条件
     * @return 对象列表
     */
    List<$!{tableInfo.name}Po> queryAllByLimit(@Param("po") $!{tableInfo.name}Po po);

    /**
     * 统计总行数
     *
     * @param po 查询条件
     * @return 总行数
     */
    Integer count(@Param("po") $!{tableInfo.name}Po po);

    /**
     * 新增数据
     *
     * @param po 实例对象(会封装新增的id)
     * @return 影响行数
     */
    int insert($!{tableInfo.name}Po po);

    /**
     * 批量新增数据(MyBatis原生foreach方法)
     *
     * @param entities 实例对象列表(会封装新增的id)
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<$!{tableInfo.name}Po> entities);

    /**
     * 批量新增或按主键更新数据(MyBatis原生foreach方法)
     *
     * @param entities 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<$!{tableInfo.name}Po> entities);

    /**
     * 根据主键修改数据
     *
     * @param po 实例对象
     * @return 影响行数
     */
    int updateById($!{tableInfo.name}Po po);

    /**
     * 根据主键批量更新数据
     *
     * @param list 实例对象列表
     * @return 影响行数
     */
    int updateBatchById(@Param("list") List<$!{tableInfo.name}Po> list);

    /**
     * 根据主键逻辑删除数据
     *
     * @param $!{pk.name} 主键
     * @return 影响行数
     */
    int logicDeleteById($!{pk.shortType} $!{pk.name});

    /**
     * 根据主键批量逻辑删除数据
     *
     * @param ids 主键列表
     * @return 影响行数
     */
    int logicDeleteBatchById(@Param("list") List<$!{pk.shortType}> ids);
}

2.Mapper.xml(全局变量可以指定删除和未删除的标识

## 定义全局变量(删除和未删除的标识)
#set($deleteColumnValue = 1)
#set($notDeletedColumnValue = 0)

##引入mybatis支持
$!{mybatisSupport.vm}

##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

##检查是否有包含delete的字段
#set($deleteColumn = "")
#foreach($column in $tableInfo.fullColumn)
    #if($column.name.contains("delete"))
        #set($deleteColumn = $column.obj.name)
    #end
#end

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="$!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper">
    <resultMap type="$!{tableInfo.savePackageName}.entity.po.$!{tableInfo.name}Po" id="$!{tableInfo.name}Map">
        <id property="$!pk.name" column="$!pk.obj.name"/>
#foreach($column in $tableInfo.fullColumn)
    #if($column.name != $pk.name)
        <result property="$!column.name" column="$!column.obj.name"/>
    #end
#end
    </resultMap>

    <!--根据主键查询一条记录-->
    <select id="queryById" resultMap="$!{tableInfo.name}Map">
        select #allSqlColumn()
        from $!{tableInfo.obj.name}
        where $!pk.obj.name = #{$!pk.name}
        #if($deleteColumn != "")
          and $!deleteColumn = $notDeletedColumnValue
        #end
    </select>

    <!--分页查询指定行数据-->
    <select id="queryPage" resultMap="$!{tableInfo.name}Map">
        select #allSqlColumn()
        from $!{tableInfo.obj.name}
        <where>
#foreach($column in $tableInfo.fullColumn)
            <if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">
                and $!column.obj.name = #{po.$!column.name}
            </if>
#end
            #if($deleteColumn != "")
              and $!deleteColumn = $notDeletedColumnValue
            #end
        </where>
        limit #{offset}, #{pageSize}
    </select>

    <!--根据条件查询记录-->
    <select id="queryAllByLimit" resultMap="$!{tableInfo.name}Map">
        select #allSqlColumn()
        from $!{tableInfo.obj.name}
        <where>
#foreach($column in $tableInfo.fullColumn)
            <if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">
                and $!column.obj.name = #{po.$!column.name}
            </if>
#end
            #if($deleteColumn != "")
              and $!deleteColumn = $notDeletedColumnValue
            #end
        </where>
    </select>

    <!--根据条件统计总行数-->
    <select id="count" resultType="java.lang.Integer">
        select count(1)
        from $!{tableInfo.obj.name}
        <where>
#foreach($column in $tableInfo.fullColumn)
            <if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">
                and $!column.obj.name = #{po.$!column.name}
            </if>
#end
            #if($deleteColumn != "")
              and $!deleteColumn = $notDeletedColumnValue
            #end
        </where>
    </select>

    <!--新增一条记录-->
    <insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
        values (#foreach($column in $tableInfo.otherColumn)#{$!column.name}#if($foreach.hasNext), #end#end)
    </insert>

    <!--批量新增多条记录-->
    <insert id="insertBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#foreach($column in $tableInfo.otherColumn)#{entity.$!column.name}#if($foreach.hasNext), #end#end)
        </foreach>
    </insert>

    <!--插入记录,如果主键冲突,则变为更新记录-->
    <insert id="insertOrUpdateBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.name}(id, #foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#{entity.id}, #foreach($column in $tableInfo.otherColumn)#{entity.$!column.name}#if($foreach.hasNext), #end#end)
        </foreach>
        on duplicate key update
#foreach($column in $tableInfo.otherColumn)
            $!column.obj.name = values($!column.obj.name)#if($foreach.hasNext),#end
#end
    </insert>

    <!--根据主键修改数据-->
    <update id="updateById">
        update $!{tableInfo.obj.name}
        <set>
#foreach($column in $tableInfo.otherColumn)
            <if test="$!column.name != null#if($column.type.equals('java.lang.String')) and $!column.name != ''#end">
                $!column.obj.name = #{$!column.name},
            </if>
#end
        </set>
        where $!pk.obj.name = #{$!pk.name}
        #if($deleteColumn != "")
          and $!deleteColumn = $notDeletedColumnValue
        #end
    </update>

    <!--根据主键批量更新记录-->
    <update id="updateBatchById">
        <foreach collection="list" item="item" index="index" open="" close="" separator=";">
            update $!{tableInfo.obj.name}
            <set>
#foreach($column in $tableInfo.otherColumn)
                <if test="item.$!column.name != null#if($column.type.equals('java.lang.String')) and item.$!column.name != ''#end">
                    $!column.obj.name = #{item.$!column.name},
                </if>
#end
            </set>
            where $!pk.obj.name = #{item.$!pk.name}
            #if($deleteColumn != "")
              and $!deleteColumn = $notDeletedColumnValue
            #end
        </foreach>
    </update>

    <!--根据主键逻辑删除单个记录-->
    <update id="logicDeleteById">
        update $!{tableInfo.obj.name}
        set $!deleteColumn = $deleteColumnValue
        where $!pk.obj.name = #{$!pk.name}
        #if($deleteColumn != "")
          and $!deleteColumn = $notDeletedColumnValue
        #end
    </update>

    <!--根据主键批量逻辑删除记录-->
    <update id="logicDeleteBatchById">
        update $!{tableInfo.obj.name}
        set $!deleteColumn = $deleteColumnValue
        where $!pk.obj.name in
        <foreach collection="list" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
        #if($deleteColumn != "")
          and $!deleteColumn = $notDeletedColumnValue
        #end
    </update>
</mapper>

4.动态配置Swagger

1.创建SwaggerInfo.java的bean存储信息

package com.sunxiansheng.swagger.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * Description: 将Swagger的配置暴露到外边
 * @Author sun
 * @Create 2024/7/17 15:32
 * @Version 1.0
 */
@Component
@ConfigurationProperties(prefix = "swagger") // 只要在Resource文件中配置swagger的信息,就会自动set到这个对象中
public class SwaggerInfo {

    private String basePackage;

    private String title;

    private String contactName;

    private String contactUrl;

    private String email;

    private String version;

    private String description;

    // getter和setter方法(必须)

    public String getBasePackage() {
        return basePackage;
    }

    public void setBasePackage(String basePackage) {
        this.basePackage = basePackage;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContactName() {
        return contactName;
    }

    public void setContactName(String contactName) {
        this.contactName = contactName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getContactUrl() {
        return contactUrl;
    }

    public void setContactUrl(String contactUrl) {
        this.contactUrl = contactUrl;
    }

}

CleanShot 2024-07-19 at 10.23.56@2x

2.SwaggerConfig.java 直接从bean中获取数据

package com.sunxiansheng.swagger.config;

import com.sunxiansheng.swagger.bean.SwaggerInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.annotation.Resource;

/**
 * Description: Swagger2 配置类
 * @Author sun
 * @Create 2024/7/17 15:02
 * @Version 1.0
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Resource
    private SwaggerInfo swaggerInfo;

    /**
     * 注入配置的对象逻辑
     *
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage(swaggerInfo.getBasePackage())) // 扫描的包
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 构建一个apiInfo
     *
     * @return
     */
    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(swaggerInfo.getTitle())
                .contact(new Contact(swaggerInfo.getContactName(), swaggerInfo.getContactUrl(), swaggerInfo.getEmail()))
                .version(swaggerInfo.getVersion())
                .description(swaggerInfo.getDescription())
                .build();
    }

}

3.sun-user配置application.yml

#  自定义的swagger配置
swagger:
  base-package: com.sunxiansheng
  title: sun-frame
  contact-name: sun
  contact-url: git地址
  email: sunxiansehng@gmail.com
  version: 1.0
  description: 开箱即用的脚手架

CleanShot 2024-07-19 at 10.24.50@2x

4.使用swagger标记注解

CleanShot 2024-07-19 at 10.30.03@2x

CleanShot 2024-07-19 at 10.28.04@2x

5.重启查看

http://localhost:8080/swagger-ui.html

CleanShot 2024-07-19 at 10.26.25@2x

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。