From bd92f10b83e5e83fb262fac29dfbf6541b719de4 Mon Sep 17 00:00:00 2001
From: JiaJun <2394389886@qq.com>
Date: Thu, 23 Apr 2026 16:41:39 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E5=88=9D=E5=A7=8B?=
=?UTF-8?q?=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env.development | 4 +
.env.example | 4 +
.env.production | 4 +
.gitignore | 27 +
.husky/commit-msg | 1 +
.husky/pre-commit | 1 +
README.md | 421 +-
biome.json | 65 +
commitlint.config.mjs | 3 +
...6字花_ 前端开发对接与交互逻辑说明书》.docx | Bin 0 -> 162 bytes
docs/frontend-baseline-requirements.md | 439 ++
...36字花》用户前端 (User Portal) UI_UX .docx | Bin 0 -> 195519 bytes
...36字花_ 前端开发对接与交互逻辑说明书》.docx | Bin 0 -> 10287 bytes
index.html | 31 +
package.json | 61 +
pnpm-lock.yaml | 3687 +++++++++++++++++
public/favicon.svg | 1 +
src/constants/index.ts | 41 +
src/i18n/index.ts | 112 +
src/lib/api/api-client.ts | 212 +
src/lib/api/api-error.ts | 20 +
src/lib/api/types.ts | 6 +
src/lib/auth/auth-session.ts | 104 +
src/lib/auth/require-auth.ts | 29 +
src/lib/head/document-metadata.ts | 95 +
src/lib/query/query-client.ts | 43 +
src/locales/en-US/common.ts | 42 +
src/locales/zh-CN/common.ts | 42 +
src/main.tsx | 31 +
src/routeTree.gen.ts | 104 +
src/router.tsx | 14 +
src/routes/$lang/index.tsx | 19 +
src/routes/$lang/route.tsx | 46 +
src/routes/__root.tsx | 64 +
src/routes/index.tsx | 13 +
src/store/auth-store.ts | 143 +
src/styles.css | 22 +
src/vite-env.d.ts | 12 +
tsconfig.app.json | 28 +
tsconfig.json | 7 +
tsconfig.node.json | 27 +
vite.config.ts | 24 +
42 files changed, 6047 insertions(+), 2 deletions(-)
create mode 100644 .env.development
create mode 100644 .env.example
create mode 100644 .env.production
create mode 100644 .gitignore
create mode 100755 .husky/commit-msg
create mode 100755 .husky/pre-commit
create mode 100644 biome.json
create mode 100644 commitlint.config.mjs
create mode 100644 docs/.~36字花_ 前端开发对接与交互逻辑说明书》.docx
create mode 100644 docs/frontend-baseline-requirements.md
create mode 100644 docs/《36字花》用户前端 (User Portal) UI_UX .docx
create mode 100644 docs/《_36字花_ 前端开发对接与交互逻辑说明书》.docx
create mode 100644 index.html
create mode 100644 package.json
create mode 100644 pnpm-lock.yaml
create mode 100644 public/favicon.svg
create mode 100644 src/constants/index.ts
create mode 100644 src/i18n/index.ts
create mode 100644 src/lib/api/api-client.ts
create mode 100644 src/lib/api/api-error.ts
create mode 100644 src/lib/api/types.ts
create mode 100644 src/lib/auth/auth-session.ts
create mode 100644 src/lib/auth/require-auth.ts
create mode 100644 src/lib/head/document-metadata.ts
create mode 100644 src/lib/query/query-client.ts
create mode 100644 src/locales/en-US/common.ts
create mode 100644 src/locales/zh-CN/common.ts
create mode 100644 src/main.tsx
create mode 100644 src/routeTree.gen.ts
create mode 100644 src/router.tsx
create mode 100644 src/routes/$lang/index.tsx
create mode 100644 src/routes/$lang/route.tsx
create mode 100644 src/routes/__root.tsx
create mode 100644 src/routes/index.tsx
create mode 100644 src/store/auth-store.ts
create mode 100644 src/styles.css
create mode 100644 src/vite-env.d.ts
create mode 100644 tsconfig.app.json
create mode 100644 tsconfig.json
create mode 100644 tsconfig.node.json
create mode 100644 vite.config.ts
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..49980cb
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,4 @@
+VITE_APP_ENV=development
+VITE_API_BASE_URL=http://localhost:3000
+VITE_ENABLE_QUERY_DEVTOOLS=true
+VITE_ENABLE_REQUEST_LOG=true
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..49980cb
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,4 @@
+VITE_APP_ENV=development
+VITE_API_BASE_URL=http://localhost:3000
+VITE_ENABLE_QUERY_DEVTOOLS=true
+VITE_ENABLE_REQUEST_LOG=true
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..32fb8d6
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,4 @@
+VITE_APP_ENV=production
+VITE_API_BASE_URL=https://api.example.com
+VITE_ENABLE_QUERY_DEVTOOLS=false
+VITE_ENABLE_REQUEST_LOG=false
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d5ec0f6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+coverage
+*.local
+.env.local
+.env.*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100755
index 0000000..2e6b87e
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1 @@
+pnpm exec commitlint --edit "$1"
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100755
index 0000000..5ee7abd
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1 @@
+pnpm exec lint-staged
diff --git a/README.md b/README.md
index 676dc4c..3fb190f 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,420 @@
-# 36-character-flower
+# React SPA Template
-36字花
\ No newline at end of file
+这是一个用于后台系统或通用 SPA 项目的前端基础脚手架。它已经接好了以下底座能力:
+
+- `Vite + React 19 + TypeScript`
+- `TanStack Router` 文件路由
+- `TanStack Query + ky` 请求与缓存
+- `Zustand` 会话状态基座
+- `Tailwind CSS` 原子化样式
+- `i18next` 多语言
+- `Head / Metadata` 动态标题与元信息
+- `Biome + Husky + commitlint` 代码规范与提交规范
+
+这个模板现在已经被“净化”为一个空白 scaffold。
+你拿到它之后,应该在这个基础上替换成自己的页面、接口、登录逻辑和测试,而不是继续沿用示例业务。
+
+## 1. 快速开始
+
+```bash
+pnpm install
+pnpm dev
+```
+
+常用命令:
+
+```bash
+pnpm dev
+pnpm build
+pnpm lint
+pnpm lint:fix
+pnpm generate-routes
+pnpm commit
+```
+
+## 2. 目录结构
+
+核心目录说明:
+
+- `src/routes`
+ TanStack Router 文件路由目录。你新增页面,优先在这里建文件。
+- `src/lib/api`
+ 通用请求层。`api-client.ts` 是所有接口调用的基础入口。
+- `src/lib/auth`
+ 会话初始化、401 清理、refresh token、受保护路由 helper。
+- `src/lib/head`
+ 页面标题、description、Open Graph、Twitter metadata。
+- `src/lib/query`
+ TanStack Query 全局默认配置。
+- `src/store`
+ 全局状态。目前主要是认证状态。
+- `src/styles.css`
+ 全局 Tailwind 入口。当前项目只保留这一份样式文件。
+- `src/locales`
+ 多语言文案。
+
+## 3. 新项目落地后先改哪里
+
+如果你要基于这个模板开一个新项目,建议按这个顺序改:
+
+### 第一步:改首页
+
+先改这个文件:
+
+- `src/routes/$lang/index.tsx`
+
+这是当前默认首页。通常你会:
+
+- 改成你的项目欢迎页
+- 或直接改成 dashboard / 工作台入口
+- 或拆成自己的页面布局
+
+同时对应修改多语言文案:
+
+- `src/locales/zh-CN/common.ts`
+- `src/locales/en-US/common.ts`
+
+### 第二步:改接口基础地址
+
+先看这些文件:
+
+- `.env.development`
+- `.env.production`
+- `src/vite-env.d.ts`
+
+至少确认这些变量:
+
+- `VITE_APP_ENV`
+- `VITE_API_BASE_URL`
+- `VITE_ENABLE_QUERY_DEVTOOLS`
+- `VITE_ENABLE_REQUEST_LOG`
+
+### 第三步:改全局样式入口
+
+当前模板已经切到 Tailwind CSS,并移除了旧的 `App.css` / `index.css`。
+
+你主要会改:
+
+- `src/styles.css`
+
+这里通常只放:
+
+- `@import "tailwindcss";`
+- 少量全局 base 样式
+- 你的主题变量
+
+### 第四步:接你的业务模块
+
+建议按“功能模块”建目录,而不是把所有请求、类型和 hooks 混在一起。
+
+例如:
+
+```text
+src/features/user/api/user-api.ts
+src/features/user/hooks/use-current-user.ts
+src/features/user/types/user.ts
+src/routes/$lang/users/index.tsx
+```
+
+### 第五步:接你的登录体系
+
+优先改这些文件:
+
+- `src/store/auth-store.ts`
+- `src/lib/auth/auth-session.ts`
+- `src/lib/api/api-client.ts`
+
+## 4. Head / Metadata 怎么用
+
+模板已经提供了一个通用 hook:
+
+- `src/lib/head/document-metadata.ts`
+
+在页面组件里直接调用:
+
+```tsx
+import { useDocumentMetadata } from '@/lib/head/document-metadata'
+
+function UserPage() {
+ useDocumentMetadata({
+ title: '用户管理',
+ description: '用户管理页面',
+ })
+
+ return
User Page
+}
+```
+
+它会自动更新:
+
+- `document.title`
+- `meta[name="description"]`
+- `meta[name="robots"]`
+- `og:title`
+- `og:description`
+- `twitter:title`
+- `twitter:description`
+
+适用场景:
+
+- 列表页标题
+- 详情页标题
+- 登录页 / 404 页
+- 分享卡片基础描述
+
+## 5. 登录怎么接
+
+这个模板的认证层不是“现成登录系统”,而是“认证骨架”。
+
+它已经有:
+
+- `accessToken`
+- `refreshToken`
+- `currentUser`
+- `status`
+- `401` 后清会话
+- refresh token 的可插拔入口
+
+核心文件:
+
+- `src/store/auth-store.ts`
+- `src/lib/auth/auth-session.ts`
+- `src/lib/api/api-client.ts`
+
+### 5.1 登录成功后怎么写入会话
+
+假设你的登录接口返回:
+
+```ts
+{
+ accessToken: string
+ refreshToken: string
+ user: {
+ id: string
+ name: string
+ }
+}
+```
+
+那么登录成功后可以这样写:
+
+```ts
+import { useAuthStore } from '@/store/auth-store'
+
+useAuthStore.getState().startSession({
+ accessToken: response.accessToken,
+ refreshToken: response.refreshToken,
+ currentUser: response.user,
+})
+```
+
+### 5.2 刷新 token 怎么接
+
+模板里预留了 refresh 的注册入口:
+
+```ts
+import { registerRefreshSessionHandler } from '@/lib/auth/auth-session'
+
+registerRefreshSessionHandler(async (refreshToken) => {
+ const response = await fetch('/auth/refresh', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ refreshToken }),
+ }).then((result) => result.json())
+
+ return {
+ accessToken: response.accessToken,
+ refreshToken: response.refreshToken,
+ currentUser: response.user ?? null,
+ }
+})
+```
+
+当请求返回 `401` 时,请求层会:
+
+1. 尝试执行这个 refresh handler
+2. 如果 refresh 成功,则自动重试原请求一次
+3. 如果 refresh 失败,则清空本地会话
+
+### 5.3 当前用户初始化怎么接
+
+如果你的项目在刷新页面后,需要根据已有 token 主动请求一次“当前用户信息”,可以注册:
+
+```ts
+import { registerCurrentUserInitializer } from '@/lib/auth/auth-session'
+
+registerCurrentUserInitializer(async () => {
+ const response = await fetch('/auth/me').then((result) => result.json())
+
+ return response.user
+})
+```
+
+这样在应用启动时,模板会在已有 token 且尚未拿到 `currentUser` 的情况下,自动初始化一次用户信息。
+
+## 6. 怎么加受保护路由
+
+模板已经提供了路由保护 helper:
+
+- `src/lib/auth/require-auth.ts`
+
+用法是,在路由的 `beforeLoad` 里调用它。
+
+示例:
+
+```tsx
+import { createFileRoute } from '@tanstack/react-router'
+
+import { requireAuthenticatedSession } from '@/lib/auth/require-auth'
+
+export const Route = createFileRoute('/$lang/dashboard')({
+ beforeLoad: async () => {
+ await requireAuthenticatedSession()
+ },
+ component: DashboardPage,
+})
+
+function DashboardPage() {
+ return Dashboard
+}
+```
+
+它的行为是:
+
+- 如果当前已经登录,正常进入页面
+- 如果当前未登录,重定向到 `/$lang`
+
+如果你想把未登录用户导向专门的登录页,可以直接修改:
+
+- `src/lib/auth/require-auth.ts`
+
+把重定向目标从 `/$lang` 改成你的登录页路由,例如 `/$lang/login`。
+
+## 7. 怎么写第一个接口模块
+
+推荐模式是:
+
+1. 在 `src/features/.../types` 定义类型
+2. 在 `src/features/.../api` 写请求函数
+3. 在 `src/features/.../hooks` 写 query / mutation hook
+4. 在 `src/routes/...` 页面里消费
+
+示例:
+
+```ts
+// src/features/user/api/user-api.ts
+import { api } from '@/lib/api/api-client'
+
+export interface CurrentUser {
+ id: string
+ name: string
+}
+
+export function getCurrentUser() {
+ return api.get('users/me').then((response) => response.data)
+}
+```
+
+```ts
+// src/features/user/hooks/use-current-user.ts
+import { useQuery } from '@tanstack/react-query'
+
+import { getCurrentUser } from '@/features/user/api/user-api'
+import type { ApiError } from '@/lib/api/api-error'
+
+export function useCurrentUserQuery() {
+ return useQuery>, ApiError>({
+ queryKey: ['current-user'],
+ queryFn: getCurrentUser,
+ })
+}
+```
+
+## 8. 路由相关说明
+
+这个模板使用 TanStack Router 文件路由。
+
+路由目录:
+
+- `src/routes`
+
+生成文件:
+
+- `src/routeTree.gen.ts`
+
+你通常不需要手改 `src/routeTree.gen.ts`。
+新增、删除、修改路由文件后,执行:
+
+```bash
+pnpm generate-routes
+```
+
+`pnpm dev` 和 `pnpm build` 也都会自动先生成一次路由树。
+
+## 9. 代码规范和提交流程
+
+## 9.1 Tailwind 说明
+
+当前模板使用的是官方 Vite 接法:
+
+- `tailwindcss`
+- `@tailwindcss/vite`
+
+核心文件:
+
+- `vite.config.ts`
+- `src/styles.css`
+
+新增页面时,优先直接写 Tailwind utility class,而不是再恢复成多个分散的 CSS 文件。
+
+格式化与 lint:
+
+```bash
+pnpm lint
+pnpm lint:fix
+pnpm format
+```
+
+提交规范:
+
+```bash
+pnpm commit
+```
+
+仓库已经包含:
+
+- `Biome`
+- `Husky`
+- `lint-staged`
+- `commitlint`
+- `Commitizen`
+
+## 10. 你后续最可能改动的文件
+
+如果你刚接手这个模板,优先关注这几个文件:
+
+- `src/routes/$lang/index.tsx`
+- `src/routes/$lang/route.tsx`
+- `src/lib/api/api-client.ts`
+- `src/lib/auth/auth-session.ts`
+- `src/lib/auth/require-auth.ts`
+- `src/store/auth-store.ts`
+- `src/lib/head/document-metadata.ts`
+- `src/locales/zh-CN/common.ts`
+- `src/locales/en-US/common.ts`
+
+## 11. 当前状态
+
+当前模板已经验证通过:
+
+- `pnpm lint`
+- `pnpm build`
+
+如果你继续往前整理,下一步通常就是:
+
+1. 接入真实登录接口
+2. 增加 `login`、`dashboard`、`403` 等实际页面
+3. 按业务模块拆分 `features`
+4. 按项目实际需要补充测试方案
diff --git a/biome.json b/biome.json
new file mode 100644
index 0000000..fafe1dd
--- /dev/null
+++ b/biome.json
@@ -0,0 +1,65 @@
+{
+ "$schema": "https://biomejs.dev/schemas/2.4.12/schema.json",
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true
+ },
+ "files": {
+ "ignoreUnknown": true,
+ "includes": ["**", "!coverage", "!src/routeTree.gen.ts"]
+ },
+ "formatter": {
+ "enabled": true,
+ "indentStyle": "space",
+ "indentWidth": 2
+ },
+ "assist": {
+ "enabled": true,
+ "actions": {
+ "source": {
+ "organizeImports": "on"
+ }
+ }
+ },
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": true,
+ "complexity": {
+ "noUselessTypeConstraint": "error"
+ },
+ "correctness": {
+ "useExhaustiveDependencies": "warn",
+ "useHookAtTopLevel": "error"
+ },
+ "style": {
+ "noNamespace": "error",
+ "useArrayLiterals": "error",
+ "useAsConstAssertion": "error",
+ "useComponentExportOnlyModules": {
+ "level": "error",
+ "options": {
+ "allowConstantExport": true
+ }
+ },
+ "useConst": "error"
+ },
+ "suspicious": {
+ "noExplicitAny": "error"
+ }
+ }
+ },
+ "javascript": {
+ "formatter": {
+ "quoteStyle": "single",
+ "jsxQuoteStyle": "double",
+ "semicolons": "asNeeded"
+ }
+ },
+ "css": {
+ "parser": {
+ "tailwindDirectives": true
+ }
+ }
+}
diff --git a/commitlint.config.mjs b/commitlint.config.mjs
new file mode 100644
index 0000000..d179c69
--- /dev/null
+++ b/commitlint.config.mjs
@@ -0,0 +1,3 @@
+export default {
+ extends: ['@commitlint/config-conventional'],
+}
diff --git a/docs/.~36字花_ 前端开发对接与交互逻辑说明书》.docx b/docs/.~36字花_ 前端开发对接与交互逻辑说明书》.docx
new file mode 100644
index 0000000000000000000000000000000000000000..99b9bd35603f65cb19eef57e85395c105bdf42c0
GIT binary patch
literal 162
jcmZS2%1kWHE6rmd39vI{F=R3%GL$mpfiX#%NmL8~2a*N@
literal 0
HcmV?d00001
diff --git a/docs/frontend-baseline-requirements.md b/docs/frontend-baseline-requirements.md
new file mode 100644
index 0000000..8dd8fc6
--- /dev/null
+++ b/docs/frontend-baseline-requirements.md
@@ -0,0 +1,439 @@
+# 《36字花》前端开发基线需求文档
+
+## 1. 文档目的
+
+本文件基于以下两份前期文档整理:
+
+- `docs/《_36字花_ 前端开发对接与交互逻辑说明书》.docx`
+- `docs/《36字花》用户前端 (User Portal) UI_UX .docx`
+
+目标是移除营销型表述和非关键修辞,只保留后续 UI 设计、前端开发、联调和验收所需的核心设计要求、交互逻辑和技术栈建议。
+
+## 2. 核心结论
+
+### 2.1 产品形态
+
+- 产品为实时开奖类游戏前端,主场景是移动端 H5,同时要求兼容桌面端响应式布局。
+- 页面核心是围绕单局倒计时循环运行的 36 宫格下注界面。
+- 前端必须以服务器状态为准,不能依赖客户端本地时间做开奖判断。
+
+### 2.2 设计方向
+
+- 视觉风格保留为深色背景、高对比强调色的娱乐场风格。
+- 颜色建议以深海蓝/黑为底,青色和金色作为强调色。
+- 视觉参考中的“神鼎、宝箱、卷轴、巨龙、赛博朋克”等描述,只作为美术方向参考,不作为开发阻塞项。
+- 所有文案容器必须支持多语言伸缩,禁止固定宽度写死。
+
+### 2.3 交付优先级
+
+后续设计与开发应按以下优先级执行:
+
+1. 玩法状态正确
+2. 倒计时与服务端同步正确
+3. 下单、封盘、开奖、派彩状态切换正确
+4. 移动端可用性与性能达标
+5. 动效和视觉强化
+
+## 3. 推荐技术栈
+
+## 3.1 前端框架
+
+- `React + TypeScript + Vite`
+- 原因:移动 H5 交互复杂、状态密集、联调频繁,Vite 启动快,React 生态成熟,TypeScript 适合管理复杂状态和接口约束。
+
+## 3.2 路由与页面组织
+
+- `React Router`
+- 页面结构建议按大厅主界面、公告弹窗、规则面板、用户侧滑面板拆分。
+
+## 3.3 状态管理
+
+- `Zustand` 作为全局业务状态容器
+- `XState` 或等价状态机方案用于维护单局生命周期状态
+- 原因:本项目存在明确的 4 段式回合状态机、局内局外状态切换、自动托管覆盖态、网络重连恢复,单纯依赖局部状态容易错乱。
+
+建议状态拆分:
+
+- `roundStore`:期号、阶段、倒计时、开奖数据
+- `betStore`:选中格子、锁定格子、筹码、总注额、按钮状态
+- `userStore`:余额、连赢状态、下注上限、公告状态
+- `uiStore`:弹窗、抽屉、Toast、动画开关、自动托管蒙层
+
+## 3.4 数据请求与实时通信
+
+- `TanStack Query`:管理普通 HTTP 请求、缓存与重拉
+- `WebSocket`:接收当前局状态、开奖、余额变动、派彩、自动托管进度
+- 如果后端使用 Socket.IO,则前端改用 `socket.io-client`
+
+## 3.5 样式与动画
+
+- 页面布局:`Tailwind CSS`
+- 复杂状态样式:`CSS Modules` 或同级方案
+- 盘面高频动画:优先 `CSS Animation / Transition / SVG`
+- 全屏粒子特效:`PixiJS` 或 `tsParticles`
+
+约束:
+
+- 禁止用 JS 逐帧操作 DOM 做 36 宫格边框动画
+- 动效必须优先使用合成层友好的属性,如 `transform`、`opacity`、`filter`
+
+## 3.6 国际化与时间处理
+
+- `react-i18next`
+- `dayjs`
+
+说明:
+
+- `dayjs` 只用于显示格式化,不用于决定回合状态。
+- 回合倒计时必须基于服务端时间戳推导。
+
+## 3.7 测试与质量保障
+
+- 单元测试:按项目需要自行接入
+- 组件测试:按项目需要自行接入
+- 端到端测试:`Playwright`
+- 线上监控:建议接入 `Sentry`
+
+## 4. 页面与模块范围
+
+## 4.1 主游戏界面
+
+必须包含以下区域:
+
+- 顶部导航栏
+- 开奖展示区
+- 中控信息区
+- 36 宫格下注区
+- 筹码与操作栏
+- 右侧历史区
+- 底部单双走势区
+
+## 4.2 次级界面
+
+必须包含以下弹层或侧栏:
+
+- 强制公告弹窗
+- 自动托管运行浮层
+- 玩法与规则面板
+- 用户 Dashboard 侧滑面板
+
+## 5. 单局生命周期状态机
+
+后台可配置单局时长,前端默认按 30 秒一局建模,并支持服务端参数覆盖。
+
+### 5.1 游戏阶段枚举
+
+- `BETTING`:下注期
+- `LOCKED`:封盘锁定
+- `DRAWING`:算票与开奖
+- `PAYOUT`:派彩与收尾
+
+### 5.2 各阶段规则
+
+`BETTING`
+
+- 允许选格子、换筹码、清除未确认、重复上一注、确认下注、开启自动托管。
+- 显示倒计时。
+- 跑马灯处于常规速度。
+
+`LOCKED`
+
+- 到达封盘时间点后,前端必须立即锁盘,不等待后端响应。
+- 所有点击事件、按钮、输入行为全部禁用。
+- 所有 `PRE_SELECTED` 未确认格子必须清空。
+- 显示“停止下注”提示。
+
+`DRAWING`
+
+- 等待 WebSocket 推送开奖结果。
+- 收到开奖后,盘面跑马灯加速。
+- 最终定格中奖格子,进入中奖态。
+
+`PAYOUT`
+
+- 接收余额和连赢状态更新。
+- 播放中奖特效。
+- 更新历史和走势。
+- 为下一局做状态重置。
+
+## 6. 36 宫格下注区需求
+
+## 6.1 网格结构
+
+- 固定为 `6 x 6`
+- 每个格子包含:编号、动物名、动物图
+- 格子需要支持轻量分组提示,用于区分业务分类,但不影响下注逻辑
+
+## 6.2 单格状态枚举
+
+建议统一实现 `CellStatus`:
+
+- `IDLE`:默认闲置
+- `MARQUEE`:跑马灯焦点
+- `HOVER`:PC 悬浮
+- `PRE_SELECTED`:已选未确认
+- `LOCKED`:已确认下注
+- `DISABLED`:不可操作
+- `ERROR`:错误反馈
+- `WINNING`:中奖高亮
+- `LOSER`:未中奖弱化
+- `AUTO_ACTIVE`:自动托管执行态
+
+## 6.3 单格交互规则
+
+- 玩家单局最多选择 5 个格子。
+- `PRE_SELECTED + LOCKED` 的总数不得超过 5。
+- 达到 5 个后,其余可选格子全部置为 `DISABLED`。
+- 点击第 6 个格子时,不得选中,必须触发错误反馈。
+- 余额不足或超限点击时,必须触发错误反馈。
+- 已确认格子在本局内不可取消。
+- 若本局尚未封盘且未满 5 个,允许继续追加下注并再次确认。
+
+## 7. 筹码与下注逻辑
+
+## 7.1 筹码区
+
+标准筹码档位:
+
+- `1`
+- `5`
+- `10`
+- `25`
+- `50`
+- `100`
+
+## 7.2 统一下注金额同步
+
+- 全局维护 `currentChipValue`
+- 已处于 `PRE_SELECTED` 的所有格子,其显示筹码必须跟随 `currentChipValue` 实时同步
+- 筹码切换后,总下注金额必须同步刷新
+
+## 7.3 连赢上限与余额限制
+
+需要实时校验:
+
+- `selectedCount * currentChipValue <= streakMaxBetLimit`
+- `totalBetAmount <= balance`
+
+当不满足时:
+
+- 对应不可选的大额筹码必须禁用
+- 确认下注按钮进入错误态或禁用态
+- 格子点击需给出明确错误反馈
+
+## 8. 确认下注主按钮状态机
+
+按钮需要独立维护以下 4 个状态:
+
+- `DISABLED`:未选任何格子
+- `READY`:已选格子且余额足够,可点击提交
+- `ERROR`:总下注金额大于余额,文案显示“余额不足”
+- `SUCCESS`:下注成功后维持成功态直到本局结束
+
+约束:
+
+- 禁止自动提交
+- 必须由用户手动点击确认
+- 成功后已确认格子不可撤销
+
+## 9. 自动托管需求
+
+## 9.1 功能行为
+
+- 调用自动托管接口提交:下注格子、金额、局数
+- 前端进入 `AUTO_MODE`
+- 主键盘和筹码区整体进入不可编辑状态
+- 自动托管中的目标格子显示 `AUTO_ACTIVE`
+- 前端展示当前进度,例如 `12 / 50`
+- 必须提供显式“停止托管”操作
+
+## 9.2 视觉与交互约束
+
+- 使用全局玻璃遮罩阻断手动操作
+- 自动托管目标格子需要穿透遮罩高亮显示
+- 自动托管态必须与手动锁定态有视觉区分
+
+## 10. 中控信息区需求
+
+必须展示以下信息:
+
+- 当前余额
+- 当前赔率
+- 当前连赢次数
+- 连赢限额提示
+- 当前倒计时
+- 当前期号
+- 当前阶段状态,如 `OPEN` / `CLOSED`
+
+倒计时要求:
+
+- 最后 5 秒需要强化提示
+- 倒计时只展示服务器推导结果
+
+## 11. 历史与走势需求
+
+## 11.1 右侧历史区
+
+- 显示最近开奖记录
+- 每条至少包含时间、号码、动物名
+- 最新一条高亮
+- 需要支持滚动
+
+## 11.2 底部单双走势
+
+- 保留最近 30 局
+- 奇数显示红色圆点
+- 偶数显示蓝色圆点
+- 新增一条数据时,最后一个点需要入场动画
+
+## 12. 弹窗与侧栏需求
+
+## 12.1 强制公告弹窗
+
+功能要求:
+
+- 首屏进入时请求公告接口
+- 若存在未读公告,必须强制弹出
+- 不允许点击遮罩关闭
+- 不允许提供右上角关闭按钮
+- 勾选“已阅读并同意”前,进入游戏按钮必须禁用
+- 关闭后要记录已读状态
+- 无新公告时,不重复弹出
+
+布局要求:
+
+- 支持图文内容
+- 内容超长时支持滚动
+- 移动端建议复选框和主按钮上下排列,避免多语言挤压
+
+## 12.2 规则面板
+
+- 提供玩法规则、赔率说明、连胜机制、大奖说明
+- 允许分页或滚动
+- 结构化展示,不得纯长文堆叠
+
+## 12.3 用户 Dashboard 侧滑面板
+
+至少包含:
+
+- 资产信息
+- 充值入口
+- 提现入口与手续费说明
+- 最近 1 个月投注历史
+- 站内信列表
+- 公告信箱入口
+
+## 13. 异常与容错要求
+
+## 13.1 本地锁盘优先
+
+- 到达封盘时间点时,前端必须立刻锁盘
+- 即使网络延迟,也不能继续允许下注交互
+
+## 13.2 压秒点击失败处理
+
+场景:
+
+- 用户在接近封盘时点击确认
+- 请求发出,但服务器实际已封盘
+
+前端处理:
+
+- 先进入锁盘和加载态
+- 若稍后收到失败响应,必须撤销未成功下注的本地状态
+- 明确提示“网络延迟,下注失败,未扣款”
+- 严禁误显示为下注成功
+
+## 13.3 断线重连恢复
+
+触发条件:
+
+- 页面重新可见
+- WebSocket 断开后重连
+
+前端处理:
+
+- 立即调用全量状态接口重新同步
+- 重置倒计时、期号、余额、连赢、走势、当前盘面状态
+- 禁止依赖本地累计时间继续运行
+
+## 13.4 余额不足场景
+
+- 确认按钮进入错误态
+- 充值入口需要有明显引导
+- 相关格子或筹码点击时给出即时反馈
+
+## 14. 接口与事件依赖
+
+以下为前端开发所需的最小接口能力,命名可与后端协商,但能力不可缺失。
+
+## 14.1 HTTP 接口
+
+- `GET /api/user/announcement`
+- `GET /api/game/current_status`
+- `POST /api/bet/place`
+- `POST /api/auto_spin`
+- `POST /api/announcement/read`
+
+## 14.2 WebSocket 事件
+
+- `round_status`:当前阶段、期号、服务器时间、剩余时间
+- `draw_result`:开奖结果、中奖格子
+- `balance_changed`:余额变化
+- `streak_changed`:连赢状态与限额变化
+- `trend_updated`:最新走势数据
+- `auto_spin_progress`:自动托管局数进度
+
+## 15. 性能与实现约束
+
+- 移动端目标帧率:`60 FPS`
+- 36 宫格状态切换不得出现明显掉帧
+- 高亮、缩放、呼吸、闪烁等动画优先使用 GPU 友好属性
+- 避免大面积重排和重绘
+- 长列表区域应考虑虚拟化或分段渲染
+- 全局状态更新必须避免引起整盘 36 格不必要重渲染
+
+## 16. 多语言与响应式要求
+
+- 所有按钮、标签、提示文案必须支持长度扩展
+- 不允许固定像素宽度导致文案截断
+- 文本区域需预留至少 40% 的横向伸缩空间
+- 设计需优先保证移动端单手操作
+- PC 端可补充 Hover 态,移动端不依赖 Hover 完成交互
+
+## 17. 开发验收基线
+
+满足以下条件才可进入测试或交付:
+
+- 单局状态机完整跑通
+- 封盘时前端能本地立即锁盘
+- 服务端时间同步准确
+- 下注数量限制与统一筹码机制无误
+- 余额与连赢上限限制生效
+- 自动托管可启动、运行、停止
+- 公告弹窗强阻断逻辑正确
+- 断线重连后状态可恢复
+- 走势与历史区数据更新正确
+- 移动端核心流程可稳定使用
+
+## 18. 建议的开发顺序
+
+1. 搭建项目骨架、路由、状态层、接口层
+2. 先实现 30 秒回合状态机和服务端时间同步
+3. 完成 36 宫格、筹码区、确认按钮的核心下注流程
+4. 接入开奖、派彩、历史、走势
+5. 实现公告弹窗、规则面板、用户侧栏
+6. 实现自动托管
+7. 最后补齐粒子特效、强化动画和视觉细节
+
+## 19. 明确降级为“视觉参考”的内容
+
+以下内容不应阻塞前端逻辑开发,可在视觉设计阶段再细化:
+
+- 神坛主体到底是神鼎、宝箱还是法槌
+- 是否采用卷轴、金属边框或全息科技框
+- Jackpot 动画具体表现形式
+- 动物头像是否 3D、半写实或插画风
+- 特效音、粒子素材、品牌化图标样式
+
+以上内容只影响视觉表现,不影响本文件定义的交互和功能边界。
diff --git a/docs/《36字花》用户前端 (User Portal) UI_UX .docx b/docs/《36字花》用户前端 (User Portal) UI_UX .docx
new file mode 100644
index 0000000000000000000000000000000000000000..64ebf8c92008f1b9c99c9b7b7310967216c751fc
GIT binary patch
literal 195519
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