From e2a8c46afb0fb6a95902937013d61c0828b88eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9A=AE=E5=85=89=EF=BC=9A=E5=9F=8E=E4=B8=AD=E5=9F=8E?= <806783409@qq.com> Date: Wed, 15 Dec 2021 23:20:17 +0800 Subject: [PATCH] =?UTF-8?q?#I4MKKW=20api=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=94=AF=E6=8C=81=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=EF=BC=8C=E5=85=A8=E5=B1=80=E5=8F=82=E6=95=B0=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ApiGlobalParamController.java | 23 +++++++-- .../controller/ApiPoxyRequestController.java | 3 ++ .../service/SwaggerHttpRequestService.java | 33 +++++++++++++ .../impl/ApiGlobalParamServiceImpl.java | 8 +++- zyplayer-doc-ui/api-ui/.env.development | 2 +- .../src/components/layouts/MenuLayout.vue | 20 +++++++- .../components/layouts/doc-tree/OpenApi.vue | 14 +++--- .../components/layouts/doc-tree/Swagger.vue | 13 ++--- .../src/components/params/ParamTable.vue | 12 ++--- .../src/components/share/MenuLayout.vue | 11 ++++- .../src/components/share/doc-tree/OpenApi.vue | 14 +++--- .../src/components/share/doc-tree/Swagger.vue | 11 +++-- zyplayer-doc-ui/api-ui/src/store/index.js | 15 ++++++ .../manage/components/EditGlobalParam.vue | 2 +- .../src/views/openapi/docView/DocDebugger.vue | 48 +++++++++++++------ .../src/views/swagger/docView/DocDebugger.vue | 38 +++++++++++---- 16 files changed, 206 insertions(+), 61 deletions(-) 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 7bf0748c..d79c4486 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,6 +1,7 @@ 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; @@ -37,6 +38,8 @@ public class ApiGlobalParamController { @Resource private ApiGlobalParamService apiGlobalParamService; + @Resource + ApiDocAuthJudgeService apiDocAuthJudgeService; /** * 获取所有的全局参数 @@ -49,6 +52,9 @@ public class ApiGlobalParamController { @PostMapping(value = "/list") public ResponseJson> list(Long docId) { Long docIdNew = Optional.ofNullable(docId).orElse(0L); + if (docIdNew > 0 && !apiDocAuthJudgeService.haveDevelopAuth(docIdNew)) { + return DocResponseJson.warn("没有此文档的查看权限"); + } DocUserDetails currentUser = DocUserUtil.getCurrentUser(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("yn", 1); @@ -71,6 +77,11 @@ public class ApiGlobalParamController { @PostMapping(value = "/update") public ResponseJson> update(ApiGlobalParam globalParam) { DocUserDetails currentUser = DocUserUtil.getCurrentUser(); + globalParam.setDocId(Optional.ofNullable(globalParam.getDocId()).orElse(0L)); + // 新的文档ID是否有权限 + if (globalParam.getDocId() > 0 && !apiDocAuthJudgeService.haveDevelopAuth(globalParam.getDocId())) { + return DocResponseJson.warn("没有此文档的查看权限"); + } if (globalParam.getId() == null) { globalParam.setYn(1); globalParam.setCreateTime(new Date()); @@ -78,11 +89,17 @@ public class ApiGlobalParamController { globalParam.setCreateUserName(currentUser.getUsername()); } else { ApiGlobalParam param = apiGlobalParamService.getById(globalParam.getId()); - if (param == null || !Objects.equals(param.getCreateUserId(), currentUser.getUserId())) { - return DocResponseJson.warn("目标全局参数不存在"); + if (param.getDocId() > 0) { + // 已有的文档ID是否有权限 + if (!apiDocAuthJudgeService.haveDevelopAuth(param.getDocId())) { + return DocResponseJson.warn("没有此文档的查看权限"); + } + } else { + if (!Objects.equals(param.getCreateUserId(), currentUser.getUserId())) { + return DocResponseJson.warn("目标全局参数不存在"); + } } } - globalParam.setDocId(Optional.ofNullable(globalParam.getDocId()).orElse(0L)); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("yn", 1); wrapper.eq("param_key", globalParam.getParamKey()); 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 dc508ede..4c7355c7 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 @@ -12,10 +12,13 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.Map; /** * 请求参数控制器 diff --git a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/service/SwaggerHttpRequestService.java b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/service/SwaggerHttpRequestService.java index 47fa728d..878f33e4 100644 --- a/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/service/SwaggerHttpRequestService.java +++ b/zyplayer-doc-api/src/main/java/com/zyplayer/doc/api/service/SwaggerHttpRequestService.java @@ -1,9 +1,12 @@ package com.zyplayer.doc.api.service; +import cn.hutool.core.io.resource.BytesResource; +import cn.hutool.core.io.resource.MultiResource; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.http.Method; +import com.zyplayer.doc.api.controller.ApiPoxyRequestController; import com.zyplayer.doc.api.controller.param.ProxyRequestParam; import com.zyplayer.doc.api.controller.vo.HttpCookieVo; import com.zyplayer.doc.api.controller.vo.HttpHeaderVo; @@ -16,12 +19,17 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; import javax.annotation.Resource; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.net.HttpCookie; import java.util.*; import java.util.stream.Collectors; @@ -35,6 +43,7 @@ import java.util.stream.Stream; */ @Service public class SwaggerHttpRequestService { + private static Logger logger = LoggerFactory.getLogger(SwaggerHttpRequestService.class); @Resource private ApiGlobalParamService apiGlobalParamService; @@ -153,6 +162,30 @@ public class SwaggerHttpRequestService { // 用户输入的参数 requestParam.getFormParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue())); requestParam.getFormEncodeParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue())); + // 文件参数 + if (request instanceof StandardMultipartHttpServletRequest) { + StandardMultipartHttpServletRequest multipartRequest = (StandardMultipartHttpServletRequest) request; + Iterator fileNames = multipartRequest.getFileNames(); + while (fileNames.hasNext()) { + String fileName = fileNames.next(); + String originKey = fileName.replace("_file_", ""); + List fileList = multipartRequest.getFiles(fileName); + try { + if (fileList.size() > 1) { + MultiResource multiResource = new MultiResource(); + for (MultipartFile file : fileList) { + multiResource.add(new BytesResource(file.getBytes(), file.getOriginalFilename())); + } + httpRequest.form(originKey, multiResource); + } else if (fileList.size() > 0) { + MultipartFile multipartFile = fileList.get(0); + httpRequest.form(originKey, multipartFile.getBytes(), multipartFile.getOriginalFilename()); + } + } catch (IOException e) { + logger.error("读取上传的文件失败", e); + } + } + } // cookie参数 Map cookieParam = new HashMap<>(); String headerCookie = headerParam.getOrDefault("Cookie", headerParam.get("cookie")); diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiGlobalParamServiceImpl.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiGlobalParamServiceImpl.java index a28495a0..2f249663 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiGlobalParamServiceImpl.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/ApiGlobalParamServiceImpl.java @@ -30,9 +30,13 @@ public class ApiGlobalParamServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("yn", 1); - queryWrapper.eq("doc_id", docIdNew); // 全局参数才按创建人来控制,文档的全局参数大家共用 - queryWrapper.eq(docIdNew == 0, "create_user_id", currentUser.getUserId()); + if (docIdNew == 0) { + queryWrapper.eq("create_user_id", currentUser.getUserId()); + } else { + queryWrapper.and(con -> con.or(or -> or.eq("doc_id", docIdNew)) + .or(or -> or.eq("create_user_id", currentUser.getUserId()))); + } return this.list(queryWrapper); } } diff --git a/zyplayer-doc-ui/api-ui/.env.development b/zyplayer-doc-ui/api-ui/.env.development index 4d516ca1..45732d00 100644 --- a/zyplayer-doc-ui/api-ui/.env.development +++ b/zyplayer-doc-ui/api-ui/.env.development @@ -1,7 +1,7 @@ VITE_APP_TITLE=API文档管理 本地切换环境改这个参数,可选值:dev、online -VITE_APP_ENV=online +VITE_APP_ENV=dev # 线上环境 VITE_APP_BASE_URL_ONLINE=http://doc.zyplayer.com/zyplayer-doc-manage 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 c8aab4ed..b95a6ca1 100644 --- a/zyplayer-doc-ui/api-ui/src/components/layouts/MenuLayout.vue +++ b/zyplayer-doc-ui/api-ui/src/components/layouts/MenuLayout.vue @@ -10,7 +10,7 @@ {{item.name}} - +