插件开发指南
1. 插件目录结构
插件是系统的扩展功能模块,位于 addons 目录下,每个插件是一个独立的目录。以下是插件的标准目录结构:
addons/
└─{插件标识}/ # 插件目录,使用唯一标识
├─config/ # 配置目录
│ ├─admin.php # 后台配置
│ ├─api.php # API配置
│ └─menu.php # 菜单配置
├─sql/ # SQL脚本目录
│ └─up.sql # 升级SQL脚本
├─admin.php # 后台接口入口
├─api.php # 手机端接口入口
├─console.php # 控制台入口
├─frontend.php # 页面端入口
├─install.php # 安装入口
├─manifest.xml # 模块配置
├─site.php # 站点入口
├─uninstall.php # 卸载入口
└─upgrade.php # 更新入口
1.1 核心文件说明
| 文件/目录 | 用途 | 必需 |
|---|---|---|
admin.php | 后台接口入口,处理后台管理相关请求 | 否 |
api.php | 手机端接口入口,处理移动端API请求 | 否 |
console.php | 控制台入口,处理命令行相关操作 | 否 |
install.php | 插件安装入口,处理插件安装逻辑 | 是 |
manifest.xml | 插件配置文件,定义插件基本信息 | 是 |
upgrade.php | 插件升级入口,处理插件版本升级 | 否 |
uninstall.php | 插件卸载入口,处理插件卸载逻辑 | 否 |
config/ | 配置目录,存放各种配置文件 | 否 |
sql/ | SQL脚本目录,存放数据库相关脚本 | 否 |
2. 插件配置文件 (manifest.xml)
manifest.xml 是插件的核心配置文件,包含了插件的基本信息和依赖关系。
2.1 配置示例
<manifest xmlns="https://www.dandicloud.com/" versionCode="1.0">
<application>
<title><![CDATA[多商户商城]]></title>
<identifie><![CDATA[diandi_mall]]></identifie>
<version><![CDATA[1.0.0]]></version>
<type><![CDATA[buss]]></type>
<ability><![CDATA[1]]></ability>
<description><![CDATA[多商户商城]]></description>
<author><![CDATA[wanchunsheng]]></author>
<url><![CDATA[www.baidu.com]]></url>
</application>
<bindings>
<menus>
</menus>
</bindings>
<install><![CDATA[install.php]]></install>
<uninstall><![CDATA[uninstall.php]]></uninstall>
<upgrade><![CDATA[upgrade.php]]></upgrade>
</manifest>
2.2 配置项说明
| 配置项 | 描述 | 必需 |
|---|---|---|
title | 插件标题,显示在后台管理界面 | 是 |
identifie | 插件唯一标识,必须与目录名一致 | 是 |
version | 插件版本号,遵循语义化版本规范 | 是 |
type | 插件类型,如 buss(业务插件) | 是 |
ability | 插件能力值,用于权限控制 | 是 |
description | 插件描述,详细说明插件功能 | 是 |
author | 插件作者 | 是 |
url | 插件官方网站 | 否 |
install | 安装入口文件 | 是 |
uninstall | 卸载入口文件 | 否 |
upgrade | 升级入口文件 | 否 |
3. 插件安装流程
3.1 安装文件 (install.php)
插件安装文件需要继承 AddonsInstall 类,并设置插件标识。
<?php
namespace addons\diandi_mall;
use common\components\addons\AddonsInstall;
class install extends AddonsInstall
{
public string $addons = 'diandi_mall';
}
3.2 安装流程
- 上传插件到
addons目录 - 在后台管理界面点击「安装」按钮
- 系统自动执行以下操作:
- 读取
manifest.xml配置文件 - 执行
install.php中的安装逻辑 - 导入 SQL 脚本(如果有)
- 注册插件到系统
- 读取
4. 插件升级流程
4.1 升级文件 (upgrade.php)
插件升级文件用于处理版本升级逻辑,确保插件能够平滑升级到新版本。
4.2 升级流程
- 更新插件文件到新版本
- 在后台管理界面点击「升级」按钮
- 系统自动执行以下操作:
- 读取
manifest.xml中的版本信息 - 执行
upgrade.php中的升级逻辑 - 导入升级 SQL 脚本(如果有)
- 更新系统中的插件版本信息
- 读取
5. 插件卸载流程
5.1 卸载文件 (uninstall.php)
插件卸载文件用于处理插件卸载逻辑,确保插件能够干净地从系统中移除。
5.2 卸载流程
- 在后台管理界面点击「卸载」按钮
- 系统自动执行以下操作:
- 执行
uninstall.php中的卸载逻辑 - 从系统中移除插件注册信息
- 保留插件文件(不会自动删除)
- 执行
6. 插件开发规范
6.1 命名规范
- 插件目录名必须使用小写字母和下划线,如
diandi_mall - 插件标识必须与目录名一致
- 类名和文件名遵循 PSR-4 命名规范
6.2 目录结构规范
- 核心入口文件直接放在插件根目录
- 配置文件放在
config目录 - SQL 脚本放在
sql目录 - 控制器和模型按照功能模块组织
6.3 代码规范
- 遵循 PSR-2 代码风格规范
- 使用命名空间,格式为
addons\\{插件标识} - 继承系统提供的基类和接口
- 遵循系统的事件机制和钩子系统
7. 插件示例
7.1 基础插件结构
以下是一个基础插件的目录结构示例:
addons/
└─my_plugin/
├─config/
│ ├─admin.php
│ └─api.php
├─install.php
├─manifest.xml
├─admin.php
├─api.php
└─upgrade.php
7.2 完整插件结构
以下是一个完整插件的目录结构示例(参考 diandi_mall):
addons/
└─diandi_mall/
├─config/
│ ├─api.js
│ └─api.php
├─sql/
│ └─up.sql
├─admin.php
├─api.php
├─console.php
├─frontend.php
├─install.php
├─manifest.xml
├─site.php
├─uninstall.php
└─upgrade.php
8. 常见问题
8.1 插件安装失败
可能原因:
manifest.xml配置错误install.php文件不存在或有语法错误- SQL 脚本执行失败
- 权限不足
解决方案:
- 检查
manifest.xml配置是否正确 - 检查
install.php文件是否存在且语法正确 - 检查 SQL 脚本是否有语法错误
- 确保系统有足够的权限
8.2 插件升级失败
可能原因:
- 版本号配置错误
upgrade.php文件不存在或有语法错误- 升级 SQL 脚本执行失败
解决方案:
- 检查
manifest.xml中的版本号配置 - 检查
upgrade.php文件是否存在且语法正确 - 检查升级 SQL 脚本是否有语法错误
8.3 插件无法正常工作
可能原因:
- 插件依赖的系统功能不存在
- 插件代码有语法错误
- 数据库表结构不完整
解决方案:
- 检查插件是否与当前系统版本兼容
- 检查插件代码是否有语法错误
- 检查数据库表结构是否完整
9. 最佳实践
9.1 插件开发建议
- 模块化设计:将插件功能拆分为多个模块,便于维护和扩展
- 版本管理:使用语义化版本号,确保版本升级的兼容性
- 错误处理:完善的错误处理机制,提高插件的稳定性
- 性能优化:优化代码和数据库查询,提高插件性能
- 安全性:注意代码安全,防止 SQL 注入、XSS 等安全问题
9.2 插件发布建议
- 文档完善:提供详细的安装和使用文档
- 版本说明:明确标注插件的系统版本要求
- 更新日志:记录每次版本更新的内容和变更
- 技术支持:提供技术支持渠道,及时响应用户问题
10. 参考插件
系统中已有的插件可以作为开发参考:
- diandi_mall:多商户商城插件,功能完整的电商系统
- diandi_oa:办公自动化插件,包含考勤、审批等功能
- diandi_agent:代理商管理插件,用于管理代理商体系
- diandi_ai_card:AI 名片插件,用于生成和管理电子名片
- diandi_equipment:设备管理插件,用于管理设备信息
11. 结语
插件开发是扩展系统功能的重要方式,通过遵循本文档的规范和最佳实践,可以开发出高质量、易维护的插件。希望本文档能够帮助开发者快速上手插件开发,为系统添加更多有价值的功能。
