员工信息管理系统
1、总体功能介绍
-
实现员工普通账号和管理员超级账号的登录,并对应进入不同的系统界面
-
用普通账号登录只能实现自己账号信息的查看和修改
-
用超级账号登录则能够实现管理员功能,比如,员工的添加,各个员工各项信息的修改、删除、删除历史记录等
2、具体功能实现原理
1. 系统基于TCP协议实现TCP并发服务器和客户端对多个用户的接入,并sqlite3 数 据库进行操作
2、TCP并发服务器采用多进程的方式实现,子进程负责交互,父进程负责连接
3、TCP服务器与客户端的数据传输采用的是自己定义的数据包
4、TCP客户端对用户的指令进行识别,并用自己定义的数据包发送给服务器,服务 器,服务器解析数据包,并转化成对应的命令进行判断。
5、对客户端传过来的命令转化成对应sqlite3数据库操作命令,并对操作结果进行 及时的封包回传。
6、采用TCP服务器的是因为TCP服务器传输数据稳定,适合本项目需求
3、实现流程
4、效果实现
链接:https://pan.baidu.com/s/1D6tB-I9fPq0T7fRBJcN6ZA
提取码:qjge
5、总结
1、根据需求画出相应的流程图
2、逻辑要清晰
3、注释要简洁明了
4、代码要工整,健壮性
5、功能要完善,全面,考虑到各种使用场景,增强代码的实用性
6、代码实现
#include "TCP.h"
int rcv_cli_msg(int newfd,struct sockaddr_in cin,sqlite3* db)
{
int res;
MSG m;
while(1)
{
//接收
printf("正在等待接收\n");
res = recv(newfd,&m,sizeof(m),0);
if(res<0)
{
ERR_MSG("recv");
return -1;
}
else if(0 == res)
{
fprintf(stderr, "[%s:%d] newfd=%d 客户端关闭\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
break;
}
//判断客户端是哪种功能请求
switch (m.msgtype)
{
case 1://登录请求
login_request(m,newfd,db);
break;
case 2://普通用户查询请求
find_request(m,newfd,db);
break;
case 3://普通用户修改请求
revise_request(m,newfd,db);
break;
case 4://root用户查询请求
root_find_request(m,newfd,db);
break;
case 5://root用户添加请求
root_add_request(m,newfd,db);
break;
case 6://root用户修改请求
root_revise_request(m,newfd,db);
break;
case 7://root用户删除请求
root_delete_request(m,newfd,db);
break;
case 8://root用户查询历史记录请求
root_find_hrequest(m,newfd,db);
break;
case 9://退出请求
quit(m,newfd,db);
break;
case 10://删除登录记录
delete_lodin(m,newfd,db);
break;
case 11://删除历史记录
delete_history(m,newfd,db);
break;
default:
break;
}
}
}
//登录请求
void login_request(MSG m,int newfd,sqlite3* db)
{
char buf[128]="";
char sql[128]="";
int row,column;
char* errmsg=NULL;
char** pres;
sprintf(sql,"select * from lodgin where name=\"%s\";",m.username);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table: %s\n", __LINE__, errmsg);
return ;
}
printf("登录查询数据表成功\n");
if(row<1)
{
//未重复登陆
printf("%d\n",m.usertype);
sprintf(sql,"select * from stu where name=\"%s\" and passwd=\"%s\";",m.username,m.passwd);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table: %s\n", __LINE__, errmsg);
return ;
}
if(row<1)
{
bzero(m.recvmsg,sizeof(m.recvmsg));
strcpy(m.recvmsg,"登录失败,请重新输入!");
if(send(newfd,(void*)&m,sizeof(m),0)<0)
{
ERR_MSG("send");
return ;
}
}
if(row>0)
{
bzero(sql,sizeof(sql));
struct tm info = timer();
sprintf(buf,"%d-%02d-%02d %02d:%02d:%02d",info.tm_year+1900, info.tm_mon+1, info.tm_mday,info.tm_hour, info.tm_min, info.tm_sec);
sprintf(sql,"insert into lodgin values (\"%s\",'%s');",buf,m.username);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_exec: %s\n", __LINE__, errmsg);
return ;
}
printf("%d\n",row);
bzero(m.recvmsg,sizeof(m.recvmsg));
strcpy(m.recvmsg,"1");
if(send(newfd,&m,sizeof(m),0)<0)
{
ERR_MSG("send");
return ;
}
printf("登录信息回复成功\n");
char addr[50]="";
sprintf(addr,"登录账号!");
bzero(sql,sizeof(sql));
sprintf(buf,"%d-%02d-%02d %02d:%02d:%02d",info.tm_year+1900, info.tm_mon+1, info.tm_mday,info.tm_hour, info.tm_min, info.tm_sec);
sprintf(sql,"insert into history values (\"%s\",'%s','%s');",buf,m.username,addr);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_exec: %s\n", __LINE__, errmsg);
return ;
}
printf("%s登录并且备份成功\n",m.username);
}
}
else//重复登陆
{
bzero(m.recvmsg,sizeof(m.recvmsg));
strcpy(m.recvmsg,"重复登录!");
if(send(newfd,(void*)&m,sizeof(m),0)<0)
{
ERR_MSG("send");
return ;
}
}
}
//普通用户查询请求
void find_request(MSG m,int newfd,sqlite3* db)
{
char sql[128]="";
char buf[128]="";
char addr[128]="";
int row,column;
char* errmsg=NULL;
char** pres;
sprintf(sql,"select * from stu where name=\"%s\";",m.username);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table: %s\n", __LINE__, errmsg);
return ;
}
if(row<1)
{
bzero(m.recvmsg,sizeof(m.recvmsg));
strcpy(m.recvmsg,"查询失败,请重新输入!");
if(send(newfd,&m,sizeof(m),0)<0)
{
ERR_MSG("send");
return ;
}
}
if(row>0)
{
bzero(m.recvmsg,sizeof(m.recvmsg));
bzero(sql,sizeof(sql));
printf("%s用户正在查询!!\n",m.username);
struct tm info = timer();
sprintf(addr,"%s用户查询",m.username);
sprintf(buf,"%d-%02d-%02d %02d:%02d:%02d",info.tm_year+1900, info.tm_mon+1, info.tm_mday,info.tm_hour, info.tm_min, info.tm_sec);
sprintf(sql,"insert into history values (\"%s\",'%s','%s');",buf,m.username,addr);
char *errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_exec: %s\n", __LINE__, errmsg);
return ;
}
int k=column;
for(int i=0; i<(row); i++)
{
for(int j=0;j<column;j++)
{
strcat(m.recvmsg,pres[k++]);
strcat(m.recvmsg," ");
}
strcat(m.recvmsg,"\n"