Skip to content

插件类

文件位置 addons/wechat/Addon.php

<?php

namespace addons\wechat;

use tmcore\base\BaseAddons;

class Addon extends BaseAddons
{
    /**
     * 计划任务
     * @return array
     */
    public function crontab()
    {
        return [

        ];
    }

    /**
     * 创建菜单
     * @return array
     */
    public function menu()
    {
        return [
            [
                'type' => 'M',
                'name' => '微信管理',
                'icon' => 'ele-ElemeFilled',
                'sort' => 0,
                'perms' => '',
                'paths' => '/addons/wechat',
                'component' => '',
                'is_keep_alive' => 1,
                'is_hide' => 0,
                'is_disable' => 0,
                'children' => [
                    [
                        'type' => 'C',
                        'name' => '菜单管理',
                        'icon' => '',
                        'sort' => 0,
                        'perms' => 'addons/wechat/menu/detail',
                        'paths' => '/addons/wechat/menu',
                        'component' => 'wechat/views/menu/index',
                        'is_keep_alive' => 0,
                        'is_hide' => 0,
                        'is_disable' => 0,
                        'children' => [
                            [
                                'type' => 'A',
                                'name' => '编辑',
                                'icon' => '',
                                'sort' => 0,
                                'perms' => 'addons/wechat/menu/edit',
                                'is_keep_alive' => 1,
                                'is_hide' => 0,
                                'is_disable' => 0,
                            ]
                        ]
                    ]
                ]
            ]
        ];
    }

    /**
     * 插件安装
     */
    public function install()
    {
        return true;
    }

    /**
     * 插件卸载
     */
    public function uninstall()
    {
        return true;
    }

    /**
     * 插件升级
     */
    public function update()
    {
        return true;
    }
}

菜单字段说明

字段名称类型必显说明
type权限类型string权限类型: M=目录, C=菜单, A=按钮
name菜单名称string菜单名称
icon菜单图标string菜单图标
sort菜单排序int菜单排序
perms权限标识string权限标识
paths前端路由地址string前端路由地址
component前端组件路径string前端组件路径,根目录为: 插件标识/views/*
is_keep_alive是否缓存int是否缓存: 0=否, 1=是
is_hide是否隐藏int是否隐藏: 0=否, 1=是
is_disable是否禁用int是否禁用: 0=否, 1=是
children子菜单array子菜单数组内容

插件信息

文件位置 addons/wechat/info.php

<?php

return [
    'name' => 'wechat',
    'title' => '微信管理',
    'description' => '微信公众号管理',
    'author' => 'tmadmin',
    'version' => '0.0.1'
];

如果插件间有依赖关系,需要在插件信息中添加依赖插件的配置信息

<?php

return [
    'addon_require' => [
        'test' => '1.0.0'
    ]
];

插件服务端

根据插件需求添加对应文件

控制器

公共函数文件位置 addons/wechat/controller/admin/User.php

<?php

namespace addons\wechat\controller\admin;

use app\admin\controller\AdminController;
use addons\wechat\service\UserService;
use addons\wechat\validate\UserValidate;
use think\response\Json;

/**
 * 微信粉丝控制器
 */
class User extends AdminController
{
    /**
     * 获取微信粉丝列表
     * @return Json
     * @author tmadmin
     */
    public function lists()
    {
        return $this->data(UserService::getList());
    }

    /**
     * 获取微信粉丝详情
     * @return Json
     * @author tmadmin
     */
    public function detail()
    {
        $params = (new UserValidate())->checkParam('detail');
        $result = UserService::detail($params);
        return $this->data($result);
    }
}

服务类

公共函数文件位置 addons/wechat/service/UserService.php

<?php

namespace addons\wechat\service;

use tmcore\base\BaseService;
use app\common\model\wechat\WxUser;

/**
 * 微信粉丝服务类
 */
class UserService extends BaseService
{
    /**
     * 获取微信粉丝列表
     * @return array
     * @author tmadmin
     */
    public static function getList(): array
    {
        $searchParam = [
            '=' => ['openid', 'is_subscribe', 'subscribe_time'],
            'datetime' => ['create_time']
        ];

        $where = self::getSearchData($searchParam);

        return LocalUser::page($where, self::getPageData(), ['id', 'uid', 'openid', 'nickname', 'avatar', 'tagid_list', 'is_subscribe', 'subscribe_time', 'create_time'], ['id' => 'desc']);
    }

    /**
     * 获取微信粉丝详情
     * @param array $params
     * @return array
     * @author tmadmin
     */
    public static function detail($params): array
    {
        return WxUser::findOrEmpty($params['id'])->toArray();
    }

}

表模型

公共函数文件位置 addons/wechat/model/WxUser.php

<?php

namespace addons\wechat\model;

use tmcore\base\BaseModel;
use tmcore\traits\ModelTrait;

/**
 * 微信粉丝模型
 */
class WxUser extends BaseModel
{
    use ModelTrait;
    
}

验证器

公共函数文件位置 addons/wechat/validate/UserValidate.php

<?php

namespace addons\wechat\validate;

use tmcore\base\BaseValidate;

/**
 * 微信粉丝验证器
 */
class UserValidate extends BaseValidate
{
    /**
     * @var string[]
     */
    protected $rule = [
        'id' => 'require',
    ];

    /**
     * @var string[]
     */
    protected $message = [
        'id.require' => 'id不能为空',
    ];

    /**
     * 微信粉丝详情场景
     * @return UserValidate
     * @author tmadmin
     */
    public function sceneDetail()
    {
        return $this->only(['id']);
    }
}

枚举类

公共函数文件位置 addons/wechat/enum/WechatOaEnum.php

<?php

namespace addons\wechat\enum;

/**
 * 微信公众号枚举类
 */
class WechatOaEnum
{
    /**
     * 关注回复
     */
    const REPLY_TYPE_SUBSCRIBE = 'subscribe';

    /**
     * 默认回复
     */
    const REPLY_TYPE_DEFAULT= 'default';

    /**
     * 关键字回复
     */
    const REPLY_TYPE_KEY = 'key';

    /**
     * 回复类型
     * subscribe - 关注回复
     * default - 默认回复
     * key - 关键字回复
     */
    const REPLY_TYPE = [
        self::REPLY_TYPE_SUBSCRIBE => '关注回复',
        self::REPLY_TYPE_KEY => '关键词回复',
        self::REPLY_TYPE_DEFAULT => '默认回复'
    ];

    /**
     * 消息类型 - 事件
     */
    const MSG_TYPE_EVENT = 'event';

    /**
     * 消息类型 - 文本
     */
    const MSG_TYPE_TEXT = 'text';

    /**
     * 事件类型 - 关注
     */
    const EVENT_SUBSCRIBE = 'subscribe';

    /**
     * @notes 获取类型英文名称
     * @param $type
     * @return string
     */
    public static function getReplyType($type)
    {
        return self::REPLY_TYPE[$type];
    }
}

数据库sql

安装sql文件位置 addons/wechat/sql/install.sql

DROP TABLE IF EXISTS `{{PREFIX}}wechat_file_cate`;
CREATE TABLE `{{PREFIX}}wechat_file_cate` (
    `id` int unsigned NOT NULL AUTO_INCREMENT,
    `pid` int unsigned NOT NULL DEFAULT '0' COMMENT '父级id',
    `type` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '类型: 1=图片, 2=视频, 3=音频',
    `name` varchar(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类名称',
    `create_time` int NOT NULL DEFAULT '0' COMMENT '创建时间',
    `update_time` int NOT NULL DEFAULT '0' COMMENT '更新时间',
    `delete_time` int NOT NULL DEFAULT '0' COMMENT '删除时间',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信文件分类表';

卸载sql文件位置 addons/wechat/sql/uninstall.sql

DROP TABLE IF EXISTS `{{PREFIX}}wechat_file_cate`;

更新sql文件位置 addons/wechat/sql/update.sql

路由文件

路由文件位置 addons/wechat/route.php 或者 addons/wechat/route目录下任意.php文件

<?php

use think\facade\Route;
use app\admin\middleware\LoginMiddleware;
use app\admin\middleware\AuthMiddleware;
use app\admin\middleware\OperationLog;

Route::group('addons/wechat/admin', function () {

    // 粉丝列表
    Route::get('user/lists', 'addons\wechat\controller\admin\User@lists');

})->middleware([
    LoginMiddleware::class,
    AuthMiddleware::class,
    OperationLog::class
]);

插件配置

配置文件位置 addons/wechat/config.php

<?php

return [
    'type' => 1
];

公共函数

公共函数文件位置 addons/wechat/common.php

<?php

if (!function_exists('test_wechat')) {
    function test_wechat($name)
    {
        return $name;
    }
}

加载语言包

加载语言包文件位置 addons/wechat/lang/zh-cn.php

<?php

return [
    'addon %s not found'            => '插件 %s 未找到',
    'addon %s is disabled'          => '插件 %s 已禁用',
    'addon controller %s not found' => '插件控制器 %s 未找到',
    'addon action %s not found'     => '插件控制器方法 %s 未找到',
    'addon can not be empty'        => '插件不能为空',
];

队列

文件位置 addons/wechat/jobs/TestTemplateJob.php

<?php

namespace addons\wechat\jobs;

use tmcore\services\QueueService;
use think\facade\Log;
use tmcore\base\BaseJob;
use tmcore\traits\JobTrait;

/**
 * 测试队列
 */
class TestTemplateJob extends BaseJob
{
    use JobTrait;

    public function doJob($data) {
        try {

            return $this->success();
        } catch (\Exception $e) {
            return $this->error('执行任务失败,' . ' 行号:' . $e->getLine() . '文件:' . $e->getFile() . '错误信息:' . $e->getMessage());
        }
    }

    public function notify($data) {
        try {
            (new QueueService)->addQueueLog($data);
        } catch (\Exception $e) {
            Log::error('执行任务失败,' . ' 行号:' . $e->getLine() . '文件:' . $e->getFile() . '错误信息:' . $e->getMessage());
        }
    }
}

加入队列

addon_job('wechat', 'TestTemplateJob', ['test' => '123']);

事件

事件文件位置 addons/wechat/listener/Test.php

<?php

namespace addons\wechat\listener;

use tmcore\interfaces\ListenerInterface;

/**
 * 测试事件
 */
class Test implements ListenerInterface
{
    public function handle($event): void
    {
        
    }
}

配置文件位置 addons/wechat/event.php

<?php

return [
    'test' => [
        'addons\wechat\listener\Test'
    ]
];

触发事件

addon_event('wechat', 'test', ['test' => '123']);

自定义命令

命令文件位置 addons/wechat/command/Test.php

<?php

namespace addons\wechat\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;

/**
 * 测试命令
 */
class Test extends Command
{
    /**
     * 配置
     */
    protected function configure()
    {
        $this->setName('local:test')
            ->setDescription('测试命令');
    }

    protected function execute(Input $input, Output $output)
    {
        echo 'test' . PHP_EOL;
    }
}

注册文件位置 addons/wechat/command.php

<?php

return [
    "test"=>"addons\wechat\command\Test",
];

调用命令,需要加 插件标识: 前缀

php think wechat:test

插件依赖配置

根据插件具体需求添加依赖配置文件,系统会合并文件到对应的依赖中

服务端composer依赖

文件位置 package/composer.json

{
    "require": {
        "guzzlehttp/guzzle": "^7.0"
    },
    "require-dev": {
        "symfony/var-dumper": "v6.0.19"
    }
}

后台package依赖

文件位置 package/admin_package.json

{
    "dependencies": {
        "echarts": "^5.4.3"
    },
    "devDependencies": {
        "vite": "^4.2.1"
    }
}

pc端package依赖

文件位置 package/pc_package.json

{
    "dependencies": {
        "md-editor-v3": "^5.6.0"
    },
    "devDependencies": {
        "qrcode": "^1.5.4"
    }
}

手机端package依赖

文件位置 package/uniapp_package.json

{
    "dependencies": {
        "postcss": "^8.4.38"
    },
    "devDependencies": {
        "autoprefixer": "^10.4.19"
    }
}

手机端pages页面配置

文件位置 package/uniapp_pages.json

注意:只在更新和卸载时加载。文件会合并到uniapp工程中的src/pages.json中

{
    "pages": [
        {
            "path": "addons/wechat/home/index",
            "style": {
                "navigationBarTitleText": "首页"
            },
            "addon": "wechat"
        }
    ]
}

Released under the Apache-2.0 License.