简介
本文件面向 DouPHP 小程序“客户支持”功能的开发文档,聚焦于支持系统的完整实现与扩展能力。内容涵盖:
- 工单(技术支持)的创建、分类管理、列表与详情展示
- 状态机与生命周期管理(参考售后状态机设计)
- 优先级排序与分类处理机制
- 用户体验优化:实时更新、进度可视化、多端同步
- 开发示例:模板配置、自动化规则、通知机制
- 常见问题:状态同步、权限控制、数据一致性
说明:当前仓库中“支持系统”以“技术支持(support)”模块为核心,提供后台管理与前台 API;同时项目中存在成熟的“售后状态机”实现,可作为工单状态流转与自动化的参考范式。
项目结构
支持系统涉及的管理端、API 端、服务层与模型层如下:
- 管理端控制器:负责后台列表、新增、编辑、删除、批量操作
- API 控制器:对外暴露支持列表、详情等接口,供小程序调用
- 服务层:封装查询、格式化、统计等业务逻辑
- 模型层:ORM 实体定义、字段映射、发布态过滤、多语言与附件处理
graph TB
subgraph "管理端"
AC["Admin SupportController"]
CC["Admin CategoryController"]
end
subgraph "API端"
API_SC["Api SupportController"]
end
subgraph "服务层"
FS["Front SupportService"]
end
subgraph "模型层"
M_SUP["Model Support"]
end
AC --> FS
CC --> FS
API_SC --> FS
FS --> M_SUP
核心组件
- 管理端支持控制器:提供列表、新增、编辑、删除、批量操作,表单校验由 Request 完成,业务规则在 Service 中处理,统一异常输出
- 管理端分类控制器:支持支持分类的增删改查,扁平树形数据用于前端选择
- API 支持控制器:提供支持列表、详情接口,支持按分类、归档筛选,返回分页与分类信息
- 前台支持服务:构建列表/详情数据,Markdown 渲染内容,点击量统计,分类信息查询
- 支持模型:声明表名、字段类型转换、可翻译字段、预取器、发布态过滤、模块 schema
架构总览
支持系统采用分层架构:控制器负责请求路由与响应组装,服务层封装业务逻辑,模型层负责数据访问与实体映射。通过 ORM 的 with 预加载、published 过滤、filterByCategory/filterByArchive 条件组合,实现高效的数据查询与展示。
sequenceDiagram
participant Client as "小程序客户端"
participant ApiCtrl as "Api SupportController"
participant Svc as "Front SupportService"
participant Model as "Model Support"
Client->>ApiCtrl : GET /api/support (category_id, page)
ApiCtrl->>Svc : buildSupportListData(catId, page, pageSize, archive)
Svc->>Model : published()->filterByCategory()->filterByArchive()->applyDefaultOrder()
Model-->>Svc : 分页结果(含关联分类)
Svc-->>ApiCtrl : 列表数据+分页
ApiCtrl-->>Client : JSON{title, category_id, support_list, support_category, cate_info}
详细组件分析
管理端支持控制器
职责:
- 列表:按分类、关键词、页码查询并渲染
- 新增/编辑:表单校验后调用 Service 插入/更新,支持草稿 token
- 删除/批量:调用 Service 执行删除或批量动作,返回统一结果
关键点:
- 使用 SupportFormRequest 进行字段白名单与校验
- 统一 DomainException 捕获与消息输出
- 草稿机制:清理旧草稿并生成新 token,便于富文本编辑
管理端分类控制器
职责:
- 分类列表:扁平树形数据
- 新增/编辑/删除:表单校验后调用 CategoryService 处理
- 语言按钮:支持多语言字段的快速切换
关键点:
- 使用 CategoryFormRequest 进行校验
- 错误统一抛出 DomainException,入口全局处理
API 支持控制器
职责:
- 列表:支持分类、归档、分页
- 详情:获取详情并记录点击量
关键点:
- 使用 RouteId 解析分类与 slug
- 返回结构化 payload,包含标题、分类信息与列表数据
前台支持服务
职责:
- 列表数据构建:应用 published 过滤、分类过滤、归档过滤、默认排序、分页
- 详情数据构建:查找已发布条目,多语言字段覆写,Markdown 渲染
- 点击量统计:原子递增 click 字段
- 分类查询:按 id 查询分类信息
关键点:
- 使用 ORM 链式查询提升可读性与性能
- 字符串摘要截取,减少传输体积
支持模型
职责:
- 声明表名、字段类型转换、可翻译字段、预取器
- 模块 schema:声明 hasStatus、publishedValue、export 能力
- 辅助方法:findPublishedById、published 过滤、URL 构建等
关键点:
- casts 确保类型安全
- prefetchers 批量预热 URL、语言、附件
- moduleSchema 为 Reader/导出等读层提供能力开关
工单状态机与生命周期(参考售后状态机)
虽然当前支持模块未直接实现状态机,但项目中的售后状态机提供了成熟的状态迁移、乐观锁、超时自动流转与协商时间线记录模式,可作为工单状态管理的参考实现。
关键设计:
- 状态字符串枚举 + 表驱动迁移校验
- 乐观锁:并发冲突时拒绝迁移
- 每次迁移写入日志行,形成协商时间线
- 进入待办态时设置过期时间,供定时任务扫描自动流转
flowchart TD
Start(["进入状态"]) --> CheckTimeout{"是否到达超时阈值?"}
CheckTimeout --> |是| AutoFlow["自动流转至下一状态"]
CheckTimeout --> |否| ManualTransit["人工触发状态迁移"]
ManualTransit --> Validate["校验迁移合法性"]
Validate --> |合法| ApplyLock["乐观锁更新版本"]
ApplyLock --> WriteLog["写入协商时间线"]
WriteLog --> NextState["进入下一状态"]
AutoFlow --> NextState
NextState --> End(["结束"])
依赖关系分析
- 控制器依赖服务:管理端与 API 端均通过各自控制器调用服务层,解耦业务逻辑
- 服务依赖模型:服务层使用 ORM 进行查询与格式化,模型提供发布态过滤与多语言支持
- 外部依赖:Markdown 渲染器用于内容格式化;配置项控制分页大小
graph LR
AdminSC["Admin SupportController"] --> FS["Front SupportService"]
AdminCC["Admin CategoryController"] --> FS
ApiSC["Api SupportController"] --> FS
FS --> MSup["Model Support"]
FS --> MD["MarkdownRenderer"]
性能考虑
- 使用 ORM 的 with 预加载关联数据,减少 N+1 查询
- 应用 published 过滤与分类/归档条件,缩小查询范围
- 字符串摘要截取,降低响应体大小
- 分页查询,避免一次性加载大量数据
- 点击量统计使用原子递增,减少锁竞争
故障排查指南
- 页面不存在:API 控制器在分类或详情 ID 无效时抛出 DomainException,检查路由参数与数据是否存在
- 列表为空:确认分类过滤、归档条件与 published 状态是否正确
- 详情内容空白:检查 Markdown 渲染与多语言字段是否配置
- 点击量未增加:确认 recordSupportView 调用与数据库字段类型正确
结论
DouPHP 的支持系统以清晰的分层架构为基础,提供后台管理与前台 API 的完整能力。通过 ORM 的灵活查询与格式化、Markdown 渲染与多语言支持,满足小程序端的展示需求。结合售后状态机的设计范式,可进一步扩展工单状态流转、自动化处理与通知机制,提升客户支持体验与效率。
附录
- 工单模板配置:可在后台支持编辑器中配置标题、内容、关键词、描述等多语言字段,并通过 Markdown 渲染呈现
- 自动化处理规则:参考售后状态机,为支持工单引入状态迁移、超时自动流转与协商时间线
- 通知机制实现:可在状态迁移或服务层中集成邮件、短信或站内信通知,确保用户及时获知工单进展
- 多端同步:通过 API 返回统一数据结构,小程序与 Web 端均可复用同一套数据源,保证一致性