iis 浏览网站鹤壁建设网站推广渠道

pingmian/2025/10/9 1:50:22/文章来源:
iis 浏览网站,鹤壁建设网站推广渠道,一个域名可以建几个网站,wordpress主页显示标题设置目录 一、前言二、登录torna三、创建/选择空间四、创建/选择项目五、创建/选择应用六、获取应用的token七、服务推送7.1 引入maven依赖7.2 test下面按照如下方式新建文件 一、前言 Torna作为一款企业级文档管理系统#xff0c;支持了很多种接口文档的推送方式。官方比较推荐的… 目录 一、前言二、登录torna三、创建/选择空间四、创建/选择项目五、创建/选择应用六、获取应用的token七、服务推送7.1 引入maven依赖7.2 test下面按照如下方式新建文件 一、前言 Torna作为一款企业级文档管理系统支持了很多种接口文档的推送方式。官方比较推荐的一种方式就是使用smart-doc插件推送该插件需要完善接口代码中的javadoc相对来说代码规范性要求较高。 使用方式如下 接口文档管理解决方案调研及TornaSmart-doc的使用 这里由于某些老项目javadoc并不规范而且某些接口连swagger注解都没有。所以在这里提供了一种基于swagger插件的方式利用main方法推送文档至torna的方式。 二、登录torna 三、创建/选择空间 这里空间可以配置为某个具体的环境例如开发环境、测试环境。 四、创建/选择项目 五、创建/选择应用 六、获取应用的token 七、服务推送 说明: 由于默认的swagger插件只支持扫描带有Api的Controller以及只带有ApiOperation的接口方法这里兼容了无swagger注解的接口推送。 7.1 引入maven依赖 dependencygroupIdcn.torna/groupIdartifactIdswagger-plugin/artifactIdversion1.2.14/versionscopetest/scope/dependency7.2 test下面按照如下方式新建文件 torna.json {// 开启推送enable: true,// 扫描package多个用;隔开basePackage: com.product,// 推送URLIP端口对应Torna服务器url: http://test.xxx.com:7700/torna/api,// 模块token,复制应用的tokentoken: xxxxxxxxxxxxxxxxxxxxxxxxxx,debugEnv: test,https://test.xxx.com/product,// 推送人author: author,// 打开调试:true/falsedebug: true,// 是否替换文档true替换false不替换追加。默认trueisReplace: false }DocPushTest.java import cn.torna.swaggerplugin.TmlySwaggerPlugin;public class DocPushTest {public static void main(String[] args) {TmlySwaggerPlugin.pushDoc();} }TmlySwaggerPlugin.java package cn.torna.swaggerplugin;import cn.torna.swaggerplugin.bean.TornaConfig; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.core.io.ClassPathResource; import org.springframework.util.StreamUtils;import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.nio.charset.StandardCharsets;public class TmlySwaggerPlugin {/*** 推送文档前提把codetorna.json/code文件复制到resources下*/public static void pushDoc() {pushDoc(torna.json);}/*** 推送swagger文档** param configFile 配置文件*/public static void pushDoc(String configFile) {pushDoc(configFile, TmlySwaggerPluginService.class);}public static void pushDoc(String configFile, Class? extends SwaggerPluginService swaggerPluginServiceClazz) {ClassPathResource classPathResource new ClassPathResource(configFile);if (!classPathResource.exists()) {throw new IllegalArgumentException(找不到文件: configFile 请确保resources下有torna.json);}System.out.println(加载Torna配置文件: configFile);try {InputStream inputStream classPathResource.getInputStream();String json StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);JSONObject jsonObject JSON.parseObject(json);TornaConfig tornaConfig jsonObject.toJavaObject(TornaConfig.class);Constructor? extends SwaggerPluginService constructor swaggerPluginServiceClazz.getConstructor(TornaConfig.class);SwaggerPluginService swaggerPluginService constructor.newInstance(tornaConfig);swaggerPluginService.pushDoc();} catch (IOException | InstantiationException | IllegalAccessException | NoSuchMethodException |InvocationTargetException e) {e.printStackTrace();throw new RuntimeException(推送文档出错, e);}} }TmlySwaggerPluginService.java package cn.torna.swaggerplugin;import cn.torna.sdk.param.DocItem; import cn.torna.swaggerplugin.bean.Booleans; import cn.torna.swaggerplugin.bean.ControllerInfo; import cn.torna.swaggerplugin.bean.PluginConstants; import cn.torna.swaggerplugin.bean.TornaConfig; import cn.torna.swaggerplugin.builder.MvcRequestInfoBuilder; import cn.torna.swaggerplugin.builder.RequestInfoBuilder; import cn.torna.swaggerplugin.exception.HiddenException; import cn.torna.swaggerplugin.exception.IgnoreException; import cn.torna.swaggerplugin.util.ClassUtil; import cn.torna.swaggerplugin.util.PluginUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.http.MediaType; import org.springframework.util.CollectionUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore;import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.*; import java.util.stream.Collectors;public class TmlySwaggerPluginService extends SwaggerPluginService {private final TornaConfig tornaConfig;public TmlySwaggerPluginService(TornaConfig tornaConfig) {super(tornaConfig);this.tornaConfig tornaConfig;}public void pushDoc() {if (!tornaConfig.getEnable()) {return;}String basePackage tornaConfig.getBasePackage();if (StringUtils.isEmpty(basePackage)) {throw new IllegalArgumentException(basePackage can not empty.);}this.doPush();this.pushCode();}protected void doPush() {String packageConfig tornaConfig.getBasePackage();String[] pkgs packageConfig.split(;);SetClass? classes new HashSet();for (String basePackage : pkgs) { // SetClass? clazzs ClassUtil.getClasses(basePackage, Api.class);// 把带有RestController的控制层抽取出来SetClass? clazzs ClassUtil.getClasses(basePackage, RestController.class);classes.addAll(clazzs);}MapControllerInfo, ListDocItem controllerDocMap new HashMap(32);for (Class? clazz : classes) {ControllerInfo controllerInfo;try {controllerInfo buildControllerInfo(clazz);} catch (HiddenException | IgnoreException e) {System.out.println(e.getMessage());continue;}ListDocItem docItems controllerDocMap.computeIfAbsent(controllerInfo, k - new ArrayList());ReflectionUtils.doWithMethods(clazz, method - {try {DocItem apiInfo this.buildDocItem(new MvcRequestInfoBuilder(method, tornaConfig));docItems.add(apiInfo);} catch (HiddenException | IgnoreException e) {System.out.println(e.getMessage());} catch (Exception e) {System.out.printf(Create doc error, method:%s%n, method);throw new RuntimeException(e.getMessage(), e);}}, this::match);}ListDocItem docItems mergeSameFolder(controllerDocMap);this.push(docItems);}private ControllerInfo buildControllerInfo(Class? controllerClass) throws HiddenException, IgnoreException {Api api AnnotationUtils.findAnnotation(controllerClass, Api.class);ApiIgnore apiIgnore AnnotationUtils.findAnnotation(controllerClass, ApiIgnore.class);if (api ! null api.hidden()) {throw new HiddenException(Hidden docApi.hiddentrue api.value());}if (apiIgnore ! null) {throw new IgnoreException(Ignore docApiIgnore controllerClass.getName());}String name, description;int position 0;if (api null) {name controllerClass.getSimpleName();description ;} else {name api.value();if (StringUtils.isEmpty(name) api.tags().length 0) {name api.tags()[0];}description api.description();position api.position();}ControllerInfo controllerInfo new ControllerInfo();controllerInfo.setName(name);controllerInfo.setDescription(description);controllerInfo.setPosition(position);return controllerInfo;}/*** 合并控制层文档* 按照控制层类的顺序及名称(Api为value,否则类的getSimpleName)合并为一个有序的文档数组** param controllerDocMap 控制层-文档集合* return*/private ListDocItem mergeSameFolder(MapControllerInfo, ListDocItem controllerDocMap) {// key文件夹value文档MapString, ListDocItem folderDocMap new HashMap();controllerDocMap.forEach((key, value) - {ListDocItem docItems folderDocMap.computeIfAbsent(key.getName(), k - new ArrayList());docItems.addAll(value);});ListControllerInfo controllerInfoList controllerDocMap.keySet().stream().sorted(Comparator.comparing(ControllerInfo::getPosition)).collect(Collectors.toList());ListDocItem folders new ArrayList(controllerDocMap.size());for (Map.EntryString, ListDocItem entry : folderDocMap.entrySet()) {String name entry.getKey();ControllerInfo info controllerInfoList.stream().filter(controllerInfo - name.equals(controllerInfo.getName())).findFirst().orElse(null);if (info null) {continue;}DocItem docItem new DocItem();docItem.setName(name);docItem.setDefinition(info.getDescription());docItem.setOrderIndex(info.getPosition());docItem.setIsFolder(Booleans.TRUE);ListDocItem items entry.getValue();items.sort(Comparator.comparing(DocItem::getOrderIndex));docItem.setItems(items);folders.add(docItem);}return folders;}protected DocItem buildDocItem(RequestInfoBuilder requestInfoBuilder) throws HiddenException, IgnoreException {Method method requestInfoBuilder.getMethod();ApiOperation apiOperation method.getAnnotation(ApiOperation.class);ApiIgnore apiIgnore method.getAnnotation(ApiIgnore.class);if (apiOperation ! null apiOperation.hidden()) {throw new HiddenException(Hidden APIApiOperation.hiddentrue apiOperation.value());}if (apiIgnore ! null) {throw new IgnoreException(Ignore APIApiIgnore apiOperation.value());}return this.doBuildDocItem(requestInfoBuilder);}/*** 兼容方法名上ApiOperation为空的情况** param requestInfoBuilder* return*/protected DocItem doBuildDocItem(RequestInfoBuilder requestInfoBuilder) {ApiOperation apiOperation requestInfoBuilder.getApiOperation();Method method requestInfoBuilder.getMethod();DocItem docItem new DocItem();String httpMethod getHttpMethod(requestInfoBuilder);docItem.setAuthor(apiOperation ! null ? buildAuthor(apiOperation) : );docItem.setName(apiOperation ! null ? apiOperation.value() : method.getName());docItem.setDescription(apiOperation ! null ? apiOperation.notes() : );docItem.setOrderIndex(apiOperation ! null ? buildOrder(apiOperation, method) : 0);docItem.setUrl(requestInfoBuilder.buildUrl());String contentType buildContentType(requestInfoBuilder);docItem.setHttpMethod(httpMethod);docItem.setContentType(contentType);docItem.setIsFolder(PluginConstants.FALSE);docItem.setPathParams(buildPathParams(method));docItem.setHeaderParams(buildHeaderParams(method));docItem.setQueryParams(buildQueryParams(method, httpMethod));TmlyDocParamWrapper reqWrapper new TmlyDocParamWrapper();BeanUtils.copyProperties(buildRequestParams(method, httpMethod), reqWrapper);TmlyDocParamWrapper respWrapper new TmlyDocParamWrapper();BeanUtils.copyProperties(buildResponseParams(method), respWrapper);docItem.setRequestParams(reqWrapper.getData());docItem.setResponseParams(respWrapper.getData());docItem.setIsRequestArray(reqWrapper.getIsArray());docItem.setRequestArrayType(reqWrapper.getArrayType());docItem.setIsResponseArray(respWrapper.getIsArray());docItem.setResponseArrayType(respWrapper.getArrayType());docItem.setErrorCodeParams(apiOperation ! null ? buildErrorCodes(apiOperation) : new ArrayList(0));return docItem;}private String getHttpMethod(RequestInfoBuilder requestInfoBuilder) {ApiOperation apiOperation requestInfoBuilder.getApiOperation();Method method requestInfoBuilder.getMethod();if (apiOperation ! null StringUtils.hasText(apiOperation.httpMethod())) {return apiOperation.httpMethod();}RequestMapping requestMapping AnnotatedElementUtils.findMergedAnnotation(method, RequestMapping.class);if (requestMapping ! null) {RequestMethod[] methods requestMapping.method();if (methods.length 0) {return this.tornaConfig.getMethodWhenMulti();} else {return methods[0].name();}}return tornaConfig.getDefaultHttpMethod();}private String buildContentType(RequestInfoBuilder requestInfoBuilder) {ApiOperation apiOperation requestInfoBuilder.getApiOperation();Method method requestInfoBuilder.getMethod();if (apiOperation ! null StringUtils.hasText(apiOperation.consumes())) {return apiOperation.consumes();}String[] consumeArr getConsumes(method);if (consumeArr ! null consumeArr.length 0) {return consumeArr[0];}Parameter[] methodParameters method.getParameters();if (methodParameters.length 0) {return ;}for (Parameter methodParameter : methodParameters) {RequestBody requestBody methodParameter.getAnnotation(RequestBody.class);if (requestBody ! null) {return MediaType.APPLICATION_JSON_VALUE;}if (PluginUtil.isFileParameter(methodParameter)) {return MediaType.MULTIPART_FORM_DATA_VALUE;}}return getTornaConfig().getGlobalContentType();}private String[] getConsumes(Method method) {RequestMapping requestMapping AnnotatedElementUtils.findMergedAnnotation(method, RequestMapping.class);if (requestMapping ! null) {return requestMapping.consumes();}return null;}public boolean match(Method method) {ListString scanApis this.tornaConfig.getScanApis();if (CollectionUtils.isEmpty(scanApis)) { // return method.getAnnotation(ApiOperation.class) ! null;return AnnotatedElementUtils.hasAnnotation(method, RequestMapping.class);}for (String scanApi : scanApis) {String methodName method.toString();if (methodName.contains(scanApi)) {return true;}}return false;}DataAllArgsConstructorNoArgsConstructorprivate static class TmlyDocParamWrapperT {/*** 是否数组*/private Byte isArray;/*** 数组元素类型*/private String arrayType;private ListT data;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自己做网站送外卖襄阳网站seo

本文介绍使用python提取pdf中的表格到excel中,包含pdf的拆分、pdf提取到excel、合并excel。 一、拆分pdf 将一个大的pdf按页数拆分为多个小的pdf: # pip install PyPDF2import os, pdfplumber, PyPDF2# 分割pdf def split_pdf(input_pdf_path, num_splits):# Create a PDF…

江阴做网站的公司有国内平台有哪些

网络基本协议 TCP协议 UDP协议 二者对比: 连接性: TCP是面向连接的协议,需要在传输数据之前先进行三次握手建立连接。而UDP是无连接的协议,可以直接发送数据,无需事先建立连接。 可靠性: TCP提供了数…

电影网站推广3d效果图设计制作软件

mysql如何删除一条记录delete from 表名 where 条件实例:use db1delete from tb1 where id 1; 转载于:https://www.cnblogs.com/effortsing/p/10393229.html

仓山福州网站建设做soho外贸网站

转载:http://www.cnblogs.com/lijunamneg/archive/2013/01/18/2866953.html Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的applicati…

中国住房和城乡建设网网站湛江免费网站建站模板

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

域名网站网址宜昌市上海中学官网

受到其它一些函数式编程开发语言的影响,在Erlang语言中,将函数作为一个对象,赋予其“变量”的属性,即为我们的匿名函数 或 简称 fun,它具有以下特性: (匿名函数:不是定义在Erlang模…

做会员卡网站百度广告联盟推广链接

一、Q-learning算法介绍 Q-learning是一种强化学习算法,用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤: 1. 定义环境:确定问题的状态和动作空间,并…

网站开发好百度一下百度百科

基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产品放到相邻货架销售的时候&a…

做网站的公司不给域名做网站需要掌握什么

数学基础线性代数 从行的角度从列的角度行列式的几何解释向量范数和矩阵范数 向量范数矩阵范数的更强的性质的意义 几种向量范数诱导的矩阵范数 1 范数诱导的矩阵范数无穷范数诱导的矩阵范数2 范数诱导的矩阵范数 各种范数之间的等价性向量与矩阵序列的收敛性 函数的可微性与展…

网站制作与网站建设建一个购物网站多少钱

在工作中,我们难免会遇到一些棘手的电脑问题,自己搞定不了?那就找高手帮忙吧!假若就在身旁还能帮上忙,但远在天边的又是鞭长莫及,这该如何是好呢?这时候大家都会想到QQ的远程功能。但经常用QQ远…

做接口自动化是网站登录加密建设婚恋网站

实现浮点数转换成人民币读法字符串 将浮点数转换成人民币读法字符串, 例如: 将1006.333转换为壹千零陆元叁角叁分。 整体解析: 将浮点数分成整数部分和小数部分,分开处理整数部分和小数部分。 小数部分的处理比较简单&#xff…

类似凡科建站的网站房屋装修网

互联网公司的项目经理:客户伤不起 前面《互联网公司的项目经理:大同与大不同》谈到了互联网公司的项目经理面对的客户和传统软件公司的不同,主要表现在客户与项目经理是同一组织内的、是和你一个战壕共同战斗的,很多情况甚至荣辱与…

留学网站建设多少钱游戏代理怎么找渠道

概述 京东作为中国最大的电商平台,为了保护其网站数据的安全性,采取了一系列的反爬虫机制。然而,作为开发者,我们可能需要使用爬虫工具来获取京东的数据。 正文 Puppeteer 是一个由 Google 开发的 Node.js 库,它提供…

建设部网站设计资质查询做网站系统的答辩ppt范文

目录 概述定义应用场景主要角色类图 详述基本代码应用实例符合的设计原则 总结 概述 定义 代理模式是一种结构型设计模式,它允许通过一个代理对象来控制对原始对象的访问。代理对象可以在不改变原始对象的情况下,增加一些额外的功能,例如权限…

动态链接做网站外链图南京网站制作公司招聘

实现功能 需求:在类的成员属性使用Autowirde注解注入容器中的对象。 实现思路 要实现这个功能。我们首先要思考一个问题:类与类的关系是在调用的建立的,还是说在创建对象的时候就就将建立了? ---我实现的方案是,在在程…

网站建设报告总结平面设计线上培训班哪个好

所谓的激活函数,就是李宏毅老师讲到的sigmoid函数 和 hard sigmoid函数 ,ReLU函数那些 现在一点点慢慢探索,会成为日后想都做不到的经历,当你啥也不会的时候,才是慢慢享受探索的过程。 有一说一,用chatGP…

河间市网站建设大连云app官方下载

Yocto .bb 文件字段解析 本文详细讲解了 Yocto .bb 文件中各字段的作用和用法,包括 SECTION、SRC_URI、SUMMARY 等,旨在帮助开发者更好地理解和使用 Yocto 构建系统。 目录 1. SECTION 字段 1.1 SECTION 的作用1.2 SECTION 的用法1.3 如何使用 SECTIO…

四平英文网站建设网站开发职业资格证书

今天给大家分享一个目前在小红书很火的AI绘画商单号案例。 首先给大家看看案例视频形态 这类视频内容非常简单,主要展示农家庭院的别致景色。通过AI绘画工具生成图片,再利用剪辑工具将画面增加动态元素,让整个视频逼真鲜活,加上…

做不锈钢的网站wordpress用户组设置

4.3 云开发文件存储 4.3.4 删除文件 在小程序端和云函数端,都可以调用API删除云空间中的文件,这两个API的参数和回调函数参数都是一样。每次调用API最多删除50个文件。使用方法如下代码所示: // 回调风格的API wx.cloud.deleteFile({ file…

域名大全免费网站app开发费用

在eclipse下构建maven项目,该项目由多个子模块组成。 1.创建一个父项目 NEW -->project-->maven-->maven Project,点击下一步,进入new maven Project的Select project name and location界面 ,什么也不做,直接…