C语言实现员工管理系统

论坛 期权论坛 期权     
匿名技术用户   2020-12-28 20:05   7957   0

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

使用流程大致如下图所示



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

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

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

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

(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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP