diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiCustomFolderController.java b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiCustomFolderController.java index 052995ed..aa8c4dd6 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiCustomFolderController.java +++ b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiCustomFolderController.java @@ -1,8 +1,10 @@ package com.zyplayer.doc.api.controller; +import com.zyplayer.doc.core.annotation.AuthMan; import com.zyplayer.doc.core.json.DocResponseJson; import com.zyplayer.doc.core.json.ResponseJson; +import com.zyplayer.doc.data.repository.manage.entity.ApiCustomFolder; import com.zyplayer.doc.data.service.manage.ApiCustomFolderService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; @@ -19,6 +21,7 @@ import javax.annotation.Resource; * @author 暮光:城中城 * @since 2021-12-22 */ +@AuthMan @Controller @RequestMapping("/api-custom-folder") public class ApiCustomFolderController { @@ -27,15 +30,18 @@ public class ApiCustomFolderController { ApiCustomFolderService apiCustomFolderService; /** - * 获取所有的文档地址 + * 1. 新增文件夹 + * 2. 修改文件夹名称说明等 + * 3. 修改父文件夹 * * @return 文档内容 * @author 暮光:城中城 - * @since 2021年10月16日 + * @since 2021年12月22日 */ @ResponseBody @PostMapping(value = "/add") - public ResponseJson add(Long docId, Long parentFolderId) { + public ResponseJson add(ApiCustomFolder apiCustomFolder) { + apiCustomFolderService.addFolder(apiCustomFolder); return DocResponseJson.ok(); } } diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiCustomRequestController.java b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiCustomRequestController.java index 064ddaea..c7020350 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiCustomRequestController.java +++ b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiCustomRequestController.java @@ -1,8 +1,16 @@ package com.zyplayer.doc.api.controller; +import com.zyplayer.doc.core.json.DocResponseJson; +import com.zyplayer.doc.core.json.ResponseJson; +import com.zyplayer.doc.data.repository.manage.entity.ApiCustomRequest; +import com.zyplayer.doc.data.service.manage.ApiCustomRequestService; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; /** *

@@ -13,7 +21,25 @@ import org.springframework.web.bind.annotation.RequestMapping; * @since 2021-12-22 */ @Controller -@RequestMapping("/api-custom") +@RequestMapping("/api-custom-request") public class ApiCustomRequestController { - + + @Resource + ApiCustomRequestService apiCustomRequestService; + + /** + * 1. 新增接口 + * 2. 修改接口名等 + * 3. 修改父文件夹 + * + * @return 文档内容 + * @author 暮光:城中城 + * @since 2021年12月22日 + */ + @ResponseBody + @PostMapping(value = "/add") + public ResponseJson add(ApiCustomRequest apiCustomRequest) { + apiCustomRequestService.addRequest(apiCustomRequest); + return DocResponseJson.ok(); + } } diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiDocAuthController.java b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiDocAuthController.java index 519b41ea..865c00cb 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiDocAuthController.java +++ b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiDocAuthController.java @@ -1,7 +1,6 @@ package com.zyplayer.doc.api.controller; import com.zyplayer.doc.api.controller.vo.DocUserAuthVo; -import com.zyplayer.doc.api.service.ApiDocAuthJudgeService; import com.zyplayer.doc.core.annotation.AuthMan; import com.zyplayer.doc.core.json.DocResponseJson; import com.zyplayer.doc.core.json.ResponseJson; @@ -11,6 +10,7 @@ import com.zyplayer.doc.data.repository.manage.entity.*; import com.zyplayer.doc.data.repository.support.consts.ApiAuthType; import com.zyplayer.doc.data.repository.support.consts.DocSysModuleType; import com.zyplayer.doc.data.repository.support.consts.DocSysType; +import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService; import com.zyplayer.doc.data.service.manage.ApiDocService; import com.zyplayer.doc.data.service.manage.AuthInfoService; import com.zyplayer.doc.data.service.manage.UserAuthService; diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiDocumentController.java b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiDocumentController.java index 84feedc5..6b1a0f7c 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiDocumentController.java +++ b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiDocumentController.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zyplayer.doc.api.framework.utils.SwaggerDocUtil; -import com.zyplayer.doc.api.service.ApiDocAuthJudgeService; import com.zyplayer.doc.api.service.SwaggerHttpRequestService; import com.zyplayer.doc.core.annotation.AuthMan; import com.zyplayer.doc.core.json.DocResponseJson; @@ -16,6 +15,7 @@ import com.zyplayer.doc.data.repository.manage.entity.ApiDoc; import com.zyplayer.doc.data.repository.manage.vo.ApiCustomVo; import com.zyplayer.doc.data.repository.manage.vo.ApiDocVo; import com.zyplayer.doc.data.repository.support.consts.ApiAuthType; +import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService; import com.zyplayer.doc.data.service.manage.ApiCustomRequestService; import com.zyplayer.doc.data.service.manage.ApiDocService; import org.apache.commons.lang.StringUtils; @@ -221,7 +221,7 @@ public class ApiDocumentController { return DocResponseJson.ok(apiDoc.getJsonContent()); } if (Objects.equals(apiDoc.getDocType(), 5)) { - List customVoList = apiCustomRequestService.buildCustomApiList(apiDoc.getId()); + List customVoList = apiCustomRequestService.buildCustomApiList(apiDoc); return DocResponseJson.ok(customVoList); } return DocResponseJson.warn("暂不支持的文档类型"); diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiGlobalParamController.java b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiGlobalParamController.java index d79c4486..30c25ecc 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiGlobalParamController.java +++ b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiGlobalParamController.java @@ -1,7 +1,6 @@ package com.zyplayer.doc.api.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.zyplayer.doc.api.service.ApiDocAuthJudgeService; import com.zyplayer.doc.core.annotation.AuthMan; import com.zyplayer.doc.core.json.DocResponseJson; import com.zyplayer.doc.core.json.ResponseJson; @@ -9,6 +8,7 @@ import com.zyplayer.doc.data.config.security.DocUserDetails; import com.zyplayer.doc.data.config.security.DocUserUtil; import com.zyplayer.doc.data.repository.manage.entity.ApiDoc; import com.zyplayer.doc.data.repository.manage.entity.ApiGlobalParam; +import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService; import com.zyplayer.doc.data.service.manage.ApiGlobalParamService; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiPoxyRequestController.java b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiPoxyRequestController.java index 4c7355c7..67d2c8d1 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiPoxyRequestController.java +++ b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/ApiPoxyRequestController.java @@ -6,6 +6,8 @@ import com.zyplayer.doc.core.json.ResponseJson; import com.zyplayer.doc.api.controller.param.ProxyRequestParam; import com.zyplayer.doc.api.controller.vo.ProxyRequestResultVo; import com.zyplayer.doc.api.service.SwaggerHttpRequestService; +import com.zyplayer.doc.data.repository.manage.entity.ApiCustomRequest; +import com.zyplayer.doc.data.service.manage.ApiCustomRequestService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PostMapping; @@ -32,6 +34,8 @@ import java.util.Map; public class ApiPoxyRequestController { private static Logger logger = LoggerFactory.getLogger(ApiPoxyRequestController.class); + @Resource + ApiCustomRequestService apiCustomRequestService; @Resource private SwaggerHttpRequestService swaggerHttpRequestService; @@ -45,6 +49,18 @@ public class ApiPoxyRequestController { @ResponseBody @PostMapping(value = "/request") public ResponseJson request(HttpServletRequest request, ProxyRequestParam requestParam) { + // 自建接口时保存信息 + if (requestParam.getCustomRequestId() != null) { + ApiCustomRequest apiCustomRequest = new ApiCustomRequest(); + apiCustomRequest.setId(requestParam.getCustomRequestId()); + apiCustomRequest.setDocId(requestParam.getDocId()); + apiCustomRequest.setApiUrl(requestParam.getUrl()); + apiCustomRequest.setFormData(requestParam.getFormParam()); + apiCustomRequest.setBodyData(requestParam.getBodyParam()); + apiCustomRequest.setHeaderData(requestParam.getHeaderParam()); + apiCustomRequest.setCookieData(requestParam.getCookieParam()); + apiCustomRequestService.addRequest(apiCustomRequest); + } ProxyRequestResultVo requestResult = swaggerHttpRequestService.proxyRequest(request, requestParam); return DocResponseJson.ok(requestResult); } diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/param/ProxyRequestParam.java b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/param/ProxyRequestParam.java index 7bd35410..fd47b90c 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/param/ProxyRequestParam.java +++ b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/controller/param/ProxyRequestParam.java @@ -11,6 +11,8 @@ import java.util.List; * @since 2021-11-04 */ public class ProxyRequestParam { + private Long docId; + private Long customRequestId; private String url; private String host; private String method; @@ -108,4 +110,20 @@ public class ProxyRequestParam { public void setHost(String host) { this.host = host; } + + public Long getCustomRequestId() { + return customRequestId; + } + + public void setCustomRequestId(Long customRequestId) { + this.customRequestId = customRequestId; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } } diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/entity/ApiCustomRequest.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/entity/ApiCustomRequest.java index 5f612d44..b7e81203 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/entity/ApiCustomRequest.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/entity/ApiCustomRequest.java @@ -40,6 +40,11 @@ public class ApiCustomRequest implements Serializable { */ private String apiName; + /** + * 请求方式:get、head、post、put、patch、delete、options、trace + */ + private String method; + /** * 接口url */ @@ -195,4 +200,12 @@ public class ApiCustomRequest implements Serializable { ", yn=" + yn + "}"; } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } } diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/vo/ApiCustomDocVo.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/vo/ApiCustomDocVo.java index 69f5cbfd..28e7473c 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/vo/ApiCustomDocVo.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/vo/ApiCustomDocVo.java @@ -17,6 +17,11 @@ public class ApiCustomDocVo implements Serializable { */ private String apiName; + /** + * 请求方式:get、head、post、put、patch、delete、options、trace + */ + private String method; + /** * 接口url */ @@ -89,4 +94,12 @@ public class ApiCustomDocVo implements Serializable { public void setCookieData(String cookieData) { this.cookieData = cookieData; } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } } diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/service/ApiDocAuthJudgeService.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/common/ApiDocAuthJudgeService.java similarity index 88% rename from zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/service/ApiDocAuthJudgeService.java rename to zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/common/ApiDocAuthJudgeService.java index e15adbf5..bb84f9a7 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/service/ApiDocAuthJudgeService.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/common/ApiDocAuthJudgeService.java @@ -1,5 +1,6 @@ -package com.zyplayer.doc.api.service; +package com.zyplayer.doc.data.service.common; +import com.zyplayer.doc.core.exception.ConfirmException; import com.zyplayer.doc.data.config.security.DocUserDetails; import com.zyplayer.doc.data.config.security.DocUserUtil; import com.zyplayer.doc.data.repository.manage.entity.ApiDoc; @@ -66,6 +67,19 @@ public class ApiDocAuthJudgeService { return userModuleAuthList.stream().anyMatch(auth -> Objects.equals(auth.getAuthId(), authInfo.getId())); } + /** + * 判断当前用户是否有查看权限 + * + * @author 暮光:城中城 + * @since 2021-12-12 + */ + public void judgeDevelopAndThrow(Long docId) { + ApiDoc apiDoc = apiDocService.getById(docId); + if (!haveDevelopAuth(apiDoc)) { + throw new ConfirmException("没有此文档的开发权限"); + } + } + /** * 判断当前用户是否有查看权限 * diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/ApiCustomFolderService.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/ApiCustomFolderService.java index 1bf7a4b0..ee0a4a77 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/ApiCustomFolderService.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/ApiCustomFolderService.java @@ -2,6 +2,7 @@ package com.zyplayer.doc.data.service.manage; import com.zyplayer.doc.data.repository.manage.entity.ApiCustomFolder; import com.baomidou.mybatisplus.extension.service.IService; +import com.zyplayer.doc.data.repository.manage.entity.ApiCustomRequest; /** *

@@ -12,5 +13,12 @@ import com.baomidou.mybatisplus.extension.service.IService; * @since 2021-12-22 */ public interface ApiCustomFolderService extends IService { - + + /** + * 增加文件夹 + * + * @author 暮光:城中城 + * @since 2021-12-22 + */ + void addFolder(ApiCustomFolder apiCustomFolder); } diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/ApiCustomRequestService.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/ApiCustomRequestService.java index fd5a8513..d562e29c 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/ApiCustomRequestService.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/ApiCustomRequestService.java @@ -2,6 +2,8 @@ package com.zyplayer.doc.data.service.manage; import com.zyplayer.doc.data.repository.manage.entity.ApiCustomRequest; import com.baomidou.mybatisplus.extension.service.IService; +import com.zyplayer.doc.data.repository.manage.entity.ApiDoc; +import com.zyplayer.doc.data.repository.manage.vo.ApiCustomDocVo; import com.zyplayer.doc.data.repository.manage.vo.ApiCustomVo; import java.util.List; @@ -22,5 +24,13 @@ public interface ApiCustomRequestService extends IService { * @author 暮光:城中城 * @since 2021-12-22 */ - List buildCustomApiList(Long docId); + List buildCustomApiList(ApiDoc apiDoc); + + /** + * 增加接口 + * + * @author 暮光:城中城 + * @since 2021-12-22 + */ + void addRequest(ApiCustomRequest apiCustomRequest); } diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiCustomFolderServiceImpl.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiCustomFolderServiceImpl.java index 993e4def..4987613a 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiCustomFolderServiceImpl.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiCustomFolderServiceImpl.java @@ -1,11 +1,17 @@ package com.zyplayer.doc.data.service.manage.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zyplayer.doc.data.config.security.DocUserDetails; +import com.zyplayer.doc.data.config.security.DocUserUtil; import com.zyplayer.doc.data.repository.manage.entity.ApiCustomFolder; import com.zyplayer.doc.data.repository.manage.mapper.ApiCustomFolderMapper; +import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService; import com.zyplayer.doc.data.service.manage.ApiCustomFolderService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.util.Date; + /** *

* 自建接口文档文件夹 服务实现类 @@ -16,5 +22,24 @@ import org.springframework.stereotype.Service; */ @Service public class ApiCustomFolderServiceImpl extends ServiceImpl implements ApiCustomFolderService { - + + @Resource + ApiDocAuthJudgeService apiDocAuthJudgeService; + + @Override + public void addFolder(ApiCustomFolder apiCustomFolder) { + apiDocAuthJudgeService.judgeDevelopAndThrow(apiCustomFolder.getDocId()); + DocUserDetails currentUser = DocUserUtil.getCurrentUser(); + if (apiCustomFolder.getId() == null) { + apiCustomFolder.setYn(1); + apiCustomFolder.setCreateTime(new Date()); + apiCustomFolder.setCreateUserId(currentUser.getUserId()); + apiCustomFolder.setCreateUserName(currentUser.getUsername()); + } else { + apiCustomFolder.setCreateTime(null); + apiCustomFolder.setCreateUserId(null); + apiCustomFolder.setCreateUserName(null); + } + this.saveOrUpdate(apiCustomFolder); + } } diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiCustomRequestServiceImpl.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiCustomRequestServiceImpl.java index 355aa143..a030fbf3 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiCustomRequestServiceImpl.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiCustomRequestServiceImpl.java @@ -2,21 +2,23 @@ package com.zyplayer.doc.data.service.manage.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zyplayer.doc.data.config.security.DocUserDetails; +import com.zyplayer.doc.data.config.security.DocUserUtil; import com.zyplayer.doc.data.repository.manage.entity.ApiCustomFolder; import com.zyplayer.doc.data.repository.manage.entity.ApiCustomRequest; +import com.zyplayer.doc.data.repository.manage.entity.ApiDoc; import com.zyplayer.doc.data.repository.manage.mapper.ApiCustomRequestMapper; import com.zyplayer.doc.data.repository.manage.vo.ApiCustomDocVo; import com.zyplayer.doc.data.repository.manage.vo.ApiCustomVo; +import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService; import com.zyplayer.doc.data.service.manage.ApiCustomFolderService; import com.zyplayer.doc.data.service.manage.ApiCustomRequestService; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -30,30 +32,58 @@ import java.util.stream.Collectors; @Service public class ApiCustomRequestServiceImpl extends ServiceImpl implements ApiCustomRequestService { + @Resource + ApiDocAuthJudgeService apiDocAuthJudgeService; @Resource ApiCustomRequestService apiCustomRequestService; @Resource ApiCustomFolderService apiCustomFolderService; @Override - public List buildCustomApiList(Long docId) { + public List buildCustomApiList(ApiDoc apiDoc) { // 查询api列表 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("doc_id", docId); + wrapper.eq("doc_id", apiDoc.getId()); wrapper.eq("yn", 1); List apiCustomList = apiCustomRequestService.list(wrapper); - Map> apiMap = apiCustomList.stream().collect(Collectors.groupingBy(ApiCustomRequest::getFolderId)); + Map> apiMap = apiCustomList.stream() + .peek(item -> item.setFolderId(Optional.ofNullable(item.getFolderId()).orElse(0L))) + .collect(Collectors.groupingBy(ApiCustomRequest::getFolderId)); // 查询分组列表 QueryWrapper groupWrapper = new QueryWrapper<>(); - groupWrapper.eq("doc_id", docId); + groupWrapper.eq("doc_id", apiDoc.getId()); groupWrapper.eq("yn", 1); List apiCustomGroupList = apiCustomFolderService.list(groupWrapper); - Map> apiGroupMap = apiCustomGroupList.stream().collect(Collectors.groupingBy(ApiCustomFolder::getParentFolderId)); - List apiCustomGroups = apiGroupMap.get(null); - if (CollectionUtils.isEmpty(apiCustomGroups)) { - return Collections.emptyList(); + Map> apiGroupMap = apiCustomGroupList.stream() + .peek(item -> item.setParentFolderId(Optional.ofNullable(item.getParentFolderId()).orElse(0L))) + .collect(Collectors.groupingBy(ApiCustomFolder::getParentFolderId)); + List apiCustomVoList = new LinkedList<>(); + List apis = this.buildApiCustomDocVo(apiMap.get(0L)); + List customGroupChildren = this.getCustomGroupChildren(apiGroupMap.get(0L), apiGroupMap, apiMap); + // 组装结果对象 + ApiCustomVo apiCustomVo = new ApiCustomVo(); + apiCustomVo.setChildren(customGroupChildren); + apiCustomVo.setName(apiDoc.getName()); + apiCustomVo.setApis(apis); + apiCustomVoList.add(apiCustomVo); + return apiCustomVoList; + } + + @Override + public void addRequest(ApiCustomRequest apiCustomRequest) { + apiDocAuthJudgeService.judgeDevelopAndThrow(apiCustomRequest.getDocId()); + DocUserDetails currentUser = DocUserUtil.getCurrentUser(); + if (apiCustomRequest.getId() == null) { + apiCustomRequest.setYn(1); + apiCustomRequest.setCreateTime(new Date()); + apiCustomRequest.setCreateUserId(currentUser.getUserId()); + apiCustomRequest.setCreateUserName(currentUser.getUsername()); + } else { + apiCustomRequest.setCreateTime(null); + apiCustomRequest.setCreateUserId(null); + apiCustomRequest.setCreateUserName(null); } - return this.getCustomGroupChildren(apiCustomGroups, apiGroupMap, apiMap); + this.saveOrUpdate(apiCustomRequest); } /** @@ -71,26 +101,32 @@ public class ApiCustomRequestServiceImpl extends ServiceImpl apiCustomList = apiMap.get(customGroup.getId()); List children = apiGroupMap.get(customGroup.getId()); List customGroupChildren = this.getCustomGroupChildren(children, apiGroupMap, apiMap); + List apis = this.buildApiCustomDocVo(apiCustomList); ApiCustomVo apiCustomVo = new ApiCustomVo(); apiCustomVo.setName(customGroup.getFolderName()); apiCustomVo.setDesc(customGroup.getFolderDesc()); apiCustomVo.setChildren(customGroupChildren); - if (CollectionUtils.isNotEmpty(apiCustomList)) { - List apis = new LinkedList<>(); - for (ApiCustomRequest apiCustom : apiCustomList) { - ApiCustomDocVo apiCustomDocVo = new ApiCustomDocVo(); - apiCustomDocVo.setApiUrl(apiCustom.getApiUrl()); - apiCustomDocVo.setApiName(apiCustom.getApiName()); - apiCustomDocVo.setBodyData(apiCustom.getBodyData()); - apiCustomDocVo.setCookieData(apiCustom.getCookieData()); - apiCustomDocVo.setFormData(apiCustom.getFormData()); - apiCustomDocVo.setHeaderData(apiCustom.getHeaderData()); - apis.add(apiCustomDocVo); - } - apiCustomVo.setApis(apis); - } + apiCustomVo.setApis(apis); apiCustomVoList.add(apiCustomVo); } return apiCustomVoList; } + + private List buildApiCustomDocVo(List apiCustomList) { + List apis = new LinkedList<>(); + if (CollectionUtils.isNotEmpty(apiCustomList)) { + for (ApiCustomRequest apiCustom : apiCustomList) { + ApiCustomDocVo apiCustomDocVo = new ApiCustomDocVo(); + apiCustomDocVo.setApiUrl(apiCustom.getApiUrl()); + apiCustomDocVo.setMethod(apiCustom.getMethod()); + apiCustomDocVo.setApiName(apiCustom.getApiName()); + apiCustomDocVo.setBodyData(apiCustom.getBodyData()); + apiCustomDocVo.setCookieData(apiCustom.getCookieData()); + apiCustomDocVo.setFormData(apiCustom.getFormData()); + apiCustomDocVo.setHeaderData(apiCustom.getHeaderData()); + apis.add(apiCustomDocVo); + } + } + return apis; + } } diff --git a/zyplayer-doc-manage/src/main/resources/sql/增量更新语句.1.1.1.sql b/zyplayer-doc-manage/src/main/resources/sql/增量更新语句.1.1.1.sql index 2cac5915..bc05a045 100644 --- a/zyplayer-doc-manage/src/main/resources/sql/增量更新语句.1.1.1.sql +++ b/zyplayer-doc-manage/src/main/resources/sql/增量更新语句.1.1.1.sql @@ -15,6 +15,7 @@ CREATE TABLE `api_custom_request` ( `doc_id` bigint(20) DEFAULT NULL COMMENT 'api_doc主键ID', `folder_id` bigint(20) DEFAULT NULL COMMENT '文件夹ID', `api_name` varchar(250) DEFAULT NULL COMMENT '接口名称', + `method` varchar(20) DEFAULT NULL COMMENT '请求方式:get、head、post、put、patch、delete、options、trace', `api_url` text DEFAULT NULL COMMENT '接口url', `form_data` text DEFAULT NULL COMMENT 'form参数', `body_data` text DEFAULT NULL COMMENT 'body参数', @@ -28,6 +29,7 @@ CREATE TABLE `api_custom_request` ( KEY `idx_doc_id` (`doc_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='自建接口文档'; + DROP TABLE IF EXISTS `api_custom_folder`; CREATE TABLE `api_custom_folder` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID', diff --git a/zyplayer-doc-ui/api-ui/src/assets/core/CustomRequestTreeAnalysis.js b/zyplayer-doc-ui/api-ui/src/assets/core/CustomRequestTreeAnalysis.js new file mode 100644 index 00000000..10509928 --- /dev/null +++ b/zyplayer-doc-ui/api-ui/src/assets/core/CustomRequestTreeAnalysis.js @@ -0,0 +1,78 @@ +const methodArray = ["get", "head", "post", "put", "patch", "delete", "options", "trace"]; + + +/** + * 按tag分组获取左侧菜单目录树 + * @param customRequest 原始文档信息 + * @param tagPathMap 分组信息{分组名: {url: {...接口信息, path: '', url: '', method: ''}}} + * @param keywords 过滤关键字 + * @param metaInfo 接口元信息,点击时放入URL的参数 + */ +export function getTreeDataForTag(customRequest, keywords, metaInfo) { + let firstChild = customRequest[0]; + let treeData = getTreeDataChildren(firstChild, keywords, metaInfo, 1); + return [ + { + key: 'main', + title: firstChild.name || '自建API接口文档', + children: treeData + } + ]; +} + +function getTreeDataChildren(customRequest, keywords, metaInfo, treeIndex) { + let treeData = []; + if (!customRequest) { + return treeData; + } + let indexFolder = 1; + let indexApi = 1; + if (customRequest.children && customRequest.children.length > 0) { + customRequest.children.forEach(item => { + let tempTreeId = treeIndex + "_" + indexFolder + "_" + indexApi; + let treeChildren = getTreeDataChildren(item, keywords, metaInfo, tempTreeId); + treeData.push({title: item.name, key: tempTreeId, children: treeChildren}); + indexApi++; + }); + } + if (customRequest.apis && customRequest.apis.length > 0) { + customRequest.apis.forEach(item => { + let tempTreeId = treeIndex + "_" + indexFolder + "_" + indexApi; + treeData.push({ + title: item.apiName, + key: tempTreeId, + isLeaf: true, + method: item.method, + query: { + ...metaInfo, + path: item.apiUrl, + method: item.method, + } + }); + indexApi++; + }); + } + indexFolder++; + return treeData; +} + +/** + * 搜索接口是否包含某关键字,将匹配:URL、path、method、summary、description、tags 属性 + * @param url 接口URL + * @param methodNode 接口基本信息 + * @param keywords 关键字 + * @returns {*|boolean} 是否包含 + */ +function searchInPathMethods(url, methodNode, keywords) { + if (!keywords || !url) { + return true; + } + url = url.toLowerCase(); + keywords = keywords.toLowerCase(); + // 路径中有就不用再去找了 + if (url.indexOf(keywords) >= 0) { + return true; + } + let searchData = methodNode.path + methodNode.method + methodNode.summary + methodNode.description + methodNode.tags; + return (searchData && searchData.toLowerCase().indexOf(keywords) >= 0); +} diff --git a/zyplayer-doc-ui/api-ui/src/components/layouts/MenuLayout.vue b/zyplayer-doc-ui/api-ui/src/components/layouts/MenuLayout.vue index b95a6ca1..258f0f7f 100644 --- a/zyplayer-doc-ui/api-ui/src/components/layouts/MenuLayout.vue +++ b/zyplayer-doc-ui/api-ui/src/components/layouts/MenuLayout.vue @@ -15,6 +15,7 @@ @@ -30,6 +31,7 @@ import {zyplayerApi} from '../../api' import DocTreeSwagger from './doc-tree/Swagger.vue' import DocTreeOpenApi from './doc-tree/OpenApi.vue' + import CustomRequest from './doc-tree/CustomRequest.vue' export default { props: { @@ -38,7 +40,7 @@ default: false }, }, - components: {MenuChildrenLayout, DocTreeSwagger, DocTreeOpenApi}, + components: {MenuChildrenLayout, DocTreeSwagger, DocTreeOpenApi, CustomRequest}, setup(props) { const store = useStore(); const route = useRoute(); @@ -78,6 +80,7 @@ }; let swaggerRef = ref(); let openApiRef = ref(); + let customRequestRef = ref(); const loadDoc = async () => { treeDataLoading.value = true; docChoice.value = docResourceList.value.find(item => item.id === docChoiceId.value); @@ -101,6 +104,10 @@ if (openApiRef.value) { openApiRef.value.loadDoc(docChoiceId.value, searchKeywords.value, loadDocCallback); } + } else if (docChoice.value.docType === 5) { + if (customRequestRef.value) { + customRequestRef.value.loadDoc(docChoiceId.value, searchKeywords.value, loadDocCallback); + } } zyplayerApi.docApiGlobalParamList({docId: docChoiceId.value}).then(res => { let docGlobalParam = res.data || []; @@ -121,6 +128,10 @@ if (openApiRef.value) { openApiRef.value.loadTreeData(searchKeywords.value); } + } else if (docChoice.value.docType === 5) { + if (customRequestRef.value) { + customRequestRef.value.loadTreeData(searchKeywords.value); + } } }; watch(store.getters.getDocChangedNum, () => { @@ -152,6 +163,7 @@ searchKeywords, swaggerRef, openApiRef, + customRequestRef, docChoice, searchDoc, docChoiceChange, diff --git a/zyplayer-doc-ui/api-ui/src/components/layouts/PageLayout.vue b/zyplayer-doc-ui/api-ui/src/components/layouts/PageLayout.vue index c6ba0f2f..4dedc789 100644 --- a/zyplayer-doc-ui/api-ui/src/components/layouts/PageLayout.vue +++ b/zyplayer-doc-ui/api-ui/src/components/layouts/PageLayout.vue @@ -85,7 +85,7 @@ } }, addPageTab() { - this.$router.push({path: '/api/request', query: {id: this.apiRequestIndex++}}); + this.$router.push({path: '/custom/request', query: {id: this.apiRequestIndex++}}); }, removePageTab(key) { if (this.pageList.length === 1) { diff --git a/zyplayer-doc-ui/api-ui/src/components/layouts/doc-tree/CustomRequest.vue b/zyplayer-doc-ui/api-ui/src/components/layouts/doc-tree/CustomRequest.vue new file mode 100644 index 00000000..29f423ad --- /dev/null +++ b/zyplayer-doc-ui/api-ui/src/components/layouts/doc-tree/CustomRequest.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/zyplayer-doc-ui/api-ui/src/routes.js b/zyplayer-doc-ui/api-ui/src/routes.js index 5eaa9d7c..e4f79dec 100644 --- a/zyplayer-doc-ui/api-ui/src/routes.js +++ b/zyplayer-doc-ui/api-ui/src/routes.js @@ -90,7 +90,7 @@ let routers = [ ] }, { - path: '/api', + path: '/custom', name: 'API请求', meta: { hidden: true, @@ -98,9 +98,9 @@ let routers = [ component: EmptyKeepAliveLayout, children: [ { - path: '/api/request', + path: '/custom/request', name: '接口请求', - component: () => import('./views/apiRequest/ApiRequest.vue') + component: () => import('./views/customRequest/ApiRequest.vue') }, ] }, diff --git a/zyplayer-doc-ui/api-ui/src/store/index.js b/zyplayer-doc-ui/api-ui/src/store/index.js index 9334d025..868b6089 100644 --- a/zyplayer-doc-ui/api-ui/src/store/index.js +++ b/zyplayer-doc-ui/api-ui/src/store/index.js @@ -35,6 +35,9 @@ export default createStore({ openApiUrlMethodMap: {}, // 方法统计{post: 10, total: 20} openApiMethodStatistic: {}, + + // 自建API原始文档 + customRequestDoc: {}, } }, getters: { @@ -99,6 +102,10 @@ export default createStore({ setOpenApiMethodStatistic(state, openApiMethodStatistic) { state.openApiMethodStatistic = openApiMethodStatistic; }, + // openApi + setCustomRequestDoc(state, customRequestDoc) { + state.customRequestDoc = customRequestDoc; + }, addTableName(state, item) { let sameObj = Object.assign({}, state.pageTabNameMap); sameObj[item.key] = item.val; diff --git a/zyplayer-doc-ui/api-ui/src/views/apiRequest/ApiRequest.vue b/zyplayer-doc-ui/api-ui/src/views/customRequest/ApiRequest.vue similarity index 100% rename from zyplayer-doc-ui/api-ui/src/views/apiRequest/ApiRequest.vue rename to zyplayer-doc-ui/api-ui/src/views/customRequest/ApiRequest.vue diff --git a/zyplayer-doc-ui/api-ui/src/views/apiRequest/ApiRequestResult.vue b/zyplayer-doc-ui/api-ui/src/views/customRequest/ApiRequestResult.vue similarity index 100% rename from zyplayer-doc-ui/api-ui/src/views/apiRequest/ApiRequestResult.vue rename to zyplayer-doc-ui/api-ui/src/views/customRequest/ApiRequestResult.vue diff --git a/zyplayer-doc-ui/api-ui/src/views/manage/DocManageList.vue b/zyplayer-doc-ui/api-ui/src/views/manage/DocManageList.vue index 6d2cf001..51bc2d5c 100644 --- a/zyplayer-doc-ui/api-ui/src/views/manage/DocManageList.vue +++ b/zyplayer-doc-ui/api-ui/src/views/manage/DocManageList.vue @@ -50,7 +50,9 @@