软件工程试验报告.docx
- 文档编号:4605589
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:16
- 大小:594.83KB
软件工程试验报告.docx
《软件工程试验报告.docx》由会员分享,可在线阅读,更多相关《软件工程试验报告.docx(16页珍藏版)》请在冰豆网上搜索。
软件工程试验报告
《软件工程上机实验》
实验报告书
——科研管理系统
专业班级
计算机科学与技术074班
学号
079074120
姓名
任胜强
指导教师
方木云
工业大学
计算机学院
第一章简介
此次试验,要求完成可视化的科研管理系统。
将自己在软件工程课程中学习到的软件设计的知识运用的实际中,加深对知识的理解,也增强自己动手的实践能力。
我采用的是运用C++语言在WINDOWS操作平台上,使用MSvc6.0和sqlserver2000完成的单机版C/S系统。
第二章试验步骤
1.需求分析:
分析该系统需要完成的功能,需要什么开发工具和数据库管理软件
2.数据库设计:
分析系统的数据,画出数据库的E-R图,并在此基础上完成数据库表的设计和初始数据的输入
3.数据流图的设计:
仿照用户的使用习惯,分析从系统启动到系统退出系统数据的使用
4.系统功能模块的设计:
按照数据流图的需要,分析出系统需要哪些模块来完成需求分析中提出的功能需求
5.实现和编码:
在选定的平台上上运用开发工具和数据库管理软件进行系统的开发
6.测试:
每完成一个模块和重要函数,进行相应的单元测试;系统完成之后,需要系统测试
7.迭代:
根据测试的结果进行迭代,从而形成一个完整可用的系统
第三章需求分析
2.1可行性分析
系统基于windows操作系统环境,在单机上进行测试和使用,主要功能完备,可以运行。
2.2基本功能需求
1.系统分成三级用户,不同用户登录界面相同,但是具有的功能不同
2.超级管理员能够进行所有的增删查修操作,一般管理员可以对项目等进行增删查修,但是不能对和自己高级同级的用户进行操作
3.实现基本信息的各种操作(如学院,部门,委托单位,论文级别,专家等),需要超级管理员的权限
4.管理员以上可以实现各种项目、论文、著作、专利的输入工作
5.普通用户可以实现项目信息的查询工作
第四章数据流图
树形结构的数据流图如下所示:
第五章系统模块结构图
1.登陆界面:
主要功能点:
1.从数据库中读取数据,看用户名和密码的正确性;
2.如果用户名输入不正确,提示用户名输入错误;
3.如果密码输入不正确,提示密码输入错误;
4.如果登陆次数多于五次,自动退出系统;
5.用户名和密码正确,则进入系统主界面。
主要代码:
if(m_strUsername.IsEmpty()||m_strPassword.IsEmpty())
{
AfxMessageBox("请将资料填写完整再登录!
");
return;
}
theApp.id=m_strUsername;
theApp.m_pRS.ADOExcute("selectpassword,uright,namefromuserinfowhereid='"+m_strUsername+"'");
if(theApp.m_pRS.nFieldRows==1)
{
str=theApp.m_pRS.GetFieldString(0);
str.TrimLeft();
str.TrimRight();
if(theApp.trytime>=5)
{//如果登录次数超过五次不成功的话,则退出系统
PostQuitMessage(WM_QUIT);
}
if(str!
=m_strPassword)
{
theApp.trytime++;
AfxMessageBox("错误的密码!
");
}
else
{
npower=theApp.m_pRS.GetFieldNumber
(1);
theApp.power=npower;
if(npower==1)
power="超级管理员";
elseif(npower==2)
power="管理员";
else
power="普通用户";
CMainDlg*maindlg;
maindlg=newCMainDlg();
maindlg->Create(IDD_MAINDLG_DIALOG);
this->ShowWindow(SW_HIDE);
maindlg->ShowWindow(SW_SHOW);
maindlg->Initial(theApp.m_pRS.GetFieldString
(2),power,npower);
}
}
else
{
AfxMessageBox("错误的用户名!
");
}
2.系统主界面
主要功能点:
1.系统功能采用树形菜单映射的方式,分为设置和管理两大部分;
2.设置主要是设置一些基础信息,比如在下拉框中需要选择的信息,比如学院,委托单位,
论文等级等等,需要超级管理员权限;
3.管理是系统主要功能在管理菜单下,普通用户只能查看相关信息,管理员以上可以增删查改相关信息;
4.主界面分成三个部分,树形目录是不会发生改变的,始终显示在界面上;列表也是始终显示在界面上的,根据用户单击树形目录选择相关的信息显示在其中;第三部分,则是根据用户单击的选项来动态变化的,若单击用户管理,则显示用户管理的界面,如下示:
5.系统配有相应的菜单项,工具栏,和状态栏,前两者用来映射树形目录功能,后者则是用来显示用户ID和用户权限以及当前系统时间的。
主要代码如下:
1.List表格刷新函数
m_ctrlList.GetClientRect(&rect);//获取列表控件的矩形
m_ctrlList.DeleteAllItems();
while(m_ctrlList.DeleteColumn(0));
//先插入列号
try{
for(i=0;i { strText=theApp.m_pRS.GetFieldName(i); lvColumn.mask=LVCF_TEXT|LVCF_FMT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_LEFT; lvColumn.cx=rect.right/colums; if(lvColumn.cx<100) lvColumn.cx=100; lvColumn.pszText=strText.GetBuffer(strText.GetLength()); //插入列 m_ctrlList.InsertColumn(i,&lvColumn); } i=0; while(! theApp.m_pRS.ADOEOF()) { m_ctrlList.InsertItem(i,"%d",i); for(j=0;j { m_ctrlList.SetItemText(i,j,theApp.m_pRS.GetFieldString(j)); } theApp.m_pRS.MoveNext(); i++; } } catch(...) { AfxMessageBox("数据库读取失败! "); return; } 2.选择相应窗口函数: CStringstrText,strSQL; HTREEITEMhTreeItem; hTreeItem=m_ctrltree.GetSelectedItem(); strText=m_ctrltree.GetItemText(hTreeItem); if(strText=="用户管理") { if(power==1)//是超级管理员的话 strSQL="selectID,name,password,urightfromuserinfo"; else strSQL.Format("select*fromuserinfowhereuright>%dorname='%s'",power,name); userinfo.ShowWindow(SW_SHOW); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_HIDE); } elseif(strText=="横向管理") { userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_SHOW); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_HIDE); } elseif(strText=="纵向管理") { strSQL="select*fromvertiproj"; userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_SHOW); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_HIDE); } elseif(strText=="论文管理") { userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_SHOW); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_HIDE); } elseif(strText=="专著管理") { userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_SHOW); patent.ShowWindow(SW_HIDE); } elseif(strText=="专利管理") { userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_SHOW); } theApp.m_pRS.ADOExcute(strSQL); RefreshList(); 3.单击list控件中相应项在下面的子窗体中显示详细信息的函数: CStringid; intcur=m_ctrlList.GetSelectionMark(); intall=m_ctrlList.GetItemCount(); if(cur>=0&&cur {//先查看选中的是否在显示的围之 id=m_ctrlList.GetItemText(cur,0); if(userinfo.IsWindowVisible())//判断窗口是否是显示的 userinfo.Display(id); elseif(vertiproj.IsWindowVisible()) vertiproj.Display(id); elseif(horizproj.IsWindowVisible()) horizproj.Display(id); elseif(article.IsWindowVisible()) article.Display(id); elseif(compose.IsWindowVisible()) compose.Display(id); elseif(patent.IsWindowVisible()) patent.Display(id); } 4.主窗口初始化函数: 状态栏数据结构: staticUINTindicators[]= { ID_INDICATOR_USER, ID_INDICATOR_TIME, ID_INDICATOR_POWER, }; 初始化状态栏: UINTnID; CRectrect; GetClientRect(rect); this->m_nwndStatusBar.Create(this); this->m_nwndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)); m_nwndStatusBar.MoveWindow(0,rect.bottom-20,rect.right,20); m_nwndStatusBar.SetPaneStyle(2,SBPS_STRETCH); m_nwndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NOBORDERS,rect.right/3-20); m_nwndStatusBar.SetPaneText(0,”当前用户: ”+user); m_nwndStatusBar.SetPaneInfo(1,nID,SBPS_STRETCH|SBPS_NOBORDERS,rect.right/3-20); m_nwndStatusBar.SetPaneText(1,”用户权限: ”+spower); m_nwndStatusBar.SetPaneInfo(2,nID,SBPS_STRETCH|SBPS_NOBORDERS,rect.right/3); SetTimer(1,1000,NULL); 树形目录的初始化: hRootItem=m_ctrltree.InsertItem("科研管理系统",0,2,TVI_ROOT,TVI_LAST); HTREEITEMhsetup=m_ctrltree.InsertItem("设置",1,2,hRootItem,TVI_LAST); HTREEITEMhmanage=m_ctrltree.InsertItem("管理",1,2,hRootItem,TVI_LAST); HTREEITEMhset_school=m_ctrltree.InsertItem("学院设置",2,2,hsetup,TVI_LAST); HTREEITEMhset_task_type=m_ctrltree.InsertItem("课题类型设置",2,2,hsetup,TVI_LAST); HTREEITEMhset_article_type=m_ctrltree.InsertItem("论文类型设置",2,2,hsetup,TVI_LAST); HTREEITEMhset_embody_level=m_ctrltree.InsertItem("级别收录设置",2,2,hsetup,TVI_LAST); HTREEITEMhset_submit_cor=m_ctrltree.InsertItem("委托单位设置",2,2,hsetup,TVI_LAST); HTREEITEMhma_horizinal=m_ctrltree.InsertItem("横向管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_verticle=m_ctrltree.InsertItem("纵向管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_article=m_ctrltree.InsertItem("论文管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_monography=m_ctrltree.InsertItem("专著管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_patent=m_ctrltree.InsertItem("专利管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_identification=m_ctrltree.InsertItem("鉴定管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_reward=m_ctrltree.InsertItem("获奖管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_expert=m_ctrltree.InsertItem("专家管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_basinfo=m_ctrltree.InsertItem("基本信息管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_store=m_ctrltree.InsertItem("转储管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_user=m_ctrltree.InsertItem("用户管理",2,2,hmanage,TVI_LAST); 时间刷新定时器设置: //TODO: Addyourmessagehandlercodehereand/orcalldefault CTimetime; intweek; time=CTime: : GetCurrentTime(); week=time.GetDayOfWeek();//获取星期几,注意1为星期天,7为星期六 CStrings=time.Format("当前时间: %Y-%m-%d%H: %M: %S星期");//月份是小写的,分钟是大写的 switch(week) { case1: s+="日";break; case2: s+="一";break; case3: s+="二";break; case4: s+="三";break; case5: s+="四";break; case6: s+="五";break; case7: s+="六";break; } m_nwndStatusBar.SetPaneText(2,s); 第六章测试与调试 1.测设用例设计 用例ID 问题描述 输入数据 预期输出 实际输出 1 登陆界面,用户名错误 用户名: aaaa 密码: aaaa 提示用户名错误 弹出提示框,提示用户名错误(图c_1) 2 登陆界面,没有任何信息 用户名: 空 密码: 空 提示为空 弹出提示框,提示填写完整后再登陆(图c_2) 3 登陆界面,密码错误 用户名: admin 密码: admi 提示密码错误 弹出提示框,提示密码错误(图c_3) 4 登陆界面,全部正确,超级管理员 用户名: admin 密码: admin 进入主界面状态栏显示“超级管理员” 进入主界面状态栏显示“超级管理员” 5 登陆界面,全部正确,一般管理员 用户名: rsq 密码: 342601 进入主界面状态栏显示“管理员” 进入主界面状态栏显示“管理员”,沿树形目录打开“用户管理”时,用户权限位是“普通用户” 6 登陆界面,全部正确,普通用户 用户名: PT 密码: PT 进入主界面状态栏显示“普通用户” 进入主界面状态栏显示“普通用户”,沿树形目录打开“用户管理”时,用户权限位是“普通用户”,且没有增加和删除功能 用例ID 问题描述 输入数据 预期输出 实际输出 7 主功能模块,增加用户,以超级管理员身份登陆 用户名: ren 密码: ren 用户: ren 用户权限: 普通用户 提示: 增加用户成功,数据库中用户记录增加一条 提示: 增加用户成功(图c_4),数据库中用户记录增加一条 8 主功能模块,增加用户,以超级管理员身份登陆 用户名: sheng 密码: sheng 用户: sheng 用户权限: 普通用户 资料不完整,增加用户失败 提示: 增加失败,资料不完整(图c_5) 9 主功能模块,删除用户,管理员身份登陆 在list框中选择一条要删除的记录,单击删除 删除成功,数据库中减少一条记录 提示: 成功删除(图c_6) 10 主功能模块,修改用户信息,普通用户登陆 列表框中之后自己的信息,单击选中,修改信息后,选择“修改” 修改成功,数据库中的数据发生相应改变 提示: 修改成功,数据库中的书库发生相应变化(图c_7) 11 主功能模块,修改用户信息,普通用户登陆 列表框中之后自己的信息,单击选中,修改信息,使得用户不全,单击“修改”按钮 修改失败 提示: 修改失败,资料不完整(图c_8); 12 主功能模块,单击树形控件中的其他项目,检查界面发生的变化 在界面为用户管理界面时,单击“纵向管理” 界面发生改变,详细信息部分变成纵向管理的界面,同时,列表框中的数据变成纵向项目的数据 界面发生改变,详细信息部分变成纵向管理的界面,同时,列表框中的数据变成纵向项目的数据 13 主功能界面初始化数据 单击“纵向管理” 详细信息模块变成“纵向管理”模块的界面,在下来选择框中,委托单位,项目类别,以及参加人的院的待选项为从数据库基础信息中读入的信息 详细信息模块变成“纵向管理”模块的界面,在下来选择框中,委托单位,项目类别,以及参加人的院的待选项为从数据库基础信息中读入的信息 图c_1图c_2图c_3 图c_4图c_5图c_6 图c_7图c_8 2.发现的问题 a.当用户在增加或者删除一条记录后,在列表框中没有及时更新其容,必须要到树形控件中重新单击一次该容对应的树形目录,才能刷新。 原因在于子对话框成员函数无法调用父对话框成员函数。 可以通过自己生成一个消息的形式来解决,即为父对话框(系统主界面)设计一个消息,然后每次子窗口增加,修改或删除一条记录后,将这个消息发送给操作系统,让操作系统来通知主界面的及时更新。 b.在设计数据库时,为了体现各表间的关系,外键设置的比较复杂。 但是,在用系统时,经常会发生破坏这种依赖关系的操作,导致操作失败。 不知道能否找到一个权衡点,来平衡这种操
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 试验报告