Fastadmin---开发插件

最近发现一个非常不错的框架,作为资深的PHP开发人员,早听过,但是没有实际使用过。然后这段时间做了一个系统,就是用Fastadmin做的,完全基于插件就可以实现60%的功能。

额外的一些功能就需要自己来开发了。但是由于系统还得升级,直接改代码不合适,所以就得开发框架,这个有点让我想起了很久很久以前的OneThink也是功能差异化,都是通过开发插件来实现。

参考文档:

1、Fastadmin框架文档

https://doc.fastadmin.net/doc/faq.html

2、FastAdmin插件开发教程

https://ask.fastadmin.net/article/324.html

3、创建插件文档

https://doc.fastadmin.net/developer/78.html

4、看云开发插件文档

https://www.kancloud.cn/mrleehao/fastadmin/1590850

让我来!

最新教程:https://doc.fastadmin.net/developer/55.html

一、创建插件

根目录执行命令

php think addon -a mydemo -c create

然后在addons就创建好了:

mydemo
├── Mydemo.php
├── config.php
├── controller
│   └── Index.php
└── info.ini

创建名称:最好只使用英文字母。

通过 http://www.example.com/addons/mydemo 访问,如果出现这样就说明插件创建成功了。

image

此时这里访问的控制器就是:controller/index.php 下的Index方法

同时在后台也会有个这种的提示:

image

如果是需要售卖的插件,需要去查一下名字有没有被用掉:

https://www.fastadmin.net/developer/idcheck.html

二、创建数据库

在插件目录 addons/mydemo 目录添加一个 install.sql

1、数据库表名规范

__PREFIX__mydemo_log
__PREFIX__mydemo_item
__PREFIX__mydemo_comment

其中mydemo为你的插件标识,__PREFIX__为数据表前缀。

2、特殊字段

category_id   分类ID      int       关联fa_category表,后台CRUD时会自动生成selectpage组件      
user_id       会员ID      int   关联fa_user表,后台CRUD时会自动生成selectpage组件      
weigh         权重        int       后台的排序字段,如果存在该字段将出现排序按钮,可上下拖动进行排序
createtime    创建时间     bigint        记录添加时间字段,不需要手动维护                              
updatetime    更新时间     bigint        记录更新时间的字段,不需要手动维护                            
deletetime    删除时间     bigint        记录删除时间的字段,不需要手动维护,如果存在此字段将会生成回收站功能,字段默认值务必为null
status        状态字段     enum      状态标识,如果存在此字段将启用TAB选项卡展示列表    

3、配置数据库

CREATE TABLE IF NOT EXISTS `__PREFIX__mydemo` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `pid` int(10) DEFAULT NULL COMMENT '父id',
  `title` varchar(100) DEFAULT NULL COMMENT '标题',
  `name` varchar(100) DEFAULT NULL COMMENT '名称',
  `createtime` bigint(16) DEFAULT NULL COMMENT '创建时间',
  `updatetime` bigint(16) DEFAULT NULL COMMENT '更新时间',
  `publishtime` bigint(16) DEFAULT NULL COMMENT '发布时间',
  `deletetime` bigint(16) DEFAULT NULL COMMENT '删除时间',
  `memo` varchar(100) DEFAULT '' COMMENT '备注',
  `status` enum('normal','hidden','rejected','pulloff') NOT NULL DEFAULT 'normal' COMMENT '状态',
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4  COLLATE=utf8mb4_general_ci COMMENT='示例表';

测试数据:可以添加 testdata.sql 插入测试数据。

、配置文件

addons/mydemo 创建一个 config.php 配置文件,配置好后,可以在插件的配置里面进行配置:

image

1、使用配置

$config = get_addon_config('插件标识');

2、更新配置

set_addon_config('插件标识', 配置数组, 是否写入文件);
set_addon_fullconfig('插件标识', 配置数组); //此函数将强制写入配置文件

四、控制器

与Thinkphp5有很多的不同:

1、控制器的基类

插件控制器基类为:\think\addons\Controller
ThinkPHP5控制器基类为:\think\Controller

2、请求URL不同

插件控制器请求方法为:http://www.fa.com/addons/mydemo/控制器名/方法
ThinkPHP5控制器请求方法为:http://www.fa.com/模块名/控制器名/方法

3、使用层级控制不同

插件控制器请求方法为:http://www.fa.com/addons/mydemo/目录名.控制器名/方法
ThinkPHP5控制器请求方法为:http://www.fa.com/模块名/目录名.控制器名/方法

4、控制器请求

http://www.fa.com/addons/mydemo/控制器名/控制器方法

FastAdmin插件控制器的基类控制器\think\addons\Controller位于vendor/karsonzhang/fastadmin-addons/src/addons/Controller.php。

5、基类属性

protected $addon = null; //插件名称
protected $controller = null; //控制器名称
protected $action = null; //方法名称
/**
 * 无需登录的方法,同时也就不需要鉴权了
 * @var array
 */
protected $noNeedLogin = ['*'];
/**
 * 无需鉴权的方法,但需要登录
 * @var array
 */
protected $noNeedRight = ['*'];
/**
 * 权限Auth,如果用户是登录状态,可以直接从中读取用户信息
 * @var Auth
 */
protected $auth = null;

/**
 * 布局模板,默认不启用
 * @var string
 */
protected $layout = null;

五、视图

视图位于:addons/mydemo/view 目录

六、测试

插件目录 addons/mydemo 添加一个 testdata.sql,测试数据的SQL存放在此文件中。

七、模型

1、模型存放位置

addons/mydemo/model/User.php

2、模型命名空间

addons\mydemo\model

3、正确的写法

namespace addons\mydemo\model;

use think\Model;

class User extends Model
{
    
}

八、创建菜单

一般插件都会有管理菜单,常在addons/mydemo/Mydemo.php 中添加代码:

<?php

namespace addons\mydemo;

use app\common\library\Menu;
use app\common\model\User;
use fast\Date;
use think\Addons;
use think\Config;
use think\Request;
use think\Route;

/**
 * Mydemo插件
 */
class Mydemo extends Addons
{
    protected $menu = [
            [
                'name'    => 'mydemo', //权限规则标识,首个菜单标识必须和插件标识相同
                'title'   => 'Mydemo管理', //菜单标题
                'icon'    => 'fa fa-map-marker', //菜单按钮,可使用Font-Awesome的图标
                'ismenu'  => 1, //是否为菜单
                'weigh'   => 1, //权重,值越大越靠前
                'remark'  => 'Demo管理描述内容', //菜单描述内容,在列表处显示
                'sublist' => [ //子菜单配置,子菜单name必须以 插件标识/ 开始,这里如 mydemo/
                    ["name"  => "mydemo/signin/index","title" => "查看"],
                    ["name"  => "mydemo/signin/add","title" => "添加"],
                    ["name"  => "mydemo/signin/edit","title" => "编辑"],
                    ["name"  => "mydemo/signin/del","title" => "删除"],
                    ["name"  => "mydemo/signin/multi","title" => "批量更新"],
                ]
            ]
        ];
    /**
     * 插件安装方法
     * @return bool
     */
    public function install()
    {
        Menu::create($this->menu);
        return true;
    }

    /**
     * 插件卸载方法
     * @return bool
     */
    public function uninstall()
    {
        Menu::delete("mydemo");
        return true;
    }

    /**
     * 插件启用方法
     * @return bool
     */
    public function enable()
    {
        Menu::enable("mydemo");
        return true;
    }

    /**
     * 插件禁用方法
     * @return bool
     */
    public function disable()
    {
        Menu::disable("mydemo");
        return true;
    }

    /**
     * 插件升级方法
     * @return bool
     */
    public function upgrade()
    {
        //如果菜单有变更则升级菜单
        Menu::upgrade('mydemo', $this->menu);
        return true;
    }

    /**
     * 会员中心边栏后
     * @return mixed
     * @throws \Exception
     */
    public function userSidenavAfter()
    {
        $request = Request::instance();
        $controllername = strtolower($request->controller());
        $actionname = strtolower($request->action());
        $data = [
            'actionname'     => $actionname,
            'controllername' => $controllername
        ];
        return $this->fetch('view/hook/user_sidenav_after', $data);
    }

}

具体参考:

https://doc.fastadmin.net/developer/94.html

九、学习其他插件是怎么开发的?

知道了插件的基本开发方式,在做开发的时候,可以学习其他的插件,比如直接复制其他的插件进行二次开发,或者是通过阅读其他插件的代码,了解怎么开发插件。

1、Notice 插件

image

然后阅读代码:获取用户以及操作其他的模型

image

操作其他模型:

示例1:查询数量

$count = \app\admin\model\notice\Notice::where('to_id', $user['id'])
            ->where('platform', 'user')
            ->where('type','msg')
            ->order('id', 'desc')
            ->whereNull('readtime')
            ->count(); // find(); 查询  paginate(); 分页 

示例2:更新

$result = \app\admin\model\notice\Notice::where('id', 'in',array_column($list->items(), 'id'))->update(['readtime' => time()]);

示例3:调用其他的方法

先引入:

use app\admin\model\notice\AdminMptemplate;

然后使用:

$exist = \app\admin\model\notice\AdminMptemplate::where('admin_id', $adminId)->find();
// 调用模型方法
AdminMptemplate::create([
  'admin_id' => $adminId,
  'openid' => $openid,
  'nickname' => $nickname,
  'avatar' => $avatar,
  'unionid' => $unionid
]);

2、获取配置

$config = get_addon_config('alioss');

十、打包插件

php think addon -a mydemo -c package

这样在 runtime/addons/ 就会生成 mydemo 的压缩文件,然后插件就打包成功了。

打完收工!

posted @ 2026-04-01 11:32  帅到要去报警  阅读(31)  评论(0)    收藏  举报