C#餐饮管理系统点加菜(图片和排名)

C#餐饮管理系统 加菜模块的改进

这套餐饮管理系统可能已经有年头了,但是作为像我们大学生这样初学者是还是可以的
对于点加菜模块,老师为我们提出了新要求:可以显示菜系的图片,可以查看菜的排名情况
在此做一个简单的总结,关于将图片上传到数据库可以参考C#从数据库上传和下载图片
在这里插入图片描述
首先,先来看一下排名的显示
如果我们用程序实现数据库数据的排序是一件非常麻烦的事,当然要选用数据库的sql语句来排序就方便多了,问题是怎么排序。我们很容易知道食物的排名完全要看销量
所以我们不妨在数据库新建一个视图用来显示

create view foodPM
as
select Row_Number() over (ORDER BY foodXL DESC) as 排名 ,foodname as 菜名,foodtype as 类别,foodXL as 销量
from tb_food,tb_foodtype
where tb_food.ID = tb_foodtype.ID
--这里需要查找两个表,菜系表是一定的,为了客户方便也要说明一下类别所以还需要类别表的信息

最重要的代码就是第一句Row_Number() over (ORDER BY foodXL DESC) as 排名
排名是怎么来的呢?是根据销量(foodXL)来排序的,排序后我们要生成一个新列,利用Row_Number() 函数可以自动形成一个排名,这个函数类似与自增长可以自动的填好排名1,2…
把foodXL参数填进去就可以显示出排名信息了在这里插入图片描述
之后还有一点就是动态更新,在用户输入需要的菜系数量后,要及时的更新销量并重新排名,由此可见使用视图是明智的,我们不需要重复的写代码,如果我们的销量更新也是需要建立数据库连接然后读出数据在更新数据,我认为这没有必要,毕竟这样很麻烦,而且不断的连接数据库也会增大系统的开销,所以建立一个触发器

CREATE TRIGGER food_Insert
ON [dbo].[tb_GuestFood]
after INSERT 
as
BEGIN
  declare @number int;
	SELECT @number = foodsum from inserted;
    UPDATE tb_food
	SET foodXL = foodXL + @number
	where foodnum in (select foodnum from inserted)
END

这里的变量@number是用户点菜的数量,添加触发器后inserted就是插入的记录,我们从插入的记录中查找出数量并赋值给变量,更新的位置就是插入的菜系,之后在更新tb_food表就很容易了而且简单,漂亮。
还有一个问题就是为DataTree控件添加菜名,做的真的是老土,不想说啥了,原文中只给出了四中类别,而且他是逐个列出的,如果该酒店做的很大,很厉害,菜品种类很多呢,一一列出那岂不是要累坏了
所以做了如下改进:

            con = DataBase.DataBaseCon.GetConnection();
            cmd = con.CreateCommand();
            cmd.CommandText = "select * from tb_foodtype";
            adapter = new SqlDataAdapter(cmd);
            DataSet dataSet = new DataSet();
            adapter.Fill(dataSet,"foodtype");
            DataTable table = dataSet.Tables["foodtype"];
            //先利用datatable来存储类别的信息再遍历类别,为每个类别添加子节点
            //因为类别的信息放在DataRow中,所以只要读取row中的信息就可以了
            //这时候再去通过改变sdr来进行每个类别的读取并添加到节点,所以就不用为每个类别都去写了
            foreach (DataRow row in table.Rows)
            {
                TreeNode node = tvFood.Nodes.Add(row["foodtype"].ToString().Trim());
                cmd.CommandText = "select foodname from tb_food where foodty = '" + row["ID"].ToString().Trim() + "'";
                sdr = cmd.ExecuteReader();
                while (sdr.Read())
                {
                    node.Nodes.Add(sdr["foodname"].ToString().Trim());
                }
                sdr.Close(); //这里要关闭 因为他们公用一个sdr
            }
            tvFood.ExpandAll();
            
//这一句和以上无关,只是判断的时候还要一个一个的判断父节点(类别),也没有必要,所以在这里列举出来
//我们只要判断当前点击的节点是不是叶子节点就行了,因为叶子节点代表了具体的菜名称
 if (tvFood.SelectedNode.Nodes.Count == 0) //当前选择节点的子节点个数为0,代表这个节点是叶子节点

一点关于触发器的

关于Sql Sever触发器和sql有点不同,起码在我的认知范围内,因为我没有很正经的学过sql的编程,只是会用简单的查询和更新语句
在此为MySql的触发器也做一个简单的总结,我也只使用过简单的添加

CREATE
TRIGGER `员工信息表_insert` AFTER INSERT ON `员工信息表`
FOR EACH ROW --AFTER INSERT意思为插入后在员工信息表触发
BEGIN
declare qx int default 0;
IF(new.`职称`='董事长' OR new.`职称`='总经理')THEN
  SET qx=1;
END IF;
if(new.`职称`='部门经理')THEN
	SET qx=2;
END IF;
if(new.`职称`='员工')THEN
	SET qx=3;
END IF;
INSERT INTO `用户信息表` VALUES (NEW.`工号`, NEW.`联系方式`,'Image/Headimage.jpg', qx);
END;

CREATE
TRIGGER `员工信息表_update` AFTER UPDATE ON `员工信息表`
FOR EACH ROW      --修改后触发
BEGIN
declare qx int default 0;
IF(new.`职称`='董事长' OR new.`职称`='总经理')THEN
  SET qx=1;
END IF;
if(new.`职称`='部门经理')THEN
	SET qx=2;
END IF;
if(new.`职称`='员工')THEN
	SET qx=3;
END IF;
UPDATE `用户信息表`
SET `权限`=qx
WHERE `工号`=new.`工号`;
END;

show triggers

这里的new和sqlSever中的inserted效果是一样的,我也不太清楚是为什么写法不一样,也是我对sql不了解不知道具体的用法,网上的例子一查一大堆,大部分都是这样的
这里的MySql触发器是因为需要为每个员工设置成一个系统的用户,初始密码是手机号
并根据不同的职称来判断权限,这样就不用自己使用代码插入了,在修改职称后也是同样更改权限。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值