0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有 1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端 2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計 3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過 ...
0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有
1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端
2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計
3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過EntityFramework Core使用PostgreSQL
0 功能設計
實現一個最簡單最基本的許可權管理系統,主要包括組織機構管理、角色管理、用戶管理、功能管理、角色授權。
1 功能管理包括功能菜單、功能頁面按鈕兩個層次。
2 功能授權針對角色進行。
3 每個用戶可以擁有多個角色,用戶的實際許可權根據多角色求取並集得到。
0.0 組織機構管理
實現組織機構(或者叫部門)的相關管理操作,組織機構主要包括部門名稱、部門編碼、部門負責人、聯繫電話、備註、上級部門、創建人、創建電話等屬性。
組織機構管理包括新增頂級、新增(新增當前選中部門的下級)、編輯、刪除等功能。
考慮到組織機構、用戶等許可權管理相關的基本實體經常會在業務數據中使用,比如要記錄業務數據的部門、創建人等信息(以外鍵形式記錄DepartmentId、UserId等),為避免組織機構、用戶等信息刪除後,業務數據出現找不到相關聯的對應實體,即為了保證數據的完整性,對許可權管理設計到的實體統一做軟刪除(採用一個刪除標記的邏輯刪除,非物理刪除)處理。
0.1 功能管理
系統功能的統一維護,這裡進行深一級的控制,管理到各個功能界面業務邏輯操作按鈕的級別,以樹形格式展示,其中以一個標記屬性標識該實體是一個導航菜單,還是菜單下包含的一個操作按鈕。以上述組織機構管理為例,功能管理中存在一個名稱為組織機構管理的項,其下包括新增組織機構、新增頂級組織機構、編輯組織機構、刪除組織機構等子級。
功能管理實體主要包含父級、序號、名稱、編碼、地址、類型(導航菜單、功能按鈕)、圖標、備註等屬性。
功能管理主要包括,新增頂級、新增、編輯、刪除等功能。
0.2 角色管理
角色是一組具有相同功能用戶的一個抽象,許可權管理系統將具體功能的授權賦予角色,實現針對角色的許可權管理。
角色實體主要包括角色編碼、角色名稱、創建人、創建時間、備註等屬性。
角色管理主要包括新增角色、編輯角色、刪除角色、角色授權等功能。
角色授權是為當前選中的角色授予功能導航菜單及功能頁面按鈕的相關許可權的操作。用戶登錄後,會根據當前用戶獲取所屬角色,然後取該用戶所有角色的功能並集,確定功能菜單及相關功能界面按鈕的是否可用狀態。
0.3 用戶管理
用戶實體主要包括用戶名、密碼、用戶姓名、郵箱、手機、備註、創建人、創建時間、上次登錄時間、登錄次數、所屬部門等屬性。
用戶管理主要包括新增用戶、編輯用戶、刪除用戶、重置密碼等功能。
新增及編輯用戶時,需要首先選擇用戶所屬部門,同時必須為當前用戶分配對應的角色。
1 實體設計
根據上述功能設計,對實體類進行如下設計。對所有實體建立一個泛型基類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> { }
1.0 組織機構實體
/// <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; } }
1.1 功能實體
/// <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; }
}
1.2 角色實體
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; } }
1.3 用戶實體
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; }
}
2 總結
本次主要針對一個最簡單的許可權管理系統進行了功能及實體的設計,項目中新增了相關實體類文件,目前解決方案結構如下下所示:
接下來會介紹如何在Asp.Net Core中通過EntityFramework Core使用PostgreSQL資料庫。