diff --git a/par-api/src/main/java/com/par/api/controller/AdminController.java b/par-api/src/main/java/com/par/api/controller/AdminController.java index 41a8408..0dd6657 100644 --- a/par-api/src/main/java/com/par/api/controller/AdminController.java +++ b/par-api/src/main/java/com/par/api/controller/AdminController.java @@ -40,6 +40,7 @@ public class AdminController { private final AccountService accountService; private final PskService pskService; private final CachedStorageService storageService; + private final com.par.core.service.SiteService siteService; /** * 获取所有用户列表 @@ -255,6 +256,32 @@ public class AdminController { return ApiResponse.success(); } + // ===================== 站点审核 ===================== + + @GetMapping("/sites/pending") + public ApiResponse> listPendingSites(HttpServletRequest request) { + checkAdmin(request); + return ApiResponse.success(siteService.listPendingSites().stream() + .map(siteService::toDTO).toList()); + } + + @PostMapping("/sites/{id}/approve") + public ApiResponse approveSite(@PathVariable Long id, HttpServletRequest request) { + checkAdmin(request); + Long reviewerId = (Long) request.getAttribute("accountId"); + siteService.approveSite(id, reviewerId); + log.info("Site approved: id={}, reviewer={}", id, reviewerId); + return ApiResponse.success(); + } + + @PostMapping("/sites/{id}/reject") + public ApiResponse rejectSite(@PathVariable Long id, HttpServletRequest request) { + checkAdmin(request); + siteService.rejectSite(id); + log.info("Site rejected: id={}", id); + return ApiResponse.success(); + } + private void checkAdmin(HttpServletRequest request) { TrustLevel level = (TrustLevel) request.getAttribute("trustLevel"); if (level == null || level != TrustLevel.ADMIN) { 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 5496548..cc5c9c2 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 @@ -26,8 +26,17 @@ public interface SiteService { SiteDTO toDTO(Site site); /** - * 提交站点信息(创建/更新,需审核) + * 提交站点信息(创建 pending,更新保持原状态) */ Site submitSite(String siteId, String name, String description, String baseUrl, String iconUrl, String siteType, Long submitterId); + + /** 待审核站点列表 */ + List listPendingSites(); + + /** 审核通过 */ + void approveSite(Long id, Long reviewerId); + + /** 拒绝(删除) */ + void rejectSite(Long id); } 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 b432f7f..c7c0fb4 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 @@ -77,9 +77,32 @@ public class SiteServiceImpl implements SiteService { site.setIconUrl(iconUrl); site.setSiteType(siteType != null ? com.par.core.enums.SiteType.fromValue(siteType) : com.par.core.enums.SiteType.UNKNOWN); site.setSchemaVersion("1.0.0"); - site.setStatus(SiteStatus.ACTIVE); + site.setStatus(SiteStatus.PENDING); // 新站点需审核 site.setSubmitterId(submitterId); siteMapper.insert(site); return site; } + + @Override + public List listPendingSites() { + return siteMapper.selectList( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(Site::getStatus, SiteStatus.PENDING) + .eq(Site::getDeleted, 0)); + } + + @Override + public void approveSite(Long id, Long reviewerId) { + Site site = siteMapper.selectById(id); + if (site != null) { + site.setStatus(SiteStatus.ACTIVE); + siteMapper.updateById(site); + } + } + + @Override + public void rejectSite(Long id) { + siteMapper.deleteById(id); // 物理删除 + } + } }