From 994f0848d379fd3d6cec596f5deae716abae528c Mon Sep 17 00:00:00 2001 From: zhouzian Date: Wed, 3 Jul 2019 20:47:29 +0800 Subject: [PATCH] =?UTF-8?q?Mod=20aaa-12=20=E6=B7=BB=E5=8A=A0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E6=88=B7-web=E3=80=81=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=94=A8=E6=88=B7-=E5=91=BD=E4=BB=A4=E8=A1=8C=20RCA=EF=BC=9A?= =?UTF-8?q?=20SOL=EF=BC=9A=20=E4=BF=AE=E6=94=B9=E4=BA=BA=EF=BC=9Azhouzian?= =?UTF-8?q?=20=E6=A3=80=E8=A7=86=E4=BA=BA=EF=BC=9Azhouzian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/sg/user/user_manager/user.h | 32 ++++- Product/common/common_user.h | 8 ++ Product/user/user_manager/user.c | 187 +++++++++++++++++++++++-- Product/user/user_manager/user_group.c | 1 + Product/user/user_manager/user_mod.c | 151 ++++++++++++++++++++ Product/user/user_manager/user_mod.h | 23 +++ 6 files changed, 391 insertions(+), 11 deletions(-) create mode 100644 Product/user/user_manager/user_mod.c create mode 100644 Product/user/user_manager/user_mod.h diff --git a/Common/sg/user/user_manager/user.h b/Common/sg/user/user_manager/user.h index 56c6b5d51..0a5551b11 100644 --- a/Common/sg/user/user_manager/user.h +++ b/Common/sg/user/user_manager/user.h @@ -1,12 +1,14 @@ #ifndef USER_H_ #define USER_H_ #include +#include #include "user_group.h" #define UNAMESIZE (127 + 1) #define UDESIZE (127 + 1) #define UPWDSIZE (63 + 1) #define UTIME 20 +#define USER_ATTRIBUTE_NUM 7 #define ADD_FAIL_NOGROUP 1 #define ADD_FAIL_NAMELEN 2 @@ -18,15 +20,29 @@ typedef struct user { unsigned short ID; //用户id + unsigned short GID; //用户组ID unsigned short multi_valid; //多人登陆、永久有效 - int GID; //用户组ID char uname[UNAMESIZE]; //用户名 - char udescription[UDESIZE]; //用户描述 char passwd[UPWDSIZE]; //密码 + char udescription[UDESIZE]; //用户描述 time_t valid_begin_time; //有效期开始时间 time_t valid_end_time; //有效期结束时间 }USERACCOUNT; +typedef struct userlist +{ + unsigned short ID; + unsigned short GID; + unsigned short multi; + unsigned short valid; + char uname[UNAMESIZE]; + char gname[GNAMESIZE]; + char passwd[UPWDSIZE]; + char udescription[UDESIZE]; + char valid_begin_time[UTIME]; + char valid_end_time[UTIME]; +}USERLIST; + typedef struct result_user_add { int result; @@ -39,4 +55,16 @@ int init_user(); /*添加元素-新增用户*/ void usermanager_add_user(char* UNAME, char* UGNAME, USERADD* UADDRES); +/* 按用户ID查询用户 */ +void get_user_by_id(unsigned short ID, USERLIST* ULIST); + +/* 修改用户-web */ +bool mod_user_web(USERLIST* ULIST); + +/* 根据用户名查询用户ID */ +unsigned short get_userid_by_name(char* UNAME); + +/* 修改用户-命令行 */ +bool mod_user_line(char* UNAME, const int INTYPE, char* IN); + #endif \ No newline at end of file diff --git a/Product/common/common_user.h b/Product/common/common_user.h index f7c590d2e..206244580 100644 --- a/Product/common/common_user.h +++ b/Product/common/common_user.h @@ -21,4 +21,12 @@ do { \ time_int = mktime(&tm_time); \ } while (0) +#define MULTI_MASK 0x0002 +#define VALID_MASK 0x0001 + +#define MULTI_GET(element) ((element) >> 1) +#define MULTI_SET(element, value) (((element) & VALID_MASK) | (((value) << 1) & MULTI_MASK)) +#define VALID_GET(element) ((element) & VALID_MASK) +#define VALID_SET(element, value) (((element) & MULTI_MASK) | ((value) & VALID_MASK)) + #endif diff --git a/Product/user/user_manager/user.c b/Product/user/user_manager/user.c index 213471af5..442fcbe95 100644 --- a/Product/user/user_manager/user.c +++ b/Product/user/user_manager/user.c @@ -1,21 +1,16 @@ #include #include #include +#include #include "../../common/common_user.h" #include "array_index.h" #include "user_group.h" #include "user.h" - -#define MULTI_MASK 0x0002 -#define VALID_MASK 0x0001 - -#define MULTI_GET(element) ((element) >> 1) -#define MULTI_SET(element, value) (((element) & VALID_MASK) | (((value) << 1) & MULTI_MASK)) -#define VALID_GET(element) ((element) & VALID_MASK) -#define VALID_SET(element, value) (((element) & MULTI_MASK) | ((value) & VALID_MASK)) +#include "user_mod.h" extern ARRAY g_user_index_head; -extern USERGROUP g_group_table[GROUP_INDEX_MAX]; +extern USERGROUP g_group_table[]; +extern exce_mod_user g_user_modfunc_table[]; USERACCOUNT g_user_table[USER_INDEX_MAX]; /*初始化参数*/ @@ -99,4 +94,178 @@ void usermanager_add_user(char* uname, char* gname, USERADD* uaddres) uaddres->userID = ID; return; +} + +/* 按用户ID查询用户 */ +void get_user_by_id(unsigned short ID, USERLIST* ulist) +{ + unsigned short temp_multi, temp_valid; + char temp_begin_time[UTIME] = { 0 }; + char temp_end_time[UTIME] = { 0 }; + + if (NULL == ulist || INVALID_INDEX >= ID || (USER_INDEX_MAX - 1) <= ID) + { + return NULL; + } + + memset(ulist, 0, sizeof(ulist)); + + /* 内存查询用户 */ + temp_multi = MULTI_GET(g_user_table[ID].multi_valid); + temp_valid = VALID_GET(g_user_table[ID].multi_valid); + + ulist->ID = ID; + ulist->GID = g_user_table[ID].GID; + ulist->multi = temp_multi; + ulist->valid = temp_valid; + strcpy(ulist->uname, g_user_table[ID].uname); + strcpy(ulist->gname, g_group_table[ulist->GID].gname); + strcpy(ulist->udescription, g_user_table[ID].udescription); + strcpy(ulist->passwd, g_user_table[ID].passwd); + + if (1 == temp_valid) + { + TIME_T2STRING(g_user_table[ID].valid_begin_time, temp_begin_time); + TIME_T2STRING(g_user_table[ID].valid_end_time, temp_end_time); + } + + strcpy(ulist->valid_begin_time, temp_begin_time); + strcpy(ulist->valid_end_time, temp_end_time); + + /* 查数据库,这里查数据库没上面快 */ + /* SELECT id, group_id, multi_player, valid_always, user_name, udescription,valid_begin_time,valid_end_time FROM `user`WHERE id = */ + + return; +} + +/* 修改用户-web */ +bool mod_user_web(USERLIST* ulist) +{ + USERLIST* temp_user; + time_t cur_time; + /* 可以修改的数据:用户组ID、描述、密码、公用账号、永久有效、有效期开始时间、有效期结束时间 */ + if (NULL == ulist || INVALID_INDEX == ulist->ID || INVALID_INDEX == ulist->GID) + { + return false; + } + + /* 校验描述长度 */ + if (NULL != ulist->udescription) + { + if (UDESIZE < strlen(ulist->udescription)) + { + return false; + } + } + + /* 校验密码长度 */ + if (NULL != ulist->passwd) + { + if (8 >= strlen(ulist->passwd) || 24 <= strlen(ulist->passwd)) + { + return false; + } + } + + temp_user = (USERLIST*)malloc(sizeof(USERLIST)); + if (NULL == temp_user) + { + return false; + } + get_user_by_id(ulist->ID, temp_user); + + /* 更新内存数据 */ + strcpy(g_user_table[ulist->ID].udescription, ulist->udescription); + strcpy(g_user_table[ulist->ID].passwd, ulist->passwd); + + g_user_table[ulist->ID].GID = ulist->GID; + g_user_table[ulist->ID].multi_valid = MULTI_SET(g_user_table[ulist->ID].multi_valid, ulist->multi); + g_user_table[ulist->ID].multi_valid = VALID_SET(g_user_table[ulist->ID].multi_valid, ulist->valid); + /* 更新有效日期时间 */ + if (1 == ulist->valid) + { + //if(判断是否符合格式) + + STRING2TIME_T(ulist->valid_begin_time, g_user_table[ulist->ID].valid_begin_time); + STRING2TIME_T(ulist->valid_end_time, g_user_table[ulist->ID].valid_end_time); + return true; + } + + /* 连接数据库,更显user表 */ + /* UPDATE `user` u SET u.group_id = ,u.udescription = "", u.`password` = "", u.multi_player = , u.valid_always = , u.valid_begin_time = "", u.valid_end_time = "" WHERE u.id = ; */ + + /* 调用接口,查询该用户是否有在线IP */ + /* 如果没有,直接return */ + + /* 密码发生改变,下线用户 */ + if (0 != strcmp(ulist->passwd, temp_user->passwd)) + { + /* 下线用户,return */ + } + + /* 公用账号改为单用户登陆,下线用户 */ + if (1 == ulist->multi && 0 == temp_user->multi) + { + /* 下线用户,return */ + } + + /* 当前时间不在有效期内,下线用户 */ + if (1 == VALID_GET(g_user_table[ulist->ID].multi_valid)) + { + cur_time = time(NULL); + if (cur_time < g_user_table[ulist->ID].valid_begin_time || cur_time > g_user_table[ulist->ID].valid_end_time) + { + /* 下线用户,return */ + } + } + + return true; +} + +unsigned short get_userid_by_name(char* uname) +{ + /* 内存查询数据 */ + unsigned short UID_temp = INVALID_INDEX; + if (NULL == uname) + { + return UID_temp; + } + for (int i = 0; i < USER_INDEX_MAX && UID_temp == INVALID_INDEX; i++) + { + UID_temp = GETID(g_user_table[i].ID, uname, g_user_table[i].uname); + } + + /* 连接数据库,根据用户组名查询user表中的id */ + /* SELECT id FROM user WHERE user_name = "" */ + + return UID_temp; +} + +/* 修改用户-命令行 */ +bool mod_user_line(char* uname, const int intype, char* in) +{ + unsigned short uid; + bool result = true; + if (NULL == uname || NULL == in) + { + return false; + } + + /* 检查修改类型 */ + if (intype < 0 || intype >= USER_ATTRIBUTE_NUM) + { + return false; + } + + /* 根据用户名查询用户ID */ + uid = get_userid_by_name(uname); + if (INVALID_INDEX == uid) + { + return false; + } + + /*(0)描述、(1)所属组名、(2)登陆密码、(3)公用账号、(4)永久有效、(5)有效期开始时间、(6)有效期结束时间 */ + result = g_user_modfunc_table[intype](uid, in); + + return result; } \ No newline at end of file diff --git a/Product/user/user_manager/user_group.c b/Product/user/user_manager/user_group.c index b2bb9ddea..56033228b 100644 --- a/Product/user/user_manager/user_group.c +++ b/Product/user/user_manager/user_group.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "array_index.h" #include "user_group.h" #include "../../common/common_user.h" diff --git a/Product/user/user_manager/user_mod.c b/Product/user/user_manager/user_mod.c new file mode 100644 index 000000000..c81821cd1 --- /dev/null +++ b/Product/user/user_manager/user_mod.c @@ -0,0 +1,151 @@ +#include +#include "user_mod.h" +#include "user_group.h" +#include "user.h" +#include "array_index.h" +#include "common_user.h" + +/* 修改用户函数数组 */ +exce_mod_user g_user_modfunc_table[USER_ATTRIBUTE_NUM] = {mod_user_des, + mod_user_group, + mod_user_passwd, + mod_user_multi, + mod_user_valid, + mod_user_valid_begin_time, + mod_user_valid_end_time}; + +extern USERACCOUNT g_user_table[USER_INDEX_MAX]; + +bool mod_user_des(unsigned short uid, char* des) +{ + if (UDESIZE < strlen(des)) + { + return false; + } + strcpy(g_user_table[uid].udescription, des); + + /* 连接数据库,修改user表中的描述 */ + /* UPDATE `user` u SET u.udescription = "" WHERE u.id = ; */ + + return true; +} + +bool mod_user_group(unsigned short uid, char* gname) +{ + unsigned short gid = get_groupid_by_name(gname); + if (INVALID_INDEX == gid) + { + return false; + } + g_user_table[uid].GID = gid; + + /* 连接数据库,修改user表中的用户组id */ + /* UPDATE `user` u SET u.group_id = WHERE u.id = ; */ + + /* 强制用户下线 */ + + return true; +} + +bool mod_user_passwd(unsigned short uid, char* passwd) +{ + if (8 >= strlen(passwd) || 24 <= strlen(passwd)) + { + return false; + } + strcpy(g_user_table[uid].passwd, passwd); + + /* 连接数据库,修改user表中的密码 */ + /* UPDATE `user` u SET u.password = WHERE u.id = ; */ + + /* 强制用户下线 */ + + return true; +} + +bool mod_user_multi(unsigned short uid, char* multi) +{ + unsigned short multi_old; + unsigned short multi_new = atoi(multi); + if (0 != multi_new && 1 != multi_new) + { + return false; + } + multi_old = MULTI_GET(g_user_table[uid].multi_valid); + g_user_table[uid].multi_valid = MULTI_SET(g_user_table[uid].multi_valid, multi_new); + + /* 连接数据库,修改user表中的multi_player */ + /* UPDATE `user` u SET u.multi_player = WHERE u.id = ; */ + + if (0 == multi_old && 1 == multi_new) + { + /* 强制用户下线 */ + } + + return true; +} + +void mod_user_valid_offline(unsigned short uid) +{ + time_t cur_time; + + if (1 == VALID_GET(g_user_table[uid].multi_valid)) + { + cur_time = time(NULL); + if (cur_time < g_user_table[uid].valid_begin_time || cur_time > g_user_table[uid].valid_end_time) + { + /* 强制用户下线 */ + } + } +} + +bool mod_user_valid(unsigned short uid, char* valid) +{ + unsigned short valid_new = atoi(valid); + //校验数据 + if (0 != valid_new && 1 != valid_new) + { + return false; + } + g_user_table[uid].multi_valid = VALID_SET(g_user_table[uid].multi_valid, valid_new); + + /* 连接数据库,修改user表中的valid_always */ + /* UPDATE `user` u SET u.valid_always = WHERE u.id = ; */ + + mod_user_valid_offline(uid); + + return true; +} + +bool mod_user_valid_begin_time(unsigned short uid, char* valid_start_time) +{ + time_t temp_time; + + /* 校验vaild是否符合"%Y-%m-%d %H:%M:%S"格式,不符合直接return */ + + STRING2TIME_T(valid_start_time, temp_time); + g_user_table[uid].valid_begin_time = temp_time; + + /* 连接数据库,修改user表中的valid_begin_time */ + /* UPDATE `user` u SET u.valid_begin_time = WHERE u.id = ; */ + + mod_user_valid_offline(uid); + + return true; +} + +bool mod_user_valid_end_time(unsigned short uid, char* valid_end_time) +{ + time_t temp_time; + /* 校验vaild是否符合"%Y-%m-%d %H:%M:%S"格式,不符合直接return */ + + STRING2TIME_T(valid_end_time, temp_time); + g_user_table[uid].valid_end_time = temp_time; + + /* 连接数据库,修改user表中的valid_end_time */ + /* UPDATE `user` u SET u.valid_end_time = WHERE u.id = ; */ + + mod_user_valid_offline(uid); + + return true; +} \ No newline at end of file diff --git a/Product/user/user_manager/user_mod.h b/Product/user/user_manager/user_mod.h new file mode 100644 index 000000000..707e467e2 --- /dev/null +++ b/Product/user/user_manager/user_mod.h @@ -0,0 +1,23 @@ +#ifndef USER_MOD_H_ +#define USER_MOD_H_ +#include + +/* 修改用户属性的函数指针 */ +typedef bool (*exce_mod_user)(unsigned short, char*); +/* 修改用户描述 */ +bool mod_user_des(unsigned short uid, char *in); +/* 修改用户组 */ +bool mod_user_group(unsigned short uid, char* in); +/* 修改用户密码 */ +bool mod_user_passwd(unsigned short uid, char* in); +/* 修改多用户登陆 */ +bool mod_user_multi(unsigned short uid, char* in); +/* 修改用户永久有效 */ +bool mod_user_valid(unsigned short uid, char* in); +/* 修改有效期开始时间 */ +bool mod_user_valid_begin_time(unsigned short uid, char* valid); +/* 修改有效期结束时间 */ +bool mod_user_valid_end_time(unsigned short uid, char* valid); + + +#endif \ No newline at end of file