篇(15)-入門實戰-許可權管理之用戶創建與關聯角色(ViewModel再用與模型驗證一)

来源:https://www.cnblogs.com/mushaobai/archive/2022/11/19/16905833.html
-Advertisement-
Play Games

一 選擇排序 選擇排序的時間複雜度O(n2),額外空間複雜度O(1) public static void SelectionSort(int[] arr) { if (arr == null || arr.Length < 2) { return; } for (int i = 0; i < ar ...


篇(15)-Asp.Net Core入門實戰-許可權管理之用戶創建與關聯角色(ViewModel再用與模型驗證一)

在上個篇章中,講了角色和菜單的關係(也就是給角色賦權),本章講用戶和給用戶分派角色的功能。如果是小白,最好是仔細看我寫的代碼,因為關鍵代碼處都有註解。建議將篇14和篇15閱讀完畢再做演練,為防止單篇過長,我將其分成2篇來講解。

用戶與角色的處理邏輯是:(1).用戶的增刪改查;(2).給用戶選一個所屬角色。

1.用戶管理功能

(1).用戶表(Sql庫)的創建

CREATE TABLE [dbo].[Manager](
[Id] [int] IDENTITY(1,1) NOT NULL,
[RoleId] [int] NOT NULL,
[UserName] [varchar](32) NOT NULL,
[Password] [varchar](128) NOT NULL,
[Avatar] [varchar](256) NULL,
[NickName] [varchar](32) NULL,
[Mobile] [varchar](16) NULL,
[Email] [varchar](128) NULL,
[LoginCount] [int] NULL,
[LoginLastIp] [varchar](64) NULL,
[LoginLastTime] [datetime] NULL,
[AddManagerId] [int] NOT NULL,
[AddTime] [datetime] NOT NULL,
[ModifyManagerId] [int] NULL,
[ModifyTime] [datetime] NULL,
[IsLock] [bit] NOT NULL,
[IsDelete] [bit] NOT NULL,
[Remark] [varchar](128) NULL,
CONSTRAINT [PK_MANAGER] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

 

(2).用戶Model的編寫,這個Model直接與Sql表的結構一致。

public class Manager
{
/// <summary>
/// 主鍵 MaxLength屬性作用於字元串,不能用在int類型上
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 角色ID
/// </summary>
public int RoleId { get; set; }
/// <summary>
/// 用戶名
/// </summary>
[Required]
public String UserName { get; set; }
/// <summary>
/// 密碼
/// </summary>
public String Password { get; set; }
/// <summary>
/// 頭像
/// </summary>
public String Avatar { get; set; }
/// <summary>
/// 用戶昵稱
/// </summary>
public String NickName { get; set; }
/// <summary>
/// 手機號碼
/// </summary>
public String Mobile { get; set; }
/// <summary>
/// 郵箱地址
/// </summary>
public String Email { get; set; }
/// <summary>
/// 登錄次數
/// </summary>
public int? LoginCount { get; set; }
/// <summary>
/// 最後一次登錄IP
/// </summary>
public String LoginLastIp { get; set; }
/// <summary>
/// 最後一次登錄時間
/// </summary>
public DateTime? LoginLastTime { get; set; }
/// <summary>
/// 添加人
/// </summary>
[Required]
public int AddManagerId { get; set; }
/// <summary>
/// 添加時間
/// </summary>
[Required]
public DateTime AddTime { get; set; }
/// <summary>
/// 修改人
/// </summary>
public int? ModifyManagerId { get; set; }
/// <summary>
/// 修改時間
/// </summary>
[MaxLength(23)]
public DateTime? ModifyTime { get; set; }
/// <summary>
/// 是否鎖定
/// </summary>
[Required]
public Boolean IsLock { get; set; }
/// <summary>
/// 是否刪除
/// </summary>
[Required]
public Boolean IsDelete { get; set; }
/// <summary>
/// 備註
/// </summary>
public String Remark { get; set; }
}

 

(3).用戶View部分的編寫

(3.1)視圖View部分包括用戶的增、刪、改、查功能,還有對應的修改用戶角色,修改用戶密碼。

(3.2)Create視圖代碼如下

@{ ViewData["Title"] = "新建用戶"; }
@model RegisterManagerView
@section Scripts{
<script type="text/javascript" src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script type="text/javascript" src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
<form action="/Manager/Create" method="post">
@Html.AntiForgeryToken()
<div>
<label asp-for="UserName">用戶名</label>
<div>
<input type="text" asp-for="UserName" name="UserName" placeholder="用戶名">
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Password">密碼</label>
<div>
<input type="password" asp-for="Password" name="Password" placeholder="密碼" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="ConfirmPassword">確認密碼</label>
<div>
<input type="password" asp-for="ConfirmPassword" name="ConfirmPassword" placeholder="確認密碼" />
<span asp-validation-for="ConfirmPassword" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Mobile">手機號</label>
<div>
<input type="text" asp-for="Mobile" name="Mobile" placeholder="手機號">
<span asp-validation-for="Mobile" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Email">Email</label>
<div>
<input type="text" asp-for="Email" name="Email" placeholder="郵箱">
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Remark">介紹</label>
<div>
<textarea name="Remark" asp-for="Remark" placeholder="相關介紹"></textarea>
</div>
</div>
<div>
<div>
<button type="submit">確定</button>
<button type="reset">重置</button>
</div>
</div>
</form>

 

(3.3)Edit視圖代碼如下

@{ ViewData["Title"] = "編輯用戶"; }
@model EditManagerView
@section Scripts{
<script type="text/javascript" src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script type="text/javascript" src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
<form action="/Manager/Edit" method="post">
@Html.AntiForgeryToken()
<div>
<label asp-for="UserName">用戶名</label>
<div>
<input type="text" asp-for="UserName" name="UserName" placeholder="用戶名">
<span asp-validation-for="UserName" class="text-danger"></span>
<input type="hidden" asp-for="Id" />
</div>
</div>
<div>
<label asp-for="Mobile">手機號</label>
<div>
<input type="text" asp-for="Mobile" name="Mobile" placeholder="手機號">
<span asp-validation-for="Mobile" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Email">Email</label>
<div>
<input type="text" asp-for="Email" name="Email" placeholder="郵箱">
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Remark">介紹</label>
<div>
<textarea name="Remark" asp-for="Remark" placeholder="相關介紹"></textarea>
</div>
</div>
<div>
<div>
<button type="submit">確定</button>
<button type="reset">重置</button>
</div>
</div>
</form>

 

(3.4)Index視圖代碼如下(列表頁)

@using Humanizer;
@using RjWebCms.Db;
@model PaginatedList<PageManager>
@{
ViewData["Title"] = "用戶列表";
}
@section Scripts{
<script src="~/js/jquery-3.6.1.min.js"></script>
<script type="text/javascript">
function DelAll() {
var ids = document.getElementsByName("#chk_ids");
var arrIds = "";
var n = 0;
for (var i = 0; i < ids.length; i++) {
if (ids[i].checked == true) {
arrIds += ids[i].value + ",";
n++;
}
}
if (n == 0) {
alert("請選擇要刪除的信息");
return;
}

arrIds = arrids.substr(0, arrIds.length - 1);
//
if (confirm("確定要全部刪除選擇用戶嗎")) {
$.ajax({
type: "post",
url: "/Manager/DeleteAll",
data: { ids: arrIds },
success: function (data, state) {
alert('刪除成功!');
window.location.href = "";
},

error: function (data, state) {
alert('刪除失敗');
}
});
}
}
</script>
}
<div class="panel panel-default todo-panel">
@Html.AntiForgeryToken()
<form asp-action="Index" method="get">
<table>
<tr><td><a asp-controller="Manager" asp-action="Create">添加</a></td></tr>
<tr>
<td>查詢關鍵詞:<input type="text" name="SearchString" value="@ViewData["CurrentFilter"]" /></td>
<td><input type="submit" value="查詢" /></td>
<td><a asp-action="Index">Back</a></td>
<td
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 🏵️前言 👉以下我要講解的是Python中最後剩餘的重要內置函數,其中比較重要的會詳細講解,比較簡單的會直接結合代碼進行剖析 ​編輯 🍁一、reversed內置函數 描述 reversed 函數返回一個反轉的迭代器。 語法 reversed(seq) 參數 seq -- 要轉換的序列,可以是 ...
  • 一、棧和局部變數操作 將常量壓入棧的指令 aconst_null 將null對象引用壓入棧 iconst_m1 將int類型常量-1壓入棧 iconst_0 將int類型常量0壓入棧 iconst_1 將int類型常量1壓入棧 iconst_2 將int類型常量2壓入棧 iconst_3 將int類 ...
  • 💓前言 ✅承接上篇博客,以下我要講解的是Python中剩餘的重要內置函數,其中比較重要的會詳細講解,比較簡單的會直接結合代碼進行剖析 🍀一、exec和eval內置函數 ☘️1、exec內置函數 python內置函數exec支持動態執行python代碼,傳入exec函數的object實參可以是字元 ...
  • 1.while迴圈 """ while 條件: 執行語句1··· 執行語句2·· """ # while 1+1 == 2: # print('666') # 計數器 叫法 代表一個功能 # i = 0 # 定義一個臨時變數 記錄迴圈次數 # while 1 + 1 == 2: # i += 1 # ...
  • Redis 常見問題 落葉他鄉樹,寒燈獨夜人。 一、 什麼是Redis? Redis 是一個使用 C 語言寫成的,開源的高性能key-value非關係緩存資料庫; Redis的數據都基於緩存的,所以很快,每秒可以處理超過 10萬次讀寫操作; Redis也可以實現數據寫入磁碟中,保證了數據的安全不丟失 ...
  • 目錄 一.OpenGL 和 OpenGL ES 1.OpenGL 2.OpenGL ES 二.EGL 和 WGL 三.OpenGL ES EGL API 簡介 四.OpenGL ES 案例 五.依賴動態庫 六.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> ...
  • 給女友的微信公眾號消息推送 跟上次的大致相同、新增了每日新聞、國外天氣,修改了一部分代碼 一、註冊易客雲 地址:http://www.yiketianqi.com/user/register 複製下麵的代碼到百度雲函數代碼編輯頁 <?php $appId = '2323232'; //對應自己的ap ...
  • 代碼生成器(CodeBuilder) 經過這幾個版本的完善,目前功能也趨於穩定,詳細的線上文檔也得到維護,不失為一款強大的代碼生成工具。 官網:http://www.fireasy.cn/codebuilder ==版本維護== Version 2.9.41、解決擴展文件編輯與編譯有問題;2、提升應 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...