From 1263a4c2c2165f6af010a78525f38a8d7b63dff9 Mon Sep 17 00:00:00 2001
From: wanggeng <450292408@qq.com>
Date: Sun, 15 Aug 2021 21:07:07 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3=E8=AE=BE?=
=?UTF-8?q?=E8=AE=A1=E6=96=87=E6=A1=A3WORD=E5=AF=BC=E5=87=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
common/pom.xml | 7 +
.../wgink/common/base/ApiInfoController.java | 95 +-
.../common/service/api/IApiInfoService.java | 47 +
.../service/api/impl/ApiInfoServiceImpl.java | 480 +++
.../resources/templates/ftl/api-template.ftl | 3250 +++++++++++++++++
pom.xml | 7 +-
6 files changed, 3809 insertions(+), 77 deletions(-)
create mode 100644 common/src/main/java/ink/wgink/common/service/api/IApiInfoService.java
create mode 100644 common/src/main/java/ink/wgink/common/service/api/impl/ApiInfoServiceImpl.java
create mode 100644 common/src/main/resources/templates/ftl/api-template.ftl
diff --git a/common/pom.xml b/common/pom.xml
index 216d535e..3f29940d 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -65,6 +65,13 @@
+
+
+ org.springframework.boot
+ spring-boot-starter-freemarker
+
+
+
\ No newline at end of file
diff --git a/common/src/main/java/ink/wgink/common/base/ApiInfoController.java b/common/src/main/java/ink/wgink/common/base/ApiInfoController.java
index a97ac747..80844a8b 100644
--- a/common/src/main/java/ink/wgink/common/base/ApiInfoController.java
+++ b/common/src/main/java/ink/wgink/common/base/ApiInfoController.java
@@ -1,30 +1,14 @@
package ink.wgink.common.base;
-import ink.wgink.exceptions.ParamsException;
-import ink.wgink.exceptions.SearchException;
-import ink.wgink.interfaces.menu.IMenuBaseService;
-import ink.wgink.interfaces.user.IUserCheckService;
-import ink.wgink.pojo.dtos.menu.MenuDTO;
+import freemarker.template.TemplateException;
+import ink.wgink.common.service.api.IApiInfoService;
import ink.wgink.pojo.dtos.permission.SystemApiDTO;
-import ink.wgink.util.RegexUtil;
-import io.swagger.models.Operation;
-import io.swagger.models.Path;
-import io.swagger.models.Swagger;
-import io.swagger.models.Tag;
-import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-import springfox.documentation.service.Documentation;
-import springfox.documentation.spring.web.DocumentationCache;
-import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
+import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import java.util.ArrayList;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -38,67 +22,26 @@ import java.util.Map;
* @Date: 2021/2/24 20:17
* @Version: 1.0
**/
-@Controller
+@RestController
public class ApiInfoController {
- private static String API_TYPE_GET = "get";
- private static String API_TYPE_POST = "post";
- private static String API_TYPE_PUT = "put";
- private static String API_TYPE_DELETE = "delete";
-
@Autowired
- private DocumentationCache documentationCache;
- @Autowired
- private ServiceModelToSwagger2Mapper serviceModelToSwagger2Mapper;
+ private IApiInfoService apiInfoService;
@GetMapping("system-api/{group}/{apiType}")
@ResponseBody
public SystemApiDTO getSystemApi(@PathVariable("group") String group, @PathVariable("apiType") String apiType, HttpServletRequest request) {
- boolean apiTypeFlag = StringUtils.equalsIgnoreCase(API_TYPE_POST, apiType) ||
- StringUtils.equalsIgnoreCase(API_TYPE_DELETE, apiType) ||
- StringUtils.equalsIgnoreCase(API_TYPE_PUT, apiType) ||
- StringUtils.equalsIgnoreCase(API_TYPE_GET, apiType);
- if (!apiTypeFlag) {
- throw new ParamsException("api类型错误,只能是 post、delete、put、get 其中一种");
- }
- Documentation documentation = documentationCache.documentationByGroup(group);
- if (documentation == null) {
- throw new SearchException("无任何接口");
- }
- Swagger swagger = serviceModelToSwagger2Mapper.mapDocumentation(documentation);
- // 标签
- List tags = swagger.getTags();
- List apis = new ArrayList<>();
- for (Map.Entry kv : swagger.getPaths().entrySet()) {
- String keyPath = kv.getKey();
- Path valuePath = kv.getValue();
- Operation operation = null;
- if (StringUtils.equals(API_TYPE_POST, apiType)) {
- operation = valuePath.getPost();
- } else if (StringUtils.equals(API_TYPE_DELETE, apiType)) {
- operation = valuePath.getDelete();
- } else if (StringUtils.equals(API_TYPE_PUT, apiType)) {
- operation = valuePath.getPut();
- } else if (StringUtils.equals(API_TYPE_GET, apiType)) {
- operation = valuePath.getGet();
- }
- if (operation == null) {
- continue;
- }
- String apiTag = null;
- for (Tag tag : tags) {
- if (StringUtils.equals(tag.getName(), operation.getTags().get(0))) {
- apiTag = tag.getDescription().replaceAll("\\s", "");
- }
- }
- if (apiTag == null) {
- continue;
- }
- apis.add(new SystemApiDTO.ApiDTO(RegexUtil.replacePathParams(keyPath, "*"), operation.getSummary(), apiTag));
- }
- SystemApiDTO systemApiDTO = new SystemApiDTO();
- systemApiDTO.setSystemTag(request.getContextPath());
- systemApiDTO.setApis(apis);
- return systemApiDTO;
+ return apiInfoService.getSystemApi(group, apiType, request);
+
+ }
+
+ @GetMapping("api-info/get-api")
+ public Map getApi(@RequestParam(name = "apiTypes", required = false) List apiTypes) {
+ return apiInfoService.getApi(apiTypes);
+ }
+
+ @GetMapping("api-info/get")
+ public void get(HttpServletRequest request, HttpServletResponse response) throws IOException, TemplateException {
+ apiInfoService.get(request, response);
}
}
diff --git a/common/src/main/java/ink/wgink/common/service/api/IApiInfoService.java b/common/src/main/java/ink/wgink/common/service/api/IApiInfoService.java
new file mode 100644
index 00000000..cc372ed8
--- /dev/null
+++ b/common/src/main/java/ink/wgink/common/service/api/IApiInfoService.java
@@ -0,0 +1,47 @@
+package ink.wgink.common.service.api;
+
+import freemarker.template.TemplateException;
+import ink.wgink.pojo.dtos.permission.SystemApiDTO;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: IApiInfoService
+ * @Description: API
+ * @Author: wanggeng
+ * @Date: 2021/8/15 4:05 下午
+ * @Version: 1.0
+ */
+public interface IApiInfoService {
+ /**
+ * 获取系统API
+ *
+ * @param group
+ * @param apiType
+ * @param request
+ * @return
+ */
+ SystemApiDTO getSystemApi(String group, String apiType, HttpServletRequest request);
+
+ /**
+ * 获取API
+ *
+ * @param apiTypes
+ * @return
+ */
+ Map getApi(List apiTypes);
+
+ /**
+ * 下载文档
+ *
+ * @param request
+ * @param response
+ * @throws IOException
+ * @throws TemplateException
+ */
+ void get(HttpServletRequest request, HttpServletResponse response) throws IOException, TemplateException;
+}
diff --git a/common/src/main/java/ink/wgink/common/service/api/impl/ApiInfoServiceImpl.java b/common/src/main/java/ink/wgink/common/service/api/impl/ApiInfoServiceImpl.java
new file mode 100644
index 00000000..a0249b0e
--- /dev/null
+++ b/common/src/main/java/ink/wgink/common/service/api/impl/ApiInfoServiceImpl.java
@@ -0,0 +1,480 @@
+package ink.wgink.common.service.api.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+import ink.wgink.common.base.DefaultBaseService;
+import ink.wgink.common.service.api.IApiInfoService;
+import ink.wgink.exceptions.ParamsException;
+import ink.wgink.exceptions.SearchException;
+import ink.wgink.interfaces.consts.ISystemConstant;
+import ink.wgink.pojo.dtos.permission.SystemApiDTO;
+import ink.wgink.properties.ServerProperties;
+import ink.wgink.util.RegexUtil;
+import ink.wgink.util.date.DateUtil;
+import io.swagger.models.*;
+import io.swagger.models.parameters.BodyParameter;
+import io.swagger.models.parameters.Parameter;
+import io.swagger.models.properties.ArrayProperty;
+import io.swagger.models.properties.Property;
+import io.swagger.models.properties.RefProperty;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
+import springfox.documentation.service.Documentation;
+import springfox.documentation.spring.web.DocumentationCache;
+import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.util.*;
+
+/**
+ * @ClassName: ApiInfoServiceImpl
+ * @Description: API
+ * @Author: wanggeng
+ * @Date: 2021/8/15 4:06 下午
+ * @Version: 1.0
+ */
+@Service
+public class ApiInfoServiceImpl extends DefaultBaseService implements IApiInfoService {
+
+ private static String API_TYPE_GET = "get";
+ private static String API_TYPE_POST = "post";
+ private static String API_TYPE_PUT = "put";
+ private static String API_TYPE_DELETE = "delete";
+
+ @Autowired
+ private DocumentationCache documentationCache;
+ @Autowired
+ private ServiceModelToSwagger2Mapper serviceModelToSwagger2Mapper;
+ @Autowired
+ private FreeMarkerConfigurer freeMarkerConfigurer;
+ @Autowired
+ private ServerProperties serverProperties;
+
+ @PostConstruct
+ public void init() {
+ freeMarkerConfigurer.getConfiguration().setClassForTemplateLoading(ApiInfoServiceImpl.class, "/templates");
+ }
+
+ @Override
+ public SystemApiDTO getSystemApi(String group, String apiType, HttpServletRequest request) {
+ boolean apiTypeFlag = StringUtils.equalsIgnoreCase(API_TYPE_POST, apiType) ||
+ StringUtils.equalsIgnoreCase(API_TYPE_DELETE, apiType) ||
+ StringUtils.equalsIgnoreCase(API_TYPE_PUT, apiType) ||
+ StringUtils.equalsIgnoreCase(API_TYPE_GET, apiType);
+ if (!apiTypeFlag) {
+ throw new ParamsException("api类型错误,只能是 post、delete、put、get 其中一种");
+ }
+ Documentation documentation = documentationCache.documentationByGroup(group);
+ if (documentation == null) {
+ throw new SearchException("无任何接口");
+ }
+ Swagger swagger = serviceModelToSwagger2Mapper.mapDocumentation(documentation);
+ // 标签
+ List tags = swagger.getTags();
+ List apis = new ArrayList<>();
+ for (Map.Entry kv : swagger.getPaths().entrySet()) {
+ String keyPath = kv.getKey();
+ Path valuePath = kv.getValue();
+ Operation operation = null;
+ if (StringUtils.equals(API_TYPE_POST, apiType)) {
+ operation = valuePath.getPost();
+ } else if (StringUtils.equals(API_TYPE_DELETE, apiType)) {
+ operation = valuePath.getDelete();
+ } else if (StringUtils.equals(API_TYPE_PUT, apiType)) {
+ operation = valuePath.getPut();
+ } else if (StringUtils.equals(API_TYPE_GET, apiType)) {
+ operation = valuePath.getGet();
+ }
+ if (operation == null) {
+ continue;
+ }
+ String apiTag = null;
+ for (Tag tag : tags) {
+ if (StringUtils.equals(tag.getName(), operation.getTags().get(0))) {
+ apiTag = tag.getDescription().replaceAll("\\s", "");
+ }
+ }
+ if (apiTag == null) {
+ continue;
+ }
+ apis.add(new SystemApiDTO.ApiDTO(RegexUtil.replacePathParams(keyPath, "*"), operation.getSummary(), apiTag));
+ }
+ SystemApiDTO systemApiDTO = new SystemApiDTO();
+ systemApiDTO.setSystemTag(request.getContextPath());
+ systemApiDTO.setApis(apis);
+ return systemApiDTO;
+ }
+
+ @Override
+ public Map getApi(List apiTypes) {
+ Map apiDocMap = new HashMap<>();
+ List