ASP.NET Core 一步步搭建个人网站(2)_一键部署和用户注册登录

news/2024/5/13 15:46:41/文章来源:https://blog.csdn.net/weixin_34122548/article/details/94584418

俗话说,磨刀不费砍柴工。为了更方便的进行项目管理,我们先将个人网站项目配置一下,满足以下2个目标:

  • VS2017中支持Git存储库,绑定Github项目,实现本地VS程序与线上Github一键代码提交和同步;
  • 搭建服务器FTP站点,VS2017中配置一键部署网站文件到服务器;

有了以上的配置,我们可以不用每次拉取和同步我们的程序到Github中,也不用每次在本地发布,拷贝服务器,我们只用在VS2017中简单的一键同步到Github或网站服务器。这样我们的开发效率有了很大的提高,也方便线上验证我们的程序代码。

VS2017支持Github

选择 工具-->扩展和更新,搜索GitHub,安装GitHub的VS插件

安装完插件,打开视图-->团队资源管理器,我们可以看到Git插件菜单。通过菜单我们可以新建Git存储库,可以提交修改的代码,并一键同步提交后的代码到自己的GitHub项目中。

        

再打开GitHub,可以看我们的代码已经同步了,是不是很方便?

VS2017支持FTP远程发布

要VS支持FTP发布,首先要将网站服务器配置成FTP服务器。

Server2008添加新的角色,选中文件服务并安装新角色:

再次选中已安装的IIS服务,增加FTP服务器相关的角色:

接着,在IIS网站右键选择“添加FTP站点”,选择FTP文件物理路径和添加站点名称:

端口默认21,不用选择SSL证书,身份验证这里选择基本验证(为了一定的安全性,不要勾选匿名),授权访问里,指定administrator才能访问FTP站点,并具有读取和写入的权限;

完成后,我们建好的FTP就自动启动了,这时浏览器中输入ftp://localhost,输入用户名和密码,就可以访问对应的文件目录了。当然,我们外网还是无法访问,为什么呢?相信大家看过上一篇,应该知道是防火墙的原因,我们按照上一篇的配置,增加FTP 21端口的允许入站规则,这样我们外网就通过FTP访问网站发布目录。

配置完外网服务器,我们来配置一下本地VS2017,右键项目-->发布,选择FTP发布,选项配置如下:

这样我们就已经配置好本地一键发布站点到远程服务器了。以后直接点发布按钮,就可以看到自动将生成的发布文件,同步到网站服务器:

替换前端框架

准备工作做完,浏览器输入网站服务器IP,可以看到可以正常访问,但是.net core mvc帮我们自动生成的界面,不一定符合我们的需求,那还是自己找一个前端的UI框架,替换一下既有界面。这里我选择的是 AdminLTE ,这是一个基于 bootstrap 的轻量级后台模板,相关的资料大家可以去官网研究一下。

我们把下载的文件解压缩到wwwroot/lib目录下,第一步先重构一下登录的界面:

 1 @model LoginViewModel
 2 
 3 @{
 4     Layout = null;
 5     ViewData["Title"] = "登录";
 6 }
 7 
 8 <!DOCTYPE html>
 9 <html>
10 <head>
11     <meta charset="utf-8" />
12     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
13     <title>@ViewData["Title"] - LanceL0t</title>
14 
15     @await Html.PartialAsync("_SiteCssPartial")
16 </head>
17 <body class="hold-transition login-page">
18     <div class="login-box">
19         <div class="login-box-body">
20             <p class="login-box-msg">欢迎,由此登录</p>
21             <form asp-route-returnurl="@ViewData["ReturnUrl"]" method="post">
22                 <div asp-validation-summary="All" class="text-danger"></div>
23                 <div class="form-group has-feedback">
24                     <input asp-for="Email" class="form-control" placeholder="邮箱">
25                     <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
26                 </div>
27                 <div class="form-group has-feedback">
28                     <input asp-for="Password" class="form-control" placeholder="密码">
29                     <span class="glyphicon glyphicon-lock form-control-feedback"></span>
30                 </div>
31                 <div class="row">
32                     <div class="col-xs-8">
33                         <div class="checkbox icheck">
34                             <label asp-for="RememberMe">
35                                 <input asp-for="RememberMe"> @Html.DisplayNameFor(m => m.RememberMe)
36                             </label>
37                         </div>
38                     </div>
39                     <div class="col-xs-4">
40                         <button type="submit" class="btn btn-primary btn-block btn-flat">登录</button>
41                     </div>
42                 </div>
43             </form>
44             <div class="social-auth-links text-center">
45                 <p>- 或者 -</p>
46                 <a href="#" class="btn btn-block btn-social btn-facebook btn-flat">
47                     <i class="fa fa-facebook"></i> Sign in using
48                     Facebook
49                 </a>
50                 <a href="#" class="btn btn-block btn-social btn-google btn-flat">
51                     <i class="fa fa-google-plus"></i> Sign in using
52                     Google+
53                 </a>
54             </div>
55             <a asp-action="ForgotPassword">忘记密码</a><br>
56             <a asp-action="Register" asp-route-returnurl="@ViewData["ReturnUrl"]" class="text-center">立即注册</a>
57         </div>
58     </div>
59 </body>
60 </html>
61 
62 @await Html.PartialAsync("_SiteScriptsPartial")
63 @await Html.PartialAsync("_ValidationScriptsPartial")

接着第二步,优化一下之前的新用户注册界面:

 1 @model RegisterViewModel
 2 
 3 @{
 4     Layout = null;
 5     ViewData["Title"] = "注册";
 6 }
 7 
 8 <!DOCTYPE html>
 9 <html>
10 <head>
11     <meta charset="utf-8" />
12     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
13     <title>@ViewData["Title"] - LanceL0t</title>
14 
15     @await Html.PartialAsync("_SiteCssPartial")
16 </head>
17 <body class="hold-transition login-page">
18     <div class="login-box">
19         <div class="login-box-body">
20             <p class="login-box-msg">欢迎,注册新用户</p>
21             <form asp-route-returnurl="@ViewData["ReturnUrl"]" method="post">
22                 <div asp-validation-summary="All" class="text-danger"></div>
23                 <div class="form-group has-feedback">
24                     <input asp-for="Email" class="form-control" placeholder="请输入邮箱">
25                     <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
26                 </div>
27                 <div class="form-group has-feedback">
28                     <input asp-for="Password" class="form-control" placeholder="请输入密码">
29                     <span class="glyphicon glyphicon-lock form-control-feedback"></span>
30 
31                 </div>
32                 <div class="form-group has-feedback">
33                     <input asp-for="ConfirmPassword" class="form-control" placeholder="请确认密码">
34                     <span class="glyphicon glyphicon-lock form-control-feedback"></span>
35                 </div>
36                 <div class="row">
37                     <div class="col-xs-8">
38                         <div class="checkbox icheck">
39                             <label asp-for="IsAgree">
40                                 <input asp-for="IsAgree"> 阅读并接受《<a href="#">用户协议</a>41                             </label>
42                         </div>
43                     </div>
44                     <div class="col-xs-4">
45                         <button type="submit" class="btn btn-primary btn-block btn-flat">注册</button>
46                     </div>
47                 </div>
48             </form>
49             <div class="social-auth-links text-center">
50                 <p>- 或者 -</p>
51                 <a href="#" class="btn btn-block btn-social btn-facebook btn-flat">
52                     <i class="fa fa-facebook"></i> Sign in using
53                     Facebook
54                 </a>
55                 <a href="#" class="btn btn-block btn-social btn-google btn-flat">
56                     <i class="fa fa-google-plus"></i> Sign in using
57                     Google+
58                 </a>
59             </div>
60             <a asp-controller="Account" asp-action="Login">已有账号</a><br>
61         </div>
62     </div>
63 </body>
64 </html>
65 
66 @await Html.PartialAsync("_SiteScriptsPartial")
67 @await Html.PartialAsync("_ValidationScriptsPartial")

这里的知识很简单,就不在祥述了,不过因为用的是.net core提供的identity用户管理和验证,有些个人遇到的问题,我还是列出来,以免再走弯路。

自定义的服务器端和客户单的验证

比如,新用户注册时,要保证用户已勾选“阅读并接受用户协议”。而MVC本身校验机制没有提供bool型必须为true的校验,这里我们自己实现一个服务器端属性的校验,需要继承

  ValidationAttribute和IClientModelValidator:

 1 /// <summary>
 2 /// 复选框必须选中验证
 3 /// </summary>
 4 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
 5 public sealed class MustBeTrueAttribute : ValidationAttribute, IClientModelValidator
 6 {
 7     //服务器端验证
 8     public override bool IsValid(object value)
 9     {
10         return value != null && (bool)value;
11     }
12 
13     public void AddValidation(ClientModelValidationContext context)
14     {
15         MergeAttribute(context.Attributes, "data-val", "true");
16         var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
17         MergeAttribute(context.Attributes, "data-val-mustbetrue", errorMessage);
18     }
19 
20     private bool MergeAttribute(
21         IDictionary<string, string> attributes,
22         string key,
23         string value)
24     {
25         if (attributes.ContainsKey(key))
26         {
27             return false;
28         }
29         attributes.Add(key, value);
30         return true;
31     }
32 }

再加上客户端的验证方法:

 1 <script>
 2     //必须复选框勾选验证
 3     $.validator.addMethod("mustbetrue",
 4         function (value, element, parameters) {
 5             return value === "true";
 6         });
 7 
 8     $.validator.unobtrusive.adapters.add("mustbetrue", [], function (options) {
 9         options.rules.mustbetrue = {};
10         options.messages["mustbetrue"] = options.message;
11     });
12 </script>

identity的本地化

目前使用identity默认的错误描述是英文,这里我们需要显示成中文,所以新增一个IdentityExtensions类,继承IdentityErrorDescriber,重写错误描述 

 1 public class IdentityExtensions : IdentityErrorDescriber
 2 {
 3     public override IdentityError PasswordRequiresNonAlphanumeric()
 4     {
 5         return new IdentityError
 6         {
 7             Code = nameof(PasswordRequiresNonAlphanumeric),
 8             Description = "密码至少包含1位非数字字母的特殊字符"
 9         };
10     }
11 
12     public override IdentityError PasswordRequiresDigit()
13     {
14         return new IdentityError
15         {
16             Code = nameof(PasswordRequiresDigit),
17             Description = "密码至少包含1位数字('0'-'9')"
18         };
19     }
20 
21     public override IdentityError PasswordRequiresLower()
22     {
23         return new IdentityError
24         {
25             Code = nameof(PasswordRequiresLower),
26             Description = "密码至少包含1位小写字符 ('a'-'z')"
27         };
28     }
29 
30     public override IdentityError PasswordRequiresUpper()
31     {
32         return new IdentityError
33         {
34             Code = nameof(PasswordRequiresUpper),
35             Description = "密码至少包含1位大写写字符 ('A'-'Z')"
36         };
37     }
38 }

重写中文错误描述后,我们还得在Startup.cs文件中的服务配置中注册:

 1 public void ConfigureServices(IServiceCollection services)
 2 {
 3     services.AddDbContext<ApplicationDbContext>(options =>
 4     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
 5 
 6     services.AddIdentity<ApplicationUser, IdentityRole>()
 7     .AddEntityFrameworkStores<ApplicationDbContext>()
 8     .AddDefaultTokenProviders()
 9         .AddErrorDescriber<IdentityExtensions>();
10 
11     // Add application services.
12     services.AddTransient<IEmailSender, EmailSender>();
13 
14     services.AddMvc();
15 }

登录和注册新用户没有问题了,再来改造一下登录后主页的布局,把_Layout布局视图分割成顶部区域、左侧导航菜单、内容区域、底部区域、右侧侧边栏,并用部分视图分别渲染:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="utf-8" />
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 6     <title>@ViewData["Title"] - LanceL0t</title>
 7 
 8     @await Html.PartialAsync("_SiteCssPartial")
 9 </head>
10 <body class="hold-transition skin-blue sidebar-mini">
11     <div class="wrapper">
12         <!-- 顶部区域 -->
13         @await Html.PartialAsync("_LayoutHeaderPartial")
14         <!-- 导航栏 -->
15         @await Html.PartialAsync("_LayoutNavbarPartial")
16         <!-- 内容区域 -->
17         <div class="content-wrapper">
18             <section class="content-header">
19                 <h1>
20                     Dashboard
21                     <small>Version 2.0</small>
22                 </h1>
23                 <ol class="breadcrumb">
24                     <li><a href="#"><i class="fa fa-dashboard"></i> 主页</a></li>
25                     <li class="active">Dashboard</li>
26                 </ol>
27             </section>
28             <section class="content">
29                 @RenderBody()
30             </section>
31         </div>
32         <!-- 底部区域 -->
33         @await Html.PartialAsync("_LayoutFooterPartial")
34         <!-- 侧边栏 -->
35         @await Html.PartialAsync("_LayoutSidebarPartial")
36     </div>
37 
38     @await Html.PartialAsync("_SiteScriptsPartial")
39     @RenderSection("Scripts", required: false)
40 </body>
41 </html>

这样,我们登录和注册功能大体完成了,我们看下效果:

转载于:https://www.cnblogs.com/lizzie-xhu/p/7999851.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_716161.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站Web项目树形菜单的实现过程(ExtJS+SpringMVC+Spring+Hibernate+MySQL)

常见的OA或者bbs或者网站&#xff0c;左侧往往带有菜单&#xff0c;使用者就可以通过菜单项进入响应的功能模块或者板块或者专区&#xff0c;如下所示&#xff1a;PKU的BBS明显使用了ExtJS的海王星主题&#xff0c;而且使用的就是普通的tabPanel组件实现的菜单。如下图下图是Ex…

Linux配置虚拟网站主机

1.1 问题本例要求以案例1的结果为基础&#xff0c;通过httpd网站服务器实现虚拟主机的支持&#xff0c;完成下列任务&#xff1a; 1&#xff09;修改 /etc/hosts 文件&#xff0c;临时解决DNS名称识别问题 在文件尾添加“Web服务器IP地址 tts8.tedu.cn ne.tedu.cn”内容2&#…

学python还是php_米凯seo: 到底是学Python、PHP还是Ruby?

编程语言种类繁多&#xff0c;每种语言都有它们的独特的优势。开发者在对编程语言的进行选择时往往很讲究。因此&#xff0c;这篇文章将从各个角度对 PHP、Ruby、Python 三种当前比较流行的语言的优势和劣势进行对比&#xff0c;希望你能从中受益。 在进入主题之前&#xff0c;…

专业团队:推荐一个网站,生成巨幅文字注释

通过学习本文的知识&#xff0c;你将可以在你的项目代码里创造大量的注释。让你的注释闪瞎团队所有人的钛合金X眼&#xff0c;我们是专业团队。 Console.WriteLine(" ██╗ ██╗ █████╗ ██╗ ████████╗███████╗██████╗ ██╗ …

学习python必备的学习网站

Django框架学习必备网站&#xff1a; 官方网站 https://www.djangoproject.com/1.11版英文文档 https://docs.djangoproject.com/en/1.11/1.11版中文文档 https://yiyibooks.cn/xx/Django_1.11.6/index.htmlDjango Book 教程 https://djangobook.com/Flask框架学习必备…

大型系统的java中间件实践_《大型网站系统与JAVA中间件实践》读书笔记-消息中间件...

消息中间件1.消息中间件的价值1.1 透过示例看消息中间件对应用的解耦1.1.1.通过服务调用让其他系统感知事件发生的方式假设我们要做一个用户登录系统&#xff0c;其中需要支持的一个功能是&#xff0c;用户登录成功 后发送一条短信到用户的手机&#xff0c;算是一个用户安全的选…

基于django的视频点播网站开发-step3-注册登录功能...

用户注册登录是一个网站的基本功能&#xff0c;django对这部分进行了很好的封装&#xff0c;我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果。在本讲中&#xff0c;我们会用到user中的用户授权方面的一些函数&#xff0c;还会对django中的user进行扩展&…

vueweb端响应式布局_壹起航:三点看出响应式网站建设好不好

有许多人听说过响应式网站模板(yiqihang.cn)&#xff0c;也有人没有听说过响应式网站&#xff0c;有人说响应式网站作用不错&#xff0c;有人说响应式网站没有都去了解过&#xff0c;不好说终究好不好。那么响应式网站建设有哪些优势和缺点呢&#xff0c;如何知道这个响应式网站…

java 开发适合开发什么网站_Java开发这必备的10个参考网站,学习效率直线飙升...

作为开发者来说&#xff0c;必备的除了对编码的热情还要有自己的一套技巧&#xff0c;另外不可缺少的就是平时学习的网站。以下千锋广州Java小编收集的 Java 开发者必备的网站&#xff0c;这些网站可以提供信息、以及一些很棒的讲座 &#xff0c; 还能解答一般问题、面试问题等…

转:Chrome浏览器查看网站登录 Cookie 信息的方法

当我们使用自动签到等程序的时候一般都要用到网站Cookie&#xff0c;我们可以借助浏览器的扩展来获取Cookie信息&#xff0c;但其实通过浏览器本身的功能就可以查看Cookie信息。以Chrome类浏览器为例有以下三种方法。 chrome浏览器&#xff1a; 方法一&#xff1a; 1.打开设…

php seo技巧,十个对排名最有效的SEO​技巧

十个对排名最有效的SEO技巧。做网站排名的人都知道&#xff0c;一个网站能否达到设定的排名值是需要许多的技巧&#xff0c;这些SEO的技巧对于网站的排名来说有着不可替代的作用&#xff0c;在平时的优化当中细细留心&#xff0c;一定会对网站的排名优化有所帮助!第一&#xff…

2017-11-28 在线编程网站对中文代码的支持

参考哪些比较好的在线编程网站&#xff1f;, 测试各个网站对中文命名的代码的支持, 包括调试信息等(见向LeetCode报告编译信息中Unicode显示问题). 有趣的是, 在范围有限的评测中, 国产的在线编程网站似乎对中文命名的代码普遍支持更好. 不知开发者是否对这个功能有特别的关注,…

第14.3节 使用google浏览器获取网站访问的http信息

为了简单处理&#xff0c;本次介绍的内容是基于网站已经登录的情况下去获取网页访问的http信息。 首先需要使用谷歌浏览器登录指定网站&#xff0c;并访问需要爬取的网页&#xff0c;如老猿使用谷歌浏览器登录csdn&#xff0c;并访问老猿Python的主页&#xff1a;https://blog.…

第14.4节 使用IE浏览器获取网站访问的http信息

上节《第14.3节 使用google浏览器获取网站访问的http信息》中介绍了使用Google浏览器怎么获取网站访问的http相关报文信息&#xff0c;本节介绍IE浏览器中怎么获取相关信息。以上节为基础&#xff0c;部分http相关知识在此不再介绍。 步骤1&#xff1a;登录网站并打开准备获取…

linux启动mysql_【实战演练】Linux操作系统05-用LAMP搭建网站

#本文欢迎转载&#xff0c;转载请注明出处和作者。前面已经介绍过linux安装与基本命令以及用yum源安装程序了。今天开始讲述如何在linux里面搭建一些服务&#xff0c;其中&#xff0c;我们先搭建一个网站。由于只是聊的linux搭建服务的操作&#xff0c;所以是不涉及任何的网站开…

织梦网站如何上传服务器还原,织梦网站上传恢复数据后台显示错误的解决方法...

关于dede织梦网站后台恢复数据后无法正常访问的问题之前群里有个朋友问我在本地测试后网站后台没有问题&#xff0c;第一次上传后也没有问题&#xff0c;为什么恢复数据后出现了问题呢&#xff1f;后台左侧选项有些内容根本不显示&#xff1f;甚至有些页面无法访问&#xff1f;…

简单几行Python代码,爬取网站图片

Python的语法很简单容易上手&#xff0c;适合拿来做爬虫&#xff0c;我做了一个简单地爬取下载网站图片 一、找到你想要爬取图片的链接地址 二、当然是编写我们的Python代码 Python版本是 3.6.2 #codeing utf-8 #官方3.0版本已经把urllib2,urlparse等五个模块都并入了urll…

文本编辑工具_所见即所得,网站页面的文本编辑器

所见即所得&#xff0c;不是很熟悉这个词吗&#xff1f;所见即所得代表什么&#xff0c;你看到的就是你得到这通常意味着一个编辑应用程序使用&#xff0c;以说明正在编辑的内容将完全一样的最终结果。与其他文本编辑器相比&#xff0c;“所见即所得” 文本编辑器非常友好。它指…

Curler 超简单免费网站监测工具,30秒轻松完成相关设定

作为网站的管理者&#xff0c;应该会想怎样确定网站是不是随时都能够进行访问&#xff0c;如果无法进行访问&#xff0c;也至少要在最短时间内收到通知&#xff0c;才能以最快时间进行问题查证和处理&#xff0c;减少因无法访问造成的损失。 本文推荐的Curler是一款超级简单的…

网站,越简单越好

今天客户问我一个问题&#xff0c;我当下是不知道怎么回答&#xff0c; 你设计的网站都偏向简单风格&#xff0c;但是这个网站&#xff08;指案子&#xff09;是偏向传统复杂的&#xff1f;你 OK 吗&#xff1f; 原文已经忘记&#xff0c;不过大意即使如此。说真的我当下&#…