搜索历史

106 阅读3分钟

1. 问:你们项目的搜索历史功能是如何实现的?涉及到哪些前后端模块?

答:
在本项目中,搜索历史功能主要体现在 web-company 子项目。前端通过 src/api/search.ts 发送搜索请求,并在本地(如 localStorage)或后端存储用户的搜索历史。后端则通过 web-server 的相关路由和服务进行数据的存储和读取。
具体流程如下:

  • 前端用户在搜索栏(如 SearchBar.vue)输入关键词,调用 search.ts 的 API 方法。
  • 搜索请求会被发送到 web-server 的 /web/searchRouter.js 路由。
  • 后端路由调用相应的 Service(如 services/web/searchService.js),将搜索关键词与用户信息关联存储到数据库(如 MongoDB)。
  • 前端在需要时(如聚焦搜索框时)通过 API 获取历史记录并展示。

2. 问:你们是如何保证每个用户的搜索历史是隔离且安全的?

答:
我们通过用户身份认证(如 JWT)来保证每个用户的搜索历史是隔离的。

  • 前端每次请求都会携带 token(见 utils/token.ts),后端通过 middleware/AuthMiddleware.js 校验 token,获取当前用户的 userId。
  • 搜索历史的存储和查询都基于 userId 进行。例如,数据库中的搜索历史表会有 userId 字段,所有操作都限定在当前用户的 userId 下。
  • 这样即使多用户同时使用,也不会互相看到对方的搜索历史,保证了数据隔离和安全。

3. 问:搜索历史的存储是前端本地还是后端?各自的优缺点是什么?你们项目是如何选择的?

答:
我们项目采用了后端存储的方式。

  • 前端本地存储(如 localStorage)优点是实现简单、响应快,但缺点是换设备或清理缓存后数据丢失,且无法多端同步。
  • 后端存储(如数据库)优点是可以多端同步、数据持久化,缺点是需要设计接口和数据库表,增加开发复杂度。
  • 我们项目考虑到用户体验和多端同步需求,选择了后端存储。前端通过 API 获取和展示历史,后端负责数据的持久化和隔离。

4. 问:你们如何处理搜索历史的去重和容量限制?

答:

  • 去重:每次用户搜索时,后端会判断该关键词是否已存在于该用户的历史中(如通过数据库唯一索引或先查后插),如果存在则更新时间,不存在则插入新纪录。
  • 容量限制:我们通常限制每个用户最多保存 N 条(如 10 条)搜索历史。超出时,删除最早的记录。
  • 这些逻辑一般在后端的 Service 层实现(如 services/web/searchService.js),保证数据一致性和性能。

5. 问:你们项目的搜索历史功能如何与搜索推荐、热搜等功能结合?

答:

  • 搜索历史和搜索推荐、热搜是分开实现但可以结合展示的。
  • 搜索历史是用户个人的,热搜是全站的,推荐可以基于用户历史和全站数据结合生成。
  • 在前端(如 SearchBar.vue),我们会在用户聚焦搜索框时,同时请求用户历史和热搜数据,分别展示。
  • 推荐算法可以在后端(如 utils/recommender.ts)根据用户历史、热门关键词等生成个性化推荐,提升用户体验。