数据库原理课程设计报刊订阅管理系统.docx
《数据库原理课程设计报刊订阅管理系统.docx》由会员分享,可在线阅读,更多相关《数据库原理课程设计报刊订阅管理系统.docx(24页珍藏版)》请在冰点文库上搜索。
数据库原理课程设计报刊订阅管理系统
1、开发背景
随着社会不断的发展,人们的生活水平越来越高,对知识的和对时事的渴求也越来越高,人们希望能够方便快捷地订阅各种报刊杂志。
但是各种各样的报刊名目和详细信息以及订阅,为相关企业的管理造成很大的麻烦。
因此网上订阅成为不可或缺的一部分。
本系统就是面向一个企业的报刊订阅管理系统。
此系统是一种比较智能化的管理系统,它面向所有企业部门的职工用户,但具有比较高的安全性能。
它能够实现报刊订阅的基本功能,包括新报刊信息的录入、订阅、查询等操作以及后台数据库的备份和恢复。
用户合法注册后必须输入有效密码才能成功进入此系统,可以进行订阅报刊,查询信息,统计信息等操作。
对于非法操作,系统有识别和防护措施。
2、需求分析
本系统主要有以下功能模块:
(1)登陆功能:
登陆系统为身份验证登录。
分为管理员登录和一般用户登录。
分别通过不同的用户名和密码进入报刊订阅管理界面,新的用户需要注册。
(2)录入新信息功能:
对于管理员,包括新用户信息和新报刊信息的录入功能,信息一旦提交就存入到后台数据库中;普通用户自行注册进行可以修改个人信息。
(3)订阅功能:
用户可以订阅报刊,系统自动计算所需金额,并显示在界面上;管理员不可订阅报刊,必须以用户身份订阅报刊。
(4)查询功能:
用户可以查询并显示自己所订阅的信息;管理员可以按人员、报刊、部门分类查询。
查询出的信息显示在界面上,并且可以预览和打印出结果。
(5)统计功能:
管理员可以按用户、部门、报刊统计报刊的销售情况,并对一些重要的订阅信息进行统计;普通用户可以统计出自己的订阅情况,并且可以预览和打印出结果。
(6)系统维护功能:
数据的安全管理,主要是依靠管理员对数据库里的信息进行备份和恢复,数据库备份后,如果出了什么意外可以恢复数据库到当时备份的状态,这提高了系统和数据的安全性,有利于系统的维护
3.数据分析(只描述了用户部分)
3.1数据流图
如图3-1
F001
用户信息
F002
报刊信息
F003
订购信息(......)
图3-1
3.2数据字典
(1)数据流的描述
数据流编号:
D001
数据流名称:
用户登录
简述:
用户要登录系统才能进行报刊订阅操作
数据流来源:
用户
数据流去向:
用户信息判断
数据流组成:
报刊代号、报刊名称、报刊年价、出版社等
数据流量:
1000/天
高峰流量:
3000/天
数据流编号:
D002
数据流名称:
用户名或密码错误
简述:
用户名或密码错误,需要重新登录
数据流来源:
用户信息判断
数据流去向:
用户
数据流组成:
用户名、密码等
数据流量:
1000/天
高峰流量:
3000/天
数据流编号:
D003
数据流名称:
报刊信息目录
简述:
所有报刊信息
数据流来源:
用户信息判断
数据流去向:
报刊订购
数据流组成:
订单号、报刊代号、用户名、金额等
数据流量:
1000/天
高峰流量:
3000/天
数据流编号:
D004
数据流名称:
订购历史记录
简述:
用户订购了报刊后即可查询自己的订购记录
数据流来源:
报刊目录查询
数据流去向:
报刊订购
数据流组成:
订单号、报刊代号、用户名、金额等
数据流量:
1000/天
高峰流量:
3000/天
(2)处理逻辑的描述
处理逻辑编号:
P001
处理逻辑名称:
用户信息判断
简述:
判断用户信息的合法性
输入的数据流:
报刊目录查询
处理描述:
根据用户输入的登录信息,验证用户信息,验证通过后继续下移处理查看报刊目录信息,验证不通过则返回给用户指明为非注册用户。
输出的数据流:
D001报刊目录信息、D002无效提示信息
处理频率:
10次/天
处理逻辑编号:
P002
处理逻辑名称:
报刊目录查询
简述:
列出各种报刊信息供用户选择订购
输入的数据流:
报刊订购
处理描述:
用户可以选择报刊类别进行查询,也可以不分条件查询全部信息,由用户自己选择所需进行订购。
输出的数据流:
D003报刊订购
处理频率:
10次/天
处理逻辑编号:
P003
处理逻辑名称:
报刊订购
简述:
填写订购详细信息
输入的数据流:
报刊目录查询
处理描述:
用户选择好某一报刊,点击订购,弹出一个填写订购单页面,用户填写订购详细信息。
输出的数据流:
数据流向管理员
处理频率:
10次/天
处理逻辑编号:
P004
处理逻辑名称:
查看订购历史记录
简述:
查看自己的报刊订购历史记录
输入的数据流:
报刊订购
处理描述:
用户订购了报刊之后,即可查看订购历史记录(订购流程完)。
输出的数据流:
用户
处理频率:
10次/天
(3)处理逻辑的描述
数据存储编号:
F001
数据存储名称:
用户信息
简述:
用户的基本信息
数据存储组成:
用户编号、用户账号、密码、真实姓名、性别、年龄、电话、地址、部门编号。
关键字:
用户编号
相关联的处理:
P001
数据存储编号:
F002
数据存储名称:
报刊信息
简述:
报刊的基本信息
数据存储组成:
报刊代号、报刊名称、报刊年价格、出版社、出版周期、报刊类别。
关键字:
报刊代号
相关联的处理:
P002
数据存储编号:
F003
数据存储名称:
订购信息
简述:
订购的基本信息
数据存储组成:
订单号、用户账号、报刊代号、订阅份数、订阅年限、金额、订单处理状态。
关键字:
订单号
相关联的处理:
P004
(4)外部实体的描述
外部实体编号:
S001
外部实体名称:
用户
简述:
需要订阅报刊的用户
输入的数据流:
D002
输出的数据流:
D001
......
4.概念模型设计
4.1部门E-R图
部门实体的E-R图如下图4-1所示:
图4-1部门
4.2管理员E-R图
管理员实体的E-R图4-2如下图所示:
图4-2部门
4.3用户E-R图
用户实体的E-R图4-3如下图所示:
图4-3用户
4.4报刊信息E-R图
报刊信息实体的E-R图如下图4-4所示:
图4-4报刊信息
4.5订单E-R图
订单实体的E-R图如下图4-5所示:
图4-5报刊订单
4.6报刊类别E-R图
报刊类别实体的E-R图如下图4-6所示:
图4-6报刊类别
4.7所有实体之间的的关系E-R图
所有实体之间的的关系E-R图如下图4-7所示:
图4-7实体之间关系图
5.逻辑模型设计及优化
表一Department表
序号
列名
数据类型
长度
小数位
标识
主键
允许空
默认值
说明
1
DEPID
int
4
0
是
是
否
部门ID
2
DEPName
nvarchar
50
0
是
部门名称
表二LoginUsers表
序号
列名
数据类型
长度
小数位
标识
主键
允许空
默认值
说明
1
LoginID
int
4
0
是
是
否
用户登录编号
2
UserLevel
nvarchar
50
0
是
用户等级权限
3
UserNo
nvarchar
50
0
是
用户账号
4
PassWord
varchar
50
0
是
密码
表三NewsInfo表
序号
列名
数据类型
长度
小数位
标识
主键
允许空
默认值
说明
1
NewsID
varchar
50
0
是
否
报刊代号
2
NewsName
nvarchar
50
0
是
报刊名称
4
NewsWholePrice
float
8
0
是
一年定价
5
NewsPress
nvarchar
50
0
是
出版社
6
NewsMakeTime
varchar
50
0
是
出版周期
7
KindId
varchar
50
0
是
报刊分类编号
表四NewsKind表
序号
列名
数据类型
长度
小数位
标识
主键
允许空
默认值
说明
1
KindID
varchar
50
0
是
否
报刊分类编号
2
KindName
nvarchar
50
0
是
报刊分类名称
表五Subscribe表
序号
列名
数据类型
长度
小数位
标识
主键
允许空
默认值
说明
1
SID
varchar
50
0
是
否
订单编号
2
UserNo
varchar
50
0
是
用户账号
3
NewsID
varchar
50
0
是
报刊代号
4
Syear
int
4
0
是
订阅年限
5
Snumber
int
4
0
是
订阅数量
6
Smoney
float
8
0
是
订阅金额
7
State
int
4
0
是
订单处理状态:
0:
未处理,1:
已处理
表六UserInfo表
序号
列名
数据类型
长度
小数位
标识
主键
允许空
默认值
说明
1
ID
int
4
0
是
是
否
用户编号
2
UserNo
varchar
50
0
是
用户账号(工号)
3
PassWord
varchar
50
0
是
用户密码
4
RealName
nvarchar
50
0
是
真实姓名
5
Sex
nvarchar
50
0
是
性别
6
Age
int
4
0
是
年龄
7
Tel
nvarchar
50
0
是
电话
8
Address
nvarchar
50
0
是
地址
9
DEPID
int
4
0
是
部门ID
10
NewID
varchar
50
0
是
报刊代号
6.应用程序设计(前台)
6.1登陆
如图6-1:
图6-1登录
6.2新用户注册
如图6-2:
图6-2新用户注册
6.3报刊订阅
如图6-3:
图6-3报刊订阅
6.4报刊订阅订单填写
如图6-4:
图6-4报刊订阅订单
6.5订单历史记录
如图6-5:
图6-5订单历史记录
6.6个人订阅统计
如图6-6:
图6-6个人订阅统计
6.7修改个人信息
如图6-7
图6-7修改个人信息
6.8修改密码
如图6-8:
图6-8修改密码
7.课程设计心得体会
从选题开始,需求分析、数据库设计、编码、测试等等,再到我们的课题:
报刊订阅管理系统,基本完善,经过整整两个星期。
在这两个星期里,我利用所学的知识,自己动手实践写代码,做设计,并逐步地实现这个小小的管理系统。
整个过程中遇到了不少问题,也解决了不少问题,当然也收获了不少。
首先在怎么设计数据库时,就花了一两天时间,虽然涉及到的数据表只有六个,但每个表都相对独立有相互关联。
在设计的时候必须要考虑到表与表之间的关系,字段与字段之间的关联。
尽量做到数据冗余低,达到第三范式。
根据需求分析,经过翻来覆去的思考之后,才建好一个初步的数据库。
一旦数据库建好之后,后面的进程就快了。
主要是编码过程。
因为没什么流程可言,所有在写代码的时候也没有考虑什么流程问题,只是实现简单的增删查改功能。
当然由于之前没怎么用过C/S的winform来实现功能,所以在编码的过程中还一边写一边查资料,慢慢地摸索着。
记得遇到一个窗体之间传值的问题,这个B/S的web页面传值的操作方式很大不同。
于是在网上找到几种方法,也试了两种方法,可能技术不到家,还是没见效果,最后用了一种最笨的方法,就是在父窗体定义一个全局变量,然后子窗体需要那个变量的话就可以通过引用父窗体的那个全局变量。
不过这个方法还是有一定的不足,尽管发现了但是现在还不知怎么去解决这个问题。
还有之前没怎么做过报表,通过这个小系统的练习,我也了解的rdlc报表的制作以及实现,这也是一个小收获。
当然由于时间有限,还没来得及做大量的测试,这其中肯定还有不少的BUG以及错误可能还没发现,还需下一阶段继续完善。
总的来说,能够在短短的两星期内做出一个东西出来,尽管不是很复杂,尽管很垃圾,但通过自己的大脑及双手把他实现,也算不错了。
8.参考文献
[1]钱雪忠.数据库原理及应用.北京邮电大学出版社.2010
[2]
[3]其他网络资源……
9.附录
/////////登录关键代码(Login.cs)////////
privatevoidbtnLogin_Click(objectsender,EventArgse)
{
messageshow.Text="";
name=txtUserName.Text.ToString().Trim();
password=txtPassWord.Text.ToString().Trim();
pass=MD5.md5(password);
stringstr="select*fromLoginUserswhereUserNo='"+name+"'";
DataSetds=DB.getdataset(str);
DataTabledt=ds.Tables[0];
if(dt.Rows.Count>0)
{
stringlevel="";
stringLoginName="";
for(inti=0;i
{
level=dt.Rows[i]["UserLevel"].ToString();
LoginName=dt.Rows[i]["UserNo"].ToString();
if(level=="管理员"&&LoginName==name)
{
flag=0;
EnterAdmin();
return;
}
else
{
flag=1;
}
}
if(Convert.ToBoolean(flag))
{
EnterUser();
return;
}
}
else
{
MessageBox.Show("不存在该用户!
");
return;
}
}
privatevoidEnterUser()
{
stringsql="select*fromUserInfowhereUserNo='"+name+"'andPassWord='"+pass+"'";
DataSetds=DB.getdataset(sql);
DataTabledt=ds.Tables[0];
if(dt.Rows.Count>0)
{
messageshow.Text="";
messageshow.Visible=true;
messageshow.Text="登录成功!
正在连接...";
//System.Threading.Thread.Sleep(2000);//登录延时2秒
varmainuser=newUserMain();
this.Visible=false;
mainuser.Show();
}
/////////部门绑定关键代码////////
publicvoidbindDept()
{
stringstr="selectdistinctDEPNamefromDepartment";
DataSetds=DB.getdataset(str);
combRegDept.DataSource=ds.Tables[0].DefaultView;
combRegDept.DisplayMember="DEPName";
}
/////////级联绑定////////
privatevoidcombKind_SelectedIndexChanged(objectsender,EventArgse)
{
if(combKind.SelectedIndex>-1)
{
stringkindid=combKind.SelectedValue.ToString();
//stringkindid=DB.getKindID(kind);
stringstr="selectdistinctNewsNamefromNewsInfowhereKindID='"+kindid+"'";
DataSetds=DB.getdataset(str);
combNewsName.DataSource=ds.Tables[0].DefaultView;
combNewsName.DisplayMember="NewsName";
}
}
/////////序号自动增长////////
privatevoiddataGridView1_RowPostPaint(objectsender,DataGridViewRowPostPaintEventArgse)
{
using(SolidBrushb=newSolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor))
{
e.Graphics.DrawString(Convert.ToString(e.RowIndex+1,System.Globalization.CultureInfo.CurrentUICulture),e.InheritedRowStyle.Font,b,e.RowBounds.Location.X+20,e.RowBounds.Location.Y+4);
}
}
/////////窗体之间传值////////
publicstaticstringnewsid=Subscribe.newsid.ToString();//接收从Subscribe窗体中传newsid这个值过来
publicstaticstringuserNo=Login.name.ToString();//接收从Login窗体中传name这个值过来
/////////自动生成订单号////////
publicstaticstringGetNo(stringstr)
{
stringm=System.DateTime.Now.ToString("yyyy-MM-dd");
stringnew_no="";
using(SqlDataReaderreader=DB.getdatareader(str))
{
if(reader.Read())
{
if(reader[0].ToString()==string.Empty)
{
new_no="BK-"+"LSY-"+m+"-"+1.ToString("0000");
returnnew_no;
}
else
{
stringk="BK-LSY-"+m+"-";
intnewno=0;
stringno=reader[0].ToString();
if(k==no.Substring(0,no.Length-4))
newno=Convert.ToInt32(no.Substring(no.Length-4,4))+1;
returnk+newno.ToString("0000");
}
}
else
{
new_no="BK-"+"LSY-"+m+"-"+1.ToString("0000");
returnnew_no;
}
}
}
/////////MD5密码加密类////////
publicstaticstringmd5(stringtomd5)
{
byte[]result=Encoding.Default.GetBytes(tomd5);
MD5CryptoServiceProvidermd5=newMD5CryptoServiceProvider();
byte[]output=md5.ComputeHash(result);
stringpass=BitConverter.ToString(output).Replace("-","");//输出加密文本,用空字符替换)
returnpass;
}
/////////报刊订购////////
privatevoiddataGridView1_CellContentClick(objectsender,DataGridViewCellEventArgse)
{
newsid=dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
try
{
intCIndex=e.ColumnIndex;
if(CIndex==6&&e.RowIndex!
=-1)
{
newOrder().Show();
}
}
catch(Exceptionerror)
{
MessageBox.Show(error.ToString());
}
}
/////////订阅统计报表关键代码////////
publicvoidReport1()
{
stringsql="select*fromView_OrderorderbySIDdesc";
DataSetds=DB.getdataset(sql);
DataTabledt=ds.Tables[0];
this.reportViewer1.LocalReport.ReportEmbeddedResource="NewsSubscribe.