写在前面:纪念一下大三最后一次期末设计。使用C#语言和MySQL数据库实现一个会员管理系统。题目的要求非常细致又模糊,规定了要大概实现会员等级和积分余额等细节,却又没有任何题材上的框架,并且时间要求非常紧张,不到7天。所以这次做的有点简单粗暴,连背景图片都没弄,本来可以更金玉其外一点。
前排提示:效果图在下面,多图
完整的代码链接在此:
基于C#Winform+MySQL的商务娱乐会馆自助服务系统.zip
目录
1.题目
基于C#Winform+MySQL的商务娱乐会馆自助服务系统
2.总体设计
2.1 功能介绍
商务娱乐会馆会员自助服务系统分为两个部分,会员端和管理员端,管理员的账号是唯一不变的(放在数据库一个独立的表中)。
会员端主要功能:
- 用户个人信息修改;
- 账户余额充值;
- 购买服务;
- 订单查询和退款;
- 会员流水查询。
管理员端主要功能:
- 查看所有用户的信息,可以修改用户密码和等级等信息,也可以修改某个用户的登录权限(封禁);
- 管理会馆内的服务列表,进行添加或者修改删除;
- 生成充值随机面额的点卡,以供会员使用。
2.2 系统结构图
客户端
管理端
3.数据库设计
3.1 数据库概念结构
念结构设计是指将需求分析得到的用户需求抽象为信息结构。描述概念模型的有力工具是 E-R 模型。E-R 模型是对现实世界的一种抽象。它的主要成分是实体、联系和屈性。使用这三种成分,我们可以建立许多应用环境的ER模型。本系统的实体和属性的定义如下:
会员表:数据项为手机号,密码,性别,余额,积分,等级,地址,个性签名,注册日期,封印标记。
管理员表:数据项为用户名,密码
服务表:数据项为服务名,服务介绍,价格,积分,所需等级。
订单表:数据项为订单号,订单用户手机号,订单名,订单时间。
流水表:数据项为流水号,流水时间,流水用户手机号,消费种类,数额、
点卡表:数据项为卡号,密钥,是否可用,面额。
3.2 数据库物理结构
表3-1 会员表
名称 | 类型 | 可为空 | 注释 |
Id | Int |
| 自增长 |
Tel | Varchar |
| 手机号,唯一 |
password | Varchar |
| 密码 |
Credits | Int |
| 积分 |
Balance | Float |
| 余额 |
Registertime | Datetime |
| 注册时间 |
Level | Int |
| 等级 |
Address | Varchar | Yes | 地址 |
Intro | Varchar | Yes | 自我介绍 |
表3-2 管理员表
名称 | 类型 | 可为空 | 注释 |
Username | Varchar |
| 管理员,唯一 |
password | Varchar |
| 密码 |
表3-3 服务表
名称 | 类型 | 可为空 | 注释 |
Id | Int |
| 自增长 |
Name | Varchar |
| 服务名 |
Credit | Int |
| 积分 |
Balance | Float |
| 余额 |
Level | Int |
| 等级 |
Intro | Varchar | Yes | 服务介绍 |
表3-4 订单表
名称 | 类型 | 可为空 | 注释 |
Id | Int |
| 自增长 |
Tel | Varchar |
| 手机号 |
Time | Datetime |
| 订单时间 |
Name | Varchar |
| 订单名 |
表3-5 流水表
名称 | 类型 | 可为空 | 注释 |
Id | Int |
| 自增长 |
Tel | Varchar |
| 手机号 |
Time | Datetime |
| 订单时间 |
Kind | Varchar |
| 消费种类 |
Num | float |
| 数额 |
表3-6 点卡表
名称 | 类型 | 可为空 | 注释 |
Kahao | Varchar |
| 卡号 |
Secret | Varchar |
| 密钥 |
used | Int |
| 一次性 |
denomination | Int |
| 面额 |
4.详细设计
4.1 开发环境
编程语言:C#
操作系统:Windows 10
编译器:visual studio 2017 community
数据库:MySQL(wampserver里的那个,因为个人电脑问题比较多就用的wampserver)
数据库可视化工具:Navicat(主要是用于建表和数据维护),PHP My Admin(Navicat的导出有问题,某些格式是错的,还是PHPmyadmin导出比较强,而且直接把整个数据库导出来了。)
4.2 设计思路
主要是在winform窗体实现界面的绘制,用cs代码完成对数据库的访问。
4.3 功能实现
4.3.1 C#与MySQL数据库的连接
原理就是定义一个字符串,包含连接MySQL数据库的必要信息:ip,root用户名,密码(有的可能是空的),你要连接的数据库。
数据库字符串实例:
public static string LocalhostMySQLdbstr = "server=127.0.0.1;port=3306;user=你的用户名;password=你的密码; database=数据库名;";
4.3.2 用户登录
登录的本质是通过你在窗口输入的用户名,密码与MySQL数据库中对应表进行比较,如果都一致那么返回登录成功并跳转到下一个窗口,失败的话会给出提示。
使用MySQLConnection建立一个C#到MySQL的连接,然后将默认参数设置为你的数据库字符串。打开连接(务必使用try/catch包围,否则你报错是无法查看错误信息的,极其不利于发现问题所在,很多时候对数据库操作都会有纰漏或者sql语句错误),新建一个MySQL命令,命令内容就是sql语句,然后用datareader获取到sql语句的查询结果,在C#中用string或者你需要的类型保存,再与winform文本框你输入的信息比对,相同就是成功了。
因为时间紧张,密码就直接比对了。如果充裕的话应该研究个MD5加密。MD5看起来还是很高大上的。。
登录的完整代码:
private void LoginBtn_Click(object sender, EventArgs e)
{
if (telbox.Text == "" || pwdbox.Text == "")
{
MessageBox.Show("用户名或密码不能为空!", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
}
else
{
username = telbox.Text.ToString().Trim();
password = pwdbox.Text.ToString().Trim();
MySqlConnection loginconn = new MySqlConnection(connetStr);
try
{
loginconn.Open();
MySqlCommand loginCommand = loginconn.CreateCommand();
loginCommand.CommandText = "select tel,password,ban from member where tel = '" + username + "'";
MySqlDataReader loginReader = loginCommand.ExecuteReader();
while (loginReader.Read())
{
tel = loginReader["tel"].ToString();
pwd = loginReader["password"].ToString();
banid = loginReader["ban"].ToInt32();
}
if (banid == 1)
{
MessageBox.Show("账号已被封禁,请联系管理员解封! ", "账号已被封停");
loginconn.Close();
}
else
{
if (tel.Equals(username) && pwd.Equals(password) && banid == 0)
{
MessageBox.Show("欢迎登录会员管理系统! ", "SUCCESS");
Hide();
MemberClient memberClient = new MemberClient();
memberClient.Show();
}
else
{
MessageBox.Show("您的用户名或密码不正确! ", "ERROR");
pwdbox.Text = "";
}
}
}
catch (Exception exception)
{
MessageBox.Show(exception.ToString(), "异常提示");
loginconn.Close();
//MessageBox.Show("数据库连接异常!","异常提示");
}
}
}
登陆后进入会员端
4.3.3 个人信息的修改
点击上方的个人信息即可,这里为了更好的还原真实场景,使用了验证码功能,验证码的原理就是用画笔和random字符串组合而成,底层用一个string获取这个picturebox的字符串值,在点击提交的时候进行比对就好了。
if (inputcode.Equals(codestr))
{
}
else
{
MessageBox.Show("验证码输入不正确!","错误提示");
VerifyCodeTextBox1.Text = "";
ValidCode validCode = new ValidCode(4, ValidCode.CodeType.Numbers);
this.VerifyCodePic.Image = Bitmap.FromStream(validCode.CreateCheckCodeImage());
codestr = validCode.resstr;
}
4.3.4 账户充值
比较初级的思想就是建个窗口然后一输入就添加了余额,为了提高难度和仿真度,我在这里模仿了点卡系统。在数据库有点卡表,输入卡号和密钥就可以获得那个卡号对应的面额的余额,还会得到等同的积分。并且这个点卡是一次性的,用完就不能再用了。
充值:
充值失败:
成功:
余额更新:
4.3.5 购买服务
会馆中有很多服务(或商品),只要你等级足够,并且钱够,就可以购买。也就是三个条件都要满足,根据题目要求,等级由积分决定(非余额)。我设定了账户的等级只会越来越高不会降低,有自己的一个等级制,如果算出等级和当前等级不符取最高(保证不会掉级)。
服务:
如果你买了不能买的:
购买成功:
4.3.6 订单查看&会员流水
在此,每个会员都能看到自己的历史订单信息,并且可以退单。退单后花费的积分和余额会返还。
效果图:
4.3.7 管理员端
管理员端需要点击管理员登录,管理员账号唯一,且需要验证码。
登录后:
4.3.8 管理员对会员信息管理
在这里,管理员可以看到所有用户的信息(并不是完全的,这里显示的是比较直观的),可以对任意用户信息进行修改,最重要的是修改ban属性,如果ban属性为1,这个账户在会员端无法登录。
这里涉及一个问题,在一个新的窗口编辑会员信息,需要获取刚才那个窗口的表格的那一列,也就是右键的时候选中的那一列的数据。而默认的窗体是动态的无法获得这个数据,这里的解决办法参考我之前的博文:
C#.net 子窗口获取父窗口的数据(datagridview)
4.3.9 点卡管理
作为管理员可以管理充值点卡,你也可以看到所有卡的卡号和密钥。卡号是一个9位数,密码则是大小写和数字随机的6位字符串(其实多长都可以),只要点击生成就会生成一个新的随机面额的点卡,好像十来年前充值卡和一些网管系统就是这么充值的。
点卡的生成代码:
public class RandomStr
{
public static char[] constant =
{
'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
};
public static int[] generatenum = {10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 50, 50, 50, 100, 100, 200, 500};
public static string GenerateRandom(int Length)
{
StringBuilder newRandom = new StringBuilder(62);
Random rd = new Random();
for (int i = 0; i < Length; i++)
{
System.Threading.Thread.Sleep(10);
newRandom.Append(constant[rd.Next(62)]);
}
return newRandom.ToString();
}
//生成随机密钥
public static string RandomSecret()
{
string secstr = GenerateRandom(6);
return secstr;
}
//生成随机卡号
public static string RandomCardNumber()
{
Random rand = new Random();
int randnum = rand.Next(100000000, 999999999);
string numberstr = randnum.ToString();
return numberstr;
}
//生成随机面额
public static int RandomDenomination()
{
Random rand = new Random();
int randnum = rand.Next(generatenum.Length);
int miane = generatenum[randnum];
return miane;
}
}
4.3.10 服务管理
管理员可以管理会馆的所有服务,进行编辑,添加,或者删除。在这里你可以设置你认为那个服务需要的金额或者等级。
服务信息的加载代码:
private void ServiceMenuForAdmin_Load(object sender, EventArgs e)
{
serviceInitConnection = new MySqlConnection(connetStr);
try
{
serviceInitConnection.Open();
MySqlCommand serviceCommand = serviceInitConnection.CreateCommand();
serviceCommand.CommandText = "select * from service";
DataSet dataSet = new DataSet();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter();
dataAdapter.SelectCommand = serviceCommand;
dataAdapter.Fill(dataSet);
this.skinDataGridView1.DataSource = dataSet.Tables[0].DefaultView;
serviceInitConnection.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "异常提示!");
}
}
4.3.11 云服务器版本
MySQL数据库虽然小巧轻便,但也不排除谁的电脑有什么奇特的问题,就安装不上这个数据库,那样这个程序无疑失去了意义。正好我半年前买了一个学生版云服务器,我将数据库结构复制到了那里,这样即便本机没有MySQL,没有我的表结构,也依然可以访问。(不过有可能这个博文成为历史的时候,这服务器IP过期了)
功能还是一样的:
这里可以看到数据和刚才的有差异,因为数据库不在一个地方,内容也被修改了。
完整的代码链接在此:
基于C#Winform+MySQL的商务娱乐会馆自助服务系统.zip
谨以此为记,路还很长,接下来的半年可能就要专注其他课程的学习了,不过C#的强大便利性值得我这种初学者将来深入学习研究。
以上