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方法

 

 

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都已经为我们准备好了。有了以上对象我们可以方便自定义任何菜单。