From 7138817e2cdf0c1e6693a2f2981f2b4554dd202b Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Mon, 20 Jul 2026 09:51:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(payment):=20=E5=8A=A0=20useEnvStore=20?= =?UTF-8?q?=E5=85=B1=E4=BA=AB=E6=B2=99=E7=AE=B1=E5=BC=80=E5=85=B3=E7=8A=B6?= =?UTF-8?q?=E6=80=81,=20ProductConfig=20=E5=8A=A0=E6=B2=99=E7=AE=B1?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 部署级沙箱隔离方案配套 UI: - 新建 Pinia store (apps/daxpay-admin/src/store/env.ts): 封装 sandboxEnabled 状态 + loadSandboxEnabled(force?), 避免多个页面重复请求同一 API - ProductConfig.vue: 复用 useEnvStore 替换局部 ref; a-card 内加 a-alert 提示 「沙箱功能仅在测试环境可用」, 仅 sandboxEnabled=true 时显示 - 补齐 10 语种 i18n (langs/{locale}/payment/common/env.json): - sandboxBanner: workspace 工作台告警文案 (留给后续 ConfigCheck 改动合并后接入) - sandboxProductConfigTip: 产品配置页 a-alert 文案 --- .../langs/en-US/payment/common/env.json | 4 ++ .../langs/id-ID/payment/common/env.json | 4 ++ .../langs/ja-JP/payment/common/env.json | 4 ++ .../langs/ko-KR/payment/common/env.json | 4 ++ .../langs/ms-MY/payment/common/env.json | 4 ++ .../langs/th-TH/payment/common/env.json | 4 ++ .../langs/vi-VN/payment/common/env.json | 4 ++ .../langs/zh-CN/payment/common/env.json | 4 ++ .../langs/zh-HK/payment/common/env.json | 4 ++ .../langs/zh-TW/payment/common/env.json | 4 ++ apps/daxpay-admin/src/store/env.ts | 40 +++++++++++++++++++ apps/daxpay-admin/src/store/index.ts | 1 + .../payment/config/product/ProductConfig.vue | 36 ++++++++++------- 13 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 apps/daxpay-admin/src/locales/langs/en-US/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/id-ID/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/ja-JP/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/ko-KR/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/ms-MY/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/th-TH/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/vi-VN/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/zh-CN/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/zh-HK/payment/common/env.json create mode 100644 apps/daxpay-admin/src/locales/langs/zh-TW/payment/common/env.json create mode 100644 apps/daxpay-admin/src/store/env.ts diff --git a/apps/daxpay-admin/src/locales/langs/en-US/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/en-US/payment/common/env.json new file mode 100644 index 000000000..eb77b680d --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/en-US/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "You are in the sandbox environment. No real transactions will occur.", + "sandboxProductConfigTip": "Sandbox features are only available in the test environment. In production deployments, the sandbox switch is forced off and all data is guaranteed to be production data." +} diff --git a/apps/daxpay-admin/src/locales/langs/id-ID/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/id-ID/payment/common/env.json new file mode 100644 index 000000000..f60777fdc --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/id-ID/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "Ini adalah lingkungan sandbox. Tidak ada transaksi nyata yang akan terjadi.", + "sandboxProductConfigTip": "Fitur sandbox hanya tersedia di lingkungan pengujian. Pada deployment produksi, sakelar sandbox dipaksa mati dan semua data dijamin sebagai data produksi." +} diff --git a/apps/daxpay-admin/src/locales/langs/ja-JP/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/ja-JP/payment/common/env.json new file mode 100644 index 000000000..cef07f50d --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/ja-JP/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "現在はサンドボックス環境です。実際の取引は発生しません。", + "sandboxProductConfigTip": "サンドボックス機能はテスト環境でのみ利用できます。本番デプロイではサンドボックススイッチが強制的にオフになり、すべてのデータは本番データであることが保証されます。" +} diff --git a/apps/daxpay-admin/src/locales/langs/ko-KR/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/ko-KR/payment/common/env.json new file mode 100644 index 000000000..8d3f96d3f --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/ko-KR/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "현재 샌드박스 환경입니다. 실제 거래가 발생하지 않습니다.", + "sandboxProductConfigTip": "샌드박스 기능은 테스트 환경에서만 사용할 수 있습니다. 프로덕션 배포에서는 샌드박스 스위치가 강제로 꺼지며 모든 데이터는 프로덕션 데이터로 보장됩니다." +} diff --git a/apps/daxpay-admin/src/locales/langs/ms-MY/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/ms-MY/payment/common/env.json new file mode 100644 index 000000000..c8cb837e3 --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/ms-MY/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "Ini adalah persekitaran sandbox. Tiada urus niaga sebenar akan berlaku.", + "sandboxProductConfigTip": "Ciri sandbox hanya tersedia di persekitaran ujian. Pada pengeluaran, suis sandbox dipaksa dimatikan dan semua data dijamin sebagai data pengeluaran." +} diff --git a/apps/daxpay-admin/src/locales/langs/th-TH/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/th-TH/payment/common/env.json new file mode 100644 index 000000000..4ddbe0e93 --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/th-TH/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "นี่คือสภาพแวดล้อมแซนด์บ็อกซ์ จะไม่มีธุรกรรมจริงเกิดขึ้น", + "sandboxProductConfigTip": "คุณสมบัติแซนด์บ็อกซ์ใช้ได้เฉพาะในสภาพแวดล้อมทดสอบ เมื่อปรับใช้งานจริง สวิตช์แซนด์บ็อกซ์จะถูกบังคับปิดและรับประกันว่าข้อมูลทั้งหมดเป็นข้อมูลการผลิต" +} diff --git a/apps/daxpay-admin/src/locales/langs/vi-VN/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/vi-VN/payment/common/env.json new file mode 100644 index 000000000..1b92b26e7 --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/vi-VN/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "Đây là môi trường sandbox. Không có giao dịch thực nào sẽ xảy ra.", + "sandboxProductConfigTip": "Tính năng sandbox chỉ khả dụng trong môi trường thử nghiệm. Khi triển khai sản xuất, công tắc sandbox bị tắt cưỡng bức và mọi dữ liệu được đảm bảo là dữ liệu sản xuất." +} diff --git a/apps/daxpay-admin/src/locales/langs/zh-CN/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/zh-CN/payment/common/env.json new file mode 100644 index 000000000..9f1364602 --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/zh-CN/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "当前为测试环境,所有交易不会真实发生", + "sandboxProductConfigTip": "沙箱功能仅在测试环境可用。生产环境部署时,沙箱开关将被强制关闭,所有数据保证为生产数据。" +} diff --git a/apps/daxpay-admin/src/locales/langs/zh-HK/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/zh-HK/payment/common/env.json new file mode 100644 index 000000000..d7a7b29db --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/zh-HK/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "目前為測試環境,所有交易唔會真實發生", + "sandboxProductConfigTip": "沙箱功能僅在測試環境可用。生產環境部署時,沙箱開關將被強制關閉,所有資料保證為生產資料。" +} diff --git a/apps/daxpay-admin/src/locales/langs/zh-TW/payment/common/env.json b/apps/daxpay-admin/src/locales/langs/zh-TW/payment/common/env.json new file mode 100644 index 000000000..d8a08d72e --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/zh-TW/payment/common/env.json @@ -0,0 +1,4 @@ +{ + "sandboxBanner": "目前為測試環境,所有交易不會真實發生", + "sandboxProductConfigTip": "沙箱功能僅在測試環境可用。生產環境部署時,沙箱開關將被強制關閉,所有資料保證為生產資料。" +} diff --git a/apps/daxpay-admin/src/store/env.ts b/apps/daxpay-admin/src/store/env.ts new file mode 100644 index 000000000..27cce9b08 --- /dev/null +++ b/apps/daxpay-admin/src/store/env.ts @@ -0,0 +1,40 @@ +import { ref } from 'vue'; + +import { defineStore } from 'pinia'; + +import { PayEnvApi } from '#/api/payment/masterdata/pay-env.api'; + +/** + * 平台环境状态 store + * + * 全局缓存沙箱开关等平台级配置, 供 Layout 横幅、产品配置页等共享, 避免重复请求。 + * 生命周期: 用户登录后由 basic.vue 触发首次加载, 整个会话内复用。 + */ +export const useEnvStore = defineStore('app-env', () => { + /** 沙箱环境全局开关 (后端 daxpay.platform.config.sandbox-enabled 控制) */ + const sandboxEnabled = ref(false); + + /** 是否已完成首次加载 (避免重复请求) */ + const loaded = ref(false); + + /** + * 加载沙箱开关状态 + * + * 默认仅首次加载, 已加载后调用为 no-op; 如需刷新 (如管理员切换了全局开关) 传 force=true。 + * + * @param force 是否强制刷新 + */ + async function loadSandboxEnabled(force = false) { + if (loaded.value && !force) return; + try { + const { data } = await PayEnvApi.sandboxEnabled(); + sandboxEnabled.value = !!data; + } catch { + // 查询失败按关闭处理, 仅展示生产环境 + sandboxEnabled.value = false; + } + loaded.value = true; + } + + return { sandboxEnabled, loaded, loadSandboxEnabled }; +}); diff --git a/apps/daxpay-admin/src/store/index.ts b/apps/daxpay-admin/src/store/index.ts index b6a7763b1..426c1cdac 100644 --- a/apps/daxpay-admin/src/store/index.ts +++ b/apps/daxpay-admin/src/store/index.ts @@ -1,2 +1,3 @@ export * from './auth'; export * from './dict'; +export * from './env'; diff --git a/apps/daxpay-admin/src/views/payment/config/product/ProductConfig.vue b/apps/daxpay-admin/src/views/payment/config/product/ProductConfig.vue index de1575a05..c0e2851a9 100644 --- a/apps/daxpay-admin/src/views/payment/config/product/ProductConfig.vue +++ b/apps/daxpay-admin/src/views/payment/config/product/ProductConfig.vue @@ -1,5 +1,5 @@