feat: 添加完整的项目设计文档,替换旧的原型需求文档

This commit is contained in:
史悦
2025-09-11 15:13:38 +08:00
parent e922bacfb8
commit b8d081bd8a
10 changed files with 4755 additions and 155 deletions

View File

@@ -0,0 +1,251 @@
# UI组件设计详设文档
> **文档版本**: v1.0
> **撰写人**: UI/UX设计师 & 前端架构师
> **创建日期**: 2024年9月11日
## 1. 设计系统与主题
### 1.1 设计语言
- **主题**: 暗黑科技风 (Dark/Tech Theme),与原型设计稿保持一致。
- **主色调**:
- 背景: `#1A202C` (深灰蓝)
- 主色: `#00BFFF` (深天蓝,用于按钮、高亮、链接)
- 辅助色: `#4A5568` (中灰,用于边框、分割线)
- 强调色: `#FF4500` (橙红,用于警告、错误提示、攻击命中)
- **字体**:
- `sans-serif` 系统默认无衬线字体。
- 使用 `rem``em` 作为字体单位,以支持可访问性。
### 1.2 Design Token
所有颜色、字体大小、间距、圆角等样式参数都将通过Design Token进行管理`Sass`变量形式实现。
```scss
// src/styles/tokens.scss
// Colors
$color-background: #1A202C;
$color-primary: #00BFFF;
$color-secondary: #4A5568;
$color-accent: #FF4500;
$color-text-primary: #FFFFFF;
$color-text-secondary: #A0AEC0;
// Spacing
$spacing-xs: 0.25rem; // 4px
$spacing-sm: 0.5rem; // 8px
$spacing-md: 1rem; // 16px
$spacing-lg: 1.5rem; // 24px
$spacing-xl: 2rem; // 32px
// Border Radius
$border-radius-sm: 4px;
$border-radius-md: 8px;
$border-radius-lg: 16px;
```
## 2. 原子组件 (Atoms)
原子组件是UI构成的最小单元不可再分。
### 2.1 `Button` 组件
- **功能**: 标准按钮,支持不同变体和状态。
- **Props**:
```typescript
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: 'primary' | 'secondary' | 'danger'; // 样式变体
size?: 'sm' | 'md' | 'lg'; // 尺寸
isLoading?: boolean; // 加载状态
leftIcon?: React.ReactNode;
rightIcon?: React.ReactNode;
}
```
- **样式**:
- `primary`: 主色背景,白色文字。
- `secondary`: 辅助色边框,主色文字。
- `danger`: 强调色背景,白色文字。
- `disabled`: 降低透明度,禁用鼠标事件。
- `isLoading`: 显示加载动画,禁用按钮。
### 2.2 `Input` 组件
- **功能**: 文本输入框。
- **Props**:
```typescript
interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
label?: string; // 标签
errorMessage?: string; // 错误信息
leftIcon?: React.ReactNode;
}
```
- **样式**:
- `focus`: 主色边框高亮。
- `error`: 强调色边框和错误信息。
### 2.3 `Spinner` 组件
- **功能**: 加载指示器。
- **Props**:
```typescript
interface SpinnerProps {
size?: 'sm' | 'md' | 'lg'; // 尺寸
color?: string; // 颜色
}
```
### 2.4 `Icon` 组件
- **功能**: 图标库封装,使用`react-icons`。
- **Props**:
```typescript
import { IconType } from 'react-icons';
interface IconProps {
as: IconType; // 图标组件
size?: string | number;
color?: string;
}
```
## 3. 分子组件 (Molecules)
由原子组件组合而成,完成特定功能。
### 3.1 `FormField` 组件
- **构成**: `Input` + `Label` + `ErrorMessage`
- **功能**: 完整的表单字段,包含标签和验证逻辑。
### 3.2 `PlayerAvatar` 组件
- **构成**: `Avatar` + `Text`
- **功能**: 显示玩家头像和昵称。
- **Props**:
```typescript
interface PlayerAvatarProps {
player: {
avatarUrl: string;
nickname: string;
isOwner?: boolean; // 是否是房主
isReady?: boolean; // 是否已准备
};
size?: 'md' | 'lg';
}
```
- **样式**:
- `isReady`: 头像外圈显示主色高亮。
- `isOwner`: 昵称旁显示皇冠图标。
### 3.3 `RoomListItem` 组件
- **构成**: `Text` + `Icon` + `Button`
- **功能**: 在房间列表中显示单个房间的信息。
- **Props**:
```typescript
interface RoomListItemProps {
room: {
roomCode: string;
name: string;
playerCount: number;
isLocked: boolean;
};
onJoin: (roomCode: string) => void;
}
```
## 4. 生物组件 (Organisms)
由分子和原子组件构成的更复杂的UI部分。
### 4.1 `GameBoard` 组件
- **功能**: 核心游戏棋盘UI负责渲染10x10的网格和飞机。
- **构成**: 多个 `GridCell` 组件。
- **Props**:
```typescript
interface GameBoardProps {
boardState: BoardState; // 棋盘状态数据
isMyBoard: boolean; // 是否是自己的棋盘
onCellClick: (position: { x: number, y: number }) => void; // 单元格点击事件
placedPlanes?: Plane[]; // 预放置的飞机
}
```
- **`GridCell` 子组件**:
- 根据单元格状态(`empty`, `plane_part`, `miss`, `hit`, `destroy`)显示不同样式。
- 在对手棋盘上,`plane_part`状态默认不显示,除非被攻击过。
- 鼠标悬停在可攻击的单元格上时显示准星光标。
### 4.2 `PlanePlacementPanel` 组件
- **功能**: 飞机布置阶段的操作面板,允许玩家拖拽或旋转飞机。
- **构成**: `PlanePreview` 组件 + `Button` (旋转/确认)
- **Props**:
```typescript
interface PlanePlacementPanelProps {
onPlanesConfirm: (planes: Plane[]) => void;
}
```
- **交互**:
- 提供3个默认形状的飞机供拖拽到棋盘。
- 支持点击飞机进行90度旋转。
- 棋盘上会实时预览飞机位置,并对非法位置(越界、重叠)进行红色高亮提示。
### 4.3 `Header` 组件
- **功能**: 应用的全局顶部导航栏。
- **构成**: `Logo` + `UserInfo` + `SettingsButton`
## 5. 模板组件 (Templates)
定义页面的整体布局结构。
### 5.1 `MainLayout` 组件
- **功能**: 应用的主布局,包含页头、内容区、页脚。
- **构成**: `Header` + `children` + `Footer`
- **插槽(Slots)**: 通过`children` prop 插入页面具体内容。
## 6. 页面组件 (Pages)
完整的页面,由模板和多个生物/分子组件构成。
### 6.1 `HomePage`
- **路径**: `/`
- **功能**: 游戏入口页面,包含"创建房间"和"加入房间"按钮。
- **组件构成**: `MainLayout`, `Logo`, `Button`。
### 6.2 `RoomListPage`
- **路径**: `/rooms`
- **功能**: 显示公开的房间列表,支持刷新和搜索。
- **组件构成**: `MainLayout`, `RoomListItem`, `Spinner`, `Button`。
### 6.3 `RoomWaitingPage`
- **路径**: `/room/:roomCode`
- **功能**: 玩家等待页面,显示双方玩家信息和准备状态。
- **组件构成**: `MainLayout`, `PlayerAvatar` (x2), `Button` (准备/开始游戏), `ChatBox` (可选)。
- **逻辑**:
- 房主显示"开始游戏"按钮,当所有玩家准备好后激活。
- 其他玩家显示"准备"按钮。
- 实时监听WebSocket的`ROOM_STATE_UPDATE`事件更新UI。
### 6.4 `GamePage`
- **路径**: `/game/:gameId`
- **功能**: 核心游戏对战页面。
- **组件构成**:
- `MainLayout`
- `GameBoard` (我方棋盘)
- `GameBoard` (敌方棋盘)
- `GameStatusPanel`: 显示当前回合、倒计时、游戏日志。
- `PlanePlacementPanel`: 仅在飞机布置阶段显示。
- **逻辑**:
- 页面加载时从Zustand Store获取游戏状态。
- 监听WebSocket的`GAME_STATE_UPDATE`事件更新整个页面。
- 根据游戏阶段(`placing`, `battling`, `finished`)渲染不同UI。
- 在`finished`阶段,显示游戏结果弹窗(`GameResultModal`)。