简介
本文件面向VIP会员体系开发者,提供基于当前代码库的VIP相关API参考与集成方案。文档聚焦于:
- 会员等级管理(套餐定义、展示)
- 会员中心基础能力(开通记录查询)
- 后台管理能力(套餐CRUD、日志管理)
- 数据模型与服务层交互路径
- 安全与隐私要点
- 可扩展点与后续集成建议
注意:当前仓库中已实现的VIP API主要包含“套餐列表”和“用户VIP记录分页”。其他如注册认证、积分、续费降级注销、行为统计等能力在现有文件中未直接暴露为API,可在本文“扩展建议”处进行规划。
项目结构
VIP模块在前后端分离的架构下组织:
- API入口与路由:api/route/vip.php
- 控制器:api/controller/vip/*
- 服务层:front/service/vip/VipService.php
- 后台管理:admin/controller/vip/*
graph TB
A["客户端/小程序"] --> B["API路由<br/>api/route/vip.php"]
B --> C["VipController<br/>api/controller/vip/VipController.php"]
B --> D["UserController<br/>api/controller/vip/UserController.php"]
C --> E["VipService<br/>front/service/vip/VipService.php"]
D --> E
F["后台管理<br/>admin/controller/vip/*"] -.->|"配置/套餐/日志"| E
核心组件
- 路由层:声明式路由将 /api/?route=vip 及 /api/?route=vip/user 映射到对应控制器方法。
- 控制器层:
- VipController:返回VIP套餐列表与成功页标题。
- UserController:返回当前登录用户的VIP开通记录分页。
- 服务层:
- VipService:封装套餐列表构建、用户VIP记录分页与数据格式化。
- 后台管理:
- VipPackageController:VIP套餐的增删改查与内容字段设置。
- VipController:VIP记录查看、删除与批量操作。
架构总览
以下序列图展示了“获取VIP套餐列表”的调用链:
sequenceDiagram
participant Client as "客户端"
participant Route as "路由<br/>api/route/vip.php"
participant Ctrl as "VipController"
participant Svc as "VipService"
participant Model as "VipPackage/Vip"
Client->>Route : GET /api/?route=vip
Route->>Ctrl : index()
Ctrl->>Svc : buildVipPackageListData()
Svc->>Model : listAllOrdered()
Model-->>Svc : 套餐集合
Svc-->>Ctrl : 套餐数据
Ctrl-->>Client : {title, package_list, content_field}
详细接口说明
通用约定
- 请求方式:HTTP GET
- 响应格式:统一使用 ApiResponse::success 包装
- 鉴权:部分接口需登录态(如用户VIP记录),通过 auth('api')->id() 获取用户ID
1) 获取VIP套餐列表
- 接口路径:GET /api/?route=vip
- 功能:返回所有VIP套餐信息,用于前端展示购买选项
- 请求参数:无
- 响应字段:
- title:页面标题
- package_list:套餐数组,每项包含 id、name、day、price、content、image
- content_field:内容字段配置(来自系统配置)
- 业务逻辑:
- 控制器调用服务层构建套餐列表
- 服务层读取套餐模型并格式化价格与内容行
- 错误处理:
- 若配置缺失或为空,content_field 返回空数组
- 示例响应键名见下方“数据结构”
2) 获取用户VIP开通记录(分页)
- 接口路径:GET /api/?route=vip/user
- 功能:返回当前登录用户的VIP开通记录分页
- 请求参数:
- page:页码,默认1
- 响应字段:
- title:页面标题
- log_list:记录数组,每项包含 id、user、package、price、start_at、end_at、order_sn、order_link、ip、status、created_at
- pager:分页信息
- 业务逻辑:
- 控制器从鉴权上下文获取用户ID
- 服务层按用户过滤、排序并分页,同时关联套餐信息与订单状态样式类
- 权限要求:需要登录态
- 错误处理:
- 未登录时无法获取用户ID,应返回鉴权失败(由框架中间件控制)
3) 支付成功回调页(占位)
- 接口路径:GET /api/?route=vip/success
- 功能:返回成功页标题,实际跳转与流程由前端或支付回调处理
- 响应字段:title
4) 后台管理接口(非对外API,供内部使用)
- VIP记录管理:
- 列表:GET /admin?route=vip(支持用户名、时间范围筛选与分页)
- 删除:DELETE /admin?route=vip(单条删除)
- 批量操作:POST /admin?route=vip&action=action(批量删除)
- VIP套餐管理:
- 列表:GET /admin?route=vip_package
- 创建:POST /admin?route=vip_package&op=create
- 编辑:GET /admin?route=vip_package&id={id}&op=edit
- 更新:POST /admin?route=vip_package&op=update
- 删除:DELETE /admin?route=vip_package
- 设置内容字段:GET /admin?route=vip_package&op=set
依赖关系分析
- 路由到控制器:api/route/vip.php 将请求分发至 VipController 与 UserController
- 控制器到服务:两个控制器均依赖 VipService 完成数据组装
- 服务到模型:VipService 依赖 VipPackage 与 Vip 模型进行数据读取与格式化
- 后台到服务:后台控制器通过各自 Service 完成套餐与记录的CRUD
classDiagram
class VipController {
+index()
+success()
}
class UserController {
+index(request)
}
class VipService {
+buildVipPackageListData() array
+buildVipLogListData(userId, page, pageUrl) array
}
class VipPackage {
+listAllOrdered()
}
class Vip {
+filterByUserId(userId)
+applyDefaultOrder()
+paginate(pageSize, page, url)
}
VipController --> VipService : "调用"
UserController --> VipService : "调用"
VipService --> VipPackage : "读取"
VipService --> Vip : "读取"
性能与可用性建议
- 缓存策略:对VIP套餐列表可考虑短期缓存(如分钟级),减少频繁数据库查询
- 分页优化:用户VIP记录分页默认每页15条,可根据业务调整;确保索引覆盖 user_id、created_at
- 数据格式化:价格格式化与状态类计算在服务层集中处理,避免重复计算
- 并发与限流:对高频接口(如套餐列表)启用限流中间件,防止滥用
- 异步任务:如需触发通知或审计日志,建议使用队列异步处理
故障排查指南
- 未登录访问用户VIP记录:
- 现象:无法获取用户ID,可能返回鉴权错误
- 排查:确认中间件是否生效,检查 auth('api') 上下文
- 套餐内容为空:
- 现象:content_field 为空数组
- 排查:检查系统配置 param.vip_package_content 是否设置
- 订单状态显示异常:
- 现象:status.class 不正确
- 排查:确认 order_status 原始值与 OrderStatus::badgeClass 映射一致
结论
当前VIP API实现了“套餐列表”和“用户VIP记录分页”两大核心能力,并通过后台管理完成套餐与记录的维护。建议在现有基础上逐步扩展:
- 会员注册与认证:新增用户注册、登录、令牌刷新接口
- 权益查询与使用:折扣权限、专属服务、积分兑换等
- 积分管理:获取、消费、查询、过期处理
- 生命周期管理:续费、降级、注销
- 行为记录与统计分析:埋点上报、报表导出
- 数据安全与隐私:加密传输、最小化采集、脱敏输出
附录
数据结构定义(节选)
- 套餐项
- id:整数
- name:字符串
- day:整数(天数)
- price:字符串(格式化后的价格)
- content:字符串数组(多行内容)
- image:字符串(图片地址)
- 用户VIP记录项
- id:整数
- user:对象或布尔(用户信息或false)
- package:对象(套餐详情)
- price:字符串(格式化价格)
- start_at:日期时间
- end_at:日期时间
- order_sn:字符串(订单号)
- order_link:字符串(订单详情页链接)
- ip:字符串
- status:对象(value、format、class)
- created_at:日期时间
流程图:用户VIP记录分页
flowchart TD
Start(["进入接口"]) --> Auth["获取当前用户ID"]
Auth --> Page["解析页码参数"]
Page --> Query["按用户ID过滤并排序"]
Query --> Paginate["分页查询"]
Paginate --> Enrich["关联套餐与状态样式"]
Enrich --> Format["格式化价格与链接"]
Format --> Return["返回记录与分页信息"]