本文档引用的文件
AI有声书生成平台的用户偏好功能为用户提供个性化的播放体验配置。该功能通过UserPreference模型实现了用户个性化设置的持久化存储,涵盖播放速度、音频质量、主题设置、默认音色等多个维度的配置选项。
用户偏好功能采用一对一关系设计,确保每个用户拥有独立且完整的偏好设置集合。系统提供了完善的继承和覆盖机制,支持用户在不同场景下的个性化需求。
用户偏好功能在项目中的组织结构如下:
graph TB
subgraph "后端服务"
A[server/src/app.ts] --> B[preferences.controller.ts]
B --> C[preferences.service.ts]
C --> D[schema.prisma<br/>UserPreference模型]
end
subgraph "前端应用"
E[index.vue<br/>设置页面] --> F[用户偏好接口调用]
end
G[数据库] <- --> D
F --> A
图表来源
章节来源
UserPreference是用户偏好的核心数据模型,定义了完整的个性化配置结构:
erDiagram
UserPreference {
int id PK
int userId UK
float playSpeed
string quality
string theme
string defaultVoiceId
int defaultVolume
boolean autoPlayNext
boolean wifiOnlyDownload
datetime updatedAt
datetime createdAt
}
User {
int id PK
string phone UK
string openid UK
string nickname
string avatar
int memberLevel
datetime memberExpireAt
int dailyUsage
string lastUsageDate
datetime createdAt
datetime updatedAt
int usedAudioMinutes
datetime subscriptionResetDate
}
UserPreference ||--|| User : "一对一关系"
图表来源
| 字段名 | 类型 | 默认值 | 描述 | 作用范围 |
|---|---|---|---|---|
| playSpeed | Float | 1.0 | 播放速度 | 播放器行为控制 |
| quality | String | "standard" | 音频质量 | TTS音色选择 |
| theme | String | "light" | 界面主题 | 界面主题设置 |
| defaultVoiceId | String | "cherry" | 默认音色ID | TTS音色选择 |
| defaultVolume | Int | 50 | 默认音量 | 播放器行为控制 |
| autoPlayNext | Boolean | true | 自动播放下一首 | 播放器行为控制 |
| wifiOnlyDownload | Boolean | false | 仅WiFi下载 | 下载策略控制 |
章节来源
用户偏好功能的整体架构采用分层设计,确保了良好的可维护性和扩展性:
graph TD
subgraph "前端层"
A[设置页面<br/>index.vue]
B[偏好设置UI组件]
end
subgraph "接口层"
C[preferences.controller.ts<br/>路由控制器]
end
subgraph "业务逻辑层"
D[preferences.service.ts<br/>服务层]
end
subgraph "数据访问层"
E[Prisma ORM]
F[MySQL数据库]
end
A --> B
B --> C
C --> D
D --> E
E --> F
G[用户模型] <- --> H[UserPreference模型]
图表来源
服务层负责处理用户偏好的业务逻辑,提供了完整的CRUD操作:
sequenceDiagram
participant Client as 客户端
participant Controller as 控制器
participant Service as 服务层
participant Prisma as Prisma ORM
participant DB as MySQL数据库
Client->>Controller : GET /api/user/preferences
Controller->>Service : getPreferences(userId)
Service->>Prisma : userPreference.upsert()
Prisma->>DB : 查询用户偏好
DB-->>Prisma : 返回结果或空
Prisma-->>Service : 返回偏好设置
Service-->>Controller : 返回数据
Controller-->>Client : JSON响应
Client->>Controller : PUT /api/user/preferences
Controller->>Service : updatePreferences(userId, data)
Service->>Prisma : userPreference.findUnique()
Prisma->>DB : 查询现有偏好
DB-->>Prisma : 返回结果
alt 存在偏好
Prisma->>DB : UPDATE 用户偏好
else 不存在偏好
Prisma->>DB : INSERT 新用户偏好
end
Prisma-->>Service : 返回更新结果
Service-->>Controller : 返回数据
Controller-->>Client : JSON响应
图表来源
控制器层处理HTTP请求和响应,提供了标准的RESTful接口:
classDiagram
class PreferencesController {
+getPreferences(ctx) Response
+updatePreferences(ctx) Response
-TEST_USER_ID string
}
class PreferencesService {
+getPreferences(userId) Promise~UserPreference~
+updatePreferences(userId, data) Promise~UserPreference~
}
class UserPreference {
+id int
+userId int
+playSpeed float
+quality string
+theme string
+defaultVoiceId string
+defaultVolume int
+autoPlayNext boolean
+wifiOnlyDownload boolean
}
PreferencesController --> PreferencesService : "调用"
PreferencesService --> UserPreference : "操作"
图表来源
章节来源
前端设置页面集成了用户偏好功能,提供了直观的配置界面:
flowchart TD
A[设置页面加载] --> B[获取用户偏好]
B --> C{是否已存在偏好?}
C --> |是| D[显示现有偏好]
C --> |否| E[使用默认偏好]
D --> F[用户修改设置]
E --> F
F --> G[保存到服务器]
G --> H[更新本地状态]
H --> I[完成设置]
J[音色选择] --> K[音色列表]
K --> L[选择默认音色]
L --> M[更新偏好设置]
N[主题切换] --> O[主题选项]
O --> P[选择主题]
P --> Q[更新偏好设置]
图表来源
章节来源
用户偏好功能的依赖关系清晰明确,遵循单一职责原则:
graph LR
subgraph "外部依赖"
A[Prisma Client]
B[Koa Router]
C[MySQL驱动]
end
subgraph "内部模块"
D[preferences.controller.ts]
E[preferences.service.ts]
F[schema.prisma]
end
D --> B
E --> A
A --> F
D --> E
G[User模型] --> F
H[UserPreference模型] --> F
图表来源
章节来源
用户偏好功能在设计时充分考虑了性能优化:
| 问题类型 | 症状描述 | 解决方案 |
|---|---|---|
| 数据库连接失败 | 获取偏好设置时报错 | 检查DATABASE_URL配置和数据库服务状态 |
| 用户ID无效 | 抛出类型转换错误 | 确保传入有效的用户ID字符串 |
| 权限不足 | 返回401未授权错误 | 检查用户认证状态和权限配置 |
| 数据同步问题 | 前后端偏好不一致 | 清除浏览器缓存并重新登录 |
章节来源
用户偏好功能通过精心设计的数据模型和清晰的架构实现了完整的个性化配置管理。该功能不仅提升了用户体验,还为后续的功能扩展奠定了坚实的基础。
主要优势包括:
未来可以考虑的改进方向: