C#点餐系统

C# 同时被 2 个专栏收录
2 篇文章 0 订阅
1 篇文章 0 订阅

项目介绍:一家店铺使用的外卖点餐系统
本项目分三大模块:登录注册模块,用户模块,店家模块

1.登录注册模块

登录分为用户登录和管理员登录(店家),管理员有且只有一个账号可以登录。用户登录需要先注册,注册必须用手机号注册。

登录界面效果图
登录主要就是判断,多加些判断就行了在这里插入图片描述
登录代码展示:

 #region 窗体效果
        public class Win32
        {
            public const Int32 AW_HOR_POSITIVE = 0x00000001; // 从左到右打开窗口
            public const Int32 AW_HOR_NEGATIVE = 0x00000002; // 从右到左打开窗口
            public const Int32 AW_VER_POSITIVE = 0x00000004; // 从上到下打开窗口
            public const Int32 AW_VER_NEGATIVE = 0x00000008; // 从下到上打开窗口
            public const Int32 AW_CENTER = 0x00000010; //若使用了AW_HIDE标志,则使窗口向内重叠;若未使用AW_HIDE标志,则使窗口向外扩展。
            public const Int32 AW_HIDE = 0x00010000; //隐藏窗口,缺省则显示窗口。
            public const Int32 AW_ACTIVATE = 0x00020000; //激活窗口。在使用了AW_HIDE标志后不要使用这个标志。
            public const Int32 AW_SLIDE = 0x00040000; //使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略。
            public const Int32 AW_BLEND = 0x00080000; //使用淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志。
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern bool AnimateWindow(
          IntPtr hwnd, // handle to window
              int dwTime, // duration of animation
              int dwFlags // animation type
              );
        }
        #endregion
        ValidCode validCode = new ValidCode(5, ValidCode.CodeType.Numbers);//实例化这个对象
        
        //窗体加载
        private void Login_Load(object sender, EventArgs e)
        {
            picValidCode.Image = Bitmap.FromStream(validCode.CreateCheckCodeImage());//点击图片更换验证码
            Win32.AnimateWindow(this.Handle,500, Win32.AW_VER_POSITIVE);//窗体出现效果
        }

        //验证码图片
        private void picValidCode_Click(object sender, EventArgs e)
        {
            picValidCode.Image = Bitmap.FromStream(validCode.CreateCheckCodeImage());//点击图片更换验证码
        }

        //注册
        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Enroll EN = new Enroll();
            this.Hide();
            EN.ShowDialog();
            Application.ExitThread();
        }

        //登录按钮
        private void LoginButton_Click(object sender, EventArgs e)
        {
            Saveusername.name = Username.Text;
            string sql = string.Format("select * from UserList where UserID='{0}'and UserPassword='{1} '", Username.Text, password.Text);
            SqlDataReader reader = DBHelper.GetDataReader(sql);
            if (Username.Text == "")
            {
                MessageBox.Show("请输入用户名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            else if (password.Text == "")
            {
                MessageBox.Show("请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            else if (!this.txtValidCode.Text.Equals(validCode.CheckCode))//验证是否输入正确
            {

                MessageBox.Show(" 请输入正确的验证码!", this.Text);

                this.txtValidCode.Focus();
                this.txtValidCode.Text = "";
                reader.Close();
                return;

            }
            else if (reader.Read())
            {
                Saveusername.ID = reader["ID"].ToString();//获取ID用于个人中心修改信息
                reader.Close();
                if (Saveusername.name=="Sweet")
                {
                    管理员界面.GLY gLY = new 管理员界面.GLY();
                    this.Hide();
                    gLY.ShowDialog();
                    Application.ExitThread();
                }
                XMB xMB = new XMB();
                this.Hide();
                xMB.ShowDialog();
                Application.ExitThread();
            }
            else
            {
                MessageBox.Show("用户名或密码输入错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            reader.Close();

            picValidCode.Image = Bitmap.FromStream(validCode.CreateCheckCodeImage());//点击图片更换验证码
        }

        //忘记密码
        private void linkLabel1_LinkClicked_1(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ForgetPwd forget = new ForgetPwd();
            this.Hide();
            forget.ShowDialog();
            Application.ExitThread();
        }
        #region 用于窗体移动
        private Point mPoint;//定义一个位置信息Point用于存储鼠标位置
        private void Login_MouseDown(object sender, MouseEventArgs e)
        {
            mPoint = new Point(e.X, e.Y);
        }

        private void Login_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
            }
        }
        #endregion

        private void Login_FormClosed(object sender, FormClosedEventArgs e)
        {
            Win32.AnimateWindow(this.Handle, 500, Win32.AW_BLEND|Win32.AW_HIDE);
        }

        private void pictureBox3_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void pictureBox4_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;//最小化
        }

图片验证码代码展示:

 public class ValidCode
    {
        #region Private Fields

        private const double PI = 3.1415926535897932384626433832795;

        private const double PI2 = 6.283185307179586476925286766559;

        //private readonly int _wordsLen = 4; 

        private int _len;

        private CodeType _codetype;

        private readonly Single _jianju = (float)18.0;

        private readonly Single _height = (float)24.0;

        private string _checkCode;

        #endregion

        #region Public Property

        public string CheckCode
        {

            get
            {

                return _checkCode;

            }

        }

        #endregion

        #region Constructors

        /// <summary> 

        /// public constructors 

        /// </summary> 

        /// <param name="len"> 验证码长度 </param> 

        /// <param name="ctype"> 验证码类型:字母、数字、字母+ 数字 </param> 

        public ValidCode(int len, CodeType ctype)
        {

            this._len = len;

            this._codetype = ctype;

        }

        #endregion

        #region Public Field

        public enum CodeType { Words, Numbers, Characters, Alphas }

        #endregion

        #region Private Methods



        private string GenerateNumbers()
        {

            string strOut = "";

            System.Random random = new Random();

            for (int i = 0; i < _len; i++)
            {

                string num = Convert.ToString(random.Next(10000) % 10);

                strOut += num;

            }

            return strOut.Trim();

        }



        private string GenerateCharacters()
        {

            string strOut = "";

            System.Random random = new Random();

            for (int i = 0; i < _len; i++)
            {

                string num = Convert.ToString((char)(65 + random.Next(10000) % 26));

                strOut += num;

            }

            return strOut.Trim();

        }

        // 

        private string GenerateAlphas()
        {

            string strOut = "";

            string num = "";

            System.Random random = new Random();

            for (int i = 0; i < _len; i++)
            {

                if (random.Next(500) % 2 == 0)
                {

                    num = Convert.ToString(random.Next(10000) % 10);

                }

                else
                {

                    num = Convert.ToString((char)(65 + random.Next(10000) % 26));

                }

                strOut += num;

            }

            return strOut.Trim();

        }



        private System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
        {

            System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);



            // 将位图背景填充为白色 

            System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp);

            graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height);

            graph.Dispose();



            double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;



            for (int i = 0; i < destBmp.Width; i++)
            {

                for (int j = 0; j < destBmp.Height; j++)
                {

                    double dx = 0;

                    dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;

                    dx += dPhase;

                    double dy = Math.Sin(dx);



                    // 取得当前点的颜色 

                    int nOldX = 0, nOldY = 0;

                    nOldX = bXDir ? i + (int)(dy * dMultValue) : i;

                    nOldY = bXDir ? j : j + (int)(dy * dMultValue);



                    System.Drawing.Color color = srcBmp.GetPixel(i, j);

                    if (nOldX >= 0 && nOldX < destBmp.Width

                     && nOldY >= 0 && nOldY < destBmp.Height)
                    {

                        destBmp.SetPixel(nOldX, nOldY, color);

                    }

                }

            }



            return destBmp;

        }

        #endregion

        #region Public Methods

        public Stream CreateCheckCodeImage()
        {

            string checkCode;

            switch (_codetype)
            {

                case CodeType.Alphas:

                    checkCode = GenerateAlphas();

                    break;

                case CodeType.Numbers:

                    checkCode = GenerateNumbers();

                    break;

                case CodeType.Characters:

                    checkCode = GenerateCharacters();

                    break;

                default:

                    checkCode = GenerateAlphas();

                    break;

            }

            this._checkCode = checkCode;

            MemoryStream ms = null;

            // 

            if (checkCode == null || checkCode.Trim() == String.Empty)

                return null;

            Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * _jianju)), (int)_height);

            Graphics g = Graphics.FromImage(image);

            try
            {

                Random random = new Random();

                g.Clear(Color.White);

                // 画图片的背景噪音线 

                for (int i = 0; i < 18; i++)
                {

                    int x1 = random.Next(image.Width);

                    int x2 = random.Next(image.Width);

                    int y1 = random.Next(image.Height);

                    int y2 = random.Next(image.Height);

                    g.DrawLine(new Pen(Color.FromArgb(random.Next()), 1), x1, y1, x2, y2);

                }

                Font font = new System.Drawing.Font("Times New Roman", 14, System.Drawing.FontStyle.Bold);

                LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);

                if (_codetype != CodeType.Words)
                {

                    for (int i = 0; i < checkCode.Length; i++)
                    {

                        g.DrawString(checkCode.Substring(i, 1), font, brush, 2 + i * _jianju, 1);

                    }

                }
                else
                {

                    g.DrawString(checkCode, font, brush, 2, 2);

                }

                // 画图片的前景噪音点 

                for (int i = 0; i < 150; i++)
                {

                    int x = random.Next(image.Width);

                    int y = random.Next(image.Height);

                    image.SetPixel(x, y, Color.FromArgb(random.Next()));

                }

                // 画图片的波形滤镜效果 

                if (_codetype != CodeType.Words)
                {

                    image = TwistImage(image, true, 3, 1);

                }

                // 画图片的边框线 

                g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);



                ms = new System.IO.MemoryStream();

                image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);

            }

            finally
            {

                g.Dispose();

                image.Dispose();

            }

            return ms;

        }
 
        #endregion

注册界面效果图

注册界面代码展示
短信验证码,用接口就能实现

 TimeSpan dtTo = new TimeSpan(0, 0, 60);//设置计时器的开始时间
        int value;//用来存储随机数
        public Enroll()
        {
            InitializeComponent();
        }

        //获取短信验证码
        private void CodeButton_Click(object sender, EventArgs e)
        {
            Regex rx = new Regex(@"^0{0,1}(13[0-9]|15[0-9]|15[0-9]|18[0-9]|17[0-9])[0-9]{8}$");
            if (!rx.IsMatch(EnrollTel.Text))
            {
                EnrollTel.Text = "";
                MessageBox.Show("手机号格式不正确,请重新输入", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            else
            {
                Random rad = new Random();//实例化随机数产生器rad;
                value = rad.Next(1000, 10000);//用rad生成大于等于1000,小于等于9999的随机数;
                Note.NoTe(EnrollTel.Text, value);
                timer1.Start();
                dtTo = new TimeSpan(0, 0, 60);
            }
        }

        //时间控件用来实现60秒倒计时
        private void timer1_Tick_1(object sender, EventArgs e)
        {
            CodeButton.Enabled = false;
            dtTo = dtTo.Subtract(new TimeSpan(0, 0, 1));//每隔一秒减一
            CodeButton.Text = "(" + dtTo.Seconds.ToString() + ")" + "重新获取";

            if (dtTo.TotalSeconds == 0.0)//当倒计时完毕
            {
                this.CodeButton.Enabled = true;
                CodeButton.Text = "点击获取验证码";
                this.timer1.Stop();
                timer1.Dispose();
            }
        }

        //注册按钮
        private void FinishButton_Click(object sender, EventArgs e)
        {
            bool Bool = Fac();
            if (Bool)
            {
                string type = "普通用户";
                string sex = "";
                if (RadioMan.Checked)//判断单选按钮的text
                {
                    sex = RadioMan.Text;
                }
                else if (RadioWoman.Checked)
                {
                    sex = RadioWoman.Text;
                }
                string sql = string.Format("insert into UserList values('{0}','{1}','{2}','{3}','{4}','{5}')", EnrollUser.Text, EnrollPwd.Text, sex, EnrollTel.Text, EnrollAddress.Text, type);
                bool sqlinsert = DBHelper.ExecuteNonQuery(sql);
                if (sqlinsert)
                {
                    DialogResult result = MessageBox.Show("注册成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
                    this.Hide();
                    Login LG = new Login();
                    LG.ShowDialog();
                }
            }
            else
            {
                return;
            }
        }

        /// <summary>
        /// 用于注册界面里格式的判断
        /// </summary>
        /// <returns></returns>
        private bool Fac()
        {
            string sql = string.Format("select * from UserList where UserID='{0}'", EnrollUser.Text);
            SqlDataReader reader = DBHelper.GetDataReader(sql);
            if (EnrollUser.Text == "")
            {
                MessageBox.Show("用户名不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                reader.Close();
                return false;
            }
            else if (EnrollPwd.Text == "")
            {
                MessageBox.Show("请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                reader.Close();
                return false;
            }
            else if (EnrollPwd.Text != EnrollPwdY.Text)
            {
                MessageBox.Show("两次密码必须一样!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                reader.Close();
                return false;
            }
            else if (EnrollTel.Text == "")
            {
                MessageBox.Show("请输入手机号!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                reader.Close();
                return false;
            }
            else if (EtxtValidCode.Text == "")
            {
                MessageBox.Show("请输入验证码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                reader.Close();
                return false;
            }
            else if (int.Parse(EtxtValidCode.Text) != value)
            {
                MessageBox.Show("请输入正确的验证码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                reader.Close();
                return false;
            }
            else if (reader.Read())
            {
                DialogResult result = MessageBox.Show("此用户已存在,是否前往登录?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    Login LG = new Login();
                    LG.ShowDialog();
                    reader.Close();
                    this.Close();
                    return false;
                }
                else
                {
                    reader.Close();
                    return false;
                }
            }
            else
            {
                reader.Close();
                return true;
            }
        }

        //窗体加载事件
        private void Enroll_Load(object sender, EventArgs e)
        {
            CodeButton.Text = "点击获取验证码";
            timer1.Interval = 1000;//设置每次间隔一秒

        }

忘记密码界面效果图
在这里插入图片描述
下面为用户界面的展示
简单介绍一下:由于菜品是有很多的而且不确定数量,所以必须动态加载,不能拖图片控件等。
用户功能实现思路:首先要知道每个用户只能看自己的,所以在登录时候就必须用一个东西接收用户输入的名字,以便在主界面显示出与该用户相匹配的数据。
在这里插入图片描述
购物车界面
购物车首先要有一个购物车表用来存储用户添加的商品,当用户结账以后,购物车表中该用户的信息就应全部清除。然后为该用户生成订单(存入信息到订单表),并将用户购买的商品存入订单详情表中。
在这里插入图片描述
动态加载菜品代码展示

private void XMB_Load(object sender, EventArgs e)
        {
            /*SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
            SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲*/
            linke_热菜.LinkColor = Color.Gray;
            Win32.AnimateWindow(this.Handle, 500, Win32.AW_CENTER);//窗体出现效果
            Order_pl.Visible = false;
            Or_panel1.Visible = false;//隐藏订单控件
            menu_all_全部.AutoScroll = true;//添加滚动条
            this.toolStripStatusLabel1.Font = new Font("微软雅黑", 12, FontStyle.Bold);
            toolStripStatusLabel1.Text = string.Format("欢迎“{0}”使用Sweet点餐系统!                                               ", Saveusername.name);
            this.timer2.Start();

            string sql = "select * from Food_table";
            DataSet ds = DBHelper.GetDataSet(sql);
            int xx = 0;
            int yy = 0;
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                Label FoodName = new Label();
                Label FoodPrice = new Label();
                PictureBox picture = new PictureBox();
                Button button = new Button();//创建控件
                FoodName.Name = "FoodName_" + i;
                FoodPrice.Name = "FoodPrice_" + i;
                picture.Name = "picture_" + i;
                button.Name = ds.Tables[0].Rows[i]["FoodID"].ToString();//加入购物车按钮命名为菜品表的FoodID
                FoodName.Text = ds.Tables[0].Rows[i]["FoodName"].ToString();
                FoodPrice.Text = "¥" + ds.Tables[0].Rows[i]["FoodPrice"].ToString() + "/份";//控件text属性赋值
                button.Text = "加入购物车";
                FoodName.AutoSize = true;
                FoodPrice.AutoSize = true;
                button.AutoSize = true;
                FoodName.Font = new Font("微软雅黑", 11);
                FoodPrice.Font = new Font("微软雅黑", 11);
                button.Font = new Font("微软雅黑", 6);
                button.BackColor = Color.Gray;
                button.ForeColor = Color.Transparent;
                button.FlatStyle = FlatStyle.Flat;
                button.Size = new Size(60, 10);
                picture.Location = new Point(100 * xx, 20 + yy);
                FoodName.Location = new Point(100 * xx, 100 + yy);
                FoodPrice.Location = new Point(100 * xx, 120 + yy);
                button.Location = new Point(100 * xx, 140 + yy);//控件定位
                picture.Image = Image.FromFile(Application.StartupPath + @"\FoodPhoto\" + ds.Tables[0].Rows[i]["PhotoName"].ToString());//显示图片,路径为可执行文件所在文件夹的FoodPhoto文件夹内的图片
                picture.SizeMode = PictureBoxSizeMode.StretchImage;
                picture.Size = new Size(150, 80);
                picture.BorderStyle = BorderStyle.FixedSingle;
                button.Cursor = Cursors.Hand;
                button.Click += new EventHandler(this.Button_Click);
                menu_all_全部.Controls.Add(FoodName);
                menu_all_全部.Controls.Add(FoodPrice);
                menu_all_全部.Controls.Add(picture);
                menu_all_全部.Controls.Add(button);//把控件绑定到panel中
                xx++;
                if (xx++ >= 4)
                {
                    xx = 0;
                    yy += 180;
                }
            }
        }

动态加载菜品解决窗体控件闪烁问题代码展示

protected override CreateParams CreateParams//解决窗体控件闪烁问题

        {

            get

            {

                CreateParams cp = base.CreateParams;

                cp.ExStyle |= 0x02000000;

                return cp;

            }

        }

加入购物车按钮代码展示

 #region 购物车
        private void 购物车_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
             // 禁止用户改变DataGridView1的所有列的列宽
            dataGridView1.AllowUserToResizeColumns = false;
            //禁止用户改变DataGridView1所有行的行高
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.Columns[0].ReadOnly = true; //禁止用户编辑第一列
            dataGridView1.Columns[1].ReadOnly = true; //禁止用户编辑第二列
            dataGridView1.Columns[2].ReadOnly = true;//禁止用户编辑第三列
            this.dataGridView1.AllowUserToResizeColumns = false; //禁止用户拖动标题宽度
            dataGridView1.AutoGenerateColumns = false;//取消自动生成列
            dataGridView1.RowHeadersVisible = false; //隐藏前面空白选择部分     
            string sql = string.Format("select FoodName,ShoppingCount,ShoppingPrice,ShoppingID from Food_table join Shopping_table on Food_table.FoodID=Shopping_table.FoodID join UserList on '{0}'=Shopping_table.UserID where UserList.UserID='{1}'", Saveusername.name,Saveusername.name);//三表查询
            dataGridView1.DataSource = DBHelper.GetDataSet(sql).Tables[0];
            double SumPrice = 0;//用来存储总金额
            if (DBHelper.GetDataSet(sql).Tables[0].Rows.Count > 0)
            {
                for (int i = 0; i < DBHelper.GetDataSet(sql).Tables[0].Rows.Count; i++)
                {
                    SumPrice += double.Parse(DBHelper.GetDataSet(sql).Tables[0].Rows[i][2].ToString());
                }
                Money_label.Text = "¥" + SumPrice.ToString() + "元";
            }
            dataGridView1.ClearSelection(); //取消默认选中
            if (show_shopping_pl.Visible == true)
            {
                show_shopping_pl.Visible = false;
            }
            else
            {
                show_shopping_pl.Visible = true;
            }
            if (Or_panel1.Visible == true)
            {
                Or_panel1.Visible = false;
            }
            if (Order_pl.Visible == true)
            {
                Order_pl.Visible = false;
            }
        }

        //清空购物车
        private void delete_label_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            DialogResult result = MessageBox.Show("是否清空购物车", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
            if (result == DialogResult.OK)
            {
                string sql = string.Format("delete from Shopping_table where UserID='{0}'", Saveusername.name);
                if (DBHelper.ExecuteNonQuery(sql))
                {
                    sql = string.Format("select FoodName,ShoppingCount,ShoppingPrice,ShoppingID from Food_table join Shopping_table on Food_table.FoodID=Shopping_table.FoodID join UserList on '{0}'=Shopping_table.UserID ", Saveusername.name);
                    dataGridView1.DataSource = DBHelper.GetDataSet(sql);
                    dataGridView1.AllowUserToAddRows = false;
                    Money_label.Text = "¥0元";
                    MessageBox.Show("成功清空购物车!", "提示", MessageBoxButtons.OK);
                }
            }
        }
        
        #endregion

主界面结账功能界面

在这里插入图片描述
在这里插入图片描述
结账部分代码展示

 private void Yes_Order_Load(object sender, EventArgs e)
        {
            Or_label1.Text = "["+Saveusername.name+"]" + ">确认购买";
            dataGridView1.RowHeadersVisible = false; //隐藏前面空白选择部分
            //                                         // 禁止用户改变DataGridView1的所有列的列宽
            //dataGridView1.AllowUserToResizeColumns = false;
            禁止用户改变DataGridView1所有行的行高
            //dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.Columns[0].ReadOnly = true; //禁止用户编辑第一列
            dataGridView1.Columns[1].ReadOnly = true; //禁止用户编辑第二列
            dataGridView1.Columns[2].ReadOnly = true;//禁止用户编辑第三列
            this.dataGridView1.AllowUserToResizeColumns = false; //禁止用户拖动标题宽度
            dataGridView1.AutoGenerateColumns = false;//取消自动生成列
            dataGridView1.RowHeadersVisible = false; //隐藏前面空白选择部分     
            string sql = string.Format("select FoodName,ShoppingCount,ShoppingPrice,ShoppingID from Food_table join Shopping_table on Food_table.FoodID=Shopping_table.FoodID join UserList on '{0}'=Shopping_table.UserID where UserList.UserID='{1}'", Saveusername.name,Saveusername.name);//三表查询
            dataGridView1.DataSource = DBHelper.GetDataSet(sql).Tables[0];
             SumPrice = 0;//用来存储总金额
            if (DBHelper.GetDataSet(sql).Tables[0].Rows.Count > 0)
            {
                for (int i = 0; i < DBHelper.GetDataSet(sql).Tables[0].Rows.Count; i++)
                {
                    SumPrice += double.Parse(DBHelper.GetDataSet(sql).Tables[0].Rows[i][2].ToString());
                }
                Money_label.Text = "¥" + SumPrice.ToString() + "元";
            }
            dataGridView1.ClearSelection(); //取消默认选中
            string sql_1 = string.Format("select * from UserList where UserID='{0}'",Saveusername.name);
            DataSet ds = DBHelper.GetDataSet(sql_1);
            Name_label.Text = ds.Tables[0].Rows[0]["UserID"].ToString()+":";
            Tel_label.Text = ds.Tables[0].Rows[0]["UserTel"].ToString();
            Address_label.Text = ds.Tables[0].Rows[0]["UserAddress"].ToString();
            Yes_Money_label.Text = Money_label.Text;
        }
        private void Yes_pay_btn_Click(object sender, EventArgs e)
        {
            if (Address_label.Text=="")
            {
                MessageBox.Show("地址信息不完整,请填写完整!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            string Order_Data = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); //下单日期
            string OrderNumber = DateTime.Now.ToString("yyyyMMddhhmmss");//订单编号
            string sql = string.Format("select * from Shopping_table where UserID='{0}'",Saveusername.name);//查询购物车表
            DataTable table_shopping = DBHelper.GetDataSet(sql).Tables[0];
            if (table_shopping.Rows.Count>0)//购物车有数据就创建订单
            {
               string sql_order = string.Format("insert into Order_table values('{0}','{1}','{2}','{3}','{4}','{5}')",OrderNumber,Saveusername.name,SumPrice,Address_label.Text,Order_Data,Tel_label.Text);//创建订单
               string sql_state = string.Format("insert into OrderState_table values('{0}','{1}')",OrderNumber,"等待确认");//订单状态
                if (DBHelper.ExecuteNonQuery(sql_order)&&DBHelper.ExecuteNonQuery(sql_state))
                {
                    sql_order = string.Format("select top 1 * from Order_table where UserID='{0}' order by OrderID desc",Saveusername.name);
                    DataTable table_order = DBHelper.GetDataTable(sql_order);
                    for (int i = 0; i < table_shopping.Rows.Count; i++)//把数据逐条插入订单详情表
                    {
string sql_datailde = string.Format("insert into Datailedorder_table values('{0}','{1}','{2}','{3}')", int.Parse(table_shopping.Rows[i]["FoodID"].ToString()),int.Parse(table_shopping.Rows[i]["ShoppingCount"].ToString()),double.Parse(table_shopping.Rows[i]["ShoppingPrice"].ToString()),int.Parse(table_order.Rows[0]["OrderID"].ToString()));
                        //try
                        //{
DBHelper.ExecuteNonQuery(sql_datailde);
                        //}
                       /* catch (Exception)
                        {

                            MessageBox.Show("异常");
                            return
                        }*/
                        
                    }
                    string sql_delete = string.Format("delete from Shopping_table where UserID='{0}'",Saveusername.name);
                    DBHelper.ExecuteNonQuery(sql_delete);//创建订单后清空购物车
                   DialogResult result= MessageBox.Show("支付成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    if (result==DialogResult.OK)
                    {
                 string sql_select = string.Format("select * from Shopping_table where UserID='{0}'",Saveusername.name);
                    dataGridView1.DataSource = DBHelper.GetDataSet(sql_select).Tables[0];
                        Money_label.Text = "¥0元";
                        Yes_Money_label.Text = "¥0元";
                        XMB.GetXMB.Money_label.Text = "¥0元";
                    Order_Form order_ = new Order_Form();
                    XMB.GetXMB.Or_from(order_);
                        return;
                    }
                }
            }
            else
            {
                MessageBox.Show("未选择菜品", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
        }

订单功能界面
点击订单,出现订单详情
在这里插入图片描述
在这里插入图片描述
订单功能部分代码

  private void Order_Form_Load(object sender, EventArgs e)
        {
            OR_panel.AutoScroll = true;//添加滚动条
            int xx = 0;
            int yy = 0;
            string sql = string.Format("select * from Order_table where UserID='{0}'",Saveusername.name);
            DataTable Or_table = DBHelper.GetDataTable(sql);
DataTable State = DBHelper.GetDataTable(string.Format("select OrderState from OrderState_table join Order_table on Order_table.OrderNumber=OrderState_table.OrderNumber where Order_table.UserID='{0}'",Saveusername.name));
            for (int i = 0; i < Or_table.Rows.Count; i++)
            {  
                Label OrderNumber = new Label();//编号
                Label ShoppingPrice = new Label();//价格
                Label SaleDate = new Label();//时间
                Label OrderState = new Label();//状态
                Label sweet = new Label();
                Panel panel = new Panel();
                PictureBox Db = new PictureBox(); //实例化一个控件
                Db.Name = "Db_PictureBox" + i;//设定名称
                OrderNumber.Name = "Label" + i;
                ShoppingPrice.Name = "Label" + i;
                SaleDate.Name = "Label" + i;
                OrderState.Name = "Label" + i;
                sweet.Name = "Label" + i;
                panel.Name = "Panel" + i;//设定名称
                panel.Text = Or_table.Rows[i]["OrderID"].ToString();//把订单ID赋给控件的Text,以便取消订单
                SaleDate.Text = Or_table.Rows[i]["SaleDate"].ToString();
                ShoppingPrice.Text = " ¥ " +  Or_table.Rows[i]["ShoppingPrice"].ToString();
                OrderNumber.Text = "订单编号: " + Or_table.Rows[i]["OrderNumber"].ToString();
                sweet.Text = "Sweet点餐";
                OrderState.Text = State.Rows[i]["OrderState"].ToString();
                sweet.Location = new Point(150,30);
                ShoppingPrice.Location = new Point(480,30);
                OrderState.Location = new Point(595,30);
                SaleDate.Location = new Point(150,70);
                OrderNumber.Location = new Point(450,70);
                Db.Location = new Point(15, 10 + yy);//设定位置
                panel.Location = new Point(5, 0 + yy);//设定位置
                sweet.AutoSize = true;
                OrderState.AutoSize = true;
                ShoppingPrice.AutoSize = true;
                SaleDate.AutoSize = true;
                OrderNumber.AutoSize = true;
                Db.Image = Image.FromFile(Application.StartupPath + @"\FoodPhoto\" + "sezhi.png");
                Db.SizeMode = PictureBoxSizeMode.StretchImage; //设定图像如何显示
                sweet.Font = new Font("微软雅黑", 11);
                OrderNumber.Font = new Font("微软雅黑", 11);
                OrderState.Font = new Font("微软雅黑", 11);
                ShoppingPrice.Font = new Font("微软雅黑", 11);
                SaleDate.Font = new Font("微软雅黑", 11);
                Db.Size = new Size(80, 80);
                panel.Size = new Size(683, 100);
                Db.BorderStyle = BorderStyle.FixedSingle; //设置边框样式
                panel.BorderStyle = BorderStyle.FixedSingle; //设置边框样式
                panel.BackColor = Color.White;
                SaleDate.ForeColor = Color.Red;
                ShoppingPrice.ForeColor = Color.Red;
                OrderNumber.ForeColor = Color.Green;
                OrderState.ForeColor = Color.Green;
                panel.Cursor = Cursors.Hand;
                OR_panel.Controls.Add(Db);
                OR_panel.Controls.Add(panel);
                panel.Controls.Add(OrderState);
                panel.Controls.Add(sweet);
                panel.Controls.Add(OrderNumber);
                panel.Controls.Add(SaleDate);
                panel.Controls.Add(ShoppingPrice);
                panel.Click += new EventHandler(this.panel1_MouseClick); //添加单击事件
                panel.MouseEnter += new EventHandler(this.panel1_MouseEnter); //添加单击事件
                panel.MouseLeave += new EventHandler(this.panel1_MouseLeave); //添加单击事件
                xx++;
                if (xx++ >= 1)
                {
                    yy += 110;
                    //aa += 10;
                }
            }
        }

接下来是管理员界面展示
1.菜品管理界面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

菜品管理添加菜品关键代码

 private void Food_in_tbn_Click(object sender, EventArgs e)
        {
            if (Fag() == false)
                return;
            string FilePath = Application.StartupPath + @"\FoodPhoto";//获取可执行文件所在位置的FoodPhoto文件夹路径
            if (Directory.Exists(FilePath) == false)
            {
                //判断文件夹是否存在如果不存在创建文件夹
                Directory.CreateDirectory(FilePath);//创建文件夹
            }
            string FileName = DateTime.Now.ToString("yyyyMMddhhmmss") + new Random().Next(1000, 9999);
            //以当前时间和1000到9999的随机数合起来作为文件的名字
            FileName += nj.Substring(nj.LastIndexOf("."));//截取图片的后缀名
            File.Copy(nj, FilePath + @"\" + FileName);//把图片复制到FoodPhoto文件夹
            string SQLst = string.Format("insert into Food_table values('{0}','{1}','{2}','{3}')", Add_Food_tb.Text,Add_money_tb.Text,Add_type_ctb.Text, FileName);
            if (DBHelper.ExecuteNonQuery(SQLst))
            {
                MessageBox.Show("菜品添加成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("保存失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public static string nj;
        public static string name;
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            //打开资源管理器选择图片
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            nj = "";
            name = "";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                nj = openFileDialog1.FileName;
                pictureBox1.Image = Image.FromFile(nj);
            }
        }

2.订单管理界面
主要实现思路:动态加载控件,控件定位,查询数据库,修改表信息
在这里插入图片描述

3.销售统计界面
在这里插入图片描述
点击确认订单后会生成一个订单,效果图如下:
在这里插入图片描述
代码展示

 private void Button_Click(object sender, EventArgs e)
        {
            Button button = (Button)sender;//将触发此事件的对象转换为该对象
            OrderID = int.Parse(button.Name.ToString());
            string FilePath = @"D:\订单票据";//获取可执行文件所在位置的FoodPhoto文件夹路径
            if (Directory.Exists(FilePath) == false)
            {
                //判断文件夹是否存在如果不存在创建文件夹
                Directory.CreateDirectory(FilePath);//创建文件夹
            }
            string sql_12 = string.Format("select * from Order_table where OrderID='{0}'", OrderID);
            DataTable piao = DBHelper.GetDataTable(sql_12);
            for (int i = 0; i < piao.Rows.Count; i++)
            {
                StreamWriter sw = new StreamWriter(@"D:\订单票据\Sweet点餐"+piao.Rows[0]["OrderNumber"].ToString()+".txt");
                string a = "订单编号:"+piao.Rows[i]["OrderNumber"].ToString();
                string b = "订单内容:";
                sw.WriteLine(a);
                sw.WriteLine("-------------------------------------------");
                sw.WriteLine(b);
                string sql_13 = "select Food_table.FoodName,Datailedorder_table.ShoppingCount,Datailedorder_table.ShoppingPrice from Order_table join Datailedorder_table on Datailedorder_table.OrderID=Order_table.OrderID join Food_table on Food_table.FoodID=Datailedorder_table.FoodID where Order_table.OrderNumber='" + piao.Rows[i]["OrderNumber"] + "'";//查找需要的菜品名称,菜品购买的数量,每一种菜品购买的总金额
                DataTable table = DBHelper.GetDataTable(sql_13);
                for (int j = 0; j < table.Rows.Count; j++)
                {
                    string FoodName = table.Rows[i]["FoodName"].ToString();
                    string FoodCount = table.Rows[i]["ShoppingCount"].ToString();
                    string ShoppingPrice = table.Rows[i]["ShoppingPrice"].ToString();
                    sw.Write(" {0}",FoodName);
                    sw.Write("          x{0}", FoodCount);
                    sw.WriteLine("                            {0}",ShoppingPrice);
                }
                sw.WriteLine("-------------------------------------------");
                string sum = "总计:"+piao.Rows[i]["ShoppingPrice"].ToString();
                string c = "联系地址:";
                string Address = "联系地址:"+piao.Rows[i]["Address"].ToString();
                string User = "联系人:"+piao.Rows[i]["UserID"].ToString();
                string tel = "联系电话:"+piao.Rows[i]["UserTel"].ToString();
                sw.WriteLine(sum);
                sw.WriteLine();
                sw.WriteLine(c);
                sw.WriteLine("-------------------------------------------");
                sw.WriteLine(User);
                sw.WriteLine(tel);
                sw.WriteLine(Address);
                sw.Close();
            }

我们的项目大概就这么多了,还有一些小功能没有详细介绍了。

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

talent_wei

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值