资源描述
数据库设计
1 系统数据库分析
数据库设计是建立数据库及其应用系统技术,是系统开发和建设中核心技术。详细说,数据库设计是指对于一种给定应用环境,构造最优数据库模式,建立数据库及其应用系统,使之可以有效存储数据,满足各种顾客应用需求(信息规定和解决规定)。数据库构造设计好坏直接相应用系统效率以及实现效果产生影响。
依照超市会员管理系统功能设计需要,数据库构造设计如下所示:
(1). 顾客登录信息数据表(Login):(顾客账号,密码,登录身份);
(2). 会员基本信息数据表(Member):(顾客账号,顾客姓名,身份证号,联系方式,联系地址);
(3). 职工基本信息数据表(Employee):(职工号,职工姓名,职工职位);
(4). 会员积分信息数据表(Score):(会员账号,会员积分,会员级别,会员折扣);
2 数据库概念构造设计
依照上节数据项和数据构造后来,就可以设计出可以满足顾客需求各种实体,以及它们之间关系,为后来逻辑构造设计打下基本,这些实体涉及各种详细信息,通过互相之间作用形成数据流动。
各种实体详细描述E-R图如下。
1. 顾客登录信息实体图重要描述了登录顾客基本状况,涉及了顾客顾客账号,密码,登录身份。如图3-11所示,顾客登录信息实体E-R图。
顾客登录
*顾客账号
密码
登录身份
图3-12 顾客登录实体E-R图
2. 会员基本信息实体图重要描述会员基本状况,涉及了会员基本信息顾客账号,顾客姓名,身份证号,联系方式,联系地址,得出如图3-12所示会员基本信息实体E-R图。
会员基本信息
*顾客账号
顾客姓名
身份证号
联系方式
联系地址
图3-13 会员基本信息实体E-R图
3. 职工基本信息实体图重要描述新生基本状况,涉及了职工基本信息职工号,职工姓名,职工职位,得出如图3-13所示职工基本信息实体E-R图。
职工基本信息
*职工号
职工姓名
职工职位
图3-14 职工基本信息实体E-R图
4. 会员积分信息实体图重要描述会员积分基本状况,涉及了会员积分基本信息会员账号,会员积分,会员级别,会员折扣,得出如图3-14所示会员积分信息实体E-R图。
会员积分信息
*会员账号
会员积分
会员级别
会员折扣
图3-15 会员积分信息实体E-R图
实体之间关系E-R图重要描述实体间关系。
会员基本信息
*顾客账号
顾客姓名
身份证号
联系方式
联系地址
获得
会员积分信息
*会员账号
会员积分
会员级别
会员折扣
管理
职工基本信息
*职工号
职工姓名
职工职位
1
1
1
N
N
图3-16 各实体之间关系
3.系统数据库设计
依照需求分析与概念构造设计,建立数据库系统支持数据模型,即数据库逻辑构造。本系统运用Microsoft Access 创立了名为SuperMarket数据库。
本系统重要建立了如下四张表:
表3.1 顾客登录数据表
字段名
数据类型
字段大小
与否主键
DNO(登陆账号)
文本
6
是
DCode(密码)
文本
12
否
DUserSta(登录身份)
文本
50
否
表3.2 会员基本信息数据表
字段名
数据类型
字段大小
与否主键
MNO(顾客账号)
文本
6
是
MName(顾客姓名)
文本
20
否
MID(身份证号)
文本
18
否
MTel(联系电话)
文本
50
否
MAdd(联系地址)
文本
50
否
表3.3 职工基本信息数据表
字段名
数据类型
字段大小
与否主键
EID(职工号)
文本
6
是
EName(职工姓名)
文本
20
否
EStatus(职工职位)
文本
50
否
表3.4 会员积分信息数据表
字段名
数据类型
字段大小
与否主键
MNO(会员账号)
文本
6
是
MScore(顾客积分)
数字(double)
——
否
MGrade(顾客级别)
数字(long)
——
否
MDiscount(顾客折扣)
数字(double)
——
否
4. 表之间关系
表之间存在关系如下:
1.在会员基本信息表(Member)中添加信息同步,把信息添加到顾客登录信息表(Login)中,同步将信息添加到积分信息表(Score)中。
2.在会员基本信息表(Member)中删除会员信息同步,把顾客登录信息表(Login)和顾客积分信息(Score)中该会员信息删除。
3.在职工基本信息表(Member)中添加信息同步,将志愿基本信息添加到顾客登录信息表(Login)中。
4.在职工基本信息表(Member)中删除职工信息同步,把顾客登录信息表(Login)中该职工信息删除。
详细设计与实现
1. 系统首页
图4-1 超市会员管理系统首页
自定义工具栏按钮及鼠标提示信息设计与实现:
图4-2 主页面工具栏
在对话框OnInitDialog办法中常用工具栏窗口和图像列表窗口,关联图像列表,设立工具栏按钮文本,启动工具栏EnableToolTip办法激活提示功能。
鼠标提示信息实现,解决TTN_NEEDTEXT消息响应函数OnToolTipText(),通过函数参数获得工具栏按钮ID,从而依照ID获取提示信息文本。
1. 添加消息映射(最佳写在AFX_MSG_MAP宏外,否则也许浮现编译错误)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW,0,0xFFFF,OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA,0,0xFFFF,OnToolTipText)
2. 添加事件声明(最佳写在AFX_MSG宏外,否则也许浮现编译错误)
afx_msg BOOL OnToolTipText(UINT nID,NMHDR* pNMHDR,LRESULT* pResult);
2 登录页面
系统运营后,一方面呈现给顾客是顾客登录界面,顾客登录成功后进入到主页面,顾客登录界面如下图所示:
图4-3 顾客登录界面
顾客登录有三种身份,管理员、普通职工、会员。管理员登录成功后,可以对系统各模块进行操作;普通职工登录成功后,除对职工添加、删除外,均可实现操作;会员,则只能对自己某些基本信息进行操作。
登录界面由函数void CLoginDlg::OnOK()实现解决,详细代码如下:
//实现该功能SQL语句
sql="select * from Login where DNO='"+Name+"' and DCode='"+ECode+"' and DUserSta='"+EStatus+"'";
m_pRs->Open((_bstr_t)sql,theApp.conn.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
//登录成功与否、登录次数判断
if ( m_pRs->GetRecordCount()<=0 )
{
if ( m_LoginNum<=3 ) // 登录次数不大于3次
{
MessageBox("顾客名或密码、身份错误!","提示",64);
}
if ( m_LoginNum==3) // 3次登录不成功
{
MessageBox("顾客登录3次不成功!即将关闭程序......","提示",64);
CDialog::OnOK();
// 向应用程序发送WM_QUIT消息,祈求退出
::PostQuitMessage(0);
}
}
else{// 如果登录成功,则关闭数据库
CDialog::OnOK();
CCMarketDlg dlg;
dlg.m_LoginSta=EStatus;
dlg.DoModal();
}
3 会员信息模块
(1) 会员基本信息查询
会员基本信息查询如下图:
图4-4 会员信息查询界面
顾客登录成功后,可以依照顾客账号或身份证号查询会员基本信息,还可以进行全表查询。
查询前,一方面要选取及填写查询条件,若未填写,则浮现系统提示。查询条件填写对的后,点击查询即可会员详细信息。
查询和显示所有单击事件实现分别由函数void CMemberDlg::OnOK()和void CMemberDlg::OnBUTTONListAll()实现,详细代码如下:
记录集打开同上。
在列表框中显示实现:
while (!m_pRs->adoEOF)
{
CString temp;
m_EList.InsertItem(1000,"");
for(int i=0;i<3;i++)
{
temp=(TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)i)->Value;
m_EList.SetItemText(row,i,temp);
}
m_pRs->MoveNext();
row+=1;
}
4.3.2 会员密码修改
此模块用于修改会员登录密码。
图4-5 会员密码修改界面
填入顾客账号和旧密码后,系统检查数据库中与否有该记录,如果存在该记录,则可填写新密码进行修改;若不存在,则系统给出提示信息。如下图:
图4-6 会员密码修改提示信息界面
该模块单击事件由函数void CECodeModifyDlg::OnOK()实现,详细代码如下:
sql="Update Login set DCode='"+NewCode+"' where DNO='"+Name+"'";
try
{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("修改成功");
4. 积分信息模块
(1) 积分查询
该功能实现界面如下:
图4-7 积分查询界面
输入会员账号后,点击拟定按钮,系统一方面检查账号与否存在,若存在则输出该会员积分信息;若不存在,输出提示信息。
实现原理如会员信息模块中会员查询。
实现函数为:void CJQueryDlg::OnOK()。
在编辑框中显示实现为:
var = m_pRs->GetCollect("MScore");
if(var.vt != VT_NULL)
str1 = (LPCSTR)_bstr_t(var);
GetDlgItem(IDC_EDIT_Jifen)->SetWindowText(str1);
var = m_pRs->GetCollect("MGrade");
if(var.vt !=VT_NULL)
str2=(LPCSTR)_bstr_t(var);
GetDlgItem(IDC_EDIT_Grade)->SetWindowText(str2);
var = m_pRs->GetCollect("MDiscount");
if(var.vt !=VT_NULL)
str3=(LPCSTR)_bstr_t(var);
GetDlgItem(IDC_EDIT_Discout)->SetWindowText(str3);
(2) 积分兑换
积分兑换功能实现界面如下:
图4-8 积分兑换功能实现界面
顾客输入账号和密码后,点击兑换按钮,该按钮实现中,一方面检查顾客合法性。若顾客已兑换过积分,则提示及兑换;若积分不够兑换级别,则提示积分不够;若兑换成功后,则显示顾客级别和优惠折扣。
该模块实现单击事件函数解决为:void CEXchangeDlg::OnOK(),详细实现如下:
//修改数据库中积分
sql="Update Score set MGrade=1,MDiscount=0.1 where MNO='"+mzh+"'";
try
{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("兑换成功");
(3) 消费加分
该模块功能将会员消费金额换为消费积分,如下图:
图4-9 消费加分模块界面实现图
输入顾客账号和消费金额后,一方面检查数据库中与否存在该记录,如果存在,则将该顾客积分增长其消费金额数目,如不存在,系统弹出提示信息。
模块单击事件解决由函数void CXiaoFeiDlg::OnOK()实现,详细代码如下:
sql="Update Score set MScore=MScore+'"+JiE+"' where MNO='"+UserZH+"'";
try
{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("添加成功");
(4) 优惠讯息
该模块为静态功能。点击优惠讯息菜单即浮现超市积分优惠政策及兑换政策对话框。
5 基本信息管理模块
1) .职工信息管理
(1). 查询基本信息
该模块功能实现基本与会员基本信息查询相似,在此不再赘述。实现该功能函数为:void CEmployeeDlg::OnOK();实现该功能SQL语句为:
sql="select * from Employee where EID='"+EmpID+"'";
(2). 修改职工信息
该模块功能修改超市职工基本信息。
函数实现:void CMIMDlg::OnOK()。
其实现如下:
GetDlgItem(IDC_EDIT1_EmpName)->GetWindowText(EXm);
GetDlgItem(IDC_COMBO_EmpSta)->GetWindowText(EZw);
if(EZw=="管理员") EZw="0";
else if(EZw=="普通职工") EZw="1";
sql="Update Employee set EName='"+EXm+"',EStatus='"+EZw+"' where EID='"+EMId+"'";
try
{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("修改成功");
(3). 修改密码
职工修改密码模块与会员密码修改类似,实现函数为:void CMModifyDlg::OnOK(),此处不再赘述。
详细SQL语句实现为:
sql="Update Login set DCode='"+NewCode+"' where DNO='"+Name+"'";
try{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
(4). 添加职工信息
管理员进入系统后可以按照需求添加职工信息,该模块一方面检查输入与否为空,若不为空,则可以进行添加,此功能同步将信息添加到Login表和Employee表中,界面实现如图:
图4-10 添加职工信息
实现该事件函数为:void CEAddEmplyeeDlg::OnOK(),下面是添加职工信息详细实现:
sql="Insert into Employee(EID,EName,EStatus) values('"+Eno+"','"+Ename+"','"+Esta+"')";
SQL="Insert into Login(DNO,DCode,DUserSta) values('"+Eno+"','"+Ecode+"','"+Esta+"')";
try{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
theApp.conn->Execute((_bstr_t)SQL,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("添加成功");
(5). 删除职工信息
该模块只能由管理员进行操作,管理员成功登录后,可以按照职工号删除职工信息,如图所示:
图4-11 删除职工信息图
在删除前,系统会给出提示,提示顾客与否拟定要删除。点击是,则将该记录从数据库中删除;点击否,则撤销删除行为。
实现函数为void CDelEmpDlg::OnOK(),代码如下:
if(MessageBox("拟定要删除该记录吗?","提示",MB_YESNO)==IDYES)
{
sql="delete from Employee where EID='"+EmpNO+"'";
SQL="delete from Login where DNO='"+EmpNO+"'";
try{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
theApp.conn->Execute((_bstr_t)SQL,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());}
AfxMessageBox("删除成功");
}
2 会员信息管理
会员信息管理涉及会员信息查询、会员信息修改、会员注册、会员删除四个模块,功能实现同职工信息管理模块中响应功能。
实现函数分别为:void CMemberDlg::OnOK()、void CModifyMemDlg::OnBUTTONModify()、void CMemAddDlg::OnOK()、void CModifyMemDlg::OnBUTTONDel()。
此处以会员信息修改和删除为例,其她功能实现略写。
图4-12 会员信息修改
图中,灰色编辑框表达不可改。如果要修改信息则填入要修改值,点击“拟定修改”,即可修改成功;如果要删除该条记录,则点击“拟定删除”,系统会提示,与否真删除,若是,则从数据库表中将该记录删除,若否,则退出删除。
此处实现有关SQL语句为:
//修改
sql="Update Member set MName='"+UserName+"',MTel='"+UserTel+"',MAdd='"+UserAdd+"' where MNO='"+UserNO+"'";
try{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("修改成功");
//删除
if(MessageBox("拟定要删除该记录吗?","提示",MB_YESNO)==IDYES)
{
sql="delete from Member where MNO='"+UserNO+"'";
SQL="delete from Login where DNO='"+UserNO+"'";
try{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
theApp.conn->Execute((_bstr_t)SQL,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("删除成功");
6 记录
记录模块是对超市会员积分进行记录,可以记录出各登记人数及所占比例,并以柱形图形式显示出来。
图4-13 记录分析功能实现图
实现该功能函数为:void CStatDlg::OnOK()
详细实现:
(1) 打开记录集,获得各级别人数;
(2) 绘制柱形图
//获取静态图片空间大小
CWnd * pWnd=this->GetDlgItem(IDC_DRAW);
pWnd->GetClientRect(&rectPic);
// 获取设备环境指针
CDC *pDC=pWnd->GetDC();
// 重新填充静态图片区域
CBrush NewBrush;
NewBrush.CreateSolidBrush(RGB(238,238,237));
CBrush * pOldBrush=pDC->SelectObject(&NewBrush);
pDC->Rectangle(&rectPic);
pDC->SelectObject(pOldBrush);
// 拟定每个柱形条宽度
int nLength=(rectPic.right-rectPic.left)/6;
// 定义五种颜色,用来填充柱形图
COLORREF RGBArray[6]={RGB(0,255,0),RGB(128,0,255),RGB(0,0,255),RGB(255,255,0),RGB(255,0,0),RGB(0,128,255)};
// 定义一种矩形,表达柱形条
CRect rect;
for ( int i=0;i<6;i++ )
{
// 拟定柱形条位置
rect.left=rectPic.left+i*nLength;
rect.top=rectPic.bottom -rectPic.Height() * s[i]/num;
rect.right=rectPic.left + (i+1)*nLength;
rect.bottom=rectPic.bottom;
// 创立画刷,填充图形
CBrush NewBrush;
NewBrush.CreateSolidBrush(RGBArray[i]);
CBrush * pOldBrush=pDC->SelectObject(&NewBrush);
pDC->Rectangle(&rect);
pDC->SelectObject(pOldBrush);
}
// 释放设备环境
this->ReleaseDC(pDC);
7 系统信息
1 顾客协助
系统调用协助文献Market-Help.chm,对于不熟悉本系统顾客可以通过阅读协助文献理解系统如何使用。
点击顾客协助菜单或协助工具栏按钮后,即打开协助文献,如图所示:
图4-14 顾客协助功能实现图
详细实现为:
void CCMarketDlg::OnMENUHelp()
{
char buf[MAX_PATH];
::GetCurrentDirectory(MAX_PATH,buf);//获取程序根目录途径
::ShellExecute(NULL,"open","Market-Help.chm","","",SW_SHOW);
}
2 关于本系统
详细实现:
void CCMarketDlg::OnMENUAbout()
{
CDialog about(IDD_ABOUTBOX);
about.DoModal();
}
8 退出系统
详细实现:
void CCMarketDlg::OnMENUQuit()
{
theApp.conn->Close();//关闭数据库
EndDialog(0);
}
9 数据库连接设计与实现
(1) 初始化COM库,引入ADO库定义文献
一方面在stdafx.h中用#import指令引入ADO类型库
#import "c:\program files\common files\system\ado\msado15.dll"no_namespace\rename("EOF","adoEOF")
然后使用AfxOleInit()来初始化COM库。
(2) 用Connection对象连接数据库
strConn.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"),"SuperMarket.mdb");//依照参数构造连接字符串
conn->Open((_bstr_t)strConn,"","",adModeUnknown);//打开数据库
(3) 运用建立好连接,通过Connection、Command对象执行SQL命令,或运用Recordset对象获得成果记录集进行查询、解决。
_RecordsetPtr m_pRs;
m_pRs.CreateInstance((__uuidof(Recordset)));
m_pRs->Open((_bstr_t)sql,theApp.conn.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);//打开记录集
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);//执行sql
(4)使用完毕后关闭连接释放对象。
m_pRs->Close();//关闭记录集
conn->Close();//关闭连接
展开阅读全文