From 975ec6758b8d89b87a697f9a72b8b80148ce5d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Mon, 10 Aug 2026 19:47:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(cms):=20=E5=A2=9E=E5=8A=A0=E5=86=85?= =?UTF-8?q?=E9=83=A8=E6=8E=A5=E5=8F=A3=E4=BB=A5=E6=BF=80=E6=B4=BB=E7=AB=99?= =?UTF-8?q?=E7=82=B9=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 /internal/activate POST接口,通过X-Internal-Key进行鉴权 - 实现根据请求体更新站点状态和运行标志 - 更新成功后清除对应站点缓存,保证状态及时同步 - 添加配置项 internal.key 用于内部接口密钥校验 - 处理鉴权失败和参数缺失的异常响应 - 采用日志记录缓存清理异常信息 --- .../cms/controller/CmsWebsiteController.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/main/java/com/gxwebsoft/cms/controller/CmsWebsiteController.java b/src/main/java/com/gxwebsoft/cms/controller/CmsWebsiteController.java index b2dd43e..de1e7bd 100644 --- a/src/main/java/com/gxwebsoft/cms/controller/CmsWebsiteController.java +++ b/src/main/java/com/gxwebsoft/cms/controller/CmsWebsiteController.java @@ -22,6 +22,7 @@ import com.gxwebsoft.common.system.entity.User; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -52,6 +53,9 @@ public class CmsWebsiteController extends BaseController { @Resource private CmsWebsiteSettingService cmsWebsiteSettingService; + @Value("${internal.key:websopy-internal-2025}") + private String internalKey; + private static final String SITE_INFO_KEY_PREFIX = "SiteInfo:"; private static final String MP_INFO_KEY_PREFIX = "MpInfo:"; private static final String SELECT_PAYMENT_KEY_PREFIX = "SelectPayment:"; @@ -679,5 +683,47 @@ public class CmsWebsiteController extends BaseController { return success(cmsWebsiteService.pageReviews(param)); } + /** + * 内部接口:由 websopy 支付回调在服务端调用,将站点置为「运行中(1)」。 + * 通过 X-Internal-Key 头做简单鉴权(仅限内网/可信服务调用,密钥与 websopy 端保持一致)。 + */ + @PostMapping("/internal/activate") + public ApiResult activateInternal( + @RequestHeader(value = "X-Internal-Key", required = false) String key, + @RequestBody Map body) { + if (key == null || !key.equals(internalKey)) { + return fail("非法请求"); + } + Integer websiteId = body.get("websiteId") instanceof Number + ? ((Number) body.get("websiteId")).intValue() : null; + if (websiteId == null) { + return fail("websiteId 不能为空"); + } + Integer status = body.get("status") instanceof Number + ? ((Number) body.get("status")).intValue() : 1; + Integer running = body.get("running") instanceof Number + ? ((Number) body.get("running")).intValue() : 0; + + CmsWebsite site = new CmsWebsite(); + site.setWebsiteId(websiteId); + site.setStatus(status); + site.setRunning(running); + if (cmsWebsiteService.updateById(site)) { + // 失效站点缓存,保证后台/公开站尽快读到新状态 + try { + CmsWebsite exist = cmsWebsiteService.getOne(new LambdaQueryWrapper() + .eq(CmsWebsite::getWebsiteId, websiteId).last("limit 1")); + if (exist != null && ObjectUtil.isNotEmpty(exist.getTenantId())) { + redisUtil.delete(SITE_INFO_KEY_PREFIX.concat(exist.getTenantId().toString())); + redisUtil.delete(MP_INFO_KEY_PREFIX.concat(exist.getTenantId().toString())); + } + } catch (Exception e) { + log.warn("清除站点缓存失败: {}", e.getMessage()); + } + return success("站点已激活"); + } + return fail("激活失败"); + } + }