文档目录
VIP会员API

简介

本文件面向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["返回记录与分页信息"]
添加日期:2026-10-05