篇(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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...