购物网第二阶段总结笔记3:用户注册模块

事先工作:

【1】建立用户表:

 分析静态页面的用户信息,可以得出用户表所需的字段,建立用户表Shop_user:

 

 注意:

isopenemail:0表示不公开,1表示公开   默认绑定0

type:用户类型   默认绑定   普通会员normal

sex:男1  女0   保密2  默认绑定为2

其他字段默认值,int 为:0  其他为空:''

 

 

建立用户登录日志表Shop_login_log:

 

 

【2】:使用动软生成器生成代码,并拷贝到项目对应位置。

 

 正式工作:

【1】建立一个页面reg1.aspx,用于显示注册协议,当点击同意协议的时候,进入reg2.aspx页面,没什么好说的。

【2】建立一个reg2.aspx页面,用于用户提交表单,然后后台cs代码把用户提交的注册信息添加到数据库中。

技巧:写后台代码,先写最理想化的状态代码,即不做检验,先把主干代码写出,然后再完善。

 

【一】:理想化的注册cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Web
{
    public partial class reg2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        //重置
        protected void btnReset_Click(object sender, EventArgs e)
        {
            txtusername.Text = "";
            txtanswer.Text = "";
            txtpwd.Text = "";
            txtcpwd.Text = "";
            txtquestion.Text = "";
            txtemail.Text = "";
        }

        //提交信息
        protected void btnSub_Click(object sender, EventArgs e)
        {
            string username = txtusername.Text.Trim();
            string pwd = txtpwd.Text.Trim();
            string cpwd = txtpwd.Text.Trim();
            string email = txtemail.Text.Trim();
            string answer = txtanswer.Text.Trim();
            string question = txtquestion.Text.Trim();

           int res= new MyShop.DAL.UserDAO().Add(new MyShop.Model.User() { 
            username=username,
            password=pwd,
            email=email,
            answer=answer,
            question=question            
            });

           if (res>0)
           {
               Page.ClientScript.RegisterStartupScript(Page.GetType(),"MsgBox","<script>alert('注册成功!')</script>");
               return;
           }
           else
           {
               Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('注册失败,请联系管理员!')</script>");
               return;
           }
                  
        }
    }
}

 

【二】:进一步完善,对用户注册进行验证:

 

如何获取正则表达式:

方式1:利用VS自带的验证控件

 

方法二:利用软件:RegexBuddy


 

 

完善后的代码:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;

namespace Web
{
    public partial class reg2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        //重置
        protected void btnReset_Click(object sender, EventArgs e)
        {
            txtusername.Text = "";
            txtanswer.Text = "";
            txtpwd.Text = "";
            txtcpwd.Text = "";
            txtquestion.Text = "";
            txtemail.Text = "";
        }

        //提交信息
        protected void btnSub_Click(object sender, EventArgs e)
        {
            string username = txtusername.Text.Trim();
            string pwd = txtpwd.Text.Trim();
            string cpwd = txtpwd.Text.Trim();
            string email = txtemail.Text.Trim();
            string answer = txtanswer.Text.Trim();
            string question = txtquestion.Text.Trim();

            if (username.Length == 0 | pwd.Length == 0 || cpwd.Length == 0 || email.Length == 0 || answer.Length == 0 || question.Length == 0)
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('请把信息填写完整!')</script>");
                return;
            }
            if (pwd != cpwd)
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('两次输入的密码不一致!')</script>");
                return;
            }

            if (!Regex.IsMatch(pwd, "^[a-zA-Z0-9]{6,20}{1}quot;))
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('密码长度必须大于6个字符小于20个字符,只能为英语字、数字,例如:snsn2003等!')</script>");
                return;
            }

            if (!Regex.IsMatch(email, @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"))
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('电子邮件格式错误!')</script>");
                return;
            }
            int res = new MyShop.DAL.UserDAO().Add(new MyShop.Model.User()
            {
                username = username,
                password = pwd,
                email = email,
                answer = answer,
                question = question
            });


            txtusername.Text = "";
            txtanswer.Text = "";
            txtpwd.Text = "";
            txtcpwd.Text = "";
            txtquestion.Text = "";
            txtemail.Text = "";

            if (res > 0)
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('注册成功!')</script>");
                return;
            }
            else
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('注册失败,请联系管理员!')</script>");
                return;
            }

        }
    }
}


上面代码的缺陷:验证这个功能不能只写在服务器上(服务器上的验证也是必须的,这样可以更保险地保证添加到数据库中的数据的正确性),应该在客户端进行验证,能在客户端做的事情不要放在服务器上去做!

进一步完善:

注意:

1:在客户端进行验证(用JS进行验证):Button控件有一个属性,OnClientClick   ,这个属性可以绑定客户端的JS函数,如果绑定的函数执行成功,则进一步执行OnClick绑定的后台函数。

2:在JS中,是通过

<script type="text/javascript">
    var name = document.getElementById('txtname').value;
    alert(name);
</script>

 

来获取控件的值,但是这种方法在使用母版页的服务器程序中,是获取不到控件的值的,执行会弹出错误的提示:


通过前台运行页面的HTML代码,可以看到在后台我们为TextBox绑定的id,在这里都变成了

 id="ContentPlaceHolder1_txtusername"

 

解决办法:使用<%=txtusername.ClientID %>来转换,把服务器控件id转换成HTML控件id

<script type="text/javascript">
    var name = document.getElementById('<%=txtusername.ClientID %>').value;
    alert(name);
</script>

3:在js中使用正则表达式

在var reg=//g;的双斜杠中间放正则表达式。

 

最后aspx代码中验证的JS代码如下:

 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<script type="text/javascript">
    function checkform() {
        var name = document.getElementById('<%=txtusername.ClientID %>').value;
        var pwd = document.getElementById('<%=txtpwd.ClientID %>').value;
        var cpwd = document.getElementById('<%=txtcpwd.ClientID %>').value;
        var email = document.getElementById('<%=txtemail.ClientID %>').value;
        var question = document.getElementById('<%=txtquestion.ClientID %>').value;
        var answer = document.getElementById('<%=txtanswer.ClientID %>').value;
        if (name.length == 0||pwd.length==0||cpwd.length==0||email.length==0||question.length==0||answer.length==0) {
            alert('请把资料填写完整!');

        return false;
        }
        if (pwd != cpwd) {
            alert("两次输入的密码不同,请重新输入!");
            return false;
        }
        var reg = /^[a-zA-Z0-9]{6,20}$/g;
        if (!reg.test(pwd)) {
            alert("密码长度必须大于6个字符小于20个字符,只能为英语字、数字,例如:snsn2003等。 ");
            return false;
        }

        reg = /\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/g;
        if (!reg.test(email)) {
            alert("email的格式不正确,请重新输入! ");
            return false;
        }
        return true;
    }
</script>
</asp:Content>


【三】:最后完善用户注册模块

 

1:验证用户名是否已经注册(防止同一用户名重复注册)

在UserDAO中添加一个方法,用来判断用户名是否存在

        //判断用户名是否存在
        public bool Exists(string username)
        {
            Database db = DatabaseFactory.CreateDatabase();
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select count(1) from Shop_user where username=@username ");
            DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString());
            db.AddInParameter(dbCommand, "username", DbType.String, username);
            int cmdresult;
            object obj = db.ExecuteScalar(dbCommand);
            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }
            if (cmdresult == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }


cs里面验证:

             MyShop.DAL.UserDAO udao = new MyShop.DAL.UserDAO();

            if (udao.Exists(username))
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('用户名已存在!')</script>");
                return;
            }


缺点:这样验证和上面的验证一样,没有在客户端进行。

 

 

解决之道:AJAX+JQuery进行前台验证用户名(并把上面的JS代码用重写一下),JQuery中提供了trim函数可以去掉文本框中的空格

 (1)重写代码:

1:在项目中新建一个文件夹jquery,用来存放jquery文件:jquery-1.6.1.min.js

2:把jquery-1.6.1.min.js用鼠标拖到aspx代码中。

 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<script src="jquery/jquery-1.6.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
    function checkform() {
        var name = $.trim($('#<%=txtusername.ClientID %>').val());
        var pwd = $.trim($('#<%=txtpwd.ClientID %>').val());
        var cpwd = $.trim($('#<%=txtcpwd.ClientID %>').val());
        var email = $.trim($('#<%=txtemail.ClientID %>').val());
        var question = $.trim($('#<%=txtquestion.ClientID %>').val());
        var answer = $.trim($('#<%=txtanswer.ClientID %>').value);
        if (name.length == 0||pwd.length==0||cpwd.length==0||email.length==0||question.length==0||answer.length==0) {
            alert('请把资料填写完整!');

        return false;
        }
        if (pwd != cpwd) {
            alert("两次输入的密码不同,请重新输入!");
            return false;
        }
        var reg = /^[a-zA-Z0-9]{6,20}$/g;
        if (!reg.test(pwd)) {
            alert("密码长度必须大于6个字符小于20个字符,只能为英语字、数字,例如:snsn2003等。 ");
            return false;
        }

        reg = /\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/g;
        if (!reg.test(email)) {
            alert("email的格式不正确,请重新输入! ");
            return false;
        }
        return true;
    }
</script>
</asp:Content>

 

实现智能提示:

 

aspx代码:

οnblur="checkusername(this.value);"

 

                                        <span class="pad">用 户 名:  
                                        <asp:TextBox ID="txtusername" οnblur="checkusername(this.value);" runat="server"></asp:TextBox>
                                            <span id="msg_username">*</span><br />
                                            请填写您用来登录的用户名。</span>


js代码:

   if ($.trim(username).length == 0) {
            $("#msg_username").html("<img src='image/wrong.gif'><span style='color:red;'>用户名不能为空!<span>");
        }
        else 
        {
            $("#msg_username").html("<img src='image/right.gif'><span style='color:green;'>用户名可用!<span>");
        }


 

 (3)使用AJAX验证用户名是否已存在

 

js代码:

 function checkusername(username) {
        if ($.trim(username).length == 0) {
            $("#msg_username").html("<span style='color:red;'>用户名不能为空!<span>");
        }
        else 
        {
            var url = "handler/CheckUserName.ashx?username=" + username + "&t=" + new Date().valueOf();

            $.get(url, function (data) {
                if (data == "false") {
                    $("#msg_username").html("<span style='color:red;'>用户名已存在,请重新输入!<span>");

                }
                else {
                    $("#msg_username").html("<span style='color:green;'>用户名可用!<span>");

                }

            })    
        }    
    }


 


CheckUserName.ashx代码:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Web.handler
{
    /// <summary>
    /// CheckUserName 的摘要说明
    /// </summary>
    public class CheckUserName : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            string username=context.Request.QueryString["username"];

            if (string.IsNullOrEmpty(username))
            {
                context.Response.Write("false");
                context.Response.End();
            }


            if (new MyShop.DAL.UserDAO().Exists(username))
            {
                context.Response.Write("false");
                context.Response.End();
            }
            else
            {
                context.Response.Write("true");
                context.Response.End();
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

 

同样,可用为其他文本框添加动态提示效果。

 如,验证email

aspx代码

<asp:TextBox ID="txtemail" οnblur="checkemail(this.value)" runat="server"></asp:TextBox>
                                           <span id="msg_email"> *</span>

js代码:

function checkemail(email) {
        if ($.trim(email).length == 0) {
            $("#msg_email").html("<span style='color:red;'>email不能为空!<span>");
        }
        else {
            reg = /\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/g;
            if (!reg.test(email)) {
                $("#msg_email").html("<span style='color:red;'>email格式不正确!<span>");
                return false;
            }
            else {
                $("#msg_email").html("<span style='color:green;'>email填写正确!<span>");
            }
        }
    }


 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简易购物网的全栈开发是指同时涉及前端、后端和数据库等多个技术领域的开发过程。下面是简易购物网全栈开发的一般步骤: 1. 前端开发:前端开发主要负责用户界面的设计和实现。常用的前端开发技术包括HTML、CSS和JavaScript等。开发人员可以使用框架如React、Vue或Angular来简化开发过程,并实现用户界面的交互和动态效果。 2. 后端开发:后端开发主要负责处理前端发送的请求,并与数据库进行交互,返回相应的数据给前端。常用的后端开发语言包括Java、Python、Node.js等。开发人员可以使用框架如Spring Boot、Django或Express来简化开发过程,并实现业务逻辑和数据处理。 3. 数据库设计与开发:数据库设计是指根据业务需求设计数据库表结构,并确定数据之间的关系。常用的关系型数据库有MySQL、Oracle和SQL Server等,非关系型数据库有MongoDB和Redis等。开发人员需要使用SQL语言进行数据库操作,如创建表、插入数据、查询数据等。 4. 接口设计与开发:接口设计是指定义前后端之间的数据传输格式和接口规范。常用的接口规范有RESTful API和GraphQL等。开发人员需要根据前端需求设计接口,并在后端实现相应的接口逻辑。 5. 安全性和性能优化:在开发过程中,需要考虑安全性和性能优化。例如,对用户输入进行合法性验证,防止SQL注入和XSS攻击;对代码进行优化,减少响应时间和资源消耗。 6. 测试与部署:在开发完成后,需要进行测试以确保系统的稳定性和功能完整性。测试可以包括单元测试、集成测试和系统测试等。完成测试后,将系统部署到服务器上,使其可以被用户访问和使用。 以上是简易购物网全栈开发的一般步骤,具体的实现方式和技术选择会根据项目需求和开发团队的实际情况而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值