点菜吧——随便点 C#生成套餐

前言

一到食堂发现有多种选择,但是有一个固定的套路,只能是一个荤,二个小荤,菜品数量也不少,任君选择,如果是一个选择困难症,就有点烦了,所以出品这个自动生成套餐软件。各位老板可以选菜了,还可以拆除一些不想要的菜,不勾选的菜就不会被选择。

一、效果展示

二、代码实现

1、WPF前台代码

<StackPanel x:Name="OptionalMenu" Orientation="Horizontal" Grid.RowSpan="2">
    <GroupBox Header="组别1" x:Name="group1" Margin="0,5,50,0" FontSize="20">
        <ScrollViewer VerticalScrollBarVisibility="Auto" >
            <StackPanel x:Name="groupPanel1"  />
        </ScrollViewer>
       
    </GroupBox>
    <GroupBox Header="组别2" x:Name="group2" Margin="0,5,50,0" FontSize="20">
        <ScrollViewer x:Name="scrList" Margin="0" VerticalScrollBarVisibility="Auto"  >
            <StackPanel x:Name="groupPanel2">

            </StackPanel>
        </ScrollViewer>
        
    </GroupBox>
</StackPanel>

<Button Grid.Column="1" Height="30" Width="100" Click="Button_Click" Background="Cyan" FontSize="20"
        Foreground="ForestGreen">选择</Button>
<RichTextBox Grid.Column="1" Grid.Row="1" Background="BlanchedAlmond" Name="logInfo" FontSize="18">
    
</RichTextBox>

2、后台业务

1)、初始化数据

主要是从XML加载菜单,这个XML后期可以根据实际情况进行调整。

public void InitToolInfo(string filename)
{

    XmlDocument doc = new XmlDocument();
    doc.Load(filename);
    XmlNode xn = doc.SelectSingleNode("Mean");//要读取xml子目录路径
    XmlNodeList xnl = xn.ChildNodes;
    foreach (var item in xnl)
    {
        string sts = "";
        XmlElement xe = (XmlElement)item;
        sts = xe.GetAttribute("id");
        XmlNodeList xnl0 = xe.ChildNodes;
        List<MeanItem> newList = new List<MeanItem>();
        for (int i = 0; i < xnl0.Count; i++)
        {
            string info = xnl0.Item(i).InnerText;
            MeanItem data = new MeanItem(info,sts);
            
            newList.Add(data);

        }
        mainMeanColls[sts] = newList;
    }
}
2)、绑定控件与数据源
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    keys = mainMeanColls.Keys.ToArray();
    if (keys.Length!=2)
    {
        MessageBox.Show("菜单加载异常!");
        return;
    }
    group1.Header = keys[0];
    foreach (var item in mainMeanColls[keys[0]])
    {
        CheckBox checkBox = new CheckBox();
        checkBox.Style =(Style) this.FindResource("ckbStyle");
        checkBox.Content = item.Name;
        LinkContrToObj(checkBox, item);
        groupPanel1.Children.Add(checkBox);
    }
    group2.Header = keys[1];

    foreach (var item in mainMeanColls[keys[1]])
    {
        CheckBox checkBox = new CheckBox();
        checkBox.Style = (Style)this.FindResource("ckbStyle");
        checkBox.Content = item.Name;

        LinkContrToObj(checkBox, item);

        groupPanel2.Children.Add(checkBox);
    }
}
3)、筛选框与源关联
 private void LinkContrToObj(CheckBox box,MeanItem obj)
 {
     var myBinding = new Binding("IsHave")
     {
         Source = obj
     };

     // Bind the data source to the TextBox control's Text dependency property
     box.SetBinding(CheckBox.IsCheckedProperty, myBinding);
 }
4)、选菜逻辑

当然有心的同学可能会发现一个问题,这个选择一个菜品与上一个不重复的逻辑有点哪啥了 ,可以考虑先剔除上菜单中的一个菜品,再去选择这样就发型Whie循环了。

 private void GetResult()
 {
     string res1 = ExecuChoose(mainMeanColls[keys[0]].Where(t => t.IsHave == true).ToList(),1);
     string res2 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(),2);
     string res3 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(),3);
     while (res2==res3)
     {
         res3 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(), 3);
     }
     string res4 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(),4);
     while (res4 == res2||res4==res3)
     {
         res4 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(), 4);
     }
     OutInfo($"结果>>:{keys[0]}-{res1};{keys[1]}-{res2},{res3},{res4}");
 }

 private string ExecuChoose(List<MeanItem> items,int num)
 {
     Random random = new Random(int.Parse(DateTime.Now.ToString("HHmmssfff"))+num);
     int a = random.Next(1, items.Count);
     return items[a - 1].Name;
 }
5)、数据结构

    /// <summary>
    /// 菜单节点项
    /// </summary>
    internal class MeanItem : INotifyPropertyChanged
    {
        public string Name { get; set; }
        private bool isHave;

        public bool IsHave
        {
            get => isHave;
            set
            {
                if (value == isHave)
                {
                    return;
                }
                isHave = value;
                OnPropertyChanged("IsHave");
            }
        }

        public string GroupName { get; set; }

        public MeanItem()
        {
            IsHave = true;
        }

        public MeanItem(string name, string groupName) : this()
        {
            this.Name = name;
            this.GroupName = groupName;
        }

        public MeanItem(string name, bool isHave, string groupName)
            : this(name, groupName)
        {
            this.IsHave = isHave;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
6)、XML菜单配置
<?xml version="1.0" encoding="utf-8" ?>

<Mean>
	<group id="大荤">
		<item >土豆牛肉</item>
		<item >红烧鸭块</item>
		<item >梅干菜肉</item>
		<item >狮子头</item>
		<item >蛋饺</item>
		<item >凉拌猪头肉</item>
		<item >口水鸡</item>
		<item >炒猪肝</item>
		<item >回锅肉</item>
		<item >尖椒鸡丁</item>
		<item >青椒猪肚</item>
		<item >排骨</item>
		<item >虾</item>
		<item >香肠</item>
	</group>
	<group id="小荤">
		<item >凉拌豆皮</item>
		<item >凉拌海带</item>
		<item >皮蛋豆腐</item>
		<item >凉拌粉皮</item>
		<item >凉拌黄瓜</item>
		<item >雪菜蚕豆</item>
		<item >红烧豆腐</item>
		<item >毛豆肉丝</item>
		<item >花菜</item>
		<item >竹笋肉丝</item>
		<item >豆芽粉丝</item>
		<item >海鲜菇肉丝</item>
		<item >西葫芦肉丝</item>
		<item >土豆丝</item>
		<item >青菜</item>
		<item >尖椒炒蛋</item>
		<item >芹菜肉丝</item>
		<item >韭菜炒蛋</item>
		<item >包菜</item>
		<item >番茄炒蛋</item>
		<item >凉拌木耳</item>
		<item >青椒香干</item>
		<item >青菜</item>
		<item >尖椒炒蛋</item>
		<item >芹菜肉丝</item>
		<item >韭菜炒蛋</item>
		<item >包菜</item>
		<item >番茄炒蛋</item>
		<item >凉拌木耳</item>
		<item >青椒香干</item>
	</group>
</Mean>

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园食堂点菜管理系统是一个用于方便校园食堂点菜流程的系统。它主要分为前台点菜和后台管理两个模块,以提高点菜的效率和准确性。 前台点菜模块是供学生和教职工使用的,他们可以通过手机App或者其他设备上的界面来选择菜品。该系统会提供一个菜单列表,其中包含可选择的菜品和相关的信息(如价格、口味、营养成分等)。用户可以根据自己的偏好选择菜品,系统会自动计算总价并提供支付方式,如微信支付、校园卡等。此外,用户还可以选择预订时间和地,以便餐厅提前准备好相应的菜品。 后台管理模块主要供食堂管理员使用,他们可以通过系统管理菜品的信息。管理员可以根据菜品的销量、评价和库存情况来调整菜单,以确保能够提供具有口碑和供应能力的菜品。管理员还可以追踪每个订单的状态,例如确认付款、制作菜品和配送等,并及时解决任何可能出现的问题。 校园食堂点菜管理系统的优在于提高了校园食堂的服务质量和效率。它可以减少人工操作的错误和时间浪费,提供了方便快捷的点菜方式,同时也节省了学生等用户排队餐的时间。此外,系统可以根据菜品销量和评价情况提供数据分析,帮助管理员更好地了解用户的需求,并进行菜单和服务的优化。 总之,校园食堂点菜管理系统是一个有利于提高点菜流程效率和服务质量的工具,能够方便学生和教职工点菜并提供数据支持给管理员来进行菜单调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值