You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

526 lines
18 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# A股智投分析平台 - 技术架构
## 一、整体架构
```
┌─────────────────────────────────────────────────────────────┐
│ 前端层 (Frontend) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ React 18 │ │ TypeScript │ │ Vite 构建 │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │Tailwind CSS │ │ shadcn/ui │ │ Recharts 图表 │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ API 网关层 │
│ (Nginx / AWS API Gateway / 阿里云) │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 后端层 (Backend) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Node.js │ │ Python │ │ WebSocket 服务 │ │
│ │ Express │ │ FastAPI │ │ (Socket.io) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 数据层 (Data) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ MySQL │ │ Redis │ │ 外部数据接口 │ │
│ │ (主存储) │ │ (缓存) │ │ (AKShare/Tushare) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
## 二、前端架构
### 2.1 技术选型
| 技术 | 版本 | 用途 |
|-----|------|------|
| React | 18.x | UI框架 |
| TypeScript | 5.x | 类型系统 |
| Vite | 5.x | 构建工具 |
| Tailwind CSS | 3.x | 样式框架 |
| shadcn/ui | latest | UI组件库 |
| Recharts | 2.x | 图表库 |
| Framer Motion | 11.x | 动画库 |
| Lucide React | latest | 图标库 |
### 2.2 目录结构
```
src/
├── components/ # 公共组件
│ ├── Navbar.tsx # 导航栏
│ ├── CandlestickChart.tsx # K线蜡烛图
│ ├── StockDetailModal.tsx # 个股详情弹窗
│ ├── SectorDetailModal.tsx # 版块详情弹窗
│ └── Footer.tsx # 页脚
├── sections/ # 页面区块组件
│ ├── MarketOverview.tsx # 市场概览
│ ├── MomentumSectors.tsx # 动量版块
│ ├── HighLowStocks.tsx # 新高新低
│ ├── PriceDistribution.tsx # 涨跌分布
│ └── MomentumRecommendation.tsx # 动量推荐
├── services/ # 数据服务层
│ └── stockData.ts # 股票数据服务
├── types/ # TypeScript类型定义
│ └── index.ts # 类型定义
├── hooks/ # 自定义React Hooks
│ └── useStockData.ts # 股票数据Hook
├── utils/ # 工具函数
│ └── format.ts # 格式化函数
├── App.tsx # 主应用组件
├── main.tsx # 应用入口
└── index.css # 全局样式
```
### 2.3 组件设计原则
1. **单一职责**: 每个组件只负责一个功能
2. **可复用性**: 公共组件抽离,提高复用
3. **类型安全**: 使用TypeScript严格类型检查
4. **性能优化**: 使用useMemo、useCallback优化渲染
### 2.4 状态管理
当前使用React内置状态管理
- `useState`: 组件内部状态
- `useEffect`: 副作用处理
- `useContext`: 跨组件状态(待实现)
未来可考虑:
- Zustand: 轻量级状态管理
- Redux Toolkit: 复杂状态管理
## 三、后端架构(待实现)
### 3.1 技术选型方案
#### 方案一: Node.js + Express
```javascript
// 技术栈
- Node.js 20.x
- Express 4.x
- TypeScript 5.x
- Prisma ORM
- Socket.io (WebSocket)
```
#### 方案二: Python + FastAPI
```python
# 技术栈
- Python 3.11
- FastAPI
- SQLAlchemy
- WebSockets
- Celery (定时任务)
```
### 3.2 目录结构
```
backend/
├── src/
│ ├── controllers/ # 控制器层
│ │ ├── stockController.ts
│ │ ├── sectorController.ts
│ │ └── userController.ts
│ │
│ ├── services/ # 业务逻辑层
│ │ ├── stockService.ts
│ │ ├── sectorService.ts
│ │ └── dataSyncService.ts
│ │
│ ├── models/ # 数据模型层
│ │ ├── Stock.ts
│ │ ├── Sector.ts
│ │ └── User.ts
│ │
│ ├── routes/ # 路由定义
│ │ ├── stockRoutes.ts
│ │ ├── sectorRoutes.ts
│ │ └── userRoutes.ts
│ │
│ ├── middleware/ # 中间件
│ │ ├── auth.ts
│ │ ├── errorHandler.ts
│ │ └── rateLimiter.ts
│ │
│ ├── utils/ # 工具函数
│ │ ├── logger.ts
│ │ ├── validator.ts
│ │ └── formatter.ts
│ │
│ ├── config/ # 配置文件
│ │ ├── database.ts
│ │ ├── redis.ts
│ │ └── constants.ts
│ │
│ ├── websocket/ # WebSocket服务
│ │ └── stockSocket.ts
│ │
│ └── app.ts # 应用入口
├── prisma/ # Prisma ORM
│ └── schema.prisma
├── tests/ # 测试文件
├── Dockerfile
├── docker-compose.yml
└── package.json
```
## 四、数据库设计
### 4.1 MySQL 表结构
```sql
-- 股票基本信息表
CREATE TABLE stocks (
id INT PRIMARY KEY AUTO_INCREMENT,
code VARCHAR(10) NOT NULL COMMENT '股票代码',
name VARCHAR(50) NOT NULL COMMENT '股票名称',
industry VARCHAR(50) COMMENT '所属行业',
market VARCHAR(10) COMMENT '所属市场(沪市/深市)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_code (code),
INDEX idx_industry (industry)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 版块信息表
CREATE TABLE sectors (
id INT PRIMARY KEY AUTO_INCREMENT,
code VARCHAR(10) NOT NULL COMMENT '版块代码',
name VARCHAR(50) NOT NULL COMMENT '版块名称',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 股票与版块关联表
CREATE TABLE stock_sectors (
stock_code VARCHAR(10) NOT NULL,
sector_code VARCHAR(10) NOT NULL,
PRIMARY KEY (stock_code, sector_code),
FOREIGN KEY (stock_code) REFERENCES stocks(code),
FOREIGN KEY (sector_code) REFERENCES sectors(code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 实时行情表
CREATE TABLE stock_quotes (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
stock_code VARCHAR(10) NOT NULL,
price DECIMAL(10, 2) NOT NULL COMMENT '当前价格',
open DECIMAL(10, 2) COMMENT '开盘价',
high DECIMAL(10, 2) COMMENT '最高价',
low DECIMAL(10, 2) COMMENT '最低价',
pre_close DECIMAL(10, 2) COMMENT '昨收',
volume BIGINT COMMENT '成交量',
turnover BIGINT COMMENT '成交额',
change_percent DECIMAL(5, 2) COMMENT '涨跌幅',
quote_time TIMESTAMP NOT NULL,
INDEX idx_code_time (stock_code, quote_time),
INDEX idx_time (quote_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- K线数据表
CREATE TABLE kline_data (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
stock_code VARCHAR(10) NOT NULL,
period VARCHAR(10) NOT NULL COMMENT '周期(day/week/month)',
date DATE NOT NULL,
open DECIMAL(10, 2) NOT NULL,
high DECIMAL(10, 2) NOT NULL,
low DECIMAL(10, 2) NOT NULL,
close DECIMAL(10, 2) NOT NULL,
volume BIGINT NOT NULL,
ma5 DECIMAL(10, 2),
ma10 DECIMAL(10, 2),
ma20 DECIMAL(10, 2),
ma30 DECIMAL(10, 2),
ma60 DECIMAL(10, 2),
UNIQUE KEY uk_code_period_date (stock_code, period, date),
INDEX idx_date (date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 版块行情表
CREATE TABLE sector_quotes (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
sector_code VARCHAR(10) NOT NULL,
change_percent DECIMAL(5, 2) COMMENT '涨跌幅',
momentum_score DECIMAL(5, 2) COMMENT '动量分数',
rank INT COMMENT '排名',
volume BIGINT COMMENT '成交量',
turnover BIGINT COMMENT '成交额',
quote_time TIMESTAMP NOT NULL,
INDEX idx_code_time (sector_code, quote_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户自选股表
CREATE TABLE user_favorites (
user_id INT NOT NULL,
stock_code VARCHAR(10) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, stock_code),
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (stock_code) REFERENCES stocks(code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
### 4.2 Redis 缓存设计
```
# 实时行情缓存 (TTL: 60秒)
stock:quote:{stock_code} -> Hash
# 版块行情缓存 (TTL: 60秒)
sector:quote:{sector_code} -> Hash
# K线数据缓存 (TTL: 300秒)
kline:{stock_code}:{period} -> Sorted Set
# 搜索缓存 (TTL: 300秒)
search:{keyword} -> List
# 用户会话 (TTL: 86400秒)
session:{session_id} -> Hash
# 热门股票排行 (TTL: 300秒)
hot:stocks -> Sorted Set
# 涨跌幅分布 (TTL: 60秒)
price:distribution -> Hash
```
## 五、API 设计规范
### 5.1 接口规范
```
Base URL: https://api.aguzhitou.com/v1
请求格式:
- Content-Type: application/json
- Authorization: Bearer {token}
响应格式:
{
"code": 200,
"message": "success",
"data": { ... }
}
错误码:
- 200: 成功
- 400: 请求参数错误
- 401: 未授权
- 403: 禁止访问
- 404: 资源不存在
- 500: 服务器错误
```
### 5.2 接口列表
详见 [04-API接口文档.md](./04-API接口文档.md)
## 六、部署架构
### 6.1 生产环境
```
┌─────────────┐
│ 用户 │
└──────┬──────┘
┌──────▼──────┐
│ CDN加速 │
│ (静态资源) │
└──────┬──────┘
┌────────────┼────────────┐
│ │ │
┌──────▼──────┐ │ ┌───────▼───────┐
│ Nginx │ │ │ Nginx │
│ (负载均衡) │ │ │ (负载均衡) │
└──────┬──────┘ │ └───────┬───────┘
│ │ │
┌──────┴───────────┴────────────┴──────┐
│ │
│ Kubernetes Cluster │
│ ┌─────────┐ ┌─────────┐ │
│ │ Frontend│ │ Frontend│ │
│ │ Pod x3 │ │ Pod x3 │ │
│ └────┬────┘ └────┬────┘ │
│ └────────────┘ │
│ │ │
│ ┌───────────┴───────────┐ │
│ │ Backend │ │
│ │ Pod x3 │ │
│ └───────────┬───────────┘ │
│ │ │
│ ┌───────────┴───────────┐ │
│ │ WebSocket │ │
│ │ Pod x2 │ │
│ └───────────────────────┘ │
│ │
└───────────────────────────────────────┘
┌───────────────────┼───────────────────┐
│ │ │
┌──────▼──────┐ ┌───────▼────────┐ ┌──────▼──────┐
│ MySQL │ │ Redis │ │ 外部API │
│ (主从集群) │ │ (Cluster) │ │ (AKShare等) │
└─────────────┘ └────────────────┘ └─────────────┘
```
### 6.2 Docker 部署
```dockerfile
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["node", "dist/server.js"]
```
```yaml
# docker-compose.yml
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
backend:
build: ./backend
ports:
- "3000:3000"
environment:
- DATABASE_URL=mysql://user:pass@mysql:3306/aguzhitou
- REDIS_URL=redis://redis:6379
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=rootpass
- MYSQL_DATABASE=aguzhitou
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
mysql_data:
redis_data:
```
## 七、性能优化
### 7.1 前端优化
- 代码分割 (Code Splitting)
- 懒加载 (Lazy Loading)
- 图片优化 (WebP格式)
- 缓存策略 (Service Worker)
- CDN加速
### 7.2 后端优化
- 数据库索引优化
- Redis缓存
- 接口限流
- 连接池
- 异步处理
### 7.3 监控
- 前端性能监控 (Web Vitals)
- 后端APM (New Relic / Sentry)
- 日志收集 (ELK Stack)
- 告警通知
## 八、安全规范
### 8.1 前端安全
- XSS防护
- CSRF防护
- HTTPS强制
- Content Security Policy
### 8.2 后端安全
- 接口鉴权 (JWT)
- 参数校验
- SQL注入防护
- 敏感信息加密
- 访问日志
## 九、开发规范
### 9.1 代码规范
- ESLint + Prettier
- Git Commit 规范
- 代码审查 (Code Review)
- 单元测试覆盖率 > 80%
### 9.2 Git 工作流
```
main (生产分支)
develop (开发分支)
feature/* (功能分支)
hotfix/* (紧急修复)
```
## 十、技术债务
| 问题 | 优先级 | 解决方案 |
|-----|-------|---------|
| 缺少后端API | 高 | 开发Node.js/Python后端 |
| 使用模拟数据 | 高 | 接入真实数据源 |
| 缺少用户系统 | 中 | 开发登录注册功能 |
| 缺少测试 | 中 | 补充单元测试和E2E测试 |
| 缺少CI/CD | 低 | 配置GitHub Actions |