C#简单超市管理系统 ﹏ヽ暗。殇╰゛Y 2021-06-24 16:11 399阅读 0赞 要完成的功能: 1.使用Asp.NET技术,完成超市商品管理系统 2.开发工具:VS2010 3.数据库:SQL Server 2008 功能模块:登录、账户管理、商品类别管理、商品信息管理 代码:[https://github.com/956159241/mySupermarketDemo][https_github.com_956159241_mySupermarketDemo] 一、登录界面,在前端实现判断是否为空,如果为空则提示,不进行处理,在后台实现判断是否用户名和密码是否正确,再进行登录。 ![2789632-8009656f0a370d8d.png][] 登录界面 二、登录之后进入商品管理界面。界面内,可以分类查询,检索(支持模糊查询),勾选删除,和新增功能,商品名称可以链接到商品详情界面,以及商品分类管理和用户信息管理两个超链接。 ![2789632-9bc6d664e06210eb.png][] 商品管理界面 三、新增界面可根据是否打折,打折价格控制打折价格是否能进行输入。 ![2789632-e68a2cc2f3b51942.png][] 新增界面 四、商品详情页,可修改页面内的数据。 ![2789632-b5aa1c500f04f766.png][] 商品详情 ![2789632-216c87d4b41c9cf4.png][] 商品详情页---这个地方再做的时候不传name,传ID 五、商品分类管理界面,通过Ajax判断类名是否存在,若无此类名再进行添加,如果类名已经存在,弹窗报错。 ![2789632-ede33bc126feaee6.png][] 商品分类管理 ![2789632-12e502cf44e8b0d8.png][] 商品分类管理 六、用户管理界面,跟商品管理界面功能相同。 ![2789632-8924656b44ee9223.png][] 用户管理界面 -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- ## 开始动工 ## ##### 第一步:数据库的建立; ##### ![2789632-995dd6d5cd69e850.png][] Commodity ![2789632-21c102e84eedb25b.png][] CommoditySort ![2789632-b331f2ee55a11bcb.png][] Users ###### 1.1 CommodityID为主键,SortID和CreateUserId为外键,都自动增长。 ###### ![2789632-09b7bd4cead73c0e.png][] Commodity表 ![2789632-3a650b083c97406e.png][] CommoditySort表 ###### 1.2 建立关系 ###### ![2789632-441088fbc550a3e6.png][] Commodity&CommoditySort ![2789632-76c1971738714738.png][] Commodity&Users ![2789632-a5da7b77fdc3e832.png][] 数据库关系图 ##### 第二步:项目的建立 ##### ###### 2.1 创建项目 ###### ![2789632-e44339004777620d.png][] 新建项目 ###### 2.2 添加应用 ###### ![2789632-d73dfb9142d97f57.png][] 添加引用 ###### 2.3 配置web.config ###### ![2789632-36186d7d31c1a49c.png][] 数据库配置 代码: <add name="MainConn" connectionString="server=.;database=mySupermarketDemo;user=sa;pwd=0301;Max Pool Size = 512;" providerName="System.Data.SqlClient" /> ##### 第三步: 页面布局与功能的添加(登录界面) ##### ###### 3.1 初步的搭建 ###### ![2789632-7d33ddb06fd06c41.png][] 基本布局 ![2789632-f80a9d490f4fbc7e.png][] 基本代码 **知识点补充:** * 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好丑啊……) ###### ![2789632-54e6c6a0830bd974.png][] 登录界面 ![2789632-694656c58d554bc3.png][] 不输入用户名 ![2789632-de89dc3fd1d5a9be.png][] 不输入密码 ![2789632-9d8f5b7505d11e95.png][] 后台的用户名和密码验证 *小知识点:*top 1的用处:选出第一条记录,常与order by联合使用。如下: ![2789632-b10246bb39e56fed.png][] ![2789632-3a320e07e3bdd7cd.png][] 当有重复数据是,可根据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); } } 效果展示: ![2789632-546d01012c270d9a.gif][] ![2789632-adc9d50faa0e824b.gif][] ![2789632-3b18269684ea9294.png][] 公众号.png [https_github.com_956159241_mySupermarketDemo]: https://github.com/956159241/mySupermarketDemo [2789632-8009656f0a370d8d.png]: /images/20210615/6c91acb428a94ba3bbaab57a5d578c56.png [2789632-9bc6d664e06210eb.png]: /images/20210615/8e9aedfd4d494b80bdd914f389dbe7fc.png [2789632-e68a2cc2f3b51942.png]: /images/20210615/ecca138ee34e4e5a9ef8dba3cadec70c.png [2789632-b5aa1c500f04f766.png]: /images/20210615/01f0ae06184c4365917bce7a366f2f04.png [2789632-216c87d4b41c9cf4.png]: /images/20210615/8d57eb3cfb644e40aab3bb707a11f9f9.png [2789632-ede33bc126feaee6.png]: /images/20210615/ee4046823fbd44fe96729cd55c1431a2.png [2789632-12e502cf44e8b0d8.png]: /images/20210615/9f647dc6a2f1490594c334e8b52d700d.png [2789632-8924656b44ee9223.png]: /images/20210615/4614e42cfd7945fdada7ac04dcc7df7a.png [2789632-995dd6d5cd69e850.png]: /images/20210615/87728749e1db4ae9b5189fc73ecfc2b8.png [2789632-21c102e84eedb25b.png]: /images/20210615/b207fade0f454b37aab5b72a78d9ed10.png [2789632-b331f2ee55a11bcb.png]: /images/20210615/7e84c31d949249e1abd9f7e6dff13c97.png [2789632-09b7bd4cead73c0e.png]: /images/20210615/8abd9af646e44e6c922acc9010a12a44.png [2789632-3a650b083c97406e.png]: /images/20210615/059e825b8a054faeb060e83a6076a8ea.png [2789632-441088fbc550a3e6.png]: /images/20210615/f9e434c1bb194bf78cbbd01dce51da72.png [2789632-76c1971738714738.png]: /images/20210615/9a3d1564d7e7458c99ad9428b164fa0a.png [2789632-a5da7b77fdc3e832.png]: /images/20210615/6a52d2d89ca54a87964a79eeb16382c3.png [2789632-e44339004777620d.png]: /images/20210615/23ef518735594481a5c59e7aff1570e2.png [2789632-d73dfb9142d97f57.png]: /images/20210615/a1646bc2f45b48f58d7722de6cf9f38b.png [2789632-36186d7d31c1a49c.png]: /images/20210615/91154682ee4649a291548c51da27510c.png [2789632-7d33ddb06fd06c41.png]: /images/20210615/ea70ee1a5acb45448d48618698e73af8.png [2789632-f80a9d490f4fbc7e.png]: /images/20210615/725ec1a83b7f4e5d943932db935991c3.png [2789632-54e6c6a0830bd974.png]: /images/20210615/5567cd95734c4e928dbc9afe27a78be9.png [2789632-694656c58d554bc3.png]: /images/20210615/99302f2358f6484cb9a94ea888cabde8.png [2789632-de89dc3fd1d5a9be.png]: /images/20210615/2822ddbbf88a4d9985c7adec8bb3ad7c.png [2789632-9d8f5b7505d11e95.png]: /images/20210615/ab2d4d89fa614cf6a03bd4c1979f8471.png [2789632-b10246bb39e56fed.png]: /images/20210615/0b945d68f770455ba1d4d592392881ce.png [2789632-3a320e07e3bdd7cd.png]: /images/20210615/333325f5833842beb77dc558c1d7eb3d.png [2789632-546d01012c270d9a.gif]: /images/20210615/966584c7caed43ddb1ceb3beb9edc3c8.png [2789632-adc9d50faa0e824b.gif]: /images/20210615/5e427294ddac4349942948b7a98f8403.png [2789632-3b18269684ea9294.png]: /images/20210615/18d4f788567441f7b48a1c3eed24d903.png
还没有评论,来说两句吧...