C#windows彩票信息管理

news2025/1/18 3:24:30

摘要:近年来,中国彩票行业已经进入市场急速扩张和加速上升的阶段,即开票占整个彩票销量的比率也将急剧上扬。自助售彩终端,这一崭新的售彩模式已被中国彩民接受,爆发点很快来临。到2020年,我国多功能彩票自助终端将达到20万台以上。按照这个数据测算,自助售彩机带来的即开票销量将是一个巨大的数字,智能彩票自助销售终端必将成为中国彩票业的下一个金矿。基于市场需求与技术优势。本系统以C/S结构,实现了彩票自助选择。本文当前系统介绍了最初的功能检测试验版本,该版本用于测试系统是否完成基础功能。

关键词: winform, C/S结构, 三层架构,sqlserver

1 前言

2 开发工具简介

2.1 Visual Studio技术简介

2.2 SQLServer数据库简介

2.3 开发环境

操作系统:Windows10

数据库:sqlserver

开发工具:Visual Studio

开发语言:C#

3 系统需求分析

3.1 功能需求分析

本系统功能共分为两个客户端,分别为管理员和用户,管理员可以对彩票管理、中奖/兑奖、查看用户和彩票的信息,用户可以注册账号、购买彩票、充值。该系统有效解决了彩票自助购买,查奖兑奖一体化,有效的解决了彩票市场急速扩张和加速上升带来的管理和购买等问题,自助售彩这一理念,这一崭新的售彩模式已被中国彩民接受,爆发点很快来临。根据上述功能的分析,系统分为以下几个主要功能:

1.根据以上的分析描述,系统中的模块分别为

(1)登录注册模块

(2)管理员管理彩票模块

(3)管理员对用户信息查看模块

(4)用户模块

具体系统功能模块图如图3-1所示。

在这里插入图片描述

图3-1 系统功能模块图

2.各模块的具体功能如下:

(1) 发行彩票:

管理员对彩票进行一键发行(未开奖),未开奖的彩票进入票池。

(2) 开奖/兑奖:

管理员对已发行的彩票进行开奖,彩票自动生成中奖号码,若有人买中,直接在其账户财富加1000000元

(3)查看用户财富:

管理员可以查看系统内用户的余额

(4) 查看发行记录:

管理员对发行彩票的查看,提供查看今日和历史彩票的选择范围

(5) 查看中奖情况:

开奖的彩票输入彩票编号即可查看中奖用户的数据。

(6) 查看销售情况:

管理员查看发行彩票的销售记录,记录中包含所有系统用户购买的记录。

(7) 删除彩票:

管理员可以对过期,开奖等原因作废的彩票进行删除。

(8) 用户购买彩票:

用户购买选号,可自选可机选一组,单次5元,用户每成功购买将从余额中扣去。

(9) 用户充值:

用户余额为0时将无法购买彩票,可进行充值操作。

3.2 可行性分析

3.3 系统性能需求分析

4 数据库设计

4.1 数据库概念结构设计

本彩票信息管理系统所用的数据库是Sqlserver数据库连接。在Sqlserver中创建彩票信息管理系统的数据库,包含四张表,用户登录表dbo.user_id,彩票销售记录表dbo.total,彩票信息表dbo.ticket,用户账户信息表dbo.user_info。如下概念关系图4-1

在这里插入图片描述

图4-1 E-R关系图

4.2 数据库逻辑结构设计

5 系统功能实现

5.1 核心方法和逻辑

​ 数据访问帮助类

​ DBHelper类代码:

 public class DBHelper
{
    public static string connString = @"Data Source=.;Initial Catalog=ticket;Integrated Security=True";

    //定义数据库连接对象
    public static SqlConnection conn = new SqlConnection(connString);

    //获取数据的方法,返回DataTable对象,参数为一个select语句
    public static DataTable GetDataTable(string sqlStr)
    {
        try
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(sqlStr, conn);
            SqlDataAdapter dapt = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            dapt.Fill(dt);
            return dt;
        }
        catch
        {
            return null;
        }
        finally
        {
            conn.Close();
        }
    }

    //获取数据的重载方法,返回DataTable对象,参数为一个参数化的select语句和参数对象数组
    public static DataTable GetDataTable(string sqlStr, SqlParameter[] param)
    {
        try
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(sqlStr, conn);
            cmd.Parameters.AddRange(param);
            SqlDataAdapter dapt = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            dapt.Fill(dt);
            return dt;
        }
        catch
        {
            return null;
        }
        finally
        {
            conn.Close();
        }
    }

    //执行更新的方法,返回一个布尔值,参数为一个insert|update|delete语句
    public static bool ExcuteCommand(string sqlStr)
    {
        try
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(sqlStr, conn);
            cmd.ExecuteNonQuery();
            return true;
        }
        catch
        {
            return false;
        }
        finally
        {
            conn.Close();
        }
    }

    //执行更新的重载方法,返回一个布尔值,参数为一个参数化的insert|update|delete语句和参数对象数组
    public static bool ExcuteCommand(string sqlStr, SqlParameter[] param)
    {
        try
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(sqlStr, conn);
            cmd.Parameters.AddRange(param);
            cmd.ExecuteNonQuery();
            return true;
        }
        catch
        {
            return false;
        }
        finally
        {
            conn.Close();
        }
    }

    public static bool ExcuteCommand(List<String> sqlStr, List<SqlParameter[]> param)
    {
        int i = 0;
        SqlCommand cmd = new SqlCommand();
        using (TransactionScope ts = new TransactionScope())
        {
            cmd.Connection = conn;
            conn.Open();
            try
            {
                foreach (string item in sqlStr)
                {
                    cmd.CommandType = CommandType.Text;//设置命令类型为SQL文本命令
                    cmd.CommandText = item;//设置要对数据源执行的SQL语句                                          
                    cmd.Parameters.AddRange(param[i]);
                    i++;
                    cmd.ExecuteNonQuery();//执行SQL语句并返回受影响的行数                       
                }
                ts.Complete();
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                conn.Close();
                sqlStr.Clear();
            }
        }

    }
}

5.2 用户登陆界面的设计与实现

用户登陆界面如图5-1所示:
在这里插入图片描述

图5-1 登陆界面

其实现代码如下

if (rdo_student.Checked)
{
     if (txt_number.Text == "" || txt_password.Text == "")
     {
         MessageBox.Show("请输入完整信息!!!");
         return;
     }
     string count = txt_number.Text;
     string pwd = txt_password.Text;
     MyStr user = new MyStr { account = count, password = pwd };
     bool result = mq.Login(user);
     if (result)
     {
         this.Hide();
         frm_User mainForm = new frm_User(txt_number.Text);
         mainForm.StartPosition = FormStartPosition.CenterScreen;
         mainForm.Show();
     }
     else
     {
         MessageBox.Show("账号或密码错误!!!");
     }
     return;
 }

5.3 注册界面的设计与实现

注册界面如图5-2所示:

在这里插入图片描述

5-2 注册界面

其实现代码如下:

private void btnSubmit_Click(object sender, EventArgs e)
{
    string count = txt_count.Text;
    string pwd = txt_pwd.Text;
    string nc = txt_name.Text;
    string rePwd = txt_submit.Text;
    if (count == "" || pwd == "" || nc == "" || rePwd == "")
    {
        MessageBox.Show("请输入完整信息!!!");
        return;
    }
    if (!ver.IsCode(txt_count.Text))//验证账号是否正确
    {
        MessageBox.Show("请输入4位数字账号!!!");
        return;
    }

    if (!ver.IsChinese(txt_name.Text))//验证账号是否正确
    {
        MessageBox.Show("请输入中文昵称!!!");
        return;
    }

    if (pwd == rePwd)
    {
        MyStr user = new MyStr { account = count, name = nc, password = pwd };
        bool result = mf.Register(user);

        if (result)
        {
            MessageBox.Show("注册成功!!!");
        }
        else
        {
            MessageBox.Show("账号已存在!!!");
        }
    }
    else
    {
        MessageBox.Show("两次输入不一致!!!");
    }
}

5.4 发布彩票界面的设计与实现

如图5-3所示:

在这里插入图片描述

图5-3 发布彩票界面

其实现代码如下:

private void button2_Click(object sender, EventArgs e)
{
    string strprice = "未开奖";
    string strtime=System.DateTime.Now.ToLongDateString();
    MyStr stu = new MyStr { MTprice = strprice,MTtime=strtime };
    bool result = mq.Addticket(stu);
    if (result)
    {
        MessageBox.Show("发布成功!!");
        dataGridView1.DataSource = mq.GetAll("ticket");
    }
    else
    {
        MessageBox.Show("发布失败");
    }
}

5.5 查看发布彩票界面的设计与实现

如图5-4所示:
在这里插入图片描述

图5-4 查看发布彩票界面

其实现代码如下:

private void button1_Click(object sender, EventArgs e)
{
    string a = System.DateTime.Now.ToLongDateString();
    dataGridView1.DataSource = mf.GetOne(a);
}

private void button2_Click(object sender, EventArgs e)
{
    dataGridView1.DataSource = mf.GetAll("ticket");
}

private void frm_issue_rem_Load(object sender, EventArgs e)
{
    dataGridView1.DataSource = mf.GetAll("ticket");
}

private void button5_Click(object sender, EventArgs e)
{
    MyStr st = new MyStr { MTno = n };
    bool result = mf.Delete(st);
    if (result)
    {
        MessageBox.Show("删除成功");
        dataGridView1.DataSource = mf.GetAll("ticket");
    }
    else
    {
        MessageBox.Show("删除失败");
    }
}

5.6 销售情况界面的设计与实现

如图5-5所示:
在这里插入图片描述

图5-5 销售情况界面

部分实现代码:

 private void button1_Click(object sender, EventArgs e)
 {
      string a = System.DateTime.Now.ToLongDateString();
      dataGridView1.DataSource = mf.GetOne1(a);
  }

  private void button2_Click(object sender, EventArgs e)
  {
      dataGridView1.DataSource = mf.GetAll("total");
  }

  private void frm_sell_Load(object sender, EventArgs e)
  {
      dataGridView1.DataSource = mf.GetAll("total");
  }

5.7 开奖/兑奖界面的设计与实现

如图5-6所示:
在这里插入图片描述

图5-6 开奖/兑奖界面

其实现部分代码:

private void button5_Click(object sender, EventArgs e)
{

    if (textBox1.Text == "")
    {
        MessageBox.Show("请选择编号");
        return;
    }
    string price = mf.GetOneSure("ticket", "编号", textBox1.Text).DataSet.Tables[0].Rows[0]["中奖号码"].ToString();
    try
    {
        string price2 = mf.GetOnePrice("total", "编号", textBox1.Text).DataSet.Tables[0].Rows[0]["购买号码"].ToString();
        if (price == price2)
        {
            string userno = mf.GetOnePrice("total", "编号", textBox1.Text).DataSet.Tables[0].Rows[0]["账号"].ToString();

            MyStr stu = new MyStr { MIno = userno, MIprice=price};
            bool result = mf.UpdatePrice1(stu);
            if (result)
            {
                dataGridView2.DataSource = mf.GetOneSure("user_info", "账号", userno);
            }
            else
            {
                MessageBox.Show("查看失败");
            }
            
        }
        else
        {
           
        }
    }
    catch
    {
        MessageBox.Show("无人中奖");
    }
}

private void button4_Click(object sender, EventArgs e)
{
    if (textBox1.Text == "")
    {
        MessageBox.Show("请选择编号");
        return;
    }
    
    string price=mf.GetOneSure1("ticket", "编号", int.Parse(textBox1.Text)).DataSet.Tables[0].Rows[0]["中奖号码"].ToString();
    try{
        string price2 = mf.GetOnePrice("total", "编号", textBox1.Text).DataSet.Tables[0].Rows[0]["购买号码"].ToString();
        if (price == price2)
        {
            string userno= mf.GetOnePrice("total", "编号", textBox1.Text).DataSet.Tables[0].Rows[0]["账号"].ToString();
            int mymoney = int.Parse(mf.GetOneSure("user_info", "账号", userno).DataSet.Tables[0].Rows[0]["财富"].ToString());
            mymoney = mymoney+1000000;
            MyStr stu = new MyStr { MIno = userno, MImoney = mymoney.ToString() };
            bool result = mf.UpdateMoney(stu);
            if (result)
            {
                MessageBox.Show("有人中奖");
            }
            else
            {
                MessageBox.Show("兑奖失败");
            }
        }
        else
        {
            MessageBox.Show("兑奖成功");
        }
    }
    catch
    {
        MessageBox.Show("无人中奖");
    }
}

5.8 用户购买界面的设计与实现

如图5-8所示:
在这里插入图片描述

图5-8 自动判决界面

部分主要代码:

private void button2_Click(object sender, EventArgs e)
{
    if(textBox1.Text==""|| textBox2.Text == "" || textBox3.Text == "" || textBox4.Text == "" || textBox5.Text == ""
        || textBox6.Text == "" || textBox7.Text == "" || textBox8.Text == "")
    {
        MessageBox.Show("号码不能为空");
        return;
    }
    if (!ver.IsNumber(textBox1.Text)|| !ver.IsNumber(textBox2.Text) || !ver.IsNumber(textBox3.Text)
        || !ver.IsNumber(textBox4.Text)
        || !ver.IsNumber(textBox5.Text) || !ver.IsNumber(textBox6.Text) || !ver.IsNumber(textBox7.Text))
    {
        MessageBox.Show("号码只能为33以内数字哦!!");
        return;
    }

    try
    {
        Money();
        int n1 = int.Parse(textBox1.Text);
        int n2 = int.Parse(textBox2.Text);
        int n3 = int.Parse(textBox3.Text);
        int n4 = int.Parse(textBox4.Text);
        int n5 = int.Parse(textBox5.Text);
        int n6 = int.Parse(textBox6.Text);
        int n7 = int.Parse(textBox7.Text);
        int[] types = new int[] { n1, n2, n3, n4, n5, n6, n7 };
        string price = string.Join(",", types);
        string Fname = mf.GetOneSure("user_info", "账号", sendValue).DataSet.Tables[0].Rows[0]["昵称"].ToString();
        string Fbh = mf.GetOneSure1("ticket", "编号", int.Parse(textBox8.Text)).DataSet.Tables[0].Rows[0]["编号"].ToString();
        string Ftime = System.DateTime.Now.ToLongDateString();
        MyStr stu = new MyStr { MTObh = Fbh, MTOno = sendValue, MTOname = Fname, MTOprice = price, MTOtime = Ftime };

        bool result = mf.Buyticket(stu);
        if (result)
        {
            MessageBox.Show("购买成功");
            dataGridView1.DataSource = mf.GetOneSure("total", "账号", sendValue);
        }
        else
        {
            MessageBox.Show("购买失败!");
        }
    }
    catch
    {
        MessageBox.Show("没有找到彩票信息!!");
    }
}

6 系统测试

6.1测试计划

6.2测试用例设计及执行

6.3测试小结

结论

源码和原文档获取访问:winform之家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百趣代谢组学文献分享:OnPLS方法在哮喘领域应用研究

百趣代谢组学文献分享&#xff0c;本周分享的文献题目为OnPLS-Based Multi-Block Data Integration: A Multivariate Approach to Interrogating Biological Interactions in Asthma&#xff0c;是由日本前桥群马大学创新研究中心Craig E. Wheelock教授课题组在2018年发表于Ana…

商业智能 BI 人员的六个Level,你到了哪一层?

现在商业智能 BI 行业的从业人员越来越多&#xff0c;但很多人对于自己的职业规划可能并不是特别的清晰&#xff0c;不知道在这个细分领域到底有多大的成长空间&#xff0c;未来大概可以走到哪一个层次。 今天大概介绍下这六个层次&#xff0c;可以是大多数从事商业智能 BI 工…

【计算机程序设计思想与方法】1 什么是计算?

计算是利用计算机解决问题的过程,计算机科学是关于计算的学问。 计算机科学家在用 计算机解决问题时形成了特有的思维方式和解决方法,即计算思维。 1.1 什么是计算? 1.1.1 计算机与计算 计算机是当代最伟大的发明之一。 自从人类制造出第一台电子数字计算机,迄今已近 …

面试题-Java集合常见问题

1 常见集合集合相关类和接口都在java.util中&#xff0c;主要分为三中List(列表)、Map(映射)和Set(集合)其中Collection是集合List、Set的父接口&#xff0c;它主要有两个子接口&#xff1a;List&#xff1a;存储的元素有序&#xff0c;可重复。ArrayList基于数组实现LinkedLis…

STM32开发(二)CubeMX详解构建基本框架

文章目录STM32 CubeMX背景STM32 CubeMX基本配置选择芯片型号新建工程配置系统时钟、调试口、GPIO配置时钟配置配置GPIO &#xff08;LED为例&#xff09;GENERATE CODE 生成代码使用工具&#xff1a;CubeMX STM32 CubeMX背景 玩过STM32单片机的朋友都知道&#xff0c;以前的时…

网络协议栈简单设计(udp)

网络协议栈简单设计 操作系统内核中实现了网络协议栈&#xff0c;但今天利用netmap&#xff08;也可利用dpdk&#xff09;绕过内核协议栈进行网络数据的收发 netmap 内核协议栈加载数据&#xff1a; 数据从网卡到内核再到内存&#xff0c;需要经过两次拷贝 netmap映射数据&…

List底层源码剖析之List扩容机制

在list集合中有一个add方法&#xff1a; 在众多类中&#xff0c;最长使用的是ArrayList,其中有个方法是add方法 在add方法底层存在 private int size&#xff1b; ensureCapacityInternal(size 1) 其中的size1会对add&#xff08;&#xff09;方法的调用次数进计数&#x…

Docker系列(常用命令) 02

Docker常用命令总结 docker官方命令文档 一、Docker环境信息命令 docker version # 查看docker版本信息 docker info # 查看docker详细信息二、系统日志信息常用命令 2.1 docker events 作用&#xff1a;从服务器获取实时事件&#xff0c;比如&#xff1a;启动、关闭和创…

九龙证券|美国散户疯狂抄底,嗅到了什么?华尔街最新警告

当地时间周五&#xff0c;美股三大指数低开后经历“过山车”行情&#xff0c;虽然盘中一度转涨&#xff0c;但午后再度回落。截至收盘&#xff0c;道指跌0.38%&#xff0c;报收33926.01点&#xff1b;纳指跌1.59%&#xff0c;收于12006.95点&#xff1b;标普500指数跌1.04%&…

九龙证券|全市场注册制下 多层次资本市场定位更清晰

全商场施行注册制的启动&#xff0c;让多层次本钱商场各个板块之间的定位愈加明晰。沪深交易所主板将杰出大盘蓝筹定位&#xff0c;各个板块互联互通也在逐渐加强。 分析人士认为&#xff0c;全面施行股票发行注册制是一场触动本钱商场全局的革新。注册制在全商场推广后&#x…

解读测试能力素质模型

软件测试的能力素质模型(Job Model)&#xff0c;是对不同层级测试工程的能力要求进行明确的定义。目的是为了对每位工程师的能力进行科学的评估&#xff0c;然后分配合理的工作&#xff0c;也帮助大家明确职业规划的方向。 淘宝测试工程师的最常用的有4个&#xff0c;分别是&am…

uniapp(一)

一、初识微信小程序1、什么是微信小程序微信小程序简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用小程序是一种新的开放能力&#xff0c;开发…

【Redis学习笔记】主从复制

读写分离&#xff0c;性能扩展&#xff1b;快速容灾恢复 一主两从 准备一台服务器&#xff0c;启动不同的redis端口&#xff0c;6379、6380、6381 连接redis-cli redis-cli查看主从信息 info replication主机6379 从机6380、6381 设置从机 config set masterauth password -…

【青训营】架构初探

单机架构 单机架构是把所有功能都实现在一个进程里&#xff0c;并且部署在一台机器上。优点是简单&#xff0c;但是缺点在于其能够承载的带宽有限&#xff0c;而且进行运行维护必须关停服务器。模块之间相互影响&#xff0c; 单体架构 单体架构和单机架构最大的不同是单体架构…

【JavaEE】认识Tomcat

✨哈喽&#xff0c;大家好&#xff0c;我是辰柒&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:如何构造 HTTP 请求同时认识HTTPS&#xff01; &#x1f680;&#x1f680;代码存放仓库github&#xff1a;JavaEE代码&#xff01; ⛵⛵作者…

排序模型进阶-WideDeepWDL模型导出

8.5 排序模型进阶-Wide&Deep 学习目标 目标 无应用 无 8.5.1 wide&deep Wide部分的输入特征&#xff1a; raw input features and transformed featuresnotice: W&D这里的cross-product transformation&#xff1a;只在离散特征之间做组合&#xff0c;不管是文本…

《从0开始学大数据》之构建一个大数据平台

在分布式系统中分发执行代码并启动执行&#xff0c;这样的计算方式必然不会很快&#xff0c;即使在一个规模不太大的数据集上进行一次简单计算&#xff0c;MapReduce 也可能需要几分钟&#xff0c;Spark 快一点&#xff0c;也至少需要数秒的时间。而互联网产品处理用户请求&…

微信短视频怎么提取gif?三步教你在线提取gif动画

现在各大社交软件上短视频是越来越多&#xff0c;为了方便传播、保存可以将短视频制作成GIF。那么&#xff0c;如何从视频中提取动图呢&#xff1f;很简单&#xff0c;两招就能完成在线视频转换成gif动图的操作&#xff0c;只需要使用【GIF中文网】的视频转gif&#xff08;http…

OBS使用WebRTC进行腾讯云推流播流

推流&#xff1a; 首先&#xff1a;OBS想要推送WebRTC格式的推流需要满足以下两点&#xff1a; 1&#xff1a;OBS版本在26及以上 2&#xff1a;需要给OBS安装腾讯云插件&#xff0c;而且只支持Windows版。 OBS下载地址&#xff1a;Download | OBSDownload OBS Studio for W…

电路方案分析(十六)带有C2000微控制器且精度为 ±0.1° 的分立式旋转变压器前端参考设计

带有C2000微控制器且精度为 0.1 的分立式旋转变压器前端参考设计 tips&#xff1a;参考Ti设计资源&#xff1a;TIDA-01527 旋转变压器详细介绍&#xff1a; https://blog.csdn.net/qq_41600018/article/details/127597875&#xff1f;spm1001.2014.3001.5501 该参考方案设计…