From 4ac61a18681a10580be24811e3a3445598548995 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Sun, 5 Jul 2026 19:09:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=A1=B5=E9=9D=A2+=E8=A7=84?= =?UTF-8?q?=E5=88=99=E5=AD=98=E4=B8=83=E7=89=9B=E4=BA=91=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E7=BC=93=E5=AD=98+=E7=89=88=E6=9C=AC=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/controller/RiskRuleController.java | 38 +++++++++++++++++ .../api/controller/SitePagesController.java | 41 +++++++++++++++++++ .../service/impl/RiskRuleServiceImpl.java | 9 +++- .../service/impl/SitePagesServiceImpl.java | 12 ++++-- 4 files changed, 95 insertions(+), 5 deletions(-) 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 e6179a0..d79edee 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 @@ -73,6 +73,44 @@ 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); + } + + /** 获取指定版本风险规则内容 */ + @GetMapping("/api/v1/admin/risk-rules/{siteType}/version/{version}") + public ApiResponse> getVersion( + @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); + } + private void checkAdmin(HttpServletRequest request) { var level = request.getAttribute("trustLevel"); if (level == null || !"ADMIN".equals(level.toString())) { 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 2b973ff..d7eec78 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 @@ -75,6 +75,47 @@ 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); + } + + /** 获取指定版本页面配置内容 */ + @GetMapping("/api/v1/admin/site-pages/{siteId}/version/{version}") + public ApiResponse> getVersion( + @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); + } + private void checkAdmin(HttpServletRequest request) { var level = request.getAttribute("trustLevel"); if (level == null || !"ADMIN".equals(level.toString())) { 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 f6d0b0d..7a54444 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 @@ -17,6 +17,7 @@ import java.util.*; public class RiskRuleServiceImpl implements RiskRuleService { private final RiskRuleMapper mapper; + private final com.par.core.storage.CachedStorageService storageService; private static final ObjectMapper om = new ObjectMapper(); @Override @@ -50,14 +51,18 @@ public class RiskRuleServiceImpl implements RiskRuleService { @Override public void saveRules(String siteType, List> rules) { try { - String json = om.writeValueAsString(rules); + String json = om.writerWithDefaultPrettyPrinter().writeValueAsString(rules); int nextVer = getVersion(siteType) + 1; + // 存 DB RiskRule rr = new RiskRule(); rr.setSiteType(siteType); rr.setVersion(nextVer); rr.setRulesJson(json); mapper.insert(rr); - log.info("风险规则已保存: siteType={}, version={}", siteType, nextVer); + // 存七牛云 + 本地缓存 + String storagePath = String.format("rules/%s/v%d.json", siteType, nextVer); + storageService.store(storagePath, json); + log.info("风险规则已保存: siteType={}, version={}, path={}", siteType, nextVer, storagePath); } catch (Exception e) { log.error("保存风险规则失败 siteType={}", siteType, e); throw new RuntimeException("保存失败: " + e.getMessage()); 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 3224d83..0353f0b 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 @@ -17,6 +17,7 @@ import java.util.*; public class SitePagesServiceImpl implements SitePagesService { private final SitePagesMapper mapper; + private final com.par.core.storage.CachedStorageService storageService; private static final ObjectMapper om = new ObjectMapper(); @Override @@ -51,19 +52,24 @@ public class SitePagesServiceImpl implements SitePagesService { @Override public void savePages(String siteId, List> entries) { try { - String json = om.writeValueAsString(entries); + String json = om.writerWithDefaultPrettyPrinter().writeValueAsString(entries); // 版本号递增 String currentVer = getVersion(siteId); int nextVer = 1; if (currentVer != null) { try { nextVer = Integer.parseInt(currentVer) + 1; } catch (NumberFormatException e) { /* keep 1 */ } } + String version = String.valueOf(nextVer); + // 存 DB SitePages sp = new SitePages(); sp.setSiteId(siteId); - sp.setVersion(String.valueOf(nextVer)); + sp.setVersion(version); sp.setEntriesJson(json); mapper.insert(sp); - log.info("页面配置已保存: siteId={}, version={}", siteId, nextVer); + // 存七牛云 + 本地缓存 + String storagePath = String.format("pages/%s/v%s.json", siteId, version); + storageService.store(storagePath, json); + log.info("页面配置已保存: siteId={}, version={}, path={}", siteId, version, storagePath); } catch (Exception e) { log.error("保存页面配置失败 siteId={}", siteId, e); throw new RuntimeException("保存页面配置失败: " + e.getMessage());