C/数据库:员工管理系统

13 篇文章 0 订阅
8 篇文章 0 订阅

一.员工管理系统项目需求分析:

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;
    }
}


  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值