feat: mediabo接口实现(pages/scripts/risk-rules)+DB迁移脚本

This commit is contained in:
mediabot-pt
2026-07-04 23:35:45 +08:00
parent c0fc17cf05
commit 2ced6f5dcb
13 changed files with 572 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
package com.par.core.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 风险规则实体
*/
@Data
@TableName("risk_rules")
public class RiskRule {
@TableId(type = IdType.AUTO)
private Long id;
@TableField("site_type")
private String siteType;
@TableField("version")
private Integer version;
@TableField("rules_json")
private String rulesJson;
@TableLogic
@TableField("deleted")
private Integer deleted;
@TableField(value = "created_at", fill = FieldFill.INSERT)
private LocalDateTime createdAt;
@TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt;
}

View File

@@ -0,0 +1,36 @@
package com.par.core.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 站点页面配置实体
*/
@Data
@TableName("site_pages")
public class SitePages {
@TableId(type = IdType.AUTO)
private Long id;
@TableField("site_id")
private String siteId;
@TableField("version")
private String version;
@TableField("entries_json")
private String entriesJson;
@TableLogic
@TableField("deleted")
private Integer deleted;
@TableField(value = "created_at", fill = FieldFill.INSERT)
private LocalDateTime createdAt;
@TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt;
}

View File

@@ -0,0 +1,9 @@
package com.par.core.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.par.core.entity.RiskRule;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RiskRuleMapper extends BaseMapper<RiskRule> {
}

View File

@@ -0,0 +1,9 @@
package com.par.core.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.par.core.entity.SitePages;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SitePagesMapper extends BaseMapper<SitePages> {
}

View File

@@ -0,0 +1,15 @@
package com.par.core.service;
import java.util.List;
import java.util.Map;
public interface RiskRuleService {
/** 获取指定站点类型的风险规则 */
Map<String, Object> getRules(String siteType);
/** 获取规则版本号 */
int getVersion(String siteType);
/** 保存规则 */
void saveRules(String siteType, List<Map<String, Object>> rules);
/** 获取所有规则列表(管理员) */
List<Map<String, Object>> listAll();
}

View File

@@ -0,0 +1,15 @@
package com.par.core.service;
import java.util.List;
import java.util.Map;
public interface SitePagesService {
/** 获取站点页面配置 */
Map<String, Object> getPages(String siteId);
/** 获取页面配置版本号 */
String getVersion(String siteId);
/** 保存/更新页面配置 */
void savePages(String siteId, List<Map<String, Object>> entries);
/** 获取所有站点页面配置列表(管理员) */
List<Map<String, Object>> listAll();
}

View File

@@ -0,0 +1,83 @@
package com.par.core.service.impl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.par.core.entity.RiskRule;
import com.par.core.mapper.RiskRuleMapper;
import com.par.core.service.RiskRuleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.*;
@Slf4j
@Service
@RequiredArgsConstructor
public class RiskRuleServiceImpl implements RiskRuleService {
private final RiskRuleMapper mapper;
private static final ObjectMapper om = new ObjectMapper();
@Override
public Map<String, Object> getRules(String siteType) {
RiskRule rr = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteType, siteType).eq(RiskRule::getDeleted, 0)
.orderByDesc(RiskRule::getId).last("limit 1"));
if (rr == null) return null;
try {
List<Map<String, Object>> rules = om.readValue(rr.getRulesJson(),
new TypeReference<List<Map<String, Object>>>() {});
Map<String, Object> result = new LinkedHashMap<>();
result.put("version", rr.getVersion());
result.put("updatedAt", rr.getUpdatedAt());
result.put("rules", rules);
return result;
} catch (Exception e) {
log.error("解析风险规则失败 siteType={}", siteType, e);
return null;
}
}
@Override
public int getVersion(String siteType) {
RiskRule rr = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteType, siteType).eq(RiskRule::getDeleted, 0)
.orderByDesc(RiskRule::getId).last("limit 1"));
return rr != null ? rr.getVersion() : 0;
}
@Override
public void saveRules(String siteType, List<Map<String, Object>> rules) {
try {
String json = om.writeValueAsString(rules);
int nextVer = getVersion(siteType) + 1;
RiskRule rr = new RiskRule();
rr.setSiteType(siteType);
rr.setVersion(nextVer);
rr.setRulesJson(json);
mapper.insert(rr);
log.info("风险规则已保存: siteType={}, version={}", siteType, nextVer);
} catch (Exception e) {
log.error("保存风险规则失败 siteType={}", siteType, e);
throw new RuntimeException("保存失败: " + e.getMessage());
}
}
@Override
public List<Map<String, Object>> listAll() {
List<RiskRule> all = mapper.selectList(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getDeleted, 0));
List<Map<String, Object>> result = new ArrayList<>();
for (RiskRule rr : all) {
Map<String, Object> m = new LinkedHashMap<>();
m.put("id", rr.getId());
m.put("siteType", rr.getSiteType());
m.put("version", rr.getVersion());
m.put("updatedAt", rr.getUpdatedAt());
result.add(m);
}
return result;
}
}

View File

@@ -0,0 +1,89 @@
package com.par.core.service.impl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.par.core.entity.SitePages;
import com.par.core.mapper.SitePagesMapper;
import com.par.core.service.SitePagesService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.*;
@Slf4j
@Service
@RequiredArgsConstructor
public class SitePagesServiceImpl implements SitePagesService {
private final SitePagesMapper mapper;
private static final ObjectMapper om = new ObjectMapper();
@Override
public Map<String, Object> getPages(String siteId) {
SitePages sp = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<SitePages>()
.eq(SitePages::getSiteId, siteId).eq(SitePages::getDeleted, 0)
.orderByDesc(SitePages::getId).last("limit 1"));
if (sp == null) return null;
try {
List<Map<String, Object>> entries = om.readValue(sp.getEntriesJson(),
new TypeReference<List<Map<String, Object>>>() {});
Map<String, Object> result = new LinkedHashMap<>();
result.put("siteId", siteId);
result.put("version", sp.getVersion());
result.put("entries", entries);
result.put("updatedAt", sp.getUpdatedAt());
return result;
} catch (Exception e) {
log.error("解析页面配置失败 siteId={}", siteId, e);
return null;
}
}
@Override
public String getVersion(String siteId) {
SitePages sp = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<SitePages>()
.eq(SitePages::getSiteId, siteId).eq(SitePages::getDeleted, 0)
.orderByDesc(SitePages::getId).last("limit 1"));
return sp != null ? sp.getVersion() : null;
}
@Override
public void savePages(String siteId, List<Map<String, Object>> entries) {
try {
String json = om.writeValueAsString(entries);
// 版本号递增
String currentVer = getVersion(siteId);
int nextVer = 1;
if (currentVer != null) {
try { nextVer = Integer.parseInt(currentVer) + 1; } catch (NumberFormatException e) { /* keep 1 */ }
}
SitePages sp = new SitePages();
sp.setSiteId(siteId);
sp.setVersion(String.valueOf(nextVer));
sp.setEntriesJson(json);
mapper.insert(sp);
log.info("页面配置已保存: siteId={}, version={}", siteId, nextVer);
} catch (Exception e) {
log.error("保存页面配置失败 siteId={}", siteId, e);
throw new RuntimeException("保存页面配置失败: " + e.getMessage());
}
}
@Override
public List<Map<String, Object>> listAll() {
List<SitePages> all = mapper.selectList(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<SitePages>()
.eq(SitePages::getDeleted, 0));
List<Map<String, Object>> result = new ArrayList<>();
for (SitePages sp : all) {
Map<String, Object> m = new LinkedHashMap<>();
m.put("id", sp.getId());
m.put("siteId", sp.getSiteId());
m.put("version", sp.getVersion());
m.put("updatedAt", sp.getUpdatedAt());
result.add(m);
}
return result;
}
}