0 Asp.Net Core 項目實戰之權限管理系統(0) 無中生有html
1 Asp.Net Core 項目實戰之權限管理系統(1) 使用AdminLTE搭建前端前端
2 Asp.Net Core 項目實戰之權限管理系統(2) 功能及實體設計git
3 Asp.Net Core 項目實戰之權限管理系統(3) 經過EntityFramework Core使用PostgreSQLgithub
4 Asp.Net Core 項目實戰之權限管理系統(4) 依賴注入、倉儲、服務的多項目分層實現數據庫
5 Asp.Net Core 項目實戰之權限管理系統(5) 用戶登陸ui
6 Asp.Net Core 項目實戰之權限管理系統(6) 功能管理編碼
7 Asp.Net Core 項目實戰之權限管理系統(7) 組織機構、角色、用戶權限spa
8 Asp.Net Core 項目實戰之權限管理系統(8) 功能菜單的動態加載設計
github源碼地址code
實現一個最簡單最基本的權限管理系統,主要包括組織機構管理、角色管理、用戶管理、功能管理、角色受權。
1 功能管理包括功能菜單、功能頁面按鈕兩個層次。
2 功能受權針對角色進行。
3 每一個用戶能夠擁有多個角色,用戶的實際權限根據多角色求取並集獲得。
實現組織機構(或者叫部門)的相關管理操做,組織機構主要包括部門名稱、部門編碼、部門負責人、聯繫電話、備註、上級部門、建立人、建立電話等屬性。
組織機構管理包括新增頂級、新增(新增當前選中部門的下級)、編輯、刪除等功能。
考慮到組織機構、用戶等權限管理相關的基本實體常常會在業務數據中使用,好比要記錄業務數據的部門、建立人等信息(之外鍵形式記錄DepartmentId、UserId等),爲避免組織機構、用戶等信息刪除後,業務數據出現找不到相關聯的對應實體,即爲了保證數據的完整性,對權限管理設計到的實體統一作軟刪除(採用一個刪除標記的邏輯刪除,非物理刪除)處理。
系統功能的統一維護,這裏進行深一級的控制,管理到各個功能界面業務邏輯操做按鈕的級別,以樹形格式展現,其中以一個標記屬性標識該實體是一個導航菜單,仍是菜單下包含的一個操做按鈕。以上述組織機構管理爲例,功能管理中存在一個名稱爲組織機構管理的項,其下包括新增組織機構、新增頂級組織機構、編輯組織機構、刪除組織機構等子級。
功能管理實體主要包含父級、序號、名稱、編碼、地址、類型(導航菜單、功能按鈕)、圖標、備註等屬性。
功能管理主要包括,新增頂級、新增、編輯、刪除等功能。
角色是一組具備相同功能用戶的一個抽象,權限管理系統將具體功能的受權賦予角色,實現針對角色的權限管理。
角色實體主要包括角色編碼、角色名稱、建立人、建立時間、備註等屬性。
角色管理主要包括新增角色、編輯角色、刪除角色、角色受權等功能。
角色受權是爲當前選中的角色授予功能導航菜單及功能頁面按鈕的相關權限的操做。用戶登陸後,會根據當前用戶獲取所屬角色,而後取該用戶全部角色的功能並集,肯定功能菜單及相關功能界面按鈕的是否可用狀態。
用戶實體主要包括用戶名、密碼、用戶姓名、郵箱、手機、備註、建立人、建立時間、上次登陸時間、登陸次數、所屬部門等屬性。
用戶管理主要包括新增用戶、編輯用戶、刪除用戶、重置密碼等功能。
新增及編輯用戶時,須要首先選擇用戶所屬部門,同時必須爲當前用戶分配對應的角色。
根據上述功能設計,對實體類進行以下設計。對全部實體創建一個泛型基類Entity<TPrimaryKey>,默認的主鍵類型爲Guid的實體基類Entity,權限管理系統的全部實體都從Entity基類繼承,若是想要實現其餘類型主鍵,新建的實體從Entity<TPrimaryKey>泛型基類繼承便可。
/// <summary> /// 泛型實體基類 /// </summary> /// <typeparam name="TPrimaryKey">主鍵類型</typeparam> public abstract class Entity<TPrimaryKey> { /// <summary> /// 主鍵 /// </summary> public virtual TPrimaryKey Id { get; set; } } /// <summary> /// 定義默認主鍵類型爲Guid的實體基類 /// </summary> public abstract class Entity : Entity<Guid> { }
/// <summary> /// 部門實體 /// </summary> public class Department : Entity { /// <summary> /// 部門名稱 /// </summary> public string Name { get; set; } /// <summary> /// 部門編號 /// </summary> public string Code { get; set; } /// <summary> /// 部門負責人 /// </summary> public string Manager { get; set; } /// <summary> /// 聯繫電話 /// </summary> public string ContactNumber { get; set; } /// <summary> /// 備註 /// </summary> public string Remarks { get; set; } /// <summary> /// 父級部門ID /// </summary> public Guid ParentId { get; set; } /// <summary> /// 建立人 /// </summary> public Guid CreateUserId { get; set; } /// <summary> /// 建立時間 /// </summary> public DateTime? CreateTime { get; set; } /// <summary> /// 是否已刪除 /// </summary> public int IsDeleted { get; set; } /// <summary> /// 包含用戶 /// </summary> public virtual ICollection<User> Users { get; set; } /// <summary> /// 建立人信息 /// </summary> public virtual User CreateUser { get; set; } }
/// <summary> /// 功能菜單實體 /// </summary> public class Menu : Entity { /// <summary> /// 父級ID /// </summary> public Guid ParentId { get; set; } /// <summary> /// 序號 /// </summary> public int SerialNumber { get; set; } /// <summary> /// 菜單名稱 /// </summary> public string Name { get; set; } /// <summary> /// 菜單編碼 /// </summary> public string Code { get; set; } /// <summary> /// 菜單地址 /// </summary> public string Url { get; set; } /// <summary> /// 類型:0導航菜單;1操做按鈕。 /// </summary> public int Type { get; set; } /// <summary> /// 菜單圖標 /// </summary> public string Icon { get; set; } /// <summary> /// 菜單備註 /// </summary> public string Remarks { get; set; }
}
public class Role : Entity { public string Code { get; set; } public string Name { get; set; } public Guid CreateUserId { get; set; } public DateTime? CreateTime { get; set; } public string Remarks { get; set; } public virtual User CreateUser { get; set; } public virtual ICollection<User> Users { get; set; } public virtual ICollection<Menu> Menus { get; set; } }
public class User : Entity { /// <summary> /// 用戶名 /// </summary> public string UserName { get; set; } /// <summary> /// 密碼 /// </summary> public string Password { get; set; } /// <summary> /// 用戶姓名 /// </summary> public string Name { get; set; } /// <summary> /// 郵箱地址 /// </summary> public string EMail { get; set; } /// <summary> /// 手機號 /// </summary> public string MobileNumber { get; set; } /// <summary> /// 備註 /// </summary> public string Remarks { get; set; } /// <summary> /// 建立人 /// </summary> public Guid CreateUserId { get; set; } /// <summary> /// 建立時間 /// </summary> public DateTime? CreateTime { get; set; } /// <summary> /// 上次登陸時間 /// </summary> public DateTime LastLoginTime { get; set; } /// <summary> /// 登陸次數 /// </summary> public int LoginTimes { get; set; } /// <summary> /// 部門ID /// </summary> public Guid DeptmentId { get; set; } /// <summary> /// 是否已刪除 /// </summary> public int IsDeleted { get; set; } /// <summary> /// 所屬部門實體 /// </summary> public virtual Department Department { get; set; } /// <summary> /// 建立人實體 /// </summary> public virtual User CreateUser { get; set; } /// <summary> /// 角色集合 /// </summary> public virtual ICollection<Role> Roles { get; set; }
}
本次主要針對一個最簡單的權限管理系統進行了功能及實體的設計,項目中新增了相關實體類文件,目前解決方案結構以下下所示:
接下來會介紹如何在Asp.Net Core中經過EntityFramework Core使用PostgreSQL數據庫。