资讯详情

GO语言开发天天生鲜项目第三天 用户模块开发

项目分析

一.项目架构

1537518820689

二.数据库表设计

用户模块

##一.用户注册

用户必须在通过我们的网站购买商品之前登录。如果用户在我们的网站上没有账户,则必须注册。让我们来看看注册的具体实现过程(

###1.前端处理

在前端设计师获得注册的前端页面后,我们必须首先显示它,这需要在user.go在文件中,创建一个指定前端注册页面的方法。这种方法是ShowReg( ),该方法的具体实现如下:

func (this*UserController)ShowReg(){ 
            this.TplName = "register.html" } 

下面,我们来看看前端注册页面的内容:

注册页面包含用户注册时需要填写的信息,如用户名、密码、密码确认、邮箱信息等。

在这里,我们需要注意的是,为了确保用户填写信息的准确性,我们需要在这里验证用户填写的信息。关于表格的验证,我们需要使用您以前学到的内容Jquery,所以这里需要在标签中引入jquery文件:

<script type="text/javascript" src="/static/js/jquery-1.12.4.min.js"></script> 

关于具体验证的实现,前端人员已经封装在一个js文件包含:register.js

因此,还需要在标签中介绍文件:

<script type="text/javascript" src="/static/js/register.js"></script> 

下面,来看看,register.js具体实现文件如下:

$(function(){ 
             ///定义变量,默认值false。    var error_name = false;//如果用户名错误,将变量值修改为true.    var error_password = false;//如果密码错误,将变量值修改为true.    var error_check_password = false;///如果密码确认错误,变量值将修改为true.    var error_email = false;//如果邮箱出现错误,变量值将修改为true.    var error_check = false;//如果选择同意协议,变量值将修改为true.     //根据id的值,找到“user_name并绑定一个blur事件,即当文本框失去焦点时,执行相应的方法。    $('#user_name').blur(function() { 
               check_user_name();/span> }); //同上 $('#pwd').blur(function() { 
          check_pwd(); }); //同上 $('#cpwd').blur(function() { 
          check_cpwd(); }); //同上 $('#email').blur(function() { 
          check_email(); }); //根据id找到“allow”,并且绑定一个单击事件,并且判断该元素是否被选中, //如果选中了,将变量 error_check变量的值修改为false,并且将其同胞元素<span>隐藏、 //如果没有选中,将变量error_check变量的值修改为true,并且在其同胞元素<span>上打印“请勾选同意” //并且将该<span>标签显示出来。 $('#allow').click(function() { 
          if($(this).is(':checked')) { 
          error_check = false; $(this).siblings('span').hide(); } else { 
          error_check = true; $(this).siblings('span').html('请勾选同意'); $(this).siblings('span').show(); } }); //获取用户名的长度,并且进行判断其长度,如果不符合条件,显示出对应的错误提示。 function check_user_name(){ 
          var len = $('#user_name').val().length; if(len<5||len>20) { 
          $('#user_name').next().html('请输入5-20个字符的用户名') $('#user_name').next().show(); error_name = true; } else { 
          $('#user_name').next().hide(); error_name = false; } } //获取密码的长度,并且进行长度的判断,如果不符合条件,显示出对应的错误提示 function check_pwd(){ 
          var len = $('#pwd').val().length; if(len<8||len>20) { 
          $('#pwd').next().html('密码最少8位,最长20位') $('#pwd').next().show(); error_password = true; } else { 
          $('#pwd').next().hide(); error_password = false; } } //密码确认判断,获取密码框中输入的内容,同时获取“确认密码框”中输入的内容,进行比较。 //如果两个值相等,表示两次输入的密码一致,否则给出错误提示。 function check_cpwd(){ 
          var pass = $('#pwd').val(); var cpass = $('#cpwd').val(); if(pass!=cpass) { 
          $('#cpwd').next().html('两次输入的密码不一致') $('#cpwd').next().show(); error_check_password = true; } else { 
          $('#cpwd').next().hide(); error_check_password = false; } } //对邮箱格式进行校验,判断其输入的邮箱是否符合对应的格式,如果不符合,给出对应的错误提示。 //这里对邮箱格式的校验,使用了正则表达式。 function check_email(){ 
          var re = /^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$/; if(re.test($('#email').val())) { 
          $('#email').next().hide(); error_email = false; } else { 
          $('#email').next().html('你输入的邮箱格式不正确') $('#email').next().show(); error_check_password = true; } } //当用户单击“注册”按钮时,在将数据发送服务端之前,会先调用submit方法, //在该方法中,会将上面所有校验的方法进行调用,然后判断其对应的变量的值 //如果所有变量的值为false,表示校验全部通过,那么会将表单中的数据发送到服务端,否则是不会发送到服务端的。 //注意:reg_from为form标签的id属性的值,当单击“注册”这个submit按钮时,会先执行submit方法。 //只有该方法最终返回的结果为true,才会将数据发送到服务端。 $('#reg_form').submit(function() { 
          //调用上面校验的方法。 check_user_name(); check_pwd(); check_cpwd(); check_email(); //判断其变量的值,如果全部为false,表示校验全部通过,这时submit方法最终会返回true, //这时,才会将表单中的数据发送到服务端。如果submit方法最终返回的是false,就不会向服务端提交发送数据。 if(error_name == false && error_password == false && error_check_password == false && error_email == false && error_check == false) { 
          return true; } else { 
          return false; } }); }) 

###2.服务器端处理

如果,客户端校验全部成功了,就会将用户在表单中输入的数据发送到服务端。

那么,接下来我们看一下,服务端是怎样对发送过来的数据进行处理的?

####2.1:关于标签的设置

在前面的课程学习过程中,我们大家都知道,要将前端表单中的数据发送到服务端,必须给标签指定两个很重要的属性,一个是是method,一个是action,这里我们给这两个属性,指定如下两个值。

<form id="reg_form" method="post" action="/register">

对应的路由设置如下:

beego.Router("/register",&controllers.UserController{ 
        },"get:ShowReg;post:HandleReg")

通过该路由,我们知道,请求的url地址都是“/register”,如果是"get"请求,那么访问的是User控制器中的ShowReg方法(该方法前面我们定义过了),该方法就是指定对应的注册页面的路径。如果是“post"请求,会访问HandleReg方法,该方法的作用就是接收表单提交过来的数据。

那么我们接下来,就看一下HandleReg方法(因为form标签中指定的method属性的值为“post").

####2.2:HandleReg方法的处理

2.2.1:接收前端表单发送过来的数据

在这里需要注意的是:一定是根据表单元素的name属性的值来获取用户在表单中输入的数据。

//1.获取数据
userName := this.GetString("user_name")
pwd := this.GetString("pwd")
cpwd := this.GetString("cpwd")
email := this.GetString("email")
2.2.2:服务端校验

虽然在前端已经完成了表单的校验,但是为了安全,我们还需要在服务端进行校验。(因为,用户可以在浏览器端禁用javascript脚本)

服务端具体的校验过程如下:

//对接收到的数据进行非空校验
if userName == "" || pwd == "" || cpwd == "" || email == ""{ 
        
   this.Data["errmsg"] = "输入信息不完整,请重新输入!"
   this.TplName = "register.html"
   return
}
//判断“密码”和”确认密码“是否一致。
if pwd != cpwd{ 
        
   this.Data["errmsg"] = "两次输入密码不一致,请重新输入!"
   this.TplName = "register.html"
   return
}
//对邮箱格式的校验:注意这里使用的是regexp下的Compile方法。
reg,_ := regexp.Compile("^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")
res := reg.FindString(email)
if res == ""{ 
        
	this.Data["errmsg"] = "邮箱格式不正确"
	this.TplName = "register.html"
	return
}

校验成功后,我们可以将接收到的的数据,赋值给对应的user对象了。

首先,定义一个orm对象,紧接着创建一个user对象,将从表单中接收到的数据赋值给user对象中的属性。

具体实现的代码如下:

o := orm.NewOrm()
user := models.User{ 
        }
user.Name = userName
user.PassWord = pwd
user.Email = email

大家接下来,可能会想将该user对象中的数据插入到数据库中去就可以了,但是这里还有一个很重要的工作,就是要校验用户名是否重名。

2.2.3:校验用户名是否重名。

大家都知道,在注册的时候我们是不允许用户名是重名的。所以,这里我们还需要对用户输入的用户名进行校验,看一下是否有重名的情况。具体的校验过程:

根据接收到的用户名,查询一下数据库看一下是否有重名的。

通过orm对象中的Read方法来读取用户的信息,这里需要给Read方法传递上面所创建出的user对象的地址(在user对象中已经存储了用户输入的用户名),同时指定要查询的字段名称为“Name",然后判断一下返回的err信息,如果不是ErrNoRows,表明用户输入的用户名在数据库中已经存在了,那么这里我们需要指定错误信息,

并且让用户重新返回到注册页面,重新进行输入表单中的数据。而且要在注册页面中,展示一下错误的信息。

具体的实现代码如下:

err = o.Read(&user,"Name")
if err != orm.ErrNoRows{ 
        
   this.Data["errmsg"] = "用户以存在,请重新注册!"
   this.TplName = "register.html"
   return
}

在注册页面中展示一下错误信息,如下所示:

    <label>邮箱:</label>
            <input type="text" name="email" id="email">
            <span class="error_tip">提示信息</span>
         </li>
         <li class="agreement">
            <input type="checkbox" name="allow" id="allow" checked="{ 
         {.checked}}">
            <label>同意”天天生鲜用户使用协议“</label>
            <span class="error_tip2">提示信息</span>
         </li>
         <li class="reg_sub">
            <input type="submit" value="注 册" name="">
         </li>
      </ul>           
      </form>
   </div>
          {
    
       {.errmsg}}<!--------展示出对应的错误信息---------->

</div>
2.2.4:完成信息的保存

如果校验完用户名,发现没有重名的情况,那么可以将用户的信息存储到数据库中,具体实现的代码如下:

_,err = o.Insert(&user)
if err != nil { 
        
   this.Data["errmsg"] = "插入失败,请重新注册!"
   this.TplName = "register.html"
   return
}
2.2.4:发送邮件

将用户的信息,存储到数据库中以后,接下来可以给用户发送一封邮件,并且告诉用户只有去邮箱中激活以后,才能进行登录。

给用户发送邮件一个很重要的好处就是,可以判断用户在注册时输入的邮箱是否正确。

只有正确地用户邮箱,才有意义,例如:当我们的网站上架一款新产品时,可以给注册的用户发送邮件,通知其新上架的产品信息。

具体实现的过程如下:

SMTP服务器就是邮件代收发服务器,由邮件服务商提供,常见的SMTP服务器端口号:
QQ邮箱:SMTP服务器地址:smtp.qq.com(端口:587)
雅虎邮箱: SMTP服务器地址:smtp.yahoo.com(端口:587)
163邮箱:SMTP服务器地址:smtp.163.com(端口:25)
126邮箱: SMTP服务器地址:smtp.126.com(端口:25)
新浪邮箱: SMTP服务器地址:smtp.sina.com(端口:25)

要能够发送邮件首先要进行邮箱的配置,配置过程如下:

  • 给邮箱开启SMTP服务

  • 做密保验证

  • 保存授权码

第一:指定发送邮件的配置信息。

config := `{"username":"563364657@qq.com","password":"kufzjehabgesbceb","host":"smtp.qq.com","port":587}`

这里指定了发件人的邮箱名称,对应的发送密码,对应SMTP服务器,以及对应的端口号。

这里我们使用的是QQ的邮箱,所以SMTP服务器指的是QQ的SMTP服务器地址,如果发件人使用的是163的邮箱,这里需要指定的163的SMTP服务器地址:smtp.163.com

第二:根据配置信息,创建一个EMAIL的对象

temail:=utils.NewEMail(config)

第三:通过EMAIL对象中的属性。指定,发件人邮箱,收件人邮箱,邮件标题,以及邮件的内容。

temail.To = []string{ 
        user.Email}//指定收件人邮箱地址,就是用户在注册时填写的邮箱地址
temail.From = "563364657@qq.com"//指定发件人的邮箱地址,这里我们使用的QQ邮箱。
temail.Subject = "天天生鲜用户激活"//指定邮件的标题
//指定邮件的内容。该内容发送到用户的邮箱中以后,该用户打开邮箱,可以将该URL地址复制到地址栏中,敲回车键,就会向该指定的URL地址发送请求,我们在该地址对应的方法中,接收该用户的ID,然后根据该Id,查询出用户的信息后,将其对应的一个属性,Active设置为true,表明用户已经激活了,那么用户就可以登录了。
temail.HTML = "复制该连接到浏览器中激活:127.0.0.1:8088/active?id="+strconv.Itoa(user.Id)

第四:发送邮件

调用EMAIL对象中的send方法发送邮件,如果邮件发送失败,给用户相应的提示并且重新返回到注册页面,让用户填写相应的信息,如果邮件发送成功,也要给出相应的提示。

err = temail.Send()
if err != nil{ 
        
   this.Data["errmsg"] = "发送激活邮件失败,请重新注册!"
   this.TplName = "register.html"
   return
}

this.Ctx.WriteString("注册成功,请前往邮箱激活!")

发送成功后邮箱显示图下

2.2.5:HandleReg方法完整代码
//处理注册业务
func (this*UserController)HandleReg(){ 
        
   //1.获取数据
   userName := this.GetString("user_name")
   pwd := this.GetString("pwd")
   cpwd := this.GetString("cpwd")
   email := this.GetString("email")
   //2.数据校验
   if userName == "" || pwd == "" || cpwd == "" || email == ""{ 
        
      this.Data["errmsg"] = "输入信息不完整,请重新输入!"
      this.TplName = "register.html"
      return
   }
   if pwd != cpwd{ 
        
      this.Data["errmsg"] = "两次输入密码不一致,请重新输入!"
      this.TplName = "register.html"
      return
   }
   _,err:=regexp.Compile(email)
   if err != nil{ 
        
      this.Data["errmsg"] = "邮箱格式不正确"
      this.TplName = "register.html"
      return
   }
   //3.插入数据库
   o := orm.NewOrm()
   user := models.User{ 
        }
   user.Name = userName
   user.PassWord = pwd
   user.Email = email

   //4.判断用户名是否重复,如果重复重新注册
   err = o.Read(&user,"Name")
   if err != orm.ErrNoRows{ 
        
      this.Data["errmsg"] = "用户以存在,请重新注册!"
      this.TplName = "register.html"
      return
   }
   //插入数据库
   _,err = o.Insert(&user)
   if err != nil { 
        
      this.Data["errmsg"] = "插入失败,请重新注册!"
      this.TplName = "register.html"
      return
   }
   //发送邮件
   config := `{"username":"563364657@qq.com","password":"kufzjehabgesbceb","host":"smtp.qq.com","port":587}`
   temail:=utils.NewEMail(config)
   temail.To = []string{ 
        user.Email}
   temail.From = "563364657@qq.com"
   temail.Subject = "天天生鲜用户激活"

   temail.HTML = "复制该连接到浏览器中激活:127.0.0.1:8088/active?id="+strconv.Itoa(user.Id)

   err = temail.Send()
   if err != nil{ 
        
      this.Data["errmsg"] = "发送激活邮件失败,请重新注册!"
      this.TplName = "register.html"
      return
   }

   this.Ctx.WriteString("注册成功,请前往邮箱激活!")

}

2.3:邮箱激活

在上面的注册模块中,我们已经

标签: sub板端连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台