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 0363e2c..0803d53 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,6 +37,10 @@ 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)"); 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 e150333..8f3212e 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 @@ -30,6 +30,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class ManifestController { + private final com.par.core.service.ManifestVersionService versionService; private final SiteMapper siteMapper; private final SiteConfigMapper siteConfigMapper; private final com.par.core.mapper.SitePagesMapper sitePagesMapper; @@ -88,7 +89,7 @@ public class ManifestController { } Map manifest = new HashMap<>(); - manifest.put("version", "1.0"); + manifest.put("version", versionService.current()); manifest.put("sites", entries); return ResponseEntity.ok().eTag(etag).body(ApiResponse.success(manifest)); 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 new file mode 100644 index 0000000..cd5da1e --- /dev/null +++ b/par-core/src/main/java/com/par/core/service/ManifestVersionService.java @@ -0,0 +1,30 @@ +package com.par.core.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +/** + * Manifest 全局版本号管理 + * 任何站点/页面/规则/脚本变更时递增,mediabot 据此判断是否需要拉取最新数据 + */ +@Slf4j +@Service +@RequiredArgsConstructor +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; + } + + /** 递增版本号并返回新值 */ + public int increment() { + jdbc.update("UPDATE manifest_version SET version = version + 1, updated_at = NOW() WHERE id=1"); + return current(); + } +} 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 b5106bf..1cc3d8c 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 @@ -17,6 +17,7 @@ import java.util.stream.Collectors; @Service public class ConfigServiceImpl implements ConfigService { + private final ManifestVersionService versionService; private final SiteConfigMapper siteConfigMapper; private final CachedStorageService storageService; @@ -71,6 +72,7 @@ public class ConfigServiceImpl implements ConfigService { config.setIsLatest(false); siteConfigMapper.insert(config); + versionService.increment(); 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 d4b1090..871c477 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 @@ -16,6 +16,7 @@ import java.util.*; @RequiredArgsConstructor public class RiskRuleServiceImpl implements RiskRuleService { + private final ManifestVersionService versionService; private final RiskRuleMapper mapper; private final com.par.core.storage.CachedStorageService storageService; private static final ObjectMapper om = new ObjectMapper(); @@ -62,6 +63,7 @@ public class RiskRuleServiceImpl implements RiskRuleService { // 存七牛云 + 本地缓存 String storagePath = String.format("rules/%s/v%d.json", siteType, nextVer); storageService.store(storagePath, json); + versionService.increment(); 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 014f5c9..142b4b4 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 @@ -16,6 +16,7 @@ import java.util.*; @RequiredArgsConstructor public class SitePagesServiceImpl implements SitePagesService { + private final ManifestVersionService versionService; private final SitePagesMapper mapper; private final com.par.core.storage.CachedStorageService storageService; private static final ObjectMapper om = new ObjectMapper(); @@ -69,6 +70,7 @@ public class SitePagesServiceImpl implements SitePagesService { // 存七牛云 + 本地缓存 String storagePath = String.format("pages/%s/v%s.json", siteId, version); storageService.store(storagePath, json); + versionService.increment(); 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 266f551..1d03a1c 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 @@ -29,6 +29,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class SiteServiceImpl implements SiteService { + private final ManifestVersionService versionService; private final SiteMapper siteMapper; private final SiteChangeMapper changeMapper; private final SiteConfigMapper siteConfigMapper; @@ -231,6 +232,7 @@ public class SiteServiceImpl implements SiteService { try { site.setStatus(SiteStatus.fromValue(status)); } catch (Exception ignored) {} } siteMapper.updateById(site); + versionService.increment(); log.info("站点编辑: siteId={}", siteId); return site; }