本文引用的文件
本文件面向“搜索功能”的技术实现与运维优化,覆盖以下主题:
搜索功能由前端页面、后端控制器与服务层、数据库模型以及缓存与安全中间件共同组成。整体采用前后端分离架构,前端通过 HTTP 接口调用后端搜索能力。
graph TB
FE["前端页面<br/>search/index.vue"] --> API["后端接口<br/>search.controller.ts"]
API --> SVC["搜索服务<br/>search.service.ts"]
SVC --> PRISMA["数据库模型<br/>schema.prisma"]
API --> CACHE["缓存中间件<br/>cache.ts"]
API --> SEC["安全中间件<br/>security.ts"]
CACHE --> REDIS["Redis 缓存<br/>redis.service.ts"]
图表来源
章节来源
章节来源
下图展示了从前端到后端、再到数据库与缓存的整体交互流程。
sequenceDiagram
participant U as "用户"
participant FE as "前端页面<br/>search/index.vue"
participant CTRL as "控制器<br/>search.controller.ts"
participant SVC as "服务层<br/>search.service.ts"
participant DB as "数据库<br/>Prisma"
participant R as "缓存中间件<br/>cache.ts"
participant RS as "Redis<br/>redis.service.ts"
U->>FE : 输入关键词并提交
FE->>CTRL : GET /api/search?q=关键词&limit=N
R-->>CTRL : 命中缓存? 否则透传
CTRL->>SVC : searchAudio(query, limit)
SVC->>DB : 查询书籍标题/描述包含关键词
DB-->>SVC : 返回结果集
SVC-->>CTRL : 结果数组
CTRL-->>FE : 统一响应格式
R-->>RS : 写入缓存(可选)
图表来源
关键流程
搜索成功后刷新历史与热门,并更新本地缓存
flowchart TD
Start(["进入搜索页"]) --> LoadCtx["加载搜索上下文<br/>历史 + 热门"]
LoadCtx --> Input["输入关键词"]
Input --> Submit{"是否为空?"}
Submit --> |是| Wait["等待输入"]
Submit --> |否| SaveHist["保存搜索历史"]
SaveHist --> CallAPI["调用 /api/search?q=&limit="]
CallAPI --> Render["渲染结果/高亮关键词"]
Render --> Refresh["刷新历史与热门"]
Refresh --> End(["结束"])
图表来源
章节来源
参数与返回
错误处理:捕获异常并返回友好提示
sequenceDiagram
participant FE as "前端"
participant CTRL as "控制器"
participant SVC as "服务层"
FE->>CTRL : GET /api/search?q=...&limit=...
CTRL->>CTRL : 参数校验
CTRL->>SVC : searchAudio(query, limit)
SVC-->>CTRL : 结果数组
CTRL-->>FE : {code,message,data}
图表来源
章节来源
历史记录
同步更新热门词计数(存在则自增,否则新建)
flowchart TD
S1["输入: query, limit"] --> Trim["去除空白"]
Trim --> Empty{"是否为空?"}
Empty --> |是| ReturnEmpty["返回空数组"]
Empty --> |否| Build["构造查询条件<br/>标题/描述包含"]
Build --> Order["按创建时间倒序"]
Order --> Take["限制数量"]
Take --> Exec["执行查询"]
Exec --> Out["返回结果"]
图表来源
章节来源
与业务关联
服务层通过 Prisma 对上述模型进行 CRUD
erDiagram
USER {
int id PK
string phone
string openid
}
BOOK {
int id PK
string title
text description
datetime createdAt
}
SEARCH_HISTORY {
int id PK
int userId
string keyword
datetime createdAt
}
HOT_SEARCH {
int id PK
string keyword
int count
int sort
datetime createdAt
datetime updatedAt
}
USER ||--o{ SEARCH_HISTORY : "拥有"
BOOK ||--o{ SEARCH_HISTORY : "被搜索"
图表来源
章节来源
Redis 服务
连接状态管理与错误日志
classDiagram
class CacheMiddleware {
+createCache(options)
+clearCache(keyPrefix)
}
class RedisService {
+isAvailable() bool
+get(key) string
+set(key,value,ttl) bool
+getJSON(key) any
+setJSON(key,obj,ttl) bool
+del(key) bool
+delPattern(pattern) bool
}
CacheMiddleware --> RedisService : "使用"
图表来源
章节来源
敏感数据脱敏:对响应中的敏感字段进行掩码处理
flowchart TD
In["接收请求"] --> XSS["XSS 过滤"]
XSS --> SQL["SQL 注入检测"]
SQL --> OK{"合法?"}
OK --> |否| Block["返回 400"]
OK --> |是| Next["继续后续处理"]
图表来源
章节来源
Redis 服务为缓存中间件提供基础设施
graph LR
FE["前端"] --> CTRL["控制器"]
CTRL --> SVC["服务层"]
SVC --> PRISMA["Prisma 模型"]
CTRL --> CACHE["缓存中间件"]
CTRL --> SEC["安全中间件"]
CACHE --> REDIS["Redis 服务"]
图表来源
章节来源
[本节为通用性能指导,不直接分析具体文件]
章节来源
当前搜索功能实现了基础的关键词匹配、历史与热门统计,具备良好的扩展空间。建议下一步引入全文搜索引擎与缓存中间件,完善相关性评分与多维过滤能力,并加强安全与性能优化,以满足更复杂的搜索场景与更高的并发需求。
[本节为总结性内容,不直接分析具体文件]
章节来源
[本节为概念性建议,不直接分析具体文件]
[本节为概念性建议,不直接分析具体文件]
章节来源