菜单组件的保存
This commit is contained in:
parent
6fc00f0b1d
commit
e25a6b9095
@ -32,4 +32,7 @@ public class BaseFeatureResourceDO {
|
|||||||
|
|
||||||
/** 图标 **/
|
/** 图标 **/
|
||||||
private String icon;
|
private String icon;
|
||||||
|
|
||||||
|
/** 端类型 **/
|
||||||
|
private String terminal;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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<>();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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" +
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user