简介
本开发文档面向 DouPHP 用户系统的开发者,围绕用户注册登录、权限与状态控制、会员等级、积分与 VIP 等能力进行系统化说明。重点覆盖:
- 认证流程与会话管理(前台会话端 + API 无状态端)
- 密码安全与多端登录
- 会员等级体系与升级条件
- 积分获取与消耗(结合模块组织)
- VIP 权益管理与扩展方式
- 用户行为追踪、数据分析与个性化推荐思路
- 如何扩展现有模型、添加自定义权限与新增会员等级规则
- 新增:领域模型的状态枚举设计与迁移管理,包括UserStatus和WithdrawStatus的完整实现
项目结构
DouPHP 采用前后端分离的模块化设计:
- front:前台业务服务层(注册、登录、个人资料等)
- api:API 控制器与中间件(小程序/第三方客户端)
- admin:后台模型与服务(用户、等级、日志等)
- core:框架基础能力(ORM、配置、安全、服务等)
- config:全局配置(数据库、应用密钥、调试开关等)
graph TB
subgraph "前端入口"
A["front/service/user/*"]
B["api/controller/user/*"]
end
subgraph "核心能力"
C["core/service/*"]
D["core/foundation/*"]
E["core/domain/*"]
end
subgraph "数据与配置"
F["admin/model/user/*"]
G["config/config.php"]
end
A --> B
B --> C
A --> C
C --> D
C --> E
B --> F
A --> F
F --> G
图表来源
- UserController.php:121-371
- LoginService.php:75-162
- RegistrationService.php:80-183
- User.php:29-86
- config.php:15-52
章节来源
- config.php:15-52
核心组件
- 登录服务(LoginService):负责账号密码校验、手机验证码登录、IP 限流、账户锁定、状态检查、审计日志记录。
- 注册服务(RegistrationService):负责注册参数组装、事务创建用户、SNS 绑定/解绑、协议单页保障、API 验证码 token 生成。
- API 用户控制器(UserController):统一对外暴露注册、登录、资料编辑、密码修改、退出、头像上传、登录态检查等接口。
- 用户模型(User):定义 user 表字段白名单、关联等级、列表筛选器、常用查询方法。
- 等级模型(UserLevel):维护会员等级元数据(名称、升级类型、升级条件、折扣、图标等)。
- 新增:领域模型(UserStatus、WithdrawStatus):提供状态枚举与迁移校验逻辑,确保状态转换的合法性和一致性。
章节来源
- LoginService.php:31-162
- RegistrationService.php:27-183
- UserController.php:121-371
- User.php:29-86
- UserLevel.php:24-83
架构总览
用户系统以"控制器 → 服务 → 模型/基础设施"的分层模式组织,关键路径如下:
- 注册:API 控制器接收请求 → 注册服务组装数据并入库 → 返回用户信息
- 登录:API 控制器调用登录服务校验凭据 → 鉴权服务签发会话/Token → 返回用户上下文
- 资料/密码:API 控制器执行业务校验 → 调用对应服务更新数据
- 等级/积分/VIP:通过 service 与 model 组合实现,可在现有基础上扩展
- 新增:状态管理:通过领域模型枚举确保状态转换的合法性,提供表驱动的状态迁移机制
sequenceDiagram
participant Client as "客户端"
participant API as "UserController"
participant LoginSvc as "LoginService"
participant Auth as "UserAuthService"
participant DB as "数据库"
Client->>API : POST /user/login_post
API->>LoginSvc : validateLoginCredentials(用户名, 密码, IP)
LoginSvc->>DB : 查询用户
LoginSvc->>Auth : ipRateLimit/isLocked/loginFail/loginSuccess
LoginSvc-->>API : {ok, user, errors}
API->>Auth : login(user, field)
Auth-->>Client : {token, user}
图表来源
- UserController.php:298-324
- LoginService.php:75-162
详细组件分析
登录与认证流程
- 账号密码登录
- 输入识别邮箱或手机号,查询用户
- 若命中旧 md5 密码则自动升级为 bcrypt
- 校验账户状态(active/suspended/deactivated)
- 失败计数与 IP 限流,审计日志记录
- 手机验证码登录
- 校验验证码与时效
- 未注册用户自动创建并登记分销关系
- 同样执行状态检查与审计日志
- 会话/令牌
- 前台会话端由 Controller 写入 session
- API 无状态端通过 UserAuthService::login 签发 Token 返回客户端
flowchart TD
Start(["开始"]) --> Identify["识别账号类型<br/>邮箱/手机"]
Identify --> Query["查询用户"]
Query --> Locked{"是否被锁定?"}
Locked -- 是 --> FailLock["返回锁定提示"]
Locked -- 否 --> PwdCheck{"密码正确?"}
PwdCheck -- 否 --> IncFail["失败计数+1<br/>审计日志"] --> EndFail["结束(失败)"]
PwdCheck -- 是 --> StatusCheck{"状态允许登录?"}
StatusCheck -- 否 --> EndFail
StatusCheck -- 是 --> Success["成功<br/>记录成功日志"] --> EndOk["结束(成功)"]
图表来源
- LoginService.php:75-162
- LoginService.php:176-266
章节来源
- LoginService.php:75-162
- LoginService.php:176-266
- UserController.php:298-371
注册流程
- 保障用户协议单页存在
- 生成 API 验证码 token 对(captcha_token/storage_captcha_token)
- 组装插入数据(email/mobile、密码哈希、推广关系)
- 事务内创建用户,可选绑定 SNS,默认收货地址电话落库
- 成功后登记分销关系树
sequenceDiagram
participant Client as "客户端"
participant API as "UserController"
participant RegSvc as "RegistrationService"
participant DB as "数据库"
Client->>API : POST /user/register_post
API->>RegSvc : buildRegisterInsertData(...)
API->>RegSvc : createUser(insertData, field, sns?)
RegSvc->>DB : 事务插入 user/user_sns/contact
RegSvc-->>API : {ok, user}
API->>API : recordPromotionRelation(...)
API-->>Client : {user, auth}
图表来源
- RegistrationService.php:80-183
- UserController.php:193-281
章节来源
- RegistrationService.php:80-183
- UserController.php:193-281
会员等级体系
- 等级模型提供等级元数据(名称、升级类型、升级条件、折扣、图标)
- 用户模型通过 level_id 关联等级,支持按状态、ID 筛选与预加载等级
- 建议将等级规则(如消费额、活跃度)在 service 层集中计算,避免散落在控制器
classDiagram
class User {
+int level_id
+string status
+level() BelongsTo
}
class UserLevel {
+string name
+string upgrade_type
+string upgrade_condition
+float good_discount
+string icon
}
User --> UserLevel : "belongsTo(level_id)"
图表来源
- User.php:79-86
- UserLevel.php:24-83
章节来源
- User.php:79-86
- UserLevel.php:24-83
积分系统与 VIP 服务(模块视角)
- 积分:位于 point 模块,通常包含积分流水、获取/消耗规则、兑换策略等
- VIP:位于 vip 模块,通常包含套餐、有效期、权益清单、购买/续费流程
- 与用户系统的集成点:
- 用户模型扩展字段(如 vip_expire_at、point_total)
- 服务层在订单完成、活动参与时触发积分增减与等级/VIP 判定
- 权限/展示层根据当前等级/VIP 状态渲染差异化内容
(本节为概念性说明,不直接引用具体代码文件)
权限管理与多端登录
- 权限:基于角色/权限点控制后台访问;前台可通过用户状态、等级、VIP 状态做功能可见性控制
- 多端登录:
- 前台会话端:使用 Session 维持登录态
- API 端:使用 Token(Bearer)无状态登录,支持吊销与状态检查
- 安全要点:
- 密码使用 bcrypt 存储,历史 md5 自动升级
- IP 限流与失败次数限制,防止暴力破解
- 验证码 token 防重放(storage_captcha_token)
章节来源
- UserController.php:537-547
- UserController.php:711-724
- LoginService.php:75-162
密码安全
- 存储:bcrypt 哈希
- 迁移:登录时检测到 md5 自动升级
- 重置:邮件链接含一次性 token,过期失效
- 修改:需验证旧密码后更新
章节来源
- LoginService.php:118-133
- UserController.php:391-414
- UserController.php:516-535
用户行为追踪与数据分析
- 审计日志:登录成功/失败、账户锁定、验证码错误等事件均记录
- 建议扩展:
- 注册渠道、设备指纹、地理位置
- 页面浏览、点击热区、转化漏斗
- 积分/VIP 相关行为埋点(领取、消耗、续费)
章节来源
- LoginService.php:82-89
- LoginService.php:145-160
- LoginService.php:230-264
个性化推荐(高级功能)
- 数据源:用户行为日志、订单/浏览历史、积分/VIP 状态
- 算法建议:协同过滤、内容相似度、规则引擎(等级/VIP 加权)
- 落地方式:在服务层聚合推荐结果,通过 API 输出到前端
(本节为概念性说明,不直接引用具体代码文件)
领域模型
用户状态枚举(UserStatus)
用户状态枚举定义了用户账户的生命周期状态及其合法迁移规则:
-
状态定义:
ACTIVE:正常状态,可登录、可下单SUSPENDED:被管理员停用,可被恢复为 ACTIVEDEACTIVATED:注销状态,终态,账户失效,不可恢复
-
状态迁移规则:
- ACTIVE → SUSPENDED/DEACTIVATED
- SUSPENDED → ACTIVE/DEACTIVATED
- DEACTIVATED → 无(终态)
-
核心方法:
isValid():验证状态值是否合法canTransit():验证状态迁移是否合法all():获取所有状态值列表
章节来源
- UserStatus.php:35-94
提现状态枚举(WithdrawStatus)
提现状态枚举定义了提现申请的处理流程状态:
-
状态定义:
PENDING:待审核,余额已在申请时扣除,等待管理员处理APPROVED:已通过,管理员核准,款项将线下打款PAID:已打款,线下转账完成(终态)REJECTED:已驳回,管理员驳回,须把申请时扣除的余额原路退回(终态)
-
状态迁移规则:
- PENDING → APPROVED/REJECTED
- APPROVED → PAID
- PAID/REJECTED → 无(终态)
-
核心方法:
isValid():验证状态值是否合法canTransit():验证状态迁移是否合法badgeClass():获取状态对应的展示样式类名
章节来源
- WithdrawStatus.php:32-117
领域模型的使用示例
领域模型在系统中的主要使用场景:
-
用户状态管理:
- 后台用户状态变更时验证迁移合法性
- 登录时检查用户状态是否允许登录
- 列表筛选时验证状态过滤条件
-
提现流程控制:
- 提现申请状态流转验证
- 管理员审核时的状态转换控制
- 资金回退的事务性保证
stateDiagram-v2
[*] --> PENDING
PENDING --> APPROVED : 审核通过
PENDING --> REJECTED : 审核拒绝
APPROVED --> PAID : 标记已打款
REJECTED --> [*]
PAID --> [*]
note right of PENDING : 待审核<br/>余额已扣除
note right of APPROVED : 已通过<br/>等待打款
note right of PAID : 已打款<br/>终态
note right of REJECTED : 已驳回<br/>余额退回
图表来源
- WithdrawStatus.php:46-51
章节来源
- UserService.php:203-229
- WithdrawService.php:191-230
依赖关系分析
- UserController 依赖:
- RegistrationService、LoginService、ProfileService、PasswordResetService
- UserAuthService、ApiTokenService、UserService
- Captcha、Config、Module 等基础设施
- LoginService 依赖:
- UserAuthService、UserContactQuery、审计与日志
- 新增:UserStatus 领域模型用于状态验证
- 模型层:
- User 与 UserLevel 通过 ORM 关联
- 列表查询通过 scope 组合条件,减少 N+1
- 新增:领域模型提供状态枚举与迁移校验
graph LR
UC["UserController"] --> LS["LoginService"]
UC --> RS["RegistrationService"]
UC --> PS["ProfileService"]
UC --> PRS["PasswordResetService"]
UC --> UA["UserAuthService"]
UC --> ATS["ApiTokenService"]
UC --> US["UserService"]
LS --> UA
LS --> UQ["UserContactQuery"]
LS --> USR["UserStatus"]
UM["User Model"] --> UL["UserLevel Model"]
WS["WithdrawService"] --> WSR["WithdrawStatus"]
图表来源
- UserController.php:55-119
- LoginService.php:49-63
- User.php:79-86
- UserService.php:21-22
- WithdrawService.php:20-21
章节来源
- UserController.php:55-119
- LoginService.php:49-63
- User.php:79-86
性能考虑
- 数据库
- 使用 scope 预加载等级,避免 N+1
- 合理索引:user(email/moblie)、user_log(user_id)
- 缓存
- 等级配置、VIP 套餐可缓存
- 验证码 token 短期缓存
- 限流
- IP 级登录限流,防止爆破
- 异步
- 邮件发送、积分发放、行为统计可异步化
- 新增:领域模型优化
- 状态枚举使用静态常量,避免重复计算
- 迁移规则表驱动,便于维护和扩展
- 状态验证在内存中进行,减少数据库查询
(本节提供通用指导,不直接引用具体代码文件)
故障排查指南
- 登录失败
- 检查 IP 限流与失败计数
- 核对验证码与时效
- 查看审计日志定位原因
- 注册失败
- 检查唯一约束(email/mobile)
- 查看事务异常日志
- 密码问题
- 确认 bcrypt 升级逻辑
- 重置邮件是否送达
- 权限/状态
- 检查用户状态(active/suspended/deactivated)
- 确认等级/VIP 状态与权益匹配
- 新增:状态迁移问题
- 检查 UserStatus::canTransit() 验证逻辑
- 确认当前状态和目标状态的迁移合法性
- 查看状态变更的审计日志
- 验证 WithdrawStatus::canTransit() 在提现流程中的应用
章节来源
- LoginService.php:82-89
- LoginService.php:145-160
- RegistrationService.php:136-183
- UserController.php:391-414
- UserService.php:222-224
- WithdrawService.php:195-197
结论
DouPHP 用户系统以清晰的分层与职责划分,提供了安全的认证、灵活的注册、完善的等级与可扩展的积分/VIP 能力。新增的领域模型设计进一步增强了状态管理的规范性和安全性:
- 扩展用户模型:增加字段、关联新实体
- 新增权限:在服务层集中判断,配合 UI 控制
- 新增等级规则:在 service 层实现评估逻辑,联动等级变更
- 行为追踪与推荐:基于日志与用户画像构建推荐管线
- 新增:状态管理:通过领域模型确保状态转换的合法性和一致性,提供表驱动的状态迁移机制,支持用户状态和提现状态的完整生命周期管理
附录
- 配置项参考
- 数据库连接、表前缀、字符集、应用密钥、调试开关
- 常见扩展示例(路径指引)
- 扩展用户模型字段:User.php
- 新增等级规则:在 service 层实现评估函数,调用 UserLevel 与 User 关联
- 新增积分规则:在 point 模块 service 中实现获取/消耗逻辑
- 新增 VIP 权益:在 vip 模块 service 中定义权益清单与校验
- 新增:扩展状态枚举:在 core/domain 目录下添加新的状态类,遵循 UserStatus 的设计模式
章节来源
- config.php:15-52
- User.php:29-86
- UserLevel.php:24-83
- UserStatus.php:35-94
- WithdrawStatus.php:32-117