Fastadmin---开发插件实战
最近在学习 Fastadmin 二次开发,下面是自己开发插件的流程:
开发文档:
https://doc.fastadmin.net/developer/55.html https://www.kancloud.cn/echo_qq/fastadmin_addons/1295036
一、开发插件的流程
第一步:创建插件
php think addon -a datav -c create
查看是否创建好:

第二步:数据库
创建好插件后,默认的数据库就已经有了:install.sql 根据自己的业务修改sql文件:
CREATE TABLE `__PREFIX__datav` ( `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(128) NOT NULL COMMENT '名称', `code` varchar(32) NOT NULL COMMENT '编码', `pri` enum('1','2','3','4') DEFAULT '1' COMMENT '优先级', `desc` mediumtext COMMENT '项目描述', `status` enum('wait','doing','closed','suspended','undone') DEFAULT NULL COMMENT '项目状态:wait=等待,doning=进行中,closed=关闭,suspended=挂起,undone=取消', `createdBy` varchar(32) DEFAULT NULL COMMENT '创建人', `createtime` datetime DEFAULT NULL COMMENT '创建时间', `updatedBy` varchar(32) DEFAULT NULL COMMENT '更新人', `updatetime` datetime DEFAULT NULL COMMENT '更新时间', `deletedBy` varchar(255) DEFAULT NULL COMMENT '删除人', `deletetime` datetime DEFAULT NULL COMMENT '删除时间', `deleted` enum('0','1') DEFAULT '0' COMMENT '是否删除:0=否,1=是', `weigh` int(8) NOT NULL DEFAULT '0' COMMENT '排序号', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='数据大屏'
然后去执行这个SQL文件,在数据库里面创建表。
第三步:创建插件CRUD模块
php think crud -t datav -c datav/datav -u 1 --force=true
此命令会在 admin 模块创建 控制器、模型、验证器、视图

刷新看后台:

第四步:移动CRUD文件到插件对应的目录
1、命令移动
php think addon -a datav -c move
此命令会自动将:behavior controller library model validate view lang public/assets/addons public/assets/js 文件进行移动到插件目录
/application/admin/behavior/datav /addons/datav/application/admin/behavior /application/admin/controller/datav /addons/datav/application/admin/controller /application/admin/library/datav /addons/datav/application/admin/library /application/admin/model/datav /addons/datav/application/admin/model /application/admin/validate/datav /addons/datav/application/admin/validate /application/admin/view/datav /addons/datav/application/admin/view /application/admin/lang /addons/datav/application/admin/lang /public/assets/addons/datav /addons/datav/public/assets/addons /public/assets/js/backend/datav /addons/datav/public/assets\js\backend
2、手动移动
手动复制对应的文件进行移动。
3、移动后的插件目录:

目录结构:
datav ├─── application │ └── admin │ ├── controller │ │ └── datav │ │ └── Msglog.php │ ├── lang │ │ └── zh-cn │ │ └── datav │ │ └── msglog.php │ ├── model │ │ └── datav │ │ └── Msglog.php │ ├── validate │ │ └── datav │ │ └── Msglog.php │ └── view │ └── datav │ └── msglog │ ├── add.html │ ├── edit.html │ ├── index.html │ └── recyclebin.html ├─── controller │ └── Index.php ├─── public │ └── assets │ └── js │ └── backend │ └── datav │ └── msglog.js ├─── config.php ├─── info.ini └─── Guestbook.php
第五步:插件的卸载与安装
插件目录的 datav.php
<?php namespace addons\datav; use app\common\library\Menu; use think\Addons; /** * 插件 */ class Datav extends Addons { /** * 插件安装方法 * @return bool */ public function install() { $menu = array ( 0 => array ( 'name' => 'datav/datav', 'title' => '数据大屏', 'ismenu' => 1, 'sublist' => array ( 0 => array ( 'name' => 'datav/datav/index', 'title' => '查看', ), 1 => array ( 'name' => 'datav/datav/recyclebin', 'title' => '回收站', ), 2 => array ( 'name' => 'datav/datav/add', 'title' => '添加', ), 3 => array ( 'name' => 'datav/datav/edit', 'title' => '编辑', ), 4 => array ( 'name' => 'datav/datav/del', 'title' => '删除', ), 5 => array ( 'name' => 'datav/datav/destroy', 'title' => '真实删除', ), 6 => array ( 'name' => 'datav/datav/restore', 'title' => '还原', ), 7 => array ( 'name' => 'datav/datav/multi', 'title' => '批量更新', ), ), ), ); Menu::create($menu); return true; } /** * 插件卸载方法 * @return bool */ public function uninstall() { Menu::delete("datav"); return true; } /** * 插件启用方法 * @return bool */ public function enable() { Menu::enable("datav"); return true; } /** * 插件禁用方法 * @return bool */ public function disable() { Menu::disable("datav"); return true; } }
第六步:打包插件
根目录执行命令:
php think addon -a datav -c package
执行成功:

位于:
runtime/addons/datav-1.0.0.zip
可以看到:

到此,datav插件开发结束。
二、具体插件开发
1、插件注册与实现钩子
支持的钩子:部分
app_init 应用初始化标签位 app_begin 应用开始标签位 module_init 模块初始化标签位 action_begin 控制器开始标签位 log_write 日志write方法标签位 upload_after 文件上传成功标签位 // 管理员 admin_login_init 登录标签位-打开登录页 admin_login_after 登录标签位-登录成功 admin_logout_after 管理员注销登录 admin_nologin 管理员未登录标签位 admin_nopermission 管理员无权限标签位 // 会员 user_login_successed 前台用户登录成功标签位 user_init_successed 前台用户通过Token初始化成功标签位 user_register_successed 前台用户注册成功标签位 user_logout_successed 前台用户注销成功标签位 user_changepwd_successed 前台用户修改密码成功标签位 // 插件 addon_begin 插件开始标签位 addon_module_init 插件模块初始化标签位 addon_action_begin 插件操作开始标签位
注册行为,只需在插件的核心安装卸载控制器写上钩子对应的方法即可,FastAdmin在插件安装启用时,会自动注册行为,行为方法需使用小写开头的驼峰法命名法,例如为钩子upload_after注册行为,方法名则为uploadAfter。
核心安装卸载控制器 Datav.php 文件 class Datav extends Addons { // 插件安装卸载启用等方法...... /** * 注册行为方法一,直接在核心安装卸载控制器内定义行为方法 * 管理员打开登录页时,获取插件的配置 * @param &$request 可以在行为方法中使用依赖注入 */ public function adminLoginInit(\think\Request &$request) { $config = $this->getConfig(); //获取插件的扩展配置 $view = \think\View::instance(); //初始化视图 $view->config = array_merge($view->config ? $view->config : [], ['demo_config' => $config['demo_config']]); //合并插件的扩展配置项到视图的模板引擎配置 } /** * Datav 插件内未使用 * 注册行为方法二-定义一个单独的行为类 */ public function appInit() { \think\Hook::add('action_begin', 'addons\\security\\behavior\\DataSecurity'); // 然后可以在 DataSecurity 类定义类似`adminLoginInit`的行为方法;请注意执行顺序,如`appInit、actionBegin`在`DataSecurity`注册后也不会执行。 } }
具体使用详见:
https://www.kancloud.cn/echo_qq/fastadmin_addons/1295039
2、插件添加API接口
方法一:插件里面开发API接口
第一步:\addons\guestbook\controller 目录下建立 api 目录
api基类 /addons/datav/controller/api/Base.php 文件
<?php namespace addons\datav\controller\api; use app\common\controller\Api; use app\common\library\Auth; use think\Lang; /** * api基类 */ class Base extends Api { protected $noNeedLogin = [];// 无需登录即可访问的方法,同时也无需鉴权了 protected $noNeedRight = ['*'];// 无需鉴权即可访问的方法 public function _initialize() { parent::_initialize(); // 载入语言包、初始化Auth等 //这里手动载入语言包 Lang::load(ROOT_PATH . '/addons/guestbook/lang/zh-cn.php'); } }
第二步:api 目录新建接口类
// 留言接口类,可供小程序、app等使用 /addons/datav/controller/api/Datav.php 文件
具体代码:
<?php namespace addons\datav\controller\api; use think\Validate; class Datav extends Base { protected $noNeedLogin = ['mylist']; /* * 记录留言接口 * 本接口URL:http://您的域名/addons/guestbook/api.guestbook/index */ public function mylist() { if ($this->request->isPost()) { $contact = $this->request->post('contact'); $title = $this->request->post('title'); $message = $this->request->post('message'); $token = $this->request->post('__token__'); $rule = [ 'contact' => 'require|length:3,30', 'title' => 'require|length:3,30', 'message' => 'require|length:3,255', '__token__' => 'require|token', ]; $msg = [ 'contact.require' => __('Contact information required'), 'contact.length' => __('Contact must be within 3 to 30 characters'), 'title.require' => __('Message subject required'), 'title.length' => __('Message subject must be within 3 to 30 characters'), 'message.require' => __('Message content required'), 'message.length' => __('Message content must be within 3 to 255 characters'), ]; $data = [ 'contact' => $contact, 'title' => $title, 'message' => $message, '__token__' => $token, ]; $validate = new Validate($rule, $msg); $result = $validate->check($data); if (!$result) { $this->error(__($validate->getError()), null, ['token' => $this->request->token()]); } // 留言入库 $data['user_id'] = $this->auth->isLogin() ? $this->auth->id : 0; $Msglog_model = new \app\admin\model\guestbook\Msglog; if ($Msglog_model->allowField(true)->save($data)){ $this->success(__('Message successfully')); } else { $this->error(__('Message failed')); } } } }
接口URL:
接口URL:http://您的域名/addons/datav/api.datav/index
方法二:在/application 对应的插件目录里面创建开发,最后打包成插件。
3、插件开发命令行
php think addon -a myaddon -c create // 创建一个myaddon本地插件,常用于开发自己的插件时使用 php think addon -a example -c refresh // 刷新插件缓存,如果禁用启用了插件,部分文件需要刷新才会生效 php think addon -a example -c uninstall // 卸载本地的example插件 php think addon -a example -c enable // 启用本地的example插件 php think addon -a example -c disable // 禁用本地的example插件 php think addon -a example -c package // 将本地的example插件打包成zip文件 php think addon -a example -c move // 将application和public目录下指定模块的CRUD相关文件复制到对应插件目录下
三、插件开发总结
总的来说开发 Fastadmin 插件,首先是创建【插件】然后创建【CRUD模块】然后将插件的CRUD模块【复制到插件目录】进行【打包】即可。
其实相当于:我们开发插件,可以先将功能做好,然后把这个插件打包成插件,用于另外的系统进行使用或者二次开发。
打完收工!

浙公网安备 33010602011771号