当前位置:   article > 正文

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

一步一步创建asp.net mvc5程序

前言

Hi,
大家好,还是星期五,还是Rector,又在图享网准时和大家见面了。
今天给大家带来系列教程《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]》的第八期了,不知道你有没有按照教程将前七期的都实际练习一篇呢?如果是,你在练习的时候有没有遇到什么问题呢?
反正Rector是有收到部分童鞋发来他们练习过程中的问题反馈的哦。

如果你仔细阅读并实际练习了前面七期的教程,我相信,作为刚入门或者经验尚浅的你一定会有收获的。

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

Rector这是要成为心理导师的节奏啊,一来就给大家灌饱心灵鸡汤。。。

**本文篇幅有点长,请作好心里准备!!!
同时,也吐个槽,本文看似内容简单的一B,但也花了笔者几个小时来准备示例以及写作,写技术文章真心伤不起
珍爱生命,远离程序!!!
**

还是回到我们的正题,开始我们今天的系列教程:《一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar

本文知识要点

  • 用户注册/登录功能设计与实现

设计用户表

这个表呢,Rector已经为大家准备好了,MySQL表结构如下:

  1. SET FOREIGN_KEY_CHECKS = 0;
  2. -- ----------------------------
  3. -- Table structure for ts_user
  4. -- ----------------------------
  5. DROP TABLE IF EXISTS `tb_user`;
  6. CREATE TABLE `tb_user` (
  7. `Id` int(10) NOT NULL AUTO_INCREMENT,
  8. `LoginName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '登录名',
  9. `Password` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '密码',
  10. `DisplayName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '显示名称',
  11. `RealName` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '真实姓名',
  12. `EmailAddress` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '电子邮箱',
  13. `Avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户头像',
  14. `Status` int(2) NOT NULL DEFAULT 1 COMMENT '用户的状态,0:禁用,1:正常',
  15. `Telephone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '手机号码',
  16. `Qq` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',
  17. `WebsiteUrl` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',
  18. `CreatedOn` datetime(0) NULL DEFAULT NULL COMMENT '用户创建时间',
  19. `CreatedIp` varchar(24) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建用户时的IP地址',
  20. `LoginCount` int(8) NULL DEFAULT 0 COMMENT '登录次数累加器',
  21. `LatestLoginDate` datetime(0) NULL DEFAULT NULL COMMENT '最近一次登录时间',
  22. `LatestLoginIp` varchar(24) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '最近一次登录时的IP地址',
  23. `ModifiedOn` datetime(0) NULL DEFAULT NULL COMMENT '最近修改时间',
  24. `Type` int(2) NULL DEFAULT 0 COMMENT '用户类型[-1:超级管理员,0:一般用户]',
  25. PRIMARY KEY (`Id`) USING BTREE,
  26. UNIQUE INDEX `IX_LoginName`(`LoginName`) USING BTREE,
  27. UNIQUE INDEX `IX_EmailAddress`(`EmailAddress`) USING BTREE,
  28. INDEX `IX_CreatedOn`(`CreatedOn`) USING BTREE
  29. ) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  30. SET FOREIGN_KEY_CHECKS = 1;

请直接复制以上MySQL脚本,然后到对应数据执行即可,当然你也可以在这个版本的源码里面找到。
这个表就不准备提前写入示例数据了,一会我们用注册功能来写入数据。

创建领域实体和视图实体

在项目 【TsBlog.Domain】中的Entities文件夹中创建 User.cs 实体类:

  1. using SqlSugar;
  2. using System;
  3. namespace TsBlog.Domain.Entities
  4. {
  5. [SugarTable("tb_user")]
  6. public class User
  7. {
  8. [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
  9. public int Id { get; set; }
  10. public string LoginName { get; set; }
  11. public string Password { get; set; }
  12. public string RealName { get; set; }
  13. public string EmailAddress { get; set; }
  14. public string Avatar { get; set; }
  15. public int Status { get; set; }
  16. public string Telephone { get; set; }
  17. public string Qq { get; set; }
  18. public string WebsiteUrl { get; set; }
  19. public DateTime CreatedOn { get; set; }
  20. public string CreatedIp { get; set; }
  21. public int LoginCount { get; set; }
  22. public DateTime? LatestLoginDate { get; set; }
  23. public string LatestLoginIp { get; set; }
  24. public DateTime? ModifiedOn { get; set; }
  25. public int Type { get; set; }
  26. }
  27. }

再在项目【TsBlog.ViewModel】中创建 User 的文件夹,并创建以下几个视图实体类

LoginViewModel.cs

  1. using System.ComponentModel.DataAnnotations;
  2. namespace TsBlog.ViewModel.User
  3. {
  4. /// <summary>
  5. /// 用户登录视图实体
  6. /// </summary>
  7. public class LoginViewModel
  8. {
  9. [Required(ErrorMessage = "请输入用户")]
  10. [Display(Name = "用户名")]
  11. public string UserName { get; set; }
  12. [Required(ErrorMessage = "请输入密码")]
  13. [Display(Name = "密码")]
  14. [DataType(DataType.Password)]
  15. public string Password { get; set; }
  16. }
  17. }

RegisterViewModel.cs

  1. using System.ComponentModel.DataAnnotations;
  2. namespace TsBlog.ViewModel.User
  3. {
  4. /// <summary>
  5. /// 用户注册视图实体
  6. /// </summary>
  7. public class RegisterViewModel
  8. {
  9. [Required(ErrorMessage = "请输入用户名")]
  10. [Display(Name = "用户名")]
  11. public string UserName { get; set; }
  12. [Required(ErrorMessage = "请输入密码")]
  13. [Display(Name = "密码")]
  14. [DataType(DataType.Password), MaxLength(20, ErrorMessage = "密码最大长度为20个字符"), MinLength(6, ErrorMessage = "密码最小长度为6个字符")]
  15. public string Password { get; set; }
  16. [Required(ErrorMessage = "请输入确认密码")]
  17. [Display(Name = "确认密码")]
  18. [DataType(DataType.Password), Compare("Password", ErrorMessage = "两次密码不一致")]
  19. public string ConfirmPassword { get; set; }
  20. }
  21. }

UserViewModel.cs:

  1. using System;
  2. namespace TsBlog.ViewModel.User
  3. {
  4. /// <summary>
  5. /// 与领域用户实体对应的用户视图实体
  6. /// </summary>
  7. public class UserViewModel
  8. {
  9. public int Id { get; set; }
  10. public string LoginName { get; set; }
  11. public string Password { get; set; }
  12. public string RealName { get; set; }
  13. public string EmailAddress { get; set; }
  14. public string Avatar { get; set; }
  15. public int Status { get; set; }
  16. public string Telephone { get; set; }
  17. public string Qq { get; set; }
  18. public string WebsiteUrl { get; set; }
  19. public DateTime CreatedOn { get; set; }
  20. public string CreatedIp { get; set; }
  21. public int LoginCount { get; set; }
  22. public DateTime? LatestLoginDate { get; set; }
  23. public string LatestLoginIp { get; set; }
  24. public DateTime? ModifiedOn { get; set; }
  25. public int Type { get; set; }
  26. }
  27. }

仓储层

在项目【TsBlog.Repositories】中创建 IUserRepository.cs 以及其实现类 UserRepository.cs

IUserRepository.cs:

  1. using TsBlog.Domain.Entities;
  2. namespace TsBlog.Repositories
  3. {
  4. public interface IUserRepository : IRepository<User>
  5. {
  6. }
  7. }

UserRepository.cs:

  1. using TsBlog.Domain.Entities;
  2. namespace TsBlog.Repositories
  3. {
  4. public class UserRepository : GenericRepository<User>, IUserRepository
  5. {
  6. }
  7. }

服务层

在项目【TsBlog.Services】中创建 IUserService.cs 以及其实现类 UserService.cs

IUserService.cs:

  1. using TsBlog.Domain.Entities;
  2. namespace TsBlog.Services
  3. {
  4. public interface IUserService : IService<User>
  5. {
  6. User FindByLoginName(string loginName);
  7. }
  8. }

UserService.cs:

  1. using TsBlog.Domain.Entities;
  2. using TsBlog.Repositories;
  3. namespace TsBlog.Services
  4. {
  5. public class UserService : GenericService<User>, IUserService
  6. {
  7. private readonly IUserRepository _repository;
  8. public UserService(IUserRepository repository) : base(repository)
  9. {
  10. _repository = repository;
  11. }
  12. public User FindByLoginName(string loginName)
  13. {
  14. return _repository.FindByClause(x => x.LoginName == loginName);
  15. }
  16. }
  17. }

创建加密类

在解决方案文件夹【1.Libraries】中创建一个新的项目,取名为【TsBlog.Core】,在此项目中先创建一个名为 Security的文件夹,再创建一个加密类 Encryptor.cs

  1. using System.Security.Cryptography;
  2. using System.Text;
  3. namespace TsBlog.Core.Security
  4. {
  5. /// <summary>
  6. /// 加密静态类
  7. /// </summary>
  8. public static class Encryptor
  9. {
  10. //MD5加密一个字符串
  11. public static string Md5Hash(string text)
  12. {
  13. MD5 md5 = new MD5CryptoServiceProvider();
  14. md5.ComputeHash(Encoding.ASCII.GetBytes(text));
  15. var result = md5.Hash;
  16. var strBuilder = new StringBuilder();
  17. foreach (var t in result)
  18. {
  19. strBuilder.Append(t.ToString("x2"));
  20. }
  21. return strBuilder.ToString();
  22. }
  23. }
  24. }

在用户注册或者登录时,我们将使用这个MD5加密用户的密码,并将其保存到数据库中(数据库中保存明文的密码是非常危险的,特别是在重要的安全级别很高的项目中,千(不)万(信)别(你)这(试)样(一)做(下)!!!)。

创建控制器

在项目【TsBlog.Frontend】中创建控制器 AccountController.cs,并添加如下代码:

AccountController.cs

  1. using System;
  2. using System.Web.Mvc;
  3. using TsBlog.Core.Security;
  4. using TsBlog.Domain.Entities;
  5. using TsBlog.Services;
  6. using TsBlog.ViewModel.User;
  7. namespace TsBlog.Frontend.Controllers
  8. {
  9. /// <summary>
  10. /// 用户中心控制器
  11. /// </summary>
  12. public class AccountController : Controller
  13. {
  14. /// <summary>
  15. /// 用户服务接口
  16. /// </summary>
  17. private readonly IUserService _userService;
  18. public AccountController(IUserService userService)
  19. {
  20. _userService = userService;
  21. }
  22. /// <summary>
  23. /// 登录页面
  24. /// </summary>
  25. /// <returns></returns>
  26. public ActionResult Login()
  27. {
  28. return View();
  29. }
  30. /// <summary>
  31. /// 提交登录请求
  32. /// </summary>
  33. /// <param name="model"></param>
  34. /// <returns></returns>
  35. [HttpPost, ValidateAntiForgeryToken, AllowAnonymous]
  36. public ActionResult Login(LoginViewModel model)
  37. {
  38. //如果视图模型中的属性没有验证通过,则返回到登录页面,要求用户重新填写
  39. if (!ModelState.IsValid)
  40. {
  41. return View(model);
  42. }
  43. //根据用户登录名查询指定用户实体
  44. var user = _userService.FindByLoginName(model.UserName.Trim());
  45. //如果用户不存在,则携带错误消息并返回登录页面
  46. if (user == null)
  47. {
  48. ModelState.AddModelError("error_message", "用户不存在");
  49. return View(model);
  50. }
  51. //如果密码不匹配,则携带错误消息并返回登录页面
  52. if (user.Password != Encryptor.Md5Hash(model.Password.Trim()))
  53. {
  54. ModelState.AddModelError("error_message", "密码错误,请重新登录");
  55. return View(model);
  56. }
  57. //并用户实体保存到Session中
  58. Session["user_account"] = user;
  59. //跳转到首页
  60. return RedirectToAction("index", "home");
  61. }
  62. /// <summary>
  63. /// 注册页面
  64. /// </summary>
  65. /// <returns></returns>
  66. public ActionResult Register()
  67. {
  68. return View();
  69. }
  70. /// <summary>
  71. /// 提交注册请求
  72. /// </summary>
  73. /// <param name="model"></param>
  74. /// <returns></returns>
  75. [HttpPost, ValidateAntiForgeryToken, AllowAnonymous]
  76. public ActionResult Register(RegisterViewModel model)
  77. {
  78. //如果视图模型中的属性没有验证通过,则返回到注册页面,要求用户重新填写
  79. if (!ModelState.IsValid)
  80. {
  81. return View(model);
  82. }
  83. //创建一个用户实体
  84. var user = new User
  85. {
  86. LoginName = model.UserName,
  87. Password = Encryptor.Md5Hash(model.Password.Trim()),
  88. CreatedOn = DateTime.Now
  89. //由于是示例教程,所以其他字段不作填充了
  90. };
  91. //将用户实体对象写入数据库中
  92. var ret = _userService.Insert(user);
  93. if (ret <= 0)
  94. {
  95. //如果注册失败,则携带错误消息并返回注册页面
  96. ModelState.AddModelError("error_message", "注册失败");
  97. return View(model);
  98. }
  99. //如果注册成功,则跳转到登录页面
  100. return RedirectToAction("login");
  101. }
  102. }
  103. }

添加必要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

  1. @model TsBlog.ViewModel.User.RegisterViewModel
  2. @{
  3. Layout = null;
  4. }
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta name="viewport" content="width=device-width" />
  9. <title>用户注册</title>
  10. <style type="text/css">
  11. * { box-sizing: border-box; }
  12. body { box-sizing: border-box; margin: 0; padding: 0; color: #333; }
  13. .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); }
  14. .account-signin-container { margin-top: 15px; }
  15. .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; }
  16. .account-form { padding: 15px; }
  17. .account-form .form-group { width: 100%; margin-bottom: 15px; }
  18. .account-form .form-group label { width: 100%; display: block; }
  19. .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; }
  20. .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; }
  21. .account-form #btn_register:hover { background: #4885F3; }
  22. span.error { color: #f00; }
  23. .btn-login { float: right; display: block; margin-top: 25px; color: #4885f3; }
  24. @@media(max-width:500px) {
  25. .account-container { width: 100%; height: 100vh; }
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="account-container">
  31. <div class="account-modal-container">
  32. <div class="modal"></div>
  33. <div class="load-bar-container">
  34. <div class="load-bar">
  35. <div class="bar"></div>
  36. <div class="bar"></div>
  37. <div class="bar"></div>
  38. </div>
  39. </div>
  40. <div class="account-signin-container">
  41. <h1>用户注册</h1>
  42. @using (Html.BeginForm("register", "account", FormMethod.Post, new { @class = "account-form", role = "form" }))
  43. {
  44. @Html.ValidationMessage("error_message", new { @class = "error" })
  45. @Html.AntiForgeryToken()
  46. <div class="form-group">
  47. <label>
  48. <span>登录名:</span>
  49. @Html.TextBoxFor(m => m.UserName, new { placeholder = "请输入登录名" })
  50. @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "error" })
  51. </label>
  52. </div>
  53. <div class="form-group">
  54. <label>
  55. <span>密码:</span>
  56. @Html.PasswordFor(m => m.Password, new { placeholder = "请输入密码" })
  57. @Html.ValidationMessageFor(m => m.Password, "", new { @class = "error" })
  58. </label>
  59. </div>
  60. <div class="form-group">
  61. <label>
  62. <span>确认密码:</span>
  63. @Html.PasswordFor(m => m.ConfirmPassword, new { placeholder = "请输入确认密码" })
  64. @Html.ValidationMessageFor(m => m.ConfirmPassword, "", new { @class = "error" })
  65. </label>
  66. </div>
  67. <div class="form-group">
  68. <button id="btn_register" type="submit">注 册</button>
  69. <a class="btn-login" href="~/account/login">登录</a>
  70. </div>
  71. }
  72. </div>
  73. </div>
  74. </div>
  75. <script src="~/Scripts/jquery-3.2.1.min.js"></script>
  76. <script src="~/Scripts/jquery.validate.min.js"></script>
  77. <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
  78. </body>
  79. </html>

再在当前文件夹下创建 login.cshtml 视图文件用作登录页面:

  1. @model TsBlog.ViewModel.User.LoginViewModel
  2. @{
  3. Layout = null;
  4. }
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta name="viewport" content="width=device-width" />
  9. <title>用户登录</title>
  10. <style type="text/css">
  11. * { box-sizing: border-box; }
  12. body { box-sizing: border-box; margin: 0; padding: 0; color: #333; }
  13. .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); }
  14. .account-signin-container { margin-top: 15px; }
  15. .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; }
  16. .account-form { padding: 15px; }
  17. .account-form .form-group { width: 100%; margin-bottom: 15px; }
  18. .account-form .form-group label { width: 100%; display: block; }
  19. .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; }
  20. .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; }
  21. .account-form #btn_login:hover { background: #4885F3; }
  22. span.error { color: #f00; }
  23. .btn-register { float: right; display: block; margin-top: 25px; color: #4885f3; }
  24. @@media(max-width:500px) {
  25. .account-container { width: 100%; height: 100vh; }
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="account-container">
  31. <div class="account-modal-container">
  32. <div class="modal"></div>
  33. <div class="load-bar-container">
  34. <div class="load-bar">
  35. <div class="bar"></div>
  36. <div class="bar"></div>
  37. <div class="bar"></div>
  38. </div>
  39. </div>
  40. <div class="account-signin-container">
  41. <h1>用户登录</h1>
  42. @using (Html.BeginForm("login", "account", FormMethod.Post, new { @class = "account-form", role = "form" }))
  43. {
  44. @Html.ValidationMessage("error_message", new { @class = "error" })
  45. @Html.AntiForgeryToken()
  46. <div class="form-group">
  47. <label>
  48. <span>登录名:</span>
  49. @Html.TextBoxFor(m => m.UserName, new { placeholder = "请输入登录名" })
  50. @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "error" })
  51. </label>
  52. </div>
  53. <div class="form-group">
  54. <label>
  55. <span>密码:</span>
  56. @Html.PasswordFor(m => m.Password, new { placeholder = "请输入密码" })
  57. @Html.ValidationMessageFor(m => m.Password, "", new { @class = "error" })
  58. </label>
  59. </div>
  60. <div class="form-group">
  61. <button id="btn_login" type="submit">登 录</button>
  62. <a class="btn-register" href="~/account/register">注册账号</a>
  63. </div>
  64. }
  65. </div>
  66. </div>
  67. </div>
  68. <script src="~/Scripts/jquery-3.2.1.min.js"></script>
  69. <script src="~/Scripts/jquery.validate.min.js"></script>
  70. <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
  71. <script src="~/res/assets/notie/notie.min.js"></script>
  72. </body>
  73. </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 如下:

  1. using System.Web.Mvc;
  2. using TsBlog.AutoMapperConfig;
  3. using TsBlog.Services;
  4. namespace TsBlog.Frontend.Controllers
  5. {
  6. public class HomeController : Controller
  7. {
  8. private readonly IPostService _postService;
  9. public HomeController(IPostService postService)
  10. {
  11. _postService = postService;
  12. }
  13. public ActionResult Index()
  14. {
  15. //如果未登录,则跳转到登录页面
  16. if (Session["user_account"] == null)
  17. {
  18. return RedirectToAction("login", "account");
  19. }
  20. return View();
  21. }
  22. public ActionResult Post()
  23. {
  24. //如果未登录,则跳转到登录页面
  25. if (Session["user_account"] == null)
  26. {
  27. return RedirectToAction("login", "account");
  28. }
  29. var post = _postService.FindById(1).ToModel();
  30. return View(post);
  31. }
  32. }
  33. }

重新编译项目,按F5运行,再打开地址:http://localhost:54739/home/index ,发生了什么情况?
是不是被重定向到了登录页面,要求你登录?
这就对了,输入你刚才注册的用户名和密码,登录后,系统会重新带你到:http://localhost:54739/home/index 页面。

OK,今天这期的关于用户注册和登录功能就介绍到这里,本期只实现了简单的功能,在后续的教程中将重构和封装相应的功能代码,敬请期待。。。

本期源码托管地址:https://github.com/lampo1024/...
数据库脚本文件请到目录下找:TsBlogdocumentscriptsmysqlv1.8\

如果你喜欢Rector的本系列文章,请为我点个大大的赞。

看完教程如果觉得还不过瘾的,遇到问题的,想“勾对”的,欢迎加入图享网官方QQ群:483350228。有什么,你懂的。。。

谢谢你的耐心阅读,未完待续,我们下期再见……

本文来源自 码友网 《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/134954
推荐阅读
相关标签
  

闽ICP备14008679号