# VIP充值记录功能说明 ## 功能概述 实现了VIP充值记录功能,当用户充值VIP后,会自动记录在数据库中,并且购买VIP的用户可以观看VIP书籍和听书。 ## 数据库设计 ### VIP充值记录表 (vip_records) 创建数据库表: ```bash # 执行数据库脚本 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` **响应示例**: ```json { "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` **请求参数**: ```json { "userId": 1, "vipType": "month", "vipName": "月卡VIP", "price": 30.00, "paymentMethod": "wechat" } ``` **响应示例**: ```json { "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`: 交易流水号(可选) **响应示例**: ```json { "code": 200, "message": "支付确认成功" } ``` ### 4. 检查用户VIP状态 **接口地址**:`GET /api/vip/check` **请求参数**: - `userId`: 用户ID(必填) **响应示例**: ```json { "code": 200, "data": { "isVip": true } } ``` ### 5. 获取用户的VIP充值记录列表 **接口地址**:`GET /api/vip/records` **请求参数**: - `userId`: 用户ID(必填) - `paymentStatus`: 支付状态(0-待支付,1-已支付,不传则查询全部) - `page`: 页码(默认1) - `size`: 每页数量(默认10) **响应示例**: ```json { "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. 创建数据库表 ```bash 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) - 不同等级享受不同权益