package com.labelsys.backend.controller; import com.labelsys.backend.common.Result; import com.labelsys.backend.context.UserContext; import com.labelsys.backend.dto.common.PageResult; import com.labelsys.backend.dto.request.SaveImageBboxRequest; import com.labelsys.backend.dto.request.SourceResourcePageQuery; import com.labelsys.backend.dto.request.SourceUploadRequest; import com.labelsys.backend.dto.response.ImageBboxResponse; import com.labelsys.backend.dto.response.SourceResourceResponse; import com.labelsys.backend.dto.response.SourceUploadResponse; import com.labelsys.backend.entity.SourceResource; import com.labelsys.backend.service.SourceResourceService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Tag(name = "资源管理") @RestController @RequestMapping("/api/source-resources") @RequiredArgsConstructor public class SourceResourceController { private final SourceResourceService sourceResourceService; @Operation(summary = "上传资源") @PostMapping("/upload") public Result upload(@ParameterObject @ModelAttribute SourceUploadRequest request) { return Result.success(sourceResourceService.upload(UserContext.requireUser(), request)); } @Operation(summary = "分页查询资源") @GetMapping public Result> page( @ParameterObject @ModelAttribute SourceResourcePageQuery query) { return Result.success(sourceResourceService.pageResources(UserContext.requireUser(), query)); } @Operation(summary = "查询资源详情") @GetMapping("/{id}") public Result detail( @Parameter(description = "资源ID", example = "191000000000000101") @PathVariable Long id ) { return Result.success(sourceResourceService.getResource(UserContext.requireUser(), id)); } @Operation(summary = "删除资源") @DeleteMapping("/{id}") public Result delete( @Parameter(description = "资源ID", example = "191000000000000101") @PathVariable Long id ) { sourceResourceService.deleteResource(UserContext.requireUser(), id); return Result.success(); } @Operation(summary = "下载图片资源") @GetMapping("/{id}/download") public ResponseEntity downloadImage( @Parameter(description = "资源ID", example = "191000000000000101") @PathVariable Long id ) { var currentUser = UserContext.requireUser(); byte[] imageData = sourceResourceService.downloadImage(currentUser, id); // 获取资源信息以确定Content-Type SourceResource resource = sourceResourceService.getResourceEntity(id); String contentType = sourceResourceService.getImageContentType(resource); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_TYPE, contentType) .header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + resource.getResourceName() + "\"") .body(imageData); } // 添加新接口 @Operation(summary = "查询图片资源BBOX标注") @GetMapping("/{id}/bbox") public Result getImageBbox( @Parameter(description = "资源ID", example = "191000000000000101") @PathVariable Long id ) { return Result.success(sourceResourceService.getImageBbox(UserContext.requireUser(), id)); } @Operation(summary = "保存图片资源BBOX标注") @PostMapping("/{id}/bbox") public Result saveImageBbox( @Parameter(description = "资源ID", example = "191000000000000101") @PathVariable Long id, @Valid @RequestBody SaveImageBboxRequest request ) { return Result.success(sourceResourceService.saveImageBbox(UserContext.requireUser(), id, request)); } @Operation(summary = "删除图片资源BBOX标注") @DeleteMapping("/{id}/bbox") public Result deleteImageBbox( @Parameter(description = "资源ID", example = "191000000000000101") @PathVariable Long id ) { sourceResourceService.deleteImageBbox(UserContext.requireUser(), id); return Result.success(); } }