- 🏠 简介
- 🔌 api接口
-
🔧 插件开发
- 介绍
- 插件优势
- 新建插件
- 技术栈
- 插件开发规范
- 插件目录结构
- model 层开发
- service 层开发
- api 接口开发
- menu 菜单开发
-
event 事件钩子开发
- 开发指南
- 常用事件
- SiteInit 站点初始化事件
- AddSiteAfter 站点创建后事件
- MemberRegister 会员注册后事件
- MemberLogin 会员登录后事件
- PayCreate 支付创建事件
- PaySuccess 支付成功事件
- RefundSuccess 退款成功事件
- TransferSuccess 转账成功事件
- BottomNavigation 底部导航事件
- NoticeData 消息模板数据内容事件
- GetQrcodeOfChannel 创建二维码事件
- ExportDataType 导出数据类型事件
- ExportData 导出数据源事件
- GetPosterType 海报类型事件
- GetPosterData 海报数据事件
- ShowCustomer 应用管理加载事件
- GetWechatTransferTradeScene 微信支付转账场景事件
- ThemeColor 主题风格事件
- initWap 手机端初始化加载事件
- dict 数据字典开发
- layout 自定义布局开发
- job 消息队列和计划任务开发
- notice 消息发送开发
- printer 小票打印模板开发
- export 数据导出开发
- diy 自定义组件/页面装修开发
- diy 自定义表单组件开发
- poster 自定义海报开发
- icon 引入图标
- 支付方式开发
- upgrade 插件版本升级
- 打包插件
- 授权信息变更回调通知
- 官网上架
- 📝 二次开发须知
- 👨💻 二次开发指导
-
🎬 二次开发应用插件视频教程
- 二次开发安装视频教程
- 准备工作与创建插件
- 插件目录整体说明
- 插件admin目录
- 插件app目录说明(adminapi、api、验证器)
- 插件app目录(dict、job)
- 插件app目录说明(lang、listener)
- 插件app目录说明(model、service)
- 插件uniapp目录说明
- 插件开发之后台功能开发(代码生成器)
- 插件开发之uniapp功能开发(api)第一节
- 插件开发之uniapp功能开发(api)第二节
- 插件开发之uniapp功能开发(api)第三节
- 插件安装与打包原理
- 消息队列开发
- 计划任务开发
- DIY组件和自定义页面装修开发
- 支付接口开发
- 插件升级包打包流程以及云编译功能
menu 菜单开发
目录结构
Hello World插件的菜单配置文件位于:niucloud/addon/hello_world/app/dict/menu/
niucloud/addon/hello_world/
└── app/
└── dict/
└── menu/
├── admin.php # 平台端菜单
└── site.php # 站点端菜单

菜单字段说明
示例代码:
<?php
return [
[
'menu_name' => 'Hello World管理',
'menu_key' => 'hello_world',
'menu_short_name' => 'Hello插件',
'parent_key' => '',
'parent_select_key' => '',
'menu_type' => 0,
'icon' => 'iconfont iconyingyongshichang',
'api_url' => '',
'router_path' => '',
'view_path' => '',
'methods' => '',
'sort' => 100,
'status' => 1,
'is_show' => 1,
],
];
菜单配置文件返回一个数组,每个菜单项包含以下字段:
| 字段名 | 说明 | 示例值 |
|---|---|---|
| menu_name | 菜单标题,出现在菜单项上的文字(建议四个字) | 商品管理 |
| menu_key | 菜单唯一标识key,不能重复。添加父子菜单,删除等操作键时使用 | shop_goods |
| menu_short_name | 菜单简写名称(建议2个字说明,特殊情况3个字,例如:微官网) | 商品 |
| parent_key | 父级菜单标识key,根菜单为空 | shop |
| parent_select_key | 父级菜单选中标识key,用于子菜单选中时,父级菜单也会被选中 | |
| menu_type | 菜单类型(0:目录 1:菜单 2:按钮操作) | 0 |
| icon | 菜单的iconfont图标 | iconfont iconshangpinguanli |
| api_url | 接口请求地址,用于权限控制,并非实际调用URL | shop/goods |
| router_path | 浏览器访问路由地址 | shop/goods/list |
| view_path | 前端代码文件路径 | goods/list |
| methods | 请求方法,与api_url 对应,包括get/post/put/delete | get |
| sort | 排序号,排序号越大,越靠前 | 95 |
| status | 状态(1:启用 0:禁用) | 1 |
| is_show | 是否显示(1:显示 0:隐藏) | 1 |
| children | 子菜单数组 | [...] |
定义目录菜单
menu_type = 0 ,表示为目录菜单,不需要设置浏览器访问地址、也没有前端页面。
示例代码:在site.php中定义目录菜单
<?php
return [
[
'menu_name' => 'Hello World管理',
'menu_key' => 'hello_world',
'menu_short_name' => 'Hello插件',
'parent_key' => '',
'parent_select_key' => '',
'menu_type' => '0',
'icon' => 'iconfont iconyingyongshichang',
'api_url' => '',
'router_path' => '',
'view_path' => '',
'methods' => '',
'sort' => '100',
'status' => '1',
'is_show' => '1',
'children' => [
// 子菜单项将在这里定义
]
]
];
定义菜单页面
menu_type = 1,表示为菜单页面,可以在浏览器中打开。必须设置 router_path、view_path。 api_url 建议填写,用于权限控制。
示例:在目录菜单下添加页面菜单
<?php
return [
[
'menu_name' => 'Hello World管理',
'menu_key' => 'hello_world',
'menu_type' => '0',
'icon' => 'iconfont iconyingyongshichang',
'router_path' => '',
'sort' => '100',
'status' => '1',
'is_show' => '1',
'children' => [
[
'menu_name' => '概况',
'menu_key' => 'hello_world_index',
'menu_short_name' => '概况',
'menu_type' => 1,
'icon' => 'iconfont icongaikuang1',
'api_url' => 'hello_world/index',
'router_path' => 'hello_world/index',
'view_path' => 'index/index',
'methods' => 'get',
'sort' => 100,
'status' => 1,
'is_show' => 1
],
[
'menu_name' => '用户管理',
'menu_key' => 'hello_world_user',
'menu_short_name' => '用户',
'menu_type' => '1',
'icon' => 'iconfont iconzhanghu',
'api_url' => 'hello_world/user',
'router_path' => 'hello_world/user/list',
'view_path' => 'user/list',
'methods' => 'get',
'sort' => '100',
'status' => '1',
'is_show' => '1',
'children' => [
// 操作菜单项将在这里定义
]
]
]
]
];
定义功能操作菜单
menu_type = 2,表示定义功能操作菜单。router_path、view_path可以为空,api_url 建议填写,用于权限控制。通常用于定义增删改查等操作按钮,没有固定页面,在体现形式上为弹框、功能操作。例如:添加品牌弹框、删除品牌操作等。
示例:为用户管理添加操作菜单
<?php
return [
[
'menu_name' => 'Hello World管理',
'menu_key' => 'hello_world',
'menu_type' => 0,
'icon' => 'iconfont iconyingyongshichang',
'router_path' => '',
'sort' => 100,
'status' => 1,
'is_show' => 1,
'children' => [
[
'menu_name' => '用户管理',
'menu_key' => 'hello_world_user',
'menu_type' => 1,
'icon' => 'iconfont iconzhanghu',
'api_url' => 'hello_world/user',
'router_path' => 'hello_world/user/list',
'view_path' => 'user/list',
'methods' => 'get',
'sort' => 100,
'status' => 1,
'is_show' => 1,
'children' => [
[
'menu_name' => '添加用户',
'menu_key' => 'hello_world_user_add',
'menu_short_name' => '添加',
'menu_type' => 2,
'icon' => '',
'api_url' => 'hello_world/user',
'router_path' => '',
'view_path' => '',
'methods' => 'post',
'sort' => 0,
'status' => 1,
'is_show' => 0
],
[
'menu_name' => '编辑用户',
'menu_key' => 'hello_world_user_edit',
'menu_short_name' => '编辑',
'menu_type' => 2,
'icon' => '',
'api_url' => 'hello_world/user/<id>',
'router_path' => '',
'view_path' => '',
'methods' => 'put',
'sort' => 0,
'status' => 1,
'is_show' => 0
],
[
'menu_name' => '删除用户',
'menu_key' => 'hello_world_user_delete',
'menu_short_name' => '删除',
'menu_type' => 2,
'icon' => '',
'api_url' => 'hello_world/user/<id>',
'router_path' => '',
'view_path' => '',
'methods' => 'delete',
'sort' => 0,
'status' => 1,
'is_show' => 0
]
]
]
]
]
];
刷新菜单(重要)
每次修改菜单文件后,必须需要刷新菜单才能使更改生效。才能更新到数据表sys_menu中。刷新菜单的方式为:
1.登录平台端
2.点击【开发】->【平台菜单或站点菜单】->【重置菜单】
3.刷新浏览器即可看到效果

根据后端定义的菜单路径找到前端页面开发
菜单定义中的view_path字段对应前端页面文件的路径。以下是查找对应文件的规则:
站点端菜单的前端文件通常位于以下路径:
admin/src/addon/hello_world/views/[view_path].vue
例如,view_path为user/list,对应的文件路径为:
admin/src/addon/hello_world/views/user/list.vue

根据route_path定义的地址,即可看到页面功能

菜单权限设置
平台端,在管理员角色功能中,可以添加/编辑菜单来控制操作权限

站点端,在权限管理—>管理员角色中,可以添加/编辑菜单来控制操作权限

注意事项
框架标准菜单注意事项
平台管理端菜单项 app\dict\menu\admin.php
站点管理端菜单项 app\dict\menu\site.php
niucloud-admin框架首次安装系统时,会自动加载上面的两个菜单字典到数据表sys_menu表中。一定要注意。niucloud-admin框架的设计机制,切记!开发者不允许直接在sys_menu数据表中进行菜单项的操作,而必须在菜单字典中修改编辑。
插件菜单注意事项
插件安装时,框架会自动装载到菜单数据表sys_menu中。
插件安装、卸载时,系统会自动装载、删除菜单,不需要开发者在插件的安装、卸载脚本中对于菜单做相关处理。
插件开发时,有针对于菜单的处理,安装插件后一定要首先在站点套餐中勾选,界面才会生效。常常,我们开发了菜单功能,发现界面没有按照预定的想法变化,就是忽略了上面的步骤。
系统菜单的特殊处理
delete => "member" 针对修改系统菜单处理方式,可以删除系统菜单,设置对应key值,也可删除不需要的菜单处理,这个只是插件菜单的处理方式。用于删除系统菜单(sys_menu表中软删除)。
通过上面的方式,插件中可以针对框架的某个菜单项进行软删除,替换菜单功能为自己的功能。例如,我们开发一个软件,发现框架本身的会员列表不符合要求,我们不应该直接修改框架的会员列表功能,而应该软删除框架自带的会员列表菜单,然后全新开发一套会员列表功能。新建会员列表菜单路由到自己开发的会员列表功能。这样的好处是,框架进行升级时,可以完全兼容升级。