要旨:近年、中国の宝くじ業界は急速な市場拡大と成長加速の段階に入っており、宝くじ売上高に占めるチケット売上高の割合も急激に上昇するとみられている。セルフサービスの宝くじ販売端末であるこの真新しい宝くじ販売モデルは中国の宝くじ参加者に受け入れられており、間もなく爆発的なポイントが訪れるでしょう。2020年までに、我が国の多機能宝くじセルフサービス端末は20万台以上に達するでしょう。このデータの計算によると、セルフサービスの宝くじ自動販売機によってもたらされるインスタントチケットの販売量は膨大な数になり、インテリジェントな宝くじセルフサービス販売端末は間違いなく中国の宝くじ業界の次の金鉱となるでしょう。市場の需要と技術的な利点に基づいています。C/S構造によりセルフ抽選を実現するシステムです。この記事の現在のシステムでは、システムが基本機能を完了しているかどうかをテストするために使用される機能検出テストの初期バージョンを紹介します。
キーワード: winform、C/S 構造、3 層アーキテクチャ、sqlserver
1 はじめに
2 開発ツールの概要
2.1 Visual Studio テクノロジの概要
2.2 SQL Server データベースの概要
2.3 開発環境
オペレーティングシステム: Windows10
データベース: SQLサーバー
開発ツール: Visual Studio
開発言語:C#
3 システム要件の分析
3.1 機能要件の分析
本システムの機能は管理者とユーザーの2つのクライアントに分かれており、管理者は宝くじの管理、賞品の当選・引き換え、ユーザーや宝くじの情報の閲覧が可能、ユーザーはアカウントの登録、購入が可能です。宝くじとリチャージ。このシステムは、宝くじのセルフサービス購入、賞品の確認と引き換えの統合を効果的に解決し、宝くじ市場の急速な拡大と加速によってもたらされる管理と購入の問題を効果的に解決します。 、この真新しい宝くじ販売モデルは中国の宝くじプレイヤーに受け入れられており、間もなく限界点が来るでしょう。上記の機能を分析すると、システムは次の主な機能に分割されます。
1. 上記の分析と説明によれば、システム内のモジュールはそれぞれ次のようになります。
(1) ログイン登録モジュール
(2) 管理者は抽選モジュールを管理します
(3) 管理者がユーザー情報モジュールを確認する
(4) ユーザーモジュール
具体的なシステム機能モジュール図を図 3-1 に示します。
図 3-1 システム機能モジュール図
2. 各モジュールの具体的な機能は次のとおりです。
(1) 宝くじの発行:
管理者はワンクリック宝くじ(抽選なし)を発行し、抽選されなかった抽選券はチケットプールに入ります。
(2) 抽選・報酬:
管理者は発行された宝くじに対して抽選を行い、宝くじは自動的に当選番号を生成し、誰かが当選番号を購入すると、100万元が口座の資産に直接追加されます。
(3) ユーザー資産の表示:
管理者はシステム内のユーザーのバランスを確認できます
(4) リリース記録を確認します。
発行された宝くじの管理者のビュー。今日の宝くじと過去の宝くじを表示するオプションを提供します。
(5) 当選状況を確認します。
引かれた宝くじの番号を入力すると、当選したユーザーのデータが閲覧できます。
(6) 販売状況の表示:
管理者は、発行された宝くじの販売記録を確認します。これには、システム ユーザー全員が購入した記録が含まれます。
(7) 宝くじを削除する:
管理者は、有効期限や抽選などの理由により無効となった宝くじを削除することができます。
(8) ユーザーは宝くじを購入します。
ユーザーは自分で番号を選択するか、機械でグループを選択することができ、購入ごとに5元がかかり、購入が成功するたびに残高から差し引かれます。
(9) ユーザーリチャージ:
ユーザーの残高が 0 の場合、宝くじを購入することはできず、チャージすることができます。
3.2 実現可能性分析
3.3 システムパフォーマンス要件の分析
4 データベース設計
4.1 データベースの概念構造設計
この宝くじ情報管理システムで使用されるデータベースは、Sqlserver データベース接続です。ユーザーログインテーブル dbo.user_id 、宝くじ販売記録テーブル dbo.total 、宝くじ情報テーブル dbo.ticket 、ユーザーアカウント情報テーブル dbo.user_info の 4 つのテーブルを含む宝くじ情報管理システムのデータベースを Sqlserver で作成します。以下概念関係図4-1
図 4-1 ER 関係図
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 のホーム