摘要:近年来,中国彩票行业已经进入市场急速扩张和加速上升的阶段,即开票占整个彩票销量的比率也将急剧上扬。自助售彩终端,这一崭新的售彩模式已被中国彩民接受,爆发点很快来临。到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之家