前言
为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至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>
<asp:Button ID="btnDelete" runat="server" Text="删除商品" OnClick="btnDelete_Click" />
<asp:Button ID="btnClear" runat="server" Text="清空购物车" OnClick="btnClear_Click" />
<asp:Button ID="btnComputeAgain" runat="server" Text="重新计算" OnClick="btnComputeAgain_Click" />
<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 "> </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=\"Web\" /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三层架构的建立和使用方法。