商品表Shop_product的设计:
分析静态页面可以知道:
1:每件商品都属于一个二级分类,因此要建立一个类别表Shop_category来存储商品的二级分类,此表包含的字段:id,类名,类别是一级还是二级,创建时间
shop_categroy: id,caname,pid,createdate
2:商品表Shop_product字段:id,创建时间,商品名称,商品图片.......是否是特价商品,是否是新品,是否是VIP商品(默认值:0否 1是).....
shop_product:id,creatdate,proname,proimg,marketprice,memberprice,vipprice,state,norm,dw(单位),
caid,prodesc(商品描述),istj(是否特价),isxp(是否新品),isvip(是否vip)
3:为商品建立一个评论表Shop_propl:id,评论时间,ip,商品名称,评级........
shop_propl:id,createdate,username,title,body,pj(评级:总共5级,默认5),ip,proid(被评论的商品id)
后台产品分类界面制作
【一】:使用动软代码生成器生成代码,然后复制到项目中,最后修改一下,把分页代码复制过去即可。
【二】:建立产品分类页面categroy.aspx,用于对产品分类的增删查改。
(1):界面设计:
1:为dl增加样式,增加个边框
<style type="text/css"> dl { border:1px solid blue; width:350px; margin:5px;//为每个dl之间添加5个像素的间隙 float:left;//左浮动,让每一个dl都靠左显示 } </style>
<div style="clear:both;"></div>3:每一个dl作为一个产品分类:
<dl> <dt> <asp:TextBox ID="TextBox2" runat="server" Text="电脑配件"></asp:TextBox> <asp:Button ID="Button2" runat="server" Text="修改" /> <asp:Button ID="Button3" runat="server" Text="删除" /> </dt> <dd> <asp:TextBox ID="TextBox3" runat="server" Text="CPU"></asp:TextBox> <asp:Button ID="Button4" runat="server" Text="修改" /> <asp:Button ID="Button5" runat="server" Text="删除" /> </dd> <dd> <asp:TextBox ID="TextBox4" runat="server" Text="内存"></asp:TextBox> <asp:Button ID="Button6" runat="server" Text="修改" /> <asp:Button ID="Button7" runat="server" Text="删除" /> </dd> <dd> <asp:TextBox ID="TextBox5" runat="server" Text="硬盘"></asp:TextBox> <asp:Button ID="Button8" runat="server" Text="修改" /> <asp:Button ID="Button9" runat="server" Text="删除" /> </dd> <dd> <asp:TextBox ID="TextBox6" runat="server" Text="主板"></asp:TextBox> <asp:Button ID="Button10" runat="server" Text="修改" /> <asp:Button ID="Button11" runat="server" Text="删除" /> </dd> </dl>
4:增加产品分类的设计:
<fieldset> <legend style="height: 14px; width: 89px">产品分类</legend> <br /> 分类级别:<asp:RadioButtonList ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow"> <asp:ListItem Selected="True" Value="0">一级分类</asp:ListItem>//此控件默认为一级分类,一级分类和二级分类值分别为:0和1 <asp:ListItem Value="1">二级分类</asp:ListItem> </asp:RadioButtonList> <br /> 父级:<asp:DropDownList ID="DropDownList1" runat="server"> </asp:DropDownList> <br /> 分类名称:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <br /> <asp:Button ID="Button1" runat="server" Text="Button" /> </fieldset>
AutoPostBack="true"②:当选择一级分类的时候,父级是没有的,因此把父级刚在Panel控件中,控制它的显示和隐藏:
<asp:Panel ID="Panel1" runat="server" Visible="false"> 父级:<asp:DropDownList ID="DropDownList1" runat="server"> </asp:DropDownList> </asp:Panel>
<fieldset> <legend style="height: 14px; width: 89px">产品分类</legend> <br /> 分类级别:<asp:RadioButtonList ID="rad" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow" AutoPostBack="true" onselectedindexchanged="rad_SelectedIndexChanged"> <asp:ListItem Selected="True" Value="0">一级分类</asp:ListItem> <asp:ListItem Value="1">二级分类</asp:ListItem> </asp:RadioButtonList> <br /> <asp:Panel ID="Panel1" runat="server" Visible="false"> 父级:<asp:DropDownList ID="ddl" runat="server"> </asp:DropDownList> </asp:Panel> <br /> 分类名称:<asp:TextBox ID="txtcaname" runat="server"></asp:TextBox> <br /> <asp:Button ID="btnadd" runat="server" Text="增加" /> </fieldset>
总体设计就是上面的。
(2):增加分类cs代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Web.admin { public partial class categroy : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //进入页面的时候绑定一级分类 ddl.DataTextField = "caname"; ddl.DataValueField = "id"; ddl.DataSource = new MyShop.DAL.CategroyDAO().GetList("pid=0"); ddl.DataBind(); } } //点击当选按钮 protected void rad_SelectedIndexChanged(object sender, EventArgs e) { if (rad.SelectedValue=="0") { Panel1.Visible = false; } else { Panel1.Visible = true; } } //增加分类 protected void btnadd_Click(object sender, EventArgs e) { string caname = txtcaname.Text.Trim(); if (caname.Length==0) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('请输入分类名称!')</script>"); return; } string pid = rad.SelectedValue == "0" ? "0" : ddl.SelectedValue; //如果父级分类为空 if (string.IsNullOrEmpty(pid)) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('请重新选择父级分类')</script>"); return; } new MyShop.DAL.CategroyDAO().Add(new MyShop.Model.Categroy() { caname=caname, pid=int.Parse(pid), createDate=DateTime.Now }); //添加成功以后,重新加载本页面 Response.Redirect(Request.Url.ToString()); } } }
观察上面设计好的显示分类的界面,可以知道,需要用两个Repeater控件进行嵌套,从而把数据从数据库中显示出来。
①:把aspx中多余的dl删除,只保留一个,用于Repeater控件中。
②:把Repeater进行嵌套:把rep1放进rep0中,为rep0添加ItemCommand事件。
//绑定rep0数据 rep0.DataSource = new MyShop.DAL.CategroyDAO().GetList("pid=0"); rep0.DataBind();
//循环rep0的每一行,在此处为rep1绑定数据 protected void rep0_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) { Button btnMod = e.Item.FindControl("btnMod") as Button; string pid = btnMod.CommandArgument;//获取 btnMod传递的id Repeater rep1 = e.Item.FindControl("rep1") as Repeater; rep1.DataSource = new MyShop.DAL.CategroyDAO().GetList("pid=" + pid); rep1.DataBind(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Web.admin { public partial class categroy : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //进入页面的时候绑定一级分类 ddl.DataTextField = "caname"; ddl.DataValueField = "id"; ddl.DataSource = new MyShop.DAL.CategroyDAO().GetList("pid=0"); ddl.DataBind(); //绑定rep0 rep0.DataSource = new MyShop.DAL.CategroyDAO().GetList("pid=0"); rep0.DataBind(); } } //点击当选按钮 protected void rad_SelectedIndexChanged(object sender, EventArgs e) { if (rad.SelectedValue=="0") { Panel1.Visible = false; } else { Panel1.Visible = true; } } //增加分类 protected void btnadd_Click(object sender, EventArgs e) { string caname = txtcaname.Text.Trim(); if (caname.Length==0) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('请输入分类名称!')</script>"); return; } string pid = rad.SelectedValue == "0" ? "0" : ddl.SelectedValue; //如果父级分类为空 if (string.IsNullOrEmpty(pid)) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('请重新选择父级分类')</script>"); return; } new MyShop.DAL.CategroyDAO().Add(new MyShop.Model.Categroy() { caname=caname, pid=int.Parse(pid), createDate=DateTime.Now }); //添加成功以后,重新加载本页面 Response.Redirect(Request.Url.ToString()); } //循环rep0的每一行 protected void rep0_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) { Button btnMod = e.Item.FindControl("btnMod") as Button; string pid = btnMod.CommandArgument;//获取 btnMod传递的id Repeater rep1 = e.Item.FindControl("rep1") as Repeater; rep1.DataSource = new MyShop.DAL.CategroyDAO().GetList("pid=" + pid); rep1.DataBind(); } } } }
①:aspx中为两个删除按钮添加同一个事件Del
OnClick="Del"
②:cs代码:
//删除 protected void Del(object sender, EventArgs e) { string id = (sender as Button).CommandArgument; if (dao.CalcCount("pid=" + id) > 0) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('该节点下有子节点,不能删除,请先把子节点删除!')</script>"); return; } dao.Delete(int.Parse(id)); Response.Redirect(Request.Url.ToString()); }
(3):修改功能:
①:aspx中为两个修改按钮添加同一个事件Mod
OnClick="Mod"
②:cs代码:
//修改 protected void Mod(object sender, EventArgs e) { string id = (sender as Button).CommandArgument; //①:(sender as Button).NamingContainer:根据Button寻找到包含Button控件的上一级项目,在这里就是Repeater控件中的<ItemTemplate> //②:(sender as Button).NamingContainer.FindControl("txtCaname"):寻找<ItemTemplate>包含的txtCaname控件 string caname=((sender as Button).NamingContainer.FindControl("txtCaname") as TextBox).Text; MyShop.Model.Categroy model = dao.GetModel(int.Parse(id)); if (model!=null) { model.caname = caname; dao.Update(model); Response.Redirect(Request.Url.ToString()); } }
【三】:最终代码:
aspx代码:
注意:两个Repeater控件中包含的控件的id可以相同。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="categroy.aspx.cs" Inherits="Web.admin.categroy" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>产品分类</title> <style type="text/css"> dl { border:1px solid blue; width:350px; margin:5px; float:left; } </style> </head> <body> <form id="form1" runat="server"> <h1> 产品分类</h1> <asp:Repeater ID="rep0" runat="server" onitemdatabound="rep0_ItemDataBound"> <ItemTemplate> <dl> <dt> <asp:TextBox ID="txtCaname" runat="server" Text='<%#Eval("caname") %>'></asp:TextBox> <asp:Button ID="btnMod" runat="server" Text="修改" CommandArgument='<%#Eval("id") %>' OnClick="Mod" /> <asp:Button ID="btnDel" runat="server" Text="删除" CommandArgument='<%#Eval("id") %>' OnClick="Del" /> </dt> <asp:Repeater ID="rep1" runat="server"> <ItemTemplate> <dd> <asp:TextBox ID="txtCaname" runat="server" Text='<%#Eval("caname") %>'></asp:TextBox> <asp:Button ID="btnMod" runat="server" Text="修改" CommandArgument='<%#Eval("id") %>' OnClick="Mod" /> <asp:Button ID="btnDel" runat="server" Text="删除" CommandArgument='<%#Eval("id") %>' OnClick="Del" /> </dd> </ItemTemplate> </asp:Repeater> </dl> </ItemTemplate> </asp:Repeater> <div style="clear: both;"> </div> <fieldset> <legend style="height: 14px; width: 89px">产品分类</legend> <br /> 分类级别:<asp:RadioButtonList ID="rad" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow" AutoPostBack="true" OnSelectedIndexChanged="rad_SelectedIndexChanged"> <asp:ListItem Selected="True" Value="0">一级分类</asp:ListItem> <asp:ListItem Value="1">二级分类</asp:ListItem> </asp:RadioButtonList> <br /> <asp:Panel ID="Panel1" runat="server" Visible="false"> 父级:<asp:DropDownList ID="ddl" runat="server"> </asp:DropDownList> </asp:Panel> <br /> 分类名称:<asp:TextBox ID="txtcaname" runat="server"></asp:TextBox> <br /> <asp:Button ID="btnadd" runat="server" Text="增加" OnClick="btnadd_Click" /> </fieldset> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Web.admin { public partial class categroy : System.Web.UI.Page { MyShop.DAL.CategroyDAO dao=new MyShop.DAL.CategroyDAO(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //进入页面的时候绑定一级分类 ddl.DataTextField = "caname"; ddl.DataValueField = "id"; ddl.DataSource = dao.GetList("pid=0"); ddl.DataBind(); //绑定rep0 rep0.DataSource = dao.GetList("pid=0"); rep0.DataBind(); } } //点击当选按钮 protected void rad_SelectedIndexChanged(object sender, EventArgs e) { if (rad.SelectedValue=="0") { Panel1.Visible = false; } else { Panel1.Visible = true; } } //增加分类 protected void btnadd_Click(object sender, EventArgs e) { string caname = txtcaname.Text.Trim(); if (caname.Length==0) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('请输入分类名称!')</script>"); return; } string pid = rad.SelectedValue == "0" ? "0" : ddl.SelectedValue; //如果父级分类为空 if (string.IsNullOrEmpty(pid)) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('请重新选择父级分类')</script>"); return; } dao.Add(new MyShop.Model.Categroy() { caname=caname, pid=int.Parse(pid), createDate=DateTime.Now }); //添加成功以后,重新加载本页面 Response.Redirect(Request.Url.ToString()); } //循环rep0的每一行 protected void rep0_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) { Button btnMod = e.Item.FindControl("btnMod") as Button; string pid = btnMod.CommandArgument;//获取 btnMod传递的id Repeater rep1 = e.Item.FindControl("rep1") as Repeater; rep1.DataSource = dao.GetList("pid=" + pid); rep1.DataBind(); } } //删除 protected void Del(object sender, EventArgs e) { string id = (sender as Button).CommandArgument; if (dao.CalcCount("pid=" + id) > 0) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('该节点下有子节点,不能删除,请先把子节点删除!')</script>"); return; } dao.Delete(int.Parse(id)); Response.Redirect(Request.Url.ToString()); } //修改 protected void Mod(object sender, EventArgs e) { string id = (sender as Button).CommandArgument; //①:(sender as Button).NamingContainer:根据Button寻找到包含Button控件的上一级项目,在这里就是Repeater控件中的<ItemTemplate> //②:(sender as Button).NamingContainer.FindControl("txtCaname"):寻找<ItemTemplate>包含的txtCaname控件 string caname=((sender as Button).NamingContainer.FindControl("txtCaname") as TextBox).Text; MyShop.Model.Categroy model = dao.GetModel(int.Parse(id)); if (model!=null) { model.caname = caname; dao.Update(model); Response.Redirect(Request.Url.ToString()); } } } }