Swagger

Swagger3.0.0实战 springboot2.6.4+基于knife4j增强的Swagger3.0.0实现 阅读详情

先了解什么是RESTful API?

参考博文:https://blog.youkuaiyun.com/hjc1984117/article/details/77334616

总结:前后端分离,而双方需要一个联系中介。前端和后端的唯一联系,变成了API接口;API文档变成了前后端开发人员联系的纽带,变得越来越重要。

Swagger就是一款让你更好的书写API文档的框架。 

 

什么是Swagger?

如上,Swagger就是一款让你更好的书写API文档的框架,是一个Restful风格接口的文档在线自动生成和测试的框架 。 深入的了解和学习可以参考以下链接:

参考博文:https://blog.youkuaiyun.com/chenyulancn/article/details/79487318

                  https://blog.youkuaiyun.com/tuposky/article/details/77965139

官网地址:https://swagger.io/

 

下面以我的博文 搭建 SpringBoot 2.0 项目 (五) 搭建一个集成ssm的web项目 为基础,进行简单配置来入门swagger的设置与使用。

1、添加依赖

  截止本博文发表日期,最新版本为 2.8.0。由于本人项目开发采用了2.7.0版本,本博文以 2.7.0 版本的为案例。

 在pom.xml中插入相关依赖,自动下载。

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

2、创建Swagger的配置文件

在启动类 Application 的同级目录下,创建配置文件

@Configuration
@EnableSwagger2
public class Swagger {
    @Bean
    public Docket controllerApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                        .title("Swagger2 学习")
                        .description("RESTful API")
                        .contact(new Contact("Henry_Lin_Wind的博客", "https://blog.youkuaiyun.com/Henry_Lin_Wind", null))
                        .version("版本号:2.8.0")
                        .build())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
                .paths(PathSelectors.any())
                .build();
    }
   
}

 启动项目,访问 http://localhost:8080/swagger-ui.html#/,即可看到如下页面。

从上图可看出,很多接口及其参数以及返回信息设置都没有相关的注释和说明。如下图所示,需要在相关位置加入注释。

接下来分步骤说明插入注释所需要的注解及其使用方法

3、添加接口说明

@ApiOperation :在Swagger中,默认以方法名作为API名称.可在方法上使用@ApiOperation来设置或修改名称

@ApiOperation("欢迎页面")
	@RequestMapping(value = "/hello",method = RequestMethod.GET)
	public String hello(){
		System.out.println("Hello");
		return "Log";
	}

 

4、接口的相关参数的说明

@ApiImplicitParam:此注解可以设置接口下的 Parameters 的相关参数如Parameters 名称,描述,类型等。有多个参数可采用如下方式

@ApiImplicitParams({

   @ApiImplicitParam

   @ApiImplicitParam

})

 参见下表,@ApiImplicitParam 有如下属性

属性可选值说明
name 参数名,例:@requestParams("a") String b,则name=a
value 参数说明
dataType原始数据类型(string,int,long等)或class名参数类型
paramTypequery,path,body,header,form参数方式
requiredtrue,false是否必填
allowMultipletrue,false允许多个值
defaultValue 默认值
allowableValues 允许的值
access  

属性详解如下:

  • name : 参数名

       必须与实际参数传入变量名一致.,显示在Parameters表格的Parameter列

  • value : 参数说明

       可任意填写,显示在Parameters表格的Description列

  • paramType 参数方式,如下:

        query  :  @RequestParam  , @ModelAttribute

        path    :  @PathVariable

        body   :  @RequestBody

        header:  @RequestHeader

 

  • required:是否必填- dataType:参数类型

       可以是简单数据类型,如string,int,long等,也可以是一个类的类名,当dataType是一个自定义类时,参考Api自定义类说明

  • 值为true或false.

       当值为true时,Parameters表格的Parameter列与Description列为粗体,且value列的输入框显示required,该输入框为空时将阻止提交操作

  • allowMultiple:允许多值

       True或False
       当为true时,输入框可使用”,”连接多个值,参数必须为数组或列表才可使用该属性

  • defaultValue :默认值

       该属性有值时,Parameters表格的value列输入框默认填入该值

  • allowableValues :允许的值的数组

       该属性有值时,Parameters表格的value列输入框将改为下拉列表,列表项为该值

 

以上属性了解后,开始在添加@ApiImplicitParam,设置相关属性:

@ApiOperation("用户登录")
@ApiImplicitParams({
    @ApiImplicitParam(paramType="query",name = "name", value = "用户名称", required = true, dataType = "String"),
    @ApiImplicitParam(paramType="body",name = "password", value = "用户密码", required = true, dataType = "String")
})
@RequestMapping(value = "/login",method = RequestMethod.GET)
public String addUser1(String name,String password) {

设置完成后,刷新页面,可以看到相关属性已成功修改并更新。效果如下: 

 

以上就是swagger的入门案例,附上2.8.0版本的swagger效果图。风格不同,按需使用。

Swagger——【SpringBoot集成Swagger、配置Swagger、配置扫描接口、配置API分组】 互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。下面有部分截图希望能对大家有所帮助。 阅读详情

相关推荐

Swagger解析大全

1.什么是Swagger OpenAPI规范(OpenAPI Specification 简称OAS)是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程,目前版本是V3.0,并且已经发布并开源在github上。 Swagger是符合OpenAPI规范的接口开发工具,支持从设计和文档到测试和部署的整个API生命周 期的开发。 (h...

spring_root的博客 2426

swagger-ui.html 显示Parameters有误

swagger-ui.html 显示Parameters有误

MTonj的博客 1465

ks-快手滑块验证码-Js逆向

本文分析了快手滑块验证码的破解过程。首先通过抓包找到验证码背景图接口,发现需要动态获取captchaSession参数。然后深入分析验证流程,发现verifyParam参数被加密处理,需要追踪其生成逻辑。文章详细解析了加密参数c的构成,包括captchaSn、滑动距离、轨迹信息等,并指出轨迹验证较为严格。最后通过对比浏览器和本地生成的加密值,确认加密逻辑正确,但指出轨迹生成仍需优化。作者建议参考相关文章深入分析轨迹逻辑,并提供了验证成功的截图作为参考。

2302_76420666的博客 1878

Swagger学习⑧——@Parameters注解

注解是库的一部分,属于。它用于在 API 操作中同时描述多个参数。与@Parameter注解不同,是一个容器注解,可以包含多个@Parameter注解,从而更简洁地描述多个参数。

一个写了10年bug的程序员日常笔记。 1818

三极管简单振荡电路实现:从零开始的实战示例

通过一个基础实例,手把手教你如何利用三极管构建简单的振荡电路,深入理解三极管在实际电路中的工作原理与应用技巧。

weixin_32836713的博客 1203

模型算力需求估算

(Billion Parameters,简称B)和训练/推理的计算任务复杂度,结合硬件计算能力(例如每秒浮点运算次数,FLOPS)来估算。以下是详细的方法和公式说明,以及实际的计算示例。算力需求的估算依赖于参数量、模型架构及硬件性能,结合训练/推理场景的特定要求来计算。通过上述公式和示例,我们可以定量分析不同任务的算力需求,并合理配置硬件资源以优化运行效率。结论:推理任务相对较轻,单台H100可以在30秒内完成此任务。推理算力需求一般远低于训练,因为只需要执行前向传播。,可以将训练时间缩短到约。

形上得其象,形下合于数;阴阳自济,玄理自明。 8957

Swagger 3 注解使用指南

注解来描述每个API操作的摘要和详细描述,注解的对象,用于描述参数的数据类型。描述:用于描述操作的输入参数。在上述示例中,我们使用了。注解来描述请求体,以及。注解来描述响应结果,注解来描述路径参数,注解来描述响应结果。

吉屋安的博客 2万+

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 736

Swagger——快速使用swagger

swagger使用教程,springboot整合使用swagger

YR_112233的博客 8万+

libero烧录信号抓取

提示:如果改了东西需要重新烧录,需要把这两个界面都关闭再libero打开。两个红色的要关闭掉。然后返回libero开始烧录,观测信号(如果只烧录观测从这一步开始就行)等到下面的messige出现以下信息表示run好了。在下图中右侧可以自己设置,设置完之后记得保存一下。run一下,耐心等待,有警告就ok,run完之后。run成功会变绿色,然后点下面的这个看波形。设置抓取信号:在libero打开。打开的就是烧录界面,直接run。

qq_34047965的博客 1423

【AAAI2025】【小目标检测】FBRT-YOLO:更快速、更优的实时航拍图像检测方法

FBRT-YOLO是一种新型实时航拍图像检测方法,针对小目标检测的精度与效率平衡问题提出创新解决方案。该方法通过两个轻量级模块显著提升性能:特征互补映射模块(FCM)将浅层空间位置信息深度整合至网络深层,缓解信息失衡;多核感知单元(MKP)采用多尺度卷积增强多目标感知能力。实验表明,在VisDrone、UAVDT和AI-TOD数据集上,FBRT-YOLO在检测精度和速度方面均优于现有实时检测器,特别适用于资源受限的飞行设备。该模型通过精简网络结构,在保持高性能的同时降低了计算负担,为航拍实时检测提供了高效解

weixin_44184852的博客 2907

SpringBoot之swagger

SpringBoot之swagger swagger是什么 1、是一款让你更好的书写API文档的规范且完整框架。 2、提供描述、生产、消费和可视化RESTful Web Service。 3、是由庞大工具集合支撑的形式化规范。这个集合涵盖了从终端用户接口、底层代码库到商业API管理的方方面面。 springboot集成swagger <dependency> <groupId>io.springfox</groupId>

qq_41343166的博客 2万+

【AutoSAR】【诊断栈】传输层CANTP

一、功能介绍 数据包发送放拆包分段发送 数据包接收方重组 流控 错误检测 二、参考协议 ISO 15765-2 三、数据帧格式 1、协议数据单元(PDU)格式 2、协议数据单元 - PCI格式 四、数据帧传输 1、单帧传输 CAN帧数据长度小于8字节(包括PCI信息) 无流控握手 PCI包含帧类型、数据长度和数据域 未使用字节填充 2、多帧传输 数据长度超过8字节 流控握手 定时控制 CAN帧类型包括: 首帧 流控帧 后继帧 3、多..

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 1554

Swagger的使用,包括swagger2和swagger3

Swagger的使用 1、建一个maven项目 2、引入依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency>

daijianzhou的专栏 8731

GameFramework框架详解之 DataTable配置表模块

一.前言: DataTable模块是项目的配置表模块,配置表一般是从excel导出csv/json/xml格式的,之所以是excel作为源文件,原因是因为策划同学使用配表最方便。然后一键导出到项目中,除了csv/json/xml配置文件外,一般还会伴随着导出配置的实体类,这样研发同学就可以使用了。GameFramework的DataTable模块也是秉持着这种一贯的策略来实现的。 二.DataRow DataRow在excel数据表中,对应的是一行数据,而在代码中对应的其实就是一条数据对象。 接口IData

TxNet 4726

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Swagger升级指南:Swagger2与Swagger3注解差异揭秘

Swagger3(OpenAPI 3)是对Swagger2的一个重大升级,它不仅提供了更多的新特性,也带来了注解的变化。虽然迁移可能需要一些工作,但新的规范和特性是值得的。本文提供了一个基础的迁移指南和注解对比,帮助大家理解如何从Swagger2迁移到Swagger3,并利用它来更好地文档化API。

果酱 の 博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【swagger关闭】生产环境关闭swagger方法

生产环境关闭swagger方法

一只懂代码不懂人情世故的源码爱好猿 3万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

关于Swagger的使用

视频讲解可以看看这个: 【黑马程序员Java项目实战《苍穹外卖》,最适合新手的SpringBoot+SSM的企业级Java项目实战】 https://www.bilibili.com/video/BV1TP411v7v6/?p=14&share_source=copy_web&vd_source=282bf01e944809becea85b62e4bd1f75

m0_63088707的博客 1811

【Swagger】Swagger简介及简单使用

说起Swagger就不得不说前后端分离当前最主流的前后端分离技术栈:Vue+Springboot后端时代:前端只用管理静态页面:html、css、js最后统一交给后端,后端将其修改为jsp,在整个过程中,后端充当主力前后端分离时代:后端:后端控制层,服务层,数据访问层【后端团队】前端:前端控制层,视图层【前端团队】前端可以自定义一些伪后端数据:json,在写的时候就存在,不需要后端,前端工程依旧能够跑起来那么前端后端如何交互?

treesorshining的博客 2800

【Swagger】Swagger-狂神笔记

前后端分离前端 -> 前端控制层、视图层后端 -> 后端控制层、服务层、数据访问层前后端通过API进行交互前后端相对独立且松耦合产生的问题前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发解决方案首先定义schema [ 计划的提纲 ],并实时跟踪最新的API,降低集成风险Swagger号称世界上最流行的API框架Restful Api 文档在线自动生成器 => API 文档 与API 定义同步更新直接运行,在线测试API。

知不足而奋进,望远山而前行 2万+

Swagger2 和 Swagger3 的区别与使用

Swagger2 和 Swagger3 的区别与使用 主要区别: 1 导入的依赖 注意:我springboot 使用的版本为4.3.1, 版本过高会报错 Swagger2 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> &l

A2254536570的博客 6866
上一篇: 搭建 SpringBoot 2.0 项目 (五) 搭建一个集成ssm的web项目
下一篇: Netty
Henry_Lin_Wind
博客等级 码龄8年 49粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值