课程设计报告课程名称:计算机实践(1)项目名称:台球厅收费管理系统学院:专业:姓名/学号:班级:实验时间:成绩:指导教师:(一)课题介绍1.1题目:台球厅管理系统1.2设计目标:实现台球厅的数字化管理,规范化管理借入借出,准确定位,实现增删改查。
1.3实验环境:前台使用C++编写,实现工具visual studio 2013 update4。
1.4需求分析:台球厅管理系统:主要涉及台球厅的卡号管理,又可以分为两种情况,会员卡号和普通卡号。
用户管理方面分成操作员和管理员两种。
系统功能模块包括:(1)系统登录模块:根据不同权限将用户角色分为操作人员和管理员,操作人员可以进行系统操作;管理员可以对用户进行管理。
(2)会员卡号模块:记录卡号和用户姓名、身份证号、账户余额、是否续费等信息。
(3)系统管理模块:管理员可以进行系统的管理,包括用户信息的增、删、改、查。
(4)普通卡号模块:记录普通卡号、身份证号、进入和离开时间以及费用等信息。
项目的研究思路是:首先划分为会员卡和普通卡两种。
会员卡的特点是输入用户名、密码便可登陆,可充值会员使用。
普通卡的特点是记录上网时间,按时间先收费。
1.5概念结构设计:一张用户管理表,表名[用户表]一张会员打台球,简称[会员卡]一张普通,简称[普通卡]所有用户共同使用一个主界面,在用户登录的时候确定用户及其权限,当登录的用户没有该项权限时,在界面中这项权限所对应的功能模块不能被点击,这样的设计方便了系统管理和维护。
用户在使用本系统时的工作过程为:进入系统后,会看到登录窗体,对用户的身份进行验证,身份正确则进入本系统,登录到主界面,选择需要的功能进行操作,结束后退出本系统。
如图1.1所示。
图1.1 系统流程分析图管理员操作员 管理员 操作员图1.2 系统功能模块 1.6逻辑结构设计:用户表将涉及以下属性:姓名、密码、新密码、确认密码。
会员卡将涉及以下属性:卡号、用户姓名、身份证号、账户余额、是否续费。
普通卡将涉及以下属性:普通卡号、身份证号、普通卡状态、进入和离开时间以及费用。
(二)数据库的建立、设计及实施台球厅收费管理系统收费管理系统管理系统登陆 会员卡普通卡2.1数据库的建立点击“开始”按钮,在所有程序中找到Microsoft SQL Server,再从弹出的菜单中找到“企业管理器”单击进入。
点击“企业管理器”栏如图1.2 所示的SQL Server 数据库界面,接下来单击“数据库”栏,在数据库中建个库,起名为“taiqiuting”。
2.2数据实体及其关系本数据库中有3个实体,分别如下介绍:实体1:用户:(姓名,密码,用户类别编号,类别名称)本系统的数据库并没有将每类用户分别作为一个实体进行设计,而是将用户作为整个数据库的一个实体,通过用户的属性中的类别编号来判断用户的类别。
用户实体使用[用户表]表示,其中包含四个属性:UID表示姓名、PWD表示密码、Type表示用户类别编号、Exp 表示用户类别名称。
图2.3是实体1用户的E-R图。
实体2:会员客户:(会员卡号,姓名,身份证号,账户余额,缴费状态)本系统主要存储的是持有会员卡客户的信息,因此本系统单设了一个基本信息实体。
基本信息实体使用 ChangQiTable 表示,它包含 5 个属性:ChangQiCardID 表示会员卡号、ChangQiName 表示持有会员卡客户的姓名、ChangQiAddr 表示持有会员卡客户的账户余额、ChangQiCarNum 表示持有会员卡客户的身份证号、ChangQiFee 表示持有会员卡客户的缴费状态。
图2.4是实体2会员客户的E-R 图。
实体3:普通客户:(普通卡号,身份证号,进入时间,离开时间,计时费用,普通卡状态) 本系统主要存储的是持有会员卡客户的信息,基本信息还是本系统的实体。
基本信息实体使用 LinShiTable 表示,它包含 6 个属性:LinShiCardID 表示普通卡号、LinShiCarNum 表示持有普通卡客户的身份证号、InTime 表示持有普通卡车辆的进入时间、OutTime 表示持有普通卡车辆的离开时间、Fee 表示持有普通卡客户的计时交费。
Status 表示普通卡的发放状态。
图2.5是实体3普通借阅的E-R 图。
用户用户类别名称姓名用户类别编号密码图2.3用户E-R 图身份证号账户余额身份证号2.3数据库表的设计本数据库共设计了3张表,表2.1是本数据库的用户表。
这张表介绍了本数据库的用户,包括管理员和操作员。
用户是通过类别编号来区分用户类别的,用户表共有4个字段,分别表示用户姓名、密码、用户类别编号及用户类别名称。
表2.2数据库用户表字段名字段描述是否为主键数据类型长度UID 用户姓名是char 10PWD 密码否char 20Type 类别编号是char 4Exp 类别名称否char 20表身份证号、缴费状态。
表2.3数据库的会员客户表字段名字段描述是否为主键数据类型长度ChangQiCardID会员卡号是char 10ChangQiName会员客户姓名否char 10ChangQiAddr账户余额否char 10ChangQiCarNu身份证号否char 10mChangQiFee缴费状态否char 10表计时交费、普通卡发放状态。
表2.3数据库的普通客户表字段名字段描述是否为主键数据类型长度LinShiCardID普通卡号是char 10LinShiCarNum普通客户姓名否char 10InTime进入时间否char 20OutTime离开时间否char 20Fee 计时缴费否char 10Status普通卡状态否char 1Status3 状态否char 10建立完成如下图所示:数据库的链接:打开管理工具打开ODBC数据源(32位)添加Stopping数据库(三)系统详细设计3.1 用户登录模块设计用户登录模块是本系统的基本功能模块,要与后台数据库紧密相连。
设计步骤为:添加新对话框设置ID号为IDD_DIALOG_Login,并以CDialog为基类创建CLogin类,添加控件、成员变量,完成之后得到如图3.1所示的登录窗口对话框图。
图3.1登录窗口对话框图如果系统登录不成功,就会弹出一个小的对话框,里面会告诉你“密码错误,请重新输入”的字样,如图6.13所示登录失败窗口图如果系统登录成功,就会弹出一个小的对话框,里面会告诉用户,该用户是什么登录身份,如图6.14所示登录成功窗口图,本图以管理员登录成功为例。
从图3.1中可以看到,本模块中添加了四个Edit Box类型的控件,两个用来存放变量,另外两个用来存放变量内容。
本模块添加了两个Button类型的控件,用来设置确定和取消按钮。
表3.1是本模块添加的控件列表。
表3.1用户登录模块控件列表ID 控件类型控件名称变量类型变量名称函数名称IDC_STATIC Edit Box 用户名:IDC_STATIC Edit Box 密码:IDC_EDIT_UName Edit Box CEdit m_usenameIDC_EDIT_Pwd Edit Box CEdit m_pwdID_OK Button 登录OnOK()ID_CANCEL Button 取消OnCancel() 从表3.1中可以看到本模块有两个变量和两个成员函数,两个变量分别是m_usename 和m_pwd;两个成员函数OnOK()和OnCancel()。
先介绍一下创建变量,下面以m_usename为例,找到登录模块,点击鼠标右键出现一个对话框,如图3.2所示图3.1建立变量(1)在弹出的菜单栏中,点击“类向导”,点击“成员变量”栏,然后点击“添加变量”按钮,接下来弹出的窗口为给变量起名字,点击“OK”按钮完成变量的生成,出现如下图3.3所示的窗口图3.3建立变量(2)菜单项的设计:接下来讲解这两个成员函数,它们是用来设计确定和取消按钮。
OnOK()函数设计的是确定按钮,OnCancel()函数设计的是取消按钮,如图5.5是用户登录类CLogin的成员函数和成员变量视图。
图3.4本模块类CLogin成员函数和成员变量视图从图3.4中可以看到本模块在设计控件Button时的两个成员函数OnOK()和OnCancel()。
该模块的设计过程中有两个值得注意的点:其一是该模块中主要有两个变量用户名和密码。
要确保登录成功,用户名和密码一定要正确并且对应,因此判断用户名密码正确与否是该模块设计的关键。
首先在头文件.h中添加需要用到的数据源变量然后利用GetWindowText() 函数获取对话框中输入的用户名和密码信息,传递给username和password两个变量。
利用SQL查询语句strSQL.Format("select * from 用户表where UID='%s' and PWD='%s'",username,password);中数据库的Admin表中进行查询,如果找到相应的记录,则登录成功,取出这个用户相对应的权限Type赋值给m_userLevel变量。
之后就利用该变量的值为0还是1,来区分是操作员还是管理员。
如果SQL查询的结果为0,即m_recordSet.GetRecordCount()==0,则说明该用户名或密码在用户表中找不到,则登录失败。
登录代码的设计如下:void CLogin::OnOk(){// TODO: Add your control notification handler code hereCString username,password;m_username.GetWindowText(username);m_pwd.GetWindowText(password);if(!m_database.IsOpen()){if(m_database.Open(_T("taiqiuting"))){m_recordSet.m_pDatabase=&m_database;CString strSQL;strSQL.Format("select * from Admin where UID='%s' and PWD='%s'",username,password);m_recordSet.Open(CRecordset::forwardOnly,strSQL);if(m_recordSet.GetRecordCount()==0){MessageBox("密码错误,请重新输入","密码错误",MB_OK|MB_ICONWARNING);m_pwd.SetWindowText("");m_pwd.SetFocus();}else{m_recordSet.GetFieldValue("Type",m_userLevel);CDialog::OnOK();}m_recordSet.Close();m_database.Close();}else{MessageBox("不能打开数据库");}}}void CLogin::OnCancel(){// TODO: Add your control notification handler code hereif(MessageBox("真的要退出系统吗?","退出询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK)CDialog::OnCancel();}其次,利用登录模块中获取的m_userLevel的值,判断该登录用户的类别和权限。