完善接口文档模板与逻辑

This commit is contained in:
wanggeng 2021-08-15 16:02:01 +08:00
parent ea58e18596
commit f020356a81
2 changed files with 322 additions and 129 deletions

View File

@ -1,6 +1,8 @@
package com.cm.common.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.cm.common.base.AbstractService;
import com.cm.common.config.properties.SystemProperties;
import com.cm.common.constants.ISystemConstant;
import com.cm.common.service.IApiDocService;
import com.cm.common.utils.DateUtil;
@ -53,6 +55,8 @@ public class ApiDocServiceImpl extends AbstractService implements IApiDocService
private ServiceModelToSwagger2Mapper serviceModelToSwagger2Mapper;
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@Autowired
private SystemProperties systemProperties;
@PostConstruct
public void init() {
@ -84,9 +88,9 @@ public class ApiDocServiceImpl extends AbstractService implements IApiDocService
apiGroups.add(systemDocMap);
}
}
apiDocMap.put("title", systemProperties.getTitle());
apiDocMap.put("apiGroups", apiGroups);
apiDocMap.put("author", "System");
apiDocMap.put("author", "XXXXXX");
apiDocMap.put("date", DateUtil.getDay());
apiDocMap.put("version", "v1.0");
return apiDocMap;
@ -124,15 +128,22 @@ public class ApiDocServiceImpl extends AbstractService implements IApiDocService
apiMap.put("definitions", definitions);
for (Tag tag : tags) {
Map<String, Object> apiController = new HashMap<>();
apiController.put("name", tag.getName());
apiController.put("name", tag.getName().indexOf("\\-") > 0 ? tag.getName().split("\\-")[1] : tag.getName());
apiController.put("description", tag.getDescription());
apiController.put("apis", listApiMap(tag.getName(), paths));
apiController.put("apis", listApiMap(tag.getName(), paths, definitions));
apiControllers.add(apiController);
}
return apiMap;
}
private List<Map<String, Object>> listApiMap(String apiController, Map<String, Path> paths) {
/**
* api列表
*
* @param apiController
* @param paths
* @return
*/
private List<Map<String, Object>> listApiMap(String apiController, Map<String, Path> paths, Map<String, Model> definitions) {
List<Map<String, Object>> pathMaps = new ArrayList<>();
for (Map.Entry<String, Path> kv : paths.entrySet()) {
String apiUrl = kv.getKey();
@ -150,8 +161,20 @@ public class ApiDocServiceImpl extends AbstractService implements IApiDocService
methodOperationMap.put("description", operation.getDescription() == null ? "" : operation.getDescription());
methodOperationMap.put("consumes", operation.getConsumes());
methodOperationMap.put("produces", operation.getProduces());
methodOperationMap.put("parameters", listRequestParameter(operation));
methodOperationMap.put("responses", listResponseMap(operation));
// 请求参数
List<Map<String, Object>> parameters = listRequestParameter(operation);
methodOperationMap.put("parameters", parameters);
methodOperationMap.put("parameterRefs", listRef(parameters, definitions));
// 请求示例
List<Map<String, Object>> parameterExamples = listExample(parameters, definitions);
methodOperationMap.put("parameterExamples", parameterExamples);
// 响应参数
List<Map<String, Object>> responses = listResponseMap(operation);
methodOperationMap.put("responses", responses);
methodOperationMap.put("responseRefs", listRef(responses, definitions));
// 响应示例
List<Map<String, Object>> responseExamples = listExample(responses, definitions);
methodOperationMap.put("responseExamples", responseExamples);
pathMaps.add(methodOperationMap);
}
}
@ -159,6 +182,12 @@ public class ApiDocServiceImpl extends AbstractService implements IApiDocService
return pathMaps;
}
/**
* 请求参数
*
* @param operation
* @return
*/
private List<Map<String, Object>> listRequestParameter(Operation operation) {
List<Map<String, Object>> requestParameterList = new ArrayList<>();
List<Parameter> parameters = operation.getParameters();
@ -175,23 +204,31 @@ public class ApiDocServiceImpl extends AbstractService implements IApiDocService
requestParameter.put("type", type);
requestParameter.put("source", parameter);
requestParameter.put("access", parameter.getAccess());
String ref = "";
String simpleRef = "";
if (parameter instanceof BodyParameter) {
BodyParameter bodyParameter = (BodyParameter) parameter;
Model schema = bodyParameter.getSchema();
requestParameter.put("schemaClass", schema.getClass());
if (schema instanceof RefModel) {
RefModel refModel = (RefModel) schema;
requestParameter.put("ref", refModel.get$ref());
requestParameter.put("simpleRef", refModel.getSimpleRef());
ref = refModel.get$ref();
simpleRef = refModel.getSimpleRef();
}
}
requestParameter.put("ref", ref);
requestParameter.put("simpleRef", simpleRef);
requestParameterList.add(requestParameter);
}
return requestParameterList;
}
/**
* 响应结果
*
* @param operation
* @return
*/
private List<Map<String, Object>> listResponseMap(Operation operation) {
Map<String, Response> responses = operation.getResponses();
List<Map<String, Object>> responseMaps = new ArrayList<>();
@ -202,26 +239,187 @@ public class ApiDocServiceImpl extends AbstractService implements IApiDocService
responseMap.put("code", code);
responseMap.put("description", response.getDescription());
Property schema = response.getSchema();
String ref = "";
String simpleRef = "";
String type = "";
if (schema != null) {
responseMap.put("schemaClass", schema.getClass());
responseMap.put("type", schema.getType());
type = schema.getType();
if (schema instanceof ArrayProperty) {
ArrayProperty arrayProperty = (ArrayProperty) schema;
Property items = arrayProperty.getItems();
if (items instanceof RefProperty) {
RefProperty refProperty = (RefProperty) items;
responseMap.put("ref", refProperty.get$ref());
responseMap.put("simpleRef", refProperty.getSimpleRef());
ref = refProperty.get$ref();
simpleRef = refProperty.getSimpleRef();
}
} else if (schema instanceof RefProperty) {
RefProperty refProperty = (RefProperty) schema;
responseMap.put("ref", refProperty.get$ref());
responseMap.put("simpleRef", refProperty.getSimpleRef());
ref = refProperty.get$ref();
simpleRef = refProperty.getSimpleRef();
}
}
responseMap.put("ref", ref);
responseMap.put("simpleRef", simpleRef);
responseMap.put("type", StringUtils.equals(type, "ref") ? "object" : type);
responseMaps.add(responseMap);
}
return responseMaps;
}
/**
* 引用对象列表
*
* @param listParameter
* @param definitions
* @return
*/
private List<Map<String, Object>> listRef(List<Map<String, Object>> listParameter, Map<String, Model> definitions) {
List<Map<String, Object>> refs = new ArrayList<>();
for (Map<String, Object> parameter : listParameter) {
if (StringUtils.equals(parameter.get("ref").toString(), "")) {
continue;
}
String simpleRef = parameter.get("simpleRef").toString();
setRef(refs, simpleRef, definitions);
}
return refs;
}
/**
* 设置引用
*
* @param refs
* @param simpleRef
* @param definitions
*/
private void setRef(List<Map<String, Object>> refs, String simpleRef, Map<String, Model> definitions) {
for (Map.Entry<String, Model> definitionKV : definitions.entrySet()) {
if (StringUtils.equals(definitionKV.getKey(), simpleRef)) {
Model model = definitionKV.getValue();
if (model instanceof ModelImpl) {
ModelImpl modelImpl = (ModelImpl) model;
Map<String, Property> modelProperties = model.getProperties();
if (modelProperties == null) {
return;
}
Map<String, Object> requestParameterRef = new HashMap<>();
// 这里提前添加为了保证递归时的顺序
refs.add(requestParameterRef);
requestParameterRef.put("class", model.getClass());
requestParameterRef.put("name", definitionKV.getKey());
requestParameterRef.put("type", modelImpl.getType());
requestParameterRef.put("modelProperties", modelProperties);
List<Map<String, Object>> modelPropertiesList = new ArrayList<>();
// 这里提前添加为了保证递归时的顺序
requestParameterRef.put("modelPropertiesList", modelPropertiesList);
for (Map.Entry<String, Property> modelPropertiesKV : modelProperties.entrySet()) {
Property modelPropertiesValue = modelPropertiesKV.getValue();
Map<String, Object> modelPropertiesMap = new HashMap<>();
modelPropertiesMap.put("name", modelPropertiesKV.getKey());
modelPropertiesMap.put("description", StringUtils.isBlank(modelPropertiesValue.getDescription()) ? "" : modelPropertiesValue.getDescription());
modelPropertiesMap.put("type", modelPropertiesValue.getType());
modelPropertiesMap.put("example", modelPropertiesValue.getExample() == null ? "" : modelPropertiesValue);
modelPropertiesMap.put("class", modelPropertiesValue.getClass());
modelPropertiesList.add(modelPropertiesMap);
// 递归完成引用类的构建
RefProperty subRefProperty = getRefProperty(modelPropertiesValue);
String subSimpleRef = "";
if (subRefProperty != null) {
subSimpleRef = subRefProperty.getSimpleRef();
// 相同引用不递归处理
if (!StringUtils.equals(simpleRef, subSimpleRef)) {
setRef(refs, subSimpleRef, definitions);
}
}
modelPropertiesMap.put("simpleRef", subSimpleRef);
}
}
return;
}
}
}
/**
* 获取对象示例
*
* @param listParameter
* @param definitions
* @return
*/
private List<Map<String, Object>> listExample(List<Map<String, Object>> listParameter, Map<String, Model> definitions) {
List<Map<String, Object>> exampleList = new ArrayList<>();
for (Map<String, Object> parameter : listParameter) {
if (StringUtils.equals(parameter.get("ref").toString(), "")) {
continue;
}
String simpleRef = parameter.get("simpleRef").toString();
Map<String, Object> exampleMap = new HashMap<>();
exampleMap.put("simpleRef", simpleRef);
// 得到对象示例
Map<String, Object> example = new HashMap<>();
setExample(example, simpleRef, definitions);
// 带格式的JSON输出
exampleMap.put("example", JSONObject.toJSONString(example));
exampleList.add(exampleMap);
}
return exampleList;
}
private void setExample(Map<String, Object> exampleMap, String simpleRef, Map<String, Model> definitions) {
for (Map.Entry<String, Model> definitionKV : definitions.entrySet()) {
if (StringUtils.equals(definitionKV.getKey(), simpleRef)) {
Model model = definitionKV.getValue();
if (model instanceof ModelImpl) {
Map<String, Property> modelProperties = model.getProperties();
if (modelProperties == null) {
return;
}
for (Map.Entry<String, Property> modelPropertiesKV : modelProperties.entrySet()) {
Property modelPropertiesValue = modelPropertiesKV.getValue();
exampleMap.put(modelPropertiesKV.getKey(), "");
// 递归完成引用类的构建
RefProperty subRefProperty = getRefProperty(modelPropertiesValue);
if (subRefProperty != null) {
String subSimpleRef = subRefProperty.getSimpleRef();
// 相同引用不递归处理
if (!StringUtils.equals(simpleRef, subSimpleRef)) {
Map<String, Object> subExampleMap = new HashMap<>();
if (StringUtils.equals(modelPropertiesValue.getType(), "array")) {
List<Map<String, Object>> subExampleList = new ArrayList<>();
subExampleList.add(subExampleMap);
exampleMap.put(modelPropertiesKV.getKey(), subExampleList);
} else {
exampleMap.put(modelPropertiesKV.getKey(), subExampleMap);
}
setExample(subExampleMap, subSimpleRef, definitions);
}
}
}
}
return;
}
}
}
/**
* 获取引用属性
*
* @param modelPropertiesValue
* @return
*/
private RefProperty getRefProperty(Property modelPropertiesValue) {
RefProperty subRefProperty = null;
if (modelPropertiesValue instanceof ArrayProperty) {
ArrayProperty arrayProperty = (ArrayProperty) modelPropertiesValue;
Property items = arrayProperty.getItems();
if (items instanceof RefProperty) {
subRefProperty = (RefProperty) items;
}
} else if (modelPropertiesValue instanceof RefProperty) {
subRefProperty = (RefProperty) modelPropertiesValue;
}
return subRefProperty;
}
}

View File

@ -94,17 +94,7 @@
<w:sz w:val="52"/>
<w:szCs w:val="52"/>
</w:rPr>
<w:t>X</w:t>
</w:r>
<w:r w:rsidRPr="00915FA1">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体"/>
<w:b/>
<w:bCs/>
<w:sz w:val="52"/>
<w:szCs w:val="52"/>
</w:rPr>
<w:t>XXX</w:t>
<w:t>${title}</w:t>
</w:r>
</w:p>
<w:p w14:paraId="4805950A" w14:textId="76E63FED" w:rsidR="00794B53" w:rsidRPr="00915FA1" w:rsidRDefault="00794B53" w:rsidP="00535033">
@ -385,7 +375,7 @@
<w:sz w:val="24"/>
<w:szCs w:val="24"/>
</w:rPr>
<w:t>功能说明</w:t>
<w:t>${api.summary}</w:t>
</w:r>
</w:p>
<w:p w14:paraId="4B7CF361" w14:textId="67474B4F" w:rsidR="009F47E9" w:rsidRPr="003374F2" w:rsidRDefault="001A2E56" w:rsidP="001A2E56">
@ -409,7 +399,7 @@
<w:sz w:val="24"/>
<w:szCs w:val="24"/>
</w:rPr>
<w:t>描述${api.summary}</w:t>
<w:t>功能描述</w:t>
</w:r>
</w:p>
<w:p w14:paraId="3520F921" w14:textId="06032F8E" w:rsidR="00FE5FDB" w:rsidRPr="003374F2" w:rsidRDefault="00C80924" w:rsidP="00FE5FDB">
@ -748,6 +738,7 @@
</w:tr>
</#list>
</w:tbl>
<#list api.parameterRefs as parameterRef>
<w:p w14:paraId="0E6E47B4" w14:textId="48701217" w:rsidR="00017A4F" w:rsidRPr="0019798A" w:rsidRDefault="00C80924" w:rsidP="0019798A">
<w:pPr>
<w:jc w:val="left"/>
@ -756,26 +747,12 @@
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="0019798A">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>X</w:t>
</w:r>
<w:r w:rsidRPr="0019798A">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>XX</w:t>
</w:r>
<w:r w:rsidRPr="0019798A">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>对象属性</w:t>
<w:t>${parameterRef.name}对象属性</w:t>
</w:r>
</w:p>
<w:tbl>
@ -819,7 +796,7 @@
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>名</w:t>
<w:t>属性名</w:t>
</w:r>
</w:p>
</w:tc>
@ -906,11 +883,12 @@
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>示例</w:t>
<w:t>构造对象</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<#list parameterRef.modelPropertiesList as modelProperties>
<w:tr w:rsidR="00C80924" w:rsidRPr="00C80924" w14:paraId="5EBAE2B1" w14:textId="656F88DE" w:rsidTr="008F69DD">
<w:trPr>
<w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
@ -930,6 +908,14 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="00C80924">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${modelProperties.name}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
@ -947,6 +933,14 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="00C80924">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${modelProperties.description}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
@ -964,6 +958,14 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="00C80924">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${modelProperties.type}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
@ -981,10 +983,21 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="00C80924">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${modelProperties.simpleRef}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#list>
</w:tbl>
</#list>
<#list api.parameterExamples as parameterExample>
<w:p w14:paraId="19A1F3EB" w14:textId="3CBE2826" w:rsidR="004A47C0" w:rsidRPr="00CE1CD9" w:rsidRDefault="004A47C0" w:rsidP="001A2E56">
<w:pPr>
<w:pStyle w:val="a3"/>
@ -1004,14 +1017,7 @@
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>请求</w:t>
</w:r>
<w:r w:rsidR="00CC78ED" w:rsidRPr="00CE1CD9">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>示例</w:t>
<w:t>${parameterExample.simpleRef} 示例</w:t>
</w:r>
</w:p>
<w:tbl>
@ -1043,10 +1049,19 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="00C80924">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${parameterExample.example}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
</#list>
<w:p w14:paraId="184ECB3C" w14:textId="45A74D36" w:rsidR="0078442A" w:rsidRDefault="00C80924" w:rsidP="00CE1CD9">
<w:pPr>
<w:pStyle w:val="a3"/>
@ -1137,7 +1152,7 @@
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>原因</w:t>
<w:t>说明</w:t>
</w:r>
</w:p>
</w:tc>
@ -1165,7 +1180,7 @@
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>名称</w:t>
<w:t>返回值</w:t>
</w:r>
</w:p>
</w:tc>
@ -1193,7 +1208,7 @@
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>响应类型</w:t>`
<w:t>返回类型</w:t>`
</w:r>
</w:p>
</w:tc>
@ -1271,7 +1286,7 @@
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>xxx</w:t>
<w:t>${response.simpleRef}</w:t>
</w:r>
</w:p>
</w:tc>
@ -1295,13 +1310,14 @@
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>object</w:t>
<w:t>${response.type}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#list>
</w:tbl>
<#list api.responseRefs as responseRef>
<w:p w14:paraId="3E49EA28" w14:textId="7544DC55" w:rsidR="00B50D00" w:rsidRDefault="005F2E4B" w:rsidP="00B50D00">
<w:pPr>
<w:jc w:val="left"/>
@ -1315,21 +1331,7 @@
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>X</w:t>
</w:r>
<w:r>
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>XXX</w:t>
</w:r>
<w:r>
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>属性</w:t>
<w:t>${responseRef.name}对象属性</w:t>
</w:r>
</w:p>
<w:tbl>
@ -1428,7 +1430,7 @@
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>类型</w:t>
<w:t>参数类型</w:t>
</w:r>
</w:p>
</w:tc>
@ -1456,11 +1458,13 @@
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>示例</w:t>
<w:t>数据类型</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<#if (responseRef.modelPropertiesList)??>
<#list responseRef.modelPropertiesList as modelProperties>
<w:tr w:rsidR="005F23E6" w:rsidRPr="00C80924" w14:paraId="3DBC8ECC" w14:textId="77777777" w:rsidTr="006B54D1">
<w:trPr>
<w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
@ -1479,6 +1483,14 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${modelProperties.name}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
@ -1495,6 +1507,14 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${modelProperties.description}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
@ -1511,6 +1531,14 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${modelProperties.type}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
@ -1527,10 +1555,22 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>${modelProperties.simpleRef}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#list>
</#if>
</w:tbl>
</#list>
<#list api.responseExamples as responseExample>
<w:p w14:paraId="73770BA9" w14:textId="5D8D764D" w:rsidR="00CE1CD9" w:rsidRDefault="00003A80" w:rsidP="00CE1CD9">
<w:pPr>
<w:pStyle w:val="a3"/>
@ -1550,7 +1590,7 @@
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>请求失败示例</w:t>
<w:t>${responseExample.simpleRef}示例</w:t>
</w:r>
</w:p>
<w:tbl>
@ -1581,64 +1621,19 @@
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
<w:p w14:paraId="2111782B" w14:textId="7345FB34" w:rsidR="00003A80" w:rsidRDefault="00003A80" w:rsidP="00CE1CD9">
<w:pPr>
<w:pStyle w:val="a3"/>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="2"/>
</w:numPr>
<w:ind w:firstLineChars="0"/>
<w:jc w:val="left"/>
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
<w:r w:rsidRPr="00C80924">
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体" w:hint="eastAsia"/>
<w:szCs w:val="21"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>请求成功示例</w:t>
<w:t>${responseExample.example}</w:t>
</w:r>
</w:p>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="a4"/>
<w:tblW w:w="0" w:type="auto"/>
<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="8296"/>
</w:tblGrid>
<w:tr w:rsidR="00003A80" w14:paraId="33DDD8E3" w14:textId="77777777" w:rsidTr="008F69DD">
<w:tc>
<w:tcPr>
<w:tcW w:w="8296" w:type="dxa"/>
<w:tcBorders>
<w:top w:val="single" w:sz="4" w:space="0" w:color="4472C4"/>
<w:left w:val="single" w:sz="4" w:space="0" w:color="4472C4"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="4472C4"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="4472C4"/>
</w:tcBorders>
</w:tcPr>
<w:p w14:paraId="6960710C" w14:textId="77777777" w:rsidR="00003A80" w:rsidRDefault="00003A80" w:rsidP="00003A80">
<w:pPr>
<w:jc w:val="left"/>
<w:rPr>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
</#list>
<w:p w14:paraId="5EC2E1F7" w14:textId="77777777" w:rsidR="00003A80" w:rsidRPr="00003A80" w:rsidRDefault="00003A80" w:rsidP="00003A80">
<w:pPr>
<w:jc w:val="left"/>