书籍分类功能说明.md 6.5 KB

书籍分类功能说明

功能概述

实现了前端页面五个分类功能的后端接口和数据库支持:

  1. 全部分类 - 显示所有上架的书籍
  2. 排行榜 - 按综合热度排序的书籍
  3. 热门书籍 - 按浏览量和阅读量排序的书籍
  4. 新书榜 - 按创建时间排序的最新书籍
  5. VIP书籍 - VIP专享书籍

数据库设计

表结构

使用现有的 books 表,包含以下关键字段:

  • id - 书籍ID
  • title - 书名
  • author - 作者
  • cover / image - 封面图片
  • brief / desc / introduction - 简介
  • price - 价格
  • is_free - 是否免费
  • is_vip - 是否VIP专享
  • category_id - 分类ID
  • status - 状态(1=上架,0=下架)
  • view_count - 浏览次数
  • like_count - 点赞数
  • read_count - 阅读次数
  • created_at - 创建时间
  • updated_at - 更新时间

后端接口

1. 全部分类

  • 接口地址GET /api/book/all
  • 请求参数
    • page - 页码(默认:1)
    • size - 每页数量(默认:10)
  • 响应:返回分页的书籍列表
  • 排序规则:按创建时间倒序(最新的在前)

2. 排行榜

  • 接口地址GET /api/book/ranking
  • 请求参数
    • limit - 返回数量(默认:10)
  • 响应:返回排行榜书籍列表
  • 排序规则:按综合热度排序
    • 计算公式:阅读量 * 3 + 点赞量 * 2 + 浏览量
    • 权重:阅读量 > 点赞量 > 浏览量

3. 热门书籍

  • 接口地址GET /api/book/popular
  • 请求参数
    • limit - 返回数量(默认:10)
  • 响应:返回热门书籍列表
  • 排序规则:按浏览量、阅读量排序
    • 先按浏览量降序
    • 再按阅读量降序
    • 最后按创建时间降序

4. 新书榜

  • 接口地址GET /api/book/new
  • 请求参数
    • limit - 返回数量(默认:10)
  • 响应:返回新书列表
  • 排序规则:按创建时间倒序(最新的在前)

5. VIP书籍

  • 接口地址GET /api/book/vip
  • 请求参数
    • page - 页码(默认:1)
    • size - 每页数量(默认:10)
  • 响应:返回分页的VIP书籍列表
  • 筛选条件is_vip = 1status = 1
  • 排序规则:按创建时间倒序

前端API方法

books/utils/api.js 中添加了以下方法:

// 获取全部书籍(分页)
export function getAllBooks(page = 1, size = 10)

// 获取排行榜书籍
export function getRankingBooks(limit = 10)

// 获取热门书籍
export function getPopularBooks(limit = 10)

// 获取新书榜
export function getNewBooks(limit = 10)

// 获取VIP书籍(分页)
export function getVipBooks(page = 1, size = 10)

数据库查询SQL

1. 全部分类

SELECT * FROM books
WHERE status = 1
ORDER BY created_at DESC
LIMIT offset, size

2. 排行榜

SELECT * FROM books
WHERE status = 1
ORDER BY (read_count * 3 + like_count * 2 + view_count) DESC, created_at DESC
LIMIT limit

3. 热门书籍

SELECT * FROM books
WHERE status = 1
ORDER BY view_count DESC, read_count DESC, created_at DESC
LIMIT limit

4. 新书榜

SELECT * FROM books
WHERE status = 1
ORDER BY created_at DESC
LIMIT limit

5. VIP书籍

SELECT * FROM books
WHERE status = 1 AND is_vip = 1
ORDER BY created_at DESC
LIMIT offset, size

数据准备

1. 创建数据库表

如果还没有创建表,请先执行 schema.sql 创建基础表结构。

2. 插入示例数据

执行 books_category_data.sql 插入示例书籍数据:

mysql -u root -p books_db < book/src/main/resources/db/books_category_data.sql

或者使用MySQL客户端工具执行SQL文件。

3. 数据说明

示例数据包含:

  • 经典文学:红楼梦、三国演义、水浒传等(高阅读量,适合排行榜)
  • 现代文学:活着、围城、平凡的世界等(高浏览量,适合热门书籍)
  • 新书:三体、解忧杂货店、人类简史等(最近添加,适合新书榜)
  • VIP书籍:百年孤独、1984、动物农场等(VIP专享,需要付费)

使用示例

前端调用示例

import { getAllBooks, getRankingBooks, getPopularBooks, getNewBooks, getVipBooks } from '@/utils/api.js'

// 获取全部书籍(第一页,每页10本)
getAllBooks(1, 10).then(res => {
  console.log('全部书籍:', res.data)
})

// 获取排行榜(前10本)
getRankingBooks(10).then(res => {
  console.log('排行榜:', res.data)
})

// 获取热门书籍(前10本)
getPopularBooks(10).then(res => {
  console.log('热门书籍:', res.data)
})

// 获取新书榜(前10本)
getNewBooks(10).then(res => {
  console.log('新书榜:', res.data)
})

// 获取VIP书籍(第一页,每页10本)
getVipBooks(1, 10).then(res => {
  console.log('VIP书籍:', res.data)
})

接口响应格式

列表接口响应(分页)

{
  "code": 200,
  "message": "成功",
  "data": {
    "list": [...],
    "total": 100,
    "page": 1,
    "size": 10
  }
}

列表接口响应(限制数量)

{
  "code": 200,
  "message": "成功",
  "data": [
    {
      "id": 1,
      "title": "书名",
      "author": "作者",
      "image": "封面URL",
      "brief": "简介",
      "viewCount": 1000,
      "likeCount": 100,
      "readCount": 500,
      "isVip": false,
      "price": 0.00
    },
    ...
  ]
}

注意事项

  1. 路由顺序:所有分类接口必须放在 /{id} 路由之前,避免路径冲突
  2. 状态筛选:所有查询都只返回 status = 1(上架)的书籍
  3. VIP书籍:VIP书籍需要 is_vip = 1 且用户需要是VIP才能访问
  4. 分页参数:全部分类和VIP书籍支持分页,其他接口使用limit限制数量
  5. 排序规则:不同分类使用不同的排序规则,确保数据准确性

测试建议

  1. 接口测试:使用Postman或类似工具测试各个接口
  2. 数据测试:确保数据库中有足够的数据进行测试
  3. 分页测试:测试分页功能是否正常工作
  4. 排序测试:验证排序规则是否正确
  5. VIP测试:测试VIP书籍的访问控制

后续优化

  1. 缓存优化:对热门数据添加缓存,提高查询性能
  2. 索引优化:为常用查询字段添加索引
  3. 搜索功能:添加关键词搜索功能
  4. 筛选功能:添加更多筛选条件(如分类、价格区间等)
  5. 推荐算法:根据用户行为推荐相关书籍