这个课程设计可以说做完满满的成就感吧,虽然不算特别炫酷的系统,但是记录一下或许会对看到这篇的人有所帮助。
通过数据库实训进一步掌握数据库系统的理论和方法,培养和锻炼开发管理信息系统的能力,为今后信息系统开发打下良好的基础。数据库是一门应用性很强的专业课,在学习时必须注意理论与实践相结合。本次课程环节旨在培养学生在本课程范围内初步掌握解决实际应用问题时所应具备的查阅资料、综合运用所学知识的能力为毕业设计及今后从事专业工作打下基础。本次课程实践主要包括需求分析、数据分析、系统逻辑模型设计方法功能设计、物理模型设计方法系统的实现等方法,然后设计一个美容院管理系统能够按照一定条件查询、记录预约信息可以模拟完成管理员对用户的增删查改、用户的预约项目等业务。
创建beauty数据库,并创建相关的基本表。
运行美容院信息管理系统,用户登陆进行相关的账户操作,如修改信息、密码修改、查询功能、预约操作等。管理员登陆相应的账号,进行会员信息管理、美容师信息管理、美容项目信息管理、预约操作等。
操作系统:Windows 10
DBMS:MySQL
应用程序开发环境:Visual Studio 2019
开发语言:C#
数据源:DBMS
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。
C#是微软公司发布的一种面向对象的、运行于.NET Framework和.NET Core之上的高级程序设计语言。C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。
美容院管理系统向用户提供一个方便、简单、及时、自由预约的互联的现代计算机化的网络系统,可以大大减少工作人员,节约人力资源的开销,同时由于手续程序减少也可以减轻业务员的工作负担,有效地提高了整体的工作效率和精确度,更重要的是减少了用户预约业务的等待时间,方便用户对个人信息的自由管理。
通过一些了解,要求我们的系统有如下功能:
1)全面管理美容院里美容师的信息
在美容院里,美容师是必不可少的。那么相应的就要有美容师的信息,随着美容师的加入以及离开,有关美容师的信息也应该需要做出相应的更新,而且美容师自身的一些信息有时候也需要做出一些相应的更改,因此要做美容师的管理。
2)全面管理会员的信息
会员在注册账号的时候,是需要填写一些信息的,这些信息在会员登陆以后都会呈现在会员面前,如果有一些信息不符合,后期是可以进行修改的。而且会员也要进行项目预约操作。通过这样的一个对会员的管理,可以清晰的看到会员的一些信息,对于预约信息也更加清楚,使工作的效率提高。
3)全面管理项目的信息
美容院里总干事少不了各式各样的美容项目,对这些项目做一个全面的管理,可以提高对于客户的服务水平。
4)管理员对于会员信息,美容师信息,项目信息,会员的预约记录的管理,提高效率。
A.美容师模块
(1)信息管理:修改一些基本信息,修改密码等。
(2)预约查询:对于所服务项目的相关预约记录查看。
B.管理员模块
(3)美容师信息管理:对美容师信息进行添加、修改、删除等。
(4)会员信息管理:对会员信息进行添加、修改、删除等。
(5)美容服务项目管理:对美容服务项目信息进行添加、修改、删除等。
(6)预约查询:对会员的预约情况进行查看,操作。
C.会员模块
(7)信息管理:修改一些基本信息,修改密码等。
(8)预约操作:预约服务项目,进行预约签到,取消预约等。
会员信息表(会员ID,姓名,电话号码,皮肤类型,睡眠状态,余额)
美容师信息表(美容师ID,姓名,电话号码,年龄,服务项目ID)
美容服务项目表(项目ID,项目名称,类别,价格,所用物品)
预约表(会员ID,项目ID,预约时间)
登录表(账号,密码)
1.会员信息表
字段名称 | 数据类型 | 长度 | 说明 |
---|---|---|---|
UserId | char | 20 | 用户编号 |
Uname | char | 20 | 姓名 |
Utel | char | 50 | 联系电话 |
type | char | 20 | 皮肤类型 |
sleepStatus | char | 10 | 睡眠状况 |
extra | Int | 20 | 余额 |
2.美容服务项目信息表
字段名称 | 数据类型 | 长度 | 说明 |
---|---|---|---|
ItemId | char | 20 | 项目编号 |
Iname | char | 20 | 姓名 |
classfied | char | 50 | 类别 |
expenses | Int | 20 | 价格 |
items used | char | 50 | 所用物品 |
3.美容师信息表
字段名称 | 数据类型 | 长度 | 说明 |
---|---|---|---|
BeauId | char | 20 | 美容师编号 |
Beauname | char | 20 | 姓名 |
age | Int | 20 | 年龄 |
BeauTel | char | 30 | 联系电话 |
ItemId | char | 20 | 项目编号 |
4.预约表
字段名称 | 数据类型 | 长度 | 说明 |
---|---|---|---|
UserId | char | 20 | 会员编号 |
ItemId | char | 20 | 姓名编号 |
Date | char | 30 | 预约日期 |
5.登录表
字段名称 | 数据类型 | 长度 | 说明 |
---|---|---|---|
admin | char | 20 | 账号 |
passwd | char | 20 | 密码 |
<------会员信息表------>
DROP TABLE IF EXISTS 会员信息表
;
CREATE TABLE 会员信息表
(
UserId
char(20) NOT NULL,
Uname
char(20) NOT NULL,
Utel
char(50) DEFAULT NULL,
type
char(20) DEFAULT NULL,
sleep condition
char(10) DEFAULT NULL,
extra
int(20) DEFAULT NULL,
PRIMARY KEY (UserId
),
KEY Uname
(Uname
)
) ;
<------美容服务项目信息表------>
DROP TABLE IF EXISTS 美容服务项目表
;
CREATE TABLE 美容服务项目表
(
ItemId
char(20) NOT NULL,
Iname
char(20) NOT NULL,
classfied
char(50) DEFAULT NULL,
expenses
int(20) DEFAULT NULL,
items used
char(50) DEFAULT NULL,
PRIMARY KEY (ItemId
),
KEY expenses
(expenses
)
) ;
<------美容师信息表------>
DROP TABLE IF EXISTS 美容师信息表
;
CREATE TABLE 美容师信息表
(
BeauId
char(20) NOT NULL,
Beauname
char(20) NOT NULL,
age
int(20) DEFAULT NULL,
BeauTel
char(30) DEFAULT NULL,
ItemId
char(20) DEFAULT NULL,
PRIMARY KEY (BeauId
),
KEY ItemId
(ItemId
),
CONSTRAINT ItemId
FOREIGN KEY (ItemId
) REFERENCES 美容服务项目表
(ItemId
) ON DELETE RESTRICT ON UPDATE RESTRICT
) ;
<------预约信息表------>
DROP TABLE IF EXISTS 预约表
;
CREATE TABLE 预约表
(
UserId
char(20) NOT NULL,
ItemId
char(20) NOT NULL,
Date
char(30) DEFAULT NULL,
PRIMARY KEY (UserId
,ItemId
),
KEY UserId
(UserId
),
KEY ItemId2
(ItemId
),
CONSTRAINT ItemId2
FOREIGN KEY (ItemId
) REFERENCES 美容服务项目表
(ItemId
) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT UserId
FOREIGN KEY (UserId
) REFERENCES 会员信息表
(UserId
) ON DELETE RESTRICT ON UPDATE RESTRICT
);
<------登录表------>
DROP TABLE IF EXISTS 登录表
;
CREATE TABLE 登录表
(
admin
char(20) NOT NULL,
passwd
char(20) NOT NULL
);
<------会员表部分------>
触发器说明:当在表中插入会员时,登录表也插入相应的账号和默认密码。当在表中删除会员时,登录表也删除相应的账号和密码。
<------美容师信息表部分------>
触发器说明:当在表中插入美容师时,登录表也插入相应的账号和默认密码。当在表中删除会员时,登录表也删除相应的账号和密码。
<------美容服务项目表部分------>
触发器说明:当某项美容服务项目被删除时,负责该服务项目的美容师的ItemID部分要置为NULL。
<------美容师信息表部分------>
CREATE DEFINER = root
@localhost
PROCEDURE showBeautyInfo
()
BEGIN
select * from 美容师信息表;
END;
<------美容服务项目表部分------>
CREATE DEFINER = root
@localhost
PROCEDURE showItemInfo
()
BEGIN
select * from 美容服务项目表;
END;
<------会员表部分------>
CREATE DEFINER = root
@localhost
PROCEDURE showUserInfo
()
BEGIN
select * from 会员信息表;
END;
<------预约表部分------>
CREATE DEFINER = root
@localhost
PROCEDURE showReservation
()
BEGIN
SELECT * FROM 预约表;
END;
String s = "server=localhost;port=3306;database=beauty;user=root;password=123456;";
MySqlConnection con = new MySqlConnection(s);
String userid = this.textBox1.Text;//用户输入的账号
String passwd = this.textBox2.Text;//用户输入的密码
String sql = "select * from 登录表 where admin = @user";//会员ID传值
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.Parameters.AddWithValue("user", userid);//将用户输入的userid赋值给“user”
MySqlDataReader reader = null;
String pwd = "";//从数据库读取的密码
try
{
if (con.State == ConnectionState.Closed)
con.Open();//打开连接通道
reader = cmd.ExecuteReader();
if (reader.HasRows)//是否检索出信息
{
while (reader.Read())
{
pwd = reader.GetString(1);
if (pwd.Equals(passwd))
{
this.Hide();
if (radioButton1.Checked && (userid[0] == '1'))//会员
{
Form2 f2 = new Form2(textBox1.Text);
f2.ShowDialog();
}
else if (radioButton2.Checked && (userid[0] == 'a'))//管理员
new Form3().ShowDialog();
else if (radioButton3.Checked && (userid[0] == '2'))//美容师
{
Form4 f4 = new Form4(textBox1.Text);
f4.ShowDialog();}
else{
MessageBox.Show("该类型用户不存在!");
new Form1().ShowDialog();}
}
else {
MessageBox.Show("输入密码错误!");}
}
}
else{//用户没有相关的登录信息
MessageBox.Show("用户名不存在!"); }
}
catch (Exception ex){
MessageBox.Show(ex.Message); }
MySqlConnection con = Connect();
String userid = this.textBox1.Text;
String itemid = this.textBox7.Text;
String str;
int exp,money;
String sql = "update 会员信息表 set extra=extra-@expenses where UserId in (select UserId from 预约表 where UserId =@userid and ItemId =@itemid )";//更新相应会员的余额
String sql0 = "select * from 预约表 where UserId =@userid and ItemId =@itemid";//为了检索是否有预约记录
String sqlsel = "select expenses from 美容服务项目表 where ItemId =@itemid";//检索该项目的价格
String sqldel = "delete from 预约表 where UserId =@userid and ItemId =@itemid";
String sqlmoney = "select extra from 会员信息表 where UserId =@userid";//检索会员的余额
MySqlCommand cmd = new MySqlCommand(sql, con);
MySqlCommand cmd0 = new MySqlCommand(sql0, con);
MySqlCommand cmd1 = new MySqlCommand(sqlsel, con);
MySqlCommand cmd2 = new MySqlCommand(sqldel, con);
MySqlCommand cmd3 = new MySqlCommand(sqlmoney, con);
cmd.Parameters.AddWithValue("userid", userid);
cmd.Parameters.AddWithValue("itemid", itemid);
cmd0.Parameters.AddWithValue("userid", userid);
cmd0.Parameters.AddWithValue("itemid", itemid);
cmd1.Parameters.AddWithValue("itemid", itemid);
cmd2.Parameters.AddWithValue("userid", userid);
cmd2.Parameters.AddWithValue("itemid", itemid);
cmd3.Parameters.AddWithValue("userid", userid);
MySqlDataReader reader = null;
try{
if (con.State == ConnectionState.Closed)
con.Open();
reader = cmd0.ExecuteReader();//查询是否有预约记录
if (reader.HasRows){
reader.Close();
object o = cmd1.ExecuteScalar();
str = o.ToString();
exp = int.Parse(str);
cmd.Parameters.AddWithValue("expenses", exp);
object obj = cmd3.ExecuteScalar();//检查余额
str = obj.ToString();
money = int.Parse(str);
if (money > exp) { //账户余额与服务项目进行对比
cmd.ExecuteNonQuery();//将检索出来的服务项目价钱在会员的余额中扣除
MessageBox.Show("签到成功!");
cmd2.ExecuteNonQuery();//删除在预约表里面的记录
MessageBox.Show("扣款成功!");
}
else{//余额不足
MessageBox.Show("亲!您余额不足哦,请充值完毕再进行签到!");}
}
else{//没有预约记录
reader.Close();//一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。
MessageBox.Show("亲!您没有预约过此项目哦!");}
}
catch (Exception ex){
MessageBox.Show(ex.Message);}
con.Close();
(1)信息表查询
MySqlConnection con = Connect();
MySqlCommand cmd = new MySqlCommand("call showUserInfo()", con);//使用存储过程,检索出所有会员信息,此处查询美容师也同理使用了存储过程
MySqlDataAdapter sda = new MySqlDataAdapter(cmd);//建立DataAdapter对象,数据适配器,用于从数据库读取数据
DataSet ds = new DataSet();//建立DataSet对象(相当于建立前台的虚拟数据库)
DataTable userInfo=new DataTable(); //建立DataTable对象(相当于建立前台的虚拟数据库中的数据表)
try
{
if (con.State == ConnectionState.Closed)
con.Open();
sda.Fill(ds, "userInfo");
dataGridView1.DataSource = ds.Tables["userInfo"];
}
catch (Exception ex){
MessageBox.Show(ex.Message);}
con.Close();
(2)信息修改
private void button4_Click(object sender, EventArgs e)
{
if (dbUpdate()){
MessageBox.Show("修改成功!");}
else{
MessageBox.Show("ID不能修改哦!");}
}
private Boolean dbUpdate()
{
MySqlConnection con = Connect();
MySqlCommand cmd = new MySqlCommand("call showUserInfo()", con);//调用存储过程 MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
DataTable dtUpdate = new DataTable();//更新
dtUpdate.Rows.Clear();//清空数据表
DataTable dtShow = new DataTable();//展示
dtShow = (DataTable)dataGridView1.DataSource;//从数据库中把数据读出来放到一个数据集中,然后绑定数据源
for (int i = 0; i < dtShow.Rows.Count; i++)
{
dtUpdate.ImportRow(dtShow.Rows[i]);//从元数据源复制每一行数据到dtUpdate
}
try
{
con.Open();
sda = new MySqlDataAdapter("call showUserInfo()", con);//建立DataAdapter对象,用于从数据库读取会员信息表数据
DataTable ds = new DataTable();
MySqlCommandBuilder CommandBuilder = new MySqlCommandBuilder(sda);//为了能够自动生成命令
sda.UpdateCommand = CommandBuilder.GetUpdateCommand();//获取在数据源中执行更新操作所需的自动生成的 DbCommand 对象
ds = (DataTable)dataGridView1.DataSource;
sda.Update(ds);
dtUpdate.AcceptChanges();//提交自加载此dtUpdate或上次调用AcceptChanges以来对其进行的所有更改。
con.Close();
}
catch{
return false; }
dtUpdate.AcceptChanges();
return true;
}
(3)删除信息
MySqlConnection con = Connect();
String userid = this.textBox7.Text;
string sql = "select UserId from 会员信息表 where UserId = @id";
string sqlDle = "delete from 会员信息表 where UserId = @id";
string sql2 = "select UserId from 预约表 where UserId = @id";
string sqlDle2 = "delete from 预约表 where UserId = @id";
MySqlCommand cmd1 = new MySqlCommand(sql, con);
MySqlCommand cmd = new MySqlCommand(sqlDle, con);//删除会员
MySqlCommand cmd2 = new MySqlCommand(sql2, con);
MySqlCommand cmd3 = new MySqlCommand(sqlDle2, con);//删除预约表里面包含该会员的记录
cmd1.Parameters.AddWithValue("id", userid);
cmd.Parameters.AddWithValue("id", userid);
cmd2.Parameters.AddWithValue("id", userid);
cmd3.Parameters.AddWithValue("id", userid);
MySqlDataReader reader = null;
MySqlDataReader reader2 = null;
try
{
if (con.State == ConnectionState.Closed)
con.Open();
reader2 = cmd2.ExecuteReader();
if (reader2.HasRows)//先删除预约表里的记录
{
reader2.Close();
cmd3.ExecuteNonQuery();
MessageBox.Show("该会员在预约表里有记录,从预约表删除成功!");
}
else { reader2.Close(); }
reader = cmd1.ExecuteReader();
if (reader.HasRows){
reader.Close();
cmd.ExecuteNonQuery();
MessageBox.Show("从会员信息表删除成功!");
}
else{
MessageBox.Show("删除无效,无此ID!");}
}
catch (Exception ex){
MessageBox.Show(ex.Message);}
con.Close();
(4)删除项目
MySqlConnection con = Connect();
String itemid = this.textBox6.Text;
string sql = "select ItemId from 美容服务项目表 where ItemId = @id";
string sqlDle = "delete from 美容服务项目表 where ItemId = @id";
string sql1 = "select ItemId from 预约表 where ItemId = @id";
string sqlsel = "select * from 美容师信息表 where ItemId = @id";
MySqlCommand cmd1 = new MySqlCommand(sql, con);
MySqlCommand cmd = new MySqlCommand(sqlDle, con);//删除项目表里的
MySqlCommand cmd2= new MySqlCommand(sql1, con);//查询该项目是否在预约表里面有记录
MySqlCommand cmd3 = new MySqlCommand(sqlsel, con);//检索出服务此项目的美容师
cmd1.Parameters.AddWithValue("id", itemid);
cmd.Parameters.AddWithValue("id", itemid);
cmd2.Parameters.AddWithValue("id", itemid);
cmd3.Parameters.AddWithValue("id", itemid);
MySqlDataReader reader = null;
MySqlDataReader reader2 = null;
try
{
if (con.State == ConnectionState.Closed)
con.Open();
reader2 = cmd2.ExecuteReader();
if (reader2.HasRows)//先删除预约表里的记录
{
reader2.Close();
Form9 f9 = new Form9(textBox6.Text);
f9.ShowDialog();
}
else { reader2.Close(); }
reader = cmd1.ExecuteReader();//检索项目表
if (reader.HasRows){
reader.Close();
cmd.ExecuteNonQuery();
MessageBox.Show("从美容服务项目表删除成功!");
}
else{
MessageBox.Show("删除无效,无此服务项目!");
}
}
catch (Exception ex){
MessageBox.Show(ex.Message);}
con.Close();
(5)检索有预约已被删除的项目的会员联系方式并通知他们
MySqlConnection con = Connect();
String id = this.textBox1.Text;
string sql = "select UserId,Uname,Utel from 会员信息表 where UserId in (select UserId from 预约表 where ItemId=@id)";//检索出有预约被删除项目的会员的电话号码,以便即使通知
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.Parameters.AddWithValue("id", id);
MySqlDataAdapter sda = new MySqlDataAdapter(cmd);//建立DataAdapter对象,数据适配器,用于从数据库读取数据
DataSet ds = new DataSet();//建立DataSet对象(相当于建立前台的虚拟数据库)
DataTable userInfo = new DataTable(); //建立DataTable对象(相当于建立前台的虚拟数据库中的数据表)
try
{
if (con.State == ConnectionState.Closed)
con.Open();
sda.Fill(ds, "userInfo");
dataGridView1.DataSource = ds.Tables["userInfo"];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
con.Close();
会员管理与美容师管理界面均类似。
值得注意的是,在删除项目时,要及时通知有预约该项目的会员,且修改美容师信息表服务该项目的美容师的ItemID要置为NULL(此处用触发器实现)。
删除会员信息时,要先将该会员的预约记录从预约表删除后再从会员信息表删除。
例如:要删除项目号为3008的服务项目,以下是服务该项目的美容师。
删除后弹出以下的界面,通知完会员后,成功删除。
服务该项目的美容师的ItemID也成功置为NULL。
会员进行预约签到时,会在会员的余额里面扣款(相应的美容项目的价格)。原本1001的余额为470,签到完扣款成功后为350。编号为3011的项目价格为120元。
(1)由于是比较简单的系统,所以不适合大型美容院的使用;
(2)功能是有待加强的,功能也不够全面;
(3)数据库管理还有待完善;
(4)界面也没有做得很新颖漂亮;
(5)美容师模块的功能比较欠缺。
数据库实践活动结束了,站在实践阶段的末端,回顾实践过程的点点滴滴,虽说不上千辛万苦,但是毕竟我们为此付出了诸多的心血。经过这段时间的学习和努力,我们完成了美容院系统的数据库实践。系统的详细设计根据系统分析阶段的结论将系统具体化,并完成了各个模块的功能,直到最后形成一个完整的可行性的管理系统。从开始考虑实践题目到系统的实现再到实践报告的完成,每走一步对我们来说都是新的尝试与挑战。
第一个阶段为需求分析期,首先我们就实践要用到的知识各自进行相应的学习,学习期间保持良好的互动,之后一起讨论本程序的项目界面设计,功能设计和数据库设计。第二个阶段为编程期,这期间我们进行分工,在这期间,大家都保持了良好的互动与合作。第三个阶段为完善期,在这个阶段我们就完成的程序进行测试,对程序的漏洞进行修补改进,尽量将程序做到尽善尽美。团队的学习和试验,让每个成员头脑模糊的概念逐渐清晰,使我们作品一步步完善起来,每一次改进都是学习的收获,每一次调试的成功都是对我们的鼓励。
虽然这个美容院管理系统还不是很成熟,还有很多不足之处,如数据存入效率较低等,在整个系统的开发设计过程,我们从中学到了许多东西。在开发过程中要不断的调整自己的思维,要善于变通,不能钻牛角尖,否则将陷入死胡同。遇到问题,及时地查阅资料,如上网到专门的技术论坛询问等,在这次开发过程中,我们从网上获得了极大的帮助,几个技术难点都是通过上网查资料解决的。
系统开发的过程是一个团队合作、沟通、互相协助的过程,团队合作、默契沟通以及相互协助是开发成功的保证。在本次开发过程中,本组成员之间的配合比较默契。
总之,实践才能出真知,只有多动手,才能掌握得更多,以后我们将会花更多的时间和精力在这方面,相信我们一定可以做一个优秀的软件开发者!