华清远见(上海中心)

员工信息管理系统 

 1、总体功能介绍

  1. 实现员工普通账号和管理员超级账号的登录,并对应进入不同的系统界面

  2. 用普通账号登录只能实现自己账号信息的查看和修改

  3. 用超级账号登录则能够实现管理员功能,比如,员工的添加,各个员工各项信息的修改、删除、删除历史记录等

2、具体功能实现原理

     1. 系统基于TCP协议实现TCP并发服务器和客户端对多个用户的接入,并sqlite3 数           据库进行操作

     2、TCP并发服务器采用多进程的方式实现,子进程负责交互,父进程负责连接

     3、TCP服务器与客户端的数据传输采用的是自己定义的数据包

     4、TCP客户端对用户的指令进行识别,并用自己定义的数据包发送给服务器,服务          器,服务器解析数据包,并转化成对应的命令进行判断。

     5、对客户端传过来的命令转化成对应sqlite3数据库操作命令,并对操作结果进行            及时的封包回传。

     6、采用TCP服务器的是因为TCP服务器传输数据稳定,适合本项目需求

3、实现流程

服务器:https://note.youdao.com/yws/public/resource/a993e7c2f42a02d4b9f649217b7b2d9d/xmlnote/WEB04bbcea6199e34c3825b96b9b67dd866/WEBRESOURCE3687f1dcfaccd2052c4709b6a48e4d5d/9699客户端:

https://note.youdao.com/yws/public/resource/a993e7c2f42a02d4b9f649217b7b2d9d/xmlnote/WEB04bbcea6199e34c3825b96b9b67dd866/WEBRESOURCE1902ff9442160d2cb117c50340ddab95/9701

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"
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值