目录结构
插件目录
SwiftAdmin中的每一个插件,都是一个独立的文件夹,所有的应用插件都存在于根目录下的plugin
文件夹下。
以下是一个演示插件的目录结构:
demo
├── app // 此文件夹中所有文件会覆盖到根目录的/app文件夹
├── public // 此文件夹中所有文件会覆盖到根目录的/public文件夹
├── Demo.php // 此文件为插件核心安装卸载控制器,必需存在
├── config.json // 插件配置文件,我们在后台插件管理中点配置按钮时配置的文件,必需存在
├── config.html // 插件配置模板,如不存在则无配置项
├── plugin.js // 全局插件JS代码,自动加载到顶级index模板,也就是app/admin/index/index的模板之中
├── function.php // 全局的插件函数文件
├── Upgrade.php // 插件升级文件
├── install.sql // 插件数据库安装文件,此文件仅在插件安装时会进行导入[需要自行导入]
├── uninstall.sql // 插件数据库卸载文件[如果有数据库尽量设置数据库表,已达到正确卸载的目的]
├── LICENSE // 版权文件
其中app
和public
文件夹会覆盖到根目录,这两个文件夹主要用于我们后台管理功能的开发,我们可以先在后台开发好对应的管理功能后,
再将对应的功能打包进插件即可,在插件安装和卸载时会自动进行文件冲突检测,如果遇到冲突的文件会提醒用户是否进行覆盖或删除。
Demo.php
这个文件是插件的核心文件,我们可以在这个文件中编写插件安装或卸载时执行的脚本,或者在此插件中编写菜单的生成或删除,
同时插件的行为方法也是编写在此文件中的,插件所支持的行为事件会在后面讲到。此文件命令规则为插件目录名称首字母大写。
config.html
这个文件是插件配置的模板文件,我们在后台插件管理中点 配置
按钮时会调用该模板文件进行渲染,如果不存在该模板文件,将调用框架自带的配置模板进行渲染。
config.json
这个文件是插件的配置文件,我们在后台插件管理中点 配置
按钮时会保存在此文件,此文件的内容格式为:
配置文件
{
"name": "demo",
"title": "测试插件",
"intro": "这是一个测试插件!",
"author": "官方",
"home": "https:\/\/www.swiftadmin.net",
"version": "1.0.1",
"status": 1,
"extends": {
"title": "这里是扩展配置信"
},
"rewrite": {
"\/demo1": "demo\/demo", // 如需要伪静态,请将控制器大小写填写正确
"\/demo2": "index\/list",
"\/demo3": "index\/query"
},
"area": [
"600px",
"650px"
],
"auto": true,
"config": 1,
}
插件菜单
$menu = [
[
'title' => '测试插件',
'router' => '/command/index', // 如果你当前菜单下存在子菜单,那么请将路由设置为#
// 请参考控制台 数据库表
'icons' => 'layui-icon-app',
'auth' => '1', // 是否鉴权
'children' => [
['router' => '/command/index', 'title' => '查看'],
['router' => '/command/add', 'title' => '添加'],
['router' => '/command/detail', 'title' => '详情'],
['router' => '/command/execute', 'title' => '运行'],
['router' => '/command/del', 'title' => '删除'],
['router' => '/command/multi', 'title' => '批量更新'],
]
]
];
// 二级菜单设置
[
'title' => '测试插件2',
'router' => '#',
'icons' => 'layui-icon-app',
'auth' => '1',
'children' => [
[
'router' => '/fenlei1/index',
'title' => '分类1',
'children'=> [
['router' => '/fenlei1/add', 'title' => '添加'],
['router' => '/fenlei1/detail', 'title' => '详情'],
['router' => '/fenlei1/execute', 'title' => '运行'],
['router' => '/fenlei1/del', 'title' => '删除'],
['router' => '/fenlei1/multi', 'title' => '批量更新'],
],
],
[
'router' => '/fenlei2/index',
'title' => '分类2',
'children'=> [
['router' => '/fenlei2/add', 'title' => '添加'],
['router' => '/fenlei2/detail', 'title' => '详情'],
['router' => '/fenlei2/execute', 'title' => '运行'],
['router' => '/fenlei2/del', 'title' => '删除'],
['router' => '/fenlei2/multi', 'title' => '批量更新'],
],
],
]
],
前台菜单
前台菜单请自行编写menu.html文件,将他放在插件目录->data文件夹下,内容格式为:
<li class="layui-nav-item">
<a class="#" lay-href="/demo/index">演示插件</a>
</li>
这时候访问前台用户中心,可以看到一个演示插件的菜单,可以编写前台的交互页面!!
插件服务
插件服务需要自行进行注册,你可以在插件根目录建立service.php,并在自己插件的启用和关闭的时候,
修改vendor目录下的service.php文件进行自动加载!服务文件的编写规则请参考thinkphp官方代码!
数据库表
install.sql
这个文件中只能是SQL语句,同时在此文件中可以使用 __PREFIX__
表示数据库表前缀,插件在安装导入SQL时自动进行替换。此文件的内容格式为
uninstall.sql
数据库文件,在卸载插件的时候会用到,如果不存在这个SQL文件,则在卸载的时候将不会清理掉数据库
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 50726
Source Host : localhost:3306
Source Schema : swiftadmin
Target Server Type : MySQL
Target Server Version : 50726
File Encoding : 65001
Date: 23/03/2021 20:44:01
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for __PREFIX__demo
-- ----------------------------
DROP TABLE IF EXISTS `__PREFIX__demo`;
CREATE TABLE `__PREFIX__demo` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题',
`update_time` int(11) NULL DEFAULT NULL COMMENT '更新时间',
`create_time` int(11) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'demo插件数据表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of __PREFIX__demo
-- ----------------------------
INSERT INTO `__PREFIX__demo` VALUES (1, 'demo插件', 1602812266, 1602812266);
SET FOREIGN_KEY_CHECKS = 1;