From 48d0e6a247c190495aae81a2863a034f69287b6b Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Tue, 30 Jun 2026 00:16:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20/api/v1/sites/{sit?= =?UTF-8?q?eId}/info=20=E7=AB=99=E7=82=B9=E4=BF=A1=E6=81=AF=E5=8F=8D?= =?UTF-8?q?=E9=A6=88=E6=8E=A5=E5=8F=A3,=20=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E5=90=8D=E7=A7=B0/=E5=A4=9A=E5=9C=B0=E5=9D=80/=E7=8A=B6?= =?UTF-8?q?=E6=80=81/=E5=A4=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../par/api/controller/SiteController.java | 29 ++++++++ .../com/par/core/service/SiteService.java | 6 ++ .../core/service/impl/SiteServiceImpl.java | 69 +++++++++++++++++++ 3 files changed, 104 insertions(+) diff --git a/par-api/src/main/java/com/par/api/controller/SiteController.java b/par-api/src/main/java/com/par/api/controller/SiteController.java index 70c142f..b2d6caf 100644 --- a/par-api/src/main/java/com/par/api/controller/SiteController.java +++ b/par-api/src/main/java/com/par/api/controller/SiteController.java @@ -66,4 +66,33 @@ public class SiteController { Site site = siteService.submitSite(siteId, name, description, baseUrl, iconUrl, siteType, submitterId); return ApiResponse.success(siteService.toDTO(site)); } + + /** + * 提交站点信息反馈(需 HMAC 鉴权) + * 接收站点状态、多名称、多地址、备注等信息 + */ + @PostMapping("/{siteId}/info") + public ApiResponse submitSiteInfo( + @PathVariable("siteId") String siteId, + @RequestBody Map payload, + HttpServletRequest request) { + + String status = (String) payload.getOrDefault("status", "正常"); + + @SuppressWarnings("unchecked") + List names = payload.get("names") instanceof List l + ? l.stream().filter(o -> o instanceof String).map(o -> (String) o).toList() + : List.of(); + + @SuppressWarnings("unchecked") + List urls = payload.get("urls") instanceof List l + ? l.stream().filter(o -> o instanceof String).map(o -> (String) o).toList() + : List.of(); + + String notes = (String) payload.get("notes"); + Long submitterId = (Long) request.getAttribute("accountId"); + + Site site = siteService.updateSiteInfo(siteId, status, names, urls, notes, submitterId); + return ApiResponse.success(siteService.toDTO(site)); + } } diff --git a/par-core/src/main/java/com/par/core/service/SiteService.java b/par-core/src/main/java/com/par/core/service/SiteService.java index cc5c9c2..05d2e21 100644 --- a/par-core/src/main/java/com/par/core/service/SiteService.java +++ b/par-core/src/main/java/com/par/core/service/SiteService.java @@ -31,6 +31,12 @@ public interface SiteService { Site submitSite(String siteId, String name, String description, String baseUrl, String iconUrl, String siteType, Long submitterId); + /** + * 提交站点信息反馈(状态、多名称、多地址、备注) + */ + Site updateSiteInfo(String siteId, String status, List names, + List urls, String notes, Long submitterId); + /** 待审核站点列表 */ List listPendingSites(); diff --git a/par-core/src/main/java/com/par/core/service/impl/SiteServiceImpl.java b/par-core/src/main/java/com/par/core/service/impl/SiteServiceImpl.java index 1d46e5b..9f15610 100644 --- a/par-core/src/main/java/com/par/core/service/impl/SiteServiceImpl.java +++ b/par-core/src/main/java/com/par/core/service/impl/SiteServiceImpl.java @@ -1,24 +1,32 @@ package com.par.core.service.impl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.par.core.dto.SiteDTO; import com.par.core.entity.Site; import com.par.core.enums.SiteStatus; +import com.par.core.enums.SiteType; import com.par.core.mapper.SiteMapper; import com.par.core.service.SiteService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * 站点服务实现 */ +@Slf4j @Service @RequiredArgsConstructor public class SiteServiceImpl implements SiteService { private final SiteMapper siteMapper; + private static final ObjectMapper objectMapper = new ObjectMapper(); @Override public List listActiveSites() { @@ -83,6 +91,67 @@ public class SiteServiceImpl implements SiteService { return site; } + @Override + public Site updateSiteInfo(String siteId, String status, List names, + List urls, String notes, Long submitterId) { + // 映射状态:正常→ACTIVE, 关停/已迁移→DEPRECATED, 维护中→ACTIVE(带备注) + SiteStatus siteStatus; + if (status == null) { + siteStatus = SiteStatus.ACTIVE; + } else { + switch (status) { + case "关停": + case "已迁移": + siteStatus = SiteStatus.DEPRECATED; + break; + case "维护中": + case "正常": + default: + siteStatus = SiteStatus.ACTIVE; + break; + } + } + + // 构建额外信息 JSON + Map extraInfo = new LinkedHashMap<>(); + if (names != null && !names.isEmpty()) extraInfo.put("names", names); + if (urls != null && !urls.isEmpty()) extraInfo.put("urls", urls); + if (notes != null && !notes.isBlank()) extraInfo.put("notes", notes); + String extraJson = null; + try { + if (!extraInfo.isEmpty()) extraJson = objectMapper.writeValueAsString(extraInfo); + } catch (JsonProcessingException ignored) {} + + Site existing = siteMapper.selectBySiteId(siteId); + if (existing != null) { + // 更新已有站点 + if (names != null && !names.isEmpty()) existing.setName(names.get(0)); + if (urls != null && !urls.isEmpty()) existing.setBaseUrl(urls.get(0)); + if (extraJson != null) existing.setDescription( + existing.getDescription() != null && !existing.getDescription().isBlank() + ? existing.getDescription() : extraJson); + existing.setStatus(siteStatus); + existing.setSubmitterId(submitterId != null ? submitterId : existing.getSubmitterId()); + siteMapper.updateById(existing); + log.info("站点信息反馈更新: siteId={} status={}", siteId, siteStatus.getValue()); + return existing; + } + + // 创建新站点(PENDING 状态) + Site site = new Site(); + site.setSiteId(siteId); + site.setName(names != null && !names.isEmpty() ? names.get(0) : siteId); + site.setBaseUrl(urls != null && !urls.isEmpty() ? urls.get(0) : ""); + site.setDescription(extraJson); + site.setSiteType(SiteType.UNKNOWN); + site.setSchemaVersion("1.0.0"); + site.setStatus(SiteStatus.PENDING); + site.setSubmitterId(submitterId); + siteMapper.insert(site); + log.info("站点信息反馈创建: siteId={} status=PENDING", siteId); + return site; + } + @Override public List listPendingSites() { return siteMapper.selectList(