一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](八)

来源:https://www.cnblogs.com/bobositlife/archive/2018/02/05/8416235.html
-Advertisement-
Play Games

前言 Hi, 大家好,還是星期五,還是Rector,又在圖享網準時和大家見面了。 今天給大家帶來系列教程《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar]》的第八期了,不知道你有沒有按照教程將前七期的都實際練習一篇呢?如果是,你 ...


前言

Hi, 大家好,還是星期五,還是Rector,又在圖享網準時和大家見面了。 今天給大家帶來系列教程《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar]》的第八期了,不知道你有沒有按照教程將前七期的都實際練習一篇呢?如果是,你在練習的時候有沒有遇到什麼問題呢? 反正Rector是有收到部分童鞋發來他們練習過程中的問題反饋的哦。

如果你仔細閱讀並實際練習了前面七期的教程,我相信,作為剛入門或者經驗尚淺的你一定會有收穫的。

加油吧,騷年!!! 人生苦短,就怕努力!!!

Rector這是要成為心理導師的節奏啊,一來就給大家灌飽心靈雞湯。。。

**本文篇幅有點長,請作好心裡準備!!! 同時,也吐個槽,本文看似內容簡單的一B,但也花了筆者幾個小時來準備示例以及寫作,寫技術文章真心傷不起 珍愛生命,遠離程式!!! **

還是回到我們的正題,開始我們今天的系列教程:《一步一步創建ASP.NET MVC5程式Repository+Autofac+Automapper+SqlSugar

本文知識要點

  • 用戶註冊/登錄功能設計與實現

設計用戶表

這個表呢,Rector已經為大家準備好了,MySQL表結構如下:

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for ts_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `Id` int(10) NOT NULL AUTO_INCREMENT,
  `LoginName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '登錄名',
  `Password` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '密碼',
  `DisplayName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '顯示名稱',
  `RealName` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '真實姓名',
  `EmailAddress` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '電子郵箱',
  `Avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用戶頭像',
  `Status` int(2) NOT NULL DEFAULT 1 COMMENT '用戶的狀態,0:禁用,1:正常',
  `Telephone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '手機號碼',
  `Qq` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',
  `WebsiteUrl` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',
  `CreatedOn` datetime(0) NULL DEFAULT NULL COMMENT '用戶創建時間',
  `CreatedIp` varchar(24) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '創建用戶時的IP地址',
  `LoginCount` int(8) NULL DEFAULT 0 COMMENT '登錄次數累加器',
  `LatestLoginDate` datetime(0) NULL DEFAULT NULL COMMENT '最近一次登錄時間',
  `LatestLoginIp` varchar(24) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '最近一次登錄時的IP地址',
  `ModifiedOn` datetime(0) NULL DEFAULT NULL COMMENT '最近修改時間',
  `Type` int(2) NULL DEFAULT 0 COMMENT '用戶類型[-1:超級管理員,0:一般用戶]',
  PRIMARY KEY (`Id`) USING BTREE,
  UNIQUE INDEX `IX_LoginName`(`LoginName`) USING BTREE,
  UNIQUE INDEX `IX_EmailAddress`(`EmailAddress`) USING BTREE,
  INDEX `IX_CreatedOn`(`CreatedOn`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

請直接複製以上MySQL腳本,然後到對應數據執行即可,當然你也可以在這個版本的源碼裡面找到。 這個表就不准備提前寫入示例數據了,一會我們用註冊功能來寫入數據。

創建領域實體和視圖實體

在項目 【TsBlog.Domain】中的Entities文件夾中創建 User.cs 實體類:

using SqlSugar;
using System;

namespace TsBlog.Domain.Entities
{
    [SugarTable("tb_user")]
    public class User
    {
        [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
        public int Id { get; set; }
        public string LoginName { get; set; }
        public string Password { get; set; }
        public string RealName { get; set; }
        public string EmailAddress { get; set; }
        public string Avatar { get; set; }
        public int Status { get; set; }
        public string Telephone { get; set; }
        public string Qq { get; set; }
        public string WebsiteUrl { get; set; }
        public DateTime CreatedOn { get; set; }
        public string CreatedIp { get; set; }
        public int LoginCount { get; set; }
        public DateTime? LatestLoginDate { get; set; }
        public string LatestLoginIp { get; set; }
        public DateTime? ModifiedOn { get; set; }
        public int Type { get; set; }
    }
}

再在項目【TsBlog.ViewModel】中創建 User 的文件夾,並創建以下幾個視圖實體類

LoginViewModel.cs

using System.ComponentModel.DataAnnotations;

namespace TsBlog.ViewModel.User
{
    /// <summary>
    /// 用戶登錄視圖實體
    /// </summary>
    public class LoginViewModel
    {
        [Required(ErrorMessage = "請輸入用戶")]
        [Display(Name = "用戶名")]
        public string UserName { get; set; }
        [Required(ErrorMessage = "請輸入密碼")]
        [Display(Name = "密碼")]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }
}

RegisterViewModel.cs

using System.ComponentModel.DataAnnotations;

namespace TsBlog.ViewModel.User
{
    /// <summary>
    /// 用戶註冊視圖實體
    /// </summary>
    public class RegisterViewModel
    {
        [Required(ErrorMessage = "請輸入用戶名")]
        [Display(Name = "用戶名")]
        public string UserName { get; set; }
        [Required(ErrorMessage = "請輸入密碼")]
        [Display(Name = "密碼")]
        [DataType(DataType.Password), MaxLength(20, ErrorMessage = "密碼最大長度為20個字元"), MinLength(6, ErrorMessage = "密碼最小長度為6個字元")]
        public string Password { get; set; }

        [Required(ErrorMessage = "請輸入確認密碼")]
        [Display(Name = "確認密碼")]
        [DataType(DataType.Password), Compare("Password", ErrorMessage = "兩次密碼不一致")]
        public string ConfirmPassword { get; set; }
    }
}

UserViewModel.cs:

using System;

namespace TsBlog.ViewModel.User
{
    /// <summary>
    /// 與領域用戶實體對應的用戶視圖實體
    /// </summary>
    public class UserViewModel
    {
        public int Id { get; set; }
        public string LoginName { get; set; }
        public string Password { get; set; }
        public string RealName { get; set; }
        public string EmailAddress { get; set; }
        public string Avatar { get; set; }
        public int Status { get; set; }
        public string Telephone { get; set; }
        public string Qq { get; set; }
        public string WebsiteUrl { get; set; }
        public DateTime CreatedOn { get; set; }
        public string CreatedIp { get; set; }
        public int LoginCount { get; set; }
        public DateTime? LatestLoginDate { get; set; }
        public string LatestLoginIp { get; set; }
        public DateTime? ModifiedOn { get; set; }
        public int Type { get; set; }
    }
}

倉儲層

在項目【TsBlog.Repositories】中創建 IUserRepository.cs 以及其實現類 UserRepository.cs

IUserRepository.cs:

using TsBlog.Domain.Entities;

namespace TsBlog.Repositories
{
    public interface IUserRepository : IRepository<User>
    {

    }
}

UserRepository.cs:

using TsBlog.Domain.Entities;

namespace TsBlog.Repositories
{
    public class UserRepository : GenericRepository<User>, IUserRepository
    {

    }
}

服務層

在項目【TsBlog.Services】中創建 IUserService.cs 以及其實現類 UserService.cs

IUserService.cs:

using TsBlog.Domain.Entities;

namespace TsBlog.Services
{
    public interface IUserService : IService<User>
    {
        User FindByLoginName(string loginName);
    }
}

UserService.cs:

using TsBlog.Domain.Entities;
using TsBlog.Repositories;

namespace TsBlog.Services
{
    public class UserService : GenericService<User>, IUserService
    {
        private readonly IUserRepository _repository;
        public UserService(IUserRepository repository) : base(repository)
        {
            _repository = repository;
        }

        public User FindByLoginName(string loginName)
        {
            return _repository.FindByClause(x => x.LoginName == loginName);
        }
    }
}

創建加密類

在解決方案文件夾【1.Libraries】中創建一個新的項目,取名為【TsBlog.Core】,在此項目中先創建一個名為 Security的文件夾,再創建一個加密類 Encryptor.cs

using System.Security.Cryptography;
using System.Text;

namespace TsBlog.Core.Security
{
    /// <summary>
    /// 加密靜態類
    /// </summary>
    public static class Encryptor
    {
        //MD5加密一個字元串
        public static string Md5Hash(string text)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            md5.ComputeHash(Encoding.ASCII.GetBytes(text));

            var result = md5.Hash;

            var strBuilder = new StringBuilder();
            foreach (var t in result)
            {
                strBuilder.Append(t.ToString("x2"));
            }

            return strBuilder.ToString();
        }
    }
}

在用戶註冊或者登錄時,我們將使用這個MD5加密用戶的密碼,並將其保存到資料庫中(資料庫中保存明文的密碼是非常危險的,特別是在重要的安全級別很高的項目中,千(不)萬(信)別(你)這(試)樣(一)做(下)!!!)。

創建控制器

在項目【TsBlog.Frontend】中創建控制器 AccountController.cs,並添加如下代碼:

AccountController.cs

using System;
using System.Web.Mvc;
using TsBlog.Core.Security;
using TsBlog.Domain.Entities;
using TsBlog.Services;
using TsBlog.ViewModel.User;

namespace TsBlog.Frontend.Controllers
{
    /// <summary>
    /// 用戶中心控制器
    /// </summary>
    public class AccountController : Controller
    {
        /// <summary>
        /// 用戶服務介面
        /// </summary>
        private readonly IUserService _userService;

        public AccountController(IUserService userService)
        {
            _userService = userService;
        }

        /// <summary>
        /// 登錄頁面
        /// </summary>
        /// <returns></returns>
        public ActionResult Login()
        {
            return View();
        }

        /// <summary>
        /// 提交登錄請求
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost, ValidateAntiForgeryToken, AllowAnonymous]
        public ActionResult Login(LoginViewModel model)
        {
            //如果視圖模型中的屬性沒有驗證通過,則返回到登錄頁面,要求用戶重新填寫
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            //根據用戶登錄名查詢指定用戶實體
            var user = _userService.FindByLoginName(model.UserName.Trim());

            //如果用戶不存在,則攜帶錯誤消息並返回登錄頁面
            if (user == null)
            {
                ModelState.AddModelError("error_message", "用戶不存在");
                return View(model);
            }

            //如果密碼不匹配,則攜帶錯誤消息並返回登錄頁面
            if (user.Password != Encryptor.Md5Hash(model.Password.Trim()))
            {
                ModelState.AddModelError("error_message", "密碼錯誤,請重新登錄");
                return View(model);
            }

            //並用戶實體保存到Session中
            Session["user_account"] = user;
            //跳轉到首頁
            return RedirectToAction("index", "home");
        }

        /// <summary>
        /// 註冊頁面
        /// </summary>
        /// <returns></returns>
        public ActionResult Register()
        {
            return View();
        }

        /// <summary>
        /// 提交註冊請求
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost, ValidateAntiForgeryToken, AllowAnonymous]
        public ActionResult Register(RegisterViewModel model)
        {
            //如果視圖模型中的屬性沒有驗證通過,則返回到註冊頁面,要求用戶重新填寫
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            //創建一個用戶實體
            var user = new User
            {
                LoginName = model.UserName,
                Password = Encryptor.Md5Hash(model.Password.Trim()),
                CreatedOn = DateTime.Now
                //由於是示例教程,所以其他欄位不作填充了
            };
            //將用戶實體對象寫入資料庫中
            var ret = _userService.Insert(user);

            if (ret <= 0)
            {
                //如果註冊失敗,則攜帶錯誤消息並返回註冊頁面
                ModelState.AddModelError("error_message", "註冊失敗");
                return View(model);

            }
            //如果註冊成功,則跳轉到登錄頁面
            return RedirectToAction("login");
        }
    }
}

添加必要JS庫

由於之前我們將項目中的多餘的JS庫全部移除掉了,所以現在我們重新安裝一下我們項目中將要到的一些JS庫,包括:jQuery,Bootstrap等,都使用Nuget來安裝,方便統一管理和升級。

安裝jQuery:

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-08-01.png

安裝Bootstrap:

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-08-02.png

安裝jquery.validate.bootstrap:

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-08-03.png

安裝完成後的JS庫文件夾:

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-08-04.png

完成註冊頁面

在 [Views/Account]文件夾中創建註冊頁面視圖 register.cshtml

@model TsBlog.ViewModel.User.RegisterViewModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>用戶註冊</title>
    <style type="text/css">

        * { box-sizing: border-box; }
        body { box-sizing: border-box; margin: 0; padding: 0; color: #333; }
        .account-container { position: absolute; margin: auto; top: 0; right: 0; bottom: 0; left: 0; width: 400px; height: 480px; background-color: #fff; /*border-radius: 3px;*/ box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2); }

        .account-signin-container { margin-top: 15px; }
            .account-signin-container h1 { font-size: 20px; border-bottom: 2px solid #f7f7f7; margin: 0 0 15px; padding-bottom: 10px; padding-left: 15px; letter-spacing: 0.1em; }
        .account-form { padding: 15px; }
            .account-form .form-group { width: 100%; margin-bottom: 15px; }
                .account-form .form-group label { width: 100%; display: block; }
                .account-form .form-group input { border: 1px solid #ccc; line-height: 32px; font-size: 16px; padding: 2px 0px; padding-left: 5px; display: block; width: 100%; margin-top: 5px; }
            .account-form #btn_register { border: 0; background: #3b78e7; color: #fff; font-size: 18px; font-weight: bold; padding: 8px 25px; cursor: pointer; margin-top: 15px; display: inline-block; box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2); border-radius: 3px; min-width: 100px; text-align: center; }
                .account-form #btn_register:hover { background: #4885F3; }
        span.error { color: #f00; }
        .btn-login { float: right; display: block; margin-top: 25px; color: #4885f3; }

        @@media(max-width:500px) {
            .account-container { width: 100%; height: 100vh; }
        }
    </style>
</head>
<body>
    <div class="account-container">
        <div class="account-modal-container">
            <div class="modal"></div>
            <div class="load-bar-container">
                <div class="load-bar">
                    <div class="bar"></div>
                    <div class="bar"></div>
                    <div class="bar"></div>
                </div>
            </div>
            <div class="account-signin-container">
                <h1>用戶註冊</h1>
                @using (Html.BeginForm("register", "account", FormMethod.Post, new { @class = "account-form", role = "form" }))
                {
                    @Html.ValidationMessage("error_message", new { @class = "error" })
                    @Html.AntiForgeryToken()
                    <div class="form-group">
                        <label>
                            <span>登錄名:</span>
                            @Html.TextBoxFor(m => m.UserName, new { placeholder = "請輸入登錄名" })
                            @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "error" })
                        </label>
                    </div>
                    <div class="form-group">
                        <label>
                            <span>密碼:</span>
                            @Html.PasswordFor(m => m.Password, new { placeholder = "請輸入密碼" })
                            @Html.ValidationMessageFor(m => m.Password, "", new { @class = "error" })
                        </label>
                    </div>
                    <div class="form-group">
                        <label>
                            <span>確認密碼:</span>
                            @Html.PasswordFor(m => m.ConfirmPassword, new { placeholder = "請輸入確認密碼" })
                            @Html.ValidationMessageFor(m => m.ConfirmPassword, "", new { @class = "error" })
                        </label>
                    </div>
                    <div class="form-group">
                        <button id="btn_register" type="submit">註 冊</button>
                        <a class="btn-login" href="~/account/login">登錄</a>
                    </div>
                }

            </div>
        </div>
    </div>
    <script src="~/Scripts/jquery-3.2.1.min.js"></script>
    <script src="~/Scripts/jquery.validate.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
</body>
</html>

再在當前文件夾下創建 login.cshtml 視圖文件用作登錄頁面:

@model TsBlog.ViewModel.User.LoginViewModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>用戶登錄</title>
    <style type="text/css">

        * { box-sizing: border-box; }
        body { box-sizing: border-box; margin: 0; padding: 0; color: #333; }

        .account-container { position: absolute; margin: auto; top: 0; right: 0; bottom: 0; left: 0; width: 400px; height: 450px; background-color: #fff; /*border-radius: 3px;*/ box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2); }

        .account-signin-container { margin-top: 15px; }
            .account-signin-container h1 { font-size: 20px; border-bottom: 2px solid #f7f7f7; margin: 0 0 15px; padding-bottom: 10px; padding-left: 15px; letter-spacing: 0.1em; }
        .account-form { padding: 15px; }
            .account-form .form-group { width: 100%; margin-bottom: 15px; }
                .account-form .form-group label { width: 100%; display: block; }
                .account-form .form-group input { border: 1px solid #ccc; line-height: 32px; font-size: 16px; padding: 2px 0px; padding-left: 5px; display: block; width: 100%; margin-top: 5px; }
            .account-form #btn_login { border: 0; background: #3b78e7; color: #fff; font-size: 18px; font-weight: bold; padding: 8px 25px; cursor: pointer; margin-top: 15px; display: inline-block; box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2); border-radius: 3px; min-width: 100px; text-align: center; }
                .account-form #btn_login:hover { background: #4885F3; }
        span.error { color: #f00; }
        .btn-register { float: right; display: block; margin-top: 25px; color: #4885f3; }

        @@media(max-width:500px) {
            .account-container { width: 100%; height: 100vh; }
        }
    </style>
</head>
<body>
    <div class="account-container">
        <div class="account-modal-container">
            <div class="modal"></div>
            <div class="load-bar-container">
                <div class="load-bar">
                    <div class="bar"></div>
                    <div class="bar"></div>
                    <div class="bar"></div>
                </div>
            </div>
            <div class="account-signin-container">
                <h1>用戶登錄</h1>
                @using (Html.BeginForm("login", "account", FormMethod.Post, new { @class = "account-form", role = "form" }))
                {
                    @Html.ValidationMessage("error_message", new { @class = "error" })
                    @Html.AntiForgeryToken()
                    <div class="form-group">
                        <label>
                            <span>登錄名:</span>
                            @Html.TextBoxFor(m => m.UserName, new { placeholder = "請輸入登錄名" })
                            @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "error" })
                        </label>
                    </div>
                    <div class="form-group">
                        <label>
                            <span>密碼:</span>
                            @Html.PasswordFor(m => m.Password, new { placeholder = "請輸入密碼" })
                            @Html.ValidationMessageFor(m => m.Password, "", new { @class = "error" })
                        </label>
                    </div>
                    <div class="form-group">
                        <button id="btn_login" type="submit">登 錄</button>
                        <a class="btn-register" href="~/account/register">註冊賬號</a>
                    </div>
                }

            </div>
        </div>
    </div>
    <script src="~/Scripts/jquery-3.2.1.min.js"></script>
    <script src="~/Scripts/jquery.validate.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
    <script src="~/res/assets/notie/notie.min.js"></script>
</body>
</html>

這兩個頁面均是響應式的佈局,可適應不同設備。

好了,關於註冊和登錄的邏輯以及頁面都完成了,那麼運行項目,打開註冊頁面:http://localhost:54739/account/register,具體的註冊請自行體驗:

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-08-05.png

註冊成功後,系統將帶你到登錄頁面:

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-08-06.png

具體功能也請自行體驗。

以上,我們只完成了註冊和登錄的基本功能,接下來我們來體驗一下簡單的許可權訪問,在本期教程之前,我們的: http://localhost:54739/home/index 以及 http://localhost:54739/home/post 是可以直接訪問的,現在我們給這兩個頁面添加訪問許可權,即只有登錄後才能訪問,修改 HomeController.cs 如下:

using System.Web.Mvc;
using TsBlog.AutoMapperConfig;
using TsBlog.Services;

namespace TsBlog.Frontend.Controllers
{
    public class HomeController : Controller
    {
        private readonly IPostService _postService;
        public HomeController(IPostService postService)
        {
            _postService = postService;
        }
        public ActionResult Index()
        {
            //如果未登錄,則跳轉到登錄頁面
            if (Session["user_account"] == null)
            {
                return RedirectToAction("login", "account");
            }
            return View();
        }

        public ActionResult Post()
        {
            //如果未登錄,則跳轉到登錄頁面
            if (Session["user_account"] == null)
            {
                return RedirectToAction("login", "account");
            }

            var post = _postService.FindById(1).ToModel();
            return View(post);
        }
    }
}

重新編譯項目,按F5運行,再打開地址:http://localhost:54739/home/index ,發生了什麼情況? 是不是被重定向到了登錄頁面,要求你登錄? 這就對了,輸入你剛纔註冊的用戶名和密碼,登錄後,系統會重新帶你到:http://localhost:54739/home/index 頁面。

OK,今天這期的關於用戶註冊和登錄功能就介紹到這裡,本期只實現了簡單的功能,在後續的教程中將重構和封裝相應的功能代碼,敬請期待。。。

如果你喜歡Rector的本系列文章,請為我點個大大的贊。

看完教程如果覺得還不過癮的,遇到問題的,想“勾對”的,歡迎加入圖享網官方QQ群:483350228。有什麼,你懂的。。。

謝謝你的耐心閱讀,未完待續,我們下期再見……

本期源碼托管,請至首發地址獲取-- 《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](八)》

資料庫腳本文件請到目錄下獲取:TsBlog\document\scripts\mysql\v1.8\

本文來源自 圖享網 《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](八)》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ASP.NET MVC框架提供了數據驗證的API,稱為"模型數據註解"或“模型元數據”,使我們可以使用聲明語法在模型中指定驗證的規則,常見的驗證API如下: 數據驗證API位於using System.ComponentModel.DataAnnotations;命名空間。 Movie.cs Ind ...
  • 通過製作一個登錄小案例來搭建MVC簡單三層 在View --Shared下創建一個母版頁: <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <script src="~/Scrip ...
  • MVC自帶一個異常過濾器即 HandleErrorAttribute 1.首先要進行配置web.config defaultRedirect表示需要跳轉的錯誤頁面,mode需設置為 on或者 RemoteOnly. 註:HandleError只處理伺服器500錯誤,404、400等這些錯誤不進行處理 ...
  • 1、首先在項目中添加Nuget程式包... 2、然後在NuGet窗體中搜索Log4Net,然後點擊安裝<安裝過程可能會持續幾分鐘,請耐心等待> 3、在項目中添加一個Config文件,如已有App.config,則直接在其中添加內容: 截圖中配置的XML代碼如下: 最後在項目的 AssemblyInf ...
  • 用17寫AspNetCore 也一年了,最近出現了這個問題 : 在點擊發佈的時候 報錯了,構建失敗的問題,剛開始還排查日子,刪除以往的發佈遺留痕跡,後來發現不行, 但是項目在本地運行的時候是好使的,生成也不會報錯。 我們項目中有3個解決方案,只有其中一個可以進行發佈,我就對項目的(共同引用)進行查看 ...
  • 實例產品基於asp.net mvc 5.0框架,源碼下載地址:http://www.jinhusns.com/Products/Download View里所有以@開頭或@(/*代碼*)的部分代碼都會被ASP.NET引擎進行處理。在@{/*代碼體}內的代碼每一行都必須以";"結束如: 而@xxx則不 ...
  • 實例產品基於asp.net mvc 5.0框架,源碼下載地址:http://www.jinhusns.com/Products/Download 在Asp.net Mvc中當你有以下及類似以下需求時你可以使用Filter功能 判斷登錄與否或用戶許可權 決策輸出緩存 防盜鏈 防蜘蛛 本地化與國際化設置 ...
  • 一、原始配置文件的問題 我們在做開發時,不管是B/S還是C/S,現在幾乎所有的項目都會碰到使用配置文件,簡單點的如鏈接字元串、上傳路徑啊,一些API的介面地址等等。複雜點就更多了,如ActiveMQ的配置信息(地址、埠、用戶名、密碼)等等。 在.Net開發中已經在(Web.config/App.c ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...