自建API接口开发

This commit is contained in:
暮光:城中城
2021-12-25 20:46:19 +08:00
parent 7ce74938e8
commit 208826df62
38 changed files with 507 additions and 47 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,113 @@
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;
import com.zyplayer.doc.data.repository.manage.entity.AuthInfo;
import com.zyplayer.doc.data.repository.manage.entity.UserAuth;
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.manage.ApiDocService;
import com.zyplayer.doc.data.service.manage.AuthInfoService;
import com.zyplayer.doc.data.service.manage.UserAuthService;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
/**
* 判断文档权限
*
* @author 暮光:城中城
* @since 2021-12-12
*/
@Service
public class ApiDocAuthJudgeService {
@Resource
UserAuthService userAuthService;
@Resource
AuthInfoService authInfoService;
@Resource
ApiDocService apiDocService;
/**
* 判断当前用户是否有管理员权限
*
* @author 暮光:城中城
* @since 2021-12-12
*/
public boolean haveManageAuth(Long docId) {
ApiDoc apiDoc = apiDocService.getById(docId);
return haveManageAuth(apiDoc);
}
/**
* 判断当前用户是否有管理员权限
*
* @author 暮光:城中城
* @since 2021-12-12
*/
public boolean haveManageAuth(ApiDoc apiDoc) {
if (apiDoc == null) {
return false;
}
// 创建者
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (Objects.equals(apiDoc.getCreateUserId(), currentUser.getUserId())) {
return true;
}
// 管理员
AuthInfo authInfo = authInfoService.getByCode(ApiAuthType.MANAGE.getCode());
List<UserAuth> userModuleAuthList = userAuthService.getUserModuleAuthList(currentUser.getUserId(), DocSysType.API.getType(), DocSysModuleType.Api.DOC.getType(), apiDoc.getId());
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("没有此文档的开发权限");
}
}
/**
* 判断当前用户是否有查看权限
*
* @author 暮光:城中城
* @since 2021-12-12
*/
public boolean haveDevelopAuth(Long docId) {
ApiDoc apiDoc = apiDocService.getById(docId);
return haveDevelopAuth(apiDoc);
}
/**
* 判断当前用户是否有查看权限
*
* @author 暮光:城中城
* @since 2021-12-12
*/
public boolean haveDevelopAuth(ApiDoc apiDoc) {
if (apiDoc == null) {
return false;
}
// 创建者
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (Objects.equals(apiDoc.getCreateUserId(), currentUser.getUserId())) {
return true;
}
// 开发人员,存在则说明肯定是管理员或开发人员
List<UserAuth> userModuleAuthList = userAuthService.getUserModuleAuthList(currentUser.getUserId(), DocSysType.API.getType(), DocSysModuleType.Api.DOC.getType(), apiDoc.getId());
return CollectionUtils.isNotEmpty(userModuleAuthList);
}
}

View File

@@ -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;
/**
* <p>
@@ -12,5 +13,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @since 2021-12-22
*/
public interface ApiCustomFolderService extends IService<ApiCustomFolder> {
/**
* 增加文件夹
*
* @author 暮光:城中城
* @since 2021-12-22
*/
void addFolder(ApiCustomFolder apiCustomFolder);
}

View File

@@ -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<ApiCustomRequest> {
* @author 暮光:城中城
* @since 2021-12-22
*/
List<ApiCustomVo> buildCustomApiList(Long docId);
List<ApiCustomVo> buildCustomApiList(ApiDoc apiDoc);
/**
* 增加接口
*
* @author 暮光:城中城
* @since 2021-12-22
*/
void addRequest(ApiCustomRequest apiCustomRequest);
}

View File

@@ -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;
/**
* <p>
* 自建接口文档文件夹 服务实现类
@@ -16,5 +22,24 @@ import org.springframework.stereotype.Service;
*/
@Service
public class ApiCustomFolderServiceImpl extends ServiceImpl<ApiCustomFolderMapper, ApiCustomFolder> 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);
}
}

View File

@@ -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<ApiCustomRequestMapper, ApiCustomRequest> implements ApiCustomRequestService {
@Resource
ApiDocAuthJudgeService apiDocAuthJudgeService;
@Resource
ApiCustomRequestService apiCustomRequestService;
@Resource
ApiCustomFolderService apiCustomFolderService;
@Override
public List<ApiCustomVo> buildCustomApiList(Long docId) {
public List<ApiCustomVo> buildCustomApiList(ApiDoc apiDoc) {
// 查询api列表
QueryWrapper<ApiCustomRequest> wrapper = new QueryWrapper<>();
wrapper.eq("doc_id", docId);
wrapper.eq("doc_id", apiDoc.getId());
wrapper.eq("yn", 1);
List<ApiCustomRequest> apiCustomList = apiCustomRequestService.list(wrapper);
Map<Long, List<ApiCustomRequest>> apiMap = apiCustomList.stream().collect(Collectors.groupingBy(ApiCustomRequest::getFolderId));
Map<Long, List<ApiCustomRequest>> apiMap = apiCustomList.stream()
.peek(item -> item.setFolderId(Optional.ofNullable(item.getFolderId()).orElse(0L)))
.collect(Collectors.groupingBy(ApiCustomRequest::getFolderId));
// 查询分组列表
QueryWrapper<ApiCustomFolder> groupWrapper = new QueryWrapper<>();
groupWrapper.eq("doc_id", docId);
groupWrapper.eq("doc_id", apiDoc.getId());
groupWrapper.eq("yn", 1);
List<ApiCustomFolder> apiCustomGroupList = apiCustomFolderService.list(groupWrapper);
Map<Long, List<ApiCustomFolder>> apiGroupMap = apiCustomGroupList.stream().collect(Collectors.groupingBy(ApiCustomFolder::getParentFolderId));
List<ApiCustomFolder> apiCustomGroups = apiGroupMap.get(null);
if (CollectionUtils.isEmpty(apiCustomGroups)) {
return Collections.emptyList();
Map<Long, List<ApiCustomFolder>> apiGroupMap = apiCustomGroupList.stream()
.peek(item -> item.setParentFolderId(Optional.ofNullable(item.getParentFolderId()).orElse(0L)))
.collect(Collectors.groupingBy(ApiCustomFolder::getParentFolderId));
List<ApiCustomVo> apiCustomVoList = new LinkedList<>();
List<ApiCustomDocVo> apis = this.buildApiCustomDocVo(apiMap.get(0L));
List<ApiCustomVo> 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<ApiCustomRequestMap
List<ApiCustomRequest> apiCustomList = apiMap.get(customGroup.getId());
List<ApiCustomFolder> children = apiGroupMap.get(customGroup.getId());
List<ApiCustomVo> customGroupChildren = this.getCustomGroupChildren(children, apiGroupMap, apiMap);
List<ApiCustomDocVo> apis = this.buildApiCustomDocVo(apiCustomList);
ApiCustomVo apiCustomVo = new ApiCustomVo();
apiCustomVo.setName(customGroup.getFolderName());
apiCustomVo.setDesc(customGroup.getFolderDesc());
apiCustomVo.setChildren(customGroupChildren);
if (CollectionUtils.isNotEmpty(apiCustomList)) {
List<ApiCustomDocVo> 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<ApiCustomDocVo> buildApiCustomDocVo(List<ApiCustomRequest> apiCustomList) {
List<ApiCustomDocVo> 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;
}
}