Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions backend/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
<mybatis-plus.version>3.5.5</mybatis-plus.version>
<mapstruct.version>1.6.3</mapstruct.version>
<lombok.version>1.18.32</lombok.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
</properties>

<modules>
Expand Down Expand Up @@ -120,6 +121,12 @@
<version>${mapstruct.version}</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
Expand Down Expand Up @@ -152,6 +159,12 @@
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>

<build>
Expand Down
32 changes: 32 additions & 0 deletions backend/services/data-management-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,41 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<arguments>true</arguments>
<classifier>exec</classifier>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<annotationProcessorPaths>
<!-- 顺序很重要 -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-parameters</arg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.UUID;
Expand Down Expand Up @@ -39,6 +40,37 @@ public Tag createTag(String name, String color, String description) {
return tagMapper.findById(tag.getId());
}

/**
* 更新标签
*
* @param tag 待更新的标签实体,必须包含有效的 ID
* @return 更新结果
*/
@Transactional
public Tag updateTag(Tag tag) {
Tag existingTag = tagMapper.findById(tag.getId());
if (existingTag == null) {
throw new IllegalArgumentException("Tag not found: " + tag.getId());
}
existingTag.setName(tag.getName());
existingTag.setColor(tag.getColor());
existingTag.setDescription(tag.getDescription());
tagMapper.update(existingTag);
return tagMapper.findById(existingTag.getId());
}

@Transactional
public void deleteTag(List<String> tagIds) {
List<Tag> tags = tagMapper.findByIdIn(tagIds);
if (tags.stream().anyMatch(tag -> tag.getUsageCount() > 0)) {
throw new IllegalArgumentException("Cannot delete tags that are in use");
}
if (CollectionUtils.isEmpty(tags)) {
return;
}
tagMapper.deleteTagsById(tags.stream().map(Tag::getId).toList());
}

/**
* 获取所有标签
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public interface TagMapper {
Tag findById(@Param("id") String id);
Tag findByName(@Param("name") String name);
List<Tag> findByNameIn(@Param("list") List<String> names);
List<Tag> findByIdIn(@Param("ids") List<String> ids);
List<Tag> findByKeyword(@Param("keyword") String keyword);
List<Tag> findAllByOrderByUsageCountDesc();

Expand All @@ -22,4 +23,5 @@ public interface TagMapper {
int insertDatasetTag(@Param("datasetId") String datasetId, @Param("tagId") String tagId);
int deleteDatasetTagsByDatasetId(@Param("datasetId") String datasetId);
List<Tag> findByDatasetId(@Param("datasetId") String datasetId);
void deleteTagsById(@Param("ids") List<String> ids);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.dataengine.datamanagement.interfaces.converter;

import com.dataengine.datamanagement.domain.model.dataset.Tag;
import com.dataengine.datamanagement.interfaces.dto.TagResponse;
import com.dataengine.datamanagement.interfaces.dto.UpdateTagRequest;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

/**
* 标签转换器
*/
@Mapper
public interface TagConverter {
/** 单例实例 */
TagConverter INSTANCE = Mappers.getMapper(TagConverter.class);

/**
* 将 UpdateTagRequest 转换为 Tag 实体
* @param request 更新标签请求DTO
* @return 标签实体
*/
Tag updateRequestToTag(UpdateTagRequest request);

/**
* 将 Tag 实体转换为 TagResponse DTO
* @param tag 标签实体
* @return 标签响应DTO
*/
TagResponse convertToResponse(Tag tag);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.dataengine.datamanagement.interfaces.dto;

import lombok.Getter;
import lombok.Setter;

/**
* 更新标签请求DTO
*/
@Getter
@Setter
public class UpdateTagRequest {
/** 标签 ID */
private String id;
/** 标签名称 */
private String name;
/** 标签颜色 */
private String color;
/** 标签描述 */
private String description;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,19 @@
import com.dataengine.common.interfaces.Response;
import com.dataengine.datamanagement.application.service.TagApplicationService;
import com.dataengine.datamanagement.domain.model.dataset.Tag;
import com.dataengine.datamanagement.interfaces.converter.TagConverter;
import com.dataengine.datamanagement.interfaces.dto.CreateTagRequest;
import com.dataengine.datamanagement.interfaces.dto.TagResponse;
import com.dataengine.datamanagement.interfaces.dto.UpdateTagRequest;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Size;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
Expand All @@ -30,10 +36,10 @@ public TagController(TagApplicationService tagApplicationService) {
* 查询标签列表
*/
@GetMapping
public ResponseEntity<Response<List<TagResponse>>> getTags(@RequestParam(required = false) String keyword) {
public ResponseEntity<Response<List<TagResponse>>> getTags(@RequestParam(name = "keyword", required = false) String keyword) {
List<Tag> tags = tagApplicationService.searchTags(keyword);
List<TagResponse> response = tags.stream()
.map(this::convertToResponse)
.map(TagConverter.INSTANCE::convertToResponse)
.collect(Collectors.toList());
return ResponseEntity.ok(Response.ok(response));
}
Expand All @@ -49,19 +55,31 @@ public ResponseEntity<Response<TagResponse>> createTag(@RequestBody CreateTagReq
createTagRequest.getColor(),
createTagRequest.getDescription()
);
return ResponseEntity.status(201).body(Response.ok(convertToResponse(tag)));
return ResponseEntity.ok(Response.ok(TagConverter.INSTANCE.convertToResponse(tag)));
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().body(Response.error(e.getMessage(), null));
}
}

private TagResponse convertToResponse(Tag tag) {
TagResponse response = new TagResponse();
response.setId(tag.getId());
response.setName(tag.getName());
response.setColor(tag.getColor());
response.setDescription(tag.getDescription());
response.setUsageCount(tag.getUsageCount() != null ? tag.getUsageCount().intValue() : null);
return response;
/**
* 更新标签
*
* @param updateTagRequest 更新参数
* @return 更新结果
*/
@PutMapping
public ResponseEntity<Response<TagResponse>> updateTag(@RequestBody @Valid UpdateTagRequest updateTagRequest) {
Tag tag = tagApplicationService.updateTag(TagConverter.INSTANCE.updateRequestToTag(updateTagRequest));
return ResponseEntity.ok(Response.ok(TagConverter.INSTANCE.convertToResponse(tag)));
}

@DeleteMapping
public ResponseEntity<Response<Valid>> deleteTag(@RequestParam(value = "ids") @Valid @Size(max = 10) List<String> ids) {
try {
tagApplicationService.deleteTag(ids.stream().filter(StringUtils::isNoneBlank).distinct().toList());
return ResponseEntity.ok(Response.ok(null));
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().body(Response.error(e.getMessage(), null));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,20 @@
ORDER BY t.usage_count DESC, t.name ASC
</select>

<delete id="deleteTagsById">
DELETE FROM t_dm_tags WHERE
id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>

<select id="findByIdIn" resultMap="TagResultMap">
SELECT <include refid="Base_Column_List"/>
FROM t_dm_tags
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
</mapper>