菜单组件的保存

This commit is contained in:
lvshaohua 2024-04-08 15:20:56 +08:00
parent 6fc00f0b1d
commit e25a6b9095
8 changed files with 98 additions and 1 deletions

View File

@ -32,4 +32,7 @@ public class BaseFeatureResourceDO {
/** 图标 **/ /** 图标 **/
private String icon; private String icon;
/** 端类型 **/
private String terminal;
} }

View File

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Data @Data
@ -21,5 +22,5 @@ public class FeatureComponentSaveReq extends BaseFeatureResourceDO {
private String linkUrl; private String linkUrl;
/** 子级组件 **/ /** 子级组件 **/
private List<FeatureComponentSaveReq> children; private List<FeatureComponentSaveReq> children = new ArrayList<>();
} }

View File

@ -7,6 +7,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import javax.validation.constraints.NotNull;
import java.util.List; import java.util.List;
@Data @Data
@ -39,6 +40,9 @@ public class FeatureResourceTreeSaveReq extends BaseFeatureResourceDO {
/** 页面及组件权限对象 **/ /** 页面及组件权限对象 **/
private List<RolePermissionSaveReq> permissions; private List<RolePermissionSaveReq> permissions;
@NotNull(message = "操作人ID不能为空")
private Long operatorId;
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor

View File

@ -16,8 +16,11 @@ import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication(scanBasePackages = "cn.axzo") @SpringBootApplication(scanBasePackages = "cn.axzo")
public class TyrApplication { public class TyrApplication {
public static void main(String[] args) { public static void main(String[] args) {
System.setProperty("spring.redis.port","31270");
System.setProperty("spring.redis.host","123.249.44.111");
ConfigurableApplicationContext run = SpringApplication.run(TyrApplication.class, args); ConfigurableApplicationContext run = SpringApplication.run(TyrApplication.class, args);
Environment env = run.getEnvironment(); Environment env = run.getEnvironment();
log.info( log.info(
"--------------------------------------------------------------------------------------------------------------------\n" + "--------------------------------------------------------------------------------------------------------------------\n" +
"Application 【{}】 is running on 【{}】 environment!\n" + "Application 【{}】 is running on 【{}】 environment!\n" +

View File

@ -49,6 +49,9 @@ public class FeatureResourceController implements FeatureResourceApi {
@Override @Override
public ApiResult<Void> saveMenu(FeatureResourceTreeSaveReq req) { public ApiResult<Void> saveMenu(FeatureResourceTreeSaveReq req) {
log.info("save feature resouce req : " + req.toString()); log.info("save feature resouce req : " + req.toString());
featureResourceService.saveOrUpdateMenu(req);
return ApiResult.ok(); return ApiResult.ok();
} }
} }

View File

@ -120,6 +120,7 @@ public class RoleUserController implements TyrSaasRoleUserApi {
* 根据id删除用户角色关联关系 * 根据id删除用户角色关联关系
* @return * @return
*/ */
@Override
public ApiResult removeRoleUserRelation(@RequestBody @Valid List<Long> ids){ public ApiResult removeRoleUserRelation(@RequestBody @Valid List<Long> ids){
AssertUtil.isTrue(!CollectionUtils.isEmpty(ids),"用户角色关联id不能为空"); AssertUtil.isTrue(!CollectionUtils.isEmpty(ids),"用户角色关联id不能为空");
List<SaasRoleUserRelation> relations = saasRoleUserRelationDao.listByIds(ids); List<SaasRoleUserRelation> relations = saasRoleUserRelationDao.listByIds(ids);
@ -141,6 +142,7 @@ public class RoleUserController implements TyrSaasRoleUserApi {
* 获取分包负责人等特殊角色 * 获取分包负责人等特殊角色
* @return * @return
*/ */
@Override
public ApiResult<List<Long>> getSpecialRole() { public ApiResult<List<Long>> getSpecialRole() {
return ApiResult.ok(saasRoleUserService.getSpecialRole()); return ApiResult.ok(saasRoleUserService.getSpecialRole());
} }

View File

@ -1,5 +1,6 @@
package cn.axzo.tyr.server.service; package cn.axzo.tyr.server.service;
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq;
import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
@ -18,4 +19,6 @@ public interface SaasFeatureResourceService {
List<FeatureResourceTreeNode> getSyncTreeById(Long id); List<FeatureResourceTreeNode> getSyncTreeById(Long id);
void syncFromBase(ResourceSyncReq req); void syncFromBase(ResourceSyncReq req);
void saveOrUpdateMenu(FeatureResourceTreeSaveReq req);
} }

View File

@ -3,7 +3,10 @@ package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.BeanMapper;
import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.basics.common.util.TreeUtil;
import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq;
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq;
import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
@ -13,16 +16,20 @@ import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.axzo.tyr.server.util.RpcInternalUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -152,4 +159,75 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic
featureResourceDao.updateById(resource); featureResourceDao.updateById(resource);
} }
@Override
public void saveOrUpdateMenu(FeatureResourceTreeSaveReq req) {
SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class);
baseResource.setUpdateBy(req.getOperatorId());
// 新增时候
if (req.getId() == null) {
baseResource.setCreateBy(req.getOperatorId());
newResource(baseResource);
} else {
featureResourceDao.updateById(baseResource);
}
if (CollectionUtil.isNotEmpty(req.getComponentSaveReqList())) {
for (FeatureComponentSaveReq componentSaveReq : req.getComponentSaveReqList()) {
saveOrUpdateFeatureComponent(componentSaveReq, baseResource.getPath(), req.getOperatorId());
}
} else {
deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId());
}
}
private void saveOrUpdateFeatureComponent(FeatureComponentSaveReq featureComponentSaveReq, String parentPath, Long operatorId) {
// 批量保存path
SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class);
saasFeatureResource.setUpdateBy(operatorId);
if (saasFeatureResource.getId() != null) {
featureResourceDao.updateById(saasFeatureResource);
} else {
saasFeatureResource.setCreateBy(operatorId);
featureResourceDao.save(saasFeatureResource);
saasFeatureResource.setPath(parentPath + "," + saasFeatureResource.getId());
featureResourceDao.updateById(saasFeatureResource);
}
List<FeatureComponentSaveReq> children = featureComponentSaveReq.getChildren();
// 删除前端没带但数据库中有的组件
deleteComponentRecursionById(saasFeatureResource.getId(), children, operatorId);
// 更新前端提交的数据
if (!CollectionUtil.isEmpty(children)) {
for (FeatureComponentSaveReq childComponent : children) {
if (childComponent.getParentId() != null) {
childComponent.setParentId(saasFeatureResource.getId());
}
// 递归新增修改删除子节点
saveOrUpdateFeatureComponent(childComponent, saasFeatureResource.getPath(), operatorId);
}
}
}
// 删除自己和自己的子集
private void deleteComponentRecursionById(Long resourceId, List<FeatureComponentSaveReq> submitChildren, Long operatorId) {
if (submitChildren == null) {
submitChildren = Collections.emptyList();
}
// 删除前端没带过来的
List<SaasFeatureResource> existChild = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getParentId, resourceId).list();
List<Long> updateChildIds = submitChildren.stream().map(FeatureComponentSaveReq::getId).filter(Objects::nonNull).collect(Collectors.toList());
List<SaasFeatureResource> deleteChildren = existChild.stream().filter(item -> !updateChildIds.contains(item.getId())).collect(Collectors.toList());
// 前端没传但是数据库中有的需要删除
if (!CollectionUtil.isEmpty(deleteChildren)) {
for (SaasFeatureResource deleteChild : deleteChildren) {
// 删除自己及自己的子集
featureResourceDao.lambdaUpdate()
.apply("FIND_IN_SET('" + deleteChild.getId() + "', path)")
.set(SaasFeatureResource::getUpdateBy, operatorId)
.set(BaseEntity::getIsDelete,1);
}
}
}
} }