diff --git a/par-api/src/main/java/com/par/api/config/FlywayConfig.java b/par-api/src/main/java/com/par/api/config/FlywayConfig.java index 0803d53..c4fe807 100644 --- a/par-api/src/main/java/com/par/api/config/FlywayConfig.java +++ b/par-api/src/main/java/com/par/api/config/FlywayConfig.java @@ -37,10 +37,7 @@ public class FlywayConfig { "rules_json LONGTEXT NOT NULL, deleted TINYINT NOT NULL DEFAULT 0, " + "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " + "INDEX idx_site_type (site_type, deleted)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); - stmt.execute("CREATE TABLE IF NOT EXISTS manifest_version (" + - "id INT PRIMARY KEY DEFAULT 1, version INT NOT NULL DEFAULT 1, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP," + - "CHECK (id = 1)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); - stmt.execute("INSERT IGNORE INTO manifest_version (id, version) VALUES (1, 1)"); + try { stmt.execute("ALTER TABLE sites ADD COLUMN version INT NOT NULL DEFAULT 1"); } catch (Exception ex) { log.debug("version may exist"); } log.info("V15 tables initialized"); } catch (Exception e) { log.error("V15 migration failed: {}", e.getMessage()); diff --git a/par-api/src/main/java/com/par/api/controller/ManifestController.java b/par-api/src/main/java/com/par/api/controller/ManifestController.java index 8f3212e..2f64f32 100644 --- a/par-api/src/main/java/com/par/api/controller/ManifestController.java +++ b/par-api/src/main/java/com/par/api/controller/ManifestController.java @@ -61,6 +61,7 @@ public class ManifestController { entry.put("siteType", site.getSiteType() != null ? site.getSiteType().getValue() : null); entry.put("schemaVersion", site.getSchemaVersion()); entry.put("status", site.getStatus() != null ? site.getStatus().getValue() : null); + entry.put("version", site.getVersion() != null ? site.getVersion() : 1); SiteConfig latest = siteConfigMapper.selectLatestBySiteId(site.getSiteId()); if (latest != null) { diff --git a/par-core/src/main/java/com/par/core/entity/Site.java b/par-core/src/main/java/com/par/core/entity/Site.java index 6548d53..53601c4 100644 --- a/par-core/src/main/java/com/par/core/entity/Site.java +++ b/par-core/src/main/java/com/par/core/entity/Site.java @@ -55,6 +55,9 @@ public class Site { @TableField("current_config_id") private Long currentConfigId; + @TableField("version") + private Integer version; + @TableField("status") private SiteStatus status; diff --git a/par-core/src/main/java/com/par/core/service/ManifestVersionService.java b/par-core/src/main/java/com/par/core/service/ManifestVersionService.java index cd5da1e..5e34e75 100644 --- a/par-core/src/main/java/com/par/core/service/ManifestVersionService.java +++ b/par-core/src/main/java/com/par/core/service/ManifestVersionService.java @@ -6,8 +6,8 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; /** - * Manifest 全局版本号管理 - * 任何站点/页面/规则/脚本变更时递增,mediabot 据此判断是否需要拉取最新数据 + * Manifest 版本管理:每个站点独立版本,总版本 = 所有站点版本之和 + * 站点/页面/脚本变更时递增对应站点版本,规则变更时递增同类型所有站点版本 */ @Slf4j @Service @@ -16,15 +16,21 @@ public class ManifestVersionService { private final JdbcTemplate jdbc; - /** 获取当前版本号 */ + /** 全局总版本 = 所有站点版本之和 */ public int current() { - Integer v = jdbc.queryForObject("SELECT version FROM manifest_version WHERE id=1", Integer.class); - return v != null ? v : 1; + Integer v = jdbc.queryForObject("SELECT COALESCE(SUM(version), 0) FROM sites WHERE deleted=0", Integer.class); + return v != null ? v : 0; } - /** 递增版本号并返回新值 */ - public int increment() { - jdbc.update("UPDATE manifest_version SET version = version + 1, updated_at = NOW() WHERE id=1"); + /** 递增指定站点的版本号 */ + public int increment(String siteId) { + jdbc.update("UPDATE sites SET version = version + 1 WHERE site_id = ? AND deleted=0", siteId); return current(); } + + /** 递增指定类型下所有站点的版本号(用于风险规则变更) */ + public void incrementByType(String siteType) { + jdbc.update("UPDATE sites SET version = version + 1 WHERE site_type = ? AND deleted=0", + siteType); + } } diff --git a/par-core/src/main/java/com/par/core/service/impl/ConfigServiceImpl.java b/par-core/src/main/java/com/par/core/service/impl/ConfigServiceImpl.java index 1cc3d8c..3e01ee0 100644 --- a/par-core/src/main/java/com/par/core/service/impl/ConfigServiceImpl.java +++ b/par-core/src/main/java/com/par/core/service/impl/ConfigServiceImpl.java @@ -72,7 +72,7 @@ public class ConfigServiceImpl implements ConfigService { config.setIsLatest(false); siteConfigMapper.insert(config); - versionService.increment(); + versionService.increment(siteId); log.info("Config submitted: siteId={}, version={}, id={}, scriptPath={}", siteId, version, config.getId(), scriptPath); return config; } 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 871c477..f479afa 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 @@ -63,7 +63,7 @@ public class RiskRuleServiceImpl implements RiskRuleService { // 存七牛云 + 本地缓存 String storagePath = String.format("rules/%s/v%d.json", siteType, nextVer); storageService.store(storagePath, json); - versionService.increment(); + versionService.incrementByType(siteType); log.info("风险规则已保存: siteType={}, version={}, path={}", siteType, nextVer, storagePath); } catch (Exception e) { log.error("保存风险规则失败 siteType={}", siteType, e); 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 142b4b4..a0b7e4b 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 @@ -70,7 +70,7 @@ public class SitePagesServiceImpl implements SitePagesService { // 存七牛云 + 本地缓存 String storagePath = String.format("pages/%s/v%s.json", siteId, version); storageService.store(storagePath, json); - versionService.increment(); + versionService.increment(siteId); log.info("页面配置已保存: siteId={}, version={}, path={}", siteId, version, storagePath); } catch (Exception e) { log.error("保存页面配置失败 siteId={}", siteId, e); 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 1d03a1c..7bd9b98 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 @@ -232,7 +232,7 @@ public class SiteServiceImpl implements SiteService { try { site.setStatus(SiteStatus.fromValue(status)); } catch (Exception ignored) {} } siteMapper.updateById(site); - versionService.increment(); + versionService.increment(siteId); log.info("站点编辑: siteId={}", siteId); return site; }