20230606项目:员工管理系统

这篇具有很好参考价值的文章主要介绍了20230606项目:员工管理系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

客户端

client_head_h

#ifndef __CLIENT_H__
#define __CLIENT_H__
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include<stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include<stdlib.h>
#include <signal.h>

#define PORT 2223
#define IP "192.168.250.100"
#define ERR_MSG(msg) do{\
    fprintf(stderr,"line:%d",__LINE__);\
}while(0)

struct info
{
    char account[20];    //账号
    char password[20];   //密码
    int workno;          //工号
    int age;             //年龄
    char address[20];    //地址
    int  phone;          //电话
    char posi[20];       //职位
    char data[20];       //时间
    int laver;           //级别
    int salary;          //工资
}; // 员工信息结构体
typedef struct msg
{
    char status;   //登录状态  Y登录成功  N登录失败   Z表示用户在线  W按照工号查询  M按照名字查询
    int usertype;   // 用户类型   1表示管理员  0表示员工
    int cmdtype;    // 通信指令类型   //员工    1.查询  2.修改   3.退出  4.用户登录//
                                    // 管理员   1. 查询   2.修改 3.添加用户  4.删除用户  5.查询历史记录  6.退出  7.管理员登录
    char buf[32];   // 通信的消息
    struct info st; // 员工信息
}Msg;                  // 通信结构体

//存储历史记录结构体
typedef struct History{
    //协议
    char type;  //'N'失败  ‘Y’成功
    char name[20];
    char date[200];
    char data[20];
    char time[20];
}His;

//管理员模式
int do_manager_mode(int sfd,char*name);
//用户模式
int do_user_mode(int sfd, char*name);
// 管理员添加用户
int do_Add_User(int sfd); 
// 管理员删除用户
int do_Del_User(int sfd); 
// 管理员查询
int do_See_Manager(int sfd); 
//按照名字查询
int Seek_Name(Msg sndbuf,int sfd);
//按照工号查询
int Seek_workno(Msg sndbuf,int sfd);
// 管理员查询历史记录
int do_See_History(int sfd); 
// 管理员修改
int do_See_Modi(int sfd); 
//按名字修改
 int Modi_Name(Msg sndbuf,int sfd);
 //按工号修改
 int Modi_workno(Msg sndbuf,int sfd);
 // 查询用户
 int do_See_User(int sfd,Msg name); 
// 修改用户
int do_Modi_User(int sfd,Msg name);
#endif

client.c

#include "client_head.h"
#include "client_test.c"
Msg name;//记录登录者姓名
int main(int argc, const char *argv[])
{
    // 创建流式套接字
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    printf("socket suess__%d__\n", __LINE__);
    // 不绑定
    // 填充信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    // IP网络字节序
    sin.sin_addr.s_addr = inet_addr(IP);

    if (-1 == connect(sfd, (struct sockaddr *)&sin, sizeof(sin)))
    {
        ERR_MSG("connet");
        return -1;
    }
    printf("connect  serve success\n");

    int choose;
     
    while (1)
    {
    BEGIN:
        printf("**************************\n");
        printf("**********1管理员模式******\n");
        printf("**********2普通用户模式****\n");
        printf("**********3退出***********\n");
        printf("**************************\n");
        printf("请输入>>>\n");
        scanf("%d", &choose);
        switch (choose)
        {
        case 1:
            if (1 == do_manager_mode(sfd,name.st.account))
            {
                goto MANAGER;
            } // 管理员登录
            else
            {
                goto BEGIN;
            }
            break;
        case 2:
            if (1 == do_user_mode(sfd,name.st.account)) // 普通用户登录
            {
                printf("sssss46姓名:%s\n", name.st.account);
                goto USER;
            }
            else
            {
                goto BEGIN;
            }
            break;
        case 3:
            goto END;
            break;
        default:
            printf("输入错误,请重新选择__%s__ __%d__\n", __FILE__, __LINE__);
        }
    }
MANAGER:
    while (1)
    {
        printf("**************************\n");
        printf("**********1查询***********\n");
        printf("**********2修改***********\n");
        printf("**********3添加用户*******\n");
        printf("**********4删除用户*******\n");
        printf("**********5查询历史记录****\n");
        printf("**********6退出***********\n");
        printf("*************************\n");
        printf("请输入>>>\n");
        scanf("%d", &choose);
        switch (choose)
        {
        case 1:
             if(1==do_See_Manager(sfd)) // 管理员查询
             {
                goto MANAGER;
             }
            break;
        case 2:
             if(1==do_See_Modi(sfd)) // 管理员修改
             {
                goto MANAGER;
             }
            break;
        case 3:
             do_Add_User(sfd); // 管理员添加用户
            break;
        case 4:
             do_Del_User(sfd); // 管理员删除用户
            break;
        case 5:
            do_See_History(sfd); // 管理员查询历史记录
            break;
        case 6:
             goto BEGIN;
            break;
        default:
            printf("协议 错误 __%s__ __%d__\n", __FILE__, __LINE__);
        }
    }
USER:
    while (1)
    {
        printf("**************************\n");
        printf("**********1查询***********\n");
        printf("**********2修改***********\n");
        printf("**********3退出***********\n");
        printf("*************************\n");
        printf("请输入>>>\n");
        scanf("%d", &choose);
        switch (choose)
        {
        case 1:
            printf("******************姓名:%s\n", name.st.account);
             do_See_User(sfd,name); // 查询用户本身信息
            break;
        case 2:
             do_Modi_User(sfd,name); // 修改用户
            break;
        case 3:
             goto END;
            break;

        default:
            printf("协议  错误 __%s__ __%d__\n", __FILE__, __LINE__);
        }
    }
END:
    close(sfd);
    return 0;
}

client_test_c

#include "client_head.h"
// 管理员登录模式
int do_manager_mode(int sfd, char*name)
{
    struct msg sndbuf;
    printf("请输入管理员账号:");
    scanf("%s", sndbuf.st.account);
    printf("请输入管理员密码:");
    scanf("%s", sndbuf.st.password);
    sndbuf.usertype = 1; // 表示管理员
    sndbuf.cmdtype = 6;  // 管理员登录
    strcpy(name, sndbuf.st.account);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    int res = recv(sfd, &sndbuf, sizeof(sndbuf), 0);
    if (res < 0)
    {
        ERR_MSG("recv");
        return -1;
    }
    if (sndbuf.status == 'Y')
    {
        // 登录成功
        printf("登录成功\n");
        return 1;
    }
    else if (sndbuf.status == 'Z')
    {
        // 登录成功
        printf("用户在线\n");
        return 2;
    }
    else if (sndbuf.status == 'N')
    {
        // 登录成功
        printf("账号密码错误\n");
        return 3;
    }
    printf("欢迎进入管理员模式\n");

    return 0;
}

// 用户登录模式
int do_user_mode(int sfd, char*name)
{
    struct msg sndbuf;
    printf("请输入用户账号:");
    scanf("%s", sndbuf.st.account);
    printf("请输入用户密码:");
    scanf("%s", sndbuf.st.password);
    sndbuf.usertype = 0; // 表示用户
    sndbuf.cmdtype = 3;  // 用户登录
     strcpy(name,sndbuf.st.account);
    // printf("user---name=%s\n",name);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    int res = recv(sfd, &sndbuf, sizeof(sndbuf), 0);
    if (res < 0)
    {
        ERR_MSG("recv");
        return -1;
    }
    if (sndbuf.status == 'Y')
    {
        // 登录成功
        printf("登录成功\n");
        return 1;
    }
    else if (sndbuf.status == 'Z')
    {
        // 登录成功
        //strcpy(name.st.account, sndbuf.st.account);
        printf("用户在线\n");
        return 2;
    }
    else if (sndbuf.status == 'N')
    {
        // 登录成功
        printf("账号密码错误\n");
        return 3;
    }
    printf("欢迎进入普通用户模式\n");

    return 0;
}

// 管理员添加用户
int do_Add_User(int sfd)
{
    Msg sndbuf;
    sndbuf.usertype = 1;
    sndbuf.cmdtype = 3;
    printf("请输入是否为管理员1/0:");
    scanf("%s", sndbuf.buf);
    printf("请输入账号:\n");
    scanf("%s", sndbuf.st.account);
    printf("请输入密码:\n");
    scanf("%s", sndbuf.st.password);
    printf("请输入工号:\n");
    scanf("%d", &sndbuf.st.workno);
    printf("请输入年龄:\n");
    scanf("%d", &sndbuf.st.age);
    printf("请输入地址:\n");
    scanf("%s", sndbuf.st.address);
    printf("请输入电话:\n");
    scanf("%d", &sndbuf.st.phone);
    printf("请输入职位:\n");
    scanf("%s", sndbuf.st.posi);
    printf("请输入时间:\n");
    scanf("%s", sndbuf.st.data);
    printf("请输入级别:\n");
    scanf("%d", &sndbuf.st.laver);
    printf("请输入工资:\n");
    scanf("%d", &sndbuf.st.salary);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    return 0;
}

// 管理员删除用户
int do_Del_User(int sfd)
{
    Msg sndbuf;
    sndbuf.usertype = 1;
    sndbuf.cmdtype = 4;
    printf("请输入要删除的用户名\n");
    scanf("%s", sndbuf.st.account);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    return 0;
}

// 管理员查询
int do_See_Manager(int sfd)
{
    Msg sndbuf;
    sndbuf.usertype = 1;
    sndbuf.cmdtype = 1;
    printf("**************************\n");
    printf("**********1按名字查询******\n");
    printf("**********2按工号查询******\n");
    printf("**********3退出***********\n");
    printf("请输入>>>>>>>>");
    int choose;
    scanf("%d", &choose);
    switch (choose)
    {
    case 1:
        Seek_Name(sndbuf, sfd);
        break;
    case 2:
        Seek_workno(sndbuf, sfd);
        break;
    case 3:
        return 1;
        break;
    }
    return 0;
}

// 按照名字查询
int Seek_Name(Msg sndbuf, int sfd)
{
    sndbuf.status = 'M';
    printf("请输入名字:");
    scanf("%s", sndbuf.st.account);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    // 接受到信息
    if (sndbuf.status == 'X')
    {
        printf("查询失败\n");
        return -1;
    }
    int res = recv(sfd, &sndbuf, sizeof(sndbuf), 0);
    if (res < 0)
    {
        ERR_MSG("recv");
        return -1;
    }
    printf("姓名:%s\n", sndbuf.st.account);
    printf("年龄:%d\n", sndbuf.st.age);
    printf("地址:%s\n", sndbuf.st.address);
    printf("电话:%d\n", sndbuf.st.phone);
    printf("职位:%s\n", sndbuf.st.posi);
    printf("日期:%s\n", sndbuf.st.data);
    printf("级别:%d\n", sndbuf.st.laver);
    printf("薪资:%d\n", sndbuf.st.salary);

    return 0;
}
// 按照工号查询
int Seek_workno(Msg sndbuf, int sfd)
{
    sndbuf.status = 'W';
    printf("请输入工号:");
    scanf("%d", &sndbuf.st.workno);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    // 接受到信息
    if (sndbuf.status == 'X')
    {
        printf("查询失败\n");
        return -1;
    }
    int res = recv(sfd, &sndbuf, sizeof(sndbuf), 0);
    if (res < 0)
    {
        ERR_MSG("recv");
        return -1;
    }
    printf("姓名:%s\n", sndbuf.st.account);
    printf("年龄:%d\n", sndbuf.st.age);
    printf("地址:%s\n", sndbuf.st.address);
    printf("电话:%d\n", sndbuf.st.phone);
    printf("职位:%s\n", sndbuf.st.posi);
    printf("日期:%s\n", sndbuf.st.data);
    printf("级别:%d\n", sndbuf.st.laver);
    printf("薪资:%d\n", sndbuf.st.salary);
    return 0;
}

// 管理员查询历史记录
int do_See_History(int sfd)
{
    Msg sndbuf;
    sndbuf.usertype = 1;
    sndbuf.cmdtype = 5;
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    His Hisbuf;
    Hisbuf.type = 'Y';
    while (1)
    {
        if (Hisbuf.type == 'Y')
        {
            bzero(&Hisbuf, sizeof(Hisbuf));
            int res = recv(sfd, &Hisbuf, sizeof(Hisbuf), 0);
            if (res < 0)
            {
                ERR_MSG("recv");
                return -1;
            }
            printf("%s\t%s\t%s\t%s\t\n", Hisbuf.name, Hisbuf.date, Hisbuf.data, Hisbuf.time);
        }
        else if (Hisbuf.type == 'N')
        {
            break;
        }
    }
    return 0;
}

// 管理员修改
int do_See_Modi(int sfd)
{
    Msg sndbuf;
    sndbuf.usertype = 1;
    sndbuf.cmdtype = 2;
    printf("**************************\n");
    printf("**********1按名字修改******\n");
    printf("**********2按工号修改******\n");
    printf("**********3退出***********\n");
    printf("请输入>>>>>>>>");
    int choose;
    scanf("%d", &choose);
    switch (choose)
    {
    case 1:
        Modi_Name(sndbuf, sfd);
        break;
    case 2:
        Modi_workno(sndbuf, sfd);
        break;
    case 3:
        return 1;
        break;
    }
    return 0;
}
// 按名字修改
int Modi_Name(Msg sndbuf, int sfd)
{
    sndbuf.status = 'M';
    printf("请输入名字:");
    scanf("%s", sndbuf.st.account);
    // 修改
    printf("修改工号:");
    scanf("%d", &sndbuf.st.workno);
    printf("修改年龄:");
    scanf("%d", &sndbuf.st.age);
    printf("修改地址:");
    scanf("%s", sndbuf.st.address);
    printf("修改phone:");
    scanf("%d", &sndbuf.st.phone);
    printf("修改职位:");
    scanf("%s", sndbuf.st.posi);
    printf("修改时间:");
    scanf("%s", sndbuf.st.data);
    printf("修改水平:");
    scanf("%d", &sndbuf.st.laver);
    printf("请输入薪资:");
    scanf("%d", &sndbuf.st.salary);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    return 0;
}
// 按照工号修改
int Modi_workno(Msg sndbuf, int sfd)
{
    sndbuf.status = 'W';
    printf("请输入工号:");
    scanf("%d", &sndbuf.st.workno);
    // 修改
    printf("修改名字:");
    scanf("%s", sndbuf.st.account);
    printf("修改年龄:");
    scanf("%d", &sndbuf.st.age);
    printf("修改地址:");
    scanf("%s", sndbuf.st.address);
    printf("修改phone:");
    scanf("%d", &sndbuf.st.phone);
    printf("修改职位:");
    scanf("%s", sndbuf.st.posi);
    printf("修改时间:");
    scanf("%s", sndbuf.st.data);
    printf("修改水平:");
    scanf("%d", &sndbuf.st.laver);
    printf("请输入薪资:");
    scanf("%d", &sndbuf.st.salary);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    return 0;
}

// 查询用户自身信息
int do_See_User(int sfd, Msg name)
{
    Msg sndbuf;
   // printf("姓名:%s\n", name.st.account);
    sndbuf.usertype = 0;
    sndbuf.cmdtype = 1;
    strcpy(sndbuf.st.account, name.st.account);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
    bzero(&sndbuf,sizeof(sndbuf));
    int res = recv(sfd, &sndbuf, sizeof(sndbuf), 0);
    if (res < 0)
    {
        ERR_MSG("recv");
        return -1;
    }
    printf("姓名:%s\n", sndbuf.st.account);
    printf("年龄:%d\n", sndbuf.st.age);
    printf("地址:%s\n", sndbuf.st.address);
    printf("电话:%d\n", sndbuf.st.phone);
    printf("职位:%s\n", sndbuf.st.posi);
    printf("日期:%s\n", sndbuf.st.data);
    printf("级别:%d\n", sndbuf.st.laver);
    printf("薪资:%d\n", sndbuf.st.salary);

    return 0;
}

// 修改用户
int do_Modi_User(int sfd,Msg name)
{
    Msg sndbuf;
    sndbuf.usertype = 0;
    sndbuf.cmdtype = 2;
    strcpy(sndbuf.st.account, name.st.account);
     printf("修改年龄:");
    scanf("%d", &sndbuf.st.age);
    printf("修改地址:");
    scanf("%s", sndbuf.st.address);
    printf("修改phone:");
    scanf("%d", &sndbuf.st.phone);
    printf("修改职位:");
    scanf("%s", sndbuf.st.posi);
    printf("修改时间:");
    scanf("%s", sndbuf.st.data);
    printf("修改水平:");
    scanf("%d", &sndbuf.st.laver);
    printf("请输入薪资:");
    scanf("%d", &sndbuf.st.salary);
    if (send(sfd, &sndbuf, sizeof(sndbuf), 0) < 0)
    {
        ERR_MSG("send");
        return -1;
    }
}

服务器

server_h

#ifndef __SERVER_H__
#define __SERVER_H__
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include<stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include<stdlib.h>
#include <signal.h>
#include <time.h>
#include<sqlite3.h>

#define PORT 2223
#define IP "192.168.250.100"
#define ERR_MSG(msg) do{\
    fprintf(stderr,"line:%d",__LINE__);\
}while(0)

struct info
{
    char account[20];    //账号
    char password[20];   //密码
    int workno;          //工号
    int age;              //年龄
    char address[20];    //地址
    int  phone;          //电话
    char posi[20];       //职位
    char data[20];       //时间
    int laver;           //级别
    int salary;          //工资
}; // 员工信息结构体
typedef struct msg
{
    char status;   //登录状态  Y登录成功  N登录失败   Z用户在线
    int usertype;   // 用户类型   1表示管理员  0表示员工
    int cmdtype;    // 通信指令类型  //员工    1.查询  2.修改   3.退出  //
                                    // 管理员   1. 查询   2.修改 3.添加用户  4.删除用户  5.查询历史记录  6.退出 
    char buf[32];   // 通信的消息
    struct info st; // 员工信息
}Msg;                  // 通信结构体

//存储历史记录结构体
typedef struct History{
    //协议
    char type;  //'N'失败  ‘Y’成功
    char name[20];
    char date[200];
    char data[20];
    char time[20];
}His;

//创建员工管理员表
int CreateLogin();
//管理员登录
int do_manager_mode(struct sockaddr_in cin,Msg rcvbuf,int newfd,sqlite3*db);       
//用户登录  
int do_user_mode(struct sockaddr_in cin,Msg rcvbuf,int newfd,sqlite3*db); 
//变更用户状态值0表示没有用户登录1表示有用户登录
int ChangeUserStatus(Msg rcvbuf,sqlite3*db,int status);
// 管理员添加用户
int do_Add_User(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db,char *name);
// 管理员删除用户
int do_Del_User(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db,char *name);
 // 管理员查询
int do_See_Manager(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db, char *name);
// 添加历史信息记录查询表
int history(char *name,char *buf);
// 管理员查询历史记录
int do_See_History(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db);
 // 管理员修改
int do_See_Modi(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db,char*name);
// 查询用户
int do_See_User(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db,char*name); 

#endif

server_c

#include "server_head.h"
#include "server_test.c"
int main(int argc, const char *argv[])
{
    // 创建流套接字
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    printf("socket success __%d__\n", __LINE__);
    // 允许端口快速复用
    int reuse = 1;
    if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    // 填充结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    // IP网络字节序
    sin.sin_addr.s_addr = inet_addr(IP);
    // 绑定---必须
    if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("bind success __%d__\n", __LINE__);
    // 监听
    if (listen(sfd, 128) < 0)
    {
        ERR_MSG("listen");
        return -1;
    }
    printf("listen success __%d__\n", __LINE__);

    // 创建身份密码表
    printf("正在创建身份密码表\n");
    CreateLogin();
    printf("创建身份密码表成功\n");

    // 打开数据库
    sqlite3 *db = NULL;
    if (sqlite3_open("./dict.db", &db) != SQLITE_OK)
    {
        fprintf(stderr, "%d sqlite3_open fail %d|%s\n",
                __LINE__, sqlite3_errcode(db), sqlite3_errmsg(db));
        return -1;
    }
    printf("open success\n");

    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(cin);
    int newfd = -1;
    while (1)
    {
        newfd = accept(sfd, (struct sockaddr *)&cin, &addrlen);
        if (newfd < 0)
        {
            ERR_MSG("accept");
            return -1;
        }
        printf("[%s : %d] newfd=%d,客户端连接成功\n",
               inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
        // 创建子进程
        pid_t pid = fork();
        if (pid == 0)
        {
            // 关闭套接字
            close(sfd);
            // 执行程序
            int res;
            struct msg rcvbuf;
            Msg name;
            while (1)
            {
                res = recv(newfd, &rcvbuf, sizeof(rcvbuf), 0);
                if (res < 0)
                {
                    ERR_MSG("recv");
                    return -1;
                }
                else if (res == 0)
                {
                    fprintf(stderr, "[%s : %d] newfd=%d,客户端下线\n",
                            inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
                    
                    //客户端下线设置状态为0
                    ChangeUserStatus(name,db,0);
                    break;
                }
                
                // 员工    1.查询  2.修改   3.退出
                if (rcvbuf.usertype == 0)
                {

                    switch (rcvbuf.cmdtype)
                    {
                    case 1:
                        do_See_User(cin, rcvbuf, newfd, db,name.st.account); // 查询用户自身
                        break;
                    case 2:
                        do_Modi_User(cin, rcvbuf, newfd, db,name.st.account); // 修改用户
                        break;
                    case 3:
                        do_user_mode(cin,rcvbuf,newfd,db);                     //用户登录
                        strcpy(name.st.account,rcvbuf.st.account);
                        break;
                    default:
                        printf("协议 %c 错误 __%s__ __%d__\n", rcvbuf.cmdtype, __FILE__, __LINE__);
                    }
                }
                // 管理员   1. 查询   2.修改 3.添加用户  4.删除用户  5.查询历史记录  6.退出
                else if (rcvbuf.usertype == 1)
                {
                    switch (rcvbuf.cmdtype)
                    {
                    case 1:
                        do_See_Manager(cin, rcvbuf, newfd, db,name.st.account); // 管理员查询
                        break;
                    case 2:
                        do_See_Modi(cin, rcvbuf, newfd, db,name.st.account); // 管理员修改
                        break;
                    case 3:
                        do_Add_User(cin, rcvbuf, newfd, db,name.st.account); // 管理员添加用户
                        break;
                    case 4:
                        do_Del_User(cin, rcvbuf, newfd, db,name.st.account); // 管理员删除用户
                        break;
                    case 5:
                        do_See_History(cin, rcvbuf, newfd, db); // 管理员查询历史记录
                        break;
                    case 6:
                        do_manager_mode(cin,rcvbuf,newfd,db);                      //管理员登录
                        strcpy(name.st.account,rcvbuf.st.account);
                        break;
                    default:
                        printf("协议 %c 错误 __%s__ __%d__\n", rcvbuf.cmdtype, __FILE__, __LINE__);
                    }
                }
            }
        }
        else if (pid > 0)
        {
            // 多客户端连接
            close(newfd);
        }
        else
        {
            ERR_MSG("fork");
            return 0;
        }
    }
    close(sfd);
    close(newfd);
    return 0;
}

test

#include "server_head.h"
// 创建身份密码表
int CreateLogin()
{
	sqlite3 *db = NULL;
	if (sqlite3_open("./dict.db", &db) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_open fail %d|%s\n",
				__LINE__, sqlite3_errcode(db), sqlite3_errmsg(db));
		return -1;
	}
	printf("open success\n");
	// status1表示有用户登录0表示没有用户登录  manager_user:0表示用户  表示管理员
	char sql[128] = "create table if not exists ID(name char,password int,status int,manager_user int);";
	printf("sql=%s\n", sql);
	char *errmsg = NULL;
	if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}
	// 创建个人信息表
	char sql1[128] = "create table if not exists MSG(name char,workno int,age int,address char,phone int,posi char,data char,laver int,salary int);";
	printf("sql1=%s\n", sql1);
	char *errmsg1 = NULL;
	if (SQLITE_OK != sqlite3_exec(db, sql1, NULL, NULL, &errmsg1) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg1);
		return -1;
	}

	// 创建查询个人历史信息表
	char sql2[128] = "create table if not exists His(name char,msg char,data char,time char);";
	printf("sql2=%s\n", sql2);
	char *errmsg2 = NULL;
	if (SQLITE_OK != sqlite3_exec(db, sql2, NULL, NULL, &errmsg2) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg2);
		return -1;
	}
	return 0;
}

// 管理员登录
int do_manager_mode(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db)
{
	// 判断登录名是否存在数据库中
	char **pres = NULL;
	int row, column;
	char *errmsg = NULL;
	char sql[128] = "";

	sprintf(sql, "%s'%s' %s %s'%s' %s %s%d", "select *from ID where name=", rcvbuf.st.account, "and", "password=", rcvbuf.st.password, "and", "manager_user=", 1);

	printf("sql=%s\n", sql);
	if (SQLITE_OK != sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg))
	{

		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}

	if (pres[6] == NULL)
	{
		// 用户不存在
		printf("**************\n");
		rcvbuf.status = 'N';
		if (send(newfd, &rcvbuf, sizeof(rcvbuf), 0) < 0)
		{
			ERR_MSG("send");
			return -1;
		}
	}
	printf("status==%s\n", pres[6]);
	if (strcmp(pres[6], "0") == 0)
	{
		// 可以登录
		rcvbuf.status = 'Y';
		if (send(newfd, &rcvbuf, sizeof(rcvbuf), 0) < 0)
		{
			ERR_MSG("send");
			return -1;
		}
		// 修改状态位
		ChangeUserStatus(rcvbuf, db, 1);
	}
	else if (strcmp(pres[6], "1") == 0)
	{
		// 用户在线
		rcvbuf.status = 'Z';
		if (send(newfd, &rcvbuf, sizeof(rcvbuf), 0) < 0)
		{
			ERR_MSG("send");
			return -1;
		}
	}
	return 0;
}
// 用户登录
int do_user_mode(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db)
{
	// 判断登录名是否存在数据库中
	char **pres = NULL;
	int row, column;
	char *errmsg = NULL;
	char sql[128] = "";
	sprintf(sql, "%s'%s' %s %s'%s' %s %s%d", "select *from ID where name=", rcvbuf.st.account, "and", "password=", rcvbuf.st.password, "and", "manager_user=", 0);
	printf("sql=%s\n", sql);
	if (SQLITE_OK != sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg))
	{

		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}

	if (pres[6] == NULL)
	{
		// 用户不存在
		printf("**************\n");
		rcvbuf.status = 'N';
		if (send(newfd, &rcvbuf, sizeof(rcvbuf), 0) < 0)
		{
			ERR_MSG("send");
			return -1;
		}
	}
	printf("status==%s\n", pres[6]);
	if (strcmp(pres[6], "0") == 0)
	{
		// 可以登录
		rcvbuf.status = 'Y';
		if (send(newfd, &rcvbuf, sizeof(rcvbuf), 0) < 0)
		{
			ERR_MSG("send");
			return -1;
		}
		// 修改状态位
		ChangeUserStatus(rcvbuf, db, 1);
	}
	else if (strcmp(pres[6], "1") == 0)
	{
		// 用户在线
		rcvbuf.status = 'Z';
		if (send(newfd, &rcvbuf, sizeof(rcvbuf), 0) < 0)
		{
			ERR_MSG("send");
			return -1;
		}
	}
	return 0;
}

// 变更用户状态值0表示没有用户登录1表示有用户登录
int ChangeUserStatus(Msg rcvbuf, sqlite3 *db, int status)
{
	char sql1[128] = "";
	// 设置登录状态0表示没有用户登录
	sprintf(sql1, "%s%d %s'%s'", "update ID set status=", status, " where name=", rcvbuf.st.account);
	char *errmsg = NULL;
	printf("sql=%s\n", sql1);
	if (SQLITE_OK != sqlite3_exec(db, sql1, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
	}
	return -1;
}

// 管理员添加用户
int do_Add_User(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db, char *name)
{
	char sql1[128] = "";
	int status = 0; // 设置登录状态0表示没有用户登录
	sprintf(sql1, "%s ('%s','%s',%d,'%s')", "insert into ID values", rcvbuf.st.account, rcvbuf.st.password, status, rcvbuf.buf);
	char *errmsg = NULL;
	printf("sql=%s\n", sql1);
	if (SQLITE_OK != sqlite3_exec(db, sql1, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}
	// 添加到个人信息表中
	char sql2[128] = "";
	sprintf(sql2, "%s ('%s',%d,%d,'%s',%d,'%s','%s',%d,%d)", "insert into MSG values", rcvbuf.st.account, rcvbuf.st.workno,
			rcvbuf.st.age, rcvbuf.st.address, rcvbuf.st.phone, rcvbuf.st.posi, rcvbuf.st.data, rcvbuf.st.laver, rcvbuf.st.salary);
	char *errmsg1 = NULL;
	printf("sql2=%s\n", sql2);
	if (SQLITE_OK != sqlite3_exec(db, sql2, NULL, NULL, &errmsg1) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg1);
		return -1;
	}
	// 存储添加的信息
	char buf[] = "添加用户信息";
	history(name, buf);
	return 0;
}

// 管理员删除用户
int do_Del_User(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db, char *name)
{
	// 从登录表中删除账户信息
	char sql[128] = "";
	sprintf(sql, "%s'%s'", "delete from ID where name=", rcvbuf.st.account);
	printf("sql=%s\n", sql);
	char *errmsg = NULL;
	if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}
	// 删除个人信息
	sprintf(sql, "%s'%s'", "delete from MSG where name=", rcvbuf.st.account);
	printf("sql=%s\n", sql);
	if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}

	// 存储删除用户记录的信息
	char buf[] = "进行名字删除用户账号及个人信息";
	history(name, buf);
	return 0;
}

// 添加历史信息记录查询表
int history(char *name, char *buf)
{
	sqlite3 *db = NULL;
	if (sqlite3_open("./dict.db", &db) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_open fail %d|%s\n",
				__LINE__, sqlite3_errcode(db), sqlite3_errmsg(db));
		return -1;
	}
	printf("open success\n");

	// 得到查询的时间
	struct tm *info;
	time_t t1 = time(NULL);
	info = localtime(&t1);
	char time[120];
	char data[120];
	sprintf(data, "%d-%d-%d", info->tm_year + 1900, info->tm_mon + 1, info->tm_mday);
	sprintf(time, "%d:%d:%d", info->tm_hour, info->tm_min, info->tm_sec);
	char sql1[128] = "";
	sprintf(sql1, "%s ('%s','%s','%s','%s')", "insert into His values", name, buf, data, time);
	char *errmsg = NULL;
	printf("sql1=%s\n", sql1);
	if (SQLITE_OK != sqlite3_exec(db, sql1, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}
	return 0;
}

// 管理员查询
int do_See_Manager(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db, char *name)
{
	// 按照工号查询
	char **pres = NULL;
	int row, column;
	char *errmsg = NULL;
	char sql[128] = "";
	int flag;
	if (rcvbuf.status == 'W')
	{
		sprintf(sql, "%s%d", "select *from MSG where workno=", rcvbuf.st.workno);
		printf("%d:sql=%s\n", __LINE__, sql);
		if (SQLITE_OK != sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg))
		{
			fprintf(stderr, "%d sqlite3_exec fail %s\n",
					__LINE__, errmsg);
			return -1;
		}
		flag = 0;

		// name char,workno int,age int,address char,phone int,posi char,data char,laver int,salary int
	}
	else if (rcvbuf.status == 'M')
	{ // 按照名字查询
		sprintf(sql, "%s'%s'", "select *from MSG where name=", rcvbuf.st.account);
		printf("%d:sql=%s\n", __LINE__, sql);
		if (SQLITE_OK != sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg))
		{
			fprintf(stderr, "%d sqlite3_exec fail %s\n",
					__LINE__, errmsg);
			return -1;
		}

		flag = 1;
	}
	else
	{
		// 查询失败
		rcvbuf.status = 'X';
	}
	bzero(&rcvbuf, sizeof(rcvbuf));
	strcpy(rcvbuf.st.account, pres[9]);
	rcvbuf.st.workno = atoi(pres[10]);
	rcvbuf.st.age = atoi(pres[11]);
	strcpy(rcvbuf.st.address, pres[12]);
	rcvbuf.st.phone = atoi(pres[13]);
	strcpy(rcvbuf.st.posi, pres[14]);
	strcpy(rcvbuf.st.data, pres[15]);
	rcvbuf.st.laver = atoi(pres[16]);
	rcvbuf.st.salary = atoi(pres[17]);

	if (send(newfd, &rcvbuf, sizeof(rcvbuf), 0) < 0)
	{
		ERR_MSG("send");
		return -1;
	}
	if (flag == 0)
	{
		// 存储删除用户记录的信息
		char buf[] = "按照工号查询个人信息";
		history(name, buf);
	}
	else if (flag == 1)
	{
		// 存储删除用户记录的信息
		char buf[] = "按照姓名查询个人信息";
		history(name, buf);
	}
	return 0;
}

// 管理员查询历史记录
int do_See_History(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db)
{
	char **pres = NULL;
	int row, column;
	char *errmsg = NULL;
	char sql[128] = "";

	sprintf(sql, "%s", "select *from His");
	printf("%d:sql=%s\n", __LINE__, sql);
	if (SQLITE_OK != sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg))
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}
	printf("row=%d,column=%d\n", row, column);

	His Hisbuf;
	// 可能会出现沾包问题
	for (int i = column; i < (row + 1) * column; i += 4)
	{
		bzero(&Hisbuf, sizeof(Hisbuf));
		Hisbuf.type = 'Y';
		// 拼接历史记录/Y发送完N表示没发送完
		strcpy(Hisbuf.name, pres[i]);
		strcpy(Hisbuf.date, pres[i + 1]);
		strcpy(Hisbuf.data, pres[i + 2]);
		strcpy(Hisbuf.time, pres[i + 3]);
		if (send(newfd, &Hisbuf, sizeof(Hisbuf), 0) < 0)
		{
			ERR_MSG("send");
			return -1;
		}
	}
	bzero(&Hisbuf, sizeof(Hisbuf));
	// 发送完成
	Hisbuf.type = 'N';
	if (send(newfd, &Hisbuf, sizeof(Hisbuf), 0) < 0)
	{
		ERR_MSG("send");
		return -1;
	}
	return 0;
}

// 管理员修改用户
int do_See_Modi(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db, char *name)
{
	// 按照工号查询
	char **pres = NULL;
	int row, column;
	char *errmsg = NULL;

	int flag;
	if (rcvbuf.status == 'W')
	{
		char sql[600] = "";
		sprintf(sql, "%s'%s' %s%d %s'%s' %s%d %s'%s' %s'%s' %s%d %s%d  %s%d", "update MSG set name=", rcvbuf.st.account, "age=", rcvbuf.st.age, "address=", rcvbuf.st.address, "phone=", rcvbuf.st.phone, "posi=", rcvbuf.st.posi, "data=", rcvbuf.st.data, "laver=", rcvbuf.st.laver, "salary=", rcvbuf.st.salary, "where workno=", rcvbuf.st.workno);
		char *errmsg = NULL;
		printf("sql=%s\n", sql);
		if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
		{
			fprintf(stderr, "%d sqlite3_exec fail %s\n",
					__LINE__, errmsg);
			return -1;
		}
		flag = 0;
		// name char,workno int,age int,address char,phone int,posi char,data char,laver int,salary int
	}
	else if (rcvbuf.status == 'M')
	{ // 按照名字查询
		char sql[600] = "";
		sprintf(sql, "%s%d,%s%d,%s'%s',%s%d,%s'%s',%s'%s',%s%d,%s%d %s'%s'", "update MSG set workno=", rcvbuf.st.workno, "age=", rcvbuf.st.age, "address=", rcvbuf.st.address, "phone=", rcvbuf.st.phone, "posi=", rcvbuf.st.posi, "data=", rcvbuf.st.data, "laver=", rcvbuf.st.laver, "salary=", rcvbuf.st.salary, "where name=", rcvbuf.st.account);
		char *errmsg = NULL;
		printf("sql=%s\n", sql);
		if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
		{
			fprintf(stderr, "%d sqlite3_exec fail %s\n",
					__LINE__, errmsg);
			return -1;
		}

		flag = 1;
	}

	if (flag == 0)
	{
		// 存储删除用户记录的信息
		char buf[] = "按照工号修改个人信息";
		history(name, buf);
	}
	else if (flag == 1)
	{
		// 存储删除用户记录的信息
		char buf[] = "按照姓名修改个人信息";
		history(name, buf);
	}
	return 0;
}

// 查询用户
int do_See_User(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db, char *name)
{
	char **pres = NULL;
	int row, column;
	char *errmsg = NULL;
	char sql[128] = "";
	sprintf(sql, "%s'%s'", "select *from MSG where name=", rcvbuf.st.account);
	printf("%d:sql=%s\n", __LINE__, sql);
	if (SQLITE_OK != sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg))
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}
	printf("%s\n", pres[9]);
	printf("%s\n", pres[10]);
	printf("%s\n", pres[11]);
	printf("%s\n", pres[12]);
	printf("%s\n", pres[13]);
	printf("%s\n", pres[14]);
	printf("%s\n", pres[15]);
	printf("%s\n", pres[16]);
	printf("%s\n", pres[17]);
	bzero(&rcvbuf, sizeof(rcvbuf));

	strcpy(rcvbuf.st.account, pres[9]);
	rcvbuf.st.workno = atoi(pres[10]);
	rcvbuf.st.age = atoi(pres[11]);
	strcpy(rcvbuf.st.address, pres[12]);
	rcvbuf.st.phone = atoi(pres[13]);
	strcpy(rcvbuf.st.posi, pres[14]);
	strcpy(rcvbuf.st.data, pres[15]);
	rcvbuf.st.laver = atoi(pres[16]);
	rcvbuf.st.salary = atoi(pres[17]);

	printf("姓名:%s\n", rcvbuf.st.account);
	printf("年龄:%d\n", rcvbuf.st.age);
	printf("地址:%s\n", rcvbuf.st.address);
	printf("电话:%d\n", rcvbuf.st.phone);
	printf("职位:%s\n", rcvbuf.st.posi);
	printf("日期:%s\n", rcvbuf.st.data);
	printf("级别:%d\n", rcvbuf.st.laver);
	printf("薪资:%d\n", rcvbuf.st.salary);
	if (send(newfd, &rcvbuf, sizeof(rcvbuf), 0) < 0)
	{
		ERR_MSG("send");
		return -1;
	}
	// 存储删除用户记录的信息
	char buf[] = "普通用户查询个人信息";
	history(name, buf);
	return 0;
}

// 修改用户
int do_Modi_User(struct sockaddr_in cin, Msg rcvbuf, int newfd, sqlite3 *db, char *name)
{
	char sql[600] = "";
	sprintf(sql, "%s%d,%s%d,%s'%s',%s%d,%s'%s',%s'%s',%s%d,%s%d %s'%s'", "update MSG set workno=", rcvbuf.st.workno, "age=", rcvbuf.st.age, "address=", rcvbuf.st.address, "phone=", rcvbuf.st.phone, "posi=", rcvbuf.st.posi, "data=", rcvbuf.st.data, "laver=", rcvbuf.st.laver, "salary=", rcvbuf.st.salary, "where name=", rcvbuf.st.account);
	char *errmsg = NULL;
	printf("sql=%s\n", sql);
	if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		fprintf(stderr, "%d sqlite3_exec fail %s\n",
				__LINE__, errmsg);
		return -1;
	}
	// 存储删除用户记录的信息
	char buf[] = "用户修改个人信息";
	history(name, buf);
	return 0;
}

文章来源地址https://www.toymoban.com/news/detail-473537.html

到了这里,关于20230606项目:员工管理系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用mysql+实现客户端界面代码【(css+html+js)或者vue】做一个酒店管理系统

    鱼弦:CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)          设计内容: 两种身份的用户 1)普通客户:自己个人信息的管理、预定房间功能、收银结账功 能(押金,退房,账单处理): 2)管理

    2024年02月08日
    浏览(45)
  • 架构设计参考项目系列主题:新零售SaaS架构:客户管理系统架构设计

    什么是客户管理系统? 客户管理系统,也称为CRM(Customer Relationship Management),主要目标是建立、发展和维护好客户关系。 CRM系统围绕客户全生命周期的管理,吸引和留存客户,实现缩短销售周期、降低销售成本、增加销售收入的目的,从而提高企业的盈利能力和竞争力。

    2024年04月14日
    浏览(51)
  • Javaweb实现员工信息管理系统

    1、项目用到的技术栈 开发工具:idea 语言:java、js、html+ajax 数据库:MySQL 服务器:Tomcat 框架:mybatis、jQuery、layui 2、项目实现功能 管理员、部门负责人、员工登录和退出功能以及用户注册功能(根据不同的账号密码进入不同的页面,注册页面以及登录都有校验 管理员可查看

    2024年02月11日
    浏览(39)
  • C语言员工信息管理系统

    1.题目及总体设计 题目:员工信息管理系统 总体设计:1.实现添加功能,即添加员工的相关信息。 2.实现查看功能,即显示系统中所有员工的相关信息。 3.实现查找功能,即可以通过多种条件对员工进行查询。 4.实现修改功能,即输入员工的姓名修改其相关信息。 5.实现删除

    2024年02月07日
    浏览(50)
  • Java基础(员工工资管理系统)

    某公司的雇员分为以下若⼲类: SalariedEmployee :拿固定⼯资的员⼯。 HourlyEmployee :按⼩时拿⼯资的员⼯,每⽉⼯作超出 160 ⼩时的部分按照 1.5 倍⼯资发放  SalesEmployee :销售⼈员,⼯资由⽉销售额和提成率决定。3万以下,提成率5%,3万以上提成率8%  BasePlusSalesEmployee :有固

    2023年04月27日
    浏览(38)
  • 员工管理系统:删除及404处理

       

    2024年02月14日
    浏览(29)
  • Java员工信息管理系统(注释全)

     

    2024年02月12日
    浏览(45)
  • 基于java的员工绩效考核管理系统

    本员工绩效考核系统采用java语言开发,为企业员工的绩效考核的运行做基础,主要包括登陆模块,管理员管理,员工管理,薪酬管理,员工可以进行薪酬查询.系统开发环境是Myeclipse,数据库是mysql,基于web访问,简单方面.文档有配套论文等.适用范围\\\"毕业设计,课程设计等\\\" (一)登录模

    2023年04月15日
    浏览(48)
  • Java实现的企业员工考勤管理系统

    目录 一、引言 2 编写目的 2 项目背景 2 二、总体设计 3 2.1运行要求 3 2.2接口设计 3 2.3构架设计 3 2.4基本设计概念和处理流程 3 2.5结构 5 2.6功能需求与各模块之间关系 6 2.6.1基本信息管理模块 6 2.6.2个人出勤管理模块 10 2.6.3出勤管理模块 14 三、数据的逻辑描述 17 3.1 静态数据

    2024年02月09日
    浏览(48)
  • 企业员工信息管理系统的设计与实现

    分类号_______________ 密级________________ UDC _______________ 学号_ ___ 毕业设计(论文) 论文题目 企业员工信息管理系统的设计与实现 Thesis Topic Design and implementation of enterprise employee information management system 毕业设计(论文)任务书 毕业设计(论文)题目:企业员工信息管理系统的设

    2024年02月10日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包