fix: 解决 ConfigServiceImpl 与 SiteSnapshotServiceImpl 循环依赖

- 移除 SiteSnapshotServiceImpl 对 ConfigService 的依赖,直接使用 SiteConfigMapper
- ConfigServiceImpl/SitePagesServiceImpl/RiskRuleServiceImpl 改用 ApplicationEvent 异步触发快照更新
- 新增 SnapshotUpdateEvent 和 SnapshotUpdateListener
- ParApplication 添加 @EnableAsync 支持异步事件处理
- AdminController 中 updateSnapshot 调用改为发布事件
This commit is contained in:
mediabot-pt
2026-07-07 11:17:22 +08:00
parent b25aa82c73
commit c823878ae0
9 changed files with 344 additions and 20 deletions

View File

@@ -3,9 +3,11 @@ package com.par.api;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication(scanBasePackages = {"com.par"})
@MapperScan("com.par.core.mapper")
@EnableAsync
public class ParApplication {
public static void main(String[] args) {

View File

@@ -9,6 +9,7 @@ import com.par.core.entity.Psk;
import com.par.core.entity.SiteConfig;
import com.par.core.enums.ConfigStatus;
import com.par.core.enums.TrustLevel;
import com.par.core.event.SnapshotUpdateEvent;
import com.par.core.mapper.AccountMapper;
import com.par.core.mapper.ConfigReviewMapper;
import com.par.core.mapper.SiteConfigMapper;
@@ -53,6 +54,7 @@ public class AdminController {
private final com.par.core.service.SitePagesService sitePagesService;
private final com.par.core.service.RiskRuleService riskRuleService;
private final com.par.core.service.SiteSnapshotService snapshotService;
private final org.springframework.context.ApplicationEventPublisher eventPublisher;
/**
* 获取所有用户列表
@@ -128,8 +130,8 @@ public class AdminController {
}
log.info("Config approved: id={}, reviewer={}", reviewId, reviewerId);
// 触发快照更新
try { snapshotService.updateSnapshot(config.getSiteId()); } catch (Exception e) { log.warn("快照更新失败 siteId={}: {}", config.getSiteId(), e.getMessage()); }
// 发布事件,异步触发快照更新
eventPublisher.publishEvent(new SnapshotUpdateEvent(config.getSiteId()));
return ApiResponse.success();
}