篇(15)-Asp.Net Core入門實戰-許可權管理之用戶創建與關聯角色(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
更多相關文章
  • 在JSP頁面實現驗證碼校驗文章中當時是使用的Servlet類來進行的驗證碼校驗,但是這種方式並不能即時校驗,在正常情況下都是直接在用戶輸入之後就進行校驗,這樣對用戶來說很方便的。 AJAX 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML) ...
  • 抽象類:可以作為頂層基類,從高層次規範編程介面 1、在abc模塊中,最常見的抽象類有Iterable,我們可以用他判斷一個對象是不是可迭代對象 1 from collections.abc import Iterable 2 3 4 class Valley: 5 6 def __iter__(se ...
  • 流程式控制制主要作用於:用來判斷某個程式在不同條件下,執行不同邏輯。 按結構分類,流程式控制制可分為:順序結構、選擇結構、迴圈結構 順序結構:程式從上往下執行 選擇結構:根據程式在不同條件下,選擇執行不同的邏輯代碼 迴圈結構:在一定的條件下,重覆執行某段代碼 選擇結構 java選擇結構的語句有:if語句 i ...
  • 虛擬機 1.1 發展歷程 1.1.1 java往事 ​ Java誕生在一群懶惰、急躁而傲慢的程式天才之中。 ​ 1990年12月,Sun的工程師Patrick Naughton被當時糟糕的Sun C++工具折磨的快瘋了。他大聲抱怨,並威脅要離開Sun轉投當時在Steve Jobs領導之下的NeXT公 ...
  • 1、流式查詢 1、實體類 package com.wanqi.pojo; import java.util.Date; /** * @Description TODO * @Version 1.0.0 * @Date 2022/9/12 * @Author wandaren */ public cl ...
  • 最近在學習fastdfs時遇到了一個困擾我數小時的問題,結果很感人,特在此記錄下來,也是為了讓其他小伙伴們避坑 (這裡我的fastdfs運行環境是在docker中) 事情是這樣的,用APIfox測試fastdfs文件上傳的時候發現明明返回的成功的結果但是在瀏覽器中使用路徑卻訪問不到伺服器上的圖片,瀏 ...
  • NET 6 環境開發 實現 線程數量,任務隊列,非核心線程,及核心線程活躍時間的管理。 namespace CustomThreadPool; /// <summary> /// 線程池類 /// </summary> public class ThreadPoolExecutor { /// <s ...
  • 一:背景 1.講故事 前段時間有位朋友找到我,說他的程式在客戶的機器上跑著跑著會出現偶發卡死,然後就崩掉了,但在本地怎麼也沒復現,dump也抓到了,讓我幫忙看下到底怎麼回事,其實崩潰類的dump也有簡單的,也有非常複雜的,因為大多情況下都是非托管層面出現的各種故障,非常考驗對 C, C++, Win ...
一周排行
    -Advertisement-
    Play Games
  • 簡介 本文的初衷是希望幫助那些有其它平臺視覺演算法開發經驗的人能快速轉入Halcon平臺下,通過文中的示例開發者能快速瞭解一個Halcon項目開發的基本步驟,讓開發者能把精力完全集中到演算法的開發上面。 首先,你需要安裝Halcon,HALCON 18.11.0.1的安裝包會放在文章末尾。安裝包分開發和 ...
  • 本文是對Datawhale的動手學數據分析課程的學習總結,記錄了整體的學習過程、答案以及個人感想,代碼較為詳細。 ...
  • JZ7重建二叉樹 描述 給定節點數為 n 的二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹並返回它的頭結點。 例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6} 提示: 1.vin.length == pre.length 2.pre 和 vin ...
  • 我們都知道在Java編程中多線程的同步使用synchronized關鍵字來標識,那麼這個關鍵字在JVM底層到底是如何實現的呢。 我們先來思考一下如果我們自己實現的一個鎖該怎麼做呢: 首先肯定要有個標記記錄對象是否已經上鎖,執行同步代碼之前判斷這個標誌,如果對象已經上鎖線程就阻塞等待鎖的釋放。 其次要 ...
  • 目錄 一.OpenGL 色階 1.Windows OpenGL ES 版本 2.Windows OpenGL 版本 二.OpenGL 色階 GLSL Shader 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 Ope ...
  • 1. 查看Linux伺服器版本信息 # cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 2. 禪道開源版安裝包下載 wget http://dl.cnezsoft.com/zentao/9.8.2/ZenTaoPMS.9.8. ...
  • Spring 框架可以為 Java 應用程式開發提供全面的基礎設施支持,它是現在非常流行的 Java 開源框架,對於一個 Java 開發人員來說,熟練掌握 Spring 是必不可少的。 ...
  • 前言 本篇是c++總結的第二篇,關於c++的對象模型,在構造、拷貝虛函數上重點分析,也包含了c++11class的新用法和特性,如有不當,還請指教! c++三大特性 訪問許可權 ​ 在c++中通過public、protected、private三個關鍵字來控製成員變數和成員函數的訪問許可權,它們分別表示 ...
  • 一.小結 1.使用二維數組來存儲表格 2.可以使用以下語法來聲明二維數組變數: 元素類型[ ] [ ]數組變數 3.可以使用以下語法來創建二維數組變數: new 元素類型 [行的個數][列的個數] 4.使用下麵的語法表示二維數組中的每個元素: 數組變數[行下標][列的個數] 5.可使用數組初始化語法 ...
  • typimg是一款為typora編輯器提供圖像自定義上傳服務的工具,該工具將在typora中輸入的網路圖片、本地圖片、剪貼板圖片/截圖上傳到博客園,支持在MacOS、Windiws、Linux三個平臺上運行。 ...