本文引用的文件
本文件面向AI有声书生成平台的用户偏好设置模型,围绕UserPreference模型的配置项进行深入解析,包括播放速度、音质、主题、默认音色ID、默认音量、自动播放下一首、仅WiFi下载等个性化设置字段。文档详细说明每个配置项的作用机制、取值范围与业务逻辑,并解释网络相关设置对用户体验的影响。同时提供偏好设置的CRUD操作示例,涵盖用户首次登录时的默认配置初始化、偏好修改更新、设置同步等实现方法。
用户偏好设置涉及前后端协作:
路由注册将“/api/user/preferences”挂载至偏好设置控制器。
graph TB
subgraph "前端UniApp/Vue3"
FE_Settings["设置页面<br/>index.vue"]
FE_Store["本地存储<br/>storage.ts"]
end
subgraph "后端Koa"
BE_Router["路由注册<br/>app.ts"]
BE_Controller["控制器<br/>preferences.controller.ts"]
BE_Service["服务层<br/>preferences.service.ts"]
end
subgraph "数据库Prisma/MySQL"
DB_Model["UserPreference 模型<br/>schema.prisma"]
end
FE_Settings --> |HTTP 请求| BE_Router
BE_Router --> BE_Controller
BE_Controller --> BE_Service
BE_Service --> DB_Model
FE_Settings --> |本地缓存| FE_Store
图表来源
章节来源
章节来源
用户偏好设置采用“前端界面 + 后端接口 + 数据库模型”的分层设计。前端通过HTTP请求与后端交互,后端通过Prisma ORM访问MySQL;同时前端本地存储用于提升初次加载体验与离线可用性。
sequenceDiagram
participant U as "用户"
participant FE as "前端设置页面<br/>index.vue"
participant API as "后端接口<br/>preferences.controller.ts"
participant SVC as "服务层<br/>preferences.service.ts"
participant DB as "数据库<br/>UserPreference"
U->>FE : 打开设置页面
FE->>FE : 读取本地缓存<br/>uni.getStorageSync('userPreferences')
FE->>API : GET /api/user/preferences
API->>SVC : getPreferences(userId)
SVC->>DB : upsert 默认值
DB-->>SVC : 返回偏好记录
SVC-->>API : 返回偏好数据
API-->>FE : 响应数据
FE->>FE : 合并本地与远端偏好
FE->>FE : 保存到本地缓存
U->>FE : 修改偏好如默认音量
FE->>API : PUT /api/user/preferences
API->>SVC : updatePreferences(userId, data)
SVC->>DB : upsert 条件更新
DB-->>SVC : 返回更新后的记录
SVC-->>API : 返回更新结果
API-->>FE : 响应更新结果
FE->>FE : 同步本地缓存
图表来源
UserPreference模型定义了用户偏好的字段、默认值与约束,确保每个用户拥有独立且完整的偏好记录。
erDiagram
USER ||--o| USER_PREFERENCE : "拥有"
USER_PREFERENCE {
int id PK
int userId UK
float playSpeed
string quality
string theme
string defaultVoiceId
int defaultVolume
boolean autoPlayNext
boolean wifiOnlyDownload
datetime createdAt
datetime updatedAt
}
图表来源
字段作用与默认值
章节来源
章节来源
updatePreferences(userId, data):若已有记录则更新,否则按传入数据(缺失字段使用默认值)创建。
flowchart TD
Start(["进入 getPreferences"]) --> Upsert["upsert 用户偏好<br/>不存在则使用默认值创建"]
Upsert --> ReturnPref["返回偏好记录"]
ReturnPref --> End(["结束"])
UpdateStart(["进入 updatePreferences"]) --> FindExisting["查询是否存在记录"]
FindExisting --> Exists{"存在?"}
Exists --> |是| Update["更新记录"]
Exists --> |否| Create["按传入数据创建<br/>缺失字段使用默认值"]
Update --> UpdateEnd(["返回更新结果"])
Create --> UpdateEnd
图表来源
章节来源
同步:每次修改后调用PUT接口更新后端,并同步本地缓存。
sequenceDiagram
participant Page as "设置页面<br/>index.vue"
participant Local as "本地缓存<br/>uni.getStorageSync"
participant API as "后端接口<br/>preferences.controller.ts"
Page->>Local : 读取本地偏好
Page->>API : GET /api/user/preferences
API-->>Page : 返回偏好数据
Page->>Page : 合并本地与远端偏好
Page->>Local : 写入合并后的偏好
Page->>API : PUT /api/user/preferences修改后
API-->>Page : 返回更新结果
Page->>Local : 同步本地缓存
图表来源
章节来源
章节来源
章节来源
章节来源
章节来源
路由在应用启动时注册,将"/api/user/preferences"映射到控制器。
graph LR
FE_Index["设置页面<br/>index.vue"] --> FE_Request["HTTP 请求工具"]
FE_Index --> FE_Store["本地存储<br/>storage.ts"]
FE_Request --> BE_Controller["控制器<br/>preferences.controller.ts"]
BE_Controller --> BE_Service["服务层<br/>preferences.service.ts"]
BE_Service --> DB["UserPreference 模型<br/>schema.prisma"]
APP["应用入口<br/>app.ts"] --> BE_Controller
图表来源
章节来源
章节来源
UserPreference模型为AI有声书平台提供了完善的个性化能力,覆盖播放、外观、下载与存储等多个维度。通过前后端协同与本地缓存策略,既保证了用户体验的流畅性,又确保了数据的一致性与可靠性。后续可在保持现有默认值与upsert语义的基础上,进一步扩展更多偏好项并完善边界校验与错误处理。