zoukankan      html  css  js  c++  java
  • 校园银行自助系统

    这几天由于要交数据库课程设计,就做了一个校园自助银行系统。由于经验不多,系统做的比较简单,没有用三层结构,一些数据库的操作就在用户层实现了。以下是这个系统的所有代码:

    软件设计思路
    1、 首先建立一个登陆界面,然后做主界面,主界面有以下5个功能:取款,存款,转账,转账,信息查询及历史账单查询,修改密码

    2、 在写数据连接代码时,我写了一个SqlHelper类,具体代码如下

     1 public class SqlHelper
     2 {
     3   //连接数据库的字符串
     4   static string connStr = @"Data Source=zhao\SQLEXPRESS;Initial Catalog=校园自助银行系统;Integrated Security=True";
     5   //返回一个表
     6   public static DataTable ExecuteDataTable(string sql, params SqlParameter[] param)
     7   {
     8     DataTable dt = new DataTable();
     9     using (SqlConnection conn = new SqlConnection(connStr))
    10     {
    11       conn.Open();
    12       using (SqlCommand cmd = new SqlCommand(sql, conn))
    13 
    14       {
    15         if (param != null)
    16         {
    17           cmd.Parameters.AddRange(param);
    18         }
    19         SqlDataAdapter sad = new SqlDataAdapter(cmd);
    20         sad.Fill(dt);
    21       }
    22     }
    23     return dt;
    24   }
    25   //执行增删改
    26   public static int ExecuteNonQuery(string sql, params SqlParameter[] param)
    27   {
    28     int result = -1;
    29     using (SqlConnection conn = new SqlConnection(connStr))
    30     {
    31       conn.Open();
    32       using (SqlCommand cmd = new SqlCommand(sql, conn))
    33       {
    34         if (param != null)
    35         {
    36           cmd.Parameters.AddRange(param);
    37         }
    38         result = cmd.ExecuteNonQuery();
    39       }
    40     }
    41     return result;
    42   }
    43 
    44   //获取登录用户的信息
    45   public static DataRow GetDataRow()
    46   {
    47     DataTable dt = SqlHelper.ExecuteDataTable("select * from 账户信息 where CardNumber=@cardnumber", new SqlParameter("@cardnumber",        UserCardInfo.usercardinfo));
    48     DataRow dr = dt.Rows[0];
    49     return dr;
    50 
    51   }
    52 }

    在以后的对数据库操作的过程中,都是使用以上类中的方法

    3、在做登录界面前,先在主界面使用以下代码,在软件运行时,先弹出登录界面
      

    1 Login login = new Login();     //Login是登录对话框
    2 login.ShowDialog();


    在进入登录界面时,我先定义一个随机数,用于验证码功能的实现
      

    1 Random r = new Random();
    2 lblYanZheng.Text = r.Next(1000, 9999).ToString();     //验证码的范围是1000到9999


    以下代码是具体的登录代码
      

     1 int count = 3;
     2   private void btnLogin_Click(object sender, EventArgs e)
     3   {
     4     //记录银行卡号
     5     string cardnumber = txtCardNumber.Text;
     6     //记录登录密码
     7     string secret = txtCardSecret.Text;
     8     //查询数据库中是否有相对应的用户
     9     string sqlstr = "select * from 账户信息 where CardNumber=@cardnumber and Secret=@secret";
    10     DataTable dt = SqlHelper.ExecuteDataTable(sqlstr, new SqlParameter("@cardnumber", cardnumber), new SqlParameter("@secret", secret));
    11     //如果查询结果大于0个,则表示有该用户
    12     if (dt.Rows.Count > 0)
    13     {
    14       //如果验证码正确,则允许登录
    15       if (txtYanZheng.Text == lblYanZheng.Text)
    16       {
    17         //用用户信息类的usercardinfo变量保存银行卡号
    18         UserCardInfo.usercardinfo = cardnumber;
    19         //选中查询结果的第一行
    20         DataRow dr = dt.Rows[0];
    21         DataTable dtUser = SqlHelper.ExecuteDataTable("select * from 用户 where CardNumber=@cardnumber", new SqlParameter("@cardnumber", cardnumber));
    22         DataRow drUser = dtUser.Rows[0];
    23         UserCardInfo.name = drUser["Name"].ToString();
    24         //登录成功后,关闭登录对话框
    25         this.Close();
    26       }
    27       else
    28       {
    29         //如果验证码,则计数器递减
    30         count--;
    31         if (count <= 0)
    32         {
    33           MessageBox.Show("密码输错次数过多,程序即将退出");
    34           System.Environment.Exit(0);
    35         }
    36         ShowMsg("验证码错误,您还有"+count+"次机会");
    37         return;
    38       }
    39     }
    40     else
    41     {
    42       //如果用户名或密码错误,则计数器递减
    43       if (dt.Rows.Count <=0)
    44       {
    45         count--;
    46         if (count <= 0)
    47         {
    48         MessageBox.Show("密码输错次数过多,程序即将退出");
    49         System.Environment.Exit(0);
    50         }
    51         ShowMsg("银行账号或密码错误,您还有" + count + "次机会");
    52         return;
    53       }
    54       //如果验证码错误
    55       else if (txtYanZheng.Text != lblYanZheng.Text)
    56       {
    57         count--;
    58         if (count <= 0)
    59         {
    60         MessageBox.Show("密码输错次数过多,程序即将退出");
    61         System.Environment.Exit(0);
    62         }
    63       ShowMsg("验证码错误,您还有" + count + "次机会");
    64       return;
    65       }
    66     }
    67   }
    68 
    69   private void btnCancle_Click(object sender, EventArgs e)
    70   {
    71     //彻底退出程序
    72     System.Environment.Exit(0);
    73   }
    74   void ShowMsg(string msg)
    75   {
    76     //显示消息
    77     MessageBox.Show(msg);
    78   }
    79 
    80   private void Login_Load(object sender, EventArgs e)
    81   {
    82     //设置将关闭按钮隐藏
    83     this.ControlBox = false;
    84   }

    4、进入主界面后
      

     1   //打开取款对话框
     2   private void lblQuKuan_Click(object sender, EventArgs e)
     3   {
     4     QuKuan qck = new QuKuan();
     5     qck.ShowDialog();
     6   }
     7   //打开存款对话框
     8   private void lblCunKuan_Click(object sender, EventArgs e)
     9   {
    10     CunKuan qck = new CunKuan();
    11     qck.ShowDialog();
    12   }
    13   //打开转账对话框
    14   private void lblZhuanZhang_Click(object sender, EventArgs e)
    15   {
    16     ZhuanZhang zz = new ZhuanZhang();
    17     zz.ShowDialog();
    18   }
    19   //打开查询个人信息对话框
    20   private void lblChaXun_Click(object sender, EventArgs e)
    21   {
    22     ChaXun cx = new ChaXun();
    23     cx.ShowDialog();
    24   }
    25   //打开修改密码对话框
    26   private void lblXiuGai_Click(object sender, EventArgs e)
    27   {
    28     ChangeSecret cs = new ChangeSecret();
    29     cs.ShowDialog();
    30   }
    31 
    32   //欢迎词做跑龙灯运动
    33   private void lbltimer_Tick(object sender, EventArgs e)
    34   {
    35     lblWelcome.Text = lblWelcome.Text.Substring(1) + lblWelcome.Text.First();
    36   }
    37 
    38   private void 切换账户ToolStripMenuItem_Click(object sender, EventArgs e)
    39   {
    40     //打开登录对话框
    41     Login login = new Login();
    42     login.ShowDialog();
    43 
    44     DataTable dt = SqlHelper.ExecuteDataTable("select * from 用户 where CardNumber=@cardnumber", new SqlParameter("@cardnumber",         UserCardInfo.usercardinfo));
    45 
    46     //更新主界面用户名称
    47     DataRow dr = dt.Rows[0];
    48     lblUserInfo.Text = dr["Name"].ToString();
    49   }
    50 
    51   private void 安全退出ToolStripMenuItem_Click(object sender, EventArgs e)
    52   {
    53     //退出应用程序
    54     Application.Exit();
    55   }
    56 
    57   private void Form1_Load(object sender, EventArgs e)
    58   {
    59     //显示登录用户的名称
    60     lblUserInfo.Text = "";
    61     DataTable dt = SqlHelper.ExecuteDataTable("select * from 用户 where CardNumber=@cardnumber",

                                  new SqlParameter("@cardnumber",UserCardInfo.usercardinfo)); 62     DataRow dr = dt.Rows[0]; 63     lblUserInfo.Text = dr["Name"].ToString(); 64   }

    5、在进入主界面后,我定义了一个类UserCardInfo,里面定义了几个字段,用记录用户信息
      

     1   static class UserCardInfo
     2   {
     3     //保存用户登录的卡号
     4     public static string usercardinfo;
     5     //保存交易时间
     6     public static string time;
     7     //保存交易类型
     8     public static string type;
     9     //保存交易金额
    10     public static string money;
    11     //保存账户余额
    12     public static string remain;
    13     //保存用户姓名
    14     public static string name;
    15   }


    6、在做存款取款转账功能前,我先写了CunQunKuan类,用于定义存取款转账方法,具体代码如下:
      

     1   static class CunQuKuan
     2   {
     3     //如果b为true,则为取款,否则为转账
     4     public static bool QuKuan(decimal money,bool b)
     5     {
     6       DataRow dr = SqlHelper.GetDataRow();
     7       //先获得当前用户的余额
     8       decimal moneyRemain = decimal.Parse(dr["Money"].ToString());
     9       //如果取款或转账的金额大于账户余额,则失败
    10       if (money > moneyRemain)
    11       {
    12         MessageBox.Show("余额不足,取款失败!");
    13         return false;
    14       }
    15       else
    16       {
    17         //如果成功,则将余额减去所取的金额
    18         moneyRemain -= money;
    19         //更新数据库,将该用户的账户余额改为取款后的余额
    20         SqlHelper.ExecuteNonQuery("update 账户信息 set Money=@moneyRemain where CardNumber=@cardnumber ", new SqlParameter("@moneyRemain", moneyRemain), 

                                                                      new SqlParameter("@cardnumber", dr["CardNumber"].ToString())); 21         if (b == true) 22         { 23           MessageBox.Show("取款成功!"); 24         } 25         else 26         { 27           MessageBox.Show("转账成功!"); 28         } 29         return true; 30       } 31     } 32 33     //存款的方法 34     public static void CunKuan(decimal money) 35     { 36       DataRow dr = SqlHelper.GetDataRow(); 37       decimal moneyRemain = decimal.Parse(dr["Money"].ToString()); 38       moneyRemain += money; 39       SqlHelper.ExecuteNonQuery("update 账户信息 set Money=@moneyRemain where CardNumber=@cardnumber", new SqlParameter("@moneyRemain", moneyRemain),
                                                                    new SqlParameter("@cardnumber", dr["CardNumber"].ToString())); 40       MessageBox.Show("存款成功!"); 41     } 42   }

    7、在做好以上工作以后,我做了取款功能,代码如下:
        

     1     private void btnOk_Click(object sender, EventArgs e)
     2     {
     3       decimal money = decimal.Parse(txtMoney.Text);
     4       //执行取款操作,并获得返回值,如果返回true,则打印凭证
     5       bool b= CunQuKuan.QuKuan(money, true);
     6       if (b)
     7       {
     8         DialogResult result = MessageBox.Show("是否打印凭条", "打印凭条", MessageBoxButtons.YesNo);
     9         DataRow dr = SqlHelper.GetDataRow();
    10         //如果点是,则打印凭证
    11         if (result == DialogResult.Yes)
    12         {
    13           //将标签的文本改为取款信息
    14           lblprint.Text = string.Format("卡号:{0}\t\n姓名:{1}\t\n时间:{2}\t\n取款:{3}", dr["CardNumber"].ToString(), UserCardInfo.name, DateTime.Now, money.ToString());
    15           //将标签状态改为可视
    16           lblprint.Visible = true;
    17         }
    18         //向交易信息中插入取款记录
    19         AddJYInfo.MyMethod(dr,money,"取款");
    20       }
    21     }
    22 
    23     private void btnBack_Click(object sender, EventArgs e)
    24     {
    25       //关闭取款对话框
    26       this.Close();
    27     }
    28 
    29     //当窗口加载的时候,显示账户余额
    30     private void QuKuan_Load(object sender, EventArgs e)
    31     {
    32       DataRow dr = SqlHelper.GetDataRow();
    33       lblMoneyRemain.Text += dr["Money"].ToString();
    34     }

    8、以下是存款功能代码:
        

     1        private void btnOk_Click(object sender, EventArgs e)
     2     {
     3       //获得输入的存款金额
     4       decimal money = decimal.Parse(txtMoney.Text);
     5       //执行存款程序
     6       CunQuKuan.CunKuan(money);
     7       //返回用户信息所在行
     8       DataRow dr=SqlHelper.GetDataRow();
     9       //想交易信息中添加存款记录
    10       AddJYInfo.MyMethod(dr, money, "存款");
    11     }
    12 
    13     private void btnBack_Click(object sender, EventArgs e)
    14     {
    15       //关闭存款对话框
    16       this.Close();
    17     }                

    9、以下是转账代码:
        

     1     private void btnOk_Click(object sender, EventArgs e)
     2     {
     3       decimal money = decimal.Parse(txtMoney.Text);
     4       string receiver = txtReceiver.Text;
     5       //获取转账用户的记录
     6       DataRow dr=SqlHelper.GetDataRow();
     7       //如果转账的金额大于账户余额,则禁止转账
     8       if (money >decimal.Parse(dr["Money"].ToString()))
     9       {
    10         MessageBox.Show("余额不足,转账失败!");
    11         return;
    12       }
    13       else
    14       {
    15         DataTable dt = SqlHelper.ExecuteDataTable("select * from 账户信息 where CardNumber=@receiver", new SqlParameter("@receiver",     receiver));
    16         //如果数据库中存在接收转账的用户
    17         if (dt.Rows.Count > 0)
    18         {
    19           DataRow drReceiver = dt.Rows[0];
    20           //查询接收转账的用户的金额
    21           decimal moneyReceiver = decimal.Parse(drReceiver["Money"].ToString());
    22           //接收者的金额加上转的金额
    23           moneyReceiver += money;
    24           //更新接收转账的用户的金额
    25           SqlHelper.ExecuteNonQuery("update 账户信息 set Money=@moneyReceiver where CardNumber=@receiver", new SqlParameter("@moneyReceiver", moneyReceiver),
                                                                        new SqlParameter("@receiver", receiver)); 26           //执行取款方法,false表示弹出的消息框为转账成功 27           CunQuKuan.QuKuan(money,false); 28           dr = SqlHelper.GetDataRow(); 29           //向交易信息中添加转账记录 30           AddJYInfo.MyMethod(dr, money, "转账"); 31         } 32         else 33         { 34           MessageBox.Show("该用户不存在,请核对账户是否正确"); 35           return; 36         } 37       } 38 39     } 40    41 42     private void btnBack_Click(object sender, EventArgs e) 43     { 44       //关闭转账对话框 45       this.Close(); 46     }

    10、同时,为了记录用户存款取款转账记录,我定义了AddJYInfo类,代码如下:
      

     1   class AddJYInfo
     2   {
     3     //向交易信息表中添加交易信息记录
     4     public static void MyMethod(DataRow dr, Decimal money, string type)
     5     {
     6       //银行卡号
     7       UserCardInfo.usercardinfo = dr["CardNumber"].ToString();
     8       //交易金额
     9       UserCardInfo.money = money.ToString();
    10       //交易时间
    11       UserCardInfo.time = DateTime.Now.ToString();
    12       //交易类型
    13       UserCardInfo.type = type;
    14       //交易后账户余额
    15       UserCardInfo.remain = dr["Money"].ToString();
    16       //向数据库中插入交易记录
    17       string sql = "insert into 交易记录 (CardNumber,Time,Money,Type,Remain) Values(@usercardinfo, @time,@money,@type,@remain)";
    18       SqlHelper.ExecuteNonQuery(sql, new SqlParameter("@usercardinfo", UserCardInfo.usercardinfo), 
                              new SqlParameter("@time", UserCardInfo.time),
                              new SqlParameter("@money", UserCardInfo.money),
                              new SqlParameter("@type", UserCardInfo.type),
                              new SqlParameter("@remain", UserCardInfo.remain)); 19     } 20   }

    11、接下来是信息查询及历史交易记录查询功能,在做历史交易记录查询功能时,我添加了类AddData,定义了一个根据所选的年份和月份动态添加每个月的天数,代码如下:
      

     1 class AddData
     2   {
     3     public static List<int> AddDay(int year, int month)
     4     {
     5       List<int> list = new List<int>();      
     6       if (month == 1 || month == 3 || month == 5 || month == 7 || month == 9 || month == 11)
     7       {
     8         list.Clear();
     9         for (int i = 1; i <= 31; i++)
    10         {
    11           list.Add(i);
    12         }
    13       }
    14       else if (month == 4 || month == 6 || month == 8 || month == 10 || month == 12)
    15       {
    16         list.Clear();
    17         for (int i = 1; i <= 30; i++)
    18         {
    19           list.Add(i);
    20         }
    21       }
    22       else
    23       {
    24         if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    25         {
    26           list.Clear();
    27           for (int i = 1; i <= 29; i++)
    28           {
    29             list.Add(i);
    30           }
    31         }
    32         else
    33         {
    34           list.Clear();
    35           for (int i = 1; i <= 28; i++)
    36           {
    37             list.Add(i);
    38           }
    39         }
    40       }
    41       return list;
    42     }
    43   }

    12、以下是信息查询及历史交易记录查询代码:
        

     1     private void ChaXun_Load(object sender, EventArgs e)
     2     {
     3       //获取该用户信息
     4       DataRow dr = SqlHelper.GetDataRow();
     5       //获得银行卡号
     6       string cardnumber = dr["CardNumber"].ToString();
     7       //将表格控件的数据源绑定
     8       dataGridView.DataSource = SqlHelper.ExecuteDataTable("select * from 用户 where CardNumber=@cardnumber", new SqlParameter("@cardnumber", cardnumber));
     9       //选择起始年份的默认项为下标为0的项
    10       cbStartYear.SelectedIndex = 0;
    11       //选择截止年份的默认项为下标为0的项
    12       cbEndYear.SelectedIndex = 0;
    13       //选择起始月份的默认项为下标为5的项
    14       cbStartMonth.SelectedIndex = 5;
    15       //选择截止月份的默认项为下标为5的项
    16       cbEndMonth.SelectedIndex = 5;
    17     }
    18 
    19     private void btnOk_Click(object sender, EventArgs e)
    20     {
    21       //关闭查询对话框
    22       this.Close();
    23     }
    24 
    25     private void btnQuery_Click(object sender, EventArgs e)
    26     {
    27 
    28       int startyear = int.Parse(cbStartYear.SelectedItem.ToString());
    29       int startmonth = int.Parse(cbStartMonth.SelectedItem.ToString());
    30 
    31       int endyear = int.Parse(cbEndYear.SelectedItem.ToString());
    32       int endmonth = int.Parse(cbEndMonth.SelectedItem.ToString());
    33 
    34       try
    35       {
    36         int startday = int.Parse(cbStartDay.SelectedItem.ToString());
    37         int endday = int.Parse(cbEndDay.SelectedItem.ToString());  
    38 
    39         if (startyear > endyear || (startyear <= endyear && startmonth > endmonth) || (startyear <= endyear && startmonth <= endmonth &&   startday > endday))
    40         {
    41           MessageBox.Show("请输入正确的查询日期范围");
    42           return;
    43         }
    44         else
    45         {
    46           DataTable dt = SqlHelper.ExecuteDataTable("select * from 交易记录 where Year(Time)>=@startyear and Year(Time)<=@endyear and Month(Time)>=@startmonth and Month(Time)<=@endmonth and Day(Time)>=@startday and Day(Time)<=@endday and CardNumber=@cardnumber", new SqlParameter("@startyear", startyear),
                                                            new SqlParameter("@endyear", endyear),
                                                            new SqlParameter("@startmonth", startmonth),
                                                            new SqlParameter("@endmonth", endmonth),
                                                            new SqlParameter("@startday", startday),
                                                             new SqlParameter("@endday", endday),
                                                            new SqlParameter("@cardnumber", UserCardInfo.usercardinfo)); 47           if (dt.Rows.Count > 0) 48           { 49             tableHistory.DataSource = dt; 50           } 51           else 52           { 53             tableHistory.DataSource = null; 54             MessageBox.Show("sorry,未查询到相关数据"); 55           } 56         } 57       } 58       catch (Exception) 59       { 60         MessageBox.Show("请选择查询日期"); 61       } 62 63     } 64     //当起始月份的选择项索引发生变化时发生的事件 65     private void cbStartMonth_SelectedIndexChanged(object sender, EventArgs e) 66     { 67       int month = int.Parse(cbStartMonth.SelectedItem.ToString()); 68       int year = int.Parse(cbStartYear.SelectedItem.ToString()); 69       //先清空之前已添加的天数 70       cbStartDay.Items.Clear(); 71       foreach (int item in AddData.AddDay(year, month)) 72       { 73         //向起始天下拉框中添加天数 74         cbStartDay.Items.Add(item); 75       } 76 77     } 78     //当截止月份的选择项索引发生变化时发生的事件 79     private void cbEndMonth_SelectedIndexChanged(object sender, EventArgs e) 80     { 81       int month = int.Parse(cbEndMonth.SelectedItem.ToString()); 82       int year = int.Parse(cbEndYear.SelectedItem.ToString()); 83       cbEndDay.Items.Clear();   84       foreach (int item in AddData.AddDay(year, month)) 85       { 86         cbEndDay.Items.Add(item); 87       } 88 89     }

    13、最后是修改密码功能,具体代码如下:
        

     1 //设置允许改密码错误的次数
     2     int count = 3;
     3     private void btnOk_Click(object sender, EventArgs e)
     4     {
     5       //或旧密码
     6       string oldpwd = txtOldPwd.Text;
     7       //获得输入的新密码
     8       string newpwd = txtNewPwd.Text;
     9       //获得确认的新密码
    10       string newpwd2 = txtNewPwd2.Text;
    11       //查询该用户信息
    12       DataRow dr = SqlHelper.GetDataRow();
    13       //如果输入的旧密码正确和两次输入的新密码都一致,则修改密码成功
    14       if (oldpwd == dr["secret"].ToString() && newpwd == newpwd2)
    15       {
    16         SqlHelper.ExecuteNonQuery("update 账户信息 set Secret=@secret where CardNumber=@cardnumber", new SqlParameter("@secret", newpwd),
                                                                    new SqlParameter("@cardnumber", dr["CardNumber"].ToString())); 17         MessageBox.Show("恭喜您,密码修改成功!"); 18       } 19       //如果旧密码错误,则要求重新输入旧密码,如果输错三次,则退出修改密码对话框 20       else if (oldpwd != dr["secret"].ToString()) 21       { 22         MessageBox.Show("原始密码不正确,您还剩" + --count + "次机会"); 23         if (count <= 0) 24         { 25           this.Close(); 26         } 27         return; 28       } 29       //如果两次输入的新密码不一致 30       else if (newpwd != newpwd2) 31       { 32         MessageBox.Show("亲,您的俩次密码不一致哦!再检查一下吧"); 33         return; 34       } 35    36     } 37 38     private void btnCancle_Click(object sender, EventArgs e) 39     { 40       //关闭修改密码对话框 41       this.Close(); 42     }

    最后总结一下做这个系统之后的感受吧,以前学习的时候,不知道为什么别人要定义这个类,为什么这个方法的返回值要是这个类型,其实大可不必纠结这些问题,在自己做的时候,就会发现根据项目的需要,自然而然的需要做这些事情。通过这次实践,更加加深了我对ADO.Net的理解,在后面的学习过程中,多实践多练习才是快速掌握知识的正确途径,没有一定代码的积累,是很难成为真正的高手。

  • 相关阅读:
    parted 2T以上磁盘分区和挂载
    MySQL 表空间恢复
    MySQL 绿色版安装
    EF core
    让vs自动提示没有using的类
    Android Studio 的 Gradle 面板没有 Task
    JMS微服务远程调用性能测试 vs .Net Core gRPC服务
    electron打包,使用electron-packager
    EasyNetQ(RabbitMQ)在处理消息时,如果抛出异常,继续不断发送到订阅队列,不断处理(也就是不自动确认消息已到达)
    调用系统默认浏览器,打开网页
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3128655.html
Copyright © 2011-2022 走看看