Appearance
01 · 多商户与租户配置
0. 文档说明
| 项 | 内容 |
|---|---|
| 版本 | V1.0 |
这是地基中的地基。所有其他系统(02–17)都从这里读「这个子平台该是什么样」。
一、定位与职责
定义如何用一份引擎开出上百套独立子平台:
- 租户(商户/子平台)的数据模型、层级与生命周期;
- 一租户 = 一「本位币站」= 一国市场的建站模型:一站一国、一商户多站(包网引擎的核心卖点,无限开站服务多国);
- 域名 → 租户的解析(前端启动的第 0 步:「我是谁」);
- 一个子平台可被配置的全部维度(功能/本位币/权益/费率/主题/布局/文案/合规);
- 配置的继承与覆盖规则、schema 校验、生效链路(bootstrap)、版本/灰度/回滚;
- 前端如何拿到「有效配置」并据此渲染。
边界:本系统只管「配置的结构、存储、合并、下发」。具体某项配置怎么被使用,归各业务分册;后台的编辑界面与权限归 15 运营后台。本位币的记账与展示规则归 02 货币与钱包;本篇只管「本位币是哪种、属哪个站型、能收哪些通道币种」这几个建站维度。
二、核心概念与数据模型
2.1 层级
Platform 平台运营方(你)
└── Tenant 租户 / 商户(一套独立子平台 = 一「本位币站」= 一国市场) ← 独立配置 / 用户 / 账本 / 域名 / 本位币
└── Site 站点(同租户下的渠道变体,可选) ← H5 / PWA / 特定落地页,多为布局差异多数场景「租户 = 子平台」即够用;Site 层用于同一运营主体下的多渠道/多域名变体,继承租户配置再做少量覆盖(Site 不改本位币——本位币锁定在租户级)。
一站一国、一商户多站(定位):一个租户就是「一套本位币、一套账本、一国市场」的完整站点;站内全链路单币种(→ 02)。一个商户可开多个租户,分别服务不同国家/币种市场(如同时开一个 CNY 站与一个 USDT 站)——这是包网引擎的核心卖点:开新站近乎零开发,一站一国、无限开站。跨站层面平台是多币种(不同站不同本位币),平台看板/跨租户对账「按币种分列」(→ 17);单站内部为单币种口径。
2.2 Tenant(租户)核心字段
| 字段 | 说明 |
|---|---|
tenantId | 租户唯一标识 |
code | 短码(用于路由/配置命名),如 global、sea01 |
name / brand | 展示名与品牌 |
status | 见 2.3 状态机 |
baseCurrency | 本位币:该站唯一记账与展示币种(→ 02)。取值即站型:CNY(CNY 站)/ USDT(USDT 站)。建站时锁定,运营中途变更属高危,须走平台审批工单(→ 15 §2.2 红区;变更需迁移账本口径,一期锁定不可变) |
region | 主运营区域,取具体国家/地区代码(ISO 3166-1,如 CN/TH/VN),驱动合规覆盖、时区、语言;一站一国。特殊值 GLOBAL = 无属地限制的兜底区域(不绑单一国家),其合规默认集取平台最严基线(见 §三.8);推荐一站一国具体代码,GLOBAL 仅作无属地站的兜底 |
timezone / defaultLocale | 时区、默认语言 |
configRef | 指向该租户当前生效的配置版本(见 §六) |
createdAt / owner | 建站时间、归属商户主体 |
2.3 租户生命周期(状态机)
平台控制台「建站」 验收通过,平台控制台「上线」
● ───────────────────────► SETUP(筹备) ───────────────────────► ACTIVE(运营)
│ │ ▲
│ 放弃建站 违规/欠费│ │整改完成
▼ ▼ │
CLOSED(关停/归档) ◄────────────── SUSPENDED(暂停)
合约终止| 状态 | 用户端 App | 商户控制台 | 说明 |
|---|---|---|---|
SETUP | 不可访问(或白名单预览) | 可配置 | 建站配置与验收阶段 |
ACTIVE | 正常 | 正常 | 运营中 |
SUSPENDED | 停服页(仅保留提现只读入口) | 只读 + 财务处理 | 违规/欠费暂停;默认冻结新增充值,保留用户提现通道;在途提现单强制了结(→ 下「资金处置」) |
CLOSED | 不可访问 | 不可访问 | 合约终止归档;须先走「资产清退期」再关停;数据归档留存,不物理删除 |
状态流转仅平台控制台可操作,全部写审计(→ 15)。
资金处置(平台级铁律:用户资金优先):租户停服/关停时用户钱包仍有真实余额(available+bonus+locked),资金处置不得只依赖线下合约,系统层保障:
SUSPENDED:默认冻结新增充值、保留用户提现通道(或按合约明确为「仅提现只读」);进行中的提现单按 04 状态机强制了结(打款完成或原额回滚WITHDRAW_ROLLBACK),不得卡死在中间态;彩金/返佣池冻结待清算。CLOSED:进入CLOSED前必须走资产清退期——公示 → 允许用户提现 N 天 → 剩余未提余额按合约划转,全程写审计;清退未完成不得直接归档。- 平台对商户欠费的处置(→ §三.10
billing)不得直接冻结用户提现;商户侧财务降级与用户资金安全分离。
2.4 域名 → 租户解析(前端启动第 0 步)
- 每租户绑定一个或多个域名(
tenant_domains表,标记主域),请求按Host解析出tenantId注入上下文(→ 00 §4.9)。 - 解析顺序:
Host匹配 → 未命中则返回平台默认页(不落任何租户)。 - 调试通道:非生产环境(或带调试密钥)允许
?tenant=<code>覆盖,用于本地与预览;生产环境忽略该参数。
2.5 配置对象 TenantConfig
配置是一棵按系统命名空间划分的树。每个业务系统认领一个顶层键,并各自维护该命名空间的 JSON Schema(见 §四.3):
jsonc
{
"meta": { "code": "global", "baseCurrency": "CNY", "region": "CN", "timezone": "UTC+8", "locale": "zh" },
// code=品牌短码(非区域);region 取具体国家代码(此 CNY 站 = CN 市场)
"features": { /* 全局功能开关,见 §三.1(纯布尔/枚举开关)*/ },
"theme": { /* → design/themes,见 §三.6 */ },
"layout": { /* → design/layouts,见 §三.6 */ },
"copy": { /* 文案覆盖键值,见 §三.7 */ },
"wallet": { /* → 02 货币与钱包(本位币 baseCurrency = 站型;站内单币种、单账户)*/ },
"deposit": { /* → 03 充值(通道币种 channelCurrency 可 ≠ 本位币,边界锁价)*/ },
"withdraw": { /* → 04 提现(本位币按提现时点锁价折出到目标通道币种)*/ },
"auth": { /* → 05 账户与认证 */ },
"level": { /* → 06 等级 */ },
"vipSalary":{ /* → 07 VIP 俸禄 */ },
"rakeback": { /* → 08 实时返水 */ },
"promo": { /* → 09 优惠活动 */ },
"task": { /* → 10 任务打码 */ },
"affiliate":{ /* → 11 返佣推广 */ },
"games": { /* → 12 游戏聚合(含场馆链路 route:原生 / CNY 映射;route 为**平台超管级配置项,商户不可见不可改**)*/ },
"risk": { /* → 14 风控(仅少量租户可见项,核心规则平台侧管理)*/ },
"notify": { /* → 16 消息通知 */ },
"records": { /* → 13 记录与账变(用户侧记录可见性)*/ },
"console": { /* → 15 运营后台(审批/安全/可见模块 visibleModules)。
visibleModules 合法枚举 = 后台二十一模块 id 全集(见 §三.9);
最终可见 = visibleModules(租户级功能面板开关)∩ RBAC view 权限(账号级,→ 15)*/ },
"report": { /* → 17 数据看板(可见域/导出)*/ },
"billing": { /* 平台向商户收取的包网费/结算计费模型(平台控制台设定,商户只读),见 §三.10 + §四.4 */ },
"compliance": { /* 区域合规覆盖,见 §三.8 */ }
}本篇定义树的骨架与合并规则;每个命名空间下的 schema 由认领系统的分册定义。
三、可配置维度(一个子平台能改什么)
3.1 功能开关 features
纯布尔/枚举开关,决定模块是否出现、走哪条形态(带参数的配置放各自命名空间,如本位币在 wallet.baseCurrency、场馆链路在 games.venues[].route):
jsonc
"features": {
"vipSalary": true, // 是否开 VIP 俸禄
"rakeback": true, // 是否开实时返水
"affiliate": true, // 是否开推广赚钱
"staking": false, // 是否开质押(USDT 站等加密站型)
"kycRequired": "onWithdraw", // never | onWithdraw | onRegister
"promoSpecMode": false // 优惠活动是否多态展示(原型 ?spec=1,验收用)
}3.2 本位币与通道 wallet / deposit / withdraw → 02/03/04
- 本位币
wallet.baseCurrency(站型):站的唯一记账与展示币种(CNY 站 / USDT 站);站内单币种、单账户、无第二币种符号;精度符号、余额口径均随本位币。 - 充/提通道币种:充值通道(
deposit)、提现通道(withdraw)可对外收付非本位币(通道币种channelCurrency与账户本位币解耦),下单/提现时点锁价折入/折出本位币入账,账本只记本位币真实值(→ 03/04)。站内不提供钱包互换/币币兑换(合规 + 敞口,→ 02 §三)。
3.3 权益门槛与费率 level / vipSalary / rakeback
等级表、升/保级门槛、各级俸禄额、返水比例矩阵 —— 全部数值化入配置,引擎只跑算法。子平台可各自定义 VIP 级数(如 8 级 / 50 级)、各级金额、返水率;金额一律以本站本位币单口径配置(单币种站下天然无歧义,金额直接单值配置)。
3.4 活动 promo → 09
启用哪些活动模板、每个活动的参数(奖金上限、打码倍数、有效期、本位币金额)、上下架、排序。
3.5 支付通道 deposit / withdraw → 03/04
开哪些充值/提现通道(法币:银行卡/云闪付/支付宝/微信/VIPPAY/GOPAY;加密:币种+网络)、限额、手续费、审核策略。通道币种可 ≠ 本位币(CNY 站收 USDT/ETH/BTC;USDT 站收 CNY 等),边界锁价折入/折出(→ 03/04)。
3.6 主题与布局 theme / layout → docs/design/
theme:选用/覆盖设计系统的主题 token(色板、圆角、字重、品牌资源)。layout:首页模块顺序、导航形态、卡片密度等布局变体。- 换皮换布局属纯展示,不触发引擎变更。
3.7 文案 copy
以文案键覆盖默认文案,支持多语言。子平台可改品牌话术、活动措辞、按钮文字,不改代码。
3.8 合规 compliance
按 region(具体国家代码,§2.2)覆盖:禁用币种/活动、强制 KYC 时机、投注/提现限额、免责声明、可见国家/地区。合规覆盖优先级最高且只收紧(见 §四)。
region=GLOBAL(无属地兜底):不绑单一国家,合规默认取平台最严基线(禁用高风险币种/活动、KYC 从严、限额取最低档),避免无属地站放开合规;推荐一站一国具体代码,GLOBAL仅作过渡兜底。
3.9 后台可见模块 console.visibleModules(→ 15)
商户侧后台可见模块面板开关,合法枚举 = 运营后台二十一模块 id 全集(→ 15 §七):
overview · reports · users · kyc · promo · tasks · notices ·
dep-orders · channels · withdraw · ledger · records · games ·
level · rebate · affiliate · risk · audit · tenant · rbac- 两套显隐机制的关系:
visibleModules是租户级功能面板开关(该站是否上架某模块),RBAC 的view权限是账号级(该角色能否看某模块,→ 15 §2.2);最终可见 = 两者交集——面板未上架或角色无view任一不满足即不可见。 - 枚举命名以二十一模块 id 为唯一口径(如
reports而非report),避免与 RBAC 模块 id 对不齐。
3.10 包网费 / 结算计费 billing(平台向商户收费模型)
平台方「靠什么向商户收费、按什么算、账期、逾期联动」的计费根基,租户级配置、建站时设定、仅平台控制台可调(商户控制台只读本站账单,→ 15 计费结算节);出账与账单状态机详见 §四.4 与 §十 billing_statements 表。
- 计费方式
billing.mode(华人包网行业标准):包网佣金 = 平台盈利(GGR / 玩家输赢) × 包网费率,按盈利抽成——GGR 是优惠/返水/俸禄/任务这些玩家返利之上的毛盈利口径,故按 GGR 算天然「不掺优惠/返水/俸禄/任务」(简单透明、可对账);与 11 推广佣金(商户付代理)是两套完全不同的东西。revShare—— 盈利分成(GGR × 率,行业标准 · 默认):包网佣金 = 当期 GGR × 费率,支持阶梯tiers(按 GGR 档不同率),可叠加保底minGuarantee;fixed—— 固定周期费(纯月费);hybrid—— 保底 + 盈利分成:应付 =max(minGuarantee, GGR × 费率)。
- 结算周期:自然月(租户时区)为周期;
settlementDay出账(默认次月 1 日生成账单),dueDays内付清(默认 7 天);逾期overdueGraceDays后提醒,累计逾期 ≥suspendOnOverdueDays(默认 15 天)触发租户SUSPENDED(即 §2.3「欠费」暂停的数据支撑)。 - 多币种结算(B2B 平台对商户):平台跨站多币种 → 账单按各站本位币出「分账单」(该站 GGR × 率);平台合并应付额用
settlementCurrency(平台指定,如 USDT)+ 当期参考汇率快照给合计。此汇率为 B2B 平台对商户结算参考口径,仅用于商户账单合并展示,不回流任何用户业务(区别于用户资金无汇率铁律,→ 02 §三)。 - 账单状态机:
DRAFT(系统生成)→ISSUED(出账下发商户)→PAID(已付) |OVERDUE(逾期);OVERDUE超阈值 → 触发租户状态工单 / 自动SUSPENDED(§2.3)。
四、继承与覆盖(合并规则)
4.1 合并链
有效配置 = 深合并以下各层,后者覆盖前者:
1. 平台默认模板 DefaultTemplate (全平台基线,保证任何键都有兜底值)
2. 区域/行业预设 Preset(可选) (如「东南亚法币预设」「全球加密预设」)
3. 租户覆盖 TenantOverride (该子平台的差异项)
4. 站点覆盖 SiteOverride(可选) (渠道/域名级微调)
5. 灰度 / A-B 覆盖(可选) (面向部分用户或时段)
6. 合规强制层 ComplianceEnforced (最高优先级,只收紧不放开)
│
▼
EffectiveConfig(引擎与前端实际读到的)4.2 合并语义
- 对象:深合并(逐键覆盖,缺失键沿用上层)。
- 数组:一律整体替换,不做逐项合并——等级表、活动列表、通道列表要改就整组给出。
- 合规层为收紧型:只能比下层更严(关币种、加严 KYC、降限额),不能放开被合规禁止的项。
4.3 Schema 校验
- 每个命名空间一份 JSON Schema,由认领系统维护(02 管
wallet.*、09 管promo.*…)。 - 发布前强制校验:类型/枚举/范围不合法 → 拒绝发布;跨键一致性(如
wallet.baseCurrency ∈ 平台币种目录、games.venues[].route=cnyMapped仅baseCurrency=USDT站可用——该项为平台超管级申报口径开关,商户不可见不可改,→ 12 §四)由认领系统提供校验函数。 - 本位币变更闸:
wallet.baseCurrency相对当前生效版本发生变化的发布,一律拦为平台审批红区(→ 15 §2.2),商户侧不得直发;一期锁定为不可变。
这套规则让「开一个新东南亚站」= 选东南亚预设 + 覆盖品牌/币种/活动几十个键,其余全部继承。
4.4 billing 命名空间(计费结算配置,平台控制台设定 · 商户只读)
jsonc
"billing": {
"mode": "revShare", // revShare(默认) | fixed | hybrid(见 §三.10)
"revShare": { // mode=revShare/hybrid 时生效;GGR 盈利分成率(%),支持阶梯
"tiers": [ // 按当期 GGR 档取费率;缺 tiers 时用单一 ratePct
{ "gteGGR": "0", "ratePct": 30 },
{ "gteGGR": "500000", "ratePct": 25 },
{ "gteGGR": "2000000", "ratePct": 20 }
]
},
"minGuarantee": "20000", // mode=hybrid/fixed 保底(本位币);hybrid: max(minGuarantee, GGR×率)
"fixedFee": "20000", // mode=fixed 固定周期费(本位币)
"billingCycle": "monthly", // 结算周期(V1 自然月)
"settlementDay": 1, // 出账日(默认次月 1 日生成账单)
"dueDays": 7, // 账单到期天数(出账后 N 天内付清)
"overdueGraceDays": 3, // 逾期宽限:超期 N 天后开始提醒
"suspendOnOverdueDays": 15, // 累计逾期 ≥ N 天 → 触发租户 SUSPENDED(§2.3)
"settlementCurrency": "USDT" // 平台合并应付额的结算币种(跨站分账单合计用参考汇率快照)
}- 金额本位币:
minGuarantee/fixedFee及每站分账单的ggr/amount_due均以该站本位币计;仅平台合并合计行用settlementCurrency+ 当期参考汇率快照(§三.10,B2B 结算参考口径,不回流用户业务)。 - 校验:
mode ∈ 枚举;revShare.tiers按gteGGR升序、ratePct ∈ [0,100];settlementCurrency ∈ 平台币种目录;dueDays / overdueGraceDays / suspendOnOverdueDays为正整数。 - 权限:
billing.*仅平台控制台可写(建站设定/后续调整),商户控制台只读本站账单(→ 15 计费结算节);变更写审计。
五、配置生效链路(从后台到界面)
商户/平台控制台改配置 ─► schema+合规校验 ─► 生成新配置版本(DRAFT)─► 沙盒预览 ─► 发布(全量/灰度)
│
用户请求 ─► ⓪ Host→tenant 解析 ─► ① GET /bootstrap(纯租户配置,可 CDN 缓存)◄──┘
② GET /me(登录后用户快照)
│
▼
展示层据配置渲染(开关定模块、theme/layout 定长相、copy 定文案)
引擎据配置执行(币种、门槛、费率、活动参数)5.1 GET /bootstrap —— 纯租户配置(全用户相同,可缓存)
jsonc
{
"meta": { "tenant": "global", "brand": "BetCorgi", "baseCurrency": "CNY", "region": "CN",
"timezone": "UTC+8", "locale": "zh", "configVersion": "2026.07.15-01" },
// tenant/brand=品牌标识(非区域);region=具体国家代码(此 CNY 站 = CN 市场,GLOBAL 仅无属地站兜底)
"features": { "vipSalary": true, "rakeback": true, "affiliate": true,
"staking": false, "kycRequired": "onWithdraw", "promoSpecMode": false },
"theme": { "preset": "dark-purple", "overrides": { "brandPrimary": "#8b5cff" } },
"layout": { "home": ["banner", "jackpot", "lobby"], "nav": "bottom-5" },
// home.sections ⊆ 布局模块注册表(banner/jackpot/lobby/promoRail/vendors,→ design/layouts);
// hot=lobby 首个 tab、vendors=分类内侧栏,不作顶层 section
"copy": { "home.banner.cta": "立即领取" /* …当前语言文案键值 */ },
"wallet": { "baseCurrency": "CNY", // 本位币 = 站型(CNY 站);站内单币种、单账户
"symbol": "¥", "position": "prefix", "decimals": 2 },
/* baseCurrency 是站的唯一记账与展示币种,建站锁定、变更需平台审批(→ 15);等级/俸禄/统计一律本位币单口径(→ 06/07/17) */
"level": { "maxLevel": 50 /* 等级表公开部分,见 06 */ },
"promo": { "list": [ { "id": "first-deposit", "sort": 1 /* 展示所需公开字段,见 09 */ } ] },
"deposit": { "channels": ["bank", "unionpay", "alipay", "wechat", "vippay", "gopay", "usdt"] }
/* 通道币种可 ≠ 本位币:CNY 站可收 USDT/ETH/BTC,下单锁价折入本位币(→ 03) */
}只含公开配置,不含后台策略、风控阈值等敏感项。样例站型:global = CNY 站(本例)、sea01 = USDT 站、gold88 = CNY 站(SETUP)。
5.2 GET /me —— 用户快照(登录后)
jsonc
{
"user": { "id": "u1001", "nick": "Andy", "kyc": "NONE" },
"wallet": { "currency": "CNY", "available": "8720.20", "bonus": "168.68" }, // 单币种站:单钱包,币种恒 = baseCurrency
"vip": { "level": 18, "progress": 0.52 },
"badges": { "promo": 2, "task": 1, "salary": 1, "rakeback": 0 }, // 各奖励入口红点(= 可领状态计数,→ 07/08/09/10)
"unread": { "notice": 3 } // 顶栏消息铃铛未读数(消息数,非可领红点;→ 16;与 badges 语义分离)
}调试参数:
?wallet=cny|usdt(站型参数,选本位币)、?state(登录态)、?spec(多态展示)仅作本地调试覆盖;生产上站型/开关来自 EffectiveConfig(§2.4)。
六、版本、灰度与回滚
- 版本化:每次发布生成不可变配置版本
configVersion,tenant.configRef指向当前版本。 - 灰度:新版本可先面向 X% 用户 / 白名单 / 时段生效。确定性要求:同一用户必须稳定命中同一桶——
bucket = hash(tenantId + userId + releaseId) % 100,不随刷新漂移。 - 回滚:
configRef指回上一个稳定版本即时回滚,不需发版。 - 审计:谁、何时、改了哪个租户的哪些键(diff),全部留痕(→ 15)。
七、★ 本系统自身的可配置项(元配置)
| 配置 | 说明 |
|---|---|
| 默认模板 DefaultTemplate | 平台级基线,决定所有键的兜底值 |
| 预设库 Presets | 可复用的区域/行业配置包(东南亚法币、全球加密…) |
| 可覆盖键白名单 | 限定商户控制台能改哪些键(与 15 的 RBAC 联动:角色 × 键白名单) |
| 灰度策略 | 灰度维度(比例/白名单/时段)与放量步长 |
八、运营后台能力(→ 15 汇总)
| 侧 | 能力 |
|---|---|
| 平台控制台 | 建站向导(选预设→改差异→SETUP→验收→ACTIVE);默认模板与预设库维护;租户状态流转;任意租户配置的发布/灰度/回滚;跨租户审计检索;计费结算:设定各租户 billing 计费方式/账单出账·催缴·标记已付·逾期→SUSPENDED 联动(→ §三.10 / 15 计费结算节;账单表 billing_statements 归 17 §八) |
| 商户控制台 | 在可覆盖键白名单内编辑本站配置;沙盒预览(预览 token 渲染未发布版本);提交发布(按合约:直发或平台审批);查看本站版本历史与 diff;只读本站账单(billing 与 billing_statements 商户不可改) |
九、展示契约
| 前端需要 | 来源 | 用途 |
|---|---|---|
| 租户身份 | ⓪ Host 解析(调试 ?tenant=) | 决定加载哪套配置 |
features.* / wallet.baseCurrency | bootstrap | 模块显隐、站型(本位币符号/精度) |
theme / layout | bootstrap → design 系统 | 换皮换布局 |
copy(当前语言) | bootstrap | 全站文案 |
| 各系统公开配置 | bootstrap | 本位币符号、等级表、活动列表等渲染所需 |
| 余额/VIP/红点等用户态 | /me | 登录后个性化渲染 |
奖励入口红点 badges.*(promo/task/salary/rakeback) | /me | 各奖励入口可领计数(→ 07/08/09/10) |
消息铃铛未读数 unread.notice | /me | 顶栏铃铛未读徽(消息数,非可领红点;→ 16) |
原型映射:app.js 的 ?wallet(站型参数,选本位币 cny|usdt)、?state、?spec 分别对应 wallet.baseCurrency、登录态(/me 是否有值)、features.promoSpecMode。前端统一从一个 CONFIG(bootstrap 形状)+ ME(me 形状)对象读取,URL 参数仅作调试覆盖注入;站内单币种恒按 baseCurrency 渲染,禁止「数字不变只换符号」的重刷(applyCur 只格式化本位币,不做符号替换,→ 02 展示铁律)。
十、数据库设计(全表含 tenant_id,除平台级表)
| 表 | 关键字段 | 约束/索引 |
|---|---|---|
tenants | tenant_id PK, code, name, brand, status, base_currency(本位币/站型,建站锁定、变更走平台审批), region, timezone, default_locale, config_ref, owner, created_at | UK(code) |
tenant_domains | domain, tenant_id, is_primary, status | UK(domain);IDX(tenant_id) |
tenant_config_versions | id PK, tenant_id, version, config JSON, base_template_ver, preset_refs JSON, status(DRAFT/PUBLISHED/ROLLED_BACK), created_by, published_at | UK(tenant_id,version) |
tenant_config_audit | id PK, tenant_id, from_version, to_version, diff JSON, actor_id, reason, created_at | IDX(tenant_id,created_at) |
config_presets(平台级) | preset_id PK, name, scope(region/industry), config JSON, version | — |
gray_releases | id PK, tenant_id, target_version, strategy(percent/whitelist/schedule), param JSON, status | IDX(tenant_id,status) |
十一、扩展点与开放问题
- 环境维度:dev/staging/prod 的配置晋升流(同一版本逐环境推进),待基建选型后补。
- 预设市场:预设库沉淀为「开站模板市场」,运营选模板即开站。
- 同一用户多租户:默认独立、不互通(→ 00 §4.9);若商户集团要求互通会员体系,另立跨租户会员方案。
十二、验收要点
- [ ] 同一份引擎部署,仅换域名(或
?tenant=)可渲染出两个本位币不同的子平台(CNY 站 / USDT 站),站内全程单币种、单账户; - [ ] 缺失键回落默认模板,不出现 undefined/崩溃;
- [ ] 变更
wallet.baseCurrency的发布被拦为平台审批红区,商户侧不能直发; - [ ] 合规层禁用项在租户层无法打开(发布校验拒绝);
- [ ] 灰度中同一用户多次刷新命中同一版本;
- [ ] 回滚后 bootstrap 的
configVersion立即回退,客户端下个会话生效; - [ ] 商户控制台改白名单外的键 → 保存被拒并留审计;
- [ ]
console.visibleModules取值超出二十一模块 id 全集 → 发布校验拒绝;某模块最终可见 = visibleModules ∩ RBAC view(任一不满足即不可见); - [ ]
billing仅平台控制台可写、商户侧只读本站账单;billing.mode非枚举或revShare.tiers非升序 → 发布校验拒绝; - [ ]
region取非国家代码(非 ISO 3166-1 且非GLOBAL)→ 发布校验拒绝;GLOBAL站合规默认落最严基线。