refactor: 页面+规则存七牛云本地缓存+版本历史接口
This commit is contained in:
@@ -73,6 +73,44 @@ public class RiskRuleController {
|
||||
return ApiResponse.success();
|
||||
}
|
||||
|
||||
/** 获取风险规则版本历史 */
|
||||
@GetMapping("/api/v1/admin/risk-rules/{siteType}/versions")
|
||||
public ApiResponse<List<Map<String, Object>>> 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<com.par.core.entity.RiskRule>()
|
||||
.eq(com.par.core.entity.RiskRule::getSiteType, siteType)
|
||||
.eq(com.par.core.entity.RiskRule::getDeleted, 0)
|
||||
.orderByDesc(com.par.core.entity.RiskRule::getId));
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
for (var r : list) {
|
||||
Map<String, Object> 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<Map<String, Object>> 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<com.par.core.entity.RiskRule>()
|
||||
.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<String, Object> 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())) {
|
||||
|
||||
@@ -75,6 +75,47 @@ public class SitePagesController {
|
||||
return ApiResponse.success();
|
||||
}
|
||||
|
||||
/** 获取页面配置版本历史 */
|
||||
@GetMapping("/api/v1/admin/site-pages/{siteId}/versions")
|
||||
public ApiResponse<List<Map<String, Object>>> 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<com.par.core.entity.SitePages>()
|
||||
.eq(com.par.core.entity.SitePages::getSiteId, siteId)
|
||||
.eq(com.par.core.entity.SitePages::getDeleted, 0)
|
||||
.orderByDesc(com.par.core.entity.SitePages::getId));
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
for (var p : list) {
|
||||
Map<String, Object> 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<Map<String, Object>> 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<com.par.core.entity.SitePages>()
|
||||
.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<String, Object> 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())) {
|
||||
|
||||
@@ -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<Map<String, Object>> 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());
|
||||
|
||||
@@ -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<Map<String, Object>> 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());
|
||||
|
||||
Reference in New Issue
Block a user