C#简单超市管理系统

要完成的功能:
1.使用Asp.NET技术,完成超市商品管理系统
2.开发工具:VS2010
3.数据库:SQL Server 2008
功能模块:登录、账户管理、商品类别管理、商品信息管理
一、登录界面,在前端实现判断是否为空,如果为空则提示,不进行处理,在后台实现判断是否用户名和密码是否正确,再进行登录。

登录界面

二、登录之后进入商品管理界面。界面内,可以分类查询,检索(支持模糊查询),勾选删除,和新增功能,商品名称可以链接到商品详情界面,以及商品分类管理和用户信息管理两个超链接。

商品管理界面

三、新增界面可根据是否打折,打折价格控制打折价格是否能进行输入。


新增界面

四、商品详情页,可修改页面内的数据。

商品详情
商品详情页---这个地方再做的时候不传name,传ID

五、商品分类管理界面,通过Ajax判断类名是否存在,若无此类名再进行添加,如果类名已经存在,弹窗报错。


商品分类管理
商品分类管理

六、用户管理界面,跟商品管理界面功能相同。

用户管理界面






开始动工

第一步:数据库的建立;
Commodity
CommoditySort
Users
1.1 CommodityID为主键,SortID和CreateUserId为外键,都自动增长。
Commodity表
CommoditySort表
1.2 建立关系
Commodity&CommoditySort
Commodity&Users
数据库关系图
第二步:项目的建立
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);

            }
        }

效果展示:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,357评论 0 17
  • ZQ郑阅读 114评论 0 0
  • 父母相爱,就是最好的家教。 孩子会知道,和睦的关系是怎样的,亲密关系该如何处理,发生矛盾该如何沟通,他人有了情绪该...
    海蓉sarah阅读 285评论 0 1
  • 把你当作精神寄托 若离去 瞬间世界崩塌
    爱花痴阅读 191评论 0 0