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表中软删除)。
通过上面的方式,插件中可以针对框架的某个菜单项进行软删除,替换菜单功能为自己的功能。例如,我们开发一个软件,发现框架本身的会员列表不符合要求,我们不应该直接修改框架的会员列表功能,而应该软删除框架自带的会员列表菜单,然后全新开发一套会员列表功能。新建会员列表菜单路由到自己开发的会员列表功能。这样的好处是,框架进行升级时,可以完全兼容升级。
