mxd 4 жил өмнө
parent
commit
5b121d9dae

+ 12 - 10
src/main/java/org/ssssssss/magicapi/config/MappingHandlerMapping.java

@@ -202,7 +202,7 @@ public class MappingHandlerMapping {
 	 * 检测是否允许修改
 	 */
 	public boolean checkGroup(Group group) {
-		Group oldGroup = groups.findNode((item) -> item.getId().equals(group.getId()));
+		Group oldGroup = groups.findTreeNode((item) -> item.getId().equals(group.getId())).getNode();
 		// 如果只改了名字,则不做任何操作
 		if (Objects.equals(oldGroup.getParentId(), group.getParentId()) &&
 				Objects.equals(oldGroup.getPath(), group.getPath())) {
@@ -215,7 +215,7 @@ public class MappingHandlerMapping {
 
 		// 判断是否有冲突
 		for (ApiInfo info : infos) {
-			String path = getRequestPath(newPath, info.getPath());
+			String path = concatPath(newPath, info.getPath());
 			String mappingKey = buildMappingKey(info.getMethod(), path);
 			if (mappings.containsKey(mappingKey)) {
 				return false;
@@ -235,10 +235,7 @@ public class MappingHandlerMapping {
 	/**
 	 * 删除分组
 	 */
-	public void deleteGroup(String groupId) {
-		// 找到下级所有分组
-		List<String> groupIds = groups.findNodes((item) -> item.getId().equals(groupId)).stream().map(Group::getId).collect(Collectors.toList());
-		groupIds.add(groupId);
+	public void deleteGroup(List<String> groupIds) {
 		// 找到对应的所有接口
 		List<ApiInfo> deleteInfos = apiInfos.stream().filter(info -> groupIds.contains(info.getGroupId())).collect(Collectors.toList());
 		for (ApiInfo info : deleteInfos) {
@@ -253,7 +250,7 @@ public class MappingHandlerMapping {
 	 */
 	public void updateGroup(Group group) {
 		loadGroup();    // 重新加载分组
-		Group oldGroup = groups.findNode((item) -> item.getId().equals(group.getId()));
+		Group oldGroup = groups.findTreeNode((item) -> item.getId().equals(group.getId())).getNode();
 		apiInfos.stream().filter(info -> Objects.equals(info.getGroupId(), oldGroup.getId())).forEach(info -> {
 			unregisterMapping(info.getId(), false);
 			info.setGroupId(group.getId());
@@ -313,7 +310,7 @@ public class MappingHandlerMapping {
 				if (!info.equals(oldInfo)) {
 					mappings.put(info.getId(), info);
 					mappings.put(newMappingKey, info);
-					if(delete){
+					if (delete) {
 						refreshCache(info);
 					}
 					logger.info("刷新接口:{},{}", info.getName(), newMappingKey);
@@ -342,7 +339,7 @@ public class MappingHandlerMapping {
 		}
 	}
 
-	private void refreshCache(ApiInfo info){
+	private void refreshCache(ApiInfo info) {
 		apiInfos.removeIf(i -> i.getId().equalsIgnoreCase(info.getId()));
 		apiInfos.add(info);
 	}
@@ -380,7 +377,12 @@ public class MappingHandlerMapping {
 	 * @param path    请求路径
 	 */
 	public String getRequestPath(String groupId, String path) {
-		path = groupServiceProvider.getFullPath(groupId) + "/" + path;
+		return concatPath(groupServiceProvider.getFullPath(groupId), path);
+
+	}
+
+	private String concatPath(String groupPath, String path) {
+		path = groupPath + "/" + path;
 		if (prefix != null) {
 			path = prefix + "/" + path;
 		}

+ 17 - 7
src/main/java/org/ssssssss/magicapi/controller/MagicGroupController.java

@@ -9,10 +9,12 @@ import org.ssssssss.magicapi.config.MagicConfiguration;
 import org.ssssssss.magicapi.interceptor.RequestInterceptor;
 import org.ssssssss.magicapi.model.Group;
 import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.model.TreeNode;
 import org.ssssssss.magicapi.provider.GroupServiceProvider;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class MagicGroupController extends MagicController {
 
@@ -35,15 +37,23 @@ public class MagicGroupController extends MagicController {
 			return new JsonBean<>(-10, "无权限执行删除方法");
 		}
 		try {
-			boolean success = configuration.getMagicApiService().deleteGroup(groupId);
-			if (success) {    //删除成功时取消注册
-				configuration.getMappingHandlerMapping().deleteGroup(groupId);
+			TreeNode<Group> treeNode = configuration.getGroupServiceProvider().apiGroupList().findTreeNode(group -> group.getId().equals(groupId));
+			if (treeNode == null) {
+				return new JsonBean<>(0, "分组不存在!");
 			}
-			success = this.groupServiceProvider.delete(groupId);
-			if(success){
-				configuration.getMappingHandlerMapping().loadGroup();
+			List<String> groupIds = treeNode.flat().stream().map(Group::getId).collect(Collectors.toList());
+			// 删除接口
+			boolean success = configuration.getMagicApiService().deleteGroup(groupIds);
+			if (success) {
+				// 取消注册
+				configuration.getMappingHandlerMapping().deleteGroup(groupIds);
+				// 删除分组
+				success = this.groupServiceProvider.delete(groupId);
+				if (success) {
+					// 重新加载分组
+					configuration.getMappingHandlerMapping().loadGroup();
+				}
 			}
-			// 删除分组
 			return new JsonBean<>(success);
 		} catch (Exception e) {
 			logger.error("删除分组出错", e);

+ 14 - 28
src/main/java/org/ssssssss/magicapi/model/TreeNode.java

@@ -33,22 +33,19 @@ public class TreeNode<T> {
 		this.children = children;
 	}
 
-	public List<T> findNodes(Function<T, Boolean> mapping) {
-		return findNodes(this.children, mapping);
-	}
 
-	public T findNode(Function<T, Boolean> mapping) {
-		return findNode(this.children, mapping);
+	public TreeNode<T> findTreeNode(Function<T, Boolean> mapping){
+		return findTreeNode(this.children, mapping);
 	}
 
-	private T findNode(List<TreeNode<T>> childs, Function<T, Boolean> mapping) {
-		for (TreeNode<T> item : childs) {
-			if (mapping.apply(item.node)) {
-				return item.node;
+	private TreeNode<T> findTreeNode(List<TreeNode<T>> childs, Function<T, Boolean> mapping) {
+		for (TreeNode<T> child : childs) {
+			if (mapping.apply(child.getNode())) {
+				return child;
 			}
-			T found = findNode(item.children, mapping);
-			if (found != null) {
-				return found;
+			TreeNode<T> node = findTreeNode(child.children, mapping);
+			if(node != null){
+				return node;
 			}
 		}
 		return null;
@@ -58,26 +55,15 @@ public class TreeNode<T> {
 		node.children.add(this);
 	}
 
-	private List<T> findNodes(List<TreeNode<T>> childs, Function<T, Boolean> mapping) {
-		List<T> nodes = new ArrayList<>();
-		childs.forEach(item -> {
-			if (mapping.apply(item.getNode())) {
-				nodes.add(item.getNode());
-			}
-			nodes.addAll(findNodes(item.children, mapping));
-		});
-		return nodes;
-	}
-
 	public List<T> flat() {
-		return flat(this.children);
+		return flat(this);
 	}
 
-	private List<T> flat(List<TreeNode<T>> childs) {
+	private List<T> flat(TreeNode<T> node) {
 		List<T> result = new ArrayList<>();
-		for (TreeNode<T> item : childs) {
-			result.add(item.getNode());
-			result.addAll(flat(childs));
+		result.add(node.getNode());
+		for (TreeNode<T> item : node.getChildren()) {
+			result.addAll(flat(item));
 		}
 		return result;
 	}

+ 1 - 1
src/main/java/org/ssssssss/magicapi/provider/StoreServiceProvider.java

@@ -74,7 +74,7 @@ public interface StoreServiceProvider<T> {
 	/**
 	 * 根据组ID删除
 	 */
-	boolean deleteGroup(String groupId);
+	boolean deleteGroup(List<String> groupIds);
 
 	/**
 	 * 包装接口信息(可用于加密)

+ 6 - 2
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultApiServiceProvider.java

@@ -5,8 +5,11 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.ssssssss.magicapi.model.ApiInfo;
 import org.ssssssss.magicapi.provider.ApiServiceProvider;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 public class DefaultApiServiceProvider extends BeanPropertyRowMapper<ApiInfo> implements ApiServiceProvider {
 
@@ -65,8 +68,9 @@ public class DefaultApiServiceProvider extends BeanPropertyRowMapper<ApiInfo> im
 	}
 
 	@Override
-	public boolean deleteGroup(String groupId) {
-		return template.update("delete from magic_api_info where api_group_id = ?", groupId) >= 0;
+	public boolean deleteGroup(List<String> groupIds) {
+		List<Object[]> params = groupIds.stream().map(groupId -> new Object[]{groupId}).collect(Collectors.toList());
+		return Arrays.stream(template.batchUpdate("delete from magic_api_info where api_group_id = ?",params)).sum() >= 0;
 	}
 
 	public boolean exists(String groupId, String method, String path) {

+ 2 - 2
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultFunctionServiceProvider.java

@@ -88,8 +88,8 @@ public class DefaultFunctionServiceProvider extends BeanPropertyRowMapper<Functi
 	}
 
 	@Override
-	public boolean deleteGroup(String groupId) {
-		return template.update("delete from magic_function where function_group_id = ?", groupId) >= 0;
+	public boolean deleteGroup(List<String> groupIds) {
+		return false;
 	}
 
 	@Override