当前位置:

首页 > 编程开发 > SpringBoot集成swagger实例分析

SpringBoot集成swagger实例分析

一.接口文档概述swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具,在前后端开发之前,后端要先出接口文档,前端根据接口文档来进行项目的开发,双方开发结束后在进行联调测试。所以接口文档其实就是开发之前双方之间的一种约定。通常接口文档分为离线的和实时的。离线的接口文档工具有:word(相当于没说),YAPI,小幺鸡等,这种文档需要程序员在上面编写,也一般具备接口测试功能。通常是由开发人员先在离线接口文档上编写信息,然后交给前端人员参照开发。最大的弊端是当我们的接

本文目录

    一. 接口文档概述

    swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具,在前后端开发之前,后端要先出接口文档,前端根据接口文档来进行项目的开发,双方开发结束后在进行联调测试。

    所以接口文档其实就是开发之前双方之间的一种约定。通常接口文档分为离线的和实时的。离线的接口文档工具有: word(相当于没说), YAPI, 小幺鸡等,这种文档需要程序员在上面编写,也一般具备接口测试功能。通常是由开发人员先在离线接口文档上编写信息,然后交给前端人员参照开发。最大的弊端是当我们的接口程序发生变动时,需要回过头来维护上面的内容,很麻烦,是真的麻烦。

    实时接口文档就是可以根据我们的代码来自动生成相应的接口文档,优点就是我们的代码发生变化时,生成的接口文档也会自动更新,无需我们关注修改,主需要按时发布即可。但是由于是根据代码自动生成的,所以最大的弊端就是代码侵入性强,需要我们在项目代码中集成生成接口文档的相关代码。实时接口文档现在的方案有很多,但是swagger还是其中比较有影响力的一个。

    二. SpringBoot集成swagger2

    官网地址: swagger.io 当然,官网都是英文的,看起来还是比较麻烦的。建议大家直接按照我的步骤来,还是很简单的。

    同时在说一点: swagger分为swagger2 和swagger3两个常用版本。二者区别不是很大,主要对于依赖和注解进行了优化。swagger2需要引入2个jar包,swagger3只需要一个,用起来没有什么大的区别。下面以swagger2为例。

    2.1 引入依赖

    
        io.springfox
        springfox-swagger2
        2.9.2
    
    
        io.springfox
        springfox-swagger-ui
        2.9.2
    

    2.2 引入配置

    首先需要添加一个注解 : @EnableSwagger2。 这个注解我们可以添加到SpringBoot的启动类上,也可以自定义一个配置类,放到上面。添加了这个注解以后,就代表我们已经在项目中开启了Swagger的功能。

    我们采用第二种方式,自己定义一个配置类,正好还可以添加一个Docket配置。 所谓Docket配置,就是一组(一个项目或一个版本)接口文档的配置,比如设置名称, 联系人等等。

    我们在config文件夹下,添加一个SwaggerConfig类。

    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
        /**
         * 设置多个:
         *
         * @Bean
         *     public Docket appApi() {
         *
         *         List pars = new ArrayList<>();
         *         ParameterBuilder token = new ParameterBuilder();
         *         token.name("token").description("用户令牌").modelRef(new ModelRef("string")).parameterType("header").required(false)
         *                 .build();
         *         pars.add(token.build());
         *
         *         return new Docket(DocumentationType.SWAGGER_2).select().paths(regex("/app/.*")).build()
         *                 .globalOperationParameters(pars).apiInfo(pdaApiInfo()).useDefaultResponseMessages(false)
         *                 .enable(enableSwagger)
         *                 .groupName("appApi");
         *
         *     }
         *
         *     @Bean
         *     public Docket adminApi() {
         *
         *         List pars = new ArrayList<>();
         *         ParameterBuilder token = new ParameterBuilder();
         *         token.name("token").description("用户令牌").modelRef(new ModelRef("string")).parameterType("header").required(false)
         *                 .build();
         *         pars.add(token.build());
         *         return new Docket(DocumentationType.SWAGGER_2).select().paths(regex("/admin/.*")).build()
         *                 .globalOperationParameters(pars).apiInfo(pdaApiInfo()).useDefaultResponseMessages(false)
         *                 .enable(enableSwagger)
         *                 .groupName("adminApi");
         *
         *     }
         *
         *
         * @return
         */
    
        @Bean
        public Docket createRestApi() {
            return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
                    .apis(RequestHandlerSelectors.basePackage("com.lsqingfeng.action.swagger.controller")).paths(PathSelectors.any())
                    .build().globalOperationParameters(setHeaderToken());
    
        }
    
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder().title("action-swagger").description("swagger实战").termsOfServiceUrl("")
                    .version("1.0").build();
        }
    
        /**
         * @Description: 设置swagger文档中全局参数
         * @param
         * @Date: 2020/9/11 10:15
         * @return: java.util.List
         */
    
        private List setHeaderToken() {
            List pars = new ArrayList<>();
            ParameterBuilder userId = new ParameterBuilder();
            userId.name("token").description("用户TOKEN").modelRef(new ModelRef("string")).parameterType("header")
                    .required(true).build();
            pars.add(userId.build());
            return pars;
        }
    }

    上面就是一个配置案例, 还设置了一个setToken方法,代表生成文档的所有接口中,都要包含一个header类型的token参数。

    2.3 给Controller 添加注解

    我们接口文档的直接描述主要就是在Controller这一层,比如这个接口的功能,参数的名称,返回值的名称等。这些值我们都需要在Controller上通过给方法上,请求参数和返回参数上添加对应的注解,swagger才能帮我们生成相应的接口文档。这也就是我前面提到的对现有代码的侵入性。

    我们来写一个案例。

    首先先创建一个vo的包,里边写我们的请求和相应参数,使用JavaBean定义出请求和响应的数据结构。注意这里要添加相应的注解:

    请求类:

    package com.lsqingfeng.springboot.vo;
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    /**
     * @className: SwaggerReqVO
     * @description:
     * @author: sh.Liu
     * @date: 2022-03-22 19:19
     */
    @Data
    @ApiModel("创建Swagger请求参数")
    public class SwaggerReqVO {
    
        @ApiModelProperty("id")
        private Integer id;
    
        @ApiModelProperty("姓名")
        private String name;
    
        @ApiModelProperty("性别")
        private Integer gender;
    }

    响应类:

    package com.lsqingfeng.springboot.vo;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    /**
     * @className: SwaggerResVO
     * @description:
     * @author: sh.Liu
     * @date: 2022-03-22 19:20
     */
    @Data
    @ApiModel("创建Swagger响应结果")
    public class SwaggerResVO {
    
        @ApiModelProperty("id")
        private Integer id;
    
        @ApiModelProperty("姓名")
        private String name;
    
        @ApiModelProperty("性别")
        private Integer gender;
    
        @ApiModelProperty("啥啥")
        private String what;
    }

    这里分别使用了 @ApiModel注解和 @@ApiModelProperty 注解定义了实体的名称和字段的名称,方便生成接口文档时展示。

    再来看Controller:

    package com.lsqingfeng.springboot.controller;
    
    import com.lsqingfeng.springboot.vo.SwaggerReqVO;
    import com.lsqingfeng.springboot.vo.SwaggerResVO;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.web.bind.annotation.*;
    
    /**
     * @className: SwaggerController
     * @description: swagger 接口测试
     * @author: sh.Liu
     * @date: 2022-03-22 19:18
     */
    @RestController
    @RequestMapping("/swagger")
    @Api(value = "用户接口", tags = {"用户接口"})
    public class SwaggerController {
    
        @ApiOperation("新增用户")
        @PostMapping("save")
        public String save(@RequestBody SwaggerReqVO req) {
            return "success";
        }
    
        @GetMapping("getById")
        @ApiOperation("根据条件查询用户")
        public SwaggerResVO getById(@RequestBody SwaggerResVO req) {
            return new SwaggerResVO();
        }
    }

    这里使用了@Api注解和 @ApiOperation注解分别标注了接口组名和接口的名称。现在我们启动项目。

    SpringBoot集成swagger实例分析

    发现报了这个错误。

    上网查询原因说是SpringBoot2.6版本和Swagger2.9.2不兼容导致的。 也有人说是由于guava这个包的版本过低导致的。

    我都分别试了一下,替换了guava的高版本依赖问题还是存在。

    这个问题的主要原因确实是SpringBoot版本过高导致。如果你用的是SpringBoot2.5.x及之前版本是没有问题的。

    Spring Boot 2.6.X使用PathPatternMatcher匹配路径,Swagger引用的Springfox使用的路径匹配是基于AntPathMatcher的。

    所以要想解决,添加配置,将springBoot MVC的路劲匹配模式修改一下即可。

    在springBoot配置文件中添加配置:

    spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

    如果是yml格式的配置文件:

    SpringBoot集成swagger实例分析

    再次启动问题解决。

    访问地址: ip:端口号/swagger-ui.html

    SpringBoot集成swagger实例分析

    正常情况就可以看到我们的界面了。一会再说非正常情况。由于我们只给用户接口添加了注解,所有用户接口是可以直接观察中文文档的。而剩下的两个接口,由于没添加注解,所以都是以默认的形式展示的。

    点开接口,我们可以看到接口中的想详细信息

    SpringBoot集成swagger实例分析

    点击model,可以看到字段的中文描述。点击 Try it out,就可以直接调试接口。同时注意接口中都让填一个token,这就是我们之前的设置成效了。

    SpringBoot集成swagger实例分析

    截止到目前其实swagger的集成就已经完毕了,主要就是根据我们的注解生成文档,并且可以在线调用调试。开发的时候,我们只需要把Controller这一层的请求和响应,以及方法描述等内容先开发完毕,就可以提供给前端让他们参照开发了。

    2.4 [404]问题解决

    正常情况我们按照上面的步骤就可以出现页面,但是有些时候可能是由于springBoot的版本过高导致的,我们输入之前的地址,出现404的情况,这个主要是由于项目中无法读取到swagger依赖包下的页面导致的。如果出现了这个问题,我们可以添加一个配置类,让他实现WebMvcConfigurer 接口,在添加一个方法:

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    完整代码如下:

    package com.lsqingfeng.springboot.config;
    
    import com.lsqingfeng.springboot.interceptor.TokenInterceptor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * @className: WebMvcConfig
     * @description:webMvc配置
     * @author: sh.Liu
     * @date: 2022-01-13 09:51
     */
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
            registry.addResourceHandler("swagger-ui.html")
                    .addResourceLocations("classpath:/META-INF/resources/");
            registry.addResourceHandler("/webjars/**")
                    .addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
    }

    这个时候在启动就可以了!

    2.5 替换UI

    上面的整个过程已经完成了,但是生成的接口文档的页面,其实很多人不太喜欢,觉得不太符合国人的使用习惯,所有又有一些大神,提供了其他的UI测试页面。这个页面的使用还是比较广泛的。

    修改方式:只需引入一个依赖包:

    
        com.github.xiaoymin
        swagger-bootstrap-ui
        1.9.6
    

    然后把刚才实现的那个的那个方法再添加一条:

    registry.addResourceHandler("doc.html")
                    .addResourceLocations("classpath:/META-INF/resources/");

    完成代码:

    package com.lsqingfeng.springboot.config;
    
    import com.lsqingfeng.springboot.interceptor.TokenInterceptor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * @className: WebMvcConfig
     * @description:webMvc配置
     * @author: sh.Liu
     * @date: 2022-01-13 09:51
     */
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
    //    @Override
    //    public void addInterceptors(InterceptorRegistry registry) {
    //        //拦截
    //        registry.addInterceptor(new TokenInterceptor())
    //                .addPathPatterns("/**")
    //                .excludePathPatterns("/login");
    //    }
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
            registry.addResourceHandler("swagger-ui.html")
                    .addResourceLocations("classpath:/META-INF/resources/");
            registry.addResourceHandler("/webjars/**")
                    .addResourceLocations("classpath:/META-INF/resources/webjars/");
            registry.addResourceHandler("doc.html")
                    .addResourceLocations("classpath:/META-INF/resources/");
        }
    }

    重新启动项目: 访问路径发生了变化:** ip:端口号/doc.html**

    SpringBoot集成swagger实例分析

    页面出现了。我们在看看我们的用户接口:

    SpringBoot集成swagger实例分析

    这个风格确实更加的直观,同时也是可以直接进行调试的。大部分的swagger都用的这个风格的文档。

    三. SpringBoot集成swagger3

    上面已经很详细的讲解了swagger2的集成方式,而swagger3的集成方式更加的简洁一些。

    首先引入依赖:

    
      io.springfox
      springfox-boot-starter
      3.0.0
    

    然后是替换注解: swagger2使用的开启注解是: @EnableSwagger2

    而在swagger3中,这个注解要换成: @EnableOpenApi

    配置类:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import springfox.documentation.builders.RequestHandlerSelectors;
    import springfox.documentation.oas.annotations.EnableOpenApi;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    
    @Configuration
    public class SwaggerConfig {
        @Bean
        public Docket createRestApi() {
            return new Docket(DocumentationType.OAS_30) // v2 不同
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.example.swaggerv3.controller")) // 设置扫描路径
                    .build();
        }
    }

    要注意,里边的版本类型换成了 OAS_30, 就是swagger3的意思。

    OAS 是 OpenAPI Specification 的简称,翻译成中文就是 OpenAPI 说明书。

    同时访问地址:原始地址,也就是没换UI的地址: localhost:8080/swagger-ui/index.html这个要和swagger2区分开。

    swagger3的原始UI风格也发生了一些变化:

    SpringBoot集成swagger实例分析

    同时swagger3也是可以更换UI的。方法和swagger2一样。

    四. swaggerUI 拦截器和跨域冲突处理

    如果我们的项目中有关于跨域的处理,同时还有拦截器,然后还要使用swagger,这种情况大家要注意了,有可能我们的拦截器会将swagger中的页面路径拦截掉导致swagger页面出不来,当我们在拦截器中把swagger的页面排除掉的时候,也有可能会导致跨域配置的失效。

    具体解决方案简单提一下:

    拦截器:

    /**
     * 拦截器配置
     *
     * @author liuShuai
     */
    @Configuration
    public class InterceptorConfig implements WebMvcConfigurer {
     
        @Bean
        public TokenInterceptor tokenInterceptor() {
            return new TokenInterceptor();
        }
     
     
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry
                    .addInterceptor(tokenInterceptor())
                    .addPathPatterns("/**")
                    .excludePathPatterns("/user/login")
                    .excludePathPatterns("/user/downloadExcel")
                    .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
        }
     
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("swagger-ui.html")
                    .addResourceLocations("classpath:/META-INF/resources/");
            registry.addResourceHandler("/webjars/**")
                    .addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
    }

    跨域配置:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.cors.CorsConfiguration;
    import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    import org.springframework.web.filter.CorsFilter;
     
    /**
     * @className: CorsConfig
     * @description:
     * @author: sh.Liu
     * @date: 2020-12-02 10:16
     */
    @Configuration
    public class CorsConfig {
     
        @Bean
        public CorsFilter corsFilter() {
            CorsConfiguration config = new CorsConfiguration();
            config.addAllowedOrigin("*");
            config.setAllowCredentials(true);
            config.addAllowedMethod("*");
            config.addAllowedHeader("*");
            UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
            configSource.registerCorsConfiguration("/**", config);
            return new CorsFilter(configSource);
        }
    }

    用这两种方式去配置,就可以让他们和平共处了。

    另: 配套项目代码已托管中gitCode: gitcode.net/lsqingfeng/…

    分支: feautre/MybatisPlus

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    使用 JAX-RS 和 Swagger 创建 RESTful API 的详细文档
    使用 JAX-RS 和 Swagger 创建 RESTful API 的详细文档

    RESTfulapi是一种基于Http的架构风格,它为分布式系统中的资源交互提供了统一的方式。为了便于开发人员使用和维护,为RESTfulAPI提供全面且可访问的文档非常重要。JAX-RS是一种JavaAPI,用于开发RESTfulWEB服务。它提供了丰富的注释和注解,简化了端点的定义和请求处理。swagger是一种流行的开源工具,用于生成RESTfulAPI的交互式文档。通过结合JAX-RS和Swagger,我们可以为我们的API提供高级文档,包括以下好处:自动化文档生成:Swagger使用JAX-RS

    自动生成API文档:使用Swagger在Beego中的实现方法
    自动生成API文档:使用Swagger在Beego中的实现方法

    在Beego中使用Swagger实现API文档自动生成随着互联网技术的日益成熟,越来越多的企业开始将自己的业务模型进行数字化转型,而API作为数字化转型的重要组成部分,也变得越来越重要。在开发API时候,除了保证API的安全和可靠性外,如何让其他前后端开发工程师更快地了解和使用自己开发的API,也是非常重要的一环。本文将介绍如何在使用Beego框架开发API

    编写基于RESTful API的API文档:PHP中使用Swagger规范的方法
    编写基于RESTful API的API文档:PHP中使用Swagger规范的方法

    在现代web应用程序中,RESTfulAPI是互联网应用程序的重要组成部分。RESTfulAPI是一种基于HTTP协议的架构风格,它允许客户端通过HTTP请求访问服务器上的资源。为了让应用更加易于使用,需要编写API文档。这篇文章将介绍如何使用Swagger规范编写基于RESTfulAPI的API文档。Swagger是一种流行的API规范,它允许开发人

    解析SpringBoot和SpringMVC之间的异同
    解析SpringBoot和SpringMVC之间的异同

    解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

    探索SpringCloud和SpringBoot在微服务领域的不同应用方式
    探索SpringCloud和SpringBoot在微服务领域的不同应用方式

    近年来,随着云计算和分布式架构的兴起,微服务架构的应用越来越广泛。而SpringCloud和SpringBoot作为Java开发中的两个重要框架,对于微服务的实现起到了重要的作用。然而,很多人对于它们在微服务领域的不同应用方式还存在一定的疑惑。本文将从不同的角度探索SpringCloud和SpringBoot在微服务中的应用方式。首先,我们来了解一下Spri

    SpringBoot和SpringMVC有何区别?
    SpringBoot和SpringMVC有何区别?

    SpringBoot与SpringMVC的不同之处在哪里?SpringBoot和SpringMVC是两个非常流行的Java开发框架,用于构建Web应用程序。尽管它们经常分别被使用,但它们之间的不同之处也是很明显的。首先,SpringBoot可以被看作是一个Spring框架的扩展或者增强版。它旨在简化Spring应用程序的初始化和配置过程,以帮助开发人

    比较SpringBoot和SpringMVC的异同
    比较SpringBoot和SpringMVC的异同

    SpringBoot和SpringMVC都是Java开发中常用的框架,但它们之间有一些明显的差异。本文将探究这两个框架的特点和用途,并对它们的差异进行比较。首先,我们来了解一下SpringBoot。SpringBoot是由Pivotal团队开发的,它旨在简化基于Spring框架的应用程序的创建和部署。它提供了一种快速、轻量级的方式来构建独立的、可执行

    SpringBoot与SpringMVC的不同点是什么?
    SpringBoot与SpringMVC的不同点是什么?

    SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。一、SpringBoot的特点:简化配置:SpringBoot通过约定优于配置的原则,大大简化了项目的配置过程。它可以自动配置项目所需要的参数,开发人

    比较和选择指南:SpringCloud与SpringBoot的功能比较
    比较和选择指南:SpringCloud与SpringBoot的功能比较

    SpringCloud和SpringBoot是目前Java领域中最热门的开源框架,它们分别提供了一套完善的微服务架构和快速构建应用程序的解决方案。本文将对它们的功能进行比较,并给出选择指南,以帮助读者了解它们的优势和适用场景。SpringBoot是一个用于开发Java应用程序的框架,它提供了一个简化的开发流程,集成了大量常用的功能和组件,减少了开发者的工作量

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。