一.员工管理系统项目需求分析:
1.C/S 模型
2.S--》服务端实现对员工信息的管理功能 客户端通过用户名&密码实现对服务器的登录。如何实现数据的可靠传输? 客户端分为普通用户和管理员用户。
2.如何区分?
普通用户:普通用户登录后只可查看自己的信息,且可以修改自己的除薪资和职务外的信息数据 管理员用户:管理员用户可以查询所有员工的数据,也可实现所有用户的数据修改 服务器支持多用户同时访问服务器,为多用户提供服务支持。
3.客户端 客户端实现 登录、退出、查询、修改等操作 UI 可以是shell终端 或 使用 QT实现图形化界面
二代码实现:
头文件:
#ifndef __COMMON_H__
#define __COMMON_H__
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
#include <stdlib.h>
#include <time.h>
sqlite3* db;
#define ERROR(msg) do{printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
perror(msg);\
exit(-1);\
}while(0)
#define STAFF_DATABASE "staff_manage_system.db"
#define NAMELEN 16
#define DATALEN 128
#define PASSWD 8
#define ADMIN 0
#define USER 1
#define USER_LOGIN 0x00000000 //普通用户登录
#define USER_MODIFY 0x00000001 //普通用户修改
#define USER_QUERY 0x00000002 //普通用户查询
#define ADMIN_LOGIN 0x10000000 //管理者登录
#define ADMIN_MODIFY 0x10000001 //管理者修改
#define ADMIN_ADDUSER 0x10000002 //增加用户
#define ADMIN_DELUSER 0x10000004 //删除用户
#define ADMIN_QUERY 0x10000008 //管理者用户查询
#define ADMIN_HISTORY 0x10000010 //历史查询
#define QUIT 0x11111111 // 退出
typedef struct staff_info{
int no; //员工编号
int usertype; //ADMIN 0 USER 1
char name[NAMELEN];//姓名
char passwd[PASSWD];//密码
int age; // 年龄
char phone[NAMELEN]; //电话
char addr[DATALEN]; //地址
char work[DATALEN]; //职位
char date[DATALEN]; //入职年月
int level; //等级
double salary; //工资
}staff_info_t;
typedef struct {
int msgtype; //请求消息类型
int usertype; //ADMIN 1 USER 2
char username[NAMELEN]; //姓名
char passwd[PASSWD]; //密码
char recvmsg[DATALEN]; //通信的消息
int flags;
int mark; //标志位
staff_info_t info; //员工信息
}MSG;
//客户端函数
void do_user_query(int sockfd, MSG* msg);
int do_user_modify(int sockfd, MSG* msg);
void do_admin_query(int sockfd, MSG* msg);
void do_admin_modify(int sockfd, MSG* msg);
void do_admin_deluser(int sockfd, MSG* msg);
void do_admin_adduser(int sockfd, MSG* msg);
void do_admin_history(int sockfd, MSG* msg);
void user_menu(int sockfd, MSG* msg);
void admin_menu(int sockfd, MSG* msg);
int admin_or_user_login(int sockfd, MSG* msg);
int do_login(int sockfd);
//服务器函数
int process_user_or_admin_login_request(int acceptfd,MSG* msg);
void server_modify_inode(int acceptfd, MSG* msg, char* sql);
void server_modify_phone(int acceptfd,MSG* msg, char* sql);
void server_modify_passwd(int acceptfd,MSG* msg, char* sql);
void server_modify_age(int acceptfd,MSG* msg, char* sql);
void server_modify_name(int acceptfd,MSG* msg, char* sql);
void server_modify_addr(int acceptfd,MSG* msg, char* sql);
void server_modify_data(int acceptfd,MSG* msg, char* sql);
int process_user_modify_request(int acceptfd, MSG* msg);
int callback(void *argc, int f_num, char **f_value, char **f_name);
int process_user_query_request(int acceptfd, MSG* msg);
int process_admin_modify_request(int acceptfd, MSG* msg);
int process_admin_adduser_request(int acceptfd, MSG* msg);
int process_admin_deluser_request(int acceptfd, MSG* msg);
void client_getdata(char* data);
int process_admin_query_request(int acceptfd, MSG* msg);
int callback1(void *argc, int f_num, char **f_value, char **f_name);
int process_admin_history_request(int acceptfd, MSG* msg);
int process_client_quit_request(int accept, MSG* msg, fd_set* readfds);
int process_client_request(int acceptfd, MSG* msg, fd_set* readfds);
#endif
客户端代码:
#include "common.h"
int main(int argc, char const *argv[])
{
int sockfd;
int acceptfd;
ssize_t recvbytes, sendbytes;
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
socklen_t serveraddr_len = sizeof(serveraddr);
socklen_t clientaddr_len = sizeof(clientaddr);
if (-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))){
ERROR("client socket error\n");
}
//填充网络信息结构体
memset(&serveraddr, 0, sizeof(serveraddr));
memset(&clientaddr, 0, sizeof(clientaddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(5001);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (-1 == connect(sockfd, (const struct sockaddr*)&serveraddr, serveraddr_len)){
ERROR("connect error\n");
}
do_login(sockfd);
close(sockfd);
return 0;
}
客户端函数:
#include "common.h"
void do_user_query(int sockfd, MSG* msg)
{
msg->msgtype = USER_QUERY;
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_query send error\n");
}
memset(msg->recvmsg, 0 , sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_query recv error\n");
}
printf("%s\n", msg->recvmsg);
return;
}
int do_user_modify(int sockfd, MSG* msg)
{
msg->msgtype = USER_MODIFY;
char sql[DATALEN] = {0};
int choose = 0;
while (1){
printf("************************\n");
printf("1.员工编号 2.电话 3.密码 \n");
printf("4.年龄 5.姓名 6.地址\n");
printf("7.入职时间 8退出 \n ");
printf("请输入您要修改的信息>");
scanf("%d", &choose);
switch (choose){
case 1:
msg->flags = 1;
printf("请输入您要改成的编号>");
scanf("%d", &(msg->info.no));
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_modify1 send error\n");
}
memset(msg->recvmsg, 0 ,sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_modify1 recv error");
}
printf("%s\n", msg->recvmsg);
break;
case 2:
msg->flags = 2;
printf("请输入您要改成的电话>");
scanf("%s", msg->info.phone);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_modify2 send error\n");
}
memset(msg->recvmsg, 0 ,sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_modify2 recv error");
}
printf("%s\n", msg->recvmsg);
break;
case 3:
msg->flags = 3;
printf("请输入您要改成的密码>");
scanf("%s", msg->passwd);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_modify3 send error\n");
}
memset(msg->recvmsg, 0 ,sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_modify3 recv error");
}
printf("%s\n", msg->recvmsg);
break;
case 4:
msg->flags = 4;
printf("请输入您要改成的年龄>");
scanf("%d", &msg->info.age);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_age4 send error\n");
}
memset(msg->recvmsg, 0 ,sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_age4 recv error");
}
printf("%s\n", msg->recvmsg);
break;
case 5:
msg->flags = 5;
printf("请输入您要改成的姓名>");
scanf("%s", msg->username);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_name5 send error\n");
}
memset(msg->recvmsg, 0 ,sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_name5 recv error");
}
printf("%s\n", msg->recvmsg);
break;
case 6:
msg->flags = 6;
printf("请输入您要改成的地址>");
scanf("%s", msg->info.addr);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_addr6 send error\n");
}
memset(msg->recvmsg, 0 ,sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_addr6 recv error");
}
printf("%s\n", msg->recvmsg);
break;
case 7:
msg->flags = 7;
printf("请输入您要改成的登录时间>");
scanf("%s", msg->info.date);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_data7 send error\n");
}
memset(msg->recvmsg, 0 ,sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_data7 recv error");
}
printf("%s\n", msg->recvmsg);
break;
case 8:
msg->flags = 8;
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_user_data7 send error\n");
}
return 1;
break;
}
}
return 0;
}
void do_admin_query(int sockfd, MSG* msg)
{
msg->msgtype = ADMIN_QUERY;
printf("请输入您要查找的用户:");
scanf("%s", msg->username);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_admin_query send error\n");
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_admin_query recv error\n");
}
printf("%s\n", msg->recvmsg);
return;
}
void do_admin_modify(int sockfd, MSG* msg)
{
msg->msgtype = ADMIN_MODIFY;
printf("请输入您要修改的用户:");
scanf("%s", msg->info.name);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_admin_modify send error\n");
}
do_user_modify(sockfd, msg);
return;
}
void do_admin_deluser(int sockfd, MSG* msg)
{
msg->msgtype = ADMIN_DELUSER;
printf("请输入您要删除的用户:");
scanf("%s", msg->username);
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_admin_deluser send error\n");
}
memset(msg->recvmsg, 0 , sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_admin_deluser recv error\n");
}
printf("%s\n", msg->recvmsg);
return;
}
void do_admin_adduser(int sockfd, MSG* msg)
{
msg->msgtype = ADMIN_ADDUSER;
printf("请输入您要添加的编号:");
scanf("%d", &(msg->info.no));
printf("请输入您要添加的管理权限:");
scanf("%d", &(msg->usertype));
printf("请输入您的名字:");
scanf("%s", msg->username);
printf("请输入您的密码:");
scanf("%s", msg->passwd);
printf("请输入您的年龄:");
scanf("%d", &msg->info.age);
printf("请输入您的电话:");
scanf("%s", msg->info.phone);
printf("请输入您的地址:");
scanf("%s", msg->info.addr);
printf("请输入您的职位:");
scanf("%s", msg->info.work);
printf("请输入您的入职时间:");
scanf("%s", msg->info.date);
printf("请输入您的等级:");
scanf("%d", &(msg->info.level));
printf("请输入您的薪水:");
scanf("%le", &(msg->info.salary));
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("send error\n");
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_admin_adduser recv error\n");
}
printf("%s\n", msg->recvmsg);
return;
}
void do_admin_history(int sockfd, MSG* msg)
{
msg->msgtype = ADMIN_HISTORY;
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_admin_deluser send error\n");
}
while (1){
memset(msg->recvmsg, 0 , sizeof(msg->recvmsg));
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_admin_deluser recv error\n");
}
printf("%s\n", msg->recvmsg);
if (!strncmp("over", msg->recvmsg, 5)){
break;
}
printf("%s\n", msg->recvmsg);
}
}
void user_menu(int sockfd, MSG* msg)
{
int choose;
next:
while (1){
printf("*******************************\n");
printf("******1.查询 2修改 3退出****\n");
printf("********************************\n");
printf("请输入您的选择(数字)>>");
scanf("%d", &choose);
getchar();
switch (choose){
case 1:
do_user_query(sockfd, msg);
break;
case 2:
if(do_user_modify(sockfd, msg)){
goto next;
}
break;
case 3:
msg->msgtype = QUIT;
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("user_menu send error\n");
}
close(sockfd);
exit(-1);
break;
default:
printf("您输入的数字有误,请重新输入\n");
break;
}
}
return;
}
void admin_menu(int sockfd, MSG* msg)
{
int choose;
while (1){
printf("*****************************\n");
printf("**1.查询 2修改 3添加用户**\n");
printf("***4.删除用户 5历史 6退出***\n");
printf("*****************************\n");
printf("请输入您的选择(数字)>>");
scanf("%d", &choose);
getchar();
switch(choose){
case 1:
do_admin_query(sockfd, msg);
break;
case 2:
do_admin_modify(sockfd, msg);
break;
case 3:
do_admin_adduser(sockfd, msg);
break;
case 4:
do_admin_deluser(sockfd, msg);
break;
case 5:
do_admin_history(sockfd, msg);
break;
case 6:
msg->msgtype = QUIT;
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("do_login 3quit error\n");
}
close(sockfd);
exit(0);
break;
default:
printf("您输入有误,请重新输入\n");
}
}
}
int admin_or_user_login(int sockfd, MSG* msg)
{
//输入用户名和密码
memset(msg->username, 0, NAMELEN);
printf("请输入您的用户名>");
scanf("%s", msg->username);
getchar();
memset(msg->passwd, 0, PASSWD);
printf("请输入您的密码(6位)>");
scanf("%s", msg->passwd);
getchar();
if (-1 == send(sockfd, msg, sizeof(MSG), 0)){
ERROR("admin_or_user_login send error\n");
}
if (-1 == recv(sockfd, msg, sizeof(MSG), 0)){
ERROR("admin_or_user_login recv error\n");
}
if (!strncmp(msg->recvmsg, "ok", 3)){
if (msg->usertype == ADMIN){
printf("亲爱的管理员,欢迎您登录员工管理系统\n");
admin_menu(sockfd, msg);
}else if (msg->usertype == USER){
printf("亲爱的用户,欢迎您登录员工管理系统\n");
user_menu(sockfd, msg);
}
}else {
printf("登录失败!!%s\n", msg->recvmsg);
return -1;
}
}
int do_login(int sockfd)
{
int choose;
MSG msg;
while (1){
printf("**************************************\n");
printf("****1.管理员模式 2普通用户模式 3退出***\n");
printf("**************************************\n");
printf("请输入您的选择(数字)>>");
scanf("%d", &choose);
getchar();
switch (choose){
case 1:
msg.msgtype = ADMIN_LOGIN;
msg.usertype = ADMIN;
break;
case 2:
msg.msgtype = USER_LOGIN;
msg.usertype = USER;
break;
case 3:
msg.msgtype = QUIT;
if (-1 == send(sockfd, &msg, sizeof(MSG), 0)){
ERROR("do_login 3quit error\n");
}
close(sockfd);
exit(0);
break;
default:
printf("您输入的有误,请重新输入\n");
}
admin_or_user_login(sockfd, &msg);
}
}
服务器代码:
#include "common.h"
int main(int argc, char const *argv[])
{
int sockfd;
int acceptfd;
ssize_t recvbytes;
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
socklen_t serveraddr_len = sizeof(serveraddr);
socklen_t clientaddr_len = sizeof(clientaddr);
MSG msg;
char* errmsg;
fd_set readfds, tempfds;
int nfds = 0;
int retval;
int i;
if (SQLITE_OK != sqlite3_open(STAFF_DATABASE, &db)){
printf("%s\n", sqlite3_errmsg(db));
exit(-1);
}else {
printf("打开数据库成功\n");
}
if(sqlite3_exec(db,"create table usrinfo(staffno integer,usertype integer,name text,passwd text,age integer,phone text,addr text,work text,date text,level integer,salary REAL);",NULL,NULL,&errmsg)!= SQLITE_OK){
printf("%s.\n",errmsg);
}else{
printf("create usrinfo table success.\n");
}
if(sqlite3_exec(db,"create table historyinfo(time text,name text,words text);",NULL,NULL,&errmsg)!= SQLITE_OK){
printf("%s.\n",errmsg);
}else{
printf("create historyinfo table success.\n");
}
if (-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))){
ERROR("server create socket error\n");
}
int b_reuse = 1;
if (-1 == setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof(b_reuse))){
printf("server setsockopt error\n");
exit(-1);
}
memset(&serveraddr, 0, sizeof(serveraddr));
memset(&clientaddr, 0, sizeof(clientaddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(5001);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (-1 == bind(sockfd, (const struct sockaddr*)&serveraddr, serveraddr_len)){
ERROR("server bind error\n");
}
if (-1 == listen(sockfd, 10)){
ERROR("server listen error");
}
FD_ZERO(&readfds);
FD_ZERO(&tempfds);
FD_SET(sockfd, &readfds);
nfds = nfds > sockfd ? nfds : sockfd;
while (1){
tempfds = readfds;
if (-1 == (retval = select(nfds + 1, &tempfds, NULL, NULL, NULL))){
ERROR("server select error\n");
}
for (i = 0; i < nfds + 1; i++){
if (FD_ISSET(i, &tempfds)){
if (i == sockfd){
if (-1 == (acceptfd = accept(sockfd, (struct sockaddr*)&clientaddr, &clientaddr_len))){
ERROR("server acceptfd error\n");
}
printf("ip:%s\n", inet_ntoa(clientaddr.sin_addr));
FD_SET(acceptfd, &readfds);
nfds = nfds > acceptfd ? nfds : acceptfd;
}else {
if (-1 == (recvbytes = recv(i, &msg, sizeof(MSG), 0))){
ERROR("server recv error\n");
}
printf("msg.type:%#x\n", msg.msgtype);
if (-1 == recvbytes){
printf("server recv error\n");
continue;
}else if(0 == recvbytes){
printf("peer shutdown\n");
close(i);
FD_CLR(i, &readfds);
}else {
process_client_request(i, &msg, &readfds);
}
}
}
}
}
close(sockfd);
return 0;
}
服务器函数:
#include "common.h"
int process_user_or_admin_login_request(int acceptfd,MSG* msg)
{
char sql[DATALEN] = {0};
char* errmsg;
char** result;
int nrow;
int ncolumn;
msg->info.usertype = msg->usertype;
strcpy(msg->info.name, msg->username);
strcpy(msg->info.passwd, msg->passwd);
printf("usrtype: %#x-----usrname: %s---passwd: %s.\n",msg->info.usertype,msg->info.name,msg->info.passwd);
sprintf(sql,"select * from usrinfo where usertype=%d and name='%s' and passwd='%s';",msg->info.usertype,msg->info.name,msg->info.passwd);
if (SQLITE_OK != sqlite3_get_table(db, sql, &result, &nrow, &ncolumn, &errmsg)){
printf("process_user_or_admin_login_request :%s\n", errmsg);
}else {
if (nrow == 0){
strcpy(msg->recvmsg, "name or passwd failed");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("nrow = 0: process_user_or_admin_login_request send error\n");
}
}else {
strcpy(msg->recvmsg, "ok");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("nrow =1: process_user_or_admin_login_request send error");
}
}
}
return 0;
}
void server_modify_inode(int acceptfd, MSG* msg, char* sql)
{
char *errmsg;
memset(sql, 0, DATALEN);
sprintf(sql, "update usrinfo set staffno=%d where name='%s';", msg->info.no, msg->info.name);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改编号失败");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_inode sqlite3_exec send error\n");
}
printf("server_modify_inode sqlite3_exec error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改编号成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_inode sqlite3_exec send error\n");
}
return;
}
void server_modify_phone(int acceptfd,MSG* msg, char* sql)
{
char *errmsg;
memset(sql, 0, DATALEN);
sprintf(sql, "update usrinfo set phone='%s' where name='%s';", msg->info.phone, msg->info.name);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改电话失败");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_inode sqlite3_exec send error\n");
}
printf("server_modify_inode sqlite3_exec error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改电话成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_inode sqlite3_exec send error\n");
}
return;
}
void server_modify_passwd(int acceptfd,MSG* msg, char* sql)
{
char *errmsg;
memset(sql, 0, DATALEN);
sprintf(sql, "update usrinfo set passwd='%s' where name='%s';", msg->passwd, msg->info.name);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改密码失败");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_passwd sqlite3_exec send error\n");
}
printf("server_modify_passwd sqlite3_exec error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改密码成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_passwd sqlite3_exec send error\n");
}
return;
}
void server_modify_age(int acceptfd,MSG* msg, char* sql)
{
char *errmsg;
memset(sql, 0, DATALEN);
sprintf(sql, "update usrinfo set age=%d where name='%s';", msg->info.age, msg->info.name);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改年龄失败");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_age sqlite3_exec send error\n");
}
printf("server_modify_agesqlite3_exec error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改年龄成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_age sqlite3_exec send error\n");
}
return;
}
void server_modify_name(int acceptfd,MSG* msg, char* sql)
{
char *errmsg;
memset(sql, 0, DATALEN);
sprintf(sql, "update usrinfo set name='%s' where name='%s';", msg->username, msg->info.name);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改姓名失败");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_name sqlite3_exec send error\n");
}
printf(" server_modify_name sqlite3_exec error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改姓名成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_name sqlite3_exec send error\n");
}
return;
}
void server_modify_addr(int acceptfd,MSG* msg, char* sql)
{
char *errmsg;
memset(sql, 0, DATALEN);
sprintf(sql, "update usrinfo set addr='%s' where name='%s';", msg->info.addr, msg->info.name);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改地址失败");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_addr sqlite3_exec send error\n");
}
printf(" server_modify_addr sqlite3_exec error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改地址成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_addr sqlite3_exec send error\n");
}
return;
}
void server_modify_data(int acceptfd,MSG* msg, char* sql)
{
char *errmsg;
memset(sql, 0, DATALEN);
sprintf(sql, "update usrinfo set date='%s' where name='%s';", msg->info.date, msg->info.name);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改登录时间失败");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_data sqlite3_exec send error\n");
}
printf(" server_modify_data sqlite3_exec error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "修改登录时间成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("server_modify_data sqlite3_exec send error\n");
}
return;
}
int process_user_modify_request(int acceptfd, MSG* msg)
{
char sql[DATALEN] = {0};
switch (msg->flags){
case 1:
server_modify_inode(acceptfd, msg, sql);
break;
case 2:
server_modify_phone(acceptfd, msg, sql);
break;
case 3:
server_modify_passwd(acceptfd, msg, sql);
break;
case 4:
server_modify_age(acceptfd, msg, sql);
break;
case 5:
server_modify_name(acceptfd, msg, sql);
break;
case 6:
server_modify_addr(acceptfd, msg, sql);
break;
case 7:
server_modify_data(acceptfd, msg, sql);
break;
case 8:
return 1;
}
return 0;
}
int callback(void *argc, int f_num, char **f_value, char **f_name)
{
int acceptfd = *(int*)argc;
MSG msg;
sprintf(msg.recvmsg, "%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s",
f_value[0], f_value[1], f_value[2], f_value[3], f_value[4], f_value[5], f_value[6],
f_value[7], f_value[8], f_value[9], f_value[10]);
if (-1 == send(acceptfd, &msg, sizeof(MSG),0 )){
ERROR("process_user_query_request callback error\n");
}
return 0;
}
int process_user_query_request(int acceptfd, MSG* msg)
{
char sql[DATALEN] = {0};
char *errmsg;
sprintf(sql, "select * from usrinfo where name = '%s';", msg->username);
if (SQLITE_OK != sqlite3_exec(db, sql, callback, &acceptfd, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "查找错误....");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("process_user_query_request sqlite3_exec send error\n");
}
printf("process_user_query_request error: %s", errmsg);
exit(-1);
}
return 0;
}
int process_admin_modify_request(int acceptfd, MSG* msg)
{
process_user_modify_request(acceptfd, msg);
return 0;
}
int process_admin_adduser_request(int acceptfd, MSG* msg)
{
char sql[600] = {0};
char *errmsg;
sprintf(sql, "insert into usrinfo values(%d,%d,'%s','%s',%d,'%s','%s','%s','%s',%d,%f);",
msg->info.no, msg->usertype, msg->username, msg->passwd, msg->info.age, msg->info.phone,
msg->info.addr, msg->info.work, msg->info.date, msg->info.level, msg->info.salary);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "添加用户失败");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("process_admin_adduser_request sqlite3_exec send error\n");
}
printf(" process_admin_adduser_request sqlite3_exec error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "添加用户成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("process_admin_adduser_request send error\n");
}
return 0;
}
int process_admin_deluser_request(int acceptfd, MSG* msg)
{
char sql[DATALEN] = {0};
char *errmsg;
sprintf(sql, "delete from usrinfo where name='%s';", msg->username);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "nook");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("process_admin_deluser_request send error\n");
}
printf(" process_admin_deluser_request error %s\n", errmsg);
exit(-1);
}
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "删除用户成功");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("process_admin_deluser_request send error\n");
}
return 0;
}
void client_getdata(char* data)
{
time_t t;
struct tm* tm;
if (-1 == (t = time(NULL))){
ERROR("time error\n");
}
if (NULL == (tm = localtime(&t))){
ERROR("localtime error\n");
}
sprintf(data,"%d-%02d-%02d %02d:%02d:%02d", tm->tm_year+1900,\
tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
return;
}
int process_admin_query_request(int acceptfd, MSG* msg)
{
char sql[512] = {0};
char data[256] = {0};
char* errmsg;
printf("%s\n", msg->username);
sprintf(sql, "select * from usrinfo where name='%s';", msg->username);
if (SQLITE_OK != sqlite3_exec(db, sql, callback, &acceptfd, &errmsg)){
memset(msg->recvmsg, 0, sizeof(msg->recvmsg));
strcpy(msg->recvmsg, "nook");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("process_admin_query_request send error\n");
}
printf("process_admin_query_request error %s\n", errmsg);
exit(-1);
}
if (!strncmp("nook", msg->recvmsg, 5)){
return 0;
}else {
client_getdata(data);
sprintf(sql, "insert into historyinfo values('%s','%s','%s');",
data, msg->username, msg->info.name);
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, NULL)){
ERROR("process_admin_query_request sqlite3_exec error");
}
}
return 0;
}
int callback1(void *argc, int f_num, char **f_value, char **f_name)
{
int acceptfd = *(int*)argc;
MSG msg;
sprintf(msg.recvmsg, "%s:%s:%s",
f_value[0], f_value[1], f_value[2]);
if (-1 == send(acceptfd, &msg, sizeof(MSG),0 )){
ERROR("process_user_query_request callback error\n");
}
return 0;
}
int process_admin_history_request(int acceptfd, MSG* msg)
{
char sql[512] = {0};
sprintf(sql, "select * from historyinfo;");
if (SQLITE_OK != sqlite3_exec(db, sql, callback1, &acceptfd, NULL)){
ERROR("sqlite3_exec error\n");
}
strcpy(msg->recvmsg, "over");
if (-1 == send(acceptfd, msg, sizeof(MSG), 0)){
ERROR("Server_History error\n");
}
return 0;
}
int process_client_quit_request(int accept, MSG* msg, fd_set* readfds)
{
printf("peer shutdown\n");
close(accept);
FD_CLR(accept, readfds);
}
int process_client_request(int acceptfd, MSG* msg, fd_set* readfds)
{
next:
switch (msg->msgtype){
case USER_LOGIN:
case ADMIN_LOGIN:
process_user_or_admin_login_request(acceptfd, msg);
break;
case USER_MODIFY:
if(process_user_modify_request(acceptfd, msg)){
msg->msgtype = 1000;
goto next;
};
break;
case USER_QUERY:
process_user_query_request(acceptfd, msg);
break;
case ADMIN_MODIFY:
process_admin_modify_request(acceptfd, msg);
break;
case ADMIN_ADDUSER:
process_admin_adduser_request(acceptfd, msg);
break;
case ADMIN_DELUSER:
process_admin_deluser_request(acceptfd, msg);
break;
case ADMIN_QUERY:
process_admin_query_request(acceptfd, msg);
break;
case ADMIN_HISTORY:
process_admin_history_request(acceptfd, msg);
break;
case QUIT:
process_client_quit_request(acceptfd, msg, readfds);
break;
default:
break;
}
}