文档目录
预约支持表(黑名单、日志、通知)

简介

本文件面向系统管理员与运维人员,系统化说明 DouPHP 预约系统的支撑功能数据模型与业务流程,重点覆盖:

  • 预约黑名单表(book_blacklist):字段设计、写入时机、失效策略与管理流程。
  • 预约操作日志表(book_log):审计记录机制、关键字段含义与查询要点。
  • 预约通知记录表(book_notify):通知事件、通道、接收方与发送状态管理。 并给出黑名单管理、操作审计、通知提醒的业务流程与数据流转图,帮助快速定位问题与优化系统行为。

项目结构

围绕“黑名单、日志、通知”的支撑能力,代码主要分布在以下位置:

  • 黑名单数据模型:admin/model/book/BookBlacklist.php
  • 预约主表及级联删除逻辑:admin/model/book/Book.php
  • 预约操作审计日志写入:core/service/audit/AuditService.php
  • 黑名单后台控制器与服务:admin/controller/book/BlacklistController.php、admin/service/book/BlacklistService.php
  • 预约 API 路由入口(用于触发后续业务链):api/route/book.php
graph TB
A["后台控制器<br/>BlacklistController"] --> B["黑名单服务<br/>BlacklistService"]
B --> C["黑名单模型<br/>BookBlacklist"]
D["预约主表模型<br/>Book"] --> E["日志表 book_log"]
D --> F["通知表 book_notify"]
G["API 路由<br/>api/route/book.php"] --> H["预约业务链路"]
H --> E
H --> F

核心组件

  • 黑名单数据访问对象(BookBlacklist)
    • 表名:book_blacklist
    • 主键:id
    • 可写字段(fillable):item_id、user_id、operator_type、operator_id、reason、expired_at、created_at
    • 类型转换(casts):id 为整型;created_at 按指定格式转换为日期时间
  • 预约操作审计日志写入(AuditService::writeBookLog)
    • 写入表:book_log
    • 关键字段:book_id、operator_type、operator_id、action、before_status、after_status、remark、ip、created_at
  • 预约主表模型(Book)
    • 提供级联删除:删除预约时同步清理 book_log 与 book_notify
    • 提供筛选、关联等常用查询方法

架构总览

预约系统在关键节点会同时落盘三类支撑数据:

  • 黑名单:限制特定用户或针对特定项目的预约能力,支持过期时间控制。
  • 日志:记录每次预约状态变更的操作轨迹,便于审计与排障。
  • 通知:记录短信、邮件、微信、App 等通道的通知事件与发送结果。
sequenceDiagram
participant U as "调用方"
participant C as "控制器/服务"
participant M as "模型/DAO"
participant L as "日志表(book_log)"
participant N as "通知表(book_notify)"
participant BL as "黑名单表(book_blacklist)"
U->>C : 发起预约相关请求
C->>M : 校验/执行业务
C->>BL : 检查/写入黑名单
C->>L : 写入操作审计日志
C->>N : 写入通知记录
C-->>U : 返回处理结果

详细组件分析

黑名单表(book_blacklist)数据模型

  • 标识与关联
    • id:黑名单记录唯一标识
    • item_id:关联预约项目(用于项目维度的拉黑)
    • user_id:被拉黑的用户 ID
  • 操作者信息
    • operator_type / operator_id:操作者类型与 ID(如 admin/work/user),用于追溯谁执行了拉黑
  • 原因与时效
    • reason:拉黑原因(文本)
    • expired_at:过期时间(到期自动解除)
  • 时间戳
    • created_at:创建时间(由 ORM casts 统一格式化)
classDiagram
class BookBlacklist {
+int id
+int item_id
+int user_id
+string operator_type
+int operator_id
+string reason
+datetime expired_at
+datetime created_at
}

预约操作日志表(book_log)记录机制

  • 记录内容
    • book_id:预约单 ID
    • operator_type / operator_id:操作者类型与 ID
    • action:动作类型(如 confirm/reject/complete/checkin/cancel 等)
    • before_status / after_status:状态变更前后的值
    • remark:备注(可包含人工备注或系统提示)
    • ip:操作来源 IP
    • created_at:记录时间
  • 写入方式
    • 通过 AuditService::writeBookLog 统一写入,内部对参数进行安全过滤与默认 IP 回退
flowchart TD
Start(["开始"]) --> V["参数校验与清洗<br/>book_id/operator/action/status/ip"]
V --> Check{"book_id 有效?"}
Check -- 否 --> EndFail["返回失败"]
Check -- 是 --> Insert["写入 book_log"]
Insert --> EndOK["返回成功"]

预约通知记录表(book_notify)通知机制

  • 字段与语义
    • book_id:预约单 ID
    • notify_type:通知方式(sms/email/wechat/app)
    • notify_event:通知事件(confirm/remind/cancel/checkin/expire 等)
    • receiver:接收地址(手机号/邮箱/OpenID/设备标识等)
    • send_status:发送状态(待发送/成功/失败等)
  • 使用场景
    • 预约确认、提醒、取消、签到、过期等事件发生时,生成通知记录
    • 结合定时任务或消息队列完成实际发送,并回填 send_status
  • 与日志联动
    • 通知失败时可追加到日志 remark,便于追踪
sequenceDiagram
participant S as "业务服务"
participant DB as "数据库"
participant Q as "通知队列/任务"
participant T as "第三方通道"
S->>DB : 插入 book_notify(事件/通道/接收方/状态)
S->>Q : 投递发送任务
Q->>T : 调用短信/邮件/微信/App 接口
T-->>Q : 返回发送结果
Q->>DB : 更新 send_status
Q-->>S : 回调/轮询获取结果

[该图为概念流程图,不直接映射具体源码文件]

黑名单管理、操作审计、通知提醒业务流程

  • 黑名单管理
    • 管理员在后台对某用户或项目进行拉黑,记录 operator_type/operator_id/reason/expired_at
    • 预约提交前检查黑名单,命中则拒绝并记录日志
  • 操作审计
    • 任何影响预约状态的变更(确认、拒绝、完成、签到、取消等)均写入 book_log,记录 before/after 状态与备注
  • 通知提醒
    • 根据事件类型向不同通道发送通知,并在 book_notify 中记录发送状态
    • 若发送失败,可在日志中补充错误信息以便排查
flowchart TD
A["管理员拉黑/解黑"] --> B["写入 book_blacklist"]
C["用户提交预约"] --> D{"是否命中黑名单?"}
D -- 是 --> E["拒绝预约并记录日志"]
D -- 否 --> F["继续预约流程"]
F --> G["状态变更时写入 book_log"]
F --> H["生成通知记录 book_notify"]
H --> I["异步发送并更新 send_status"]

[该图为概念流程图,不直接映射具体源码文件]

依赖关系分析

  • 控制器与服务
    • BlacklistController 负责接收后台请求,委托 BlacklistService 执行业务
    • BlacklistService 调用 BookBlacklist 模型进行黑名单读写
  • 模型与表
    • BookBlacklist 对应 book_blacklist
    • AuditService 直接写入 book_log
    • Book 模型在删除预约时级联删除 book_log 与 book_notify
  • API 路由
    • api/route/book.php 暴露预约相关接口,作为外部调用的入口点
graph LR
BC["BlacklistController"] --> BS["BlacklistService"]
BS --> BM["BookBlacklist"]
AS["AuditService"] --> BLG["book_log"]
BK["Book 模型"] --> BN["book_notify"]
BK --> BLG
AR["api/route/book.php"] --> BK

性能考虑

  • 黑名单查询
    • 建议在 user_id、item_id、expired_at 上建立索引,提升命中率与过期清理效率
  • 日志写入
    • 高并发下建议批量写入或异步化,避免阻塞主流程
  • 通知发送
    • 采用队列异步发送,减少响应时间;失败重试与死信队列保障可靠性
  • 级联删除
    • 删除预约时同步清理日志与通知,注意事务与锁的使用,避免长事务

故障排查指南

  • 无法写入日志
    • 检查 AuditService::writeBookLog 的参数是否为空或非法
    • 确认数据库连接与权限正常
  • 黑名单未生效
    • 核对 expired_at 是否已过期
    • 检查黑名单查询条件是否包含正确的 user_id/item_id
  • 通知未送达
    • 查看 book_notify 的 send_status 与 receiver
    • 核对第三方通道配置与配额
  • 预约删除后数据不一致
    • 确认 Book::deleteCascade 是否正确执行,验证 book_log 与 book_notify 是否被清理

结论

  • 黑名单表以 user_id/item_id 为核心维度,配合 operator 信息与过期时间,实现精细化管控。
  • 操作日志表通过 before/after 状态与备注,完整记录预约生命周期中的关键变更。
  • 通知记录表将多通道通知标准化,便于追踪与排障。
  • 通过控制器-服务-模型的清晰分层,以及 API 路由的统一入口,支撑功能具备良好的可扩展性与可维护性。

附录

  • 常见枚举与约定
    • 操作者类型:admin/user/work
    • 通知方式:sms/email/wechat/app
    • 通知事件:confirm/remind/cancel/checkin/expire
  • 建议索引
    • book_blacklist:user_id、item_id、expired_at
    • book_log:book_id、created_at
    • book_notify:book_id、notify_event、send_status
添加日期:2026-10-05