VIP充值记录功能说明.md 7.9 KB

VIP充值记录功能说明

功能概述

实现了VIP充值记录功能,当用户充值VIP后,会自动记录在数据库中,并且购买VIP的用户可以观看VIP书籍和听书。

数据库设计

VIP充值记录表 (vip_records)

创建数据库表:

# 执行数据库脚本
mysql -u root -p books_db < book/src/main/resources/db/vip_records_schema.sql

表结构说明:

  • id: 记录ID(主键)
  • user_id: 用户ID
  • vip_type: VIP类型(month-月卡,quarter-季卡,year-年卡)
  • vip_name: VIP名称(月卡VIP、季卡VIP、年卡VIP)
  • price: 价格
  • duration: 时长(天数)
  • start_time: VIP开始时间
  • expire_time: VIP过期时间
  • payment_method: 支付方式(alipay-支付宝,wechat-微信,other-其他)
  • payment_status: 支付状态(0-待支付,1-已支付,2-已取消,3-已退款)
  • order_no: 订单号
  • transaction_id: 交易流水号
  • remark: 备注
  • created_at: 创建时间
  • updated_at: 更新时间

后端实现

1. 实体类

  • VipRecord.java - VIP充值记录实体类
  • PurchaseVipDTO.java - 购买VIP DTO

2. Mapper

  • VipRecordMapper.java - Mapper接口
  • VipRecordMapper.xml - MyBatis映射文件

3. Service

  • VipService.java - VIP服务类
    • purchaseVip() - 购买VIP(自动更新用户VIP状态)
    • confirmPayment() - 确认支付(支付回调)
    • checkVipStatus() - 检查用户VIP状态(检查是否过期)
    • getUserVipRecords() - 获取用户VIP充值记录列表

4. Controller

  • VipController.java - VIP控制器

5. 权限验证

  • BookService.java - 修改了getBookById()方法,添加VIP权限检查
  • AudiobookService.java - 修改了getChapterDetail()方法,添加VIP权限检查

API接口

1. 获取VIP套餐列表

接口地址GET /api/vip/plans

响应示例

{
  "code": 200,
  "data": [
    {
      "type": "month",
      "name": "月卡VIP",
      "price": 30.00,
      "duration": 30,
      "desc": "适合短期阅读",
      "benefits": ["无限阅读", "免费听书", "专属客服"]
    },
    {
      "type": "quarter",
      "name": "季卡VIP",
      "price": 80.00,
      "duration": 90,
      "desc": "超值优惠",
      "benefits": ["无限阅读", "免费听书", "专属客服", "优先更新"]
    },
    {
      "type": "year",
      "name": "年卡VIP",
      "price": 288.00,
      "duration": 365,
      "desc": "最超值选择",
      "benefits": ["无限阅读", "免费听书", "专属客服", "优先更新", "专属活动"]
    }
  ]
}

2. 购买VIP

接口地址POST /api/vip/purchase

请求参数

{
  "userId": 1,
  "vipType": "month",
  "vipName": "月卡VIP",
  "price": 30.00,
  "paymentMethod": "wechat"
}

响应示例

{
  "code": 200,
  "message": "购买成功",
  "data": {
    "id": 1,
    "type": "月卡VIP",
    "price": 30.00,
    "activateTime": "2025-01-11 10:00:00",
    "expireTime": "2025-02-10 10:00:00",
    "orderNo": "VIP1234567890",
    "paymentStatus": 1
  }
}

3. 确认支付(支付回调)

接口地址POST /api/vip/confirm-payment

请求参数

  • recordId: 记录ID(必填)
  • transactionId: 交易流水号(可选)

响应示例

{
  "code": 200,
  "message": "支付确认成功"
}

4. 检查用户VIP状态

接口地址GET /api/vip/check

请求参数

  • userId: 用户ID(必填)

响应示例

{
  "code": 200,
  "data": {
    "isVip": true
  }
}

5. 获取用户的VIP充值记录列表

接口地址GET /api/vip/records

请求参数

  • userId: 用户ID(必填)
  • paymentStatus: 支付状态(0-待支付,1-已支付,不传则查询全部)
  • page: 页码(默认1)
  • size: 每页数量(默认10)

响应示例

{
  "code": 200,
  "data": {
    "list": [
      {
        "id": 1,
        "type": "月卡VIP",
        "price": 30.00,
        "activateTime": "2025-01-11 10:00:00",
        "expireTime": "2025-02-10 10:00:00",
        "paymentStatus": 1,
        "orderNo": "VIP1234567890"
      }
    ],
    "total": 10,
    "page": 1,
    "size": 10
  }
}

前端实现

1. API函数

books/utils/api.js 中添加了以下函数:

  • getVipPlans() - 获取VIP套餐列表
  • purchaseVip(purchaseData) - 购买VIP
  • confirmVipPayment(recordId, transactionId) - 确认支付
  • checkVipStatus(userId) - 检查用户VIP状态
  • getVipRecords(userId, paymentStatus, page, size) - 获取VIP充值记录列表
  • getBookById(id, userId) - 获取书籍详情(已更新,支持userId参数)
  • getChapterDetail(chapterId, userId) - 获取章节详情(已更新,支持userId参数)

2. 页面

  • books/pages/vip/vip.vue - VIP购买页面

    • 从后端获取VIP套餐列表
    • 选择VIP套餐
    • 跳转到支付页面
  • books/pages/payment/payment.vue - 支付页面

    • 选择支付方式
    • 调用购买VIP接口
    • 支付成功后更新本地用户信息
  • books/pages/vip-records/vip-records.vue - VIP充值记录页面

    • 显示用户的VIP充值记录列表
    • 支持下拉刷新和上拉加载更多
  • books/pages/book-detail/book-detail.vue - 书籍详情页面

    • 已更新,传递userId参数用于VIP权限检查

VIP权限验证

1. 书籍权限验证

当用户访问VIP书籍时:

  • 后端检查用户VIP状态
  • 如果用户不是VIP或VIP已过期,在BookVO中设置requireVip = true
  • 前端根据requireVip字段显示VIP提示

2. 听书权限验证

当用户播放非免费听书章节时:

  • 前端检查用户VIP状态
  • 如果用户不是VIP,显示VIP提示并跳转到VIP购买页面
  • 后端也会验证VIP权限,确保安全

VIP状态管理

1. 自动续费

如果用户已经是VIP且未过期,购买新的VIP时:

  • 新的VIP有效期从原VIP过期时间开始计算
  • 实现VIP续费功能

2. 过期检查

  • VipService.checkVipStatus()方法会自动检查VIP是否过期
  • 如果VIP已过期,自动更新用户VIP状态为isVip = false

3. VIP时长计算

  • 月卡VIP:30天
  • 季卡VIP:90天
  • 年卡VIP:365天

使用说明

1. 创建数据库表

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

2. 启动后端服务

3. 测试VIP购买流程

  1. 用户打开VIP购买页面
  2. 选择VIP套餐(月卡/季卡/年卡)
  3. 跳转到支付页面
  4. 选择支付方式并确认支付
  5. 支付成功后,用户VIP状态自动更新
  6. 可以在VIP充值记录页面查看充值记录

4. 测试VIP权限验证

  1. 非VIP用户访问VIP书籍时,会显示VIP提示
  2. 非VIP用户播放非免费听书章节时,会显示VIP提示
  3. VIP用户访问VIP内容时,正常访问

注意事项

  1. 支付流程

    • 当前实现为模拟支付(立即更新VIP状态)
    • 实际项目中应该等待支付成功回调后再更新VIP状态
    • 可以调用confirmPayment()方法在支付回调时更新状态
  2. VIP过期处理

    • VIP过期后会自动更新用户状态
    • 建议定期执行任务检查并更新过期VIP状态
  3. 续费逻辑

    • VIP未过期时购买新VIP,从过期时间开始计算
    • VIP已过期时购买新VIP,从当前时间开始计算
  4. 权限验证

    • 前端和后端都进行VIP权限验证
    • 确保数据安全

后续扩展

1. 支付回调集成(可选)

集成真实的支付平台(支付宝、微信支付):

  • 实现支付回调接口
  • 在支付成功后调用confirmPayment()方法

2. VIP优惠券(可选)

  • 添加VIP优惠券功能
  • 购买VIP时可以使用优惠券

3. VIP自动续费(可选)

  • 实现VIP自动续费功能
  • 在VIP即将过期时提醒用户续费

4. VIP等级系统(可选)

  • 实现VIP等级系统(普通VIP、高级VIP、超级VIP)
  • 不同等级享受不同权益