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 2438bb2..ec6ec8c 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 @@ -48,6 +48,10 @@ public class AdminController { private final ConfigService configService; private final CachedStorageService storageService; private final com.par.core.service.SiteService siteService; + private final com.par.core.mapper.SitePagesMapper sitePagesMapper; + private final com.par.core.mapper.RiskRuleMapper riskRuleMapper; + private final com.par.core.service.SitePagesService sitePagesService; + private final com.par.core.service.RiskRuleService riskRuleService; /** * 获取所有用户列表 @@ -424,8 +428,8 @@ public class AdminController { } // 2. 页面配置(去重取最新版本) Set seenPages = new HashSet<>(); - for (var sp : ((com.par.core.service.impl.SitePagesServiceImpl) siteService).mapper - .selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + for (var sp : sitePagesMapper.selectList( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .eq(com.par.core.entity.SitePages::getDeleted, 0) .orderByDesc(com.par.core.entity.SitePages::getId))) { if (seenPages.add(sp.getSiteId())) { @@ -434,8 +438,7 @@ public class AdminController { } // 3. 风险规则(去重取最新版本) Set seenRules = new HashSet<>(); - var ruleMapper = new com.par.core.mapper.RiskRuleMapper() {}; - for (var rr : ruleMapper.selectList( + for (var rr : riskRuleMapper.selectList( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .eq(com.par.core.entity.RiskRule::getDeleted, 0) .orderByDesc(com.par.core.entity.RiskRule::getId))) { @@ -483,10 +486,10 @@ public class AdminController { configService.submitConfig(sid, String.valueOf(System.currentTimeMillis()), content, null); } else if (name.startsWith("pages/") && name.endsWith(".json")) { String sid = name.replace("pages/", "").replace(".json", ""); - siteService.savePages(sid, parseJson(content)); + sitePagesService.savePages(sid, parseJson(content)); } else if (name.startsWith("rules/") && name.endsWith(".json")) { String type = name.replace("rules/", "").replace(".json", ""); - ((com.par.core.service.RiskRuleService) riskService).saveRules(type, parseJson(content)); + riskRuleService.saveRules(type, parseJson(content)); } ok++; } catch (Exception ex) { log.error("导入失败: {}", name, ex); fail++; } @@ -502,11 +505,6 @@ public class AdminController { catch (Exception e) { return java.util.List.of(); } } - private final com.par.core.service.SitePagesService siteService; - private final com.par.core.service.RiskRuleService riskService; - - // ==================== 旧脚本导入导出(保留兼容) ==================== - private void checkAdmin(HttpServletRequest request) { TrustLevel level = (TrustLevel) request.getAttribute("trustLevel"); if (level == null || level != TrustLevel.ADMIN) { diff --git a/par-api/src/main/java/com/par/api/controller/RiskRuleController.java b/par-api/src/main/java/com/par/api/controller/RiskRuleController.java index 77576a1..08f1584 100644 --- a/par-api/src/main/java/com/par/api/controller/RiskRuleController.java +++ b/par-api/src/main/java/com/par/api/controller/RiskRuleController.java @@ -11,9 +11,6 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; -/** - * 风险规则接口 - */ @Slf4j @RestController @RequiredArgsConstructor @@ -21,51 +18,40 @@ public class RiskRuleController { private final RiskRuleService riskRuleService; - /** 获取风险规则 */ @GetMapping("/api/v1/risk-rules/{siteType}") - public ResponseEntity getRules( - @PathVariable String siteType, + public ResponseEntity getRules(@PathVariable String siteType, @RequestParam(defaultValue = "0") int version) { int currentVer = riskRuleService.getVersion(siteType); - if (currentVer <= version) { - return ResponseEntity.status(304).build(); - } + if (currentVer <= version) return ResponseEntity.status(304).build(); Map data = riskRuleService.getRules(siteType); if (data == null) return ResponseEntity.status(304).build(); return ResponseEntity.ok(data); } - /** 提交风险规则 */ @PostMapping("/api/v1/risk-rules/{siteType}") - public ApiResponse saveRules( - @PathVariable String siteType, + public ApiResponse saveRules(@PathVariable String siteType, @RequestBody Map payload) { @SuppressWarnings("unchecked") - List> rules = (List>) payload.get("rules"); - if (rules == null || rules.isEmpty()) { - return ApiResponse.error(400, "rules is required"); - } + var rules = (List>) payload.get("rules"); + if (rules == null || rules.isEmpty()) return ApiResponse.error(400, "rules is required"); riskRuleService.saveRules(siteType, rules); return ApiResponse.success(); } - /** 管理员查看所有风险规则列表 */ @GetMapping("/api/v1/admin/risk-rules") public ApiResponse>> adminList(HttpServletRequest request) { checkAdmin(request); return ApiResponse.success(riskRuleService.listAll()); } - /** 管理员查看某个类型风险规则内容 */ @GetMapping("/api/v1/admin/risk-rules/{siteType}") public ApiResponse> adminGet(@PathVariable String siteType, HttpServletRequest request) { checkAdmin(request); - Map data = riskRuleService.getRules(siteType); + var data = riskRuleService.getRules(siteType); if (data == null) return ApiResponse.error(404, "风险规则不存在"); return ApiResponse.success(data); } - /** 管理员删除风险规则 */ @DeleteMapping("/api/v1/admin/risk-rules/{siteType}") public ApiResponse adminDelete(@PathVariable String siteType, HttpServletRequest request) { checkAdmin(request); @@ -73,45 +59,21 @@ public class RiskRuleController { return ApiResponse.success(); } - /** 获取风险规则版本历史 */ @GetMapping("/api/v1/admin/risk-rules/{siteType}/versions") public ApiResponse>> versions(@PathVariable String siteType, HttpServletRequest request) { checkAdmin(request); - var mapper = ((com.par.core.service.impl.RiskRuleServiceImpl) riskRuleService).mapper; - var list = mapper.selectList( - new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() - .eq(com.par.core.entity.RiskRule::getSiteType, siteType) - .eq(com.par.core.entity.RiskRule::getDeleted, 0) - .orderByDesc(com.par.core.entity.RiskRule::getId)); - List> result = new ArrayList<>(); - for (var r : list) { - Map m = new LinkedHashMap<>(); - m.put("id", r.getId()); m.put("version", r.getVersion()); - m.put("createdAt", r.getCreatedAt()); m.put("updatedAt", r.getUpdatedAt()); - result.add(m); - } - return ApiResponse.success(result); + return ApiResponse.success(riskRuleService.listVersions(siteType)); } - /** 获取指定版本风险规则内容 */ @GetMapping("/api/v1/admin/risk-rules/{siteType}/version/{version}") - public ApiResponse> getVersion( + public ApiResponse> getContentByVersion( @PathVariable String siteType, @PathVariable int version, HttpServletRequest request) { checkAdmin(request); - var mapper = ((com.par.core.service.impl.RiskRuleServiceImpl) riskRuleService).mapper; - var r = mapper.selectOne( - new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() - .eq(com.par.core.entity.RiskRule::getSiteType, siteType) - .eq(com.par.core.entity.RiskRule::getVersion, version) - .eq(com.par.core.entity.RiskRule::getDeleted, 0)); - if (r == null) return ApiResponse.error(404, "版本不存在"); - Map result = new LinkedHashMap<>(); - result.put("siteType", siteType); result.put("version", r.getVersion()); - result.put("content", r.getRulesJson()); - return ApiResponse.success(result); + String content = riskRuleService.getVersionContent(siteType, version); + if (content == null) return ApiResponse.error(404, "版本不存在"); + return ApiResponse.success(Map.of("siteType", siteType, "version", version, "content", content)); } - /** 获取或保存默认风险规则模板 */ @GetMapping("/api/v1/admin/default-rules/{type}") public ApiResponse> getDefaultRules(@PathVariable String type, HttpServletRequest request) { checkAdmin(request); diff --git a/par-api/src/main/java/com/par/api/controller/SitePagesController.java b/par-api/src/main/java/com/par/api/controller/SitePagesController.java index 538cf24..ce02b0d 100644 --- a/par-api/src/main/java/com/par/api/controller/SitePagesController.java +++ b/par-api/src/main/java/com/par/api/controller/SitePagesController.java @@ -5,15 +5,11 @@ import com.par.core.service.SitePagesService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; -/** - * 站点页面配置接口 - */ @Slf4j @RestController @RequiredArgsConstructor @@ -21,7 +17,6 @@ public class SitePagesController { private final SitePagesService sitePagesService; - /** 获取站点页面配置 */ @GetMapping("/api/v1/sites/{siteId}/pages") public ApiResponse> getPages(@PathVariable String siteId) { Map data = sitePagesService.getPages(siteId); @@ -29,45 +24,36 @@ public class SitePagesController { return ApiResponse.success(data); } - /** 获取页面配置版本 */ @GetMapping("/api/v1/sites/{siteId}/pages/version") public ApiResponse> getVersion(@PathVariable String siteId) { String v = sitePagesService.getVersion(siteId); return ApiResponse.success(Map.of("version", v != null ? v : "0")); } - /** 上传/更新页面配置(PSK 签名认证) */ @PutMapping("/api/v1/sites/{siteId}/pages") public ApiResponse savePages( - @PathVariable String siteId, - @RequestBody Map payload, - HttpServletRequest request) { + @PathVariable String siteId, @RequestBody Map payload) { @SuppressWarnings("unchecked") - List> entries = (List>) payload.get("entries"); - if (entries == null || entries.isEmpty()) { - return ApiResponse.error(400, "entries is required"); - } + var entries = (List>) payload.get("entries"); + if (entries == null || entries.isEmpty()) return ApiResponse.error(400, "entries is required"); sitePagesService.savePages(siteId, entries); return ApiResponse.success(); } - /** 管理员查看所有站点页面配置列表 */ @GetMapping("/api/v1/admin/site-pages") public ApiResponse>> adminList(HttpServletRequest request) { checkAdmin(request); return ApiResponse.success(sitePagesService.listAll()); } - - /** 管理员查看某站点页面配置内容 */ + @GetMapping("/api/v1/admin/site-pages/{siteId}") public ApiResponse> adminGet(@PathVariable String siteId, HttpServletRequest request) { checkAdmin(request); - Map data = sitePagesService.getPages(siteId); + var data = sitePagesService.getPages(siteId); if (data == null) return ApiResponse.error(404, "页面配置不存在"); return ApiResponse.success(data); } - /** 管理员删除站点页面配置 */ @DeleteMapping("/api/v1/admin/site-pages/{siteId}") public ApiResponse adminDelete(@PathVariable String siteId, HttpServletRequest request) { checkAdmin(request); @@ -75,56 +61,27 @@ public class SitePagesController { return ApiResponse.success(); } - /** 获取页面配置版本历史 */ @GetMapping("/api/v1/admin/site-pages/{siteId}/versions") public ApiResponse>> versions(@PathVariable String siteId, HttpServletRequest request) { checkAdmin(request); - var mapper = ((com.par.core.service.impl.SitePagesServiceImpl) sitePagesService).mapper; - var list = mapper.selectList( - new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() - .eq(com.par.core.entity.SitePages::getSiteId, siteId) - .eq(com.par.core.entity.SitePages::getDeleted, 0) - .orderByDesc(com.par.core.entity.SitePages::getId)); - List> result = new ArrayList<>(); - for (var p : list) { - Map m = new LinkedHashMap<>(); - m.put("id", p.getId()); - m.put("version", p.getVersion()); - m.put("createdAt", p.getCreatedAt()); - m.put("updatedAt", p.getUpdatedAt()); - result.add(m); - } - return ApiResponse.success(result); + return ApiResponse.success(sitePagesService.listVersions(siteId)); } - /** 获取指定版本页面配置内容 */ @GetMapping("/api/v1/admin/site-pages/{siteId}/version/{version}") - public ApiResponse> getVersion( + public ApiResponse> getContentByVersion( @PathVariable String siteId, @PathVariable String version, HttpServletRequest request) { checkAdmin(request); - var mapper = ((com.par.core.service.impl.SitePagesServiceImpl) sitePagesService).mapper; - var p = mapper.selectOne( - new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() - .eq(com.par.core.entity.SitePages::getSiteId, siteId) - .eq(com.par.core.entity.SitePages::getVersion, version) - .eq(com.par.core.entity.SitePages::getDeleted, 0)); - if (p == null) return ApiResponse.error(404, "版本不存在"); - Map result = new LinkedHashMap<>(); - result.put("siteId", siteId); - result.put("version", p.getVersion()); - result.put("content", p.getEntriesJson()); - return ApiResponse.success(result); + String content = sitePagesService.getVersionContent(siteId, version); + if (content == null) return ApiResponse.error(404, "版本不存在"); + return ApiResponse.success(Map.of("siteId", siteId, "version", version, "content", content)); } - /** 获取或保存默认页面模板 */ @GetMapping("/api/v1/admin/default-pages/{type}") public ApiResponse> getDefaultPages(@PathVariable String type, HttpServletRequest request) { checkAdmin(request); String defaultId = "default:" + type; Map data = sitePagesService.getPages(defaultId); - if (data == null) { - data = Map.of("siteId", defaultId, "version", "0", "entries", List.of()); - } + if (data == null) data = Map.of("siteId", defaultId, "version", "0", "entries", List.of()); return ApiResponse.success(data); } diff --git a/par-core/src/main/java/com/par/core/service/RiskRuleService.java b/par-core/src/main/java/com/par/core/service/RiskRuleService.java index 707034f..2cf3649 100644 --- a/par-core/src/main/java/com/par/core/service/RiskRuleService.java +++ b/par-core/src/main/java/com/par/core/service/RiskRuleService.java @@ -14,4 +14,8 @@ public interface RiskRuleService { List> listAll(); /** 删除风险规则 */ void deleteRules(String siteType); + /** 获取版本历史列表 */ + List> listVersions(String siteType); + /** 获取指定版本内容 */ + String getVersionContent(String siteType, int version); } diff --git a/par-core/src/main/java/com/par/core/service/SitePagesService.java b/par-core/src/main/java/com/par/core/service/SitePagesService.java index d297f11..2e0716f 100644 --- a/par-core/src/main/java/com/par/core/service/SitePagesService.java +++ b/par-core/src/main/java/com/par/core/service/SitePagesService.java @@ -14,4 +14,8 @@ public interface SitePagesService { List> listAll(); /** 删除站点页面配置 */ void deletePages(String siteId); + /** 获取版本历史列表 */ + List> listVersions(String siteId); + /** 获取指定版本内容 */ + String getVersionContent(String siteId, String version); } diff --git a/par-core/src/main/java/com/par/core/service/impl/RiskRuleServiceImpl.java b/par-core/src/main/java/com/par/core/service/impl/RiskRuleServiceImpl.java index 7a54444..d4b1090 100644 --- a/par-core/src/main/java/com/par/core/service/impl/RiskRuleServiceImpl.java +++ b/par-core/src/main/java/com/par/core/service/impl/RiskRuleServiceImpl.java @@ -69,6 +69,26 @@ public class RiskRuleServiceImpl implements RiskRuleService { } } + @Override + public List> listVersions(String siteType) { + var list = mapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(RiskRule::getSiteType, siteType).eq(RiskRule::getDeleted, 0) + .orderByDesc(RiskRule::getId)); + List> result = new ArrayList<>(); + for (var r : list) { + result.add(Map.of("version", r.getVersion(), "createdAt", r.getCreatedAt() != null ? r.getCreatedAt().toString() : "")); + } + return result; + } + + @Override + public String getVersionContent(String siteType, int version) { + var r = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(RiskRule::getSiteType, siteType).eq(RiskRule::getVersion, version) + .eq(RiskRule::getDeleted, 0)); + return r != null ? r.getRulesJson() : null; + } + @Override public void deleteRules(String siteType) { mapper.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() diff --git a/par-core/src/main/java/com/par/core/service/impl/SitePagesServiceImpl.java b/par-core/src/main/java/com/par/core/service/impl/SitePagesServiceImpl.java index 0353f0b..014f5c9 100644 --- a/par-core/src/main/java/com/par/core/service/impl/SitePagesServiceImpl.java +++ b/par-core/src/main/java/com/par/core/service/impl/SitePagesServiceImpl.java @@ -76,6 +76,26 @@ public class SitePagesServiceImpl implements SitePagesService { } } + @Override + public List> listVersions(String siteId) { + var list = mapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(SitePages::getSiteId, siteId).eq(SitePages::getDeleted, 0) + .orderByDesc(SitePages::getId)); + List> result = new ArrayList<>(); + for (var p : list) { + result.add(Map.of("version", p.getVersion(), "createdAt", p.getCreatedAt() != null ? p.getCreatedAt().toString() : "")); + } + return result; + } + + @Override + public String getVersionContent(String siteId, String version) { + var p = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(SitePages::getSiteId, siteId).eq(SitePages::getVersion, version) + .eq(SitePages::getDeleted, 0)); + return p != null ? p.getEntriesJson() : null; + } + @Override public void deletePages(String siteId) { mapper.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper()