Files
webman-buildadmin/docs/_36字花_前端开发对接与交互逻辑说明书.txt
2026-04-24 13:49:38 +08:00

252 lines
7.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
《"36字花" 前端开发对接与交互逻辑说明书》
适用对象
:前端开发工程师 (React / Vue / 移动端 H5 开发者)
核心要求
:极高的渲染性能(移动端务必保持 60FPS禁止重绘卡顿极致的状态同步30秒循环状态机绝对不可发生状态错乱
一、 全局架构与技术栈建议 (Architecture Guidelines)
状态管理 (State Management)
:由于游戏状态极其复杂(连赢限额、统一下注金额、倒计时同步),强烈推荐使用全局状态管理库(如 React的
Redux/Zustand
或 Vue的
Pinia
),将
“业务逻辑数据层”
“UI渲染层”
完全解耦。
动画性能 (Animation Performance)
盘面的 10 种状态切换和高频边框动画,
严禁使用 JS 帧动画操作 DOM
必须全部采用
CSS3
transition
animation
box-shadow
SVG (
stroke-dasharray
)
涉及到全屏爆金币的粒子特效 (Particle Effects),建议直接调用轻量级 Canvas 动画库(如
tsparticles
PixiJS
)。
时间同步 (Time Sync)
:绝对不要信任客户端(手机/浏览器)的本地时间!游戏倒计时必须以 WebSocket/API 下发的服务器时间戳为基准进行倒推补偿。
二、 核心状态机30秒生命周期 (The 30s Lifecycle) 注意⚠️这个时间后台可配置
前端的整个游戏循环被严格划分为 4 个生命周期,请在代码中建立全局的
GameState
枚举,并根据状态驱动 UI 渲染:
GameState.BETTING
(0 - 20秒下注期)
行为
:允许用户点击格子、选筹码、点确认。
UI
:倒计时递减。背景跑马灯常态运转。
GameState.LOCKED
(20.0秒:封盘锁定)
行为
前端立即进行物理锁盘
。无论网络是否有延迟只要本地计算到达20.0秒,立即禁用所有输入框、点击事件和按钮。
UI
:弹出
[停止下注]
提示,未点击确认的预选状态 (
PRE_SELECTED
) 格子全部强制清除。
GameState.DRAWING
(20 - 25秒算票与开奖)
行为
:等待后端 WebSocket 推送开奖结果。
UI
:收到结果后,前端触发 3 秒的高频加速跑马灯,最后 0.5 秒光圈定格在中奖格子上,触发
WINNING
状态大爆动画。
GameState.PAYOUT
(25 - 30秒结算派彩)
行为
:监听余额变更推送,更新连赢 (Streak) 状态。
UI
:播放中奖特效,更新底部走势图 (红蓝圆点),准备进入下一局。
三、 组件级交互逻辑36字花主键盘 (The 36-Grid System)
前端需要封装一个
<Cell />
组件,该组件接收一个
status
属性(范围 0-9并根据该枚举值切换对应的 CSS Class。
📌 10 种状态枚举 (CellStatus Enum) 映射逻辑
IDLE
(闲置):默认状态,深色,偶发微光 CSS 动画。
MARQUEE
(跑马灯焦点):全局维护一个
activeCellIndex
每 0.1秒随机变更,命中的组件亮起青色霓虹边框。
HOVER
(悬浮)
:hover
伪类触发(仅 PC
PRE_SELECTED
(预选中):前端本地状态数组。显示筹码图标,金边流光。
LOCKED
(已确认):调用
place_bet
API 成功后切换至此状态。显示锁定印章,绿色边框。
DISABLED
(禁用)封盘时或已选中数量达标5个其余格子强制渲染黑色 60% 遮罩。
ERROR
(错误抖动):触发 CSS
shake
动画,维持 0.5s 后回退到上一个状态。
WINNING
(中奖大爆)开奖目标Z-index 置顶,放大 1.25 倍,播放强脉冲 CSS。
LOSER
(落选陪跑):透明度设为
opacity: 0.2
AUTO_ACTIVE
(自动托管中):全局遮罩下,该格子穿透遮罩,显示紫色虚线动画与
AUTO
印章。
📌 核心防呆交互逻辑 (必须用代码写死限制)
统一下注金额联动 (Chip Sync)
全局维护一个
currentChipValue
(当前选中的筹码)。
如果用户修改了
currentChipValue
,前端必须
遍历所有状态为
PRE_SELECTED
的格子,将它们显示的筹码瞬间同步为新金额
数量限制校验 (Max 5 Limit)
实时计算:
count(PRE_SELECTED) + count(LOCKED)
必须
<= 5
等于 5 时,其余 31 个
IDLE
状态的格子必须变成
DISABLED
状态。如果强行点击,触发
ERROR
动画。
连赢上限校验 (Streak Bet Limit)
如果玩家上一局赢了API 会下发一个
streakMaxBetLimit
(连赢最高下注总额,如 💎 100
前端需要写一个
useEffect
/
watch
:实时计算
当前选中数字数量 * currentChipValue
。如果这个乘积
> streakMaxBetLimit
,或者当前账户余额不足,左下角的那个筹码图标必须添加
disabled
属性(变灰不可点)。
四、 核心中控台交互 (Control Panel & Actions)
1.
[✅ 确定下注 Confirm]
主按钮的状态机
这是全场最重要的按钮,前端必须维护它独立的四态机:
Disabled
:未选中任何格子时。
Ready (高亮呼吸)
:选中格子 > 0且总注金 <= 余额。绑定
onClick -> handleSubmit
Error (红色)
:总注金 > 余额。文字变成“余额不足”。
Success (绿色)
:收到 API 200 成功响应后,维持绿色直到本局结束。
1.
Auto-Spin自动托管逻辑流
数据层
:调用
/api/auto_spin
告知后端要买哪些数字、金额和局数。
UI 层
:前端进入
AUTO_MODE
全局变量。
整个盘面外层盖一个
<div className="glass-overlay" />
pointer-events: none
(阻断一切鼠标点击)。
只有目标格子的状态被设为
AUTO_ACTIVE
,并使用 CSS
z-index
穿透遮罩。
监听后端 WebSocket 下发的每一局扣款成功事件,更新底部控制台的进度条(如
3/50 局
)。
3.
Red/Blue 路子图渲染逻辑 (Trend Chart)
接收一个含有最近 30 期开奖数字的 Array
[08, 15, 36, ...]
渲染判断
item % 2 === 0
(偶数) 渲染蓝色圆圈;
item % 2 !== 0
(奇数) 渲染红色圆圈。
入场动画
:当有新数字加入 Array 时,最后一个圆圈必须带有
slide-in
pop-in
动画。
五、 网络延迟与极端异常处理 (Edge Cases & Fallbacks)
博彩游戏的前端,对异常处理的要求极高,请前端必须实现以下机制:
首屏强制公告 (Welcome Pop-out)
进页面时调用
/api/user/announcement
。如果有未读公告,弹出
<Modal />
“进入游戏”的
Button
绑定
disabled={!isChecked}
。不勾选绝对不给进。
压秒网络卡顿防错 (The 19.9s Click)
场景
:倒计时剩 0.1 秒,玩家点击了【确定下注】,前端发起了 HTTP/Socket 请求,但因为网络差,请求还没到服务器,本地倒计时先归零了。
处理方案
:前端立即锁盘进入
LOCKED
状态,并显示 Loading (spinner)。当 2 秒后收到后端的 400 Bad Request提示已封盘前端必须
清除这个格子的状态,并弹窗提示
[网络延迟,下注失败,未扣款]
。千万不能强行把它变成
LOCKED
绿勾。
断线重连恢复 (Reconnection Recovery)
场景
玩家切出微信看消息5分钟后切回浏览器。
处理方案
:前端检测到
visibilitychange
或者 Socket 断开,必须立刻重新发起
/api/game/current_status
全量拉取请求。根据服务器返回的数据,瞬间重置本地的倒计时、当前连胜数、走势图数据。
绝对不要依赖本地时间的积累运算。