Nodejs建站笔记-注册登录流程的简单实现

news/2024/5/9 3:37:10/文章来源:https://blog.csdn.net/weixin_30951231/article/details/96414401

1. 使用Backbone实现前端hash路由

登录注册页面如下:
595796-20160415185623426-1166093578.jpg

初步设想将注册和登录作为两个不同的url实现,但登录和注册功能的差距只有form表单部分,用两个url实现显然开销过大,所以最终方案为使用hash作为前端路由,根据url的hash值切换相应的表单显示。

很多致力于SPA开发的前端框架都具备hash路由功能,考虑到嗨猫本身是一个类博客、偏重静态展示的网站,所以最后选择了轻量级的Backbone最为前端框架。

Backbone实现hash路由的代码很简单:

let $formBox = $('.box_form_container'),$navitems = $('.box_nav_item'),$nav_item_signup = $('.box_nav_item_signup'),$nav_item_login = $('.box_nav_item_login');let pwdRouter = Backbone.Router.extend({routes: {'login': 'login','signup': 'signup'},login: function() {$formBox.removeClass('box_form_container_signup').addClass('box_form_container_login');$navitems.removeClass('box_nav_item-current');$nav_item_login.addClass('box_nav_item-current');},signup: function() {$formBox.removeClass('box_form_container_login').addClass('box_form_container_signup');$navitems.removeClass('box_nav_item-current');$nav_item_signup.addClass('box_nav_item-current');}});let router = new pwdRouter();Backbone.history.start();

务必不要遗漏Backbone.history.start();,否则路由功能不会启动。

随后,将登录和注册的a标签的href分别修改为#login#signup便实现了简单的hash路由。

2. 使用jquery-validation完善前端表单验证

前端表单验证是必不可少的一项功能,前端的js代码验证表单的完整性并拦截一部分非法的表单输入,一定程度上减少服务端的压力。

初步想自己造轮子,但考虑到开发周期和轮子的成熟性,最终选择jquery-validation插件作为前端表单验证工具。

jquery-validation插件和表单元素的name属性绑定,以登录表单为例,其dom结构如下:
595796-20160415185656254-120947058.jpg

根据input控件的name属性,jquery-validation的验证代码如下:

// 登录表单添加验证规则$('.login_form').validate({rules: {signname: {required: true,signname: true},password: {required: true,norepeat: true},verifycode: {required: true}},errorPlacement: function(error, element) {let container = element.parent().find('.form_error');error.appendTo(container);container.show();},submitHandler: function(form) {var $form = $(form);let _action = $form.attr('action');$form.attr('action', '');$.ajax({type: 'post',url: _action,data: $form.serialize(),dataType: 'json'}).done(function(res) {console.log('done');if (res.code !== '100') {alert(res.msg);} else {alert('注册成功');}}).fail(function(res) {console.log('fail');}).always(function() {$form.attr('action', _action);});}});

其中signname和norepeat是自定义的验证规则,signname如下:

// 添加用户名+邮箱的双重验证规则$.validator.addMethod('signname', function(value, element) {let reg_isemail = /[@]/,reg_email =/^[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?$/i;return !reg_isemail.test(value) || (reg_isemail.test(value) &&reg_email.test(value));}, '请输入正确的用户名或邮箱');

用户可以使用用户名或邮箱登录,两者共享一个input控件,signname验证是用户名还是邮箱,如果是邮箱,便保证输入邮箱格式的正确性。

norepeat验证密码不能出现连续3次的字符

  • errorPlacement指明错误提示信息的位置,我们给它提供了一个容器。
  • submitHandler监听submit按钮,首先拦截默认的表单提交请求,替换为自定义的提交逻辑,本项目中使用ajax提交。并且为了防止用户频繁点击submit按钮造成重复提交,我们首先将form的action属性清空,待请求完毕后重新赋值

3. 使用node-canvas模块增加验证码功能

node-canvas是一个将canvas API迁移到nodejs使用的扩展模块,使用node-canvas模块可以在nodejs服务器生成图片(当然它的作用不仅限于此,但项目暂时只用到生成图片功能),下面详细讲述如何搭建登录&注册表单验证码功能。

3.1 部署node-canvas依赖环境

node-canvas需要操作系统安装底层图形库,各操作系统的依赖如下:
595796-20160415185729488-1984889322.jpg

目前开发环境为mac,简单记录一下环境部署操作以及遇到的一些坑。
首先按照上图安装底层库,由于brew安装的Cairo版本过低,将会导致canvas不正确的绘图(参考https://github.com/Automattic/node-canvas/issues/639)。这是Cairo的bug,所以必须保证Cairo版本在1.14.1以上。使用brew更新Cairo:

brew update
brew upgrade Cairo

安装成功后,在项目根目录下安装node-canvas:

npm install canvas --save-dev

至此,环境部署完毕,进入开发阶段。

3.2 服务端

打开api/controllers/Auth/AuthController,添加生成验证码图片的函数generateVerifyImg():

  generateVerifyImg: function() {var _verify = {code: '',img: ''};// 生成四位数字和字母的数字作为验证码_verify.code = Math.random().toString(16).slice(2, 6);var Image = Canvas.Image,canvas = new Canvas(60, 30),ctx = canvas.getContext('2d');var _rotate = (Math.random()).toFixed(2);ctx.fillStyle = '#ffcc99';ctx.fillRect(0, 0, 60, 30);ctx.rotate(_rotate);ctx.font = 'italic 20px serif';ctx.strokeStyle = '#424952';// 将验证码绘制进canvasctx.strokeText(_verify.code, 10, 20);// 生成验证码图片_verify.img = canvas.toDataURL('image/png');return _verify;}

然后在登录&注册的API中生成验证码图片并渲染进模板文件:

/*** @desc 登录、注册的统一入口,由前端Backbone的hash路由判断展示表单* @param req* @param res*/toAuth: function(req, res) {var _verify = this.generateVerifyImg();req.session.verifycode = _verify.code;var view = swig.renderFile('./views/passport/main.swig', {verify_img: _verify.img});return res.send(view);}

其中非常关键的一步是将验证码通过session保存,以便进行验证

随后,在接受表单post的API中加入验证码过滤逻辑:

if (!req.param('verifycode') || req.param('verifycode') !== req.session.verifycode) {return res.json({err: rescode.invalidVerifycode,msg: "验证码不正确"});}

项目至此已经具备了基本的验证码功能。验证码的一个重要需求是用户手动刷新验证码,下面简单讲述实现过程。

3.3 实现验证刷新功能

1.首先在前端js代码中添加验证码图片刷新事件监听:

$('.hc_container').on('click', '.form_img_verifycode', function() {console.log('换一换');var $img = $(this);$.ajax({url: '/getverifycode',type: 'get',dataType: 'json'}).done(function(res) {console.log('getverifycode success');$img.attr('src', res.img);}).fail(function(res) {console.log('getverifycode failed');});});

2.然后配置sails的config/route.js

// 刷新验证码'get /getverifycode': 'Auth/AuthController.getVerifyImg'

3.在Auth/AuthController中添加getVerifyImg()API接受前端的验证码刷新请求:

getVerifyImg: function(req, res) {var _verify = this.generateVerifyImg();req.session.verifycode = _verify.code;return res.json({'img': _verify.img});}

这个API功能非常简单,获取新的验证码图片并返回给前端,但是必须谨记将验证码通过session记录。

前端通过ajax获取到新的验证码图片url替换旧图即可。

4. 实现登录&注册成功后的页面跳转

由前端js控制跳转,目前统一跳转到首页:

window.location.href='/';

转载于:https://www.cnblogs.com/ihardcoder/p/5396588.html

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

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

相关文章

搜索引擎优化(SEO)解决方案

搜索引擎优化(SEO)解决方案 在此之前,希望大家能重新审视搜索引擎,通俗来讲就是我们日常所用的百度、谷歌、搜狗、雅虎等。磨刀不误砍柴工,知己知彼,百战不殆! 一、搜索引擎是什么? …

关于大型网站技术演进的思考(一)--存储的瓶颈(1)

转自:http://www.cnblogs.com/sharpxiajun/p/4237704.html 前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训,两天12个小时信息量非常大,知识的广度和难度也非常大,培训完后我很难完整理出全部听到的知识&a…

怎样高效利用PPT模板网站找到适合自己的PPT模板

我相信许多人喜欢在需要制作PPT时制作PPT。虽然我已经学到了很多PPT制作技巧,但我也收集了很多图片,图标,PPT模板等,但是当我真正使用它时,我仍然不知道该怎么做,然后我只是用了模板直接,节省时…

电子商务网站比较常用的缓存策略架构

缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。 这次主要是分享下自己觉得比较通用的一个缓存策略的架构方案,也是比较 容易理解的.欢迎吐槽. 有更牛逼的也欢迎大家说下: 缓…

Cookie注入靶场:模拟公司网站

靶场 这是一个靶场的样子 随意点击一个连接,发现是有id号的,但是id前面有shownews.asp这个东西。这个就是典型的Cookie注入标志 Cookie注入标志 有着如同.asp?idxxx的url通常我们先去掉前面的?idxxx 看它是否显示正常,如果不正常&#x…

css 背景透明_想给网站换个背景图?这个神器提供超多免费素材

网页比较少有背景图需求,多半都是以单色为主,如果觉得略显单调,也能使用纹理材质或渐层色做为背景,例如 Paper-co 就有许多日系的纸张纹理材质可用做背景,不仅看起来可以提升质感,也不会影响阅读造成负担&a…

python检测端口是否被占用_「查看端口占用」Windows下如何查看某个端口被谁占用并强制关闭 - seo实验室...

查看端口占用一、查看那个端口被调用我告诉大家一个方法,^_^。1、 开始—->运行—->cmd,或者是windowR组合键,调出命令窗口;2、输入命令:netstat -ano,列出所有端口的情况。在列表中我们观察被占用的…

SEO深度解读之HITS链接分析算法

HITS(Hyperlink - Induced Topic Search)链接分析算法诞生在1997年,该算法是由康奈尔大学中的一位博士提出,并且该算法沿用于全球多个搜索引擎当中。当然,不同的搜索引擎针对于该算法的侧重点和内部公式都有不一的算法结构调整,并…

linux smb 远程,测试过程、扩展研究 - Linux系统下用smbclient命令来访问Windows共享_Linux教程_Linux公社-Linux系统门户网站...

基本测试过程如下:1、 访问c$共享:[rootrh root]# smbclient //192.168.60.188/c$ -U cmwPassword:smb: \> cd winntsmb: \winnt\>2、 访问temp共享(启用guest帐户)[rootrh root]# smbclient //192.168.60.188/tempPassword:(未输入任何密码)smb: …

《网站情感化设计与内容策略》一1.6 情感和记忆

本节书摘来自异步社区《网站情感化设计与内容策略》一书中的第1章,第1.6节,作者 【美】Aarron Walter , Erin Kissane,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 情感和记忆 情感体验在我们的长期记忆中会留下深刻的印记。我…

网站的第一印象

个人觉得商业网站的风格还是简洁点好,看起来舒服,就可以了,没必要去追求什么视觉冲击力。如果是个人主页做得个性点,要求视觉冲击力,可以让人留下深刻的印象,不过要求视觉冲击力的个人主页,一般…

百度网站收录教程(个人版)

让百度搜索到有两种方法,一种是等百度主动来爬取你的网站,还有一种是你自己主动提交给百度告诉它来爬取。第一种周期太过漫长,所以本文就讲第二种 1.准备网站 首先,想要做SEO的同学,需要考虑清楚所选择的前端框架。现在…

超神奇的四个在线网站,万万没想到他们竟然这么好用!

说起一下在线网站我们多多少少能够知道一些比较好用的网站,但是今天小编要分享的这些网站要比我们之前介绍的一些网站还要好用!你们准备好了吗? 一.放大图片 网址:http://waifu2x.udp.jp/index.zh-CN.html 图片太小?想…

c语言 界面编程 毕业设计,《C语言程序设计》课程网站的设计与实现(ASP.NET,SQL)...

《C语言程序设计》课程网站的设计与实现(asp.NET,SQL)(毕业论文12000字,程序代码,SQLserver数据库)本课程网站采用C#语言和asp.net技术并利用SqlSever数据库进行开发,结合了B/S框架技术,实现课程教学管理新方式,主要是针对管理员,…

网站截图工具EyeWitness

2019独角兽企业重金招聘Python工程师标准>>> 网站截图工具EyeWitness 在网页分析和取证中,往往需要大批量的网站截图。Kali Linux提供了一款网站批量截图工具EyeWitness。该工具不仅支持网址列表文件,还支持Nmap和Nessus报告文件。在Web请求的…

php qq授权_网站接入QQ登录(PHP版)【最新教程 05.14更新】,亲身失败百次的总结...

开发阶段(偏前端的同学可以查看 JS版 教程)3.1. QQ互联 官网提供了 SDK 以及对应的 示例代码,但是为了帮助同学们更好理解,我进行了部分删减,力求最简单的方法实现目的。官方SDK3.2. 因为是写教程,所以代码就尽量简单明了一点。实…

服务器网站首页被被修改,为什么网站首页被降权 原因和解决方法分析

小小课堂seo:最近看到不少人再说网站首页被百度搜索引擎降权,到底为什么首页会被降权?我们可以做哪些调整来恢复网站首页权重?今天,小小课堂网为大家带来的是网站首页被降权的原因和解决方法。小小课堂seo希望对大家有所帮助。一、为什么网…

好资源网站

正文字体大小:大 中 小好资源网站 (2011-01-06 11:31:17) 转载▼标签: it 分类: 电子商务1.酷网代码;http://www.5icool.org非常不错 网页特效---焦点幻灯图片特效 导航菜单 广告代码 在线客服 表单按钮 其它特效 网页教程----HTML CSS Jav…

高斯模糊java代码_“网站变灰”背后的代码实现

在刚刚过去的几个月里,我们的国家经历了非常惨痛的时刻,很多英雄在救助和保护他人的路上倒下。前天(4月4日),清明节,全国降半旗,10点全国默哀三分钟,以致敬英雄和缅怀逝去的同胞们。当天一切公共娱乐活动也…

基于WebSphere与Domino的电子商务网站构架分析

转载于:https://blog.51cto.com/chenguang/470852