# 搜索历史数据模型
**本文档引用的文件**
- [schema.prisma](file://server/prisma/schema.prisma)
- [search.service.ts](file://server/src/modules/search/search.service.ts)
- [search.controller.ts](file://server/src/modules/search/search.controller.ts)
- [index.vue](file://my-uniapp-vue3/src/pages/search/index.vue)
- [history.controller.ts](file://server/src/modules/history/history.controller.ts)
- [history-batch.controller.ts](file://server/src/modules/history/history-batch.controller.ts)
- [API.md](file://docs/API.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本文件详细阐述AI有声书生成平台的搜索历史数据模型设计与实现。搜索历史功能旨在记录用户的搜索行为,提供个性化搜索体验,并支持热门搜索统计与推荐。本文档将深入解析SearchHistory模型的设计理念、字段作用、存储策略、清理机制,以及与用户(User)模型的一对多关系。
## 项目结构
搜索历史功能涉及以下关键文件:
- 数据库模型定义:Prisma Schema
- 业务逻辑层:SearchService
- API接口层:SearchController
- 前端交互:Vue页面组件
- 历史记录管理:历史控制器与批量删除控制器
```mermaid
graph TB
subgraph "前端"
FE_Search["搜索页面
index.vue"]
end
subgraph "后端"
SC["SearchController
search.controller.ts"]
SS["SearchService
search.service.ts"]
HC["HistoryController
history.controller.ts"]
HBC["HistoryBatchController
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
```
**图表来源**
- [search.controller.ts:1-170](file://server/src/modules/search/search.controller.ts#L1-L170)
- [search.service.ts:1-144](file://server/src/modules/search/search.service.ts#L1-L144)
- [history.controller.ts:1-67](file://server/src/modules/history/history.controller.ts#L1-L67)
- [history-batch.controller.ts:1-105](file://server/src/modules/history/history-batch.controller.ts#L1-L105)
- [schema.prisma:220-240](file://server/prisma/schema.prisma#L220-L240)
**章节来源**
- [search.controller.ts:1-170](file://server/src/modules/search/search.controller.ts#L1-L170)
- [search.service.ts:1-144](file://server/src/modules/search/search.service.ts#L1-L144)
- [schema.prisma:220-240](file://server/prisma/schema.prisma#L220-L240)
## 核心组件
搜索历史功能的核心由以下组件构成:
- SearchHistory模型:存储用户搜索记录
- HotSearch模型:维护热门搜索词及其热度
- SearchService:提供搜索历史的增删改查与热门统计
- SearchController:暴露REST API接口
- 前端Vue组件:展示搜索历史与热门推荐
**章节来源**
- [schema.prisma:220-240](file://server/prisma/schema.prisma#L220-L240)
- [search.service.ts:1-144](file://server/src/modules/search/search.service.ts#L1-L144)
- [search.controller.ts:1-170](file://server/src/modules/search/search.controller.ts#L1-L170)
## 架构概览
搜索历史功能采用分层架构:
- 表现层:Vue页面组件负责用户交互与数据展示
- 控制器层:Koa路由控制器处理HTTP请求与响应
- 服务层:SearchService封装业务逻辑与数据操作
- 数据层:Prisma ORM连接MySQL数据库
```mermaid
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响应
```
**图表来源**
- [search.controller.ts:60-113](file://server/src/modules/search/search.controller.ts#L60-L113)
- [search.service.ts:52-119](file://server/src/modules/search/search.service.ts#L52-L119)
- [schema.prisma:220-240](file://server/prisma/schema.prisma#L220-L240)
## 详细组件分析
### SearchHistory模型设计
SearchHistory模型是搜索历史功能的数据基础,包含以下字段:
- id:自增主键
- userId:用户标识,关联User模型
- keyword:搜索关键词
- createdAt:记录创建时间戳
该模型通过索引优化查询性能:
- 对(userId, createdAt)建立复合索引
- 对(userId)建立单独索引
```mermaid
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 : "参与搜索"
```
**图表来源**
- [schema.prisma:10-38](file://server/prisma/schema.prisma#L10-L38)
- [schema.prisma:220-240](file://server/prisma/schema.prisma#L220-L240)
**章节来源**
- [schema.prisma:220-228](file://server/prisma/schema.prisma#L220-L228)
### 搜索历史与用户的关系
SearchHistory与User模型建立一对多关系:
- User模型通过comments、drafts、favorites、orders等字段关联其他实体
- SearchHistory通过userId外键关联User
- 查询时可通过userId高效筛选特定用户的搜索历史
**章节来源**
- [schema.prisma:10-38](file://server/prisma/schema.prisma#L10-L38)
- [schema.prisma:220-228](file://server/prisma/schema.prisma#L220-L228)
### 存储策略与清理机制
SearchService实现了完善的存储策略:
- 去重规则:同一用户对同一关键词仅保留最新记录
- 时间限制:用户历史记录上限为20条,超出部分按时间顺序删除最旧记录
- 热门统计:每次新增搜索历史时更新HotSearch表的count字段
```mermaid
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(["完成"])
```
**图表来源**
- [search.service.ts:72-119](file://server/src/modules/search/search.service.ts#L72-L119)
**章节来源**
- [search.service.ts:72-119](file://server/src/modules/search/search.service.ts#L72-L119)
### 热门搜索统计
热门搜索统计通过HotSearch模型实现:
- count字段记录关键词被搜索的次数
- sort字段用于排序权重
- getHotSearches方法按sort降序、count降序返回热门词
**章节来源**
- [schema.prisma:230-240](file://server/prisma/schema.prisma#L230-L240)
- [search.service.ts:41-49](file://server/src/modules/search/search.service.ts#L41-L49)
### API使用示例
以下是搜索历史功能的API使用示例:
#### 获取搜索历史
```javascript
// 前端调用示例
const response = await get('/search/history', { userId: 1, limit: 5 });
console.log(response.data); // 搜索历史数组
```
#### 保存搜索历史
```javascript
// 前端调用示例
await post('/search/history', { userId: 1, keyword: 'AI有声书' });
```
#### 删除单条搜索历史
```javascript
// 前端调用示例
await get('/search/history', { userId: 1, keyword: 'AI有声书' });
```
#### 清空搜索历史
```javascript
// 前端调用示例
await get('/search/history/all', { userId: 1 });
```
**章节来源**
- [search.controller.ts:60-167](file://server/src/modules/search/search.controller.ts#L60-L167)
- [index.vue:166-222](file://my-uniapp-vue3/src/pages/search/index.vue#L166-L222)
### 前端交互实现
前端Vue组件实现了搜索历史的展示与交互:
- 展示搜索历史标签与热门推荐
- 支持点击历史标签直接搜索
- 支持删除单条历史与清空历史
- 使用缓存机制提升用户体验
**章节来源**
- [index.vue:46-89](file://my-uniapp-vue3/src/pages/search/index.vue#L46-L89)
- [index.vue:166-250](file://my-uniapp-vue3/src/pages/search/index.vue#L166-L250)
## 依赖关系分析
搜索历史功能的依赖关系如下:
```mermaid
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
```
**图表来源**
- [search.controller.ts:1-5](file://server/src/modules/search/search.controller.ts#L1-L5)
- [search.service.ts](file://server/src/modules/search/search.service.ts#L1)
- [schema.prisma:220-240](file://server/prisma/schema.prisma#L220-L240)
**章节来源**
- [search.controller.ts:1-5](file://server/src/modules/search/search.controller.ts#L1-L5)
- [search.service.ts](file://server/src/modules/search/search.service.ts#L1)
## 性能考量
搜索历史功能的性能优化措施:
- 数据库索引:对(userId, createdAt)和(userId)建立索引,提升查询效率
- 去重策略:同一用户同一关键词仅保留最新记录,减少重复数据
- 记录限制:用户历史记录上限20条,控制存储空间
- 热门统计:异步更新热门搜索,不影响主流程性能
## 故障排除指南
常见问题及解决方案:
- 关键词为空:API会返回400错误,需确保keyword参数有效
- 用户ID无效:默认使用测试用户ID进行开发环境测试
- 查询超时:检查数据库索引是否正确创建
- 热门统计异常:确认HotSearch表数据完整性
**章节来源**
- [search.controller.ts:92-98](file://server/src/modules/search/search.controller.ts#L92-L98)
- [history.controller.ts:6-13](file://server/src/modules/history/history.controller.ts#L6-L13)
## 结论
搜索历史数据模型通过清晰的字段设计、合理的存储策略和完善的清理机制,为AI有声书生成平台提供了可靠的搜索行为追踪能力。结合前端友好的交互界面,用户可以便捷地管理自己的搜索历史,同时平台能够基于热门搜索统计优化搜索体验。该设计既保证了数据的准确性与时效性,又兼顾了系统的性能与可维护性。