要完成的功能:
1.使用Asp.NET技术,完成超市商品管理系统
2.开发工具:VS2010
3.数据库:SQL Server 2008
功能模块:登录、账户管理、商品类别管理、商品信息管理
一、登录界面,在前端实现判断是否为空,如果为空则提示,不进行处理,在后台实现判断是否用户名和密码是否正确,再进行登录。
二、登录之后进入商品管理界面。界面内,可以分类查询,检索(支持模糊查询),勾选删除,和新增功能,商品名称可以链接到商品详情界面,以及商品分类管理和用户信息管理两个超链接。
三、新增界面可根据是否打折,打折价格控制打折价格是否能进行输入。
四、商品详情页,可修改页面内的数据。
五、商品分类管理界面,通过Ajax判断类名是否存在,若无此类名再进行添加,如果类名已经存在,弹窗报错。
六、用户管理界面,跟商品管理界面功能相同。
开始动工
第一步:数据库的建立;
1.1 CommodityID为主键,SortID和CreateUserId为外键,都自动增长。
1.2 建立关系
第二步:项目的建立
2.1 创建项目
2.2 添加应用
2.3 配置web.config
代码:
<add name="MainConn" connectionString="server=.;database=mySupermarketDemo;user=sa;pwd=0301;Max Pool Size = 512;"
providerName="System.Data.SqlClient" />
第三步: 页面布局与功能的添加(登录界面)
3.1 初步的搭建
知识点补充:
- OnClientClick="return chec()"此处的return,可以直接得到是false或者true,如果是false则不进入后台执行;
使用jq获取输入框的值
var user = $("#tbUserName").val();
- SqlParameter,DataSet,DbHelperSQL 注意单词拼写与大小写
- ds.Tables[0].Rows.Count > 0,判断是否存在数据
- Session["UserId"] = ds.Tables[0].Rows[0]["UserId"]; 获取某行某列
- DbHelperSQL.GetSingle(sql) != null 判断是否能获取到一条数据,此处的作用于ds.Tables[0].Rows.Count是一致的。
3.2 添加样式和点击登录按钮的功能(这样吧,听说以后要用easyUI,现在就在这个demo上做测试吧,哈哈……算了,easyUI好丑啊……)
小知识点:top 1的用处:选出第一条记录,常与order by联合使用。如下:
当有重复数据是,可根据top后面的数字进行选择,也可以通过top 1只挑出一条记录。
部分核心代码:
Login.aspx
<script type="text/javascript">
// 判断输入是否为空
function checkUserInfo(){
if($("#txtUserName").val() == ""){
alert("请输入用户名");
return false;
}
if($("#txtPassword").val() == ""){
alert("请输入密码");
return false;
}
}
</script>
Login.aspx.cs
protected void btnLogin_Click(object sender, EventArgs e)
{
//编写sql语句,此处的top 1 就是选出查询的第一条记录,此处可避免查出内容相同的两条语句
//利用参数,防止sql注入
string sql = "SELECT TOP 1 * FROM Users WHERE UserName = @UserName AND Password = @Password";
//设置参数
SqlParameter[] pms = {
new SqlParameter("@UserName",SqlDbType.NVarChar,50),
new SqlParameter("@Password",SqlDbType.NVarChar,50)
};
//为参数赋值
pms[0].Value = txtUserName.Text;
pms[1].Value = txtPassword.Text;
/*
*注意:DataSet 是个数据集,可以把它当做临时数据库来看。DataTable 是DataSet临时数据库里的临时表,
* 一个DataSet 里可以有多个DataTable,就像一个数据库里可以有多个表一样
*/
DataSet ds = DbHelperSQL.Query(sql, pms); //执行查询,并将数据放置在一个数据集中
//判断表中是否存在数据,如果有数据则登录成功,如果没哟数据,则登录失败
if (ds.Tables[0].Rows.Count > 0)
{
Session["UserId"] = ds.Tables[0].Rows[0]["UserID"];//为userid设置缓存,为了之后的插入数据和防止用户跳过登录直接进入
Response.Redirect("CommodityManage.aspx");//跳转页面
}
//验证失败弹出提示框
else
{
Response.Write("<script>alert('用户名或密码错误,请重新登录');</script>");
}
}
第四步 页面布局与功能添加(商品管理界面)
4.1 传参方式与数据绑定方式
<asp:TemplateField HeaderText="商品名称">
<ItemTemplate>
<a target="_blank" href='CommodityEdit.aspx?cid=<%# Eval("CommodityID") %>'>
<%#Eval("CommodityName") %>
</a>
<%--<asp:HyperLink ID="Commodity" runat="server"
NavigateUrl='<%#"CommodityEdit.aspx?cid="+DataBinder.Eval(Container.DataItem,"CommodityID")%> '>
<%# Eval("CommodityName") %>
</asp:HyperLink>--%>
</ItemTemplate>
</asp:TemplateField>
4.2 gridview 的代码----注意里面的DataKeyNames
<%--gridview数据展示--%>
<asp:GridView ID="gvCommodity" runat="server" AutoGenerateColumns="False" DataKeyNames="CommodityID">
<Columns>
<asp:TemplateField HeaderText="选择">
<ItemTemplate>
<asp:CheckBox ID="cbSelection" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="商品名称">
<ItemTemplate>
<a target="_blank" href='CommodityEdit.aspx?cid=<%# Eval("CommodityID") %>'>
<%#Eval("CommodityName") %>
</a>
<%--<asp:HyperLink ID="Commodity" runat="server"
NavigateUrl='<%#"CommodityEdit.aspx?cid="+DataBinder.Eval(Container.DataItem,"CommodityID")%> '>
<%# Eval("CommodityName") %>
</asp:HyperLink>--%>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="SortName" HeaderText="类别名称" />
<asp:BoundField DataField="CommodityPrice" HeaderText="价格" />
<asp:CheckBoxField DataField="IsDiscount" HeaderText="是否打折" ReadOnly="True" />
<asp:BoundField HeaderText="打折价格" DataField="ReducedPrice" />
</Columns>
</asp:GridView>
CommosdityManage.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;
using RL.DBUtility;
using System.Text;
using System.Data.SqlClient;
namespace mySupermarketDemo
{
public partial class CommodityManage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindDrop();
BindData();
}
}
// 绑定下拉框
private void BindDrop()
{
//获取分类ID和分类名称
string sql = "SELECT SortID,SortName FROM dbo.CommoditySort";
DataSet ds = DbHelperSQL.Query(sql);//将查询结果放入数据集ds中
ddlSort.DataSource = ds;//将数据源放至下拉菜单中
DataRow drNew = ds.Tables[0].NewRow();//方法,新建一行
drNew["SortID"] = 0;//为新增的一行添加两个属性
drNew["SortName"] = "全部";
ds.Tables[0].Rows.InsertAt(drNew,0);//将新增的一行添加到ds中
ddlSort.DataTextField = "SortName";//为下拉菜单设置初始值
ddlSort.DataValueField = "SortID";
ddlSort.DataBind();
}
//绑定数据
private void BindData()
{
//首先获取选定值得ID
int typeId = int.Parse(ddlSort.SelectedValue);
string goodName = txtCName.Text;
//采用字符串构造器的方式,写sql语句
StringBuilder sbSql = new StringBuilder();
sbSql.AppendLine("SELECT c.CommodityID,c.CommodityName ,t.SortName,c.CommodityPrice,c.IsDiscount,c.ReducedPrice ");
sbSql.AppendLine("FROM dbo.Commodity AS c");
sbSql.AppendLine("INNER JOIN dbo.CommoditySort AS t");
sbSql.AppendLine("ON c.SortID = t.SortID");
sbSql.AppendLine("WHERE 1=1");
if (typeId != 0)
{
sbSql.AppendLine("AND c.SortID = @SortID");
}
if (!string.IsNullOrEmpty(goodName))
{
sbSql.AppendLine("AND c.CommodityName LIKE @GoodName");
}
SqlParameter[] pms = {
new SqlParameter("@SortID",SqlDbType.Int,4),
new SqlParameter("@GoodName",SqlDbType.VarChar,50)
};
pms[0].Value = typeId;
pms[1].Value = "%" + goodName + "%";
DataSet ds = DbHelperSQL.Query(sbSql.ToString(), pms);
gvCommodity.DataSource = ds;
gvCommodity.DataBind();
}
//触发搜索按钮事件
protected void btnSearch_Click(object sender, EventArgs e)
{
BindData();
}
//触发删除按钮事件
protected void btnDelete_Click(object sender, EventArgs e)
{
StringBuilder sbIds = new StringBuilder();
//获取gridview里的checkbox是否被选中
foreach (GridViewRow gvr in gvCommodity.Rows)
{
CheckBox cbSelect = gvr.FindControl("cbSelection") as CheckBox;
if (cbSelect.Checked)
{
sbIds.Append(gvCommodity.DataKeys[gvr.RowIndex]["CommodityID"] + ",");
}
}
//todo Delete From Table Where ID IN (1,2,3,4..)
sbIds.Remove(sbIds.Length-1,1);//移除最后一个逗号
//判断选中了一个,还是选中了多个进行删除
if (sbIds.Length - 1 > 1)
{
sbIds.Insert(0, "DELETE FROM dbo.Commodity WHERE CommodityID in (");
sbIds.Insert(sbIds.Length,")");
}
else
{
sbIds.Insert(0, "DELETE FROM dbo.Commodity WHERE CommodityID = ");
}
DbHelperSQL.ExecuteSql(sbIds.ToString());
Response.Write("<script>alert('删除成功');</script>");
Response.Redirect("CommodityManage.aspx");
}
}
}
第五步:页面布局与功能添加(商品添加与商品信息修改界面)
注意这段代码:
private int cId = 0;
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString.AllKeys.Contains("cid"))
{
cId = int.Parse(Request.QueryString["cid"]);
}
if (!IsPostBack)
{
BindDrop();
if (cId != 0)
{
ShowInfo(cId);
}
}
}
先定义一下私有变量,再获取参数,因为系统默认当没有参数传入时,参数为0;
第六步:页面布局与功能添加(商品分类管理与用户管理,使用ajax验证是否已经存在)
前端代码:
<script language="javascript" type="text/javascript">
$(function () {
$("#btnAdd").click(function () { //点击事件
var name = $("#txtName").val();
var password = $("#txtPassword").val();
$.ajax({
url: "UsersManageHandler.ashx",
type: "POST",
data: { name: name, password: password },
success: function (data) {
if (data != '') {
alert(data);
} else {
location.reload();
}
}
}
);
});
});
</script>
后台代码:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.ContentType = "text/plain";
//获取用户名
string name = context.Request["name"];
string password = context.Request["password"];
//sql代码
string sql = "SELECT UserID,Password FROM Users where UserName = @name";
SqlParameter[] pms = {
new SqlParameter("@name",SqlDbType.NVarChar,50)
};
pms[0].Value = name;
DataSet ds = DbHelperSQL.Query(sql, pms);//执行sql语句,并利用DataSet将数据填充到本地内存中
int myInt = Convert.ToInt32(ds.Tables[0].Rows.Count);
//判断是否符合条件
if (myInt > 0 || (name == null || name.Length == 0))
{
context.Response.Write("请检查输入是否规范");
}
else
{
string sqlMyInsert = "INSERT INTO Users(UserName,Password) values (@UserName,@Password);";
SqlParameter[] pmsMyInsert = {
new SqlParameter("@UserName",SqlDbType.NVarChar,50),
new SqlParameter("@Password",SqlDbType.NVarChar,50)
};
pmsMyInsert[0].Value = name;
pmsMyInsert[1].Value = password;
DbHelperSQL.ExecuteSql(sqlMyInsert, pmsMyInsert);
}
}
效果展示: