# 加入书架功能说明 ## ✅ 已实现的功能 ### 1. 数据库表结构 #### 用户书架表 (`user_bookshelf`) - `id`: 主键ID - `user_id`: 用户ID(外键关联users表) - `book_id`: 书籍ID(外键关联books表) - `read_progress`: 阅读进度(百分比) - `last_read_time`: 最后阅读时间 - `added_at`: 加入书架时间 - `updated_at`: 更新时间 - 唯一约束:`user_id` + `book_id` 组合唯一,防止重复添加 ### 2. 后端接口 #### 添加书籍到书架 - **接口地址**: `POST /api/bookshelf/add` - **请求参数**: ```json { "userId": 1, "bookId": 1 } ``` - **响应**: 返回书架记录信息 #### 从书架移除书籍 - **接口地址**: `DELETE /api/bookshelf/remove` - **请求参数**: ```json { "userId": 1, "bookId": 1 } ``` - **响应**: 返回成功/失败信息 #### 获取用户书架列表 - **接口地址**: `GET /api/bookshelf/list?userId=1` - **响应**: 返回用户书架列表(包含书籍信息) #### 检查书籍是否在书架中 - **接口地址**: `GET /api/bookshelf/check?userId=1&bookId=1` - **响应**: 返回布尔值(true/false) #### 更新阅读进度 - **接口地址**: `PUT /api/bookshelf/progress` - **请求参数**: ```json { "userId": 1, "bookId": 1, "readProgress": 50 } ``` - **响应**: 返回更新后的书架记录 ### 3. 前端功能 #### 书籍详情页面 - ✅ 点击"加入书架"按钮,调用后端接口 - ✅ 检查用户是否登录(未登录提示跳转登录页) - ✅ 检查书籍是否已在书架中(显示不同状态) - ✅ 加入成功后更新按钮状态 - ✅ 错误提示和成功提示 #### 书架页面 - ✅ 从后端获取用户书架列表 - ✅ 显示书架中的书籍(封面、标题、进度) - ✅ 显示最近阅读的书籍(按最后阅读时间排序) - ✅ 未登录时显示提示和登录按钮 - ✅ 书架为空时显示空状态提示 - ✅ 点击书籍跳转到书籍详情页 ## 🚀 使用流程 ### 1. 加入书架流程 1. **用户登录** - 用户必须先登录才能使用书架功能 2. **浏览书籍详情** - 用户在书籍详情页面查看书籍信息 3. **加入书架** - 点击"加入书架"按钮 - 系统检查用户是否登录 - 系统检查书籍是否已在书架中 - 调用后端接口添加书籍到书架 - 显示成功提示,按钮状态更新为"已在书架" 4. **查看书架** - 用户可以在书架页面查看已添加的书籍 - 显示阅读进度和最后阅读时间 ### 2. 错误处理 - **用户未登录**: 提示用户先登录,并提供登录按钮 - **书籍已在书架中**: 显示"已在书架中"提示 - **书籍不存在**: 显示"书籍不存在"错误 - **用户不存在**: 显示"用户不存在"错误 - **网络错误**: 显示"网络请求失败"错误 ## 📋 数据库操作 ### 创建表 执行 `book/src/main/resources/db/schema.sql` 文件中的 `user_bookshelf` 表创建语句。 ### 插入测试数据(可选) ```sql -- 为用户1添加书籍1到书架 INSERT INTO user_bookshelf (user_id, book_id, read_progress, added_at) VALUES (1, 1, 0, NOW()); -- 为用户1添加书籍2到书架 INSERT INTO user_bookshelf (user_id, book_id, read_progress, added_at) VALUES (1, 2, 25, NOW()); ``` ## 🔍 测试步骤 ### 1. 启动后端服务 ```bash cd book mvn spring-boot:run ``` ### 2. 启动前端项目 在微信开发者工具中打开 `books` 项目 ### 3. 测试加入书架功能 1. **登录用户** - 使用测试账号登录(如:zhangsan / 123456) 2. **打开书籍详情页** - 在首页或搜索页找到一本书 - 点击进入书籍详情页 3. **加入书架** - 点击"加入书架"按钮 - 应该显示"已加入书架"提示 - 按钮状态应该变为"已在书架" 4. **查看书架** - 切换到书架页面 - 应该能看到刚才添加的书籍 - 显示书籍封面、标题和阅读进度 5. **再次加入同一本书** - 返回书籍详情页 - 点击"加入书架"按钮 - 应该显示"已在书架中"提示 - 按钮应该显示"已在书架"状态 ### 4. 测试未登录情况 1. **退出登录** - 清除本地存储的用户信息 2. **尝试加入书架** - 打开书籍详情页 - 点击"加入书架"按钮 - 应该显示登录提示框 - 点击"去登录"应该跳转到登录页 3. **查看书架** - 切换到书架页面 - 应该显示"请先登录查看书架"提示 - 显示登录按钮 ## 📝 API接口详情 ### 添加书籍到书架 **请求**: ```http POST /api/bookshelf/add Content-Type: application/json { "userId": 1, "bookId": 1 } ``` **响应**: ```json { "code": 200, "message": "加入书架成功", "data": { "id": 1, "userId": 1, "bookId": 1, "readProgress": 0, "lastReadTime": null, "addedAt": "2024-01-01 12:00:00" } } ``` **错误响应**: ```json { "code": 500, "message": "书籍已在书架中", "data": null } ``` ### 获取用户书架列表 **请求**: ```http GET /api/bookshelf/list?userId=1 ``` **响应**: ```json { "code": 200, "message": null, "data": [ { "id": 1, "userId": 1, "bookId": 1, "readProgress": 0, "lastReadTime": null, "addedAt": "2024-01-01 12:00:00", "book": { "id": 1, "title": "西游记", "author": "(明) 吴承恩", "image": "https://example.com/image.jpg", ... } } ] } ``` ## 📌 注意事项 1. **用户身份验证**: 目前通过前端传递userId,生产环境建议使用JWT Token进行身份验证 2. **数据完整性**: - 添加书籍到书架时,会检查用户和书籍是否存在 - 使用唯一约束防止重复添加 3. **外键约束**: - 用户书架表有外键约束,删除用户或书籍时会自动删除相关的书架记录 4. **阅读进度**: - 阅读进度默认为0 - 可以通过更新接口更新阅读进度 5. **最近阅读**: - 最近阅读列表根据最后阅读时间排序 - 只显示有阅读记录的书籍(lastReadTime不为null) ## 🔄 后续优化建议 1. **身份验证**: 使用JWT Token替代前端传递userId 2. **批量操作**: 支持批量添加/移除书籍 3. **书架分类**: 支持创建自定义书架分类 4. **阅读记录**: 记录详细的阅读历史(章节、时间等) 5. **同步功能**: 支持多设备同步书架数据 6. **推荐功能**: 根据用户书架推荐相关书籍 --- **创建时间**:2024年 **最后更新**:2024年