简介
本指南面向DouPHP插件开发者,聚焦于"支付类插件"的完整开发流程与规范。内容涵盖:
- 插件目录结构与命名约定
- 配置文件 manifest.php 的结构与参数定义
- Provider 与 Service 的职责划分、接口契约、方法签名、异常处理与日志记录最佳实践
- 全新 后台导航配置系统(使用 admin/nav/*.php 文件实现声明式菜单管理)
- 从简单功能到复杂业务的示例路径指引
- 调试技巧、测试方法、性能优化建议
- 代码规范、安全注意事项与兼容性要求
项目结构
DouPHP 将插件统一放置在 plugin 目录下,每个插件一个独立子目录,包含:
- manifest.php:插件元数据与入口声明
- XxxProvider.php:实现系统定义的 Provider 接口,作为系统调用入口
- XxxService.php:承载具体业务逻辑(对接第三方SDK、组装请求、处理回调等)
- 可选:sdk/、cert/、img/、qrcode.php 等扩展资源
- 新增 admin/nav/*.php:后台导航配置文件(用于模块安装时自动注册导航菜单)
graph TB
subgraph "插件目录"
M["manifest.php"]
P["XxxProvider.php"]
S["XxxService.php"]
N["admin/nav/*.php"]
SDK["sdk/ 或第三方库"]
RES["其他资源(证书/图片/脚本)"]
end
M --> P
P --> S
S --> SDK
S --> RES
N --> M
章节来源
- plugin/wxpay/manifest.php:1-11
- plugin/wxpay/WxpayProvider.php:1-127
- plugin/wxpay/WxpayService.php:1-473
- admin/nav/ai.php:1-49
核心组件
- 插件清单 manifest.php
- 必须返回数组,至少包含:
- plugin_group:插件分组标识(如 payment)
- provider:Provider 类的完全限定名
- 必须返回数组,至少包含:
- Provider 类
- 实现 PaymentPluginProviderInterface(基础支付能力)
- 可选实现 ReconcilablePaymentProviderInterface(支持主动对账查询)
- 可选实现 PollablePaymentProviderInterface(支持轮询状态,如扫码支付)
- 必须提供:pluginId()、meta()、start()、notify()、finish()
- 若实现查询接口,需提供 query();若实现轮询接口,需提供 status()
- Service 类
- 封装具体业务逻辑:构造请求、调用第三方SDK、解析响应、落库、写日志、跳转URL等
- 通过依赖注入获取系统服务(如 PaymentService)
章节来源
- core/infra/plugin/Contract/PaymentPluginProviderInterface.php:1-67
- core/infra/plugin/Contract/ReconcilablePaymentProviderInterface.php
- core/infra/plugin/Contract/PollablePaymentProviderInterface.php
- plugin/alipay/AlipayProvider.php:1-111
- plugin/wxpay/WxpayProvider.php:1-127
- plugin/cod/CodProvider.php:1-92
架构总览
支付插件在系统中的调用链路如下:
- 前端发起支付 -> 路由到插件入口 -> Provider.start() -> Service.start() 生成支付页面/链接
- 第三方支付异步通知 -> 路由到插件 notify -> Provider.notify() -> Service.notify() 验签并推进订单状态
- 同步回跳 -> 路由到插件 finish -> Provider.finish() -> Service.finish() 返回用户应跳转的页面
- 主动对账/轮询 -> 系统调度 query()/status() -> Service.query()/status() 查询并更新状态
sequenceDiagram
participant U as "用户浏览器"
participant SYS as "DouPHP 系统"
participant PRV as "XxxProvider"
participant SVC as "XxxService"
participant EXT as "第三方SDK/平台"
U->>SYS : 发起支付
SYS->>PRV : start(PaymentRequest)
PRV->>SVC : start(request)
SVC->>EXT : 创建订单/获取支付参数
EXT-->>SVC : 支付参数/二维码/链接
SVC-->>PRV : HTML/URL
PRV-->>U : 渲染支付页或重定向
EXT-->>SYS : 异步通知
SYS->>PRV : notify(PaymentCallbackPayload)
PRV->>SVC : notify(payload)
SVC->>EXT : 验签/确认
SVC-->>SYS : success/fail
SYS-->>EXT : 返回确认结果
U->>SYS : 同步回跳
SYS->>PRV : finish(PaymentCallbackPayload)
PRV->>SVC : finish(payload)
SVC-->>PRV : 跳转URL
PRV-->>U : 重定向到订单页
图表来源
- plugin/wxpay/WxpayProvider.php:1-127
- plugin/wxpay/WxpayService.php:1-473
- plugin/alipay/AlipayProvider.php:1-111
详细组件分析
微信支付插件(wxpay)
- 目录职责
- manifest.php:声明分组 payment 与 Provider 类
- WxpayProvider.php:实现支付、通知、回跳、轮询、对账等能力
- WxpayService.php:按 UA 分流 JSAPI/H5/Native,调用微信SDK,处理回调与轮询,写入日志,跳转订单页
- 关键流程
- start:根据 UA 选择 JSAPI/H5/Native,生成支付参数或二维码
- notify:加载SDK并验签,成功后通过 PaymentService 标记成功
- finish:返回订单详情页URL
- status:Native 扫码轮询,按 paymentSn 查询微信并推进状态
- query:主动对账,返回成功/失败/未找到/待支付等结果
classDiagram
class WxpayProvider {
+pluginId() string
+meta() array
+start(request) string
+notify(payload) string
+finish(payload) string
+status(payload) string
+query(request) PaymentQueryResult
}
class WxpayService {
+start(request) string
+notify(payload) string
+finish(payload) string
+status(payload) string
+query(request) PaymentQueryResult
-callOrderQuery(paymentSn) array|null
-buildConfig() array
-bootSdk(files) void
-initLog() void
}
WxpayProvider --> WxpayService : "委托业务逻辑"
图表来源
- plugin/wxpay/WxpayProvider.php:1-127
- plugin/wxpay/WxpayService.php:1-473
章节来源
- plugin/wxpay/manifest.php:1-11
- plugin/wxpay/WxpayProvider.php:1-127
- plugin/wxpay/WxpayService.php:1-473
支付宝插件(alipay)
- 目录职责
- manifest.php:声明分组 payment 与 Provider 类
- AlipayProvider.php:实现基础支付能力与主动对账
- 关键流程
- start:生成PC端支付页面/链接
- notify:接收并处理支付宝异步通知
- finish:返回用户应跳转的页面
- query:主动对账,返回交易状态
sequenceDiagram
participant U as "用户浏览器"
participant SYS as "DouPHP 系统"
participant AP as "AlipayProvider"
participant AS as "AlipayService"
participant ALI as "支付宝SDK/平台"
U->>SYS : 发起支付
SYS->>AP : start(request)
AP->>AS : start(request)
AS->>ALI : 创建订单/获取支付参数
ALI-->>AS : 支付参数/链接
AS-->>AP : HTML/URL
AP-->>U : 渲染或重定向
ALI-->>SYS : 异步通知
SYS->>AP : notify(payload)
AP->>AS : notify(payload)
AS->>ALI : 验签/确认
AS-->>SYS : success/fail
SYS-->>ALI : 返回确认结果
图表来源
- plugin/alipay/AlipayProvider.php:1-111
章节来源
- plugin/alipay/manifest.php:1-11
- plugin/alipay/AlipayProvider.php:1-111
货到付款插件(cod)
- 目录职责
- manifest.php:声明分组 payment 与 Provider 类
- CodProvider.php:实现基础支付能力(无第三方回调)
- 关键流程
- start:展示货到付款提示与下单按钮
- notify:无第三方回调,直接返回 fail
- finish:返回首页或订单列表
flowchart TD
Start(["开始"]) --> Show["显示货到付款提示"]
Show --> UserAction{"用户是否完成线下付款?"}
UserAction --> |否| Cancel["取消/返回"]
UserAction --> |是| Finish["finish() 返回首页"]
Cancel --> End(["结束"])
Finish --> End
图表来源
- plugin/cod/CodProvider.php:1-92
章节来源
- plugin/cod/manifest.php:1-11
- plugin/cod/CodProvider.php:1-92
后台导航配置
全新 DouPHP 引入了基于 admin/nav/*.php 文件的声明式导航配置系统,替代了传统的基于路由的导航DSL配置。
导航配置架构
新的导航系统采用声明式配置方式,每个模块可以在自己的 admin/nav/<module>.php 文件中定义后台子菜单族。这些配置文件由 AdminMenuRegistry::subMenus() 在启动时自动发现和装配,实现了灵活可扩展的菜单管理机制。
导航配置文件结构
每个导航配置文件返回一个包含以下字段的数组:
return array(
'title' => '模块标题', // 语言键,显示为菜单组标题
'icon' => 'bi-icon-name', // Bootstrap Icons 图标类名
'items' => array( // 子菜单项数组
array(
'key' => 'item_key', // 唯一标识符
'name' => 'lang_key', // 语言键,显示名称
'link' => 'route.name',// 路由名
'match' => array('route.*'), // 路由匹配模式
'exclude' => array(), // 排除模式
'when' => array(), // 可见条件
'params' => array(), // 路由参数
'renders' => null, // 指定渲染的族
'source' => null, // 动态项源
),
),
);
完整模块导航配置示例
AI模块导航配置
AI模块提供了完整的后台导航配置,包含AI模型管理、任务管理等子菜单:
return array(
'title' => 'ai',
'icon' => 'bi-robot',
'items' => array(
array(
'key' => 'ai', 'name' => 'ai', 'link' => 'admin.ai',
'match' => array('admin.ai.*', 'admin.ai_generate.*'),
),
array(
'key' => 'model', 'name' => 'ai_model', 'link' => 'admin.ai.model',
'match' => array('admin.ai.model.*', 'admin.ai.key.*'),
),
array(
'key' => 'log', 'name' => 'ai_log', 'link' => 'admin.ai.log',
'match' => array('admin.ai.log.*'),
),
array(
'key' => 'task', 'name' => 'ai_task', 'link' => 'admin.ai.task',
'match' => array('admin.ai.task.*'),
),
),
);
预约模块导航配置
预约模块展示了复杂的导航配置,包括作品管理、排班管理、规则设置等功能:
return array(
'title' => 'book',
'icon' => 'bi-book',
'items' => array(
array(
'key' => 'book', 'name' => 'book', 'link' => 'admin.book',
'match' => array('admin.book.*'), 'exclude' => array('admin.book.work.*'),
),
array('key' => 'item', 'name' => 'book_item', 'link' => 'admin.book.item', 'match' => array('admin.book.item.*')),
array('key' => 'schedule', 'name' => 'book_schedule', 'link' => 'admin.book.schedule', 'match' => array('admin.book.schedule.*')),
array(
'key' => 'rule', 'name' => 'book_rule', 'link' => 'admin.book.rule',
'match' => array('admin.book.rule.*', 'admin.book.rule_slot.*'),
),
array('key' => 'class', 'name' => 'book_class', 'link' => 'admin.book.class', 'match' => array('admin.book.class.*')),
array('key' => 'contact', 'name' => 'book_contact', 'link' => 'admin.book.contact', 'match' => array('admin.book.contact.*')),
array('key' => 'blacklist', 'name' => 'book_blacklist', 'link' => 'admin.book.blacklist', 'match' => array('admin.book.blacklist.*')),
array(
'key' => 'set', 'name' => 'book_set', 'link' => 'admin.book.set',
'match' => array('admin.book.set'),
),
),
);
聊天模块导航配置
聊天模块包含了会话管理、知识库、套餐订阅等完整功能:
return array(
'title' => 'chat',
'icon' => 'bi-chat',
'items' => array(
array('key' => 'chat', 'name' => 'chat', 'link' => 'admin.chat', 'match' => array('admin.chat.*')),
array('key' => 'session', 'name' => 'chat_session', 'link' => 'admin.chat.session', 'match' => array('admin.chat.session.*')),
array(
'key' => 'knowledge', 'name' => 'chat_knowledge', 'link' => 'admin.chat.knowledge',
'match' => array('admin.chat.knowledge.*', 'admin.chat_knowledge.category.*'),
),
array('key' => 'package', 'name' => 'chat_package', 'link' => 'admin.chat.package', 'match' => array('admin.chat.package.*')),
array('key' => 'subscription', 'name' => 'chat_subscription', 'link' => 'admin.chat.subscription', 'match' => array('admin.chat.subscription.*')),
array('key' => 'quota', 'name' => 'chat_quota', 'link' => 'admin.chat.quota', 'match' => array('admin.chat.quota.*')),
array('key' => 'usage_log', 'name' => 'chat_usage_log', 'link' => 'admin.chat.usage_log', 'match' => array('admin.chat.usage_log.*')),
array('key' => 'daily_stats', 'name' => 'chat_daily_stats', 'link' => 'admin.chat.daily_stats', 'match' => array('admin.chat.daily_stats.*')),
array('key' => 'task', 'name' => 'chat_task', 'link' => 'admin.chat.task', 'match' => array('admin.chat.task.*')),
),
);
分销模块导航配置
分销模块专注于分销体系管理,包含申请、奖励、等级等核心功能:
return array(
'title' => 'distribution',
'icon' => 'bi-diagram-3',
'items' => array(
array('key' => 'people', 'name' => 'distribution_apply', 'link' => 'admin.distribution', 'match' => array('admin.distribution.*')),
array('key' => 'reward', 'name' => 'distribution_reward', 'link' => 'admin.distribution.reward', 'match' => array('admin.distribution.reward.*')),
array('key' => 'level', 'name' => 'distribution_level', 'link' => 'admin.distribution.level', 'match' => array('admin.distribution.level.*')),
array('key' => 'level_log', 'name' => 'distribution_level_log_manager', 'link' => 'admin.distribution.level_log', 'match' => array('admin.distribution.level_log.*')),
),
);
用户模块导航配置
用户模块提供了完整的用户管理体系,包含联系人、日志、等级等管理功能:
return array(
'title' => 'user',
'icon' => 'bi-people',
'items' => array(
array(
'key' => 'user', 'name' => 'user', 'link' => 'admin.user',
'match' => array('admin.user.*'),
),
array('key' => 'user_center_placeholder', 'source' => 'user_center'),
array(
'key' => 'contact', 'name' => 'user_contact_manager', 'link' => 'admin.user.contact',
'match' => array('admin.user.contact.*'),
),
array(
'key' => 'log', 'name' => 'user_log_manager', 'link' => 'admin.user.log',
'match' => array('admin.user.log.*'),
),
array(
'key' => 'level_log', 'name' => 'user_level_log_manager', 'link' => 'admin.user.level_log',
'match' => array('admin.user.level_log.*'),
),
),
);
微信模块导航配置
微信模块集成了微信公众号管理功能,包含菜单、媒体、系统等管理:
return array(
'title' => 'weixin',
'icon' => 'bi-weixin',
'items' => array(
array('key' => 'menu', 'name' => 'weixin_menu', 'link' => 'admin.weixin.menu', 'match' => array('admin.weixin.menu.*')),
array(
'key' => 'media', 'name' => 'weixin_media', 'link' => 'admin.weixin.media',
'match' => array('admin.weixin.media.*', 'admin.weixin_media.*'),
),
array('key' => 'system', 'name' => 'weixin_system', 'link' => 'admin.weixin.system', 'match' => array('admin.weixin.system.*')),
),
);
导航匹配规则
导航系统使用灵活的匹配规则来确定当前页面的激活状态:
- 段边界通配:
admin.user.*匹配admin.user及其任意层下级 - 精确匹配:
admin.user.log精确匹配特定路由 - 尾缀兼容:
admin.user.contact.*同时匹配admin.user.contact本身 - 排除规则:使用
exclude字段排除特定路由 - 条件显示:使用
when字段控制菜单项的可见性
导航装配流程
导航配置的生命周期如下:
sequenceDiagram
participant FS as "文件系统"
participant REG as "AdminMenuRegistry"
participant RES as "AdminNavResolver"
participant UI as "后台界面"
FS->>REG : 扫描 admin/nav/*.php
REG->>REG : include 导航配置文件
REG->>RES : 提供导航族数据
RES->>RES : 计算当前路由匹配
RES->>UI : 返回激活状态和菜单结构
图表来源
- admin/service/menu/AdminMenuRegistry.php:77-159
- admin/service/menu/AdminNavResolver.php:64-136
插件集成导航配置
对于需要后台管理界面的插件,可以按照以下步骤集成导航配置:
- 创建导航配置文件:在插件根目录创建
admin/nav/<module>.php - 定义菜单结构:按照上述格式定义菜单项
- 配置路由匹配:确保
match数组中的路由与实际路由一致 - 添加语言包:为菜单项添加相应的语言翻译
- 测试验证:安装插件后检查后台菜单是否正确显示
章节来源
- admin/nav/ai.php:1-49
- admin/nav/book.php:1-52
- admin/nav/chat.php:1-45
- admin/nav/distribution.php:1-38
- admin/nav/user.php:1-52
- admin/nav/weixin.php:1-39
- admin/service/menu/AdminMenuRegistry.php:1-298
- admin/service/menu/AdminNavResolver.php:1-455
依赖关系分析
- 插件清单与Provider绑定
- manifest.php 中的 provider 字段指向具体类,系统据此实例化并调用
- Provider 与 Service 解耦
- Provider 仅负责接口契约与参数传递,Service 承载业务细节
- 接口契约约束
- PaymentPluginProviderInterface:基础支付能力
- ReconcilablePaymentProviderInterface:支持主动对账
- PollablePaymentProviderInterface:支持轮询状态(如扫码支付)
- 新增 导航配置与模块注册
- admin/nav/*.php 文件随模块安装自动注册到导航系统
- AdminMenuRegistry 负责发现和装配导航配置
graph LR
MAN["manifest.php"] --> PROV["XxxProvider"]
PROV --> IF1["PaymentPluginProviderInterface"]
PROV --> IF2["ReconcilablePaymentProviderInterface?"]
PROV --> IF3["PollablePaymentProviderInterface?"]
PROV --> SVC["XxxService"]
NAV["admin/nav/*.php"] --> REG["AdminMenuRegistry"]
REG --> RES["AdminNavResolver"]
RES --> UI["后台界面"]
图表来源
- plugin/wxpay/manifest.php:1-11
- plugin/alipay/AlipayProvider.php:1-111
- plugin/wxpay/WxpayProvider.php:1-127
- core/infra/plugin/Contract/PaymentPluginProviderInterface.php:1-67
- admin/service/menu/AdminMenuRegistry.php:77-159
章节来源
- plugin/wxpay/manifest.php:1-11
- plugin/alipay/manifest.php:1-11
- core/infra/plugin/Contract/PaymentPluginProviderInterface.php:1-67
性能考虑
- 按需加载SDK:仅在需要时引入第三方SDK文件,避免全局加载开销
- 合理日志:将敏感信息脱敏后落盘,控制日志级别与滚动策略
- 减少重复网络请求:对同一订单的轮询进行节流与去抖
- 使用系统服务:通过 PaymentService 统一推进订单状态,避免重复逻辑
- 配置缓存:插件配置读取可结合系统缓存机制(如有)
- 新增 导航配置缓存:导航配置在请求级缓存,避免重复扫描文件系统
故障排查指南
- 常见问题定位
- 插件未生效:检查 manifest.php 中 provider 类是否存在且命名空间正确
- 回调失败:核对 notifyUrl 是否正确注册,验签逻辑是否一致
- 轮询无效:确认 status() 中 paymentSn 来源与查询条件
- 对账不一致:检查 query() 返回状态映射与原始报文保存
- 新增 导航不显示:检查 admin/nav/*.php 文件格式和路由匹配规则
- 日志查看
- 微信支付日志位于 storage/log/payment/wxpay/ 下,按日期分文件
- 调试建议
- 在 Service 中记录关键参数与返回值(注意脱敏)
- 使用浏览器开发者工具观察前端JS轮询与跳转行为
- 模拟第三方回调(本地代理或内网穿透)验证 notify/finish
- 新增 使用
AdminMenuRegistry::subMenus()调试导航配置
章节来源
- plugin/wxpay/WxpayService.php:433-455
结论
DouPHP 插件体系通过清晰的目录规范、统一的接口契约与 Provider/Service 职责分离,使支付插件具备高内聚、低耦合、易扩展的特点。全新的后台导航配置系统进一步简化了模块的后台管理界面集成,通过声明式的配置文件实现了灵活可扩展的导航机制。遵循本指南可实现从简单到复杂的各类支付插件,并确保稳定性、可维护性与安全性。
附录
插件目录结构规范
- 必需文件
- manifest.php:返回 plugin_group 与 provider
- XxxProvider.php:实现系统接口
- XxxService.php:实现业务逻辑
- 推荐组织
- sdk/:第三方SDK或库
- cert/:证书文件(如微信支付证书)
- img/:插件相关图片资源
- qrcode.php:二维码生成或展示脚本(可选)
- 新增 后台管理界面
- admin/nav/*.php:后台导航配置文件(可选,用于模块安装时自动注册导航菜单)
章节来源
- plugin/wxpay/manifest.php:1-11
- plugin/wxpay/WxpayProvider.php:1-127
- plugin/wxpay/WxpayService.php:1-473
- admin/nav/ai.php:1-49
manifest.php 结构与参数
- 必填键
- plugin_group:插件分组(如 payment)
- provider:Provider 类完全限定名
- 说明
- 该文件由系统加载以发现并实例化插件
章节来源
- plugin/wxpay/manifest.php:1-11
- plugin/alipay/manifest.php:1-11
- plugin/cod/manifest.php:1-11
Provider 与 Service 实现规范
- Provider
- 实现 PaymentPluginProviderInterface 基础方法
- 可选实现 ReconcilablePaymentProviderInterface(query)
- 可选实现 PollablePaymentProviderInterface(status)
- meta() 中描述插件名称、版本、分组、客户端限制与配置项
- Service
- 封装第三方SDK调用、参数构建、响应解析、状态推进、日志记录
- 通过依赖注入获取系统服务(如 PaymentService)
- 保持方法单一职责,便于测试与维护
章节来源
- core/infra/plugin/Contract/PaymentPluginProviderInterface.php:1-67
- plugin/alipay/AlipayProvider.php:1-111
- plugin/wxpay/WxpayProvider.php:1-127
- plugin/wxpay/WxpayService.php:1-473
后台导航配置规范
- 配置文件位置
- admin/nav/<module>.php:模块导航配置文件
- 必需字段
- title:菜单组标题(语言键)
- icon:Bootstrap Icons 图标类名
- items:子菜单项数组
- 菜单项字段
- key:唯一标识符
- name:显示名称(语言键)
- link:路由名
- match:路由匹配模式数组
- exclude:排除模式数组
- when:可见条件数组
- params:路由参数数组
- renders:指定渲染的族
- source:动态项源
- 匹配规则
- 段边界通配:
admin.user.* - 精确匹配:
admin.user.log - 尾缀兼容:
admin.user.contact.*
- 段边界通配:
章节来源
- admin/nav/ai.php:1-49
- admin/nav/book.php:1-52
- admin/service/menu/AdminMenuRegistry.php:23-62
- admin/service/menu/AdminNavResolver.php:35-51
开发示例路径指引
- 简单功能插件:参考货到付款插件
- 目录:plugin/cod
- 重点:manifest.php、CodProvider.php、CodService.php
- 复杂业务插件:参考微信支付插件
- 目录:plugin/wxpay
- 重点:WxpayProvider.php、WxpayService.php、SDK集成、回调与轮询
- 新增 带后台管理的插件:参考AI模块
- 目录:admin/nav/ai.php
- 重点:导航配置、路由匹配、菜单结构
章节来源
- plugin/cod/CodProvider.php:1-92
- plugin/wxpay/WxpayProvider.php:1-127
- plugin/wxpay/WxpayService.php:1-473
- admin/nav/ai.php:1-49
调试技巧与测试方法
- 本地调试
- 使用内网穿透暴露 notifyUrl,确保第三方能回调
- 在 Service 中记录关键参数与响应(脱敏)
- 单元测试
- 针对 Service 的纯函数逻辑编写单测(如参数构建、状态映射)
- Mock 第三方SDK调用,验证边界条件
- 集成测试
- 使用沙箱环境验证 start/notify/finish/query/status 全流程
- 新增 导航配置调试
- 使用
AdminMenuRegistry::subMenus()检查导航配置是否正确加载 - 验证路由匹配规则是否符合预期
- 检查语言包是否正确配置
- 使用
代码规范与安全注意事项
- 代码规范
- 严格遵循PSR-4命名空间与自动加载
- 方法短小清晰,单一职责,避免过长函数
- 常量与配置集中管理,避免硬编码
- 安全考虑
- 所有外部输入必须校验与过滤
- 敏感信息(密钥、证书)不得入库或输出到日志
- 回调验签必须严格,防止伪造请求
- 兼容性要求
- 兼容多客户端(PC/Mobile/小程序),通过 allow_client 与UA判断
- 向后兼容:新增字段需有默认值,避免破坏旧配置
- 新增 导航配置安全
- 导航配置文件必须包含安全检查(IN_DOUCO 常量检查)
- 路由匹配规则要精确,避免意外匹配
- 菜单权限控制要完善,防止越权访问