前端有一棵树形结构的目录,需要实现目录层级的拖拽来变换顺序
public interface ITreeStructureStrategy {
/**
* 操作树形结构
* @param reqDTO
*/
void operate(TreeStructureOperateReqDTO reqDTO);
/**
* 策略实现类-操作类型
*
* @return
*/
Integer getType();
}
/**
* 上方添加目录
*/
@Service
public class AboveAddTreeStructureStrategyImpl implements ITreeStructureStrategy {
@Autowired
private Redisson redisson;
@Override
@Transactional(rollbackFor = Exception.class)
public void operate(TreeStructureOperateReqDTO reqDTO) {
// 参数必填校验
validate(reqDTO);
//加分布式锁,避免并发操作导致的sort异常
String key = StringUtils.format(RedisCacheConstants.TEACHER_CLASSHOUR_TREE_NX_KEY,reqDTO.getSchoolId(), SecurityUtils.getUserId());
RLock lock = redisson.getLock(key);
lock.lock();
try {
// 查询当前选中的节点
CustomRecord customRecord = getCustomRecord(reqDTO);
// 将自身节点及以下同等级节点的sort+1
updateSort(customRecord);
// 新增节点sort
insertNewAdd(reqDTO, customRecord);
} finally {
lock.unlock();
}
}
@Override
public Integer getType() {
return TextBookTreeStructureOperationEnum.ABOVE_ADD.getCode();
}
@Getter
@AllArgsConstructor
public enum TextBookTreeStructureOperationEnum {
/**
* 新增初始节点
*/
INIT_ADD(0, "新增初始节点"),
/**
* 上方添加
*/
ABOVE_ADD(1, "上方添加"),
/**
* 下方添加
*/
BELOW_ADD(2, "下方添加"),
/**
* 添加子节点
*/
CHILD_ADD(3, "添加子节点"),
/**
* 上移
*/
MOVE_UP(4, "上移"),
/**
* 下移
*/
MOVE_DOWN(5, "下移"),
/**
* 编辑
*/
SELF_EDIT(6, "编辑"),
/**
* 删除
*/
SELF_DELETE(7, "删除"),
;
private Integer code;
private String msg;
}
@Component
public class TreeStructureStrategyFactory implements InitializingBean {
@Autowired
private List treeStructureStrategyList;
/**
* 策略实现类
*/
private static final Map strategyMap = Maps.newHashMap();
/**
* 获取处理类
*
* @param type
* @return
*/
public static ITreeStructureStrategy getType(Integer type) {
return strategyMap.get(type);
}
@Override
public void afterPropertiesSet() throws Exception {
for (ITreeStructureStrategy iTreeStructureStrategy : treeStructureStrategyList) {
strategyMap.put(iTreeStructureStrategy.getType(), iTreeStructureStrategy);
}
}
}
public void operateTreeStructure(TreeStructureOperateReqDTO reqDTO) {
// 通过策略工厂返回具体策略
ITreeStructureStrategy strategy = TreeStructureStrategyFactory.getType(reqDTO.getOperateType());
if (ObjectUtils.isEmpty(strategy)) {
ValidUtil.assertMsg("不支持该操作类型");
}
// 操作树形结构
strategy.operate(reqDTO);
}