From 85bee7a0417a7641b2709e838a85cb4a4366a392 Mon Sep 17 00:00:00 2001 From: mateaix <57164338+mateaix@users.noreply.github.com> Date: Sat, 11 Jul 2026 18:48:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(content-studio):=20=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E5=87=AD=E6=8D=AE=E8=AE=BE=E7=BD=AE+=E6=88=AA?= =?UTF-8?q?=E5=9B=BE=E5=B7=A5=E5=85=B7+=E5=B9=B3=E5=8F=B0=E8=A7=84?= =?UTF-8?q?=E8=8C=83;=20fix:=20=E5=B0=81=E9=9D=A2=E6=8C=89=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E8=87=AA=E6=84=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mate/system/model/SystemSettingsDTO.java | 8 + .../system/service/SystemSettingService.java | 16 ++ .../vip/mate/tool/builtin/GzhPackageTool.java | 85 ++++++++- .../vip/mate/tool/builtin/ScreenshotTool.java | 180 ++++++++++++++++++ .../tool/document/GeneratedFileCache.java | 66 +++++++ .../src/main/resources/db/data-en.sql | 5 + .../main/resources/db/data-kingbase-en.sql | 5 + .../main/resources/db/data-kingbase-zh.sql | 5 + .../src/main/resources/db/data-mysql-en.sql | 5 + .../src/main/resources/db/data-mysql-zh.sql | 5 + .../src/main/resources/db/data-zh.sql | 5 + .../h2/V168__content_studio_seed.sql | 15 +- .../kingbase/V168__content_studio_seed.sql | 15 +- .../mysql/V168__content_studio_seed.sql | 15 +- .../resources/skills/gzh_article/SKILL.md | 22 ++- .../references/compliance_checklist.md | 9 + .../references/gzh_platform_rules.md | 73 +++++++ .../builtin/GzhPackageCoverHealingTest.java | 99 ++++++++++ .../GeneratedFileCacheFindByFilenameTest.java | 71 +++++++ mateclaw-ui/src/i18n/locales/en-US.ts | 6 + mateclaw-ui/src/i18n/locales/zh-CN.ts | 6 + mateclaw-ui/src/types/index.ts | 3 + .../src/views/Settings/System/index.vue | 42 ++++ 23 files changed, 732 insertions(+), 29 deletions(-) create mode 100644 mateclaw-server/src/main/java/vip/mate/tool/builtin/ScreenshotTool.java create mode 100644 mateclaw-server/src/main/resources/skills/gzh_article/references/gzh_platform_rules.md create mode 100644 mateclaw-server/src/test/java/vip/mate/tool/builtin/GzhPackageCoverHealingTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/tool/document/GeneratedFileCacheFindByFilenameTest.java diff --git a/mateclaw-server/src/main/java/vip/mate/system/model/SystemSettingsDTO.java b/mateclaw-server/src/main/java/vip/mate/system/model/SystemSettingsDTO.java index 42f012a5..2687d01f 100644 --- a/mateclaw-server/src/main/java/vip/mate/system/model/SystemSettingsDTO.java +++ b/mateclaw-server/src/main/java/vip/mate/system/model/SystemSettingsDTO.java @@ -34,6 +34,14 @@ public class SystemSettingsDTO { private String serperApiKeyMasked; private String tavilyApiKeyMasked; + // ===== WeChat Official Account (公众号) publish credentials ===== + /** 公众号 AppID (plain — not sensitive). */ + private String weixinoaAppId; + /** 公众号 AppSecret — write-only from the client; never echoed in plaintext. */ + private String weixinoaAppSecret; + /** Masked AppSecret for display. */ + private String weixinoaAppSecretMasked; + // ===== 视频生成配置 ===== /** 是否启用视频生成能力 */ private Boolean videoEnabled; diff --git a/mateclaw-server/src/main/java/vip/mate/system/service/SystemSettingService.java b/mateclaw-server/src/main/java/vip/mate/system/service/SystemSettingService.java index d21431fc..589d11eb 100644 --- a/mateclaw-server/src/main/java/vip/mate/system/service/SystemSettingService.java +++ b/mateclaw-server/src/main/java/vip/mate/system/service/SystemSettingService.java @@ -30,6 +30,10 @@ public class SystemSettingService { private static final String SERPER_BASE_URL_KEY = "serperBaseUrl"; private static final String TAVILY_API_KEY_KEY = "tavilyApiKey"; private static final String TAVILY_BASE_URL_KEY = "tavilyBaseUrl"; + + // WeChat Official Account (公众号) publish credentials — read by GzhPublishTool. + private static final String WEIXINOA_APP_ID_KEY = "weixinoa.app_id"; + private static final String WEIXINOA_APP_SECRET_KEY = "weixinoa.app_secret"; private static final String DUCKDUCKGO_ENABLED_KEY = "duckduckgoEnabled"; private static final String SEARXNG_BASE_URL_KEY = "searxngBaseUrl"; @@ -139,6 +143,10 @@ public class SystemSettingService { dto.setSerperApiKeyMasked(maskApiKey(getValue(SERPER_API_KEY_KEY, ""))); dto.setTavilyApiKeyMasked(maskApiKey(getValue(TAVILY_API_KEY_KEY, ""))); + // 公众号发布凭证(AppSecret 脱敏回显,AppID 明文) + dto.setWeixinoaAppId(getValue(WEIXINOA_APP_ID_KEY, "")); + dto.setWeixinoaAppSecretMasked(maskApiKey(getValue(WEIXINOA_APP_SECRET_KEY, ""))); + // 视频生成配置 dto.setVideoEnabled(Boolean.parseBoolean(getValue(VIDEO_ENABLED_KEY, "false"))); dto.setVideoProvider(getValue(VIDEO_PROVIDER_KEY, "auto")); @@ -295,6 +303,14 @@ public class SystemSettingService { if (dto.getTavilyBaseUrl() != null) { saveValue(TAVILY_BASE_URL_KEY, dto.getTavilyBaseUrl(), "Tavily 接口地址"); } + + // 公众号发布凭证(AppSecret 仅在非空时保存,避免脱敏回显覆盖为空) + if (dto.getWeixinoaAppId() != null) { + saveValue(WEIXINOA_APP_ID_KEY, dto.getWeixinoaAppId().trim(), "公众号 AppID"); + } + if (dto.getWeixinoaAppSecret() != null && !dto.getWeixinoaAppSecret().isBlank()) { + saveValue(WEIXINOA_APP_SECRET_KEY, dto.getWeixinoaAppSecret().trim(), "公众号 AppSecret"); + } // Keyless provider 配置 if (dto.getDuckduckgoEnabled() != null) { saveValue(DUCKDUCKGO_ENABLED_KEY, String.valueOf(dto.getDuckduckgoEnabled()), "DuckDuckGo 免 Key 搜索(零配置兜底)"); diff --git a/mateclaw-server/src/main/java/vip/mate/tool/builtin/GzhPackageTool.java b/mateclaw-server/src/main/java/vip/mate/tool/builtin/GzhPackageTool.java index 3c1bec85..b4c924a9 100644 --- a/mateclaw-server/src/main/java/vip/mate/tool/builtin/GzhPackageTool.java +++ b/mateclaw-server/src/main/java/vip/mate/tool/builtin/GzhPackageTool.java @@ -101,8 +101,14 @@ public class GzhPackageTool { // 1. Markdown -> HTML fragment, then inline every style (公众号 drops