abp(net core)+easyui+efcore實現倉儲管理系統——菜單-上 (十六)

  • 2019 年 10 月 3 日
  • 筆記

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 (十五)

 

 

      在前面的文章(abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之菜單與測試(九) )中我們學會了如何添加靜態菜單,但是做為一個資訊管理系統,總不能每次有新功能新菜單,都靜態添加菜單,編譯,再上線。我們希望的是有一個菜單管理介面,在此頁面中輸入相應的菜單,只要我們重新登錄,菜單就自動顯示在菜單欄中。而菜單的來源可以是多樣的,可以從需要從資料庫,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都已經為我們準備好了。有了以上對象我們可以方便自定義任何菜單。