本文档引用的文件
本文件详细阐述AI有声书生成平台的搜索历史数据模型设计与实现。搜索历史功能旨在记录用户的搜索行为,提供个性化搜索体验,并支持热门搜索统计与推荐。本文档将深入解析SearchHistory模型的设计理念、字段作用、存储策略、清理机制,以及与用户(User)模型的一对多关系。
搜索历史功能涉及以下关键文件:
历史记录管理:历史控制器与批量删除控制器
graph TB
subgraph "前端"
FE_Search["搜索页面<br/>index.vue"]
end
subgraph "后端"
SC["SearchController<br/>search.controller.ts"]
SS["SearchService<br/>search.service.ts"]
HC["HistoryController<br/>history.controller.ts"]
HBC["HistoryBatchController<br/>history-batch.controller.ts"]
end
subgraph "数据层"
PRISMA["Prisma Client"]
DB[("MySQL 数据库")]
end
FE_Search --> SC
SC --> SS
SS --> PRISMA
PRISMA --> DB
HC --> PRISMA
HBC --> PRISMA
图表来源
章节来源
搜索历史功能的核心由以下组件构成:
章节来源
搜索历史功能采用分层架构:
数据层:Prisma ORM连接MySQL数据库
sequenceDiagram
participant FE as "前端页面"
participant SC as "SearchController"
participant SS as "SearchService"
participant PRISMA as "Prisma Client"
participant DB as "MySQL数据库"
FE->>SC : GET /api/search/history?userId=1&limit=5
SC->>SS : getSearchHistory(userId, limit)
SS->>PRISMA : findMany(SearchHistory)
PRISMA->>DB : SELECT * FROM SearchHistory
DB-->>PRISMA : 历史记录
PRISMA-->>SS : 历史记录
SS-->>SC : 历史记录
SC-->>FE : JSON响应
Note over FE,DB : 用户点击搜索时
FE->>SC : POST /api/search/history {userId, keyword}
SC->>SS : saveSearchHistory(userId, keyword)
SS->>PRISMA : deleteMany(SearchHistory)
PRISMA->>DB : DELETE FROM SearchHistory WHERE userId AND keyword
SS->>PRISMA : create(SearchHistory)
PRISMA->>DB : INSERT INTO SearchHistory
SS->>PRISMA : findMany(SearchHistory)
PRISMA->>DB : SELECT * FROM SearchHistory ORDER BY createdAt DESC
SS->>PRISMA : deleteMany(SearchHistory)
PRISMA->>DB : DELETE old records (超过20条)
SS->>PRISMA : findFirst(HotSearch)
PRISMA->>DB : SELECT * FROM HotSearch WHERE keyword
SS->>PRISMA : update/create HotSearch
PRISMA->>DB : UPDATE/INSERT HotSearch
SS-->>SC : 完成
SC-->>FE : JSON响应
图表来源
SearchHistory模型是搜索历史功能的数据基础,包含以下字段:
该模型通过索引优化查询性能:
对(userId)建立单独索引
erDiagram
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
}
SEARCH_HISTORY {
int id PK
int userId FK
string keyword
datetime createdAt
}
HOT_SEARCH {
int id PK
string keyword
int count
int sort
datetime createdAt
datetime updatedAt
}
USER ||--o{ SEARCH_HISTORY : "拥有多个"
USER ||--o{ HOT_SEARCH : "参与搜索"
图表来源
章节来源
SearchHistory与User模型建立一对多关系:
章节来源
SearchService实现了完善的存储策略:
热门统计:每次新增搜索历史时更新HotSearch表的count字段
flowchart TD
Start(["保存搜索历史"]) --> Validate["验证关键词非空"]
Validate --> Trim["去除首尾空白"]
Trim --> DeleteOld["删除同用户同关键词的历史记录"]
DeleteOld --> CreateNew["创建新的历史记录"]
CreateNew --> FetchAll["获取用户所有历史记录"]
FetchAll --> CheckLimit{"是否超过20条?"}
CheckLimit --> |否| UpdateHot["更新热门搜索统计"]
CheckLimit --> |是| SliceOld["截取最旧的记录"]
SliceOld --> DeleteOldRecords["删除最旧记录"]
DeleteOldRecords --> UpdateHot
UpdateHot --> End(["完成"])
图表来源
章节来源
热门搜索统计通过HotSearch模型实现:
章节来源
以下是搜索历史功能的API使用示例:
// 前端调用示例
const response = await get('/search/history', { userId: 1, limit: 5 });
console.log(response.data); // 搜索历史数组
// 前端调用示例
await post('/search/history', { userId: 1, keyword: 'AI有声书' });
// 前端调用示例
await get('/search/history', { userId: 1, keyword: 'AI有声书' });
// 前端调用示例
await get('/search/history/all', { userId: 1 });
章节来源
前端Vue组件实现了搜索历史的展示与交互:
章节来源
搜索历史功能的依赖关系如下:
graph TB
subgraph "外部依赖"
KOA["Koa Router"]
PRISMA["Prisma Client"]
MYSQL["MySQL"]
end
subgraph "内部模块"
SC["SearchController"]
SS["SearchService"]
SH["SearchHistory Model"]
HS["HotSearch Model"]
end
SC --> SS
SS --> SH
SS --> HS
SS --> PRISMA
PRISMA --> MYSQL
SC --> KOA
图表来源
章节来源
搜索历史功能的性能优化措施:
常见问题及解决方案:
章节来源
搜索历史数据模型通过清晰的字段设计、合理的存储策略和完善的清理机制,为AI有声书生成平台提供了可靠的搜索行为追踪能力。结合前端友好的交互界面,用户可以便捷地管理自己的搜索历史,同时平台能够基于热门搜索统计优化搜索体验。该设计既保证了数据的准确性与时效性,又兼顾了系统的性能与可维护性。