C语言实现员工管理系统

这俩天写了一个小玩具程序,算一个长期以来的热门题目就是《xxx管理系统》。大致的意思整个程序分为客户端和服务器段,客户端通过登录验证后,对信息进行处理,并且客户端分为了普通用户和管理员。至于员工信息这些数据,舍弃了数据库的做法,改用读写普通文件的方式存放数据。

使用流程大致如下图所示

C语言实现员工管理系统_第1张图片


而服务器端和客户端都有不同的设计流程

客户端主要为,用户登录,录入或者查询信息,发送到服务器端,接收服务器端返回的消息

服务器端主要为,监听客户端连接,接收客户端消息,根据消息类型做出不同的操作,并更新存储信息的文件,发送反馈信息到客户端。

为此我们需要封装一些数据结构。大致有三个:

(1)消息结构体,主要负责携带网络传输的数据,其中包含消息的类型,消息的发送方,用户信息等等。

(2)用户信息结构体,主要为用户的详细信息,用于查看修改。

(3)用户结构体,包含用户名和密码,用于登录。

/**********************************************************/

以下为代码大致框架

1.服务器端

int main(int argc, const char *argv[])
{
	pthread_t client_th;  //定义线程号
	socket_set  //tcp网络设置
	open the file    //打开文件 
	init the file	//初始化文件,写入必要的信息
	read the file	//重新读取文件,将数据放入内存中
	/**socket 编程,循环监听,开启新的线程*/
	while(1)
	{
		if((acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen))<0)
		{
			errlog("fail to accept");
		}
		printf("Ip:%s,bind:%d.\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
		
		if(acceptfd>0)
		{
			pthread_create(&client_th,NULL,(void *)client_fun,(void *)acceptfd);
			printf("new thread = %lu  join.\n",client_th);
			pthread_detach(client_th);
		}
	}
	close(sockfd);	
	close(fp_info);
	close(fp_user);
	return 0;	
#endif

}

#if 1
/**
 *@arg socket描述符
 *@brief 开线程与客户端连接
 */
void *client_fun(void *arg)
{
	MSG msg;   //消息结构体
	int acceptfd=(int)arg; 
	while(1)
	{
		if(recv(acceptfd,&msg,sizeof(MSG),0)<0)
		{
			errlog("fail to recv");
		}
		/**根据消息类型做出不同的操作**/
		switch(msg.type)
		{
			case READ:	//查询用户信息
			do_selectuser(acceptfd,&msg);break;
			case CHANGE:	//修改用户信息
			do_modifyuser(acceptfd,&msg);break;
			case DELETE:	//删除用户
			do_deluser(acceptfd,&msg);break;
			case ADD:	//添加用户
			do_adduser(acceptfd,&msg);break;
			case LOAD:	//用户申请登录
			do_loaduser(acceptfd,&msg);break;
			case QUIT:	 //用户退出时发给服务器的通知消息
			do_quituser(acceptfd,&msg);break;
			default:
			break;
		}
	
	}	
	close(acceptfd);
	return NULL;
}
#endif

/**用户登录申请处理*/
int do_loaduser(int sockfd, MSG *msg)
{
}
/**申请新增用户处理*/
int do_adduser(int sockfd, MSG *msg)
{
}
/**申请修改用户信息处理*/
int do_modifyuser(int sockfd, MSG *msg)
{	
}
/**申请查看用户信息处理*/
int do_selectuser(int sockfd, MSG *msg)
{	
}
/**用户申请退出处理*/
int do_quituser(int sockfd, MSG *msg)
{	
}


2.客户端

static int status=0;	//运行状态
static char user[N_SIZE]={0}; //当前用户名
static int  current_no = 0; //当前用户ID

int main(int argc,const char *argv[])
{
	socket_set  //tcp网络设置
	/**发送连接请求*/
	if(connect(sockfd, (struct sockaddr *)&serveraddr, addrlen) < 0)
	{
		errlog("fail to connect");
	}
   /**连接成功后进入登录页面*/
	while(1)
	{
		while((status==RUN_1))	//初始登录界面
		{
			my_printf("1.login  2.quit ");
			printf("input your choice: ");
			scanf("%d",&cho_num);
			REMLINE;
			switch(cho_num)
			{
				case 1:
				do_login(sockfd,msg);break; //选择登录
				case 2:
				do_quit(sockfd,msg);break;	//选择退出
				default:
				puts("input error,please try again");	
				break;
			}
		}
		while((status==RUN_2))	//管理员登录后的操作界面
		{
			my_printf("1.add    2.delete    3.modify	4.select 	5.quit");
			printf("input your choice:");
			scanf("%d",&cho_num);
			REMLINE;
			switch(cho_num)
			{
				case 1:
				do_add(sockfd,msg);break; //申请添加用户
				case 2:
				do_delect(sockfd,msg);break;	//申请删除用户
				case 3:
				do_modify(sockfd,msg);break; //申请修改用户
				case 4:
				do_select(sockfd,msg);break; //申请查询用户
				case 5:
				do_quit(sockfd,msg);break;   //申请退出
				default:
				puts("input error,please try again:");	
				break;
			}
		}
		while((status==RUN_3))	////普通员员登录后的操作界面
		{
			my_printf("1.modify	  2.select 	3.quit");
			printf("input your choice:");
			scanf("%d",&cho_num);
			switch(cho_num)
			{
				case 1:
				do_modify(sockfd,msg);break;	//申请修改用户
				case 2:
				do_select(sockfd,msg);break;	//申请查询用户
				case 3:
				do_quit(sockfd,msg);break;		 //申请退出
				default:
				puts("input error,please try again:");	
				break;
			}
		}
	}	
	close(sockfd);
	return 0;
}
/**申请登录*/
int do_login(int sockfd,MSG *msg)
{
}
/**申请增加新的用户*/
int do_add(int sockfd,MSG *msg)
{
}
/**申请查看用户信息,非管理员模式下只能查看自己的信息
 *用户名和用户ID(name,和no)全部输入正确才能查看
 */
int do_select(int sockfd,MSG *msg)
{
}
/**申请修改用户信息,非管理员模式下只能修改自己的信息
 *用户名和用户ID(name,和no)全部输入正确才能修改
 */
int do_modify(int sockfd,MSG *msg)
{
}
/**申请退出*/
int do_quit(int sockfd,MSG *msg)
{
} 

 
 
 
 
 
 
 
 
 
 


这样我们俩个框架就写好了,剩下的就是补全数据类型,填充各个函数了。

对于读文件的操作,我们使用二进制文件,然后用open,read,write,read。就可以按照先定义好的数据结构,去读写这些文件。

例如操作一个二进制文件,user.dat,我们可以直接按定义好的结构体USER去读写该文件。省去了我们处理文本文件的各种复杂操作。

int main(int argc, const char *argv[])
{
	int fp = open("user.dat",O_RDWR);
	USER usr[MAX_USR];
	int usrlen =sizeof(USER);
	int i=0;
	while(read(fp,&usr[i],usrlen)!=0);
	{
		i++;
	}
	printf("i = %d.\n",i);
	while(i--)
	{
		printf("id = %d.\nname = %s.\npassword = %s.\n",usr[i].type,usr[i].name,usr[i].passwd);
	}
	close(fp);

	return 0;
}

好了,有了这些代码,大家基本就可以写一个xx管理系统了。

最后会有我自己写的程序的下载链接。

http://download.csdn.net/download/u010916862/9896853

你可能感兴趣的:(网络编程,数据结构)