简介
本设计文档聚焦 DouPHP 核心系统表,围绕管理员表 dou_admin、管理员日志表 dou_admin_log 等关键表进行深度说明。内容涵盖字段定义、数据类型选择、约束条件、权限与安全设计、登录安全策略、操作审计流程、状态码约定、时间字段存储格式以及表间关系和数据完整性约束。目标读者为数据库设计师与后端开发者,帮助在扩展、迁移与排障时具备一致且可追溯的设计依据。
项目结构与范围
- 数据源以“系统表结构.sql”中的 DDL 为准,结合运行时写入逻辑(审计服务)与管理员模型方法,形成从“表结构 → 业务写入 → 查询筛选”的闭环。
- 本文重点覆盖:
- 管理员账户与登录安全相关字段
- 管理员操作审计日志字段与写入流程
- 状态字段与时间字段的统一约定
- 表间关系与索引设计
graph TB
A["管理员表<br/>dou_admin"] --> B["管理员日志表<br/>dou_admin_log"]
C["审计服务<br/>AuditService"] --> B
D["管理员模型<br/>Manager"] --> A
E["日志模型<br/>ManagerAdminLog"] --> B
核心组件
- 管理员表(dou_admin)
- 用于存储后台管理员身份、认证凭据、会话令牌、登录失败计数与锁定信息、最后登录时间与 IP 等。
- 关键字段包括:主键 admin_id、用户名 username、邮箱 email、密码 password、令牌 token 及其过期、重置令牌 reset_token 及其过期、权限 action_list、登录统计 last_login/last_ip、安全控制 login_fail_count/login_lock_time、创建时间 add_time。
- 管理员日志表(dou_admin_log)
- 用于记录后台管理操作审计日志,包含操作人、动作、模块、IP、结果、详情与时间戳。
- 关键字段包括:主键 id、管理员 admin_id、动作 action、模块 module、IP ip、结果 result、详情 details、时间 created_at/create_time(见下文一致性说明)。
架构总览
下图展示管理员登录与审计的关键交互:管理员通过控制器/服务完成登录校验,成功后更新管理员表的登录状态;任何敏感或重要操作通过审计服务写入日志表,便于追踪与审计。
sequenceDiagram
participant Admin as "管理员"
participant Auth as "认证服务"
participant DB as "数据库"
participant Audit as "审计服务"
Admin->>Auth : 提交用户名/密码/验证码
Auth->>DB : 查询 dou_admin 验证凭据
DB-->>Auth : 返回管理员记录
Auth->>DB : 更新 last_login / last_ip / 失败计数/锁定
Auth->>Audit : 记录登录成功/失败
Audit->>DB : 插入 dou_admin_log
DB-->>Auth : 写入成功
Auth-->>Admin : 返回登录结果
详细组件分析
管理员表(dou_admin)设计
- 主键与标识
- admin_id:无符号小整型,作为管理员唯一标识。
- 身份与联系
- username:变长字符串,长度适中,避免过长输入。
- email:变长字符串,用于通知与找回。
- 安全凭据与会话
- password:哈希后的密码串,长度预留足够空间。
- token/token_expire:记住我令牌及过期时间戳。
- reset_token/reset_token_expire:密码重置令牌及过期时间戳。
- 权限
- action_list:文本字段,存储管理员可执行的动作列表(如 JSON 或序列化数组),用于细粒度权限控制。
- 登录安全
- last_login:上次登录时间戳。
- last_ip:上次登录 IP,支持 IPv4/IPv6。
- login_fail_count:连续登录失败次数,配合限流与锁定。
- login_lock_time:账号锁定时间戳,达到阈值后临时锁定。
- 时间
- add_time:创建时间戳。
注意:代码中部分方法引用了 login_locked_at、token_expires_at、reset_token_expires_at 等 DATETIME 字段名,而 DDL 中对应列名为 login_lock_time、token_expire、reset_token_expire(INT 时间戳)。实际部署应以 DDL 为准,并在代码层做兼容处理或统一迁移。
classDiagram
class 管理员表 {
+admin_id : 主键
+username : 用户名
+email : 邮箱
+password : 密码哈希
+token : 记住我令牌
+token_expire : 令牌过期(时间戳)
+reset_token : 重置令牌
+reset_token_expire : 重置令牌过期(时间戳)
+action_list : 权限列表
+last_login : 最后登录时间戳
+last_ip : 最后登录IP
+login_fail_count : 登录失败次数
+login_lock_time : 锁定时间戳
+add_time : 创建时间戳
}
管理员日志表(dou_admin_log)设计
- 主键与审计主体
- id:自增主键。
- admin_id:操作管理员 ID。
- 行为描述
- action:动作类型,使用常量集合(如登录成功/失败、新增/修改/删除、启用/禁用、安装/卸载、升级、备份/还原、清缓存、重放等)。
- module:模块名,承载具体业务模块(如 product、order、user 等)。
- details:详情标签或动态对象,用于记录更细粒度的上下文(如验证码错误、账号锁定、旧密码错误等)。
- 环境与结果
- ip:操作来源 IP。
- result:操作结果(成功/失败)。
- 时间
- created_at/create_time:审计时间。DDL 中为 create_time(INT 时间戳),但审计服务写入时使用 created_at(DATETIME)。需统一为一种格式并建立索引。
flowchart TD
Start(["写入审计日志"]) --> Build["组装 action/module/ip/result/details"]
Build --> Insert["插入 dou_admin_log"]
Insert --> End(["完成"])
权限管理与访问控制
- 管理员权限
- 通过 action_list 字段声明管理员可执行的动作集合,结合路由与中间件实现细粒度授权。
- 日志驱动的安全事件
- 登录失败、账号锁定、IP 限流等安全事件通过 action 与 details 组合记录,便于后续分析与告警。
- 白名单与枚举
- action 采用集中常量定义,details 提供离散原因字典,确保前后端显示一致与筛选可控。
登录安全与审计流程
- 登录失败防护
- 维护 login_fail_count 与 login_lock_time,达到阈值后锁定账号,防止暴力破解。
- 结合 IP 限流与验证码校验,降低自动化攻击风险。
- 审计记录
- 登录成功/失败均写入 dou_admin_log,记录 action、module、ip、result、details 与时间。
- 时间字段一致性
- 审计服务写入 created_at(DATETIME),DDL 中为 create_time(INT)。建议统一为 DATETIME 并建立索引,便于按时间范围查询。
sequenceDiagram
participant Client as "客户端"
participant Login as "登录流程"
participant Admin as "管理员表"
participant Log as "日志表"
Client->>Login : 提交登录请求
Login->>Admin : 校验用户名/密码/锁定状态
alt 失败
Login->>Admin : 累加失败次数/设置锁定时间
Login->>Log : 记录 LOGIN_FAIL
else 成功
Login->>Admin : 更新最后登录时间/IP
Login->>Log : 记录 LOGIN_SUCCESS
end
数据完整性与表关系
- 主键与索引
- dou_admin:主键 admin_id。
- dou_admin_log:主键 id,附带 create_time/user_id 索引(见 DDL 索引段)。
- 外键约束
- 当前 DDL 未显式定义外键,建议在应用层保证 admin_id 的有效性(例如仅允许存在的管理员写入日志)。
- 一致性建议
- 将审计时间字段统一为 DATETIME(created_at),并对该列建立索引以提升时间范围查询性能。
- 对 action、module、ip 等高频筛选列建立合适索引,提升日志检索效率。
依赖关系分析
- 模型与服务依赖
- Manager 模型负责管理员表读写,封装密码重置、登录失败状态、记住我令牌等更新逻辑。
- ManagerAdminLog 模型提供日志表的查询过滤能力(按 admin_id、action、module、ip、时间范围)。
- AuditService 统一写入审计日志,确保 action 与 details 的一致性。
- 常量与字典依赖
- AdminLogAction 提供 action 枚举,AdminLogDetail 提供 details 枚举,二者共同约束日志语义。
graph LR
Mgr["管理员模型<br/>Manager"] --> |读写| AdminTbl["管理员表<br/>dou_admin"]
LogModel["日志模型<br/>ManagerAdminLog"] --> |查询| LogTbl["日志表<br/>dou_admin_log"]
Audit["审计服务<br/>AuditService"] --> |写入| LogTbl
ActionConst["操作类型常量<br/>AdminLogAction"] --> Audit
DetailDict["细节字典<br/>AdminLogDetail"] --> Audit
性能与索引建议
- 时间字段
- 统一审计时间为 DATETIME(created_at),并建立索引,优化按时间范围的审计查询。
- 常用筛选列
- 对 action、module、ip、admin_id 建立索引,提升日志列表与统计查询性能。
- 大字段与归档
- details 可能包含较长文本,建议定期归档历史日志至冷存储,保持热表轻量化。
- 并发写入
- 审计日志高并发场景下,考虑分库分表或分区策略(按月份/年份),减少单表膨胀。
故障排查指南
- 登录失败与锁定
- 检查 login_fail_count 与 login_lock_time,确认是否命中锁定阈值。
- 查看 dou_admin_log 中 LOGIN_FAIL 记录,结合 details 定位失败原因(验证码过期/不匹配、用户名非法、IP 限流、账号锁定、输入错误、旧密码错误等)。
- 审计时间不一致
- 若发现 created_at 与 create_time 并存,优先统一为 DATETIME 并迁移历史数据,同时调整查询逻辑。
- 权限异常
- 核对 action_list 配置与路由/中间件权限策略,确保管理员具备所需动作权限。
结论
DouPHP 的核心系统表围绕管理员身份、安全与审计构建,形成了“账户—权限—审计”的完整闭环。通过统一的 action/detail 常量与字典、严格的登录失败防护与锁定机制、以及规范的审计日志写入,系统在安全性与可追溯性方面具备良好基础。建议在实施中统一时间字段格式、完善索引与归档策略,以确保在高并发与大数据量下的稳定表现。
附录:字段与状态参考
- 管理员表(dou_admin)
- 主键:admin_id
- 身份:username、email
- 安全:password、token、token_expire、reset_token、reset_token_expire
- 权限:action_list
- 登录:last_login、last_ip、login_fail_count、login_lock_time
- 时间:add_time
- 管理员日志表(dou_admin_log)
- 主键:id
- 主体:admin_id
- 行为:action、module、details
- 环境:ip
- 结果:result
- 时间:create_time(DDL)、created_at(写入逻辑,需统一)
- 操作类型(action)示例
- 登录成功/失败、新增/修改/删除、回复、确认、拒绝、取消、启用/禁用、安装/卸载、升级、备份/还原、清缓存、重放
- 细节(details)示例
- 验证码过期/不匹配、用户名非法、IP 限流、账号锁定、输入错误、旧密码错误