1.新增描述文档
This commit is contained in:
@@ -8,7 +8,8 @@
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "vite --open",
|
||||
"build": "vue-tsc --noEmit && vite build",
|
||||
"sync:flowcharts": "node scripts/sync-dice-flowcharts.mjs",
|
||||
"build": "node scripts/sync-dice-flowcharts.mjs && vue-tsc --noEmit && vite build",
|
||||
"serve": "vite preview",
|
||||
"lint": "eslint",
|
||||
"fix": "eslint --fix",
|
||||
|
||||
192
saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.html
Normal file
192
saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.html
Normal file
@@ -0,0 +1,192 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>为何最终抽到该奖励</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
|
||||
<style>
|
||||
* { box-sizing: border-box; }
|
||||
body {
|
||||
font-family: "Microsoft YaHei", "PingFang SC", sans-serif;
|
||||
margin: 0;
|
||||
padding: 24px 32px 48px;
|
||||
background: #f5f7fa;
|
||||
color: #1a1a2e;
|
||||
line-height: 1.6;
|
||||
}
|
||||
header { max-width: 1100px; margin: 0 auto 16px; }
|
||||
h1 { font-size: 1.5rem; margin: 0 0 8px; font-weight: 600; }
|
||||
.subtitle { color: #5c6370; font-size: 0.95rem; margin: 0; }
|
||||
.card {
|
||||
max-width: 1100px;
|
||||
margin: 0 auto;
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
padding: 28px 24px;
|
||||
box-shadow: 0 2px 12px rgba(0,0,0,.06);
|
||||
}
|
||||
.copy-hint {
|
||||
max-width: 1100px;
|
||||
margin: 12px auto 0;
|
||||
font-size: 0.88rem;
|
||||
color: #606266;
|
||||
}
|
||||
.copy-box {
|
||||
max-width: 1100px;
|
||||
margin: 8px auto 0;
|
||||
background: #fff;
|
||||
border: 1px solid #dcdfe6;
|
||||
border-radius: 8px;
|
||||
padding: 12px 14px;
|
||||
}
|
||||
.copy-box summary { cursor: pointer; font-size: 0.9rem; color: #409eff; }
|
||||
.copy-box pre {
|
||||
margin: 10px 0 0;
|
||||
font-size: 0.78rem;
|
||||
line-height: 1.45;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
max-height: 280px;
|
||||
overflow: auto;
|
||||
color: #303133;
|
||||
}
|
||||
.legend {
|
||||
max-width: 1100px;
|
||||
margin: 20px auto 0;
|
||||
padding: 16px 20px;
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
font-size: 0.9rem;
|
||||
color: #444;
|
||||
}
|
||||
.legend h2 { font-size: 1rem; margin: 0 0 10px; }
|
||||
.legend ul { margin: 0; padding-left: 1.2em; }
|
||||
.legend li { margin: 4px 0; }
|
||||
.mermaid { display: flex; justify-content: center; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>为何最终抽到的是这个奖励</h1>
|
||||
<p class="subtitle">业务说明:一局抽奖从开局到到账的决策顺序(仅用本项目菜单与业务用语)</p>
|
||||
</header>
|
||||
|
||||
<p class="copy-hint">复制方式:展开下方「Mermaid 源码」全选复制,粘贴到 ProcessOn / draw.io / 飞书文档等支持 Mermaid 的流程图工具;或直接用浏览器打开本页看图。</p>
|
||||
|
||||
<div class="card">
|
||||
<pre class="mermaid">
|
||||
flowchart TD
|
||||
Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针]
|
||||
Dir --> Ante[选择底注倍数]
|
||||
Ante --> Type{本局是否使用免费抽奖券?}
|
||||
|
||||
Type -->|是| Free[免费局]
|
||||
Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币]
|
||||
|
||||
Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签]
|
||||
Paid --> KillCheck{彩金池已开启杀分<br/>且彩金池累计盈利 ≥ 安全线?}
|
||||
KillCheck -->|是| PoolKill
|
||||
KillCheck -->|否| PlayerW[按该玩家在「玩家管理」<br/>配置的 T1~T5 档位概率抽签]
|
||||
|
||||
PoolKill --> DrawTier[随机抽出档位 T1~T5]
|
||||
PlayerW --> DrawTier
|
||||
|
||||
DrawTier --> PickRow[在「色子奖励权重」中<br/>取该档位 + 本局方向的所有行<br/>按行权重随机一条]
|
||||
PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位]
|
||||
|
||||
Got --> KillMode{本局是否走杀分档位概率?}
|
||||
KillMode -->|是| NoLeo[不发放豹子大奖<br/>且不会抽到仅能豹子的点数 5、30]
|
||||
KillMode -->|否| NormalPath[按普通规则继续]
|
||||
NoLeo --> DiceShow[生成五颗骰子并结算]
|
||||
|
||||
NormalPath --> Leopard{色子点数是否为<br/>5 / 10 / 15 / 20 / 25 / 30?}
|
||||
Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数<br/>奖金 = 结算金额 × 底注]
|
||||
Leopard -->|是| LeoRule{点数?}
|
||||
LeoRule -->|5 或 30| MustBig[必定豹子大奖]
|
||||
LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」<br/>该点数权重决定真豹子或普通展示]
|
||||
MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注<br/>本局不再发该点数的普通奖]
|
||||
BigRate -->|命中豹子| BigPay
|
||||
BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合<br/>奖金 = 结算金额 × 底注]
|
||||
|
||||
NormalWin --> T5Check
|
||||
NonLeo --> T5Check
|
||||
BigPay --> EndBig([本局结束:以豹子大奖为准])
|
||||
DiceShow --> T5Check{档位为 T5 再来一次?}
|
||||
T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券<br/>下次免费局须相同底注]
|
||||
T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准])
|
||||
FreeTicket --> EndNormal
|
||||
|
||||
style Start fill:#e8f4fc
|
||||
style EndNormal fill:#e8fce8
|
||||
style EndBig fill:#fff3e0
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<details class="copy-box">
|
||||
<summary>Mermaid 源码(可复制,与同目录 .mmd 文件一致)</summary>
|
||||
<pre id="mermaid-src">flowchart TD
|
||||
Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针]
|
||||
Dir --> Ante[选择底注倍数]
|
||||
Ante --> Type{本局是否使用免费抽奖券?}
|
||||
|
||||
Type -->|是| Free[免费局]
|
||||
Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币]
|
||||
|
||||
Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签]
|
||||
Paid --> KillCheck{彩金池已开启杀分<br/>且彩金池累计盈利 ≥ 安全线?}
|
||||
KillCheck -->|是| PoolKill
|
||||
KillCheck -->|否| PlayerW[按该玩家在「玩家管理」<br/>配置的 T1~T5 档位概率抽签]
|
||||
|
||||
PoolKill --> DrawTier[随机抽出档位 T1~T5]
|
||||
PlayerW --> DrawTier
|
||||
|
||||
DrawTier --> PickRow[在「色子奖励权重」中<br/>取该档位 + 本局方向的所有行<br/>按行权重随机一条]
|
||||
PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位]
|
||||
|
||||
Got --> KillMode{本局是否走杀分档位概率?}
|
||||
KillMode -->|是| NoLeo[不发放豹子大奖<br/>且不会抽到仅能豹子的点数 5、30]
|
||||
KillMode -->|否| NormalPath[按普通规则继续]
|
||||
NoLeo --> DiceShow[生成五颗骰子并结算]
|
||||
|
||||
NormalPath --> Leopard{色子点数是否为<br/>5 / 10 / 15 / 20 / 25 / 30?}
|
||||
Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数<br/>奖金 = 结算金额 × 底注]
|
||||
Leopard -->|是| LeoRule{点数?}
|
||||
LeoRule -->|5 或 30| MustBig[必定豹子大奖]
|
||||
LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」<br/>该点数权重决定真豹子或普通展示]
|
||||
MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注<br/>本局不再发该点数的普通奖]
|
||||
BigRate -->|命中豹子| BigPay
|
||||
BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合<br/>奖金 = 结算金额 × 底注]
|
||||
|
||||
NormalWin --> T5Check
|
||||
NonLeo --> T5Check
|
||||
BigPay --> EndBig([本局结束:以豹子大奖为准])
|
||||
DiceShow --> T5Check{档位为 T5 再来一次?}
|
||||
T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券<br/>下次免费局须相同底注]
|
||||
T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准])
|
||||
FreeTicket --> EndNormal
|
||||
|
||||
style Start fill:#e8f4fc
|
||||
style EndNormal fill:#e8fce8
|
||||
style EndBig fill:#fff3e0</pre>
|
||||
</details>
|
||||
|
||||
<div class="legend">
|
||||
<h2>读图要点</h2>
|
||||
<ul>
|
||||
<li><strong>两步抽签</strong>:先抽档位 T1~T5(大奖 / 小赚 / 抽水 / 惩罚 / 再来一次),再在该档位 + 方向的多条奖励里按权重抽具体点数与结算金额。</li>
|
||||
<li><strong>免费局与杀分局</strong>:都用杀分奖池的档位概率;一般不会出豹子大奖,也不会抽到只能组成豹子的点数 5、30。</li>
|
||||
<li><strong>普通付费局</strong>:彩金池未到杀分条件时,用该玩家在「玩家管理」里的档位权重,才可能按「大奖权重」出豹子。</li>
|
||||
<li><strong>玩家最终看到</strong>:色子点数、五颗骰子图案、到账平台币(普通奖 + 豹子奖)、是否获得「再来一次」免费券。</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
mermaid.initialize({
|
||||
startOnLoad: true,
|
||||
theme: 'neutral',
|
||||
flowchart: { curve: 'basis', padding: 16, nodeSpacing: 28, rankSpacing: 40 }
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
44
saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.mmd
Normal file
44
saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.mmd
Normal file
@@ -0,0 +1,44 @@
|
||||
flowchart TD
|
||||
Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针]
|
||||
Dir --> Ante[选择底注倍数]
|
||||
Ante --> Type{本局是否使用免费抽奖券?}
|
||||
|
||||
Type -->|是| Free[免费局]
|
||||
Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币]
|
||||
|
||||
Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签]
|
||||
Paid --> KillCheck{彩金池已开启杀分<br/>且彩金池累计盈利 ≥ 安全线?}
|
||||
KillCheck -->|是| PoolKill
|
||||
KillCheck -->|否| PlayerW[按该玩家在「玩家管理」<br/>配置的 T1~T5 档位概率抽签]
|
||||
|
||||
PoolKill --> DrawTier[随机抽出档位 T1~T5]
|
||||
PlayerW --> DrawTier
|
||||
|
||||
DrawTier --> PickRow[在「色子奖励权重」中<br/>取该档位 + 本局方向的所有行<br/>按行权重随机一条]
|
||||
PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位]
|
||||
|
||||
Got --> KillMode{本局是否走杀分档位概率?}
|
||||
KillMode -->|是| NoLeo[不发放豹子大奖<br/>且不会抽到仅能豹子的点数 5、30]
|
||||
KillMode -->|否| NormalPath[按普通规则继续]
|
||||
NoLeo --> DiceShow[生成五颗骰子并结算]
|
||||
|
||||
NormalPath --> Leopard{色子点数是否为<br/>5 / 10 / 15 / 20 / 25 / 30?}
|
||||
Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数<br/>奖金 = 结算金额 × 底注]
|
||||
Leopard -->|是| LeoRule{点数?}
|
||||
LeoRule -->|5 或 30| MustBig[必定豹子大奖]
|
||||
LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」<br/>该点数权重决定真豹子或普通展示]
|
||||
MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注<br/>本局不再发该点数的普通奖]
|
||||
BigRate -->|命中豹子| BigPay
|
||||
BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合<br/>奖金 = 结算金额 × 底注]
|
||||
|
||||
NormalWin --> T5Check
|
||||
NonLeo --> T5Check
|
||||
BigPay --> EndBig([本局结束:以豹子大奖为准])
|
||||
DiceShow --> T5Check{档位为 T5 再来一次?}
|
||||
T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券<br/>下次免费局须相同底注]
|
||||
T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准])
|
||||
FreeTicket --> EndNormal
|
||||
|
||||
style Start fill:#e8f4fc
|
||||
style EndNormal fill:#e8fce8
|
||||
style EndBig fill:#fff3e0
|
||||
219
saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.html
Normal file
219
saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.html
Normal file
@@ -0,0 +1,219 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>后台如何配置中奖逻辑</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
|
||||
<style>
|
||||
* { box-sizing: border-box; }
|
||||
body {
|
||||
font-family: "Microsoft YaHei", "PingFang SC", sans-serif;
|
||||
margin: 0;
|
||||
padding: 24px 32px 48px;
|
||||
background: #f0f4f8;
|
||||
color: #1a1a2e;
|
||||
line-height: 1.55;
|
||||
}
|
||||
header { max-width: 1200px; margin: 0 auto 16px; }
|
||||
h1 { font-size: 1.45rem; margin: 0 0 6px; font-weight: 600; }
|
||||
.subtitle { color: #5c6370; font-size: 0.92rem; margin: 0; }
|
||||
.tip {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto 16px;
|
||||
padding: 12px 16px;
|
||||
background: #fff8e6;
|
||||
border-left: 4px solid #e6a23c;
|
||||
border-radius: 6px;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.card {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto 20px;
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
padding: 24px 20px;
|
||||
box-shadow: 0 2px 12px rgba(0,0,0,.06);
|
||||
}
|
||||
.card h2 { font-size: 1.05rem; margin: 0 0 12px; color: #303133; }
|
||||
.copy-hint {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto 12px;
|
||||
font-size: 0.88rem;
|
||||
color: #606266;
|
||||
}
|
||||
.copy-box {
|
||||
max-width: 1200px;
|
||||
margin: 8px auto 20px;
|
||||
background: #fff;
|
||||
border: 1px solid #dcdfe6;
|
||||
border-radius: 8px;
|
||||
padding: 12px 14px;
|
||||
}
|
||||
.copy-box summary { cursor: pointer; font-size: 0.9rem; color: #409eff; }
|
||||
.copy-box pre {
|
||||
margin: 10px 0 0;
|
||||
font-size: 0.76rem;
|
||||
line-height: 1.4;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
max-height: 320px;
|
||||
overflow: auto;
|
||||
}
|
||||
.steps {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
display: grid;
|
||||
gap: 10px;
|
||||
}
|
||||
.step {
|
||||
background: #fff;
|
||||
border-radius: 10px;
|
||||
padding: 12px 16px;
|
||||
border: 1px solid #e4e7ed;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.step strong { color: #409eff; }
|
||||
.mermaid { display: flex; justify-content: center; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>后台如何配置中奖逻辑</h1>
|
||||
<p class="subtitle">按「一局真实抽奖」顺序:每个环节对应左侧菜单与页面按钮(与前台逻辑一致)</p>
|
||||
</header>
|
||||
|
||||
<p class="tip">菜单根目录:<strong>大富翁-色子游戏</strong>。多渠道后台请先选顶部<strong>渠道</strong>,再改该渠道数据。</p>
|
||||
<p class="copy-hint">复制:展开「Mermaid 源码」粘贴到流程图工具;日常维护也可打开同目录 <code>dice-后台中奖逻辑配置.mmd</code>。</p>
|
||||
|
||||
<div class="card">
|
||||
<h2>主流程图(抽奖环节 → 去哪点哪个按钮)</h2>
|
||||
<pre class="mermaid">
|
||||
flowchart TD
|
||||
O([按一局抽奖的真实顺序配置后台]) --> L1
|
||||
|
||||
L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置<br/>按钮:新增 / 行内编辑 → 提交]
|
||||
L1A --> L2
|
||||
|
||||
L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?}
|
||||
L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore]
|
||||
L2Q -->|付费且彩金池杀分生效| L2F
|
||||
L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重]
|
||||
|
||||
L2F --> M2F[大富翁-色子游戏 → 彩金池配置<br/>按钮:行内「编辑」→ 名称 killScore<br/>填写 T1池权重~T5池权重 合计 100%<br/>按钮:「提交」]
|
||||
L2P --> M2P[大富翁-色子游戏 → 玩家管理<br/>按钮:行内「编辑」<br/>填写 T1池权重~T5池权重 或 选择「彩金池配置」<br/>按钮:「提交」]
|
||||
|
||||
M2F --> L2K
|
||||
M2P --> L2K
|
||||
L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置<br/>按钮:「查看当前彩金池」<br/>填写「安全线」· 开关「开启杀分」<br/>按钮:「保存安全线」]
|
||||
|
||||
M2K --> L3
|
||||
L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则]
|
||||
M3A --> M3B[大富翁-色子游戏 → 奖励配置<br/>页签「奖励索引」→ 填写结算金额等<br/>按钮:「保存」]
|
||||
M3B --> M3C[奖励配置 → 按钮「创建奖励对照」<br/>弹窗 → 按钮「确认导入」]
|
||||
M3C --> M3D[大富翁-色子游戏 → 色子奖励权重<br/>按钮:「权重配比」→ 页签顺时针/逆时针<br/>按 T1~T5 填各点数权重 → 按钮「提交」]
|
||||
|
||||
M3D --> L4
|
||||
L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?}
|
||||
L4Q -->|是| L4N[不触发豹子大奖]
|
||||
L4Q -->|否| L4Y[可能触发豹子大奖]
|
||||
L4Y --> M4[大富翁-色子游戏 → 奖励配置<br/>页签「大奖权重」→ 拖动权重滑条<br/>按钮:「保存」<br/>说明:点数 5、30 固定必中;10/15/20/25 可调]
|
||||
|
||||
L4N --> L5
|
||||
M4 --> L5
|
||||
L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」<br/>弹窗 → 按钮「开始测试」]
|
||||
M5A --> M5B[权重测试记录 → 按钮「查看详情」<br/>按钮「导入到当前配置」→「确认导入」]
|
||||
M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对])
|
||||
|
||||
style O fill:#e8f4fc
|
||||
style Done fill:#e8fce8
|
||||
style M2F fill:#fdf6ec
|
||||
style M2P fill:#fdf6ec
|
||||
style M3D fill:#fde2e2
|
||||
style M4 fill:#e1f3d8
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<details class="copy-box">
|
||||
<summary>Mermaid 源码(可复制,与同目录 .mmd 文件一致)</summary>
|
||||
<pre id="mermaid-src">flowchart TD
|
||||
O([按一局抽奖的真实顺序配置后台]) --> L1
|
||||
|
||||
L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置<br/>按钮:新增 / 行内编辑 → 提交]
|
||||
L1A --> L2
|
||||
|
||||
L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?}
|
||||
L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore]
|
||||
L2Q -->|付费且彩金池杀分生效| L2F
|
||||
L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重]
|
||||
|
||||
L2F --> M2F[大富翁-色子游戏 → 彩金池配置<br/>按钮:行内「编辑」→ 名称 killScore<br/>填写 T1池权重~T5池权重 合计 100%<br/>按钮:「提交」]
|
||||
L2P --> M2P[大富翁-色子游戏 → 玩家管理<br/>按钮:行内「编辑」<br/>填写 T1池权重~T5池权重 或 选择「彩金池配置」<br/>按钮:「提交」]
|
||||
|
||||
M2F --> L2K
|
||||
M2P --> L2K
|
||||
L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置<br/>按钮:「查看当前彩金池」<br/>填写「安全线」· 开关「开启杀分」<br/>按钮:「保存安全线」]
|
||||
|
||||
M2K --> L3
|
||||
L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则]
|
||||
M3A --> M3B[大富翁-色子游戏 → 奖励配置<br/>页签「奖励索引」→ 填写结算金额等<br/>按钮:「保存」]
|
||||
M3B --> M3C[奖励配置 → 按钮「创建奖励对照」<br/>弹窗 → 按钮「确认导入」]
|
||||
M3C --> M3D[大富翁-色子游戏 → 色子奖励权重<br/>按钮:「权重配比」→ 页签顺时针/逆时针<br/>按 T1~T5 填各点数权重 → 按钮「提交」]
|
||||
|
||||
M3D --> L4
|
||||
L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?}
|
||||
L4Q -->|是| L4N[不触发豹子大奖]
|
||||
L4Q -->|否| L4Y[可能触发豹子大奖]
|
||||
L4Y --> M4[大富翁-色子游戏 → 奖励配置<br/>页签「大奖权重」→ 拖动权重滑条<br/>按钮:「保存」<br/>说明:点数 5、30 固定必中;10/15/20/25 可调]
|
||||
|
||||
L4N --> L5
|
||||
M4 --> L5
|
||||
L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」<br/>弹窗 → 按钮「开始测试」]
|
||||
M5A --> M5B[权重测试记录 → 按钮「查看详情」<br/>按钮「导入到当前配置」→「确认导入」]
|
||||
M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对])
|
||||
|
||||
style O fill:#e8f4fc
|
||||
style Done fill:#e8fce8
|
||||
style M2F fill:#fdf6ec
|
||||
style M2P fill:#fdf6ec
|
||||
style M3D fill:#fde2e2
|
||||
style M4 fill:#e1f3d8</pre>
|
||||
</details>
|
||||
|
||||
<div class="card">
|
||||
<h2>首次搭建推荐顺序(与上图环节对应)</h2>
|
||||
<pre class="mermaid">
|
||||
flowchart TD
|
||||
O([开始配置]) --> R1[奖励配置 · 页签「奖励索引」· 按钮「保存」]
|
||||
R1 --> R2[奖励配置 · 页签「大奖权重」· 按钮「保存」]
|
||||
R2 --> R3[奖励配置 · 按钮「创建奖励对照」·「确认导入」]
|
||||
R3 --> W[色子奖励权重 · 按钮「权重配比」· 按钮「提交」]
|
||||
W --> P1[彩金池配置 · 行内「编辑」default / killScore ·「提交」]
|
||||
P1 --> P2[彩金池配置 ·「查看当前彩金池」·「保存安全线」]
|
||||
P2 --> PL[玩家管理 · 行内「编辑」· 档位权重 ·「提交」]
|
||||
PL --> T{要仿真?}
|
||||
T -->|是| Test[色子奖励权重 ·「一键测试权重」·「开始测试」]
|
||||
Test --> Imp[权重测试记录 ·「查看详情」·「导入到当前配置」·「确认导入」]
|
||||
T -->|否| Live([上线])
|
||||
Imp --> Live
|
||||
|
||||
style O fill:#e8f4fc
|
||||
style Live fill:#e8fce8
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="steps">
|
||||
<div class="step"><strong>档位含义</strong>:T1 大奖 · T2 小赚 · T3 抽水 · T4 惩罚 · T5 再来一次(由「奖励索引」结算金额规则决定,见页内说明)。</div>
|
||||
<div class="step"><strong>改「奖励索引」后</strong>:必须再点「创建奖励对照」→「确认导入」,否则抽奖仍用旧对照表。</div>
|
||||
<div class="step"><strong>核对真实对局</strong>:大富翁-色子游戏 → 玩家抽奖记录(看奖励档位、色子点数、摇色子中奖平台币、中大奖平台币、底注、方向)。</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
mermaid.initialize({
|
||||
startOnLoad: true,
|
||||
theme: 'neutral',
|
||||
flowchart: { curve: 'basis', padding: 14, nodeSpacing: 24, rankSpacing: 36 }
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
42
saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.mmd
Normal file
42
saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.mmd
Normal file
@@ -0,0 +1,42 @@
|
||||
flowchart TD
|
||||
O([按一局抽奖的真实顺序配置后台]) --> L1
|
||||
|
||||
L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置<br/>按钮:新增 / 行内编辑 → 提交]
|
||||
L1A --> L2
|
||||
|
||||
L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?}
|
||||
L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore]
|
||||
L2Q -->|付费且彩金池杀分生效| L2F
|
||||
L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重]
|
||||
|
||||
L2F --> M2F[大富翁-色子游戏 → 彩金池配置<br/>按钮:行内「编辑」→ 名称 killScore<br/>填写 T1池权重~T5池权重 合计 100%<br/>按钮:「提交」]
|
||||
L2P --> M2P[大富翁-色子游戏 → 玩家管理<br/>按钮:行内「编辑」<br/>填写 T1池权重~T5池权重 或 选择「彩金池配置」<br/>按钮:「提交」]
|
||||
|
||||
M2F --> L2K
|
||||
M2P --> L2K
|
||||
L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置<br/>按钮:「查看当前彩金池」<br/>填写「安全线」· 开关「开启杀分」<br/>按钮:「保存安全线」]
|
||||
|
||||
M2K --> L3
|
||||
L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则]
|
||||
M3A --> M3B[大富翁-色子游戏 → 奖励配置<br/>页签「奖励索引」→ 填写结算金额等<br/>按钮:「保存」]
|
||||
M3B --> M3C[奖励配置 → 按钮「创建奖励对照」<br/>弹窗 → 按钮「确认导入」]
|
||||
M3C --> M3D[大富翁-色子游戏 → 色子奖励权重<br/>按钮:「权重配比」→ 页签顺时针/逆时针<br/>按 T1~T5 填各点数权重 → 按钮「提交」]
|
||||
|
||||
M3D --> L4
|
||||
L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?}
|
||||
L4Q -->|是| L4N[不触发豹子大奖]
|
||||
L4Q -->|否| L4Y[可能触发豹子大奖]
|
||||
L4Y --> M4[大富翁-色子游戏 → 奖励配置<br/>页签「大奖权重」→ 拖动权重滑条<br/>按钮:「保存」<br/>说明:点数 5、30 固定必中;10/15/20/25 可调]
|
||||
|
||||
L4N --> L5
|
||||
M4 --> L5
|
||||
L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」<br/>弹窗 → 按钮「开始测试」]
|
||||
M5A --> M5B[权重测试记录 → 按钮「查看详情」<br/>按钮「导入到当前配置」→「确认导入」]
|
||||
M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对])
|
||||
|
||||
style O fill:#e8f4fc
|
||||
style Done fill:#e8fce8
|
||||
style M2F fill:#fdf6ec
|
||||
style M2P fill:#fdf6ec
|
||||
style M3D fill:#fde2e2
|
||||
style M4 fill:#e1f3d8
|
||||
26
saiadmin-artd/scripts/sync-dice-flowcharts.mjs
Normal file
26
saiadmin-artd/scripts/sync-dice-flowcharts.mjs
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* 将 server/docs/flowcharts 同步到 saiadmin-artd/public/docs/flowcharts
|
||||
* 构建前执行,保证部署包内含最新流程图 HTML/MMD
|
||||
*/
|
||||
import fs from 'fs'
|
||||
import path from 'path'
|
||||
import { fileURLToPath } from 'url'
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
const artdRoot = path.resolve(__dirname, '..')
|
||||
const repoRoot = path.resolve(artdRoot, '..')
|
||||
const srcDir = path.join(repoRoot, 'server', 'docs', 'flowcharts')
|
||||
const destDir = path.join(artdRoot, 'public', 'docs', 'flowcharts')
|
||||
|
||||
if (!fs.existsSync(srcDir)) {
|
||||
console.warn('[sync-dice-flowcharts] 源目录不存在,跳过:', srcDir)
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
fs.mkdirSync(destDir, { recursive: true })
|
||||
const names = fs.readdirSync(srcDir).filter((n) => /\.(html|mmd)$/i.test(n))
|
||||
for (const name of names) {
|
||||
fs.copyFileSync(path.join(srcDir, name), path.join(destDir, name))
|
||||
console.log('[sync-dice-flowcharts] copied', name)
|
||||
}
|
||||
console.log('[sync-dice-flowcharts] done,', names.length, 'file(s)')
|
||||
@@ -16,10 +16,11 @@
|
||||
*/
|
||||
import { AppRouteRecord } from '@/types/router'
|
||||
import { router } from '@/router'
|
||||
import { resolveAppAssetUrl } from '@/utils/navigation/resolveAppAssetUrl'
|
||||
|
||||
// 打开外部链接
|
||||
// 打开外部链接(含站内静态页,自动拼接部署 base)
|
||||
export const openExternalLink = (link: string) => {
|
||||
window.open(link, '_blank')
|
||||
window.open(resolveAppAssetUrl(link), '_blank', 'noopener,noreferrer')
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
19
saiadmin-artd/src/utils/navigation/resolveAppAssetUrl.ts
Normal file
19
saiadmin-artd/src/utils/navigation/resolveAppAssetUrl.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/**
|
||||
* 解析菜单外链 / 静态资源路径(兼容 VITE_BASE_URL 子目录部署)
|
||||
*/
|
||||
export function resolveAppAssetUrl(relativeOrAbsolute: string): string {
|
||||
const link = relativeOrAbsolute.trim()
|
||||
if (!link) {
|
||||
return link
|
||||
}
|
||||
if (/^https?:\/\//i.test(link)) {
|
||||
return link
|
||||
}
|
||||
const base = import.meta.env.BASE_URL || '/'
|
||||
const normalizedBase = base.endsWith('/') ? base : `${base}/`
|
||||
const path = link.startsWith('/') ? link.slice(1) : link
|
||||
if (typeof window === 'undefined') {
|
||||
return `${normalizedBase}${path}`
|
||||
}
|
||||
return `${window.location.origin}${normalizedBase}${path}`
|
||||
}
|
||||
Reference in New Issue
Block a user