超市会员管理系统详细代码.docx
《超市会员管理系统详细代码.docx》由会员分享,可在线阅读,更多相关《超市会员管理系统详细代码.docx(23页珍藏版)》请在冰豆网上搜索。
超市会员管理系统详细代码
数据库设计
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图主要描述实体间的关系。
图3-16各实体之间的关系
3.系统数据库的设计
根据需求分析与概念结构设计,建立数据库系统支持的数据模型,即数据库的逻辑结构。
本系统利用MicrosoftAccess2003创建了名为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_msgBOOLOnToolTipText(UINTnID,NMHDR*pNMHDR,LRESULT*pResult);
2登录页面
系统运行后,首先展现给用户的是用户登录界面,用户登录成功后进入到主页面,用户登录界面如下图所示:
图4-3用户登录界面
用户登录有三种身份,管理员、普通职员、会员。
管理员登录成功后,可以对系统各模块进行操作;普通职员登录成功后,除对职员的添加、删除外,均可实现操作;会员,则只能对自己的一些基本信息进行操作。
登录界面由函数voidCLoginDlg:
:
OnOK()实现处理,具体代码如下:
//实现该功能的SQL语句
sql="select*fromLoginwhereDNO='"+Name+"'andDCode='"+ECode+"'andDUserSta='"+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();
CCMarketDlgdlg;
dlg.m_LoginSta=EStatus;
dlg.DoModal();
}
3会员信息模块
(1)会员基本信息查询
会员基本信息查询如下图:
图4-4会员信息查询界面
用户登录成功后,可以根据用户账号或身份证号查询会员的基本信息,还可以进行全表查询。
查询前,首先要选择及填写查询条件,若未填写,则出现系统提示。
查询条件填写正确后,点击查询即可会员详细信息。
查询和显示全部单击事件实现分别由函数voidCMemberDlg:
:
OnOK()和voidCMemberDlg:
:
OnBUTTONListAll()实现,具体代码如下:
记录集打开同上。
在列表框中显示的实现:
while(!
m_pRs->adoEOF)
{
CStringtemp;
m_EList.InsertItem(1000,"");
for(inti=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会员密码修改提示信息界面
该模块单击事件由函数voidCECodeModifyDlg:
:
OnOK()实现,具体代码如下:
sql="UpdateLoginsetDCode='"+NewCode+"'whereDNO='"+Name+"'";
try
{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error&e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("修改成功");
4.积分信息模块
(1)积分查询
该功能实现界面如下:
图4-7积分查询界面
输入会员账号后,点击确定按钮,系统首先检查账号是否存在,若存在则输出该会员积分信息;若不存在,输出提示信息。
实现原理如会员信息模块中的会员查询。
实现函数为:
voidCJQueryDlg:
:
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积分兑换功能实现界面
用户输入账号和密码后,点击兑换按钮,该按钮的实现中,首先检查用户合法性。
若用户已兑换过积分,则提示及兑换;若积分不够兑换等级,则提示积分不够;若兑换成功后,则显示用户等级和优惠折扣。
该模块实现单击事件函数处理为:
voidCEXchangeDlg:
:
OnOK(),具体实现如下:
//修改数据库中积分
sql="UpdateScoresetMGrade=1,MDiscount=0.1whereMNO='"+mzh+"'";
try
{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error&e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("兑换成功");
(3)消费加分
该模块功能将会员的消费金额换为消费积分,如下图:
图4-9消费加分模块界面实现图
输入用户账号和消费金额后,首先检查数据库中是否存在该记录,如果存在,则将该用户积分增加其消费金额数目,如不存在,系统弹出提示信息。
模块单击事件处理由函数voidCXiaoFeiDlg:
:
OnOK()实现,具体代码如下:
sql="UpdateScoresetMScore=MScore+'"+JiE+"'whereMNO='"+UserZH+"'";
try
{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error&e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("添加成功");
(4)优惠讯息
该模块为静态功能。
点击优惠讯息菜单即出现超市积分的优惠政策及兑换政策的对话框。
5基本信息管理模块
1).职员信息管理
(1).查询基本信息
该模块功能实现基本与会员基本信息查询相同,在此不再赘述。
实现该功能的函数为:
voidCEmployeeDlg:
:
OnOK();实现该功能的SQL语句为:
sql="select*fromEmployeewhereEID='"+EmpID+"'";
(2).修改职员信息
该模块功能修改超市职员的基本信息。
函数实现:
voidCMIMDlg:
:
OnOK()。
其实现如下:
GetDlgItem(IDC_EDIT1_EmpName)->GetWindowText(EXm);
GetDlgItem(IDC_COMBO_EmpSta)->GetWindowText(EZw);
if(EZw=="管理员")EZw="0";
elseif(EZw=="普通职员")EZw="1";
sql="UpdateEmployeesetEName='"+EXm+"',EStatus='"+EZw+"'whereEID='"+EMId+"'";
try
{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error&e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("修改成功");
(3).修改密码
职员修改密码模块与会员密码修改类似,实现函数为:
voidCMModifyDlg:
:
OnOK(),此处不再赘述。
具体SQL语句实现为:
sql="UpdateLoginsetDCode='"+NewCode+"'whereDNO='"+Name+"'";
try{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error&e)
{
AfxMessageBox(e.Description());
}
(4).添加职员信息
管理员进入系统后可以按照需求添加职员信息,该模块首先检验输入是否为空,若不为空,则可以进行添加,此功能同时将信息添加到Login表和Employee表中,界面实现如图:
图4-10添加职工信息
实现该事件的函数为:
voidCEAddEmplyeeDlg:
:
OnOK(),下面是添加职员信息的具体实现:
sql="InsertintoEmployee(EID,EName,EStatus)values('"+Eno+"','"+Ename+"','"+Esta+"')";
SQL="InsertintoLogin(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删除职工信息图
在删除前,系统会给出提示,提醒用户是否确定要删除。
点击是,则将该记录从数据库中删除;点击否,则撤销删除行为。
实现函数为voidCDelEmpDlg:
:
OnOK(),代码如下:
if(MessageBox("确定要删除该记录吗?
","提示",MB_YESNO)==IDYES)
{
sql="deletefromEmployeewhereEID='"+EmpNO+"'";
SQL="deletefromLoginwhereDNO='"+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会员信息管理
会员信息管理包括会员信息查询、会员信息修改、会员注册、会员删除四个模块,功能实现同职员信息管理模块中响应功能。
实现函数分别为:
voidCMemberDlg:
:
OnOK()、voidCModifyMemDlg:
:
OnBUTTONModify()、voidCMemAddDlg:
:
OnOK()、voidCModifyMemDlg:
:
OnBUTTONDel()。
此处以会员信息修改和删除为例,其他功能实现略写。
图4-12会员信息修改
图中,灰色编辑框表示不可改。
如果要修改信息则填入要修改的值,点击“确定修改”,即可修改成功;如果要删除该条记录,则点击“确定删除”,系统会提示,是否真的删除,若是,则从数据库表中将该记录删除,若否,则退出删除。
此处实现的相关的SQL语句为:
//修改
sql="UpdateMembersetMName='"+UserName+"',MTel='"+UserTel+"',MAdd='"+UserAdd+"'whereMNO='"+UserNO+"'";
try{
theApp.conn->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error&e)
{
AfxMessageBox(e.Description());
}
AfxMessageBox("修改成功");
//删除
if(MessageBox("确定要删除该记录吗?
","提示",MB_YESNO)==IDYES)
{
sql="deletefromMemberwhereMNO='"+UserNO+"'";
SQL="deletefromLoginwhereDNO='"+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统计分析功能实现图
实现该功能的函数为:
voidCStatDlg:
:
OnOK()
具体实现:
(1)打开记录集,获得各等级人数;
(2)绘制柱形图
//获取静态图片空间大小
CWnd*pWnd=this->GetDlgItem(IDC_DRAW);
pWnd->GetClientRect(&rectPic);
//获取设备环境指针
CDC*pDC=pWnd->GetDC();
//重新填充静态图片区域
CBrushNewBrush;
NewBrush.CreateSolidBrush(RGB(238,238,237));
CBrush*pOldBrush=pDC->SelectObject(&NewBrush);
pDC->Rectangle(&rectPic);
pDC->SelectObject(pOldBrush);
//确定每个柱形条的宽度
intnLength=(rectPic.right-rectPic.left)/6;
//定义五种颜色,用来填充柱形图
COLORREFRGBArray[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)};
//定义一个矩形,表示柱形条
CRectrect;
for(inti=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;
//创建画刷,填充图形
CBrushNewBrush;
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用户帮助功能实现图
具体实现为:
voidCCMarketDlg:
:
OnMENUHelp()
{
charbuf[MAX_PATH];
:
:
GetCurrentDirectory(MAX_PATH,buf);//获取程序根目录路径
:
:
ShellExecute(NULL,"open","Market-Help.chm","","",SW_SHOW);
}
2关于本系统
具体实现:
voidCCMarketDlg:
:
OnMENUAbout()
{
CDialogabout(