admin 管理员组

文章数量: 1184232


2024年3月13日发(作者:韩国免税店网上商城)

数据库设计

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图主要描述实体间的关系。

用户姓名

*用户账号

身份证号

联系方式

联系地址

*职员号

N

会员基本信息

职员姓名

1

获得

1

会员积分信息

1

管理

N

职员职位

*会员账号

会员积分 会员等级 会员折扣

图3-16 各实体之间的关系

3.系统数据库的设计

根据需求分析与概念结构设计,建立数据库系统支持的数据模型,即数据库

的逻辑结构。本系统利用Microsoft Access 2003创建了名为SuperMarket的数

据库。

本系统主要建立了以下四张表:

表3.1 用户登录数据表

字段名

DNO(登陆账号)

DCode(密码)

DUserSta(登录

身份)

表3.2 会员基本信息数据表

字段名 数据类字是否主键

文本

文本

文本

数据类字

段大小

6

12

50

是否主键

MNO(用户账号)

MName(用户姓

名)

MID(身份证号)

MTel(联系电话)

MAdd(联系地址)

表3.3 职员基本信息数据表

字段名

EID(职员号)

EName(职员姓

名)

EStatus(职员职

位)

表3.4 会员积分信息数据表

字段名

MNO(会员账号)

MScore(用户积

分)

MGrade(用户等

级)

MDiscount(用户

折扣)

4. 表之间的关系

表之间存在的关系如下:

文本

数字

数据类

文本

文本

文本

数据类

文本

文本

文本

文本

文本

段大小

6

20

18

50

50

段大小

6

20

是否主键

50 否

段大小

6

是否主键

(double) —

(long)

数字

—否

—否

(double) —

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,erfacePtr(),adOpenKeys

et,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;

l();

}

3 会员信息模块

(1) 会员基本信息查询

会员基本信息查询如下图:

图4-4 会员信息查询界面

用户登录成功后,可以根据用户账号或身份证号查询会员的基本信息,还可

以进行全表查询。

查询前,首先要选择及填写查询条件,若未填写,则出现系统提示。查询条

件填写正确后,点击查询即可会员详细信息。

查询和显示全部单击事件实现分别由函数void CMemberDlg::OnOK()和void

CMemberDlg::OnBUTTONListAll()实现,具体代码如下:

记录集打开同上。

在列表框中显示的实现:

while (!m_pRs->adoEOF)

{

CString temp;

m_Item(1000,"");

for(int i=0;i<3;i++)

{

temp=(TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)i)->Value

;

m_mText(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

{

->Execute((_bstr_t)sql,NULL,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(ption());

}

AfxMessageBox("修改成功");

4. 积分信息模块

(1) 积分查询

该功能实现界面如下:

图4-7 积分查询界面

输入会员账号后,点击确定按钮,系统首先检查账号是否存在,若存在则输

出该会员积分信息;若不存在,输出提示信息。

实现原理如会员信息模块中的会员查询。

实现函数为:void CJQueryDlg::OnOK()。

在编辑框中的显示实现为:

var = m_pRs->GetCollect("MScore");

if( != VT_NULL)

str1 = (LPCSTR)_bstr_t(var);

GetDlgItem(IDC_EDIT_Jifen)->SetWindowText(str1);

var = m_pRs->GetCollect("MGrade");

if( !=VT_NULL)

str2=(LPCSTR)_bstr_t(var);

GetDlgItem(IDC_EDIT_Grade)->SetWindowText(str2);

var = m_pRs->GetCollect("MDiscount");

if( !=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

{

->Execute((_bstr_t)sql,NULL,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(ption());

}

AfxMessageBox("兑换成功");

(3) 消费加分

该模块功能将会员的消费金额换为消费积分,如下图:

图4-9 消费加分模块界面实现图

输入用户账号和消费金额后,首先检查数据库中是否存在该记录,如果存在,

则将该用户积分增加其消费金额数目,如不存在,系统弹出提示信息。

模块单击事件处理由函数void CXiaoFeiDlg::OnOK()实现,具体代码如下:

sql="Update

MNO='"+UserZH+"'";

try

{

->Execute((_bstr_t)sql,NULL,adCmdText);

Score set MScore=MScore+'"+JiE+"' where

}

catch(_com_error &e)

{

AfxMessageBox(ption());

}

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

{

->Execute((_bstr_t)sql,NULL,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(ption());

}

AfxMessageBox("修改成功");

(3). 修改密码

职员修改密码模块与会员密码修改类似,实现函数为:void

CMModifyDlg::OnOK(),此处不再赘述。

具体SQL语句实现为:

sql="Update Login set DCode='"+NewCode+"' where DNO='"+Name+"'";

try{

->Execute((_bstr_t)sql,NULL,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(ption());

}

(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{

->Execute((_bstr_t)sql,NULL,adCmdText);

->Execute((_bstr_t)SQL,NULL,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(ption());

}

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{

->Execute((_bstr_t)sql,NULL,adCmdText);

->Execute((_bstr_t)SQL,NULL,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(ption());}

AfxMessageBox("删除成功");

}

2 会员信息管理

会员信息管理包括会员信息查询、会员信息修改、会员注册、会员删除四个

模块,功能实现同职员信息管理模块中响应功能。

实现函数分别为:void CMemberDlg::OnOK()、void

CModifyMemDlg::OnBUTTONModify()、void CMemAddDlg::OnOK()、void

CModifyMemDlg::OnBUTTONDel()。

此处以会员信息修改和删除为例,其他功能实现略写。

图4-12 会员信息修改

图中,灰色编辑框表示不可改。如果要修改信息则填入要修改的值,点击“确

定修改”,即可修改成功;如果要删除该条记录,则点击“确定删除”,系统会

提示,是否真的删除,若是,则从数据库表中将该记录删除,若否,则退出删除。

此处实现的相关的SQL语句为:

//修改

sql="Update Member set

where MName='"+UserName+"',MTel='"+UserTel+"',MAdd='"+UserAdd+"'

MNO='"+UserNO+"'";

try{

->Execute((_bstr_t)sql,NULL,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(ption());

}

AfxMessageBox("修改成功");

//删除

if(MessageBox("确定要删除该记录吗?","提示",MB_YESNO)==IDYES)

{

sql="delete from Member where MNO='"+UserNO+"'";

SQL="delete from Login where DNO='"+UserNO+"'";

try{

->Execute((_bstr_t)sql,NULL,adCmdText);

->Execute((_bstr_t)SQL,NULL,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(ption());

}

AfxMessageBox("删除成功");

6 统计

统计模块是对超市会员积分进行统计,可以统计出各登记人数及所占百分

比,并以柱形图的形式显示出来。

图4-13 统计分析功能实现图

实现该功能的函数为:void CStatDlg::OnOK()

具体实现:

(1) 打开记录集,获得各等级人数;

(2) 绘制柱形图

//获取静态图片空间大小

CWnd * pWnd=this->GetDlgItem(IDC_DRAW);

pWnd->GetClientRect(&rectPic);

// 获取设备环境指针

CDC *pDC=pWnd->GetDC();

// 重新填充静态图片区域

CBrush NewBrush;

SolidBrush(RGB(238,238,237));

CBrush * pOldBrush=pDC->SelectObject(&NewBrush);

pDC->Rectangle(&rectPic);

pDC->SelectObject(pOldBrush);

// 确定每个柱形条的宽度

int nLength=()/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++ )

{

// 确定柱形条的位置

=+i*nLength;

= -() * s[i]/num;

= + (i+1)*nLength;

=;

// 创建画刷,填充图形

CBrush NewBrush;

SolidBrush(RGBArray[i]);

CBrush * pOldBrush=pDC->SelectObject(&NewBrush);

pDC->Rectangle(&rect);

pDC->SelectObject(pOldBrush);

}

// 释放设备环境

this->ReleaseDC(pDC);

7 系统信息

1 用户帮助

系统调用帮助文件,对于不熟悉本系统的用户可以通过阅

读帮助文件了解系统如何使用。

点击用户帮助菜单或帮助工具栏按钮后,即打开帮助文件,如图所示:

图4-14 用户帮助功能实现图

具体实现为:

void CCMarketDlg::OnMENUHelp()

{

char buf[MAX_PATH];

::GetCurrentDirectory(MAX_PATH,buf); //获取程序根目录路径

::ShellExecute(NULL, "open", "", "", "", SW_SHOW);

}

2 关于本系统

具体实现:

void CCMarketDlg::OnMENUAbout()

{

CDialog about(IDD_ABOUTBOX);

l();

}

8 退出系统

具体实现:

void CCMarketDlg::OnMENUQuit()

{

->Close();//关闭数据库

EndDialog(0);

}

9 数据库连接设计与实现

(1) 初始化COM库,引入ADO库定义文件

首先在stdafx.h中用#import指令引入ADO类型库

#import "c:program filescommon

"no_namespacerename("EOF","adoEOF")

然后使用AfxOleInit()来初始化COM库。

(2) 用Connection对象连接数据库

(_T("Provider=.4.0;Data

Source=%s"),"");//根据参数构造连接字符串

conn->Open((_bstr_t)strConn,"","",adModeUnknown); //打开数据库

(3) 利用建立好的连接,通过Connection、Command对象执行SQL命令,

或利用Recordset对象取得结果记录集进行查询、处理。

_RecordsetPtr m_pRs;

m_Instance((__uuidof(Recordset)));

m_pRs->Open((_bstr_t)sql,erfacePtr(),adOpenKeys

et,adLockOptimistic,adCmdText); //打开记录集

->Execute((_bstr_t)sql,NULL,adCmdText);//执行sql

(4)使用完毕后关闭连接释放对象。

m_pRs->Close();//关闭记录集

conn->Close();//关闭连接


本文标签: 会员 信息 用户 实现