# 搜索功能完成说明 ## 功能概述 实现了前端小程序搜索功能与后端数据库的完整连接,支持模糊查询所有书籍,包括: 1. 书籍搜索(按书名、作者、简介、描述进行模糊查询) 2. 热门搜索关键词(从数据库动态获取) 3. 搜索历史(本地存储) 4. 分页加载搜索结果 ## 后端接口 ### 1. 搜索书籍接口 **接口地址:** `GET /api/book/search` **请求参数:** - `keyword` (必填): 搜索关键词 - `page` (可选): 页码,默认1 - `size` (可选): 每页数量,默认20 **响应示例:** ```json { "code": 200, "message": "success", "data": { "list": [ { "id": 1, "title": "西游记", "author": "吴承恩", "cover": "https://example.com/cover.jpg", "image": "https://example.com/image.jpg", "brief": "简介", "desc": "描述", "introduction": "详细介绍" } ], "total": 100, "page": 1, "size": 20, "totalPages": 5 } } ``` ### 2. 获取热门搜索关键词接口 **接口地址:** `GET /api/book/popular-keywords` **请求参数:** - `limit` (可选): 返回数量,默认10 **响应示例:** ```json { "code": 200, "message": "success", "data": [ "西游记", "三体", "大侦探", "窗边的小豆豆" ] } ``` ## 数据库查询 ### 模糊查询实现 在 `BookMapper.xml` 中,使用 `LIKE` 语句实现模糊查询: ```sql AND (title LIKE CONCAT('%', #{keyword}, '%') OR author LIKE CONCAT('%', #{keyword}, '%') OR brief LIKE CONCAT('%', #{keyword}, '%') OR `desc` LIKE CONCAT('%', #{keyword}, '%')) ``` **搜索范围:** - 书名 (title) - 作者 (author) - 简介 (brief) - 描述 (desc) **查询特点:** - 支持部分匹配(前后都有通配符) - 不区分大小写(MySQL默认) - 只查询上架状态的书籍 (status = 1) ## 前端实现 ### 1. API函数(books/utils/api.js) 新增了两个API函数: ```javascript // 搜索书籍 export function searchBooks(keyword, page = 1, size = 20) // 获取热门搜索关键词 export function getPopularKeywords(limit = 10) ``` ### 2. 搜索页面(books/pages/search/search.vue) **主要功能:** 1. 搜索输入框 2. 搜索历史(本地存储) 3. 热门搜索(从后端获取) 4. 搜索结果展示 5. 分页加载更多 6. 加载状态显示 7. 空结果提示 **关键方法:** - `loadPopularSearches()`: 加载热门搜索关键词 - `searchBooks(keyword, page)`: 搜索书籍 - `performSearch(keyword)`: 执行搜索 - `loadMore()`: 加载更多搜索结果 ## 使用流程 ### 1. 用户搜索 1. 用户在搜索框输入关键词 2. 点击搜索或按回车键 3. 前端调用 `searchBooks` API 4. 后端执行模糊查询 5. 返回搜索结果 ### 2. 热门搜索 1. 页面加载时调用 `getPopularKeywords` API 2. 后端从热门书籍中提取书名 3. 返回热门搜索关键词列表 4. 前端展示在"热门搜索"区域 ### 3. 搜索历史 1. 用户搜索后,关键词保存到本地存储 2. 下次打开搜索页面时,自动加载历史记录 3. 点击历史记录可以快速搜索 ## 测试示例 ### 1. 搜索"西游记" ``` GET /api/book/search?keyword=西游记&page=1&size=20 ``` ### 2. 搜索"吴承恩"(作者) ``` GET /api/book/search?keyword=吴承恩&page=1&size=20 ``` ### 3. 搜索"神魔"(简介/描述中的关键词) ``` GET /api/book/search?keyword=神魔&page=1&size=20 ``` ## 性能优化建议 1. **数据库索引**: - 确保 `title`、`author` 字段有索引 - 考虑添加全文索引(FULLTEXT INDEX)提高搜索性能 2. **搜索结果缓存**: - 可以缓存热门搜索关键词 - 可以缓存常用搜索的搜索结果 3. **分页优化**: - 默认每页20条,避免一次加载过多数据 - 支持滚动加载更多 4. **搜索建议**: - 可以添加搜索建议功能(输入时实时提示) - 可以添加搜索高亮显示匹配的关键词 ## 后续优化建议 1. **搜索排序**: - 按相关度排序 - 按热度排序 - 按时间排序 2. **搜索筛选**: - 按分类筛选 - 按价格筛选 - 按VIP/免费筛选 3. **搜索统计**: - 记录搜索关键词 - 统计搜索热度 - 分析用户搜索行为 4. **搜索高亮**: - 在搜索结果中高亮显示匹配的关键词 - 提升用户体验 5. **搜索建议**: - 输入时实时显示搜索建议 - 自动补全功能 ## 文件清单 ### 后端文件 - `book/src/main/java/com/yu/book/controller/BookController.java` - 添加搜索接口 - `book/src/main/java/com/yu/book/service/BookService.java` - 添加搜索方法和热门关键词方法 - `book/src/main/resources/mapper/BookMapper.xml` - 已支持模糊查询(无需修改) ### 前端文件 - `books/utils/api.js` - 添加搜索API函数 - `books/pages/search/search.vue` - 更新搜索页面,调用真实API ## 注意事项 1. **搜索关键词验证**: - 前端和后端都验证关键词不能为空 - 后端会自动trim关键词,去除首尾空格 2. **分页处理**: - 前端使用 `pageResult.list` 获取数据列表 - 使用 `pageResult.total` 判断是否还有更多数据 - 支持滚动加载更多 3. **错误处理**: - 网络错误时显示友好提示 - 搜索结果为空时显示提示信息 - 加载失败时使用默认热门搜索 4. **数据兼容性**: - 处理 `cover` 和 `image` 字段的兼容性 - 处理 `desc`、`brief`、`introduction` 字段的兼容性 ## 测试 checklist - [ ] 搜索功能正常 - [ ] 热门搜索正常加载 - [ ] 搜索历史正常保存和加载 - [ ] 分页加载正常 - [ ] 空结果提示正常 - [ ] 加载状态显示正常 - [ ] 错误处理正常 - [ ] 图片加载正常 - [ ] 点击搜索结果跳转正常