Web网络编程第五次试验:ASP.NET三层架构

前言

为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正!

一、实验目的

1.理解ASP.NET三层架构。
2.掌握ASP.NET三层架构的建立和使用方法。

二、实验环境

Visual Studio 2019 ASP.Net Framework

三、实验内容

1、搭建基于APS.NET三层架构的MyPetShop应用程序。程序结构如图所示。
在这里插入图片描述
图1 MyPetShop应用程序结构图
2、设计并实现MyPetShop应用程序的首页。在实验4完成的产品展示页面的基础上设计首页,浏览效果如图2所示。
在这里插入图片描述
图2 MyPetShop应用程序首页浏览效果
在这里插入图片描述
图3 一般用户登录后的MyPetShop应用程序首页浏览效果
3、设计并实现MyPetShop应用程序的一般用户注册功能。注册页面浏览效果如图4所示。
在这里插入图片描述
图4 MyPetShop应用程序用户注册页面浏览效果
4、设计并实现MyPetShop应用程序的用户登录功能。登录页面浏览效果如图5所示。
在这里插入图片描述
图5 MyPetShop应用程序用户登录页面浏览效果
管理员用户登录后显示的页面效果如图6所示。
在这里插入图片描述
图6 管理员用户登录成功后的界面
5、设计并实现MyPetShop应用程序的一般用户密码修改功能。密码修改页面浏览效果如图7所示。
在这里插入图片描述
图7 一般用户密码修改界面
6、设计并实现MyPetShop应用程序的一般用户密码重置功能。密码重置页面浏览效果如图8所示。
在这里插入图片描述
图8 一般用户密码重置界面

四、代码及截图

搭建的三层架构如图所示:
在这里插入图片描述
Web表示层:
Default.aspx源代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyPetShop.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>首页</title>
    <link href="Styles/bootstrap.css" rel="stylesheet" type="text/css" />
    <link href="Styles/Style.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <header class="header">
      <asp:Image ID="imgLogo" runat="server" ImageUrl="~/Images/logo.gif" />
      <ul class="nav nav-pills">
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnDefault" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Default.aspx">首页</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnRegister" runat="server" CausesValidation="False" ForeColor="White" OnClick="lnkbtnRegister_Click" >注册</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnLogin" runat="server" CausesValidation="False" ForeColor="White" OnClick="lnkbtnLogin_Click" >登录</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnCart" runat="server" CausesValidation="False" ForeColor="White" >购物车</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnSiteMap" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Map.aspx">网站地图</asp:LinkButton></li>
      </ul>
      <div class="status">
        <asp:Label ID="lblWelcome" runat="server" Text="您还未登录!"></asp:Label>
        <asp:LinkButton ID="lnkbtnPwd" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/ChangePwd.aspx">密码修改</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnManage" runat="server" ForeColor="White" Visible="False" PostBackUrl="~/Admin/Default.aspx">系统管理</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnOrder" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/OrderList.aspx">购物记录</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnLogout" runat="server" CausesValidation="False" ForeColor="White" Visible="False" OnClick="lnkbtnLogout_Click" >退出登录</asp:LinkButton>
      </div>
    </header>
    <nav class="sitemap">
      您的位置:
    </nav>
    <section class="mainbody">
      <div>分类名:<asp:DropDownList ID="ddlCategory" runat="server" AutoPostBack="true" DataTextField="Name" DataValueField="CategoryId" OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged"></asp:DropDownList><br/>
            <asp:GridView ID="GvProduct" runat="server" AllowPaging="True"   AutoGenerateColumns="False" PageSize="1" OnPageIndexChanging="gvProduct_PageIndexChanging">
                <PagerSettings FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" PreviousPageText="上一页" Mode="NextPrevious" Position="TopAndBottom" />
                <Columns>                    
                    <asp:TemplateField>
                        <ItemTemplate>
                            <table>
                                <tr><td rowspan="4"><asp:Image ID="imgProduct" runat="server" imageUrl='<%# Bind("Image") %>' Width="100px" Height="100px"/></td><td>产品名称:</td><td><asp:Label ID="lblName" runat="server" Text='<%# Bind("Name") %>'></asp:Label></td></tr>
                                <tr><td >产品价格:</td><td><asp:Label ID="lblListPrice" runat="server" Text='<%# Bind("ListPrice") %>'></asp:Label></td></tr>
                                <tr><td >产品描述:</td> <td><asp:Label ID="lblDecsn" runat="server" Text='<%# Bind("Descn") %>'></asp:Label></td></tr>
                                <tr><td >库存:</td><td><asp:Label ID="lblQty" runat="server" Text='<%# Bind("Qty") %>'></asp:Label></td></tr>
                            </table>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:HyperLinkField DataNavigateUrlFields="ProductId"
                        DataNavigateUrlFormatString="~/ShopCart.aspx?ProductId={0}" 
                        HeaderText="放入购物车" Text="购买"/>
                </Columns>
            </asp:GridView><br/>
        </div>
    </section>
  </form>
</body>
</html>

设计界面如下:
在这里插入图片描述

Default.aspx.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Linq;
using MyPetShop.BLL;

namespace MyPetShop
{
    public partial class Default : System.Web.UI.Page
    {
        MyPetShopDataContext db = new MyPetShopDataContext();
        CategoryService categorySrv = new BLL.CategoryService();
        ProductService productSrv = new BLL.ProductService();
        protected void Page_Load(object sender, EventArgs e)
        {
            if(Session["CustomerId"]!=null)
            {
                lblWelcome.Text = "你好," + Session["CustomerName"].ToString();
                lnkbtnPwd.Visible = true;
                lnkbtnOrder.Visible = true;
                lnkbtnLogout.Visible = true;
            }
            if(!IsPostBack)
            {
                var categories = categorySrv.GetAllCategory();
                foreach(var category in categories)
                {
                    ddlCategory.Items.Add(new ListItem(category.Name.ToString(), category.CategoryId.ToString()));
                }
                Bind();
            }
        }
        private void Bind()
        {
            int categoryId = int.Parse(ddlCategory.SelectedValue);
            var products = productSrv.GetProductByCategoryId(categoryId);
            GvProduct.DataSource = products;
            GvProduct.DataBind();
        }

        protected void lnkbtnRegister_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/NewUser.aspx");
        }

        protected void lnkbtnLogin_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("/Login.aspx");
        }
        protected void lnkbtnLogout_Click(object sender, EventArgs e)
        {
                Session.Clear();
                Response.Redirect("~/Default.aspx");            
        }

        protected void ddlCategory_SelectedIndexChanged(object sender, EventArgs e)
        {
            Bind();
        }

        protected void gvProduct_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GvProduct.PageIndex = e.NewPageIndex;
            Bind();
        }
    }
}

ChangePwd.aspx源代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ChangePwd.aspx.cs" Inherits="MyPetShop.ChangePwd" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>用户密码修改</title>
  <link href="Styles/bootstrap.css" rel="stylesheet" type="text/css" />
  <link href="Styles/Style.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <form id="form1" runat="server">
    <header class="header">
      <asp:Image ID="imgLogo" runat="server" ImageUrl="~/Images/logo.gif" />
      <ul class="nav nav-pills">
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnDefault" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Default.aspx">首页</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnRegister" runat="server" CausesValidation="False" ForeColor="White" >注册</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnLogin" runat="server" CausesValidation="False" ForeColor="White" >登录</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnCart" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/ShopCart.aspx">购物车</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnSiteMap" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Map.aspx">网站地图</asp:LinkButton></li>
      </ul>
      <div class="status">
        <asp:Label ID="lblWelcome" runat="server" Text="您还未登录!"></asp:Label>
        <asp:LinkButton ID="lnkbtnPwd" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/ChangePwd.aspx">密码修改</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnManage" runat="server" ForeColor="White" Visible="False" PostBackUrl="~/Admin/Default.aspx">系统管理</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnOrder" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/OrderList.aspx">购物记录</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnLogout" runat="server" CausesValidation="False" ForeColor="White" Visible="False" >退出登录</asp:LinkButton>
      </div>
    </header>
    <nav class="sitemap">
      您的位置:
    </nav>
    <section class="mainbody">
      <div class="leftside">
        <table>
          <tr>
            <td class="tdcenter" colspan="2">修改密码</td>
          </tr>
          <tr>
            <td class="tdright">原密码:</td>
            <td>
              <asp:TextBox ID="txtOldPwd" runat="server" TextMode="Password"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtOldPwd" Display="Dynamic" ForeColor="Red" ID="rfvOldPwd" runat="server" ErrorMessage="必填">
              </asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright">新密码:</td>
            <td>
              <asp:TextBox ID="txtPwd" runat="server" TextMode="Password"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtPwd" Display="Dynamic" ForeColor="Red" ID="rfvPwd" runat="server" ErrorMessage="必填">
              </asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright">确认新密码:</td>
            <td>
              <asp:TextBox ID="txtPwdAgain" runat="server" TextMode="Password"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtPwdAgain" Display="Dynamic" ForeColor="Red" ID="rfvPwdAgain" runat="server" ErrorMessage="必填">
              </asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright" colspan="2">
              <asp:CompareValidator ControlToValidate="txtPwdAgain" ControlToCompare="txtPwd" Display="Dynamic" ForeColor="Red" ID="cvPwd" runat="server" ErrorMessage="2次新密码不一致"></asp:CompareValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright" colspan="2">
              <asp:Button ID="btnChangePwd" runat="server" Text="确认修改" OnClick="btnChangePwd_Click"  />
            </td>
          </tr>
          <tr>
            <td colspan="2">
              <asp:Label ID="lblMsg" runat="server" ForeColor="Red"></asp:Label></td>
          </tr>
        </table>
      </div>
      <%-- 下面<div>元素左右两侧均不允许其他浮动元素,并显示分隔线 --%>
      <div class="clear"></div>
    </section>
  </form>
</body>
</html>

界面设计如下:
在这里插入图片描述

ChangePwd.aspx.cs代码:

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

namespace MyPetShop
{
    public partial class ChangePwd : System.Web.UI.Page
    {
        CustomerService customerSrv = new CustomerService();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["CustomerId"] == null)
                Response.Redirect("~/Login.aspx");
            else 
            {
                lblWelcome.Text = "你好," + Session["CustomerName"].ToString();
                lnkbtnPwd.Visible = true;
                lnkbtnOrder.Visible = true;
                lnkbtnLogout.Visible = true;
            }
        }
        protected void lnkbtnRegister_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/NewUser.aspx");
        }

        protected void lnkbtnLogin_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("/Login.aspx");
        }
        protected void lnkbtnLogout_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/Default.aspx");
        }

        protected void btnChangePwd_Click(object sender, EventArgs e)
        {
            if(Page.IsValid)
            {
                if (customerSrv.CheckLogin(Session["CustomerName"].ToString(), txtOldPwd.Text) > 0)
                {
                    customerSrv.ChangePassword(Convert.ToInt32(Session["CustomerId"]), txtPwd.Text);
                    lblMsg.Text = "密码修改成功!";
                }
                else
                    lblMsg.Text = "原密码不正确!";
            }
        }
    }
}

GetPwd.aspx源代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetPwd.aspx.cs" Inherits="MyPetShop.GetPwd" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>重置用户密码</title>
  <link href="Styles/bootstrap.css" rel="stylesheet" type="text/css" />
  <link href="Styles/Style.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <form id="form1" runat="server">
    <header class="header">
      <asp:Image ID="imgLogo" runat="server" ImageUrl="~/Images/logo.gif" />
      <ul class="nav nav-pills">
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnDefault" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Default.aspx">首页</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnRegister" runat="server" CausesValidation="False" ForeColor="White" >注册</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnLogin" runat="server" CausesValidation="False" ForeColor="White" >登录</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnCart" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/ShopCart.aspx">购物车</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnSiteMap" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Map.aspx">网站地图</asp:LinkButton></li>
      </ul>
      <div class="status">
        <asp:Label ID="lblWelcome" runat="server" Text="您还未登录!"></asp:Label>
        <asp:LinkButton ID="lnkbtnPwd" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/ChangePwd.aspx">密码修改</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnManage" runat="server" ForeColor="White" Visible="False" PostBackUrl="~/Admin/Default.aspx">系统管理</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnOrder" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/OrderList.aspx">购物记录</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnLogout" runat="server" CausesValidation="False" ForeColor="White" Visible="False" >退出登录</asp:LinkButton>
      </div>
    </header>
    <nav class="sitemap">
      您的位置:
    </nav>
    <section class="mainbody">
      <div class="leftside">
        <table>
          <tr>
            <td class="tdcenter" colspan="2">找回密码</td>
          </tr>
          <tr>
            <td class="tdright">用户名:</td>
            <td>
              <asp:TextBox ID="txtName" runat="server"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtName" Display="Dynamic" ForeColor="Red" ID="rfvName" runat="server" ErrorMessage="必填"></asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright">邮箱:</td>
            <td>
              <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtEmail" Display="Dynamic" ForeColor="Red" ID="rfvEmail" runat="server" ErrorMessage="必填"></asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright" colspan="2">
              <asp:RegularExpressionValidator ID="revEmail" runat="server"
                ErrorMessage="邮箱格式不正确!" ControlToValidate="txtEmail" Display="Dynamic" ForeColor="Red" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright" colspan="2">
              <asp:Button ID="btnResetPwd" runat="server" Text="找回密码" OnClick="btnResetPwd_Click"  />
            </td>
          </tr>
          <tr>
            <td colspan="2">找回密码,需要验证邮箱!</td>
          </tr>
          <tr>
            <td colspan="2">
              <asp:Label ID="lblMsg" runat="server" ForeColor="Red"></asp:Label></td>
          </tr>
        </table>
      </div>
      <%-- 下面<div>元素左右两侧均不允许其他浮动元素,并显示分隔线 --%>
      <div class="clear"></div>
    </section>
  </form>
</body>
</html>

界面设计如下:
在这里插入图片描述

GetPwd.aspx.cs代码设计如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MyPetShop.App_Code; 
using MyPetShop.BLL;

namespace MyPetShop
{
    public partial class GetPwd : System.Web.UI.Page
    {
        CustomerService customerSrv = new CustomerService();

        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void lnkbtnRegister_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/NewUser.aspx");
        }

        protected void lnkbtnLogin_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("/Login.aspx");
        }
        protected void lnkbtnLogout_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/Default.aspx");
        }

        protected void btnResetPwd_Click(object sender, EventArgs e)
        {
            if(Page.IsValid)
            {
                if (!customerSrv.IsNameExist(txtName.Text.Trim()))
                    lblMsg.Text = "用户名不存在!";
                else
                {
                    if (!customerSrv.IsEmailExist(txtName.Text.Trim(), txtEmail.Text.Trim()))
                        lblMsg.Text = "邮箱不正确!";
                    else
                    {
                        customerSrv.ResetPassword(txtName.Text.Trim(), txtEmail.Text.Trim());
                        EmailSender emailSender = new EmailSender(txtEmail.Text.Trim(), txtName.Text.Trim());
                        emailSender.Send();
                        
                        lblMsg.Text = "密码已发送至邮箱!";
                    }
                }
            }
        }
    }
}

Global.asax.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.UI;
namespace MyPetShop
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            ScriptResourceDefinition scriptResDef = new ScriptResourceDefinition();
            scriptResDef.Path = "/Scripts/jquery-3.2.1.min.js";
            ScriptManager.ScriptResourceMapping.AddDefinition("jquery", scriptResDef);
        }     
    }
}

Login.aspx源代码设计如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="MyPetShop.Login" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>用户登录</title>
  <link href="Styles/bootstrap.css" rel="stylesheet" type="text/css" />
  <link href="Styles/Style.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <form id="form1" runat="server">
    <header class="header">
      <asp:Image ID="imgLogo" runat="server" ImageUrl="~/Images/logo.gif" />
      <ul class="nav nav-pills">
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnDefault" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Default.aspx">首页</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnRegister" runat="server" CausesValidation="False" ForeColor="White" >注册</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnLogin" runat="server" CausesValidation="False" ForeColor="White" >登录</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnCart" runat="server" CausesValidation="False" ForeColor="White" >购物车</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnSiteMap" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Map.aspx">网站地图</asp:LinkButton></li>
      </ul>
      <div class="status">
        <asp:Label ID="lblWelcome" runat="server" Text="您还未登录!"></asp:Label>
        <asp:LinkButton ID="lnkbtnPwd" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/ChangePwd.aspx">密码修改</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnManage" runat="server" ForeColor="White" Visible="False" PostBackUrl="~/Admin/Default.aspx">系统管理</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnOrder" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/OrderList.aspx">购物记录</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnLogout" runat="server" CausesValidation="False" ForeColor="White" Visible="False" >退出登录</asp:LinkButton>
      </div>
    </header>
    <nav class="sitemap">
      您的位置:
    </nav>
    <section class="mainbody">
      <div class="leftside">
        <table>
          <tr>
            <td class="tdcenter" colspan="2">登录</td>
          </tr>
          <tr>
            <td class="tdright">用户名:</td>
            <td>
              <asp:TextBox ID="txtName" runat="server"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtName" Display="Dynamic" ForeColor="Red" ID="rfvName" runat="server" ErrorMessage="必填"></asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright">密码:</td>
            <td>
              <asp:TextBox ID="txtPwd" runat="server" TextMode="Password"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtPwd" Display="Dynamic" ForeColor="Red" ID="rfvPwd" runat="server" ErrorMessage="必填"></asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td colspan="2" class="tdright">
              <asp:Button ID="btnLogin" runat="server" Text="立即登录" OnClick="btnLogin_Click"  />
            </td>
          </tr>
          <tr>
            <td><a href="NewUser.aspx">我要注册!</a></td>
            <td class="tdcenter"><a href="GetPwd.aspx">忘记密码?</a></td>
          </tr>
          <tr>
            <td colspan="2" class="tdright">
              <asp:Label ID="lblMsg" runat="server" ForeColor="Red"></asp:Label>
            </td>
          </tr>
        </table>
      </div>
      <%-- 下面<div>元素左右两侧均不允许其他浮动元素,并显示分隔线 --%>
      <div class="clear"></div>
    </section>
  </form>
</body>
</html>

界面设计如下:
在这里插入图片描述
Login.aspx.cs代码设计如下:

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

namespace MyPetShop
{
    public partial class Login : System.Web.UI.Page
    {
        CustomerService customerSrv = new CustomerService();
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                if(Request.QueryString["name"]!=null)
                {
                    txtName.Text = Request.QueryString["name"];
                    lblMsg.Text = "注册成功,请登录!";
                }
            }
        }
        protected void lnkbtnRegister_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/NewUser.aspx");
        }

        protected void lnkbtnLogin_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("/Login.aspx");
        }
        protected void lnkbtnLogout_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/Default.aspx");
        }

        protected void btnLogin_Click(object sender, EventArgs e)
        {
            if(Page.IsValid)
            {
                int customerId = customerSrv.CheckLogin(txtName.Text.Trim(), txtPwd.Text.Trim());
                if (customerId > 0)
                {
                    Session.Clear();
                    if (txtName.Text.Trim() == "admin")
                    {
                        Session["AdminId"] = customerId;
                        Session["AdminName"] = txtName.Text;
                        Response.Redirect("~/Admin/Default.aspx");
                    }
                    else
                    {
                        Session["CustomerId"] = customerId;
                        Session["CustomerName"] = txtName.Text;
                        Response.Redirect("~/Default.aspx");
                    }
                }
                else
                    lblMsg.Text = "用户名或密码错误!";
            }
        }
    }
}

NewUser.aspx源代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="NewUser.aspx.cs" Inherits="MyPetShop.NewUser" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>用户注册</title>
  <link href="Styles/bootstrap.css" rel="stylesheet" type="text/css" />
  <link href="Styles/Style.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <form id="form1" runat="server">
    <header class="header">
      <asp:Image ID="imgLogo" runat="server" ImageUrl="~/Images/logo.gif" />
      <ul class="nav nav-pills">
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnDefault" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Default.aspx">首页</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnRegister" runat="server" CausesValidation="False" ForeColor="White" >注册</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnLogin" runat="server" CausesValidation="False" ForeColor="White" >登录</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnCart" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/ShopCart.aspx">购物车</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnSiteMap" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Map.aspx">网站地图</asp:LinkButton></li>
      </ul>
      <div class="status">
        <asp:Label ID="lblWelcome" runat="server" Text="您还未登录!"></asp:Label>
        <asp:LinkButton ID="lnkbtnPwd" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/ChangePwd.aspx">密码修改</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnManage" runat="server" ForeColor="White" Visible="False" PostBackUrl="~/Admin/Default.aspx">系统管理</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnOrder" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/OrderList.aspx">购物记录</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnLogout" runat="server" CausesValidation="False" ForeColor="White" Visible="False" >退出登录</asp:LinkButton>
      </div>
    </header>
    <nav class="sitemap">
      您的位置:
    </nav>
    <section class="mainbody">
      <div class="leftside">
        <table>
          <tr>
            <td class="tdcenter" colspan="2">注册</td>
          </tr>
          <tr>
            <td class="tdright">用户名:</td>
            <td>
              <asp:TextBox ID="txtName" runat="server"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtName" Display="Dynamic" ForeColor="Red" ID="rfvName" runat="server" ErrorMessage="必填"></asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright">邮箱:</td>
            <td>
              <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtEmail" Display="Dynamic" ForeColor="Red" ID="rfvEmail" runat="server" ErrorMessage="必填"></asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright" colspan="2">
              <asp:RegularExpressionValidator ID="revEmail" runat="server" ErrorMessage="邮箱格式不正确!" ControlToValidate="txtEmail" Display="Dynamic" ForeColor="Red" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
              </asp:RegularExpressionValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright">密码:</td>
            <td>
              <asp:TextBox ID="txtPwd" runat="server" TextMode="Password"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtPwd" Display="Dynamic" ForeColor="Red" ID="rfvPwd" runat="server" ErrorMessage="必填"></asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright">确认密码:</td>
            <td>
              <asp:TextBox ID="txtPwdAgain" runat="server" TextMode="Password"></asp:TextBox></td>
            <td>
              <asp:RequiredFieldValidator ControlToValidate="txtPwdAgain" Display="Dynamic" ForeColor="Red" ID="rfvPwdAgain" runat="server" ErrorMessage="必填"></asp:RequiredFieldValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright" colspan="2">
              <asp:CompareValidator ControlToValidate="txtPwdAgain" ControlToCompare="txtPwd" Display="Dynamic" ForeColor="Red" ID="cvPwd" runat="server" ErrorMessage="2次密码不一致!"></asp:CompareValidator>
            </td>
          </tr>
          <tr>
            <td class="tdright" colspan="2">
              <asp:Button ID="btnReg" runat="server" Text="立即注册" OnClick="btnReg_Click"  />
            </td>
          </tr>
          <tr>
            <td><a href="Login.aspx">我要登录</a></td>
            <td>
              <asp:Label ID="lblMsg" runat="server" ForeColor="Red"></asp:Label></td>
          </tr>
        </table>
      </div>
      <%-- 下面<div>元素左右两侧均不允许其他浮动元素,并显示分隔线 --%>
      <div class="clear"></div>
    </section>
  </form>
</body>
</html>

界面设计如下:
在这里插入图片描述

NewUser.aspx.cs代码如下:

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

namespace MyPetShop
{
    public partial class NewUser : System.Web.UI.Page
    {
        CustomerService customerSrv = new CustomerService();
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void lnkbtnRegister_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/NewUser.aspx");
        }

        protected void lnkbtnLogin_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("/Login.aspx");
        }
        protected void lnkbtnLogout_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/Default.aspx");
        }

        protected void btnReg_Click(object sender, EventArgs e)
        {
            if(Page.IsValid)
            {
                if (customerSrv.IsNameExist(txtName.Text.Trim()))
                    lblMsg.Text = "用户名已存在!";
                else
                {
                    customerSrv.Insert(txtName.Text.Trim(), txtPwd.Text.Trim(), txtEmail.Text.Trim());
                    Response.Redirect("Login.aspx?name=" + txtName.Text);
                }
            }
        }
    }
}

ShopCart.aspx源代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ShopCart.aspx.cs" Inherits="MyPetShop.ShopCart" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <link href="Styles/bootstrap.css" rel="stylesheet" type="text/css" />
    <link href="Styles/Style.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
        <header class="header">
      <asp:Image ID="imgLogo" runat="server" ImageUrl="~/Images/logo.gif" />
      <ul class="nav nav-pills">
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnDefault" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Default.aspx">首页</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnRegister" runat="server" CausesValidation="False" ForeColor="White" OnClick="lnkbtnRegister_Click" >注册</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnLogin" runat="server" CausesValidation="False" ForeColor="White" OnClick="lnkbtnLogin_Click" >登录</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnCart" runat="server" CausesValidation="False" ForeColor="White" >购物车</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnSiteMap" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Map.aspx">网站地图</asp:LinkButton></li>
      </ul>
      <div class="status">
        <asp:Label ID="lblWelcome" runat="server" Text="您还未登录!"></asp:Label>
        <asp:LinkButton ID="lnkbtnPwd" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/ChangePwd.aspx">密码修改</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnManage" runat="server" ForeColor="White" Visible="False" PostBackUrl="~/Admin/Default.aspx">系统管理</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnOrder" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/OrderList.aspx">购物记录</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnLogout" runat="server" CausesValidation="False" ForeColor="White" Visible="False" OnClick="lnkbtnLogout_Click" >退出登录</asp:LinkButton>
      </div>
    </header>
    <nav class="sitemap">
      您的位置:
    </nav>
        <section class="mainbody">
            <div class="rightside">
                <asp:Panel ID="pnlCart" runat="server" >
                    <asp:GridView ID="gvCart" runat ="server" Width="100%" AutoGenerateColumns="false" >
                        <Columns >
                            <asp:TemplateField>
                                <ItemTemplate>
                                    <asp:CheckBox ID="chkProduct" runat="server" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:BoundField DataField="ProId" HeaderText="商品ID" />
                            <asp:BoundField DataField ="ProName" HeaderText="商品名称" />
                            <asp:BoundField DataField ="ListPrice" HeaderText="商品价格" DataFormatString="{0:c}" />
                            <asp:TemplateField HeaderText="购买数量">
                                <ItemTemplate>
                                    <asp:TextBox ID="txtQty" runat="server" Text='<%# Bind("Qty") %>' Width="30"></asp:TextBox>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
                    <br />
                    <asp:Label ID="lblError" runat="server" ForeColor="Red"></asp:Label><br />
                    <asp:Label ID="lblHint" runat="server" ForeColor="Green"></asp:Label><br />
                    总价:<asp:Label ID="lblTotalPrice" runat="server"></asp:Label>&nbsp;&nbsp;
                    <asp:Button ID="btnDelete" runat="server" Text="删除商品" OnClick="btnDelete_Click" />
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <asp:Button ID="btnClear" runat="server" Text="清空购物车" OnClick="btnClear_Click" />
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <asp:Button ID="btnComputeAgain" runat="server" Text="重新计算" OnClick="btnComputeAgain_Click" />
                    &nbsp;
                    <asp:Button ID="btnSettle" runat="server" Text="结算" OnClick="btnSettle_Click" />
                </asp:Panel> 
                <asp:Label ID="lblCart" runat="server"></asp:Label>
            </div>
            <div class="clear"></div>
        </section>
    </form>
</body>
</html>

界面设计如下:
在这里插入图片描述

ShopCart.aspx.cs代码如下:

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

namespace MyPetShop
{
    public partial class ShopCart : System.Web.UI.Page
    {
        CartItemService cartSrv = new BLL.CartItemService();
        ProductService productSrv = new ProductService();
        protected void lnkbtnRegister_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/NewUser.aspx");
        }

        protected void lnkbtnLogin_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("/Login.aspx");
        }
        protected void lnkbtnLogout_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/Default.aspx");
        }
        protected void Page_Load(object sender, EventArgs e)
        {            
            if (!IsPostBack)
            {
                if (Session["CustomerId"] == null)
                    Response.Redirect("~/Login.aspx");
                else 
                {
                    lblWelcome.Text = "你好," + Session["CustomerName"].ToString();
                    lnkbtnPwd.Visible = true;
                    lnkbtnOrder.Visible = true;
                    lnkbtnLogout.Visible = true;
                }
                if(Request.QueryString["ProductId"]!=null)
                {
                    int productId = int.Parse(Request.QueryString["ProductId"]);
                    cartSrv.Insert(Convert.ToInt32(Session["CustomerId"]), productId, 1);
                }
                lblHint.Text = "温馨提示:更改购买数量后,请单击‘重新计算’按钮进行更新!";
                Bind();
            }
            
        }
        protected void Bind()
        {
            lblTotalPrice.Text = cartSrv.GetTotalPriceByCustomerId(Convert.ToInt32(Session["CustomerId"])).ToString();
            gvCart.DataSource = cartSrv.GetCartItemByCustomerId(Convert.ToInt32(Session["CustomerId"]));
            gvCart.DataBind();
            if(gvCart.Rows.Count!=0)
            {
                pnlCart.Visible = true;
                lblCart.Text = "";
            }
            else
            {
                pnlCart.Visible = false;
                lblCart.Text = "购物车内无商品,请先购物!";
            }
        }

        protected void btnDelete_Click(object sender, EventArgs e)
        {
            int productId = 0;
            for(int i=0;i<gvCart.Rows.Count;i++)
            {
                CheckBox chkProduct = new CheckBox();
                chkProduct = (CheckBox)gvCart.Rows[i].FindControl("chkProduct");
                if(chkProduct!=null)
                {
                    if(chkProduct.Checked)
                    {
                        productId = int.Parse(gvCart.Rows[i].Cells[1].Text);
                        cartSrv.Delete(Convert.ToInt32(Session["CustomerId"]), productId);
                    }
                }
            }
            Bind();
        }

        protected void btnClear_Click(object sender, EventArgs e)
        {
            cartSrv.Clear(Convert.ToInt32(Session["CustomerId"]));
            Response.Redirect("Default.aspx");
        }

        protected void btnComputeAgain_Click(object sender, EventArgs e)
        {
            lblError.Text = "";
            for(int i=0;i<gvCart.Rows.Count;i++)
            {
                TextBox txtQty = new TextBox();
                txtQty = (TextBox)gvCart.Rows[i].FindControl("txtQty");
                if(txtQty!=null)
                {
                    var product = productSrv.GetProductByProductId(Convert.ToInt32(gvCart.Rows[i].Cells[1].Text));
                    if(int.Parse(txtQty.Text)>product.Qty)
                    {
                        lblError.Text += "Error:库存不足,商品名为" + product.Name + "的库存数量为" + product.Qty.ToString() + "<br />";
                    }
                    else
                    {
                        cartSrv.Update(Convert.ToInt32(Session["CustomerId"]), product.ProductId, Convert.ToInt32(txtQty.Text));
                    }
                }
            }
            Bind();
        }

        protected void btnSettle_Click(object sender, EventArgs e)
        {
            if (Session["CustomerId"] != null)
                Response.Redirect("SubmitCart.aspx");
            else
                Response.Redirect("Login.aspx");
        }
    }
}

SubmitCart.aspx源代码设计如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SubmitCart.aspx.cs" Inherits="MyPetShop.SubmitCart" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <link href="Styles/bootstrap.css" rel="stylesheet" type="text/css" />
    <link href="Styles/Style.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
        <header class="header">
      <asp:Image ID="imgLogo" runat="server" ImageUrl="~/Images/logo.gif" />
      <ul class="nav nav-pills">
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnDefault" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Default.aspx">首页</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnRegister" runat="server" CausesValidation="False" ForeColor="White" OnClick="lnkbtnRegister_Click" >注册</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnLogin" runat="server" CausesValidation="False" ForeColor="White" OnClick="lnkbtnLogin_Click" >登录</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnCart" runat="server" CausesValidation="False" ForeColor="White" >购物车</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnSiteMap" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Map.aspx">网站地图</asp:LinkButton></li>
      </ul>
      <div class="status">
        <asp:Label ID="lblWelcome" runat="server" Text="您还未登录!"></asp:Label>
        <asp:LinkButton ID="lnkbtnPwd" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/ChangePwd.aspx">密码修改</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnManage" runat="server" ForeColor="White" Visible="False" PostBackUrl="~/Admin/Default.aspx">系统管理</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnOrder" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/OrderList.aspx">购物记录</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnLogout" runat="server" CausesValidation="False" ForeColor="White" Visible="False" OnClick="lnkbtnLogout_Click" >退出登录</asp:LinkButton>
      </div>
    </header>
    <nav class="sitemap">
      您的位置:
    </nav>
        <section class="mainbody">
            <div class="rightside">
                <asp:Panel ID="pnlConsignee" runat="server">
                    <table>
                        <tr>
                            <td class="tdcenter" colspan="2">
                                <strong>填写发货地址</strong></td>
                        </tr>
                        <tr>
                            <td class="tdright">送货地址:</td>
                            <td>
                                <asp:TextBox ID="txtAddr1" runat="server"></asp:TextBox>
                                <asp:RequiredFieldValidator ID="rfvAddr1" runat="server"  ControlToValidate="txtAddr1" Display="Dynamic" ErrorMessage="必填" ForeColor="Red"></asp:RequiredFieldValidator>
                            </td>
                        </tr>
                        <tr>
                            <td class="tdright">发票寄送地址:</td>
                            <td>
                                <asp:TextBox ID="txtAddr2" runat="server"></asp:TextBox>
                                <asp:RequiredFieldValidator ID="rfvAddr2" runat="server" ControlToValidate="txtAddr2" Display="Dynamic" ErrorMessage="必填" ForeColor="Red"></asp:RequiredFieldValidator>
                            </td>
                        </tr>
                        <tr>
                            <td class="tdright">城市:
                            </td>
                            <td>
                                <asp:TextBox ID="txtCity" runat="server"></asp:TextBox>
                                <asp:RequiredFieldValidator ID="rfvCity" runat="server" ControlToValidate="txtCity" Display="Dynamic" ErrorMessage="必填" ForeColor="Red"></asp:RequiredFieldValidator>
                            </td>
                        </tr>
                        <tr>
                            <td class="tdright">省(自治区、直辖市):</td>
                            <td>
                                <asp:TextBox ID="txtState" runat="server" ></asp:TextBox>
                                <asp:RequiredFieldValidator ID="rfvState" runat="server" ControlToValidate="txtState" Display="Dynamic" ErrorMessage="必填" ForeColor="Red"></asp:RequiredFieldValidator>
                            </td>
                        </tr>
                        <tr>
                            <td class="tdright">邮编:</td>
                            <td>
                                <asp:TextBox ID="txtZip" runat="server" ></asp:TextBox>
                                <asp:RequiredFieldValidator ID="rfvZip" runat="server" ControlToValidate="txtZip" Display="Dynamic" ErrorMessage="必填" ForeColor="Red"></asp:RequiredFieldValidator>
                                <asp:RegularExpressionValidator ID="revZip" runat="server" ControlToValidate="txtZip" Display="Dynamic" ErrorMessage="邮编错误!" ForeColor="Red" ValidationExpression="\d{6}"></asp:RegularExpressionValidator>
                            </td>
                        </tr>
                        <tr>
                            <td class="tdright">联系电话:</td>
                            <td>
                                <asp:TextBox ID="txtPhone" runat="server"></asp:TextBox>
                                <asp:RequiredFieldValidator ID="rfvPhone" runat="server" ControlToValidate ="txtPhone" Display="Dynamic" ErrorMessage="必填" ForeColor="Red" ></asp:RequiredFieldValidator>
                            </td>
                        </tr>
                        <tr>
                            <td class="tdright ">&nbsp</td>
                            <td>
                                <asp:Button ID="btnSubmit" runat="server" Text="提交结算" OnClick="btnSubmit_Click" />
                            </td>
                        </tr>
                    </table>
                </asp:Panel>
                <asp:Label ID="lblMsg" runat="server" ></asp:Label>
            </div>
            <div class="clear"></div>
        </section>
    </form>
</body>
</html>

界面设计如下:
在这里插入图片描述

SubmitCart.aspx.cs代码如下:

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

namespace MyPetShop
{
    public partial class SubmitCart : System.Web.UI.Page
    {
        OrderService orderSrv = new OrderService();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["CustomerId"] == null)
                Response.Redirect("~/Login.aspx");
            else
            {
                lblWelcome.Text = "你好," + Session["CustomerName"].ToString();
                lnkbtnPwd.Visible = true;
                lnkbtnOrder.Visible = true;
                lnkbtnLogout.Visible = true;
                lblMsg.Text = "";
            }
        }
        protected void lnkbtnRegister_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/NewUser.aspx");
        }

        protected void lnkbtnLogin_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("/Login.aspx");
        }
        protected void lnkbtnLogout_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/Default.aspx");
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            orderSrv.CreateOrderFromCart(Convert.ToInt32(Session["CustomerId"]), Session["CustomerName"].ToString(), txtAddr1.Text.Trim(), txtAddr2.Text.Trim(), txtCity.Text.Trim(), txtState.Text.Trim(), txtZip.Text.Trim(), txtPhone.Text.Trim());
            pnlConsignee.Visible = false;
            lblMsg.Text = "已经成功结算,谢谢光临!";
        }
    }
}

Web.config代码如下:

<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  https://go.microsoft.com/fwlink/?LinkId=169433
-->

<configuration>
	<appSettings>
		<add key="MailFromAddress" value="723284302@qq.com"/>//你自己的邮箱设置
		<add key="UseSsl" value="true"/>
		<add key="UserName" value="723284302"/>
		<add key="Password" value="yd"/>
		<add key="ServerName" value="smtp.qq.com"/>
		<add key ="ServerPort" value ="587"/>
	</appSettings>
	<!--<connectionStrings>
		<add name="MyPetShop.DAL.Properties.Settings.MyPetShopConnetionString"
			  connectionString="Data Source=(LocalDB)\MSSQLLocalDB;
			  AttachDbFilename=|DataDirectory|\MyPetShop.mdf;Integrated
			  Security=True" providerName="System.Data.SqlClient"/>
	</connectionStrings>-->
	<connectionStrings>
    <add name="MyPetShopConnectionString" connectionString="Data Source=PC-20180617YNMI;Initial Catalog=MyPetShop;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.7.2" />
    <httpRuntime targetFramework="4.7.2" />
  </system.web>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
	<system.webServer>
		<directoryBrowse enabled="true"/>
	</system.webServer>
</configuration>

App_Code中EmailSender.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Net;
using System.Net.Mail;

namespace MyPetShop.App_Code
{
    public class EmailSender
    {
        private string mailFromAddress = ConfigurationManager.AppSettings["MailFromAddress"];
        private bool useSsl = bool.Parse(ConfigurationManager.AppSettings["UseSsl"]);
        private string userName = ConfigurationManager.AppSettings["UserName"];
        private string password = ConfigurationManager.AppSettings["Password"];
        private string serverName = ConfigurationManager.AppSettings["ServerName"];
        private int serverPort = int.Parse(ConfigurationManager.AppSettings["ServerPort"]);
        private string findPassword;
        private string mailToAddress = "";
        public EmailSender(string address, string pwd)
        {
            mailToAddress = address;
            findPassword = pwd;
        }
        public void Send()
        {
            using (var smtpClient =new SmtpClient())
            {
                smtpClient.EnableSsl = useSsl;
                smtpClient.Host = serverName;
                smtpClient.Port = serverPort;
                smtpClient.Credentials = new NetworkCredential(userName, password);
                string body = "您登陆MyPetShop的密码已重置为:" + findPassword;
                MailMessage mailMessage = new MailMessage(mailFromAddress, mailToAddress, "MyPetShop用户密码重置", body);
                smtpClient.Send(mailMessage);
            }
        }
    }
}

Admin文件夹中Default.aspx源代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyPetShop.Admin.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>管理员首页</title>
    <link href="~/Styles/bootstrap.css" rel="stylesheet" type="text/css" />
    <link href="~/Styles/Style.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <header class="header">
      <asp:Image ID="imgLogo" runat="server" ImageUrl="~/Images/logo.gif" />
      <ul class="nav nav-pills">
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnDefault" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Default.aspx">首页</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnRegister" runat="server" CausesValidation="False" ForeColor="White" OnClick="lnkbtnRegister_Click" >注册</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnLogin" runat="server" CausesValidation="False" ForeColor="White" OnClick="lnkbtnLogin_Click" >登录</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnCart" runat="server" CausesValidation="False" ForeColor="White" >购物车</asp:LinkButton></li>
        <li class="navDark">
          <asp:LinkButton ID="lnkbtnSiteMap" runat="server" CausesValidation="False" ForeColor="White" PostBackUrl="~/Map.aspx">网站地图</asp:LinkButton></li>
      </ul>
      <div class="status">
        <asp:Label ID="lblWelcome" runat="server" Text="您还未登录!"></asp:Label>
        <asp:LinkButton ID="lnkbtnPwd" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/ChangePwd.aspx">密码修改</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnManage" runat="server" ForeColor="White" Visible="False" PostBackUrl="~/Admin/Default.aspx">系统管理</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnOrder" runat="server" CausesValidation="False" ForeColor="White" Visible="False" PostBackUrl="~/OrderList.aspx">购物记录</asp:LinkButton>
        <asp:LinkButton ID="lnkbtnLogout" runat="server" CausesValidation="False" ForeColor="White" Visible="False" OnClick="lnkbtnLogout_Click" >退出登录</asp:LinkButton>
      </div>
    </header>
    <nav class="sitemap">
      您的位置:
    </nav>
        <section class="mainbody">
            <div class="leftside">
                <a href="#">分类管理</a>
                <br />
                <br />
                <a href="#">供应商管理</a>
                <br />
                <br />
                <a href="#">商品管理</a>
                <br />
                <br />
                <a href="#">订单管理</a>
                <br />
                <br />
            </div>
            <div class="clear"></div>
        </section>
    </form>
</body>
</html>

界面设计如下:
在这里插入图片描述

Default.aspx.cs代码如下:

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

namespace MyPetShop.Admin
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["AdminId"] == null)
                Response.Redirect("~/Login.aspx");
            else
            {
                lblWelcome.Text = "您好," + Session["AdminName"].ToString();
                lnkbtnManage.Visible = true;
                lnkbtnLogout.Visible = true;
            }
        }
        protected void lnkbtnRegister_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/NewUser.aspx");
        }

        protected void lnkbtnLogin_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("/Login.aspx");
        }
        protected void lnkbtnLogout_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("~/Default.aspx");
        }
    }
}

BLL层:

CartItermService.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyPetShop.DAL;

namespace MyPetShop.BLL
{
    public class CartItemService
    {
        MyPetShopDataContext db = new MyPetShopDataContext();
        public CartItem Insert(int customerId, int productId, int qty)
        {
            CartItem cartItem = null;
            Product product = (from p in db.Product where p.ProductId == productId select p).First();
            cartItem = new CartItem { CustomerId = customerId, ProId = product.ProductId, ProName = product.Name, ListPrice = (decimal)product.ListPrice, Qty = qty };
            int ExistCartItemCount = (from c in db.CartItem where c.CustomerId == customerId && c.ProId == productId select c).Count();
            if (ExistCartItemCount > 0)
            {
                CartItem existCartItem = (from c in db.CartItem where c.CustomerId == customerId && c.ProId == productId select c).First();
                existCartItem.Qty += qty;
            }
            else
                db.CartItem.InsertOnSubmit(cartItem);
            db.SubmitChanges();
            return cartItem;
        }
        public CartItem Update(int customerId, int productId, int qty)
        {
            CartItem cartItem = null;
            cartItem = (from c in db.CartItem where c.CustomerId == customerId && c.ProId == productId select c).First();
            if(cartItem!=null)
            {
                cartItem.Qty = qty;
                if (cartItem.Qty <= 0)
                    db.CartItem.DeleteOnSubmit(cartItem);
                db.SubmitChanges();
            }
            return cartItem;
        }
        public void Delete(int customerId, int productId)
        {
            CartItem cartItem = (from c in db.CartItem where c.CustomerId == customerId && c.ProId == productId select c).First();
            if(cartItem!=null)
            {
                db.CartItem.DeleteOnSubmit(cartItem);
                db.SubmitChanges();
            }
        }
        public void Clear(int customerId)
        {
            List<CartItem> cartItemList = (from c in db.CartItem where c.CustomerId == customerId select c).ToList();
            foreach (CartItem cartItem in cartItemList)
                db.CartItem.DeleteOnSubmit(cartItem);
            db.SubmitChanges();
        }
        public List<CartItem> GetCartItemByCustomerId(int customerId)
        {
            return (from c in db.CartItem where c.CustomerId == customerId select c).ToList();
        }
        public decimal GetTotalPriceByCustomerId(int customerId)
        {
            List<CartItem> list = (from c in db.CartItem where c.CustomerId == customerId select c).ToList();
            return list.Sum(c => c.ListPrice * c.Qty);
        }

    }
}

CategoryService.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Linq;
using MyPetShop.DAL;


namespace MyPetShop.BLL
{
    
    public class CategoryService
    {
        MyPetShopDataContext db = new MyPetShopDataContext();
        public List<Category> GetAllCategory()
        {
            return (from c in db.Category select c).ToList();
        }
    }
}

CustomerService.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyPetShop.DAL;
using MyPetShop.BLL;

namespace MyPetShop.BLL
{
    public class CustomerService
    {
        MyPetShopDataContext db = new MyPetShopDataContext();
        public bool IsNameExist(string name)
        {
            Customer customer = (from c in db.Customer where c.Name == name select c).FirstOrDefault();
            if (customer != null)
                return true;
            else return false;
        }
        public bool IsEmailExist(string name,string email)
        {
            Customer customer = (from c in db.Customer where c.Name == name && c.Email == email select c).FirstOrDefault();
            if (customer != null)
                return true;
            else return false;
        }
        public void ResetPassword(string name,string email)
        {
            Customer customer = (from c in db.Customer where c.Name == name && c.Email == email select c).First();
            customer.Password = name;
            db.SubmitChanges();
        }
        public void Insert(string name,string password, string email)
        {
            Customer customer = new Customer
            {
                Name = name,
                Password = password,
                Email = email
            };
            db.Customer.InsertOnSubmit(customer);
            db.SubmitChanges();
        }
        public int CheckLogin(string name, string password)
        {
            Customer customer = (from c in db.Customer where c.Name == name && c.Password == password select c).FirstOrDefault();
            if (customer != null)
                return customer.CustomerId;
            else
                return 0;
        }
        public void ChangePassword(int customerId, string password)
        {
            Customer customer = (from c in db.Customer where c.CustomerId == customerId select c).First();
            customer.Password = password;
            db.SubmitChanges();
        }
    }
}

OrderService.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyPetShop.DAL;
using System.Transactions;

namespace MyPetShop.BLL
{
    public class OrderService
    {
        MyPetShopDataContext db = new MyPetShopDataContext();
        public void CreateOrderFromCart(int cutomerId,string customerName,string addr1,string addr2,string city,string state,string zip,string phone)
        {
            using (TransactionScope ts=new TransactionScope())
            {
                List<CartItem> cartItemsList = (from c in db.CartItem where c.CustomerId == cutomerId select c).ToList();
                Order order = new Order { CustomerId = cutomerId, UserName = customerName, OrderDate = DateTime.Now, Addr1 = addr1, Addr2 = addr2, City = city, State = state, Zip = zip, Phone = phone, Status = "未审核" };
                OrderItem orderItem = null;
                Product product = null;
                foreach(CartItem cartItem in cartItemsList)
                {
                    orderItem = new OrderItem
                    {
                        OrderId = order.OrderId,
                        ProName = cartItem.ProName,
                        ListPrice = cartItem.ListPrice,
                        Qty = cartItem.Qty,
                        TotalPrice = cartItem.Qty * cartItem.ListPrice
                    };
                    order.OrderItem.Add(orderItem);
                    product = (from p in db.Product where p.ProductId == cartItem.ProId select p).First();
                    product.Qty = product.Qty - cartItem.Qty;
                    db.CartItem.DeleteOnSubmit(cartItem);
                }
                db.Order.InsertOnSubmit(order);
                db.SubmitChanges();
                ts.Complete();
            }
        }
    }
}

ProductService.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Linq;
using System.Data;
using MyPetShop;
using MyPetShop.DAL;

namespace MyPetShop.BLL
{
    
    public class ProductService
    {
        MyPetShopDataContext db = new MyPetShopDataContext();
        public List<Product> GetProductByCategoryId(int categoryId)
        {
            return (from p in db.Product where p.CategoryId == categoryId select p).ToList();
        }
        public Product GetProductByProductId(int productId)
        {
            return (from p in db.Product where p.ProductId == productId select p).First();
        }
    }
}

运行截图:
初始界面:
在这里插入图片描述

单击注册:
在这里插入图片描述

输入信息以注册:
在这里插入图片描述

跳转至界面如下:
在这里插入图片描述

输入密码以登录:
在这里插入图片描述

单击退出登录:
在这里插入图片描述

使用admin身份登录:
在这里插入图片描述

单击“立即登录”跳转至界面如下:
在这里插入图片描述

重新登录至force账户,单击密码修改:
在这里插入图片描述

输入原密码和新密码,单击确认修改
在这里插入图片描述

回到首页,单击登录,单击忘记密码:
在这里插入图片描述

输入注册时输入的用户名和邮箱:
在这里插入图片描述

单击找回密码:
在这里插入图片描述

此时邮箱内收到邮件:
在这里插入图片描述

单击首页,单击登录,输入用户名和重置后的密码:
在这里插入图片描述

单击“立即登录”,跳转至界面如下:
在这里插入图片描述

五、实验总结

通过本次实验,了解了三层架构的相互关系与构建体系,更加透彻的了解了Session、Grid和Linq to SQL的诸多方法和功能,基本理解了ASP.NET的三层架构,基本掌握了ASP.NET三层架构的建立和使用方法。

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Knight_V_Schumacher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值