Abp vNext 关于引用swagger注释补充

把 Visual Studio .NET 源代码文件中C# XML注释提取成工程文档 把 Visual Studio .NET 源代码文件中C# XML注释提取成工程文档 PRE { background:#EEEEEE; margin-top:1em; margin-bottom:1em; margin-left:0px; padding:5pt; font-size:90%; font-family:courier new,courier,serif; } 阅读详情

网上看了一些Abp vNext引用swagger的教程,大致流程都差不多,就是生成每一层对应的xml然后使用IncludeXmlComments方法来引用,后面亲自实践发现有些差异和要点,在此记录一下。

基本步骤:

  1. 右击项目解决方案,属性-生成-输出-勾选XML文档文件,删除路径信息仅保留xml文件名称。例如xxx.Application.xml。
  2. hostmodule下,AddSwaggerGen内添加以下代码:
context.Services.AddSwaggerGen(options=> {
    ......
    // 添加swagger-API方法注释
    var xmlapppath = Path.Combine(AppContext.BaseDirectory, "xxx.Application.xml");
    if (File.Exists(xmlapppath))
        options.IncludeXmlComments(xmlapppath, true);
 
    // 添加swagger-DTO参数注释
    var xmlContractspath = Path.Combine(AppContext.BaseDirectory,             "xxx.Application.Contracts.xml");
    if (File.Exists(xmlContractspath))
        options.IncludeXmlComments(xmlContractspath, true);
 
    // 添加swagger-自定义控制器注释
    var xmlapipath = Path.Combine(AppContext.BaseDirectory, "xxx.WebAPI.xml");
    if (File.Exists(xmlapipath))
        options.IncludeXmlComments(xmlapipath , true);
});
  1. 引用路径不要采用本地路径,可以使用AppContext.BaseDirectory来拼接地址以避免发布时遇到问题。
  2. xxx.Application.xml添加引用后可以生成API方法注释,但是并没有DTO参数注释,因为dto定义都在应用服务抽象层,需要添加xxx.Application.Contracts.xml后才会有参数注释。
  3. 因为一般使用的是动态API,如果你有自定义的controller方法,需要添加xxx.HttpApi.xml进来才能看到自定义控制器方法的注释。
  4. 配置生成XML文件时,注意配置release环境下的输出,不要只配Debug模式。

ABP 为SWAGGER接口页添加详细注释

从Abp官网创建完项目之后,启动之后,Swagger的接口说明页,默认是没有接口说明的,这样是很不友好的,也不利于接口调用者的使用,所以,我们要实现Swagger页面的接口注释功能。

首先,我们看一下默认启动后,Swagger的接口页面,标红的是我们自己写的获取所有组织机构的接口,默认是没有注释的。
在这里插入图片描述
接下来,我们选中我们Application层的项目,右键“属性”,将输出路径选择为“bin\Debug\”,然后再勾选为Xml生成文档,如下图所示。
在这里插入图片描述
接下来,在你的 项目名.WEB.HOST 的STARTUP目录下,找到STARTUP.CS类,在它的CONFIGURESERVICES方法中,找到配置SWAGGER的代码块(SERVICES.ADDSWAGGERGEN),将生成的XML配置进去。核心代码如下:

var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径)
var xmlPath = Path.Combine(basePath, "HealthCenter.Web.Host.xml");   //  添加 swagger xml 注释  这个xml文件开始是不存在的写上项目名.xml即可
   options.IncludeXmlComments(xmlPath);

在这里插入图片描述
然后再启动项目,可以看到我们的接口有注释了
在这里插入图片描述

禁用swagger_基于 abp vNext 和 .NET Core 开发博客项目 完善与美化,Swagger登场 上一篇文章(https://www.cnblogs.com/meowv/p/12896898.html)已经成功将博客项目跑起来了,那么本篇主要是将之前遗留的问题解决,现在的代码看起来可能还是比较混乱,有大量与之无关的代码存在里面,对于强迫症患者来说真的是零容忍。在程序员界,总有一批强迫症患者,他们希望自己写的代码看起来尽量的完美无瑕疵。完善与美化直奔主题,首先将各项目层的项目文件(.c... 阅读详情

相关推荐

(三)从零开始学习模糊控制——模糊决策

模糊控制之基础——模糊数学 (一)模糊数学——基本概念 (二)模糊数学——模糊关系 (三)模糊数学——模糊决策 文章目录模糊控制之基础——模糊数学前言一、模糊决策法1.最大值原理2.模糊排序2.模糊寻优总结 前言   模糊决策是指在模糊环境下进行决策的数学理论和方法。这类问题─般具有大系统特征,系统之间的关系十分复杂,存在不能准确赋值的变量,这些变量属于模糊因素,涉及到一定的主观因素,使得子系统之间、变量之间的关系不清晰,从而必须借助排序、模糊评判等方法来进行处理。 一、模糊决策

qq_43667552的博客 4750

在C#使用XML注释

简介大多数程序员可能都听说过Java自带的一个工具JavaDoc;使用它可以自动地为你的代码生成HTML文档。C#和C#编译器也有类似的功能,不过它生成的是XML,而不是直接生成HTML。不过使用XML会使得文档更加灵活。注释语法       为了使用C#提供的XML注释功能,你的注释应该使用特殊的注释语法(///)开头。在///之后,你可以使用预先定义的标签注释你的代码,也可以插入你

DotNet天堂 1万+

SARscape的DInSAR全流程-以西安市隋大兴唐长安城遗址为例

通过DInSAR对西安市隋大兴唐长安城遗址开展的年度周期性监测,发现成因是地质内部构造断裂带活动所导致的地面产生物理空间上的形变,而地面的沉降与抬升是直接影响城市发展与文化遗产保护最为常见的缓变型不可逆地质灾害。西安市地处汾渭断陷盆地中部,受临潼-长安断裂带影响,导致区域内构造活动较为强烈。由于早年西安市地表水资源匮乏,从上世纪50年代末开始大量开采地下水资源以满足城市人口不断扩张的需求,从而导致地下承压含水层水位急速下降,形成多个局部沉降中心(八里村、西工大、电子城等)。

2301_77687129的博客 5810

.net framework中webapi使用swagger进行接口文档展示

第四步:在SwaggerUI文件夹中,创建一个swagger_lang.js的js,用于对swagger进行汉化处理(注:这个文件必须添加,否则汉化将失败)第三步:创建一个“SwaggerControllerDescProvider”类,用于对swagger文档中的内容进行汉化处理。第一步:在nuget程序包管理中搜索“Swagger.Net”包和“Swagger.Net.UI”,然后进行安装。这里需要注意,新增的swagger_lang.js文件需要修改文件属性,将文件生成操作修改为“嵌入的资源”。

suxuelian的博客 5344

YOLO-FastestV2从零部署到移动端推理实战手册

本文详细介绍了YOLO-FastestV2从零开始的完整部署流程,涵盖环境搭建、模型训练、格式转换及移动端部署。通过实战步骤,指导开发者将这一轻量级目标检测模型成功部署到Android设备,实现实时推理。文章重点解析了PyTorch到NCNN的模型转换与优化,助力移动端AI应用开发。

l1k9j8h7g6的博客 668

KTransformers安装笔记 利用docker安装KTransformers

KTransformers安装笔记 利用docker安装KTransformers

guoqingru0311的博客 1559

.NET中的Swagger使用

现在很多项目都是前后端分离的项目,后端写好接口跟前端对接,需要后端提供接口文档、参数等注释,这上面花时间着这些东西,接口修改又要去修改文档,很不方便前后端人员开发有Sawwger有利于前后端开发人员接口的对接,调试,功能上挺丰富的,简单的写了以上几点。

qq_42335551的博客 3219

详细教程:如何使用elasticsearch 8.x进行向量搜索

大模型的热度使得向量数据库和embedding也成了ai领域的热门话题,有别于从头开始训练一个大模型或基于基础模型进行微调的方式,embedding检索相关上下文是对大模型进行定制的各种方法中成本最低、技术实现最便捷的方式。从技术实现的角度,

qq_50790981的博客 1万+

.Net6 之 asp.net core webapi Swagger 版本控制及接口注释说明

ApiExplorerSettings(GroupName =nameof(ApiVersionInfo.接口版本V1))][ApiExplorerSettings(GroupName =nameof(ApiVersionInfo.接口版本V2))]上图 是 v1版本下的接口,如果需要 v2中有 接口数据 ,需要返回 第二步 在其他控制器上 定义。第一步 首先 在 控制器上 和 每个接口方法 上 添加 注释 如图。第二步:规定 控制属于 哪个 版本。第二步 :打开项目的.csproj文件加上 添加。

q8812345qaz的博客 3692

nacos3.1.0适配国产数据库

Nacos 3.1.0适配国产数据库指南 本文介绍了Nacos 3.1.0版本适配达梦数据库和人大金仓数据库的具体步骤。主要内容包括:添加达梦和人大金仓的JDBC驱动依赖,修改nacos-persistence模块的配置文件及相关Java类,以及打包和运行注意事项。文章特别指出3.1.0版本需要JDK17环境,并提供了解决常见问题的建议,如添加VM options配置和不同启动方式等。通过本文的配置指导,可以实现Nacos服务在国产数据库环境下的正常运行。

梦昼初的博客 1462

Himall商城ExpressDaDaHelper 取消订单(线上环境)

Himall商城ExpressDaDaHelper 取消订单(线上环境)

GZM888888的博客 399

abp vnext中swagger使用小结

文章目录介绍先决条件具体说明模块类添加Swagger配置类1、接口分组2、接口注释3、JWT认证的安全锁显示4、枚举注释的显示总结 介绍 现在大多工作中用到的后端开发都是基于RESTFUL的接口开发了,所以使用swagger进行接口管理也就成了比较默认的方式。最近相对比较有时间,所以觉得可以把在abp vnext中使用swagger的一些知识点进行一下总结。 先决条件 VS 2019 Abp VNext 的版本号:4.0.0 Swashbuckle.AspNetCore 版本号:5.5.0 Swashbu

寒冰屋的专栏 4508

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Abp vNext swagger注释

网上看了一些Abp vNext引用swagger的教程,大致流程都差不多,就是生成每一层对应的xml然后使用IncludeXmlComments方法来引用,后面亲自实践发现有些差异和要点,在此记录一下。 基本步骤: 右击项目解决方案,属性-生成-输出-勾选XML文档文件,删除路径信息仅保留xml文件名称。例如:xxx.Application.xml。 hostmodule下,AddSwaggerGen内添加以下代码: 1 context.Services.AddSwaggerGen(o.

神奇海螺 939

深度学习工具包 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")

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场

上一篇文章(https://www.cnblogs.com/meowv/p/12896898.html)已经成功将博客项目跑起来了,那么本篇主要是将之前遗留的问题解决,现在的代码看起来可...

阿星Plus 405

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ABP中Swagger配置(中文注释,文件上传,其他参数类型待补充)

ABP中Swagger配置(中文注释,文件上传,其他参数类型待补充) 1.中文注释 右击XXX.Application项目=》属性=》生成=》勾选XML文档文件(复制文件地址) 在Startup的ConfigureServices中配置services.AddSwaggerGen,新增如下代码 var xmlFile = @"XXX.Application.xml"; var xmlPath = Path.Combine(AppContext.BaseDirector

dzhjhp的博客 1152

Abp VNext 项目创建简介

文章目录简介项目创建关于 module 项目的简单说明简单优化项目1、移动端项目删除2、*.sln.DotSettings3、*.HttpApi.Host 的调整4、*.HttpApi 和 *.HttpApi.Client 的调整5、*.EntityFrameworkCore、*.EntityFrameworkCore.DbMigrations 和 *.DbMigrator 的调整6、*.Domain 和 *.Domain.Shared 的调整7、*.Application 和 *.Application.

寒冰屋的专栏 1万+

ABP vnext 控制器知识整理

使用 新增控制器 例1 返回json字符串 例2 返回文件流 例3 Swagger页面展示注释 例4 自动控制器 例5 上传文件 例6 ABP通过Abp.Web.Mvc nuget包集成了ASP.NET MVC控制器。可像常规那样创建MVC控制器。 例1 XXX.HttpApi\Controllers\XXXXController.cs [RemoteService] [Route("api/Acceptance/Qlqt")] public class XX

威风的风的博客 1238

基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录

在开始之前,我们实现一个之前的遗留问题,这个问题是有人在GitHub Issues(https://github.com/Meowv/Blog/issues/8)上提出来的,就是当我们对...

dotNET跨平台 691

干掉 Swagger,试试这个!

JApiDocs是一个无需额外注解、开箱即用的SpringBoot接口文档生成工具。编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又不得不做的事情,我们都不喜欢写文档,但...

weixin_43167418的博客 202

一、Swagger配置

一、Swagger配置 1、注解不显示 SwaggerConfig文件下 //c.IncludeXmlComments(GetXmlCommentsPath());内下面添加: c.IncludeXmlComments(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"bin\YDShengya_WebAp...

weixin_30568591的博客 1043

c#配置swagger文档

《.NET Core 6.0集成Swagger与JWT验证配置指南》摘要: 本文详细介绍了在.NET Core 6.0 WebAPI项目中集成Swagger并配置JWT验证的完整流程。通过AddSwaggerGen方法添加Bearer Token验证方案,支持在请求头中传递JWT令牌。文章包含新建项目自动配置与旧项目手动集成两种场景,重点说明了XML文档注释的启用方法、接口排序配置以及开发环境下的中间件注入。特别解决了旧项目中常见的Swagger启动失败问题,指出需检查launchSettings.json

qq_53217825的博客 7032

swagger添加接口注释

右键项目- 属性 - 生成 - 勾选XML文档文件。再次运行就能得到我们想要的weagger接口注释了。保存后重新运行一下项目,会生成一个XML文件……

qq_42243005的博客 934

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

&#13; 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者的心情。或者详细点,或者简单点。那么有没有一种快速有效的方法来构建api说明文档呢?答案是肯定的, Swagger就是最受欢迎的REST APIs文档生成工具之一!...

依乐祝的博客 4985
上一篇: StackExchange.Redis Timeout performing 超时问题
下一篇: Entity Framework Core【无键实体类型】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值