550 lines
13 KiB
Markdown
550 lines
13 KiB
Markdown
## 1. 架构设计
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[用户设备] --> B[uniapp-x跨平台应用]
|
||
B --> C[微信小程序]
|
||
B --> D[iOS App]
|
||
B --> E[Android App]
|
||
B --> F[H5 Web]
|
||
|
||
C --> G[微信API]
|
||
D --> H[iOS原生API]
|
||
E --> I[Android原生API]
|
||
F --> J[浏览器API]
|
||
|
||
G --> K[业务服务层]
|
||
H --> K
|
||
I --> K
|
||
J --> K
|
||
|
||
K --> L[内容分发网络CDN]
|
||
K --> M[后端API服务]
|
||
K --> N[实时通信服务]
|
||
|
||
M --> O[(数据库)]
|
||
M --> P[(Redis缓存)]
|
||
M --> Q[(对象存储)]
|
||
|
||
subgraph "前端层"
|
||
B
|
||
C
|
||
D
|
||
E
|
||
F
|
||
end
|
||
|
||
subgraph "平台适配层"
|
||
G
|
||
H
|
||
I
|
||
J
|
||
end
|
||
|
||
subgraph "服务层"
|
||
K
|
||
L
|
||
M
|
||
N
|
||
O
|
||
P
|
||
Q
|
||
end
|
||
```
|
||
|
||
## 2. 技术描述
|
||
|
||
### 前端技术栈
|
||
|
||
* **跨平台框架**: uniapp-x (Vue3 + TypeScript)
|
||
|
||
* **状态管理**: Pinia (替代Vuex)
|
||
|
||
* **UI组件库**: uView-plus (uniapp生态组件库)
|
||
|
||
* **构建工具**: Vite (开发环境) + Webpack (生产环境)
|
||
|
||
* **样式方案**: SCSS + CSS变量 + Flex布局
|
||
|
||
* **图标方案**: iconfont + 本地SVG图标
|
||
|
||
* **动画库**: CSS3动画 + uni.createAnimation API
|
||
|
||
### 后端技术栈
|
||
|
||
* **API服务**: Node.js + Express/Koa2
|
||
|
||
* **数据库**: MySQL 8.0 (主数据库)
|
||
|
||
* **缓存**: Redis 6.0 (会话缓存 + 热点数据)
|
||
|
||
* **文件存储**: 阿里云OSS / 腾讯云COS
|
||
|
||
* **CDN加速**: 阿里云CDN / 腾讯云CDN
|
||
|
||
* **实时通信**: WebSocket + Socket.io
|
||
|
||
* **消息队列**: Redis Pub/Sub (轻量级)
|
||
|
||
### 第三方服务
|
||
|
||
* **视频服务**: 腾讯云点播 / 阿里云视频点播
|
||
|
||
* **音频服务**: 腾讯云音视频 / 网易云信
|
||
|
||
* **推送服务**: 个推 / 极光推送
|
||
|
||
* **登录认证**: 微信登录 + 手机号验证码
|
||
|
||
* **支付服务**: 微信支付 + 支付宝支付
|
||
|
||
## 3. 路由定义
|
||
|
||
### 底部导航路由
|
||
|
||
| 路由路径 | 页面名称 | 功能描述 |
|
||
| ------------------------------ | ---- | ------------- |
|
||
| /pages/index/index | 首页 | 推荐内容聚合,个性化内容流 |
|
||
| /pages/short-video/short-video | 短视频 | 沉浸式竖屏短视频播放 |
|
||
| /pages/long-video/long-video | 长视频 | 影视综等长视频内容分类 |
|
||
| /pages/music/music | 音乐 | 在线音乐播放和歌单管理 |
|
||
| /pages/novel/novel | 小说 | 电子书阅读和书架管理 |
|
||
| /pages/profile/profile | 我的 | 个人中心和相关设置 |
|
||
|
||
### 功能页面路由
|
||
|
||
| 路由路径 | 页面名称 | 功能描述 |
|
||
| -------------------------- | ---- | ----------- |
|
||
| /pages/search/search | 搜索页 | 全局内容搜索和智能联想 |
|
||
| /pages/player/player | 播放器 | 视频/音乐播放控制页面 |
|
||
| /pages/detail/detail | 详情页 | 内容详细信息展示 |
|
||
| /pages/category/category | 分类页 | 内容分类筛选和浏览 |
|
||
| /pages/reader/reader | 阅读器 | 小说阅读界面 |
|
||
| /pages/bookshelf/bookshelf | 书架 | 用户收藏的小说管理 |
|
||
| /pages/history/history | 历史记录 | 观看/收听/阅读历史 |
|
||
| /pages/settings/settings | 设置页 | 应用设置和偏好配置 |
|
||
| /pages/login/login | 登录页 | 用户登录和注册 |
|
||
| /pages/vip/vip | 会员页 | VIP会员开通和管理 |
|
||
|
||
### 子页面路由
|
||
|
||
| 路由路径 | 页面名称 | 功能描述 |
|
||
| --------------------------- | ---- | -------- |
|
||
| /pages/profile/edit-profile | 编辑资料 | 用户个人信息编辑 |
|
||
| /pages/profile/favorites | 我的收藏 | 收藏内容管理 |
|
||
| /pages/profile/download | 离线下载 | 离线内容管理 |
|
||
| /pages/music/playlist | 歌单详情 | 音乐歌单详细页面 |
|
||
| /pages/long-video/series | 剧集列表 | 电视剧分集选择 |
|
||
| /pages/short-video/upload | 上传视频 | 短视频上传发布 |
|
||
|
||
## 4. API定义
|
||
|
||
### 4.1 用户认证相关API
|
||
|
||
#### 用户登录
|
||
|
||
```
|
||
POST /api/auth/login
|
||
```
|
||
|
||
请求参数:
|
||
|
||
| 参数名 | 类型 | 必填 | 描述 |
|
||
| -------- | ------ | -- | -------------------------- |
|
||
| mobile | string | 是 | 手机号 |
|
||
| code | string | 是 | 短信验证码 |
|
||
| platform | string | 是 | 平台类型:wechat/ios/android/h5 |
|
||
|
||
响应示例:
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "登录成功",
|
||
"data": {
|
||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"userInfo": {
|
||
"userId": "123456",
|
||
"nickname": "用户昵称",
|
||
"avatar": "https://example.com/avatar.jpg",
|
||
"vipLevel": 1,
|
||
"expireTime": "2024-12-31 23:59:59"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 获取验证码
|
||
|
||
```
|
||
POST /api/auth/sendCode
|
||
```
|
||
|
||
请求参数:
|
||
|
||
| 参数名 | 类型 | 必填 | 描述 |
|
||
| ------ | ------ | -- | -------------------- |
|
||
| mobile | string | 是 | 手机号 |
|
||
| type | string | 是 | 验证码类型:login/register |
|
||
|
||
### 4.2 内容相关API
|
||
|
||
#### 获取首页推荐内容
|
||
|
||
```
|
||
GET /api/content/recommend
|
||
```
|
||
|
||
请求参数:
|
||
|
||
| 参数名 | 类型 | 必填 | 描述 |
|
||
| ----------- | ------ | -- | -------------------------- |
|
||
| page | number | 否 | 页码,默认1 |
|
||
| pageSize | number | 否 | 每页数量,默认20 |
|
||
| contentType | string | 否 | 内容类型:all/video/music/novel |
|
||
|
||
#### 获取短视频列表
|
||
|
||
```
|
||
GET /api/short-video/list
|
||
```
|
||
|
||
请求参数:
|
||
|
||
| 参数名 | 类型 | 必填 | 描述 |
|
||
| -------- | ------ | -- | --------- |
|
||
| lastId | string | 否 | 最后一条视频ID |
|
||
| count | number | 否 | 获取数量,默认10 |
|
||
| category | string | 否 | 视频分类 |
|
||
|
||
#### 获取长视频分类
|
||
|
||
```
|
||
GET /api/long-video/category
|
||
```
|
||
|
||
#### 获取音乐歌单
|
||
|
||
```
|
||
GET /api/music/playlist
|
||
```
|
||
|
||
#### 获取小说分类
|
||
|
||
```
|
||
GET /api/novel/category
|
||
```
|
||
|
||
### 4.3 播放相关API
|
||
|
||
#### 获取视频播放地址
|
||
|
||
```
|
||
GET /api/player/video/url
|
||
```
|
||
|
||
请求参数:
|
||
|
||
| 参数名 | 类型 | 必填 | 描述 |
|
||
| ------- | ------ | -- | ----------------- |
|
||
| videoId | string | 是 | 视频ID |
|
||
| quality | string | 否 | 清晰度:auto/hd/sd/ld |
|
||
|
||
#### 获取音乐播放地址
|
||
|
||
```
|
||
GET /api/player/music/url
|
||
```
|
||
|
||
#### 记录播放进度
|
||
|
||
```
|
||
POST /api/player/progress
|
||
```
|
||
|
||
### 4.4 用户行为API
|
||
|
||
#### 点赞/取消点赞
|
||
|
||
```
|
||
POST /api/interact/like
|
||
```
|
||
|
||
#### 收藏/取消收藏
|
||
|
||
```
|
||
POST /api/interact/favorite
|
||
```
|
||
|
||
#### 发表评论
|
||
|
||
```
|
||
POST /api/interact/comment
|
||
```
|
||
|
||
#### 关注/取消关注
|
||
|
||
```
|
||
POST /api/interact/follow
|
||
```
|
||
|
||
### 4.5 搜索相关API
|
||
|
||
#### 搜索建议
|
||
|
||
```
|
||
GET /api/search/suggest
|
||
```
|
||
|
||
#### 搜索结果
|
||
|
||
```
|
||
GET /api/search/result
|
||
```
|
||
|
||
## 5. 服务器架构设计
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[客户端请求] --> B[API网关层]
|
||
B --> C[负载均衡器]
|
||
C --> D[应用服务集群]
|
||
|
||
D --> E[用户服务]
|
||
D --> F[内容服务]
|
||
D --> G[播放服务]
|
||
D --> H[推荐服务]
|
||
|
||
E --> I[(用户数据库)]
|
||
F --> J[(内容数据库)]
|
||
G --> K[(播放记录)]
|
||
H --> L[(Redis缓存)]
|
||
|
||
D --> M[消息队列]
|
||
M --> N[日志服务]
|
||
M --> O[统计服务]
|
||
|
||
subgraph "网关层"
|
||
B
|
||
C
|
||
end
|
||
|
||
subgraph "应用层"
|
||
D
|
||
E
|
||
F
|
||
G
|
||
H
|
||
end
|
||
|
||
subgraph "数据层"
|
||
I
|
||
J
|
||
K
|
||
L
|
||
end
|
||
|
||
subgraph "服务层"
|
||
M
|
||
N
|
||
O
|
||
end
|
||
```
|
||
|
||
## 6. 数据模型
|
||
|
||
### 6.1 用户相关数据模型
|
||
|
||
```mermaid
|
||
erDiagram
|
||
USER ||--o{ USER_PROFILE : has
|
||
USER ||--o{ USER_VIP : has
|
||
USER ||--o{ USER_FAVORITE : has
|
||
USER ||--o{ USER_HISTORY : has
|
||
USER ||--o{ USER_FOLLOW : follows
|
||
|
||
USER {
|
||
string userId PK
|
||
string mobile UK
|
||
string password
|
||
string nickname
|
||
string avatar
|
||
integer status
|
||
datetime createTime
|
||
datetime updateTime
|
||
}
|
||
|
||
USER_PROFILE {
|
||
string userId PK
|
||
string gender
|
||
date birthday
|
||
string city
|
||
string signature
|
||
integer level
|
||
integer experience
|
||
}
|
||
|
||
USER_VIP {
|
||
string userId PK
|
||
integer vipLevel
|
||
datetime startTime
|
||
datetime expireTime
|
||
boolean autoRenew
|
||
}
|
||
|
||
USER_FAVORITE {
|
||
string id PK
|
||
string userId FK
|
||
string contentId FK
|
||
string contentType
|
||
datetime createTime
|
||
}
|
||
|
||
USER_HISTORY {
|
||
string id PK
|
||
string userId FK
|
||
string contentId FK
|
||
string contentType
|
||
integer progress
|
||
datetime lastPlayTime
|
||
}
|
||
```
|
||
|
||
### 6.2 内容相关数据模型
|
||
|
||
```mermaid
|
||
erDiagram
|
||
CONTENT ||--o{ CONTENT_DETAIL : has
|
||
CONTENT ||--o{ CONTENT_TAG : has
|
||
CONTENT ||--o{ CONTENT_STAT : has
|
||
CONTENT ||--o{ COMMENT : has
|
||
|
||
CONTENT {
|
||
string contentId PK
|
||
string title
|
||
string cover
|
||
string contentType
|
||
string category
|
||
integer duration
|
||
string tags
|
||
integer status
|
||
datetime publishTime
|
||
}
|
||
|
||
CONTENT_DETAIL {
|
||
string contentId PK
|
||
string description
|
||
string director
|
||
string actors
|
||
string area
|
||
integer year
|
||
float rating
|
||
integer episodeCount
|
||
}
|
||
|
||
CONTENT_TAG {
|
||
string id PK
|
||
string contentId FK
|
||
string tagName
|
||
integer weight
|
||
}
|
||
|
||
CONTENT_STAT {
|
||
string contentId PK
|
||
integer viewCount
|
||
integer likeCount
|
||
integer favoriteCount
|
||
integer commentCount
|
||
integer shareCount
|
||
}
|
||
```
|
||
|
||
### 6.3 数据库表结构示例
|
||
|
||
#### 用户表 (users)
|
||
|
||
```sql
|
||
CREATE TABLE users (
|
||
user_id VARCHAR(32) PRIMARY KEY COMMENT '用户ID',
|
||
mobile VARCHAR(11) UNIQUE NOT NULL COMMENT '手机号',
|
||
password VARCHAR(64) NOT NULL COMMENT '密码',
|
||
nickname VARCHAR(50) NOT NULL COMMENT '昵称',
|
||
avatar VARCHAR(255) COMMENT '头像URL',
|
||
status TINYINT DEFAULT 1 COMMENT '状态:1正常 0禁用',
|
||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
INDEX idx_mobile (mobile),
|
||
INDEX idx_status (status)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
|
||
```
|
||
|
||
#### 内容表 (contents)
|
||
|
||
```sql
|
||
CREATE TABLE contents (
|
||
content_id VARCHAR(32) PRIMARY KEY COMMENT '内容ID',
|
||
title VARCHAR(100) NOT NULL COMMENT '标题',
|
||
cover VARCHAR(255) COMMENT '封面URL',
|
||
content_type VARCHAR(20) NOT NULL COMMENT '内容类型:video/music/novel',
|
||
category VARCHAR(50) COMMENT '分类',
|
||
duration INT COMMENT '时长(秒)',
|
||
tags TEXT COMMENT '标签,逗号分隔',
|
||
status TINYINT DEFAULT 1 COMMENT '状态:1正常 0下架',
|
||
publish_time DATETIME COMMENT '发布时间',
|
||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
INDEX idx_type_category (content_type, category),
|
||
INDEX idx_status_time (status, publish_time DESC),
|
||
INDEX idx_tags (tags(100))
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='内容表';
|
||
```
|
||
|
||
#### 用户历史记录表 (user\_history)
|
||
|
||
```sql
|
||
CREATE TABLE user_history (
|
||
id VARCHAR(32) PRIMARY KEY COMMENT '记录ID',
|
||
user_id VARCHAR(32) NOT NULL COMMENT '用户ID',
|
||
content_id VARCHAR(32) NOT NULL COMMENT '内容ID',
|
||
content_type VARCHAR(20) NOT NULL COMMENT '内容类型',
|
||
progress INT DEFAULT 0 COMMENT '播放进度(秒)',
|
||
last_play_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '最后播放时间',
|
||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
UNIQUE KEY uk_user_content (user_id, content_id),
|
||
INDEX idx_user_time (user_id, last_play_time DESC),
|
||
INDEX idx_content_type (content_type)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户播放历史表';
|
||
```
|
||
|
||
## 7. 性能优化方案
|
||
|
||
### 7.1 前端优化
|
||
|
||
* **资源压缩**:图片压缩、代码混淆、分包加载
|
||
|
||
* **懒加载**:图片懒加载、组件懒加载、路由懒加载
|
||
|
||
* **缓存策略**:接口缓存、图片缓存、离线包机制
|
||
|
||
* **渲染优化**:虚拟列表、防抖节流、异步渲染
|
||
|
||
### 7.2 后端优化
|
||
|
||
* **数据库优化**:索引优化、查询优化、分库分表
|
||
|
||
* **缓存策略**:Redis缓存、CDN缓存、浏览器缓存
|
||
|
||
* **接口优化**:接口合并、数据压缩、分页加载
|
||
|
||
* **并发处理**:连接池、异步处理、队列机制
|
||
|
||
### 7.3 内容分发优化
|
||
|
||
* **CDN加速**:静态资源CDN、视频CDN、音频CDN
|
||
|
||
* **预加载策略**:智能预加载、按需加载、优先级加载
|
||
|
||
* **多码率适配**:根据网络自动选择清晰度
|
||
|
||
* **断点续传**:支持大文件断点续传,提升用户体验
|
||
|