refactor(puzzle): 重构元素DTO及新增元素基类

- 将ElementCreateRequest和PuzzleElementDTO中的elementType从Integer改为String
- 删除所有类型特定字段,新增config和configMap支持JSON配置
- 新增BaseElement抽象基类定义元素通用行为
- 添加ElementConfig接口和具体实现类ImageConfig、TextConfig
- 创建ElementFactory工厂类和ElementRegistrar注册器
- 新增ElementType枚举和ElementValidationException异常类
- 实现ImageElement和TextElement具体元素类
- 添加Position位置信息封装类
This commit is contained in:
2025-11-18 08:13:38 +08:00
parent 5c49a5af9e
commit 3d361200b0
28 changed files with 2988 additions and 615 deletions

View File

@@ -1,4 +1,6 @@
package com.ycwl.basic.puzzle.service.impl;
import cn.hutool.core.util.StrUtil;
import com.ycwl.basic.puzzle.util.ElementConfigHelper;
import cn.hutool.core.bean.BeanUtil;
import com.ycwl.basic.puzzle.dto.ElementCreateRequest;
@@ -137,18 +139,24 @@ public class PuzzleTemplateServiceImpl implements IPuzzleTemplateService {
public Long addElement(ElementCreateRequest request) {
log.info("添加元素到模板: templateId={}, elementKey={}", request.getTemplateId(), request.getElementKey());
// 检查模板是否存在
// 1. 验证请求
ElementConfigHelper.validateRequest(request);
// 2. 检查模板是否存在
PuzzleTemplateEntity template = templateMapper.getById(request.getTemplateId());
if (template == null) {
throw new IllegalArgumentException("模板不存在: " + request.getTemplateId());
}
// 转换为实体并插入
PuzzleElementEntity entity = BeanUtil.copyProperties(request, PuzzleElementEntity.class);
// 3. 转换为Entity(使用Helper)
PuzzleElementEntity entity = ElementConfigHelper.toEntity(request);
entity.setDeleted(0);
// 4. 插入数据库
elementMapper.insert(entity);
log.info("元素添加成功: id={}, elementKey={}", entity.getId(), entity.getElementKey());
log.info("元素添加成功: id={}, type={}, key={}",
entity.getId(), entity.getElementType(), entity.getElementKey());
return entity.getId();
}
@@ -157,22 +165,23 @@ public class PuzzleTemplateServiceImpl implements IPuzzleTemplateService {
public void batchAddElements(Long templateId, List<ElementCreateRequest> elements) {
log.info("批量添加元素到模板: templateId={}, count={}", templateId, elements.size());
// 检查模板是否存在
// 1. 校验模板
PuzzleTemplateEntity template = templateMapper.getById(templateId);
if (template == null) {
throw new IllegalArgumentException("模板不存在: " + templateId);
}
// 转换为实体列表
List<PuzzleElementEntity> entityList = new ArrayList<>();
for (ElementCreateRequest request : elements) {
request.setTemplateId(templateId);
PuzzleElementEntity entity = BeanUtil.copyProperties(request, PuzzleElementEntity.class);
entity.setDeleted(0);
entityList.add(entity);
}
// 2. 批量转换
List<PuzzleElementEntity> entityList = elements.stream()
.peek(req -> {
req.setTemplateId(templateId);
ElementConfigHelper.validateRequest(req);
})
.map(ElementConfigHelper::toEntity)
.peek(entity -> entity.setDeleted(0))
.collect(Collectors.toList());
// 批量插入
// 3. 批量插入
if (!entityList.isEmpty()) {
elementMapper.batchInsert(entityList);
log.info("批量添加元素成功: templateId={}, count={}", templateId, entityList.size());
@@ -184,14 +193,17 @@ public class PuzzleTemplateServiceImpl implements IPuzzleTemplateService {
public void updateElement(Long id, ElementCreateRequest request) {
log.info("更新元素: id={}", id);
// 检查元素是否存在
// 1. 校验元素存在
PuzzleElementEntity existing = elementMapper.getById(id);
if (existing == null) {
throw new IllegalArgumentException("元素不存在: " + id);
}
// 更新
PuzzleElementEntity entity = BeanUtil.copyProperties(request, PuzzleElementEntity.class);
// 2. 验证请求
ElementConfigHelper.validateRequest(request);
// 3. 转换并更新
PuzzleElementEntity entity = ElementConfigHelper.toEntity(request);
entity.setId(id);
elementMapper.update(entity);
@@ -222,7 +234,7 @@ public class PuzzleTemplateServiceImpl implements IPuzzleTemplateService {
throw new IllegalArgumentException("元素不存在: " + id);
}
return BeanUtil.copyProperties(element, PuzzleElementDTO.class);
return convertElementToDTO(element);
}
/**
@@ -234,10 +246,25 @@ public class PuzzleTemplateServiceImpl implements IPuzzleTemplateService {
// 查询元素列表
List<PuzzleElementEntity> elements = elementMapper.getByTemplateId(template.getId());
List<PuzzleElementDTO> elementDTOs = elements.stream()
.map(e -> BeanUtil.copyProperties(e, PuzzleElementDTO.class))
.map(this::convertElementToDTO)
.collect(Collectors.toList());
dto.setElements(elementDTOs);
return dto;
}
/**
* 转换元素为DTO
*/
private PuzzleElementDTO convertElementToDTO(PuzzleElementEntity entity) {
PuzzleElementDTO dto = new PuzzleElementDTO();
BeanUtil.copyProperties(entity, dto);
// 解析config为configMap(方便前端使用)
if (StrUtil.isNotBlank(entity.getConfig())) {
dto.setConfigMap(ElementConfigHelper.parseConfigToMap(entity.getConfig()));
}
return dto;
}
}