文档目录
模块管理工具

简介

本文件聚焦于 DouPHP 后台「模块管理」能力,围绕在线安装、本地安装与卸载三大场景,梳理控制器、服务、模型与视图的职责边界、数据流向与安全校验策略。模块管理以配置驱动为主,结合云端扩展列表与本地缓存 zip 包,为站点提供灵活的模块化扩展能力。

项目结构

模块管理相关代码集中在后台 admin 目录下,采用 MVC + Service 分层:

  • 控制器:负责请求处理、参数校验与视图渲染
  • 服务:封装业务逻辑(会话、云端交互、安装/卸载流程)
  • 模型:仅用于轻量数据访问(如统计逻辑表行数)
  • 视图:统一使用 module.htm 模板,通过 rec 参数切换不同功能页签
graph TB
subgraph "后台模块管理"
C["控制器<br/>ModuleController"]
S["服务<br/>ModuleService"]
M["模型<br/>Module"]
V["视图<br/>module.htm"]
CFG["配置<br/>config/module.php"]
CLD["云端服务<br/>CloudService / Cloud"]
end
C --> S
S --> M
S --> CLD
C --> V
C --> CFG

图示来源

  • admin/controller/module/ModuleController.php:30-138
  • admin/service/module/ModuleService.php:30-183
  • admin/model/module/Module.php:24-60
  • admin/view/module.htm:25-58
  • config/module.php:1-132

核心组件

  • 控制器 ModuleController:暴露在线安装、本地安装、卸载入口;对卸载进行二次确认与权限校验。
  • 服务 ModuleService:封装模块索引数据构建、本地安装列表扫描、卸载确认与执行、云端更新状态同步等。
  • 模型 Module:提供“若逻辑表存在则返回行数”的辅助方法,用于卸载前数据检查。
  • 视图 module.htm:统一页面模板,按 rec 参数在“云端扩展 / 本地安装 / 卸载”三个标签间切换。
  • 配置 config/module.php:维护栏目模块、简单模块、AI 关联、会员/工作人员端关联、订单商品关联、菜单与导航显示控制等元信息。

架构总览

模块管理整体遵循“控制器薄、服务厚”的设计:控制器只做路由分发与响应组装,核心逻辑下沉至服务层;模型仅承担最小化数据访问职责。

sequenceDiagram
participant Admin as "管理员浏览器"
participant Ctrl as "ModuleController"
participant Svc as "ModuleService"
participant Model as "Module(模型)"
participant Cloud as "CloudService/Cloud"
participant View as "module.htm"
Admin->>Ctrl : GET 在线安装
Ctrl->>Svc : buildModuleIndexData(system_sign)
Svc->>Cloud : localSitePayload("module")
Cloud-->>Svc : localsite
Svc-->>Ctrl : payload
Ctrl->>View : 渲染云端扩展列表
Admin->>Ctrl : GET 本地安装
Ctrl->>Svc : buildModuleInstallLocalData()
Svc-->>Ctrl : install_list
Ctrl->>View : 渲染本地 zip 列表
Admin->>Ctrl : GET 卸载确认
Ctrl->>Svc : buildUninstallConfirm(extend_id, token)
Svc-->>Ctrl : 确认消息与跳转地址
Ctrl->>View : 渲染确认提示
Admin->>Ctrl : POST 卸载确认
Ctrl->>Svc : performUninstall(extend_id)
Svc->>Model : countRowsIfTableExists(extend_id)
Model-->>Svc : 行数
Svc->>Cloud : clearModule / changeUpdateDate
Svc-->>Ctrl : 完成
Ctrl->>View : 重定向到卸载列表

图示来源

  • admin/controller/module/ModuleController.php:53-137
  • admin/service/module/ModuleService.php:52-161
  • admin/model/module/Module.php:44-60

详细组件分析

控制器 ModuleController

职责要点

  • index:读取 system_sign 并写入会话,调用服务获取 localsite,再拉取云端扩展列表,渲染 module.htm。
  • installLocal:调用服务扫描 storage/work/install/*.zip,渲染本地安装列表。
  • uninstall:调用服务构建可卸载列表,渲染 module.htm。
  • destroy:GET 时进行 extend_id 与 token 校验,调用服务生成确认消息;POST 且含 confirm 时执行卸载并跳转。

关键交互

  • 依赖注入 ModuleService 与 CloudService。
  • 使用 Request 获取输入,Response 与 BaseController 提供的 respondDeleteResult 渲染统一删除结果。

服务 ModuleService

职责要点

  • buildModuleIndexData:根据 system_sign 设置或清理会话,返回 localsite 载荷。
  • buildModuleInstallLocalData:扫描 storage/work/install/*.zip,返回待装模块名列表。
  • buildModuleUninstallData:合并已安装模块与云端记录,返回可卸载列表。
  • buildUninstallConfirm:校验 extend_id,构造确认消息与确认 URL。
  • performUninstall:校验 extend_id、是否存在数据、installed 标记文件是否完整,调用云端清理并写审计日志。
  • buildUninstallIdList:从配置 site.update_date 中解析已安装模块,并与 module.all_module 合并去重。

安全与健壮性

  • 使用 Check::rec、Check::extendId 做基础校验。
  • 卸载前检查逻辑表是否有数据,避免误删。
  • 通过 audit() 写入后台操作日志。

模型 Module

职责要点

  • 占位表名,不用于常规 CRUD。
  • countRowsIfTableExists:若逻辑表不存在返回 0;否则执行 COUNT(*) 查询并返回行数。

设计说明

  • 该模型仅作为卸载前的数据存在性检查工具,避免直接操作业务表。

视图 module.htm

职责要点

  • 统一模板,通过 rec 参数切换三个标签:
    • default:云端扩展列表
    • install_local:本地安装 zip 列表
    • uninstall:卸载列表
  • 卸载项通过 data-url 触发 JS 删除流程,URL 携带 token 与 extend_id。

配置 config/module.php

职责要点

  • column_module:栏目型模块清单(带分类树)。
  • single_module:简单模块清单(单一实体或功能)。
  • link_ai:支持接入 AI 能力的模块。
  • link_user_center / link_work_center:分别对接会员中心与工作人员端的模块。
  • link_order_item:可作为订单购买商品的模块。
  • no_show_menu / no_show_nav:控制后台菜单与前台导航的可见性。

用途

  • 模块管理在安装/卸载过程中会参考这些清单,决定模块类型、可见性与能力标记。

依赖关系分析

  • 控制器依赖服务与云端服务,不直接操作数据库。
  • 服务依赖 Cloud Facade 与 Session、Config、Check 等基础设施。
  • 模型依赖 ORM 与 DB 门面,仅提供只读统计能力。
  • 视图与控制器通过模板变量解耦。
classDiagram
class ModuleController {
+index(request)
+installLocal()
+uninstall()
+destroy(formRequest, request)
}
class ModuleService {
+buildModuleIndexData(systemSign)
+buildModuleInstallLocalData()
+buildModuleUninstallData()
+buildUninstallConfirm(extendId, token)
+performUninstall(extendId)
}
class Module {
+countRowsIfTableExists(extendId) int
}
class CloudService
class Cloud
class Config
class Session
class Check
ModuleController --> ModuleService : "调用"
ModuleController --> CloudService : "拉取云端扩展"
ModuleService --> Cloud : "云端交互"
ModuleService --> Config : "读取配置"
ModuleService --> Session : "读写会话"
ModuleService --> Check : "参数校验"
ModuleService --> Module : "行数统计"

图示来源

  • admin/controller/module/ModuleController.php:30-138
  • admin/service/module/ModuleService.php:30-183
  • admin/model/module/Module.php:24-60

性能与扩展性

  • 本地安装列表通过 glob 扫描 storage/work/install/*.zip,建议保持该目录整洁,避免大量无用 zip 影响 IO。
  • 卸载前通过 COUNT(*) 检查数据量,建议在大数据表上确保索引合理,减少统计开销。
  • 云端扩展列表拉取受网络与云端接口性能影响,可在前端增加重试与错误提示。
  • 模块清单由配置文件集中管理,新增模块只需在相应数组中添加标识,便于扩展与维护。

故障排查指南

常见问题与定位思路

  • 无法连接云端扩展列表

    • 现象:模块管理页面提示云端连接失败。
    • 排查:检查网络连通性与云端服务可用性;确认 Controller 中 cloudService.fetchExtendList 返回值是否为 null。
    • 参考:admin/controller/module/ModuleController.php:59-73
  • 本地安装列表为空

    • 现象:本地安装标签下无模块可装。
    • 排查:确认 storage/work/install 目录下是否存在 *.zip 文件;检查 ModuleService 中的 glob 扫描逻辑。
    • 参考:admin/service/module/ModuleService.php:71-85
  • 卸载时报“非法参数”或“数据仍存在”

    • 现象:点击卸载后提示参数非法或存在数据无法卸载。
    • 排查:确认 extend_id 与 token 是否正确传递;检查逻辑表是否存在数据;查看 Module::countRowsIfTableExists 返回的行数。
    • 参考:admin/service/module/ModuleService.php:107-161, admin/model/module/Module.php:44-60
  • 卸载后未生效

    • 现象:卸载成功但模块仍显示已安装。
    • 排查:检查 storage/installed/&lt;模块>.installed.php 是否被删除;确认云端 update_date 是否已更新。
    • 参考:admin/service/module/ModuleService.php:149-156

结论

模块管理工具以清晰的 MVC + Service 分层组织,将在线安装、本地安装与卸载流程抽象为可复用的服务方法,并通过配置集中管理模块元信息。其优势在于:

  • 职责清晰:控制器专注请求与响应,服务承载业务,模型仅做最小数据访问。
  • 安全可控:参数校验、二次确认、审计日志与数据存在性检查贯穿卸载流程。
  • 可扩展性强:模块清单与能力标记集中于配置,便于按需启用与扩展。

在实际使用中,建议:

  • 规范本地安装包的命名与存放位置,便于批量安装。
  • 谨慎卸载含数据的模块,必要时先备份或迁移数据。
  • 关注云端扩展列表的可用性与错误提示,提升用户体验。
添加日期:2026-10-05