详细设计说明书草稿.docx
- 文档编号:7083040
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:31
- 大小:43.52KB
详细设计说明书草稿.docx
《详细设计说明书草稿.docx》由会员分享,可在线阅读,更多相关《详细设计说明书草稿.docx(31页珍藏版)》请在冰豆网上搜索。
详细设计说明书草稿
课表查询系统
详细设计说明书
项目名称:
课表查询系统
指导老师:
穆海伦
第一作者:
吴灶民13055235
小组成员:
陈路13055310
杨维东13055237
李晨阳13055318
完成日期:
2016/7/12
界面设计
教师端界面
实现的功能有:
1.教师登录
2.选课信息的添加和删除
3.特定学生课表查询
4.所有课程信息查询
5.某一课程选课人数
6.统计某一学生的所有选课信息
7.统计某一课程的所有学生信息
学生端界面
实现的功能有:
1.学生登录
2.学生个人课表查询
数据包的结构体及各种宏定义
#definePKT_LOGIN_11
#definePKT_LOGIN_22
#definePKT_LOGINREPLY3
#definePKT_STUDENT_SEARCH4
#definePKT_STUDENT_REPLY5
#definePKT_ADD6
#definePKT_DELETE7
#definePKT_ADD_REPLY8
#definePKT_DELETE_REPLY9
#definePKT_COUNT10
#definePKT_COUNT_REPLY11
#definePKT_SHOW12
#definePKT_SHOW_REPLY13
#definePKT_COURSE_STUDENT14
#definePKT_COURSE_STUDENT_REPLY15
#definePKT_STUDENT_TABLE16
#definePKT_STUDENT_TABLE_REPLY17
typedefstructCourse
{
charCno[10];
charCname[10];
charCtype[10];
doublecredit;
charTeacherName[10];
charCtime[50];
charCplace[10];
intCyear;
intCterm;
intChour;
}Course;
typedefstructCourseTable
{
charCname[10];
charCtime[50];
charTeacherName[10];
charCplace[10];
inttime;
intweek;
}CourseTable;
typedefstructPktHeader
{
intpktType;
}PktHeader;
typedefstructLoginPkt_1//学生端登陆包
{
PktHeaderheader;
intSNo;
charpassword[20];
}LoginPkt_1;
typedefstructLoginPkt_2//教务端登录包
{
PktHeaderheader;
intTNo;
charpassword[20];
}LoginPkt_2;
typedefstructLoginReplyPkt//登陆对应
{
PktHeaderheader;
intret;
}LoginReplyPkt;
typedefstructStudentSearchPkt//学生端课表查询请求
{
PktHeaderheader;
intSNo;
intyear;
intterm;
}StudentSearchPkt;
typedefstructStudentReplyPkt//学生端课表查询回应
{
PktHeaderheader;
Coursecourse;
}StudentReplyPkt;
typedefstructAddPkt//教务端课表信息添加
{
PktHeaderheader;
intSNo;
charCNo[10];////////////////////////////////////修改处
}AddPkt;
typedefstructDeletePkt//教务端课表信息删除
{
PktHeaderheader;
intSNo;
charCNo[10];///////////////////////////修改处
}DeletePkt;
////////////////////////////////
typedefstructAddReplyPkt
{
PktHeaderheader;
intis_success;
}AddReply;
typedefstructDeleteReplyPkt
{
PktHeaderheader;
intis_success;
}DeleteReplyPkt;
//////////////////////////////
//教务端课表查询请求和回应包
typedefstructCountPkt
{
PktHeaderheader;
charCno[10];
intSno;
}CountPkt;
typedefstructCountReplyPkt
{
PktHeaderheader;
intnum;
intis_success;
}CountReplyPkt;
//教务端统计请求和回应包
typedefstructShowPkt
{
PktHeaderheader;
}ShowPkt;
typedefstructShowReplyPkt
{
PktHeaderheader;
Coursecourse;
}ShowReplyPkt;
typedefstructCourseStudentPkt
{
PktHeaderheader;
charCNo[10];
}CourseStudentReply;
typedefstructCourseStudentReplyPkt
{
PktHeaderheader;
charCNo[10];
charCName[10];
intSNo;
charSName[10];
intis_success;
}CourseStudentReplyPkt;
typedefstructStudentTablePkt
{
PktHeaderheader;
intSNo;
intyear;
intterm;
}StudentTablePkt;
typedefstructStudentTableReplyPkt
{
PktHeaderheader;
Coursecourse;
}StudentTableReplyPkt;
功能实现
登录功能:
使用socket套接字也服务器建立UDP连接
WSADATAwsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
m_hSocket=socket(AF_INET,SOCK_DGRAM,0);
memset(&m_srvAddr,0,sizeof(structsockaddr_in));
m_srvAddr.sin_family=AF_INET;
m_srvAddr.sin_addr.s_addr=inet_addr((LPCTSTR)"192.168.1.103");
m_srvAddr.sin_port=htons(8888);约定使用8888端口
将登录信息发送给服务器
sendto(m_hSocket,(char*)(&pkt),8+strlen(pkt.password),0,(structsockaddr*)(&m_srvAddr),sizeof(sockaddr_in));
接收服务器端的反馈信息,判定是否为合法用户
recvfrom(m_hSocket,recvbuff,sizeof(recvbuff),0,(structsockaddr*)(&m_srvAddr),&len);
添加修改功能
收集输入框中的信息并发送给服务器端
AddPktpkt;
pkt.header.pktType=PKT_ADD;
pkt.SNo=SNo;
strcpy(pkt.CNo,(LPCTSTR)CNo);
sendto(m_hSocket,(char*)(&pkt),8+strlen(pkt.CNo),0,(structsockaddr*)(&m_srvAddr),sizeof(sockaddr_in));
接收服务器的反馈信息,判定是否添加成功
recvfrom(m_hSocket,recvbuff,sizeof(recvbuff),0,(structsockaddr*)(&m_srvAddr),&len);
查询功能
收集输入框中的信息并发送给服务器端
CountPktpkt;
pkt.header.pktType=PKT_COUNT;
pkt.Sno=SNo_Search;
strcpy(pkt.Cno,(LPCTSTR)CNo_Search);
sendto(m_hSocket,(char*)(&pkt),sizeof(CountPkt),0,(structsockaddr*)(&m_srvAddr),sizeof(sockaddr_in));
接收服务器的反馈信息,把反馈回来的信息分情况处理在界面呈现
recvfrom(m_hSocket,recvbuff,sizeof(recvbuff),0,(structsockaddr*)(&m_srvAddr),&len);
CountReplyPkt*pkt2=(CountReplyPkt*)recvbuff;
统计选课人数
if(strlen((LPCTSTR)CNo_Search)!
=0)
{
AppendMsg("\r\n");
AppendMsg("人选");
chark[10]={0};
itoa(pkt2->num,k,10);
AppendMsg(k);
AppendMsg("有");
AppendMsg(CNo_Search);
AppendMsg("课程");
AppendMsg("\r\n");
}
统计某一个学生选课数量
if(SNo_Search!
=0)
{
AppendMsg("\r\n");
AppendMsg("门课");
chark[10]={0};
itoa(pkt2->num,k,10);
AppendMsg(k);
AppendMsg("选了");
chard[10]={0};
itoa(SNo_Search,d,10);
AppendMsg(d);
AppendMsg("学生");
AppendMsg("\r\n");
}
查询课程信息
if(pkt2->header.pktType==PKT_SHOW_REPLY)
{
charstr[10];
sprintf(str,"%f",pkt2->course.credit);
AppendMsg("\r\n");
chark[10]={0};
itoa(pkt2->course.Chour,k,10);
AppendMsg(k);
AppendMsg("每周学时:
");
AppendMsg("");
chard[10]={0};
itoa(pkt2->course.Cterm,d,10);
AppendMsg(d);
AppendMsg("学期:
");
AppendMsg("");
charm[10]={0};
itoa(pkt2->course.Cyear,m,10);
AppendMsg(m);
AppendMsg("学年:
");
AppendMsg("");
AppendMsg(pkt2->course.Cplace);
AppendMsg("");
AppendMsg(pkt2->course.Ctime);
AppendMsg("");
AppendMsg(pkt2->course.TeacherName);
AppendMsg("");
AppendMsg(str);;
AppendMsg("学分:
");
AppendMsg("");
AppendMsg(pkt2->course.Ctype);
AppendMsg("");
AppendMsg(pkt2->course.Cno);
AppendMsg("");
AppendMsg("课程号:
");
AppendMsg(pkt2->course.Cname);
}
服务器端功能实现
在服务器端开启时加载已有的用户信息
boolLoadDB(constchar*DBName);
判定客户端发送的登录信息是否合法
boolIsValidUser(constintname,constchar*password);
学生查询功能实现
voidStudentSearch(constintSNo,constintyear,constintterm,SOCKETs,StudentReplyPktpkt,structsockaddr*clientAddr);
添加选课信息
voidAddStudentCourse(constintSNo,constcharCNo[10],SOCKETs,AddReplyPktpkt,structsockaddr*clientAddr);
删除选课信息
voidDeleteStudentCourse(constintSNo,constcharCNo[10],SOCKETs,DeleteReplyPktpkt,structsockaddr*clientAddr);
统计人数
voidCount(constintSNo,constcharCNo[10],SOCKETs,CountReplyPktpkt,structsockaddr*clientAddr);
查询个人课表
voidStudentTable(constintSNo,constintyear,constintterm,SOCKETs,StudentTableReplyPktpkt,structsockaddr*clientAddr);
查询某一课程的学生信息
voidCourseStudent(constcharCNo[10],SOCKETs,CourseStudentReplyPktpkt,structsockaddr*clientAddr);
接收来自客户端数据包,分析其需要的服务并调用相应的功能函数
voidProcessPkt(constchar*recvBuff,SOCKETs,structsockaddr*clientAddr);
intmain(intargc,char*argv[])
{
LoadDB("SchoolSystem");用户信息初始化
WSADATAwsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
SOCKETsListen=socket(AF_INET,SOCK_DGRAM,0);创建socket
sockaddr_inlocal;创建本地实体
memset(&local,0,sizeof(local));
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)8888);
循环接收数据包
while(true)
{
intret=recvfrom(sListen,recvBuff,sizeof(recvBuff),0,
(structsockaddr*)&clientAddr,&clientAddrLen);
ProcessPkt(recvBuff,sListen,(structsockaddr*)&clientAddr);
}
closesocket(sListen);退出时关闭socket
return0;
}
voidProcessPkt(constchar*recvBuff,SOCKETs,structsockaddr*clientAddr)
{
intpktType=((PktHeader*)recvBuff)->pktType;对数据进行识别
当类型为学生登录
if(pktType==PKT_LOGIN_1)
{
LoginPkt_1*pkt=(LoginPkt_1*)recvBuff;
if(!
IsValidUser(pkt->SNo,pkt->password))判定是否合法
{
LoginReplyPktreply;
reply.header.pktType=PKT_LOGINREPLY;
reply.ret=0;//0failure;1success
sendto(s,(char*)(&reply),8,0,clientAddr,sizeof(structsockaddr));
return;
}
else
{
LoginReplyPktreply;
reply.header.pktType=PKT_LOGINREPLY;
reply.ret=1;//0failure;1success;
sendto(s,(char*)(&reply),8,0,clientAddr,sizeof(structsockaddr));
}
}
当类型为教师登录
elseif(pktType==PKT_LOGIN_2)
{
LoginPkt_2*pkt=(LoginPkt_2*)recvBuff;
intTno=10000;
charTpassword[20]="123456";
if(pkt->TNo!
=Tno||strcmp(pkt->password,Tpassword)!
=0)
{
LoginReplyPktreply;
reply.header.pktType=PKT_LOGINREPLY;
reply.ret=0;//0failure;1success
sendto(s,(char*)(&reply),8,0,clientAddr,sizeof(structsockaddr));
return;
}
else
{
LoginReplyPktreply;
reply.header.pktType=PKT_LOGINREPLY;
reply.ret=1;//0failure;1success;
sendto(s,(char*)(&reply),8,0,clientAddr,sizeof(structsockaddr));
}
}
当类型为学生查询
elseif(pktType==PKT_STUDENT_SEARCH)
{
StudentSearchPkt*pkt=(StudentSearchPkt*)recvBuff;
StudentReplyPktstudentreplypkt={0};
studentreplypkt.header.pktType=PKT_STUDENT_REPLY;
StudentSearch(pkt->SNo,pkt->year,pkt->term,s,studentreplypkt,clientAddr);
}
当类型为选课添加
elseif(pktType==PKT_ADD)
{
AddPkt*pkt=(AddPkt*)recvBuff;
AddReplyPktaddreplypkt={0};
addreplypkt.header.pktType=PKT_ADD_REPLY;
AddStudentCourse(pkt->SNo,pkt->CNo,s,addreplypkt,clientAddr);
}
当类型为选课删除
elseif(pktType==PKT_DELETE)
{
DeletePkt*pkt=(DeletePkt*)recvBuff;
DeleteReplyPktdeletereplypkt={0};
deletereplypkt.header.pktType=PKT_DELETE_REPLY;
DeleteStudentCourse(pkt->SNo,pkt->CNo,s,deletereplypkt,clientAddr);
}
当类型为统计
elseif(pktType==PKT_COUNT)
{
CountPkt*pkt=(CountPkt*)recvBuff;
CountReplyPktcountreplypkt={0};
countreplypkt.header.pktType=PKT_COUNT_REPLY;
Count(pkt->SNo,pkt->CNo,s,countreplypkt,clientAddr);
}
当类型为课程查询
elseif(pktType==PKT_SHOW){
ShowPkt*pkt=(ShowPkt*)recvBuff;
ShowReplyPktshowreplypkt={0};
sh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详细 设计 说明书 草稿