1、学生成绩管理系统详细操作过程学生成绩管理系统我将把我的实现步骤完整的写出来,我是在V 6.0版本下用MFC实现的。我创建的基于单文档的应用程序,过程不介绍,大家都会。下面的是我系统菜单:思路:刚进入系统时,只有“登录”菜单可用,其他三个菜单项都是灰色不可用的。当用户点“进入系统”菜单项时,用户输入用户名、密码和用户类型,系统将根据相应的用户权限使相应的菜单可用,并且“进入系统”菜单项变为不可用。如:如果用户类型是学生,那么只有学生权限菜单可用,而“教师权限”和“管理员权限”都不可用,同时“进入系统”变为不可用。“学生权限”下只有“查询成绩”,因为学生只可以查询自己相应的成绩;“教师权限”下有“
2、查询学生成绩”和“增改删学生成绩”两个菜单项,因为教师除了可以查询学生成绩还可以增加、修改和删除学生成绩;“管理员权限”下有“管理学生”和“管理教师”两个菜单项。整体设计:因为我们要设置系统菜单的状态,所以必须在CainFrme中添加相应的函数和代码,具体步骤如下:【步骤】由于系统要使用ODBC类操作数据库,所以需要在stafxh中加入代码: inclue EnaleMenuIm(,M_YSIIO | MF_DIALED F_GRYE); GetMenu()- nabeMenute(,MF_OSITIN |_DABLED | M_GRAYED); GtMen()- EablMnIem(2,MF
3、_BSITION|MF_DISBLED| MGRAED); GtMenu()-naMenuItem(3,_BYPOSION|MF_DISABLD M_GAD);【步骤3】在ainFre中添加自己定义的函数voidSetMeuta(int tpe),此函数在登陆对话框的OnOK()中被调用,即当用户进入系统后使“进入系统”菜单项不可用,并根据用户类型使相应菜单可用。当类型为1时(学生),使“学生权限”菜单可用;当类型为2时(教师),使“教师权限”菜单可用;当类型为3时,使“管理员”菜单可用。void CMinFram::eMeuSa(t tpe)AfxGeMainn()-Getn()-Getub
4、Meu(0)-nblMuItem(0,F_BYPOSITI | MFISABLD |MF_RD); if(tp=1) AfxGetMann()-etMen()-EnaleMentem(1,FBYOSI TN |F_ENBLD);/在上面的Onreate中可以直接通过etenu()对菜单操作, 但这里却必须先通过fxGeManWn()获得主窗体指针, /浪费了我一晚上时间,虽然解决了,但还不知道为什么。 if(type=2) AfxetanWnd()-GetMeu()-Enbleeut(2,MF_BYPOSITIONMEBED); i(pe=) AfxetMWnd()-Menu()EleMnIt
5、em(,F_BYOIIO | MF_EBLED);【步骤4】通过上面两步并不能按我们的想法实现菜单变灰的操作,运行系统各菜单都是可用的,我们必须在CMainrae的构造函数中添加下面一句代码:m_bAutenuEabl=FLSE; mbAutoMnnabe必须放在CManFram()里初始化,不可用放在登陆对话框的OK()函数中,要不其他三个菜单可用变灰,但“进入系统”菜单项却总是不能变灰。数据库设计:根据以上思路,我们使用QL数据库建立一个“学生成绩管理系统”,其下有4张表,分别为用户表USES、学生成绩表OURSE_SCE、学生信息表SUDENT_INFO和教师信息表TEACH_INO。表
6、1 用户表UERS字段名 类型 长度 说明SER_D cha 20 用户名E_PASSWRD chr 0 密码UER_TP t 4 为学生,2为教师,3为管理员表 学生成绩表COURSE_SCOR字段名 类型 长度 说明STU_ char 0 学生ID,系统中学生的唯一标识COURSE_D char 10 课程号,系统中课程的唯一标识COUSE_NE char 0 课程名SCOE int 课程分数表3 学生信息表STUDENT_IFO字段名 类型 长度 说明STU_ID car 1 学生ID,系统中学生的唯一标识SU_AME chr 0 学生姓名ENROLLMENT_TIM datetime
7、8 入学时间EARTMEN char 20 所在学院MAOR ar 2 所在专业SEX in 4 性别:0表示男,1表示女IRTHAY dtetie 生日HOMOW vrchar 50 籍贯AESS vrcha 现在住址PHN char 20 个人电话号码RAE har 0 民族PARY int 4 政治面貌:表示党员,表示预备党员,表示团员,3表示其他DIRETON varcha 50 其他信息具体实现步骤:(一)登陆模块设计1、当刚进入系统时候,用户点击“进入系统”菜单项后系统界面如下:按上面的登陆对话框摆放好控件,其中各个控件D及对应变量如下图所示:从上图中也可以看出,我们为该登陆对话框
8、建立了个新类:CLogiDg,它的具体创建过程就不介绍了。2、因为登陆对话框要使用SL数据库中的UES表,所以需要在程序中添加类CginSe,步骤如下:【步骤1】在项目名“学生成绩管理系统”上单击鼠标右键,在弹出的New Class对话框中的me文本框中输入CLognS,在Bae class下拉文本框中选择CRedst。【步骤2】单击OK按钮,弹出Datas Optin对话框,在OBC下拉文本框中选择“学生成绩管理系统”数据库,单击K按钮,弹出ect ataase les对话框,选择db.USRS选项,单击OK按钮。这样就建立了一个Recdet的对象,就可以对数据库中的USERS表进行操作了。
9、3、在LgnDlg.cp中引入头文件LoginSet.h,将CRecodSt对象Cone引入登陆对话框: #iclude “ginSet.h”4、声明全局变量。在学生成绩管理系统.cpp文件中添加如下代码: CDatabas型变量,用于连接数据库Catabse matabas;/学生登陆后在系统中的唯一ID值CSring _I;在LoiDg.cp添加如下语句,使用已经声明过的全局变量(记得在以后的每个模块中都要添加):extrn CDataa m_aabe;exte Sting_I;5、为登陆对话框的“确定”按钮添加消息代码,如下:vodLogig::OnOK() BOO bgnLS;Cogi
10、nt ecordsetnwLoginet(&mdatabae); CString strSQL;pdaeData(TUE);(m_useype.Cmre(学生)=0) ty=1; els if(_useyeCompare(教师)=)tpe2; ele (m_usetype.Compr(管理员)=0) pe=3;strSQL.Foat(seect* fom UERheeUSER_ID=s AND USE_PASSORD=% AND USR_TYPE=%d, m_useID,_aswrd,ype);mrdt-Open(AF_DB_USE_DEAULT_TY,L);if(m_recodsetGetR
11、edCount()=0) i(countGtFldValu(USER_D,m_I);bLogn=RUE; if(bgi) esageBo(欢迎进入学生成绩管理系统!); dialg(IDK);CinFae*mainfrm=new CMinFre(); min-etMenSta(type); els m_datase.Cloe();/ Cilog:nOK(); 、为登陆菜单下的“进入系统”添加响应函数,此函数是在CainFram类中添加的,代码如下:od CanFrame:OLogin() TO: Ad our coand hnlercde ere LoginDlg lgin; loginol(
12、);(二)学生成绩查询模块设计 1、如果用户类型是1,即学生时,用户可以查询自己的成绩。 在其中用户可以根据课程号或者课程名查询自己的成绩。按上面的学生成绩查询对话框摆放好控件,其中各个控件ID及对应变量如下图所示:从上图中也可以看出,我们为该学生成绩查询对话框建立了个新类:CStuChekScreDlg,它的具体创建过程就不介绍了。、因为学生成绩查询对话框要使用S数据库中的U_SOR表,所以需要在程序中添加类CCouseSreSet,步骤如下:【步骤1】在项目名“学生成绩管理系统”上单击鼠标右键,在弹出的Nw Clas对话框中的Nam文本框中输入CCoueSet,在Bas class下拉文本
13、框中选择ecordset。【步骤2】单击OK按钮,弹出DatabasOptin对话框,在ODBC下拉文本框中选择“学生成绩管理系统”数据库,单击O按钮,弹出Set Databas Tabls对话框,选择dbo. COURSE_CORE选项,单击O按钮。这样就建立了一个Reorde的对象,就可以对数据库中的COURSE_CORE表进行操作了。、在SuCheckScoDl.c中引入头文件ourseScreSeth,将CReordS对象CCoueScorSt引入登陆对话框: iclu“CourseSreSe.”4、 在StuCckScoreDl.cp添加如下语句,使用已经声明过的全局变量(记得在以后
14、的每个模块中都要添加):extern CDaabas m_databas;extern CStinm_ID;5、为学生成绩查询模块的“查询”按钮添加响应事件:voiSuChcScoreD::OnCckButton() CStrig trSQL; CDVarian aaue;UpatDat(RE);(_keyordCor(课程号)=0)srSQL.Foma(se* fromCOUSE_SCORE were COURE_ID=s,m_ot); essrSLForma(slect* frm CORSE_SCORE he OUE_NA=s,m_cost); CCorsScoreSet*m_rret=n
15、eCCouseScorSet(&m_daaa);m_recordst-Ope(AF_USEDFAULTYE,srQL); i(m_recrdset-etecordCunt()=0) MessageBox(对不起,没有您所需要的结果,请核对后重新输入!); else nt temp=;m_stuI=mrecordt-_I; _courseD=_recordset-_OUS_ID; m_cousname=m_rcordset-m_COURS_NAME; m_core=mecors-mSCORE; m_recrdet-Close();UpdateData(FALSE);注意:在上面我们对对话框中各个
16、文本框对应的变量进行赋值时,并不是使用 m_reordst-GtFeldValue(,vaVle); m_ureme=vrVale.mptring-tBf();不用这么麻烦的写法,直接用m_reordset中的变量就行了,m_recoret中的变量对应这数据库表中的各个字段,且和表中字段类型都一致。(三)教师操作学生成绩信息模块设计 1、 如果用户类型是2,即教师时,用户可以查询学生的成绩,还可以对学生成绩进行增、改、删操作。查询学生成绩和上个模块差不多,就不做了。而对学生成绩的增、改、删操作就是通过这个模板实现的。界面如下:在其中的列表控件中显示COURSE_SORE中所有的信息,并且当用户
17、点击其中一行时,可以在上面的文本框中进行显示。按上面的对话框摆放好控件,其中各个控件ID及对应变量如下图所示:从上图中也可以看出,我们为该教师操作学生成绩对话框建立了个新类:OperteScor,它的具体创建过程就不介绍了。2、因为教师操作学生成绩对话框也要使用SQL数据库中的COURSE_ORE表,所以需要在eraecre.cpp中引入在前面创建的COURS_SCOR表所对应的记录集对象的头文件CseScoeS.,将edet对象CCoseScoret引入登陆对话框: #ld “CourseScrSth”、在OpeaeScorecpp添加如下语句,使用已经声明过的全局变量(记得在以后的每个模块
18、中都要添加):extn atabase daaas;eternStrnmD;4、因为该对话框中含有列表控件,我们需要对其进行初始化,让列表控件一开始就显示COSE_OR表中的所有记录,并且把列表控件中的第一条记录显示在上面的文本框中。 【步骤1】右键点击COeratecore,在弹出的菜单中选择“d wndowesae hand”项,然后在弹出的对话框的“新建wiows消息事件”中选择“WM_IITILO”,然后点击“dd Hnle”按钮,最后点击“di Eitig”按钮,编写代码如下:BOO COperteScore::nniDilo() Dialo:itilg(); _listsore.s
19、etolu(0,学号); listscre.IertCu(,课程号); m_liscore.InseColu(2,课程名); _listscr.stCoun(3,成绩); RErect; m_listscre.etWndowRect(&rc); int wh=ret.rigtrectleft;m_lstsr.SetColumWidh(0,widt/); mistcoe.SetColmnWidth(1,wdth/4); miscoe.etColumnWth(2,widt/); m_lstscore.SeColunWidth(3,dh4); m_litscore.SetExtendetyle(LV
20、_EX_ULROWLCT); initia(); / TODO: Add xa nitalizao ereeturn RUE; / eturnTR unles ou et the focus t a contl / EXCEPTIO:CXPoery Ps soud etur FALSE 【步骤2】在上面的IitDial()函数中我们设置了列表控件的表头和每列的间距,并在最后调用了iial()函数。inital()是我自定义的一个函数,用来将CORSESCOE表中的数据全部在该列表控件中显示出来。该函数是自定义函数,添加过程比较简单,不介绍。代码如下:void OperateScore:init
21、ial() m_listore.DeeAllItems(); DBVia vrale04; CCureScoe m_rcors; int jmrecdst.GtDatebe(vValu); int ;inti=0; char bf20;fo(=0;k+) /用来处理数据表中的字符型字段 misscore.IseItm(,arValek0._pstring-Getffr(1)); m_listscreSetemTx(,1,vValuek1.m_pstrg-GetBufer()); m_listcore.ttemTex(i,2,vaValuk2._ping-Getufer(1));/用来处理数据表
22、中的整型字段sprnf(uf,%d,arValuek3m_iVal);m_listsore.SettmText(,3,uf); i=0; sete(0);vrlue204是CDBariat型的,该类型的变量可以用来存储数据表中任意类型的字段,所在在数据库操作时用该变量比较方便。变量j表示OURSESCE数据表中的行数,通过for循环把该数据表中的所有记录全部显示出来。数据表中的前3个字段我都是用vVlue.mpsrng-GtBuffr(1)来显示在列表控件中,是因为数据表中前3个字段都是字符型的,而最后一个字段是用来显示分数的,该字段在数据表中我定义为了整型,所有用pintf(buf,%d,a
23、rVluek3.m_iVa); mlistsoreSetItmTet(,3,bf);来显示。【步骤3】在上面的iitial()函数中我调用了GetDatebase(vaalu)函数,该函数返回U_SRE数据表中的记录条数,我们将其赋给了j。并且该函数把COURSE_SCOE表中所有记录都存储在二维数组vaValue中。在前面两个模块中我对数据库操作都是直接在该模块中操作的,但现在我要换种方法。我把对数据库的操作封装在了记录集类CCoursecoreSet中,这样避免混乱。在记录集类CourseScoreSt中添加Getaase(varValue)函数,注意:因为我们要在类COrteSre调用该函数,所有我们必须要把该函数定义为public型。其代码如下:nt CursecoreSet:etaeae(CDBVaat varVle) CCouseScoSt m_eordse(&m_dtaase); CString rSQL;SL.Formt(selt *fro COUSESORE);_recrdst.pen(AFX_B_UEDAULT_TPE,stSQL); if(mrcorse.GetRcrount()!=0) m_recordst.MeFirt();int j=0;hie(!m_rcors
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1