欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

abp(net core)+easyui+efcore实现仓储管理系统——菜单 (十六)

程序员文章站 2022-05-03 13:55:52
在前面的文章(abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之菜单与测试(九) )中我们学会了如何添加静态菜单,但是做为一个信息管理系统,总不能每次有新功能新菜单,都静态添加菜单,编译,再上线。我们希望的是有一个菜单管理界面,在此页面中输入相应的菜单,只... ......

abp(net core)+easyui+efcore实现仓储管理系统目录

abp(net core)+easyui+efcore实现仓储管理系统——abp总体介绍(一)

abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二)

abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)

 abp(net core)+easyui+efcore实现仓储管理系统——定义仓储并实现 (四)

abp(net core)+easyui+efcore实现仓储管理系统——创建应用服务(五)

abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之控制器(六)

abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之列表视图(七)

abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之增删改视图(八)

abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之菜单与测试(九)

abp(net core)+easyui+efcore实现仓储管理系统——多语言(十)

abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十一)

 abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十二)

 abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十三)

abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十四)

 abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十五)

 

 

      在前面的文章()中我们学会了如何添加静态菜单,但是做为一个信息管理系统,总不能每次有新功能新菜单,都静态添加菜单,编译,再上线。我们希望的是有一个菜单管理界面,在此页面中输入相应的菜单,只要我们重新登录,菜单就自动显示在菜单栏中。而菜单的来源可以是多样的,可以从需要从数据库,xml等数据源中加载一些动态菜单来满足我们的系统要求。

今天我们就来实现这个功能,动态加载菜单。所要加载的菜单就是模块管理中的功能模块。

一、菜单项类

       一个应用程序可能包含不同的模块,而每个模块都可能有它自己的菜单项。在abp中,需要创建一个派生自navigationprovider的类来定义一个菜单项。例如我们这个项目中的tplmsnavigationprovider类。代码如下。

 

using abp.application.navigation;
using abp.localization;
using abp.tplms.authorization;
 

namespace abp.tplms.web.startup
{
    /// <summary>
    /// this class defines menus for the application.
    /// </summary>
    public class tplmsnavigationprovider : navigationprovider
    {
        public override void setnavigation(inavigationprovidercontext context)
        {
               context.manager.mainmenu
                .additem(
                    new menuitemdefinition(
                        pagenames.home,
                        l("homepage"),
                        url: "",
                        icon: "home",
                        requiresauthentication: true
                    )

                ).additem(
                    new menuitemdefinition(
                        pagenames.tenants,
                        l("tenants"),
                        url: "tenants",
                        icon: "business",
                        requiredpermissionname: permissionnames.pages_tenants
                    )
                ).additem(
                    new menuitemdefinition(
                        pagenames.users,
                        l("users"),
                        url: "users",
                        icon: "people",
                        requiredpermissionname: permissionnames.pages_users
                    )
                ).additem(
                    new menuitemdefinition(
                        pagenames.roles,
                        l("roles"),
                        url: "roles",
                        icon: "local_offer",
                        requiredpermissionname: permissionnames.pages_roles
                    )
                )

                .additem(
                    new menuitemdefinition(
                        pagenames.module,
                        l("module"),
                        url: "module",
                        icon: "local_offer"
                    )
                )

                 .additem(
                    new menuitemdefinition(
                        pagenames.supplier,
                        l("supplier"),
                        url: "supplier",
                        icon: "people"
                    )
                )  
                .additem(
                    new menuitemdefinition(
                        pagenames.about,
                        l("about"),
                        url: "about",
                        icon: "info"
                    )

                ).additem( // menu items below is just for demonstration!

                    new menuitemdefinition(
                        "multilevelmenu",
                        l("multilevelmenu"),
                        icon: "menu"
                    ).additem(
                        new menuitemdefinition(
                            "aspnetboilerplate",
                            new fixedlocalizablestring("asp.net boilerplate")
                        ).additem(
                        new menuitemdefinition(
                            "aspnetzero",
                            new fixedlocalizablestring("asp.net zero")
                        ).additem(
                            new menuitemdefinition(
                                "aspnetzerohome",
                                new fixedlocalizablestring("home"),
                                url: "https://aspnetzero.com?ref=abptmpl"
                            )
                        ).additem(
                            new menuitemdefinition(
                                "aspnetzerodocuments",
                                new fixedlocalizablestring("documents"),
                                url: "https://aspnetzero.com/documents?ref=abptmpl"
                            )
                        )
                    )
                );
        } 

        private static ilocalizablestring l(string name)
        {
            return new localizablestring(name, tplmsconsts.localizationsourcename);
        }
    }
}

 

二、abp菜单类

      abp框架中已经为我们做了前期的准备工作。在abp中有一个menudefinition类,这个类封装了导航栏上的主菜单的属性。

     menudefinition:主菜单类,定义了一个list<menuitemdefinition>,这个类存放了我们定义的菜单,同时定义了additem方法

abp(net core)+easyui+efcore实现仓储管理系统——菜单 (十六) 

 

using system.collections.generic;
using abp.localization;
 

namespace abp.application.navigation
{

    //     represents a navigation menu for an application.
    public class menudefinition : ihasmenuitemdefinitions
    {
        //
        //  构造函数
        //   

        public menudefinition(string name, ilocalizablestring displayname, object customdata = null); 

        //
        //菜单名称
        //
        public string name { get; }

        //
        //表示本地化字符串
        // 
        public ilocalizablestring displayname { get; set; }

        //
        //自定义数据
        //
        public object customdata { get; set; }

        //     菜单集合
        public list<menuitemdefinition> items { get; set; }
 

         //     添加菜单
        // 
        public menudefinition additem(menuitemdefinition menuitem);

        //
        //     删除菜单
        //      

        public void removeitem(string name);
    }

}

 

      在abp中还有一个menuitemdefinition类,这个类中封装了子菜单的属性,子菜单可以添加其他子菜单构成一个菜单树。我们首先来了解一下menuitemdefinition类的属性与方法。menuitemdefinition成员定义如下:        

 public class menuitemdefinition : ihasmenuitemdefinitions
    {     

        //
        //   构造函数:
        public menuitemdefinition(string name, ilocalizablestring displayname, string icon = null, string url = null, 

bool requiresauthentication = false, string requiredpermissionname = null, int order = 0, object customdata = null,
ifeaturedependency featuredependency = null, string target = null, bool isenabled = true, bool isvisible = true,
ipermissiondependency permissiondependency = null); // // 摘要: // can be used to enable/disable a menu item. public bool isenabled { get; set; } // 自定义数据 public object customdata { get; set; } // // 摘要: // target of the menu item. can be "_blank", "_self", "_parent", "_top" or a frame // name. public string target { get; set; } // 是否有子菜单 public bool isleaf { get; } // 权限验证如果通过验证显示此菜单否则不可见 //即只有登陆后才会显示该菜单 public bool requiresauthentication { get; set; } // 功能特性 public ifeaturedependency featuredependency { get; set; } // // 摘要: // a permission dependency. only users that can satisfy this permission dependency // can see this menu item. optional. public ipermissiondependency permissiondependency { get; set; } //即用户具有指定的权限时才显示菜单 // 权限名称 [obsolete("use permissiondependency instead.")] public string requiredpermissionname { get; set; } // the url to navigate when this menu item is selected. public string url { get; set; } // 菜单图标 public string icon { get; set; } // 排序 public int order { get; set; } // 表示本地化字符串 public ilocalizablestring displayname { get; set; } // 菜单名称 public string name { get; } // 是否显示菜单 public bool isvisible { get; set; } // 子菜单 public virtual list<menuitemdefinition> items { get; } // 添加子菜单 public menuitemdefinition additem(menuitemdefinition menuitem); // 删除菜单: public void removeitem(string name); } }

      从上面的代码中,我们可以看到做为一个菜单树的相关属性与相关方法,abp都已经为我们准备好了。有了以上对象我们可以方便自定义任何菜单。