插件类
文件位置 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"
}
]
}