详细设计说明书草稿.doc_第1页
详细设计说明书草稿.doc_第2页
详细设计说明书草稿.doc_第3页
详细设计说明书草稿.doc_第4页
详细设计说明书草稿.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课表查询系统详细设计说明书项目名称:课表查询系统 指导老师:穆海伦 第一作者:吴灶民13055235小组成员:陈路13055310 杨维东13055237李晨阳 13055318完成日期:2016/7/12界面设计教师端界面实现的功能有:1. 教师登录2. 选课信息的添加和删除3. 特定学生课表查询4. 所有课程信息查询5. 某一课程选课人数6. 统计某一学生的所有选课信息7. 统计某一课程的所有学生信息学生端界面实现的功能有:1. 学生登录2. 学生个人课表查询数据包的结构体及各种宏定义#define PKT_LOGIN_11#define PKT_LOGIN_22#define PKT_LOGINREPLY3#define PKT_STUDENT_SEARCH4#define PKT_STUDENT_REPLY5#define PKT_ADD6#define PKT_DELETE7#define PKT_ADD_REPLY8#define PKT_DELETE_REPLY9#define PKT_COUNT10#define PKT_COUNT_REPLY11#define PKT_SHOW12#define PKT_SHOW_REPLY13#define PKT_COURSE_STUDENT14#define PKT_COURSE_STUDENT_REPLY15#define PKT_STUDENT_TABLE16#define PKT_STUDENT_TABLE_REPLY17typedef struct Coursechar Cno10;char Cname10;char Ctype10;double credit;char TeacherName10;char Ctime50;char Cplace10;int Cyear;int Cterm;int Chour;Course;typedef struct CourseTablechar Cname10;char Ctime50;char TeacherName10;char Cplace10;int time;int week;CourseTable;typedef struct PktHeaderint pktType;PktHeader;typedef struct LoginPkt_1/学生端登陆包PktHeader header;int SNo;char password20;LoginPkt_1;typedef struct LoginPkt_2/教务端登录包PktHeader header;int TNo;char password20;LoginPkt_2;typedef struct LoginReplyPkt/登陆对应PktHeader header;int ret;LoginReplyPkt;typedef struct StudentSearchPkt/学生端课表查询请求PktHeader header;int SNo;int year;int term;StudentSearchPkt;typedef struct StudentReplyPkt/学生端课表查询回应PktHeader header;Course course;StudentReplyPkt;typedef struct AddPkt/教务端课表信息添加PktHeader header;int SNo;char CNo10;/修改处AddPkt;typedef struct DeletePkt/教务端课表信息删除PktHeader header;int SNo;char CNo10;/修改处DeletePkt;/typedef struct AddReplyPktPktHeader header;int is_success;AddReply;typedef struct DeleteReplyPktPktHeader header;int is_success;DeleteReplyPkt;/教务端课表查询请求和回应包typedef struct CountPktPktHeader header;char Cno10;int Sno;CountPkt;typedef struct CountReplyPktPktHeader header;int num;int is_success;CountReplyPkt;/教务端统计请求和回应包typedef struct ShowPktPktHeader header;ShowPkt;typedef struct ShowReplyPktPktHeader header;Course course;ShowReplyPkt;typedef struct CourseStudentPktPktHeader header;char CNo10;CourseStudentReply;typedef struct CourseStudentReplyPktPktHeader header;char CNo10;char CName10;int SNo;char SName10;int is_success;CourseStudentReplyPkt;typedef struct StudentTablePktPktHeader header;int SNo;int year;int term;StudentTablePkt;typedef struct StudentTableReplyPktPktHeader header;Course course;StudentTableReplyPkt;功能实现登录功能:使用socket套接字也服务器建立UDP连接WSADATAwsaData;WSAStartup(MAKEWORD(2,2), &wsaData);m_hSocket = socket(AF_INET, SOCK_DGRAM, 0);memset(&m_srvAddr, 0, sizeof(struct sockaddr_in);m_srvAddr.sin_family = AF_INET; m_srvAddr.sin_addr.s_addr = inet_addr(LPCTSTR)03); m_srvAddr.sin_port = htons(8888);约定使用8888端口将登录信息发送给服务器sendto(m_hSocket, (char*)(&pkt), 8+strlen(pkt.password), 0,(struct sockaddr*)(&m_srvAddr), sizeof(sockaddr_in);接收服务器端的反馈信息,判定是否为合法用户recvfrom(m_hSocket, recvbuff, sizeof(recvbuff), 0,(struct sockaddr*)(&m_srvAddr), &len);添加修改功能收集输入框中的信息并发送给服务器端AddPkt pkt;pkt.header.pktType = PKT_ADD;pkt.SNo = SNo;strcpy(pkt.CNo, (LPCTSTR)CNo);sendto(m_hSocket, (char*)(&pkt), 8+strlen(pkt.CNo), 0,(struct sockaddr*)(&m_srvAddr), sizeof(sockaddr_in);接收服务器的反馈信息,判定是否添加成功recvfrom(m_hSocket, recvbuff, sizeof(recvbuff), 0,(struct sockaddr*)(&m_srvAddr), &len);查询功能收集输入框中的信息并发送给服务器端CountPkt pkt;pkt.header.pktType = PKT_COUNT;pkt.Sno = SNo_Search;strcpy(pkt.Cno, (LPCTSTR)CNo_Search);sendto(m_hSocket, (char*)(&pkt), sizeof(CountPkt), 0,(struct sockaddr*)(&m_srvAddr), sizeof(sockaddr_in);接收服务器的反馈信息,把反馈回来的信息分情况处理在界面呈现recvfrom(m_hSocket, recvbuff, sizeof(recvbuff), 0,(struct sockaddr*)(&m_srvAddr), &len);CountReplyPkt* pkt2 = (CountReplyPkt*)recvbuff;统计选课人数if(strlen(LPCTSTR)CNo_Search) != 0)AppendMsg(rn);AppendMsg(人选);char k10=0;itoa(pkt2-num, k, 10);AppendMsg(k);AppendMsg(有);AppendMsg(CNo_Search);AppendMsg(课程);AppendMsg(rn);统计某一个学生选课数量if(SNo_Search != 0)AppendMsg(rn);AppendMsg(门课);char k10=0;itoa(pkt2-num, k, 10);AppendMsg(k);AppendMsg(选了);char d10=0;itoa(SNo_Search, d, 10);AppendMsg(d);AppendMsg(学生);AppendMsg(rn);查询课程信息if(pkt2-header.pktType = PKT_SHOW_REPLY)char str10;sprintf(str, %f, pkt2-course.credit);AppendMsg(rn);char k10=0;itoa(pkt2-course.Chour, k,10);AppendMsg(k);AppendMsg(每周学时:);AppendMsg( );char d10=0;itoa(pkt2-course.Cterm, d, 10);AppendMsg(d);AppendMsg(学期:);AppendMsg( );char m10=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);服务器端功能实现在服务器端开启时加载已有的用户信息bool LoadDB(const char* DBName);判定客户端发送的登录信息是否合法bool IsValidUser(const int name, const char* password);学生查询功能实现void StudentSearch(const int SNo,const int year,const int term,SOCKET s, StudentReplyPkt pkt,struct sockaddr* clientAddr);添加选课信息void AddStudentCourse(const int SNo,const char CNo10,SOCKET s, AddReplyPkt pkt,struct sockaddr* clientAddr);删除选课信息void DeleteStudentCourse(const int SNo,const char CNo10,SOCKET s, DeleteReplyPkt pkt,struct sockaddr* clientAddr);统计人数void Count(const int SNo,const char CNo10,SOCKET s, CountReplyPkt pkt,struct sockaddr* clientAddr);查询个人课表void StudentTable(const int SNo,const int year,const int term,SOCKET s, StudentTableReplyPkt pkt,struct sockaddr* clientAddr);查询某一课程的学生信息void CourseStudent(const char CNo10,SOCKET s, CourseStudentReplyPkt pkt,struct sockaddr* clientAddr);接收来自客户端数据包,分析其需要的服务并调用相应的功能函数void ProcessPkt(const char* recvBuff, SOCKET s, struct sockaddr* clientAddr);int main(int argc, char* argv)LoadDB(SchoolSystem);用户信息初始化WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), & wsaData);SOCKET sListen = socket(AF_INET, SOCK_DGRAM, 0);创建socket sockaddr_in local;创建本地实体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)int ret = recvfrom(sListen, recvBuff, sizeof(recvBuff), 0, (struct sockaddr*)&clientAddr, &clientAddrLen); ProcessPkt(recvBuff, sListen, (struct sockaddr*)&clientAddr); closesocket(sListen);退出时关闭socketreturn 0;void ProcessPkt(const char* recvBuff, SOCKET s, struct sockaddr* clientAddr)int pktType = (PktHeader*)recvBuff)-pktType;对数据进行识别当类型为学生登录if(pktType = PKT_LOGIN_1)LoginPkt_1* pkt = (LoginPkt_1*)recvBuff;if(!IsValidUser(pkt-SNo, pkt-password)判定是否合法LoginReplyPkt reply;reply.header.pktType = PKT_LOGINREPLY;reply.ret = 0;/ 0 failure; 1 successsendto(s, (char*)(&reply), 8, 0, clientAddr, sizeof(struct sockaddr);return;elseLoginReplyPkt reply;reply.header.pktType = PKT_LOGINREPLY;reply.ret = 1;/ 0 failure; 1 success ; sendto(s, (char*)(&reply), 8, 0, clientAddr, sizeof(struct sockaddr);当类型为教师登录else if(pktType = PKT_LOGIN_2)LoginPkt_2* pkt = (LoginPkt_2*)recvBuff;int Tno=10000;char Tpassword20=123456;if(pkt-TNo != Tno | strcmp(pkt-password, Tpassword)!= 0)LoginReplyPkt reply;reply.header.pktType = PKT_LOGINREPLY;reply.ret = 0;/ 0 failure; 1 successsendto(s, (char*)(&reply), 8, 0, clientAddr, sizeof(struct sockaddr);return;elseLoginReplyPkt reply;reply.header.pktType = PKT_LOGINREPLY;reply.ret = 1;/ 0 failure; 1 success ; sendto(s, (char*)(&reply), 8, 0, clientAddr, sizeof(struct sockaddr);当类型为学生查询else if(pktType = PKT_STUDENT_SEARCH)StudentSearchPkt* pkt = (StudentSearchPkt*)recvBuff;StudentReplyPkt studentreplypkt=0;studentreplypkt.header.pktType = PKT_STUDENT_REPLY;StudentSearch(pkt-SNo,pkt-year,pkt-term,s,studentreplypkt,clientAddr);当类型为选课添加else if(pktType = PKT_ADD)AddPkt* pkt = (AddPkt*)recvBuff;AddReplyPkt addreplypkt=0;addreplypkt.header.pktType = PKT_ADD_REPLY;AddStudentCourse(pkt-SNo,pkt-CNo,s,addreplypkt,clientAddr);当类型为选课删除else if(pktType = PKT_DELETE)DeletePkt* pkt = (DeletePkt*)recvBuff;DeleteReplyPkt deletereplypkt=0;deletereplypkt.header.pktType = PKT_DELETE_REPLY;DeleteStudentCourse(pkt-SNo,pkt-CNo,s,deletereplypkt,clientAddr);当类型为统计else if(pktType = PKT_COUNT)CountPkt* pkt = (CountPkt*)recvBuff;CountReplyPkt countreplypkt=0;countreplypkt.header.pktType = PKT_COUNT_REPLY;Count(pkt-SNo,pkt-CNo,s,countreplypkt,clientAddr);当类型为课程查询else if(pktType = PKT_SHOW)ShowPkt* pkt =(ShowPkt*)recvBuff;ShowReplyPkt showreplypkt=0;showreplypkt.header.pktType = PKT_SHOW_REPLY;int i;for(i=0;iCNo,s,coursestudentreplypkt,clientAddr);当类型为查询某一学生特定学期的课程else if(pktType = PKT_STUDENT_TABLE)StudentTablePkt* pkt =(StudentTablePkt*)recvBuff;StudentTableReplyPkt studenttablereplypkt = 0;studenttablereplypkt.header.pktType=PKT_STUDENT_TABLE_REPLY;StudentTable(pkt-SNo,pkt-year,pkt-term,s, studenttablereplypkt,clientAddr);elseprintf(recv an unknow type packet!n);功能模块的具体代bool LoadDB(const char* DBName) MYSQL my_connection; /*这是一个数据库连接*/ int res1; /*执行sql語句后的返回标志*/int res2;MYSQL_RES *res_ptr; /*指向查询结果的指针*/ MYSQL_FIELD *field; /*字段结构指针*/ MYSQL_ROW result_row; /*按行返回的查询信息*/ int row, column; /*查询返回的行数和列数*/ mysql_init(&my_connection); if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DBName, 0, NULL, CLIENT_FOUND_ROWS) printf(数据库连接成功n);mysql_query(&my_connection, set names gbk); res1 = mysql_query(&my_connection, select Sno,Spassword from student); if (res1) printf(Error:mysql_query !n); mysql_close(&my_connection); else mysql_affected_rows(&my_connection); res_ptr = mysql_store_result(&my_connection); if (res_ptr) /*取得結果的行数和*/ column = mysql_num_fields(res_ptr); row = mysql_num_rows(res_ptr) ; int i;/*输出結果的字段名*/ for (i =1; i = row; i+) result_row = mysql_fetch_row(res_ptr); User user;=atof(result_row0); strcpy(user.password,(char *)result_row1);/printf(%d,%sn,,user.password);g_userListg_userNum+ = user; res2 = mysql_query(&my_connection, select * from course); if (res2) printf(Error:mysql_query !n); mysql_close(&my_connection); else mysql_affected_rows(&my_connection); res_ptr = mysql_store_result(&my_connection); if (res_ptr) /*取得結果的行数和*/ column = mysql_num_fields(res_ptr); row = mysql_num_rows(res_ptr) ; int i;/*输出結果的字段名*/ for (i =1; i = row; i+) result_row = mysql_fetch_row(res_ptr); Course course;strcpy(course.Cno,(char*)result_row0); strcpy(course.Cname,result_row1);strcpy(course.Ctype,(char *)result_row2);course.credit=atof(result_row3);strcpy(course.TeacherName,(char *)result_row4);strcpy(course.Ctime,(char *)result_row5);strcpy(course.Cplace,(char *)result_row6);course.Cyear=atof(result_row7);course.Cterm=atof(result_row8);course.Chour=atof(result_row9);g_courseListg_courseNum+ = course; mysql_close(&my_connection);else /*数据库连接失败*/ printf(数据库执行exe_sql连接失败!n); return true;bool IsValidUser(const int name, const char* password) /检查是否为已存在用户for(int i=0; ig_userNum; i+)if(g_userL = name&strcmp(g_userListi.password, password)= 0)return true;return false;void StudentSearch(const int SNo,const int year,const int term,SOCKET s, StudentReplyPkt pkt,struct sockaddr* clientAddr)MYSQL my_connection; /*这是一个数据库连接*/ int res; /*执行sql語句后的返回标志*/MYSQL_RES *res_ptr; /*指向查询结果的指针*/ MYSQL_FIELD *field; /*字段结构指针*/ MYSQL_ROW result_row; /*按行返回的查询信息*/ int row, column; /*查询返回的行数和列数*/ char *studentsearch;studentsearch =new char500;mysql_init(&my_connection); if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, SchoolSystem, 0, NULL, CLIENT_FOUND_ROWS) mysql_query(&my_connection, set names gbk); sprintf(studentsearch,select course.* from studentcourse,course where studentcourse.Cno=o and Sno = %d and Cyear = %d and Cterm =%d;,SNo,year,term);res = mysql_query(&my_connection, studentsearch); if (res) printf(Error:mysql_query !n); mysql_close(&my_connection); else mysql_affected_rows(&my_connection); res_ptr = mysql_store_result(&my_connection); if (res_ptr) column = mysql_num_fields(res_ptr); row = mysql_num_rows(res_ptr) ; int i; for (i =1; i = row; i+) result_row = mysql_fetch_row(res_ptr); strcpy(pkt.course.Cno,(char*)result_row0);strcpy(pkt.course.Cname,result_row1);strcpy(pkt.course.Ctype,(char *)result_row2);pkt.course.credit=atof(result_row3);strcpy(pkt.course.TeacherName,(char *)result_row4);strcpy(pkt.course.Ctime,(char *)result_row5);strcpy(pkt.course.Cplace,(char *)result_row6);pkt.course.Cyear=atof(result_row7);pkt.course.Cterm=atof(result_row8);pkt.course.Chour=atof(result_row9);sendto(s, (char*)(&pkt), sizeof(StudentReplyPkt), 0 , clientAddr, sizeof(struct sockaddr); sendto(s,0,0,0,clientAddr,sizeof(struct sockaddr);mysql_close(&my_connection);void AddStudentCourse(const int SNo,const char CNo10,SOCKET s, AddReplyPkt pkt,struct sockaddr* clientAddr)MYSQL my_connection; /*这是一个数据库连接*/ MYSQL_RES *res_ptr; /*指向查询结果的指针*/ MYSQL_FIELD *field; /*字段结构指针*/ MYSQL_ROW result_row; /*按行返回的查询信息*/ int row, column; /*查询返回的行数和列数*/ int res1;int res2;mysql_init(&my_connection); if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, SchoolSystem, 0, NULL, CLIENT_FOUND_ROWS) mysql_query(&my_connection, set names gbk); char *selectstudentcourse;selectstudentcourse =new char100;sprintf(selectstudentcourse,select * from studentcourse where Cno = %.10s and Sno = %.10d;,CNo,SNo);res1 = mysql_query(&my_connection,selectstudentcourse);if (res1) printf(Error:mysql_query !n); mysql_close(&my_connection); else res_ptr = mysql_store_result(&my_connection); if(mysql_num_rows(res_ptr) = 0)char *addstudentcourse;addstudentcourse =new char100; sprintf(addstudentcourse,insert into studentcourse select Cno,Sno from course,student where Cno = %.10s and Sno = %.10d;,CNo,SNo);/printf(%sn,addstudentcourse);res2= mysql_query(&my_connection, addstudentcourse);if (res2) printf(Error:mysql_query !n); mysql_close(&my_connection); else mysql_affected_rows(&my_connection); printf(%d 行受到影响!n, mysql_affected_rows(&my_connection);if(mysql_affected_rows(&my_connection)printf(添加成功n);pkt.is_success = 1;/ 0 用户名非法; 1 成功

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论