🍔 插件菜单配置
ThinkAdmin 提供完善的插件菜单配置机制,支持自动生成菜单数据,简化插件集成流程。
🚀 主要功能
- 自动生成: 插件能够通过配置自动生成菜单数据
- 标准定义: 提供标准的菜单定义方式
- 无缝集成: 菜单数据自动集成到系统菜单体系
- 权限控制: 支持菜单项的权限控制
- 灵活配置: 支持自定义菜单显示方式和属性
- 统一管理: 通过插件中心统一管理所有插件菜单
📋 菜单类型
全局菜单
- 存储方式: 写入
system_menu
数据表 - 管理工具: 使用
Phinx
数据库迁移工具 - 灵活管理: 可以方便地创建、修改或删除菜单结构
- 数据持久: 菜单数据持久化存储
插件专属菜单
- 显示位置: 插件专属空间左侧菜单
- 动态生成: 由插件服务注册类动态生成
- 功能模块: 清晰反映插件的功能模块
- 返回入口: 提供返回插件中心的入口
⚙️ 配置方式
Service 类配置
- 方法实现: 在 Service 类中实现
menu
方法 - 配置返回: 返回包含菜单项信息的数组或对象
- 结构描述: 描述插件的菜单结构、权限要求等
- 自动调用: 插件安装时系统自动调用
菜单配置选项
- 显示方式: 自定义菜单项的显示方式
- 权限控制: 设置菜单项的权限要求
- 业务需求: 适应不同的应用场景和业务需求
- 灵活扩展: 支持菜单配置的灵活扩展
菜单分为两种类型
为了提高插件的集成性和易用性,系统优化了全局菜单的写入方式,并改进了插件专属空间的菜单管理。
首先,系统实现了全局菜单的数据库写入功能。通过将菜单数据写入 system_menu
数据表,我们可以更加灵活地管理整个应用的菜单结构。为了实现这一功能,我们借助了强大的数据库迁移工具 Phinx
。通过 Phinx
我们可以方便地创建、修改或删除数据表结构,确保菜单数据的正确存储和访问。 其次,系统改进了插件专属空间的菜单管理。当通过插件中心进入插件专属空间时,左侧将展示当前插件的专属菜单。这些菜单项将清晰地反映出插件的功能模块,并提供返回插件中心的入口。为了实现这一功能,我们要求开发者在插件服务注册类中定义菜单。通过这种方式,插件能够动态地生成和管理自己的菜单项,无需手动修改配置文件或数据表。
插件中心统一入口
在安装 插件中心 后,系统进一步提升了插件管理的便捷性和统一性。用户可以通过插件中心的统一入口,直接访问各个应用插件的独立管理菜单。 具体来说,每个应用插件的 Service
类中定义的 menu
方法,负责生成该插件的专属管理菜单。当插件中心被安装并启用后,它会自动扫描并集成所有已安装插件的管理菜单。这样,用户只需通过插件中心的统一入口,即可一站式地管理和操作所有插件。
这一优化不仅简化了插件管理的流程,还提高了管理的效率。用户无需在不同的地方查找和访问各个插件的管理界面,只需在插件中心即可完成所有操作。同时,由于菜单是由插件自身定义的,因此可以确保菜单的准确性和完整性,避免了因手动配置而可能产生的错误。
写入全局菜单数据
在数据库脚本的执行过程中,系统引入了自动写入菜单数据的机制。具体而言,通过调用应用插件 Service
中的 menu
方法,我们可以获取到插件的菜单配置信息。利用 think\admin\extend\PhinxExtend::write2menu()
方法,我们将这些配置信息自动写入到 system_menu
数据表中,从而实现了菜单的自动生成。
温馨提示: 当卸载应用插件时,并不会自动删除与之相关的菜单项。这可能导致在卸载插件后,系统中仍然残留有无效或不再需要的菜单项,需要管理员手动去系统菜单管理界面进行删除操作。
📝 菜单配置案例
Service 类菜单定义
<?php
namespace plugin\wechat\service;
use think\admin\Service;
class WechatService extends Service
{
/**
* 定义插件菜单
* @return array
*/
public function menu()
{
return [
[
'name' => '微信管理',
'subs' => [
['name' => '公众号配置', 'node' => 'plugin-wechat/config/index'],
['name' => '菜单管理', 'node' => 'plugin-wechat/menu/index'],
['name' => '素材管理', 'node' => 'plugin-wechat/material/index'],
['name' => '用户管理', 'node' => 'plugin-wechat/fans/index'],
['name' => '消息管理', 'node' => 'plugin-wechat/keys/index'],
]
],
[
'name' => '小程序管理',
'subs' => [
['name' => '小程序配置', 'node' => 'plugin-wechat/mini/index'],
['name' => '代码管理', 'node' => 'plugin-wechat/mini/code'],
]
]
];
}
}
数据库迁移脚本
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use think\admin\extend\PhinxExtend;
class InstallWechatData extends Migrator
{
/**
* 安装微信插件数据
*/
public function up()
{
// 写入菜单数据
PhinxExtend::write2menu([
'name' => '微信管理',
'subs' => [
['name' => '公众号配置', 'node' => 'plugin-wechat/config/index'],
['name' => '菜单管理', 'node' => 'plugin-wechat/menu/index'],
['name' => '素材管理', 'node' => 'plugin-wechat/material/index'],
['name' => '用户管理', 'node' => 'plugin-wechat/fans/index'],
['name' => '消息管理', 'node' => 'plugin-wechat/keys/index'],
]
]);
}
/**
* 卸载微信插件数据
*/
public function down()
{
// 删除菜单数据
PhinxExtend::remove2menu('plugin-wechat');
}
}
菜单配置参数说明
参数 | 类型 | 说明 | 示例 |
---|---|---|---|
name | string | 菜单名称 | '微信管理' |
node | string | 权限节点 | 'plugin-wechat/config/index' |
icon | string | 菜单图标 | 'layui-icon-wechat' |
subs | array | 子菜单 | 子菜单数组 |
sort | int | 排序权重 | 100 |
status | int | 状态 | 1 |
参考链接
- Service 类菜单定义:think-plugs-wechat Service.php
- 数据库迁移脚本:install_wechat_data.php