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

查看是否创建好:

image

第二步:数据库

创建好插件后,默认的数据库就已经有了: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 模块创建 控制器、模型、验证器、视图

image

刷新看后台:

image

第四步:移动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、移动后的插件目录:

image

目录结构:

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

执行成功:

image

位于:

runtime/addons/datav-1.0.0.zip

可以看到:

image

到此,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模块【复制到插件目录】进行【打包】即可。

其实相当于:我们开发插件,可以先将功能做好,然后把这个插件打包成插件,用于另外的系统进行使用或者二次开发。

打完收工!

posted @ 2026-04-19 16:13  帅到要去报警  阅读(19)  评论(0)    收藏  举报