# 分类书籍显示功能说明 ## 功能概述 实现了点击分类后正确跳转并展示该分类下书籍的功能。支持两种类型的分类: 1. **特殊分类**:全部分类、排行榜、热门书籍、新书榜、VIP书籍 2. **普通分类**:文学、军事历史、社会文化、人物传记、科学技术、经济管理等 ## 功能流程 1. **分类列表页面** (`/pages/category/category`) - 显示所有启用的分类 - 每个分类显示名称、封面、书籍数量 - 点击分类后根据分类类型跳转 2. **分类跳转逻辑** - **特殊分类**:跳转到对应的特殊类型页面(如排行榜、热门书籍等) - **普通分类**:跳转到分类书籍列表页面,通过 `categoryId` 筛选 3. **书籍列表页面** (`/pages/more-books/more-books`) - 根据 `type` 参数显示不同类型的书籍 - 支持分页加载 - 点击书籍跳转到详情页 ## 分类类型处理 ### 特殊分类 这些分类使用特殊的查询逻辑,不通过 `categoryId` 筛选: | 分类名称 | type参数 | 接口 | 说明 | |---------|---------|------|------| | 全部分类 | `all` | `GET /api/book/all` | 显示所有上架的书籍 | | 排行榜 | `ranking` | `GET /api/book/ranking` | 按综合热度排序 | | 热门书籍 | `popular` | `GET /api/book/popular` | 按浏览量和阅读量排序 | | 新书榜 | `new` | `GET /api/book/new` | 按创建时间排序 | | VIP书籍 | `vip` | `GET /api/book/vip` | VIP专享书籍 | ### 普通分类 这些分类通过 `categoryId` 筛选: | 分类名称 | type参数 | 接口 | 说明 | |---------|---------|------|------| | 文学 | `category` | `GET /api/book/list?categoryId={id}` | 显示指定分类的书籍 | | 军事历史 | `category` | `GET /api/book/list?categoryId={id}` | 显示指定分类的书籍 | | 社会文化 | `category` | `GET /api/book/list?categoryId={id}` | 显示指定分类的书籍 | | 人物传记 | `category` | `GET /api/book/list?categoryId={id}` | 显示指定分类的书籍 | | 科学技术 | `category` | `GET /api/book/list?categoryId={id}` | 显示指定分类的书籍 | | 经济管理 | `category` | `GET /api/book/list?categoryId={id}` | 显示指定分类的书籍 | | ... | `category` | `GET /api/book/list?categoryId={id}` | 其他分类 | ## 代码实现 ### 1. 分类页面跳转逻辑 **文件**:`books/pages/category/category.vue` ```javascript goToCategoryBooks(category) { const categoryName = category.name; // 特殊分类:跳转到对应的特殊页面 if (categoryName === '全部分类') { uni.navigateTo({ url: '/pages/more-books/more-books?type=all' }); } else if (categoryName === '排行榜') { uni.navigateTo({ url: '/pages/more-books/more-books?type=ranking' }); } else if (categoryName === '热门书籍') { uni.navigateTo({ url: '/pages/more-books/more-books?type=popular' }); } else if (categoryName === '新书榜') { uni.navigateTo({ url: '/pages/more-books/more-books?type=new' }); } else if (categoryName === 'VIP书籍') { uni.navigateTo({ url: '/pages/more-books/more-books?type=vip' }); } else { // 普通分类:跳转到该分类的书籍列表页面 uni.navigateTo({ url: `/pages/more-books/more-books?type=category&categoryId=${category.id}&categoryName=${encodeURIComponent(category.name)}` }); } } ``` ### 2. 书籍列表页面加载逻辑 **文件**:`books/pages/more-books/more-books.vue` ```javascript loadBooks() { let promise; if (this.type === 'all') { // 全部分类:显示所有书籍 promise = getAllBooks(this.page, this.pageSize); } else if (this.type === 'category' && this.categoryId) { // 分类筛选:显示指定分类的书籍 promise = getBooks({ page: this.page, size: this.pageSize, categoryId: this.categoryId, status: 1 }); } else if (this.type === 'ranking') { // 排行榜 promise = getRankingBooks(this.pageSize * this.page); } else if (this.type === 'popular') { // 热门书籍 promise = getPopularBooks(this.pageSize * this.page); } else if (this.type === 'new') { // 新书榜 promise = getNewBooks(this.pageSize * this.page); } else if (this.type === 'vip') { // VIP书籍 promise = getVipBooks(this.page, this.pageSize); } // ... 其他类型 } ``` ## 数据库配置 ### 1. 分类数据 确保 `categories` 表中有正确的分类数据: ```sql -- 查看所有分类 SELECT * FROM categories WHERE status = 1 ORDER BY sort_order; ``` ### 2. 书籍分类关联 确保 `books` 表中的书籍有正确的 `category_id`: ```sql -- 查看分类及其书籍数量 SELECT c.id, c.name, COUNT(b.id) as book_count FROM categories c LEFT JOIN books b ON c.id = b.category_id AND b.status = 1 GROUP BY c.id, c.name ORDER BY c.sort_order; -- 查看没有分类的书籍 SELECT id, title, author, category_id FROM books WHERE (category_id IS NULL OR category_id = 0) AND status = 1; ``` ### 3. 更新书籍分类 使用 `update_books_category.sql` 脚本为书籍分配分类: ```sql -- 示例:为书籍分配分类 UPDATE books SET category_id = 6 WHERE id IN (1, 2, 3); -- 文学分类 UPDATE books SET category_id = 7 WHERE id IN (4, 5, 6); -- 军事历史分类 -- 根据实际情况调整 ``` ## 使用步骤 ### 1. 执行数据库脚本 ```bash # 插入分类数据(如果还没有) mysql -u root -p books_db < book/src/main/resources/db/category_data.sql # 更新书籍分类(根据实际情况调整) mysql -u root -p books_db < book/src/main/resources/db/update_books_category.sql ``` ### 2. 验证数据 ```sql -- 查看分类及其书籍数量 SELECT c.id, c.name, COUNT(b.id) as book_count FROM categories c LEFT JOIN books b ON c.id = b.category_id AND b.status = 1 GROUP BY c.id, c.name ORDER BY c.sort_order; ``` ### 3. 测试功能 1. 打开小程序,进入分类列表页面 2. 点击"全部分类" → 应该显示所有书籍 3. 点击"排行榜" → 应该显示排行榜书籍 4. 点击"热门书籍" → 应该显示热门书籍 5. 点击"新书榜" → 应该显示新书 6. 点击"VIP书籍" → 应该显示VIP书籍 7. 点击普通分类(如"文学") → 应该显示该分类下的书籍 ## 注意事项 1. **特殊分类**:全部分类、排行榜、热门书籍、新书榜、VIP书籍不需要在数据库中关联书籍,它们使用特殊的查询逻辑 2. **普通分类**:文学、军事历史等分类需要书籍有正确的 `category_id` 3. **分类统计**:分类页面显示的书籍数量是通过 `COUNT(*)` 统计的,只统计 `status = 1`(上架)的书籍 4. **分页加载**:书籍列表页面支持分页加载,每页20本书 5. **错误处理**:如果分类下没有书籍,会显示空状态提示 ## 常见问题 ### 1. 分类显示0本书 **原因**:该分类下没有书籍,或者书籍的 `category_id` 不正确 **解决方法**: ```sql -- 查看该分类下的书籍 SELECT * FROM books WHERE category_id = {分类ID} AND status = 1; -- 为书籍分配分类 UPDATE books SET category_id = {分类ID} WHERE id IN (书籍ID列表); ``` ### 2. 点击分类后没有显示书籍 **原因**:可能是接口调用失败,或者数据格式不正确 **解决方法**: - 检查后端服务是否启动 - 检查网络请求是否成功 - 查看浏览器控制台的错误信息 - 检查数据库中的数据是否正确 ### 3. 特殊分类显示错误 **原因**:分类名称不匹配 **解决方法**: - 确保数据库中的分类名称与代码中的判断条件一致 - 检查分类名称是否有空格或特殊字符 ## 后续优化 1. **分类搜索**:添加分类搜索功能 2. **分类筛选**:在书籍列表页面添加多个分类筛选 3. **分类推荐**:根据用户阅读历史推荐相关分类 4. **分类统计**:实时更新分类下的书籍数量 5. **分类缓存**:对分类列表进行缓存,提高加载速度