实现了VIP充值记录功能,当用户充值VIP后,会自动记录在数据库中,并且购买VIP的用户可以观看VIP书籍和听书。
创建数据库表:
# 执行数据库脚本
mysql -u root -p books_db < book/src/main/resources/db/vip_records_schema.sql
表结构说明:
id: 记录ID(主键)user_id: 用户IDvip_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: 更新时间VipRecord.java - VIP充值记录实体类PurchaseVipDTO.java - 购买VIP DTOVipRecordMapper.java - Mapper接口VipRecordMapper.xml - MyBatis映射文件VipService.java - VIP服务类
purchaseVip() - 购买VIP(自动更新用户VIP状态)confirmPayment() - 确认支付(支付回调)checkVipStatus() - 检查用户VIP状态(检查是否过期)getUserVipRecords() - 获取用户VIP充值记录列表VipController.java - VIP控制器BookService.java - 修改了getBookById()方法,添加VIP权限检查AudiobookService.java - 修改了getChapterDetail()方法,添加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": ["无限阅读", "免费听书", "专属客服", "优先更新", "专属活动"]
}
]
}
接口地址: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
}
}
接口地址:POST /api/vip/confirm-payment
请求参数:
recordId: 记录ID(必填)transactionId: 交易流水号(可选)响应示例:
{
"code": 200,
"message": "支付确认成功"
}
接口地址:GET /api/vip/check
请求参数:
userId: 用户ID(必填)响应示例:
{
"code": 200,
"data": {
"isVip": true
}
}
接口地址: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
}
}
在 books/utils/api.js 中添加了以下函数:
getVipPlans() - 获取VIP套餐列表purchaseVip(purchaseData) - 购买VIPconfirmVipPayment(recordId, transactionId) - 确认支付checkVipStatus(userId) - 检查用户VIP状态getVipRecords(userId, paymentStatus, page, size) - 获取VIP充值记录列表getBookById(id, userId) - 获取书籍详情(已更新,支持userId参数)getChapterDetail(chapterId, userId) - 获取章节详情(已更新,支持userId参数)books/pages/vip/vip.vue - VIP购买页面
books/pages/payment/payment.vue - 支付页面
books/pages/vip-records/vip-records.vue - VIP充值记录页面
books/pages/book-detail/book-detail.vue - 书籍详情页面
当用户访问VIP书籍时:
BookVO中设置requireVip = truerequireVip字段显示VIP提示当用户播放非免费听书章节时:
如果用户已经是VIP且未过期,购买新的VIP时:
VipService.checkVipStatus()方法会自动检查VIP是否过期isVip = falsemysql -u root -p books_db < book/src/main/resources/db/vip_records_schema.sql
支付流程:
confirmPayment()方法在支付回调时更新状态VIP过期处理:
续费逻辑:
权限验证:
集成真实的支付平台(支付宝、微信支付):
confirmPayment()方法