UML学生成绩管理系统.docx
《UML学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《UML学生成绩管理系统.docx(24页珍藏版)》请在冰豆网上搜索。
![UML学生成绩管理系统.docx](https://file1.bdocx.com/fileroot1/2023-1/1/2c74e59e-8fcf-4b3a-a097-328ca7fcd4e4/2c74e59e-8fcf-4b3a-a097-328ca7fcd4e41.gif)
UML学生成绩管理系统
成绩管理系统
----基于VC++与SQLServer
学号:
201100358001
姓名:
李帅
学院:
烟台大学计算机学院
指导教师:
王培进老师
见下一页,本页空白,页码格式需要
第一章系统需求分析
1、系统开发的目的与意义
随着社会快速发展,学生个人信息及考试信息庞大而且复杂,传统人工采集与处理信息的手段既费时又费力,已经远远无法满足人们的要求。
由于计算机具有快速高效的数据处理能力,开发一个计算机成绩管理系统来管理学生成绩信息,大大减少了老师及相关管理人员的工作量,而且效率极高,错误明显减少,同时,又能让学生及时准确的掌握自己成绩信息。
可以说使用计算机软件来管理学生成绩是大势所趋。
2、系统边界分析
该系统供学校教师与学生使用,教师在该系统中的身份相当于管理员,可以管理维护数据;学生没有管理数据的权限,只能进行查询。
由于系统要求不高,本系统数据库与界面终端在同一台电脑上,教师与学生均要通过这一台电脑进行管理或者查询。
3、系统功能性需求分析
◆对于教师(管理员),具有以下几种功能:
1学生个人信息管理
查询、添加、修改、删除、打印学生个人信息
2学生成绩管理
查询、添加、修改、删除、打印学生考试成绩
◆对于学生,具有以下几种功能:
查询个人信息,查询、打印、报错个人成绩
4、系统非功能性需求分析
性能需求:
开发系统性能稳定,不应出现操作上的失误而引起的系统关闭等。
安全性需求:
不同权限的操作人员只能操作某些功能,不可越权操作
人机交互需求:
操作人性化,用户比较舒适的使用系统,不可难于理解和复杂;
系统观感:
要求界面颜色搭配合理,不能单调或者过于绚丽;
经济效益:
要求开发周期不能超过半年,合理管理开发过程,不得造成浪费.
第二章面对对象分析
1、静态模型
①用例模型
该系统共有两个用户,学生与教师,其用例模型如下图所示:
②类分析
本系统中的类大体可分为三大类,分别是实体类、界面交互类与数据库类。
在VC++ClassView中分了三个文件夹存放,如下图所示:
◆实体类:
包括学生信息类(CStudentInfo)与学生成绩类(CStudentScores)。
这两个类都是指某一个学生的信息,本来可以划分为一个类,比如说将学生成绩当做学生个人信息类的一个属性,但由于系统是需要对学生个人信息与成绩分别操作,例如删除了学生成绩,但是学生的个人信息还要在,因此将二者割裂开来,这也更加清晰的体现了该学生成绩系统的个人信息与成绩两大模块。
二者类图如下图所示:
◆界面交互类:
各个对话框类,包括欢迎界面类,登陆对话框类,教师管理对话框类以及其产生的查询、添加、修改等子对话框类,学生界面类等。
这些类是用户与系统之间的桥梁与纽带,将系统具体形象的呈现在用户面前,并且根据用户选择对系统中的各种类进行操作。
这些界面类的类图如下所示:
其中虚线表示依赖关系,A类向B类发送消息,从而影响B类发生变化。
图中的学生窗口类是由标签控件和列表控件组合而成,而不是聚合关系,应该是实心菱形,由于种种原因,这里化成了空心的菱形。
◆数据库类:
数据库类是对数据库进行操作的类,包括ADO数据库控件类和ADO数据库对象类,ADO控件类包括AdoDC控件类和DataGrid控件类,用来显示数据库中的数据;ADO数据库对象类,用来连接数据库,以及对数据库执行SQL语以及存储等操作,我们将其封装在了CDBConnet类中。
其类图如下所示:
◆
所有类之间的关系:
仔细分析总体类图,DBConnect类是底层对数据库进行操作的类,而调用该类的只有两个实体类,对话框类要想改变数据库,必须调用实体类中的方法,这里的实体类中,学生个人信息类封装了对学生个人信息的查询、添加、修改、删除等操作,而学生成绩类中封装了对学生成绩的查询、添加、修改、删除等操作,这样的结构充分体现了面对对象设计的封装特性。
2、动态模型
①教师添加学生个人信息时序图
②教师修改学生个人信息协作图
③学生查询活动图
3、系统包图
第三章面对对象设计
1、人机交互界面设计
本系统的GUI采用VC++MFC编制,界面友好,便于操作。
主要由以下几个界面组成:
1欢迎界面
系统初始化时,要加载很多数据文件,耗时较长,为了避免用户焦急等待,设置欢迎界面。
2登陆界面
选择用户类型,输入用户名与密码,即可登陆,密码错误次数不能超过三次。
3教师管理主窗口
第一个表为学生信息表,下边的表为学生成绩表。
设计理念是直观简洁。
④查询学生个人信息(查询学生成绩与此对话框类似)
输入学号或者姓名均可以查询,查询结果高亮显示在教师管理主窗口的学生个人信息表中。
⑤添加学生个人信息(添加学生成绩与此对话框类似)
⑥修改学生个人信息(修改学生成绩与此对话框类似)
首先在教师管理主窗口中单击某一学生记录,然后单击修改,即可弹出该对话框。
弹出该对话框时,对话框上填充着原有信息。
⑦学生管理主窗口
2、控制驱动设计
由于本系统仅是小型管理系统,数据量不大,功能不复杂,系统结构没有采用C-S、B-S等结构,而是简单的在一台电脑上实现了所有的功能;程序驱动采用单一进程即可比较完美的实现成绩管理与查询功能,没有划分多线程。
3、数据库设计
本系统数据库共设计了4个表,分别存储了教师登陆用户信息、学生登录用户信息、学生个人信息和学生成绩。
①教师与学生登陆信息的表格式一样,如下所示
②学生个人信息表格式如下所示
③学生成绩表格式如下所示
第四章系统实现代码
本系统采用MicrosoftVisualC++6.0集成开发环境进行开发,数据库由SQLServer2000设计并且提供服务器。
1、实体类CStudentInfo
classCStudentInfo
{
private:
CStringStu_ID;
CStringStu_Name;
CStringStu_Sex;
CStringStu_Birthday;
CStringStu_Address;
public:
CStudentInfo();
virtual~CStudentInfo();
//获取对象属性
CStringGetStu_ID();
CStringGetStu_Name();
CStringGetStu_Sex();
CStringGetStu_Birthday();
CStringGetStu_Address();
//设置对象属性
voidSetStu_ID(CStringtemp);
voidSetStu_Name(CStringtemp);
voidSetStu_Sex(CStringtemp);
voidSetStu_Birthday(CStringtemp);
voidSetStu_Address(CStringtemp);
//若定义了某实例化对象,以下是对其进行数据库操作
voidDB_Insert();//将该对象实例存储至数据库
voidDB_Delete();//从数据库中删除该对象实例
intDB_Search();//从数据库中查询该对象实例
};
CStudentInfo:
:
DB_Insert()向数据库中插入学生个人信息记录
voidCStudentInfo:
:
DB_Insert()
{
CDBConnectadoDB;
adoDB.OnInitDBConnect();
CStringstrSQL;
strSQL.Format("INSERTINTOstudentinfo(学号,姓名,性别,出生日期,家庭住址)VALUES('%s','%s','%s','%s','%s')",
Stu_ID,Stu_Name,Stu_Sex,Stu_Birthday,Stu_Address);
adoDB.ExecuteSQL(strSQL);
adoDB.ExitDBConnect();
}
CStudentInfo:
:
DB_Delete()从数据库中删除学生个人信息记录
voidCStudentInfo:
:
DB_Delete()
{
CDBConnectadoDB;
adoDB.OnInitDBConnect();
CStringstrSQL;
strSQL.Format("DELETEFROMstudentinfoWHERE学号='%s'",Stu_ID);
adoDB.ExecuteSQL(strSQL);
adoDB.ExitDBConnect();
}
CStudentInfo:
:
DB_Search()在数据库中搜寻学生个人信息记录
intCStudentInfo:
:
DB_Search()
{
intPosition=0;
CDBConnectadoDB;
adoDB.OnInitDBConnect();
_RecordsetPtrppRst=adoDB.GetRecordset("SELECT*FROMstudentinfo");
ppRst->MoveFirst();
while(!
(ppRst->rsEOF)&&Stu_ID!
=(LPCTSTR)(_bstr_t)ppRst->GetCollect("学号")&&
Stu_Name!
=(LPCTSTR)(_bstr_t)ppRst->GetCollect("姓名"))
{
Position++;
ppRst->MoveNext();
}
if(ppRst->rsEOF)
return-1;
Stu_ID=(LPCTSTR)(_bstr_t)ppRst->GetCollect("学号");
Stu_Name=(LPCTSTR)(_bstr_t)ppRst->GetCollect("姓名");
Stu_Sex=(LPCTSTR)(_bstr_t)ppRst->GetCollect("性别");
Stu_Birthday=(LPCTSTR)(_bstr_t)ppRst->GetCollect("出生日期");
Stu_Address=(LPCTSTR)(_bstr_t)ppRst->GetCollect("家庭住址");
adoDB.ExitDBConnect();
CScoresApp*app=(CScoresApp*)AfxGetApp();
app->Position=Position;
returnPosition;
}
2、实体类CStudentScores
其整体构架与CStudentInfo类似,不再赘述。
classCStudentScores
{
public:
voidSetSco_ID(CStringtemp);
voidSetSco_Name(CStringtemp);
voidSetSco_AI(inttemp);
voidSetSco_DM(inttemp);
voidSetSco_Math(inttemp);
voidSetSco_English(inttemp);
voidSetSco_UML(inttemp);
voidSetSco_SS(inttemp);
CStringGetSco_ID();
CStringGetSco_Name();
intGetSco_AI();
intGetSco_DM();
intGetSco_Math();
intGetSco_English();
intGetSco_UML();
intGetSco_SS();
voidDB_Insert();
voidDB_Delete();
intDB_Search(CStringtemp="");
CStudentScores();
virtual~CStudentScores();
private:
CStringSco_Name;
CStringSco_ID;
intSco_AI;
intSco_DM;
intSco_Math;
intSco_English;
intSco_UML;
intSco_SS;
};
3、数据库类CDBConnect
用来连接数据库及对数据库进行底层操作。
voidCDBConnect:
:
OnInitDBConnect()//用m_pConnection对象连接数据库
{
:
:
CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection));//OR"ADODB.Connection"
CStringConnectionStr="Provider=SQLOLEDB.1;Password=123;"
"PersistSecurityInfo=True;UserID=ytu;"
"InitialCatalog=scores;DataSource=PC-20110930WANW\\SQLDB";
try
{
m_pConnection->Open(_bstr_t(ConnectionStr),"","",adConnectUnspecified);
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
}
_RecordsetPtrCDBConnect:
:
GetRecordset(CStringstrSQL)//根据传进来的SQL参数,访问数据库,返回记录集
{
try
{
if(m_pConnection==NULL)
OnInitDBConnect();
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open((_variant_t)strSQL,_variant_t((IDispatch*)m_pConnection),
adOpenKeyset,adLockOptimistic,adCmdText);
}
catch(_com_errore)
{
AfxMessageBox(e.Description());
}
returnm_pRecordset;
}
BOOLCDBConnect:
:
ExecuteSQL(CStringstrSQL)
{
try
{
if(m_pConnection==NULL)
OnInitDBConnect();
m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText);
returntrue;
}
catch(_com_errore)
{
AfxMessageBox(e.Description());
returnfalse;
}
}
voidCDBConnect:
:
ExitDBConnect()
{
if(m_pRecordset!
=NULL)
{
m_pRecordset->Close();
m_pRecordset.Release();
}
m_pConnection->Close();
m_pConnection.Release();
CoUninitialize();
}
4、欢迎界面类CHelloDlg
BOOLCHelloDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
CenterWindow();//使窗口居中
DWORDdwStyle=0x00080000;
HINSTANCEhInst=LoadLibrary("User32.DLL");//导入动态链接库,为了淡入淡出效果
typedefBOOL(WINAPIMYFUNC(HWND,DWORD,DWORD));
MYFUNC*AnimateWindow;
AnimateWindow=(MYFUNC*):
:
GetProcAddress(hInst,"AnimateWindow");
AnimateWindow(this->m_hWnd,750,dwStyle);
FreeLibrary(hInst);
SetTimer(1,2000,NULL);//结合定时器使用
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
定时器函数
voidCHelloDlg:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
DWORDdwStyle=0x00080000;
HINSTANCEhInst=LoadLibrary("User32.DLL");
typedefBOOL(WINAPIMYFUNC(HWND,DWORD,DWORD));
MYFUNC*AnimateWindow;
AnimateWindow=(MYFUNC*):
:
GetProcAddress(hInst,"AnimateWindow");
AnimateWindow(this->GetSafeHwnd(),750,dwStyle|0x00010000);
FreeLibrary(hInst);
KillTimer
(1);
CDialog:
:
OnOK();
CDialog:
:
OnTimer(nIDEvent);
}
5、系统登陆界面类CscoresDlg
响应登录按钮单击事件。
voidCScoresDlg:
:
OnButtonLogin()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
CStringstrSQL;
m_IndexSelected=m_List.GetSelectionMark();
CDBConnectadoDB;
adoDB.OnInitDBConnect();
_RecordsetPtrpRst;
if(m_IndexSelected==-1)
MessageBox("请选择用户类型!
","注意",MB_ICONEXCLAMATION|MB_OK);
if(m_IndexSelected==0)
{
strSQL.Format("SELECT*FROMteacher_userWHERE用户名='%s'AND密码='%s'",m_username,m_password);
pRst=adoDB.GetRecordset(strSQL);
If(pRst->RecordCount>0)
{
CTeacherDlg*teacherDlg=newCTeacherDlg;
teacherDlg->Create(IDD_DIALOG_TEACHER,this);
teacherDlg->ShowWindow(SW_SHOW);
this->ShowWindow(SW_HIDE);
adoDB.ExitDBConnect();
}
else
{
if(count<3)
{
MessageBox("用户名或者密码错误,请重新输入!
","错误",MB_ICONHAND|MB_OK);
count++;
}
else
{
MessageBox("错误次数超过3次,请稍后再试...");
CDialog:
:
OnOK();
}
}
}
if(m_IndexSelected==1)
{
strSQL.Format("SELECT*FROMstudent_userWHERE用户名='%s'AND密码='%s'",m_username,m_password);
pRst=adoDB.GetRecordset(strSQL);
if(pRst->RecordCount>0)
{
CStudentDlg*studentDlg=newCStudentDlg;
studentDlg->m_ID=m_username;
studentDlg->Create(IDD_DIALOG_STUDENT,this);
studentDlg->ShowWindow(SW_SHOW);
this->ShowWindow(SW_HIDE);
adoDB.ExitDBConnect();
}
else
{
if(count<3)
{MessageBox("用户名或者密码错误,请重新输入!
","错误",MB_ICONHAND|MB_OK);
count++;
}
else
{
MessageBox("错误次数超过3次,请稍后再试...");
CDialog:
:
OnOK();
}
}
}
}
6、教师管理窗口类CTeacherDlg
响应添加按钮单击事件的函数,其他诸如查询、修改等按钮单击事件响应函数与此类似,不再赘述。
voidCTeacherDlg:
:
OnAddStuInfo()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CAddStuInfoDlgAddDlg;
AddDlg.DoModal();
m_AdoInfo.Refresh();
}
7、添加学生信息窗口类CAddStuInfoDlg
响应添加按钮单击事件的函数,其他诸如查询、修改窗口的按钮单击事件响应函数与此类似,不再赘述。
voidCAddStuInfoDlg:
:
OnButtonAdd()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
if(m_Name=="")
{
MessageBox("请输入学生姓名!
");
return;
}
if(m_ID=="")
{
MessageBox("请输入学生学号!
");
return;
}
CStudentInfos