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)根据用户历史、热门关键词等生成个性化推荐,提升用户体验。