Skip to content

menu 菜单开发

目录结构

Hello World插件的菜单配置文件位于:niucloud/addon/hello_world/app/dict/menu/

plaintext
niucloud/addon/hello_world/
└── app/
    └── dict/
        └── menu/
            ├── admin.php     # 平台端菜单
            └── site.php      # 站点端菜单

菜单字段说明

示例代码:

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接口请求地址,用于权限控制,并非实际调用URLshop/goods
router_path浏览器访问路由地址shop/goods/list
view_path前端代码文件路径goods/list
methods请求方法,与api_url 对应,包括get/post/put/deleteget
sort排序号,排序号越大,越靠前95
status状态(1:启用 0:禁用)1
is_show是否显示(1:显示 0:隐藏)1
children子菜单数组[...]

定义目录菜单

menu_type = 0 ,表示为目录菜单,不需要设置浏览器访问地址、也没有前端页面。

示例代码:在site.php中定义目录菜单

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
<?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
<?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_pathuser/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表中软删除)。

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

基于 MIT 协议发布