Mysql —— C语言链接mysql数据库,用户 角色 权限 用户组(新增了用户组)

chengelog:

1、新增 添加用户组模块;
2、新增 显示用户组模块;
3、修改 新增用户模块 选择 其所属用户组 并把用户id与用户组id 写入用户用户组关系表;
4、新增 修改用户以及删除用户组模块(有用户属于该用户组 用户组名字不允许更改 用户组不允许删除);
        5、新增 增加用户、用户组时候,若要增加的用户名已存在(给出用户存在的提示信息);
6、修改了 显示的界面问题;
7、修改部分switch case 输入为字符;
8、修改部分 操作完成后 有两次回车 确认的问题;
遗留的问题:
1、switch case 输入为字符,应该改为case a:bresk; case b:break;…… 否则输入的1与10是一样的执行结果;
字符中只有数字0-9;
2、在remark字段中 scanf()函数是不允许输入空格的。

数据库图标显示:


表内字段设置:

puts("create users table");
		executesql("create table users(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,password_ char(32) not null,create_time_ datetime,creator_id_ int(11) unsigned,auth_type_ int(11) not null,dyn_sn_ char(10),dyn_pass_sn_ text,remark_ varchar(200),foreign key(creator_id_) references users(id_));");	
puts("create usergroups table");	
executesql("create table usergroups(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,create_time_ datetime,enable_type_ int(11) not null,policy_type_ char(255),remark_ varchar(200));");
puts("create roles table");
		executesql("create table roles(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,remark_ varchar(200));");
puts("create authoritys table");
		executesql("create table authoritys(id_ int(11) unsigned primary key auto_increment,name_ varchar(24) not null unique,remark_ varchar(200));");

puts("create roleAuthority table");
		executesql("create table roleAuthority(role_id_ int(11) unsigned,authority_id_ int(11) unsigned,primary key(role_id_,authority_id_),foreign key(role_id_ ) references roles(id_ ),foreign key(authority_id_) references authoritys(id_));"); 
puts("create userGroupUser table");
executesql("create table userGroupUser(user_id_ int(11) unsigned,usergroup_id_ int(11) unsigned,primary key(user_id_,usergroup_id_),foreign key(user_id_) references users(id_),foreign key(usergroup_id_ ) references usergroups (id_));");
puts("create userRole table");
		executesql("create table userRole(user_id_ int(11) unsigned,role_id_ int(11) unsigned,primary key(user_id_,role_id_),foreign key(user_id_) references users(id_),foreign key(role_id_ ) references roles(id_));");

代码模块:

/********************************************
 * 编译命令:gcc userGroupUser_succ.c -lmysqlclient -o userGroupUser_succ
 * 执行命令:./db
 * ******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mysql/mysql.h"

MYSQL *g_conn;//mysql 链接  
MYSQL_RES *g_res;//mysql 记录集  
MYSQL_ROW g_row;//字符串数组,mysql 记录行

const char *g_host_name = "localhost";
const char *g_user_name = "root";
const char *g_password = "asdfgh";
const char *g_db_name = "test";
const unsigned int g_db_port = 3306;

#define MAX_BUF_SIZE 1024 //缓冲区最大字节数
char sql[MAX_BUF_SIZE];
char Time[MAX_BUF_SIZE];

int iNum_rows = 0;//mysql语句执行结果返回行数赋初值  
int flag = 0;//管理员权限开关  
int i = 1;//系统运行开关  

//登录使用的结构体
struct Login
{
	char name[24];
	char password[20];
}login;
//用户组对应策略的开关  (0:enable 1:disabled)
enum poliState{poliEnable,poliDisable};
//认证的方式  口令认证、KEY认证、第三方认证
enum authType{Passauth=0,Keyauth=1,Thpaauth=2};
//操作使用的结构体  
struct Operation  
{  
	char tables[24];  
	char name[24];  
	char passwd[20];  
	char role[24];  
	char remark[20];  
	char authtype[255]; //可以根据变量的类型 做认证操作
	char passauth[255];
	char keyauth[255];
	char policy[255]; //输入的策略
}ope;
/****************************************************
 * time : 20180622
 * addby : swj
 * function :print_mysql_error() 打印错误信息
 * ******************************************************/
void print_mysql_error(const char *msg)
{
	if(msg)
		printf("%s: %s\n",msg,mysql_error(g_conn));
	else
		puts(mysql_error(g_conn));
}
/****************************************************
 * time : 20180622
 * addby : swj
 * function :executesql() 执行sql语句,成功返回0,失败返回-1 
 ******************************************************/
int executesql(const char * sql)
{
	if(mysql_real_query(g_conn,sql,strlen(sql)))
		return -1;
	return 0;
}
/****************************************************
 * time : 20180622
 * addby : swj
 * function :init_mysql() 初始化链接
 ******************************************************/
int init_mysql()
{
	//init the database connection 
	g_conn = mysql_init(NULL);
	//connection the database 
	if(!mysql_real_connect(g_conn,g_host_name,g_user_name,g_password,g_db_name,g_db_port,NULL,0))
		return -1;//链接失败
	if(executesql("set names utf8"))
		return -1;
	return 0; //返回成功
}

/****************************************************
 * time : 20180622
 * addby : swj
 * function :create_database()  选择数据库 没有的时候 创建数据;有的时候 进去数据库 
 * ******************************************************/
void create_database()
{
	sprintf(sql,"use workuserGroupuser");
	if(executesql(sql) == -1)
	{
		puts("create database");
		executesql("create database workuserGroupuser;");
		print_mysql_error(NULL);
		puts("choice database");
		executesql("use workuserGroupuser;");
		print_mysql_error(NULL);
		puts("!!!Initialize the success!!!");
	}
	else
	{
		executesql("use workuserGroupuser;");
		print_mysql_error(NULL);
	}

}
/****************************************************
 * time : 20180622
 * addby : swj
 * function :create_table()  创建表 
 * ******************************************************/
void create_table()
{
	sprintf(sql,"show tables;");
	executesql(sql);
	g_res = mysql_store_result(g_conn);
	//	printf("g_res = %d\n",g_res);
	iNum_rows = mysql_num_rows(g_res);
	//	printf("iNum_rows = %d\n",iNum_rows);
	if(iNum_rows == 0)
	{
		puts("create users table");
		executesql("create table users(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,password_ char(32) not null,create_time_ datetime,creator_id_ int(11) unsigned,auth_type_ int(11) not null,dyn_sn_ char(10),dyn_pass_sn_ text,remark_ varchar(200),foreign key(creator_id_) references users(id_));");
		puts("create usergroups table");	
		executesql("create table usergroups(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,create_time_ datetime,enable_type_ int(11) not null,policy_type_ char(255),remark_ varchar(200));");		
		puts("create roles table");
		executesql("create table roles(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,remark_ varchar(200));");
		puts("create authoritys table");
		executesql("create table authoritys(id_ int(11) unsigned primary key auto_increment,name_ varchar(24) not null unique,remark_ varchar(200));");

		puts("create roleAuthority table");
		executesql("create table roleAuthority(role_id_ int(11) unsigned,authority_id_ int(11) unsigned,primary key(role_id_,authority_id_),foreign key(role_id_ ) references roles(id_ ),foreign key(authority_id_) references authoritys(id_));"); 
		puts("create userGroupUser table");
		executesql("create table userGroupUser(user_id_ int(11) unsigned,usergroup_id_ int(11) unsigned,primary key(user_id_,usergroup_id_),foreign key(user_id_) references users(id_),foreign key(usergroup_id_ ) references usergroups (id_));");
		puts("create userRole table");
		executesql("create table userRole(user_id_ int(11) unsigned,role_id_ int(11) unsigned,primary key(user_id_,role_id_),foreign key(user_id_) references users(id_),foreign key(role_id_ ) references roles(id_));");
	}
	mysql_free_result(g_res);//释放结果集	
}
/****************************************************
 * time : 20180622
 * addby : swj
 * function :init_administrator() 初始化管理员账户
 * 		 管理员用户名:root  密码:root
 * ******************************************************/
void init_administrator()
{
	//查询users表
	sprintf(sql,"select * from users where id_='1' and name_='root';");
	executesql(sql);
	g_res = mysql_store_result(g_conn);
	iNum_rows = mysql_num_rows(g_res);
	if(iNum_rows == 0)
	{
		puts("Init Administrtor User");
		//插入管理员用户
		//printf("Passauth = %d\n",Passauth);
		sprintf(sql,"insert into users values(1,'root','root','2017-08-18 12:21:11',1,0,'','','0:VIP 1:local pwd 2:local cert');");  
		//0:VIP 1:local pwd 2:local cert 4:2-fa/ cert+pw 5:2-fa / dyn + pw');
		executesql(sql);
	}
	mysql_free_result(g_res); //释放结果集
	//查询roles表
	sprintf(sql,"select * from roles;");
	executesql(sql);
	g_res = mysql_store_result(g_conn);
	iNum_rows = mysql_num_rows(g_res);
	if(iNum_rows < 3)
	{
		puts("Init System Role");
		//插入系统角色
		sprintf(sql,"insert into roles values(1,'ADMINISTRTOR','administrtor');");
		executesql(sql);
		sprintf(sql,"insert into roles values(2,'USER','user');");
		executesql(sql);
		sprintf(sql,"insert into roles values(3,'OTHER','other');");
		executesql(sql);
	}
	mysql_free_result(g_res); //释放结果集
	//查询usergroups表
	sprintf(sql,"select * from usergroups where id_='1' and name_='root';");
	executesql(sql);
	g_res = mysql_store_result(g_conn);
	iNum_rows = mysql_num_rows(g_res);
	if(iNum_rows == 0)
	{
		puts("Init Administrtor usergroups");
		//插入管理员所在用户组
		sprintf(sql,"insert into usergroups values(1,'root','2017-06-26 12:21:11',0,'aa','0:enable 1:disabled');");  
		executesql(sql);
	}
	mysql_free_result(g_res); //释放结果集
	//查询authoritys表  
	sprintf(sql,"select * from authoritys;");  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res);  
	if(iNum_rows < 3)  
	{  
		puts("Init System Authority");  
		//插入系统权限  
		sprintf(sql,"insert into authoritys values(1,'QUERY','query');");  
		executesql(sql);  
		sprintf(sql,"insert into authoritys values(2,'ADD','addmsg');");  
		executesql(sql);  
		sprintf(sql,"insert into authoritys values(3,'ADD&QUERY','query and addmsg');");  
		executesql(sql);  
		sprintf(sql,"insert into authoritys values(4,'DEL&ALT','delete and alter');");  
		executesql(sql);  
		sprintf(sql,"insert into authoritys values(5,'QUERY&DEL&ALT','query and delete and alter');");  
		executesql(sql);  
		sprintf(sql,"insert into authoritys values(6,'ADD&DEL&ALT','addmsg and delete and alter');");  
		executesql(sql);  
		sprintf(sql,"insert into authoritys values(7,'QUERY&ADD&DEL&ALT','query and addmsg and delete and alter');");  
		executesql(sql);  
	}  
	mysql_free_result(g_res); // 释放结果集  
	//查询roleAuthority表  
	sprintf(sql,"select * from roleAuthority;");  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res);  
	if(iNum_rows < 3)  
	{  
		puts("Init RoleAuthority");  
		//插入角色权限  
		sprintf(sql,"insert into roleAuthority values(1,7);");  
		executesql(sql);  
		sprintf(sql,"insert into roleAuthority values(2,3);");  
		executesql(sql);  
		sprintf(sql,"insert into roleAuthority values(3,1);");  
		executesql(sql);          
	}  
	mysql_free_result(g_res); // 释放结果集  
	//查询userGroupUser表
	sprintf(sql,"select * from userGroupUser where user_id_='1' and usergroup_id_='1';");
	executesql(sql);
	g_res = mysql_store_result(g_conn);
	iNum_rows = mysql_num_rows(g_res);
	if(iNum_rows == 0)
	{
		puts("Init userGroupUser");
		//插入管理员用户所在组
		sprintf(sql,"insert into userGroupUser values(1,1);");
		executesql(sql);
	}
	mysql_free_result(g_res); // 释放结果集 
	//查询userRole表
	sprintf(sql,"select * from userRole where user_id_='1' and role_id_='1';");
	executesql(sql);
	g_res = mysql_store_result(g_conn);
	iNum_rows = mysql_num_rows(g_res);
	if(iNum_rows == 0)
	{
		puts("Init User Role");
		//插入管理员用户
		sprintf(sql,"insert into userRole values(1,1);");
		executesql(sql);
	}
	mysql_free_result(g_res); // 释放结果集 
}
/****************************************************
 * time : 20180624
 * addby : swj
 * function :user_login() 用户登录
 * 		 管理员用户名:root  密码:root
 * ******************************************************/
void user_login()
{
	puts("Init success,please put any key to continue!");
	while(1)
	{
		while((getchar()) != '\n');
		system("clear");
		printf("\t       ☆.°∴°☆﹒﹒‧☆°∴°☆.∴°☆☆.°∴°☆ ☆.°∴°☆☆.°∴°\n");
		printf("\t      ╰ /∕﹨\      /∕﹨\ ╰╮      /∕﹨\\n");
		printf("\t     /     \   /       \  /    \\n");
		printf("\t    /        /        \        \\n");
		printf("\t    ∕   ●   ●  ∕   ●   ●   ﹨  ●   ●  ﹨\n");
		printf("\t   |  ○   ▽  |  ○   ▽  ○ ︱         ▽ ○  ︱\n");
		printf("\t   ◥██████████████████████████████████████████████████████◤\n");
		printf("\t  ╭══════════════════════════════════════════════■□■□══════╮\n");  
		printf("\t  │                        Login interface                 │\n");  
		printf("\t  ╰══════■□■□══════════════════════════════════════════════╯\n");
		//输入登录的用户名和密码
		printf("\n\t\t→_→	Name:");scanf("%s",login.name);
		printf("\n\t\t→_→	Passwd:");scanf("%s",login.password);
		//在数据库中查询,可查询到信息即表明users表中有账号信息,登录成功
		sprintf(sql,"select * from users where name_='%s' and password_='%s';",login.name,login.password); 
		executesql(sql);
		g_res = mysql_store_result(g_conn);
		iNum_rows = mysql_num_rows(g_res);
		if(iNum_rows != 0)
		{
			puts("\n\t\t\t!!! Login Success !!! ");
			while ((getchar()) != '\n');
			getchar();
			break;
		}
		else
		{
			puts("\n\t\t\t!!!Login Failed!!! Check name or password!");
			while ((getchar()) != '\n');
		}
	}
	mysql_free_result(g_res); // 释放结果集  
}

/****************************************************
 * time : 20180625
 * addby : swj
 * function :judge() 权限判定函数
 * ******************************************************/
int judge(int authority)
{
	int auth = 0;  
	//通过当前登录的用户名字获取用户id  
	sprintf(sql,"select id_ from users where name_='%s';",login.name);  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res);  
	int iNum_fields = mysql_num_fields(g_res);  
	while((g_row=mysql_fetch_row(g_res))){  
		//通过当前登录用户的id查询这个用户的角色id  
		sprintf(sql,"select role_id_ from userRole where user_id_='%s';",g_row[0]);  
	}  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res);  
	iNum_fields = mysql_num_fields(g_res);  
	while((g_row=mysql_fetch_row(g_res))){  
		//通过当前用户的角色id查询该用户的权限id  
		sprintf(sql,"select authority_id_ from roleAuthority where role_id_='%s';",g_row[0]);  
	}  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res);  
	iNum_fields = mysql_num_fields(g_res);  
	while((g_row=mysql_fetch_row(g_res))){  
		//通过当前用户的权限id查询权限级别  
		sprintf(sql,"select name_ from authoritys where id_='%s';",g_row[0]);  
	}  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res);  
	iNum_fields = mysql_num_fields(g_res);  
	while((g_row=mysql_fetch_row(g_res))){  
		if(strcmp(g_row[0],"QUERY") == 0)  
			auth = 1;  
		if(strcmp(g_row[0],"ADD") == 0)  
			auth = 2;  
		if(strcmp(g_row[0],"ADD&QUERY") == 0)  
			auth = 3;  
		if(strcmp(g_row[0],"DEL&ALT") == 0)  
			auth = 4;  
		if(strcmp(g_row[0],"QUERY&DEL&ALT") == 0)  
			auth = 5;  
		if(strcmp(g_row[0],"ADD&DEL&ALT") == 0)  
			auth = 6;  
		if(strcmp(g_row[0],"QUERY&ADD&DEL&ALT") == 0)  
			auth = 7;  
		if(auth >= 4)  
			flag = 1;//管理员权限开关  
		//判断该用户权限级别能否执行将要进行的操作  
		if(auth < authority)  
		{  
			mysql_free_result(g_res); // 释放结果集  
			return 0;  
		}  
		else  
		{  
			mysql_free_result(g_res); // 释放结果集  
			return 1;  
		}  
	}     
}
/****************************************************
 * time : 20180625
 * addby : swj
 * function :display() 显示所有用户及用户角色函数
 * ******************************************************/
void display()
{
	//通过权限判定函数的返回值决定是否可以进行显示所有用户操作,other用户不可使用此功能
	//当时other用户登录的时候  judge中的auth会被赋值为1 调用的时候形参为2  1<2 return0
	//判断条件judge(2) == 0 成立 所以判定此时为other 用户登录
	if(judge(2) == 0){
		puts("\n\t\t\t!!!Insufficient permissions!!! ");
		while ((getchar()) != '\n');
		getchar();
		//权限不够,退出函数
		return ;
	}
	//可以执行  
	//查询users表  
	sprintf(sql,"select * from users;");  
	executesql(sql);  
	g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	int iNum_fields = mysql_num_fields(g_res); // 得到记录的列数  
	system("clear");
	printf("\n\n☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ☆"); 
	printf("\n\t\033[31m+-----+-------+------------------------+----------------------+--------------+---------------------+\033[0m");	
	printf("\n\t\033[41;31m|                                     ---users  table---                                           |\033[0m");
	printf("\n\t\033[31m+-----+-------+------------------------+----------------------+--------------+---------------------+\033[0m");
	
	puts("\n\tid_  | name_ |password_| create_time_     |creator_id_ | auth_type_  |dyn_sn_| dyn_pass_sn_ |remark_   ");  
	while((g_row=mysql_fetch_row(g_res)))  // 打印结果集
		printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",g_row[0],g_row[1],g_row[2],g_row[3],g_row[4],g_row[5],g_row[6],g_row[7],g_row[8]);  
	//查询roles表  
	sprintf(sql,"select * from roles;");  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	iNum_fields = mysql_num_fields(g_res); // 得到记录的列数 
	printf("\n\n ☆ ★ ☆ ★  ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆");
	printf("\n\t\033[31m+-----+-------++--------------+---------------------+\033[0m");	
	printf("\n\t\033[43;31m|             ---roles table---                     |\033[0m");
	printf("\n\t\033[31m+-----+-------++--------------+---------------------+\033[0m");   
	puts("\n\t\tid_  | name_         | remark_      ");  
	while((g_row=mysql_fetch_row(g_res)))  
		printf("\n\t\t%s\t%s\t\t%s\n",g_row[0],g_row[1],g_row[2]);  
	//查询userRole表  
	sprintf(sql,"select * from userRole;");  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	iNum_fields = mysql_num_fields(g_res); // 得到记录的列数  
	printf("\n\n ☆ ★ ☆ ★  ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆");
	printf("\n\t\033[31m+-----+-------++--------------+---------------------+\033[0m");	
	printf("\n\t\033[42;31m|            ---userRole table---                   |\033[0m");
	printf("\n\t\033[31m+-----+-------++--------------+---------------------+\033[0m"); 
	puts("\n\t\tuser_id_ | role_id_ ");  
	while((g_row=mysql_fetch_row(g_res)))  
		printf("\n\t\t%s\t\t%s\n",g_row[0],g_row[1]);  
	//查询usergroups表  
	sprintf(sql,"select * from usergroups;");  
	executesql(sql);  
	g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	iNum_fields = mysql_num_fields(g_res); // 得到记录的列数
	printf("\n\n  ☆ ★ ☆ ★  ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ");   
	printf("\n\t\033[31m+-----+-------+------------------------------------------+--------------+---------------------+\033[0m");	
	printf("\n\t\033[46;31m|           ------------------------usergroups table------------------------                  |\033[0m");
	printf("\n\t\033[31m+-----+-------+------------------------------------------+--------------+---------------------+\033[0m");
	puts("\n\tid_  | name_ |      create_time_       | enable_type_ | policy_type_  |remark_   ");  
	while((g_row=mysql_fetch_row(g_res)))  // 打印结果集
		printf("\n\t%s\t%s\t%s\t%s\t\t%s\t\t%s\t\n",g_row[0],g_row[1],g_row[2],g_row[3],g_row[4],g_row[5]);  
	//查询userGroupUser表
	sprintf(sql,"select * from userGroupUser;");  
	executesql(sql);  
	g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	iNum_fields = mysql_num_fields(g_res); // 得到记录的列数 
	printf("\n\n  ☆ ★ ☆ ★  ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★  "); 
	printf("\n\t\033[31m+-----+-------++--------------+---------------------+\033[0m");	
	printf("\n\t\033[45;31m|           ---userGroupUser table---               |\033[0m");
	printf("\n\t\033[31m+-----+-------++--------------+---------------------+\033[0m");
	puts("\n\t\t user_id_ | usergroup_id_ ");  
	while((g_row=mysql_fetch_row(g_res)))  
		printf("\t\t\t%s\t%s\n",g_row[0],g_row[1]);
	mysql_free_result(g_res);  
	while ((getchar()) != '\n');  
	getchar(); 
}
/****************************************************
 * time : 20180625
 * addby : swj
 * function :query_msg() 查询函数 条件查询  选择查找的表 输入要查找的名字
 * ******************************************************/
void query_msg()
{
	while ((getchar()) != '\n');  
	while(1){
		char choice;  
		system("clear");
		printf("\t        ☆.°∴°☆﹒﹒‧☆°∴°☆.∴°☆☆.°∴°☆ ☆.°∴°☆☆.°∴°\n");
		printf("\t       ╰ /∕﹨\    /∕﹨\ ╰╮      /∕﹨\\n");
		printf("\t       /     \ /       \  /    \\n");
		printf("\t     /        /        \        \\n");
		printf("\t    ∕   ●   ●  ∕   ●   ●   ﹨  ●   ●  ﹨\n");
		printf("\t   |  ○   ▽  |  ○   ▽  ○ ︱         ▽ ○  ︱\n");
		printf("\t   ◥██████████████████████████████████████████████████████◤\n");
		printf("\t  ╭══════════════════════════════════════════════■□■□══════╮\n");
		printf("\t  │             operate  interface  ---  Query             │\n");
		printf("\t  ╰══════■□■□══════════════════════════════════════════════╯\n");
		printf("\t  ┌───—────────────────────────────────────────────────—───┐\n");
		printf("\t  │            1. users          2. roles          │\n");
		printf("\t  │                                                        │\n");
		printf("\t  │            3. userRole       4. usergroups     │\n");
		printf("\t  │                                                        │\n")    ;
		printf("\t  │            5. userGroupUser  0. Return         │\n")    ;
		printf("\t  └───—────────────────────────────────────────────────—───┘\n");	
		printf("\n\t\t→_→	Choice:"); 
		scanf("%c",&choice); 

		//通过权限判定函数的返回值决定是否可以进行显示所有用户操作,other用户不可使用此功能
		if(judge(2) == 0){
			puts("\n\t\t\t!!!Insufficient permissions!!! ");
			while ((getchar()) != '\n');
			getchar();
			//权限不够,退出函数
			return ;
		}
		switch(choice)
		{
			case '1':  
				sprintf(ope.tables,"users");  
				system("clear");  
				puts("\n\t\t\t!!!   enter user name  !!! ");  
				printf("\n\t\t→_→	Name:");scanf("%s",ope.name);  
				//在指定表中查询用户名相关信息  
				sprintf(sql,"select * from %s where name_='%s';",ope.tables,ope.name);  
				executesql(sql);  
				g_res = mysql_store_result(g_conn);  
				iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
				system("clear");  
				if(iNum_rows == 0)  
					puts("\n\t\t\tNo such person!");  
				else  
				{  
					int iNum_fields = mysql_num_fields(g_res); // 得到记录的列数  
					puts("\n\n\t id_  | name_ |password_| create_time_     |creator_id_ | auth_type_  |dyn_sn_| dyn_pass_sn_ |remark_   ");  
					while((g_row=mysql_fetch_row(g_res)))  // 打印结果集
						printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",g_row[0],g_row[1],g_row[2],g_row[3],g_row[4],g_row[5],g_row[6],g_row[7],g_row[8]); 
				}  
				mysql_free_result(g_res);   
				while ((getchar()) != '\n');  
				getchar();  
				break;  
			case '2':  
				sprintf(ope.tables,"roles");  
				system("clear"); 
				int flag=0;  // 显示效果的控制 
				//查询角色表  
				sprintf(sql,"select * from %s;",ope.tables);  
				executesql(sql);  
				g_res = mysql_store_result(g_conn);  
				iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
				system("clear"); 
				if(iNum_rows == 0)  
					puts("\n\t\t\tNo such person!");  
				else  
				{  
					int iNum_fields = mysql_num_fields(g_res); // 得到记录的列数  
					puts("\n\n\tid_  | name_         | remark_      ");  
					while((g_row=mysql_fetch_row(g_res))){					
						if(flag==0){
							printf("\n\t%s\t%s\t%s\n",g_row[0],g_row[1],g_row[2]);
							flag += 1;  			
						}else{
							printf("\n\t%s\t%s\t\t%s\n",g_row[0],g_row[1],g_row[2]);
						}
					} 
				} 
				mysql_free_result(g_res);   
				while ((getchar()) != '\n');  
				getchar();  
				break;  
			case '3':  
				sprintf(ope.tables,"userRole");  
				system("clear");  
				//查询用户角色表  
				sprintf(sql,"select * from %s;",ope.tables);  
				executesql(sql);  
				g_res = mysql_store_result(g_conn);  
				iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
				system("clear");  
				if(iNum_rows == 0)  
					puts("\n\t\t\tNo such person!");  
				else  
				{  
					int iNum_fields = mysql_num_fields(g_res); // 得到记录的列数  
					puts("\n\n\tuser_id_ | role_id_ ");  
					while((g_row=mysql_fetch_row(g_res)))  
						printf("\n\t\t%s\t%s\n",g_row[0],g_row[1]);  
				}  
				mysql_free_result(g_res);   
				while ((getchar()) != '\n');  
				getchar();  
				break;
			case '4':
				sprintf(ope.tables,"usergroups");
				system("clear");
				puts("\n\t\t\t!!!   enter usergroup name  !!! ");
				printf("\n\t\t→_→	Name:");scanf("%s",ope.name);
				//在指定表中查询用户组表信息 相关信息
				sprintf(sql,"select * from %s where name_='%s';",ope.tables,ope.name);  
				executesql(sql);  
				g_res = mysql_store_result(g_conn);  
				iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
				system("clear"); 
				if(iNum_rows == 0)  
					puts("\n\t\t\tNo such person!");  
				else  
				{  
					int iNum_fields = mysql_num_fields(g_res); // 得到记录的列数  
					puts("\n\n\tid_  | name_ |      create_time_       | enable_type_ | policy_type_  |remark_   ");  
					while((g_row=mysql_fetch_row(g_res)))  // 打印结果集
						printf("\n\t%s\t%s\t%s\t%s\t\t%s\t\t%s\t\n",g_row[0],g_row[1],g_row[2],g_row[3],g_row[4],g_row[5]);  
				}  
				mysql_free_result(g_res);   
				while ((getchar()) != '\n');  
				getchar();   
				break;
			case '5':
				sprintf(ope.tables,"userGroupUser");
				system("clear");
				//查询用户组表信息
				sprintf(sql,"select * from %s;",ope.tables);  
				executesql(sql);  
				g_res = mysql_store_result(g_conn);  
				iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
				system("clear"); 
				if(iNum_rows == 0)  
					puts("\n\t\t\tNo such person!");  
				else  
				{  
					int iNum_fields = mysql_num_fields(g_res); // 得到记录的列数  
					puts("\n\n\tuser_id_ | usergroup_id_ ");  
					while((g_row=mysql_fetch_row(g_res)))  
						printf("\n\t%s\t\t%s\n",g_row[0],g_row[1]); 
				}  
				mysql_free_result(g_res);   
				while ((getchar()) != '\n');  
				getchar();   
				break;    
			case '0':
				while ((getchar()) != '\n');  
				return ;  
			default :  
				puts("\n\t\t\t!!! Please enter right choice !!! ");  
				while ((getchar()) != '\n');  
				getchar();  
				break;  
		}     
	}
}
/****************************************************
 * time : 20180626
 * addby : swj
 * function :add_usergroup_msg() 添加用户组信息函数
 * ******************************************************/
void add_usergroup_msg()
{
	int o,op;
	//根据switch选择 把枚举类型的值赋值给该变量 将值插入数据库 
	int polistate;
	char NEWID[20];
	//  char ID[20];

	//通过权限判定函数的返回值决定是否可以进行添加用户组操作  只能root用户添加用户组
	if(judge(4) == 0){  
		puts("\n\t\t\t!!!Insufficient permissions!!! ");  
		while ((getchar()) != '\n');  
		getchar();  
		//权限不够,退出函数  
		return ;  
	}  
	//可以执行  
	system("clear");  
	puts("\n\t\t\t!!!    Add_usergroup   !!! ");
	//根据当前已有用户的行数判断,新建的用户id应为Id_中最大值+1  
	sprintf(sql,"select (@id_:=id_+1) as idnum_,usergroups.* from usergroups where id_ = (select max(id_) from usergroups);"); 
	executesql(sql);
	g_res = mysql_store_result(g_conn);
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	while((g_row = mysql_fetch_row(g_res))){
		sprintf(NEWID,"%s",g_row[0]);
	}
	//输入账户  
	printf("\n\t\t→_→	Name:");scanf("%s",ope.name);
	//增加时候,若改用户名存在(给出用户存在的提示信息)
	sprintf(sql,"select id_ from usergroups where name_='%s';",ope.name);  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res); 
	if(iNum_rows != 0)
	{
		puts("\n\t\t\t!!!Username already exists !!!! ");  
		return ;  
	}
	//获取系统时间,作为创建时间  
	time_t temp;
	struct tm *t;
	time(&temp);
	t = localtime(&temp);
	sprintf(Time,"%d-%d-%d %d:%d:%d",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
	//输入用户组 策略的状态 (0:enable 1:disabled)
	while(1){
		system("clear");

		puts("\n\t\t\t !!!    Add_usergroup   !!! \n");
		puts("\n\t\t\t!!!      POLICY STATE    !!! ");
		printf("\t  ┌───—───────────────────────────────────────┐\n");
		printf("\t  │         1. enable                    │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         2. disabled                  │\n");
		printf("\t  └───—───────────────────────────────────────┘\n");
		printf("\n\t→_→	Choice the policy state of usergroup %s:",ope.name);scanf("%d",&op);
		switch(op){
			case 1:
				polistate = poliEnable;				
				break;
			case 2:
				polistate = poliDisable;
				break;
			default :
				puts("\n\t\t\t!!! enter right choice !!! ");
				while ((getchar()) != '\n');
				getchar();
				//return ;  //输入出错 返回刚刚开始  若没有return则出错后默认类型是0				
		}
		break;
	}
	//输入策略
	printf("\n\t\t→_→	Policy:");scanf("%s",ope.policy);	
	//备注          
	printf("\n\t\t→_→	Remark:");scanf("%s",ope.remark);
	//printf("%s '%s' '%s' %d '%s' '%s'\n",NEWID,ope.name,Time,polistate,ope.policy,ope.remark);	
	//向用户表中插入一个新的用户的信息  
      sprintf(sql,"insert into usergroups values(%s,'%s','%s',%d,'%s','%s');",NEWID,ope.name,Time,polistate,ope.policy,ope.remark);
	executesql(sql);	
	puts("\n\t\t\t!!! success !!! ");
}
/****************************************************
 * time : 20180625
 * addby : swj
 * function :add_user_msg() 添加用户信息函数
 * ******************************************************/
void add_user_msg() 
{
	int o,op,oop;
	//根据switch选择 把枚举类型的值赋值给该变量 将值插入数据库 
	int auty;   
	char NEWID[20];
	char ID[20];  
	//通过权限判定函数的返回值决定是否可以进行添加用户操作  other角色的用户不能添加用户
	if(judge(2) == 0){  
		puts("\n\t\t!!!Insufficient permissions!!! ");  
		while ((getchar()) != '\n');  
		getchar();  
		//权限不够,退出函数  
		return ;  
	}  
	//可以执行  
	system("clear");  
	puts("\n\t\t\t!!!    Add_user   !!! "); 
	//根据当前已有用户的行数判断,新建的用户id应为Id_中最大值+1  
	sprintf(sql,"select (@id_:=id_+1) as idnum_,users.* from users where id_ = (select max(id_) from users);");  
	//sprintf(sql,"select * from users where id_ = (select max(id_) from users);");  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	while((g_row = mysql_fetch_row(g_res))){
		sprintf(NEWID,"%s",g_row[0]);
	}
	//printf("NEWID=%s\n",NEWID);
	//输入账户和密码  
	printf("\n\t\t→_→	Name:");scanf("%s",ope.name);  
	printf("\n\t\t→_→	Password:");scanf("%s",ope.passwd); 
	//增加时候,若改用户名存在(给出用户存在的提示信息)
	sprintf(sql,"select id_ from users where name_='%s';",ope.name);  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res); 
	if(iNum_rows != 0)
	{
		puts("\n\t\t\t!!!Username already exists !!!! ");  
		return ;  
	}
	//获取系统时间,作为创建时间  
	time_t temp;  
	struct tm *t;  
	time(&temp);  
	t = localtime(&temp);  
	sprintf(Time,"%d-%d-%d %d:%d:%d",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);  
	//通过当前登录的用户名字获取用户id,作为创建者id使用         
	sprintf(sql,"select id_ from users where name_='%s';",login.name);  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res);  
	int iNum_fields = mysql_num_fields(g_res);  
	while((g_row=mysql_fetch_row(g_res))){  
		sprintf(ID,"%s",g_row[0]);  
	}
	//输入用户认证方式 
	while(1){  
		system("clear");
		puts("\n\t\t\t!!!    Add_user   !!! \n");
		puts("\n\t\t\t!!! AUTHENTICATION TYPE !!! ");
		printf("\t  ┌───—───────────────────────────────────────┐\n");
		printf("\t  │         1. password auth             │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         2. KEY auth                  │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         3. third party auth          │\n");
		printf("\t  └───—───────────────────────────────────────┘\n");	
		printf("\n\t→_→	Choice the authentication type of user %s:",ope.name);scanf("%d",&op);  
		switch(op){  
			case 1:
				//printf("Passauth = %d\n",Passauth);  
				auty = Passauth;
				sprintf(ope.authtype,"Passauth"); 
				sprintf(ope.passauth,"INSERT口令认证需要的口令");  
				sprintf(ope.keyauth," ");
				break;  
			case 2:  
				sprintf(ope.authtype,"Keyauth");
				auty = Keyauth; 
				sprintf(ope.passauth," "); 
				sprintf(ope.keyauth,"KEY认证需要的文件"); 
				break; 
			case 3: 
				auty = Thpaauth; 
				sprintf(ope.authtype,"Thpaauth");  
				sprintf(ope.passauth," "); 
				sprintf(ope.keyauth," ");
				break;  
			default :  
				puts("\n\t\t\t!!! enter right choice !!! ");  
				while ((getchar()) != '\n');  
				getchar();  
		}  
		break; 
	} 
	//printf("ope.authtype=%s\n ope.passauth=%s\n  ope.passauth=%s\n",ope.authtype,ope.passauth,ope.keyauth);
	//备注          
	printf("\n\t\t→_→	Remark:");scanf("%s",ope.remark);
	//向用户表中插入一个新的用户的信息  
	sprintf(sql,"insert into users values(%s,'%s','%s','%s',%s,%d,'%s','%s','%s');",NEWID,ope.name,ope.passwd,Time,ID,auty,ope.passauth,ope.keyauth,ope.remark);  
	executesql(sql);  
	//管理员用户设定权限  
	if(flag)  
	{  
		while(1){  
			system("clear");
			puts("\n\t\t\t!!!    Add_user   !!! \n");
			puts("\n\t\t\t!!!      ROLE     !!!  ");
			printf("\t  ┌───—─────────────────────────────────┐\n");
			printf("\t  │         1. user              │\n");
			printf("\t  │                                     │\n");
			printf("\t  │         2. other             │\n");
			printf("\t  └───—─────────────────────────────────┘\n");	
			printf("\n\t→_→	Choice the Role of user %s:",ope.name);scanf("%d",&o);  
			switch(o){  
				case 1:  
					sprintf(ope.role,"USER");  
					break;  
				case 2:  
					sprintf(ope.role,"OTHER");  
					break;  
				default :  
					puts("\n\t\t\t!!! enter right choice !!! ");  
					while ((getchar()) != '\n');  
					getchar();  
			}  
			break;  
		}  
		//通过角色名找到角色id  
		sprintf(sql,"select id_ from roles where name_='%s';",ope.role);  
		executesql(sql);  
		g_res = mysql_store_result(g_conn);  
		iNum_rows = mysql_num_rows(g_res);  
		iNum_fields = mysql_num_fields(g_res);  
		while((g_row=mysql_fetch_row(g_res))){  
			//将用户id和角色id写入用户角色表  
			sprintf(sql,"insert into userRole values(%s,%s);",NEWID,g_row[0]);  
			executesql(sql);  
		}             
	}  
	//如果没有管理员权限,默认添加的用户角色为other  
	else{  
		sprintf(sql,"insert into userRole values(%s,3);",NEWID);  
		executesql(sql);  
	} 
	//输入用户所属的组 
	while(1){
		system("clear");
		int i = 1,j = 0;
		char grous[100][100];
		sprintf(sql,"select name_ from usergroups");  
		executesql(sql);  
		g_res = mysql_store_result(g_conn);  
		iNum_rows = mysql_num_rows(g_res);  
		int iNum_fields = mysql_num_fields(g_res);
		
		puts("\n\t\t   !!!    Add_user   !!! \n");
		puts("\n\t\t!!!  choice usergroup  !!!");
		printf("\t  ┌───—─────────────────────────────────┐\n");
		printf("\t  │                                     │\n");			
		while((g_row=mysql_fetch_row(g_res))){			
			printf("\t  │         %d. %s              │\n",i,g_row[0]);
			printf("\t  │                                     │\n");
			sprintf(grous[i],"%s",g_row[0]);
			j = i++; 					
		}
		printf("\t  └───—─────────────────────────────────┘\n");
		//printf("i = %d\n",i);
		//printf("j = %d\n",j);
		//printf("grous = %s\n",grous[2]);
		printf("\n\t→_→	Choice the group of user %s:",ope.name);scanf("%d",&oop);
		//printf("%d\n",oop);				
		if(oop <= j){
			//printf("%s\n",grous[oop]);
			//通过选择的用户组的名字找到用户组的id
			sprintf(sql,"select id_ from usergroups where name_='%s';",grous[oop]);
			executesql(sql);
			g_res = mysql_store_result(g_conn);
			iNum_rows = mysql_num_rows(g_res);
			iNum_fields = mysql_num_fields(g_res);
			while((g_row=mysql_fetch_row(g_res))){
                      	       //将用户id与用户组id写入 用户与用户组角色表
                        sprintf(sql,"insert into userGroupUser values(%s,%s);",NEWID,g_row[0]);
                        executesql(sql);
               		}	
			return;  //当输入正确的时候 返回上一级
		}else{
			puts("\n\t\t\t!!! enter right choice !!! ");
			while ((getchar()) != '\n');  //当输入错误时候 重新输入
			getchar();
		}
	}		
	flag = 0;//管理员权限开关  
	puts("\n\t\t\t!!! success !!! ");  
	//while ((getchar()) != '\n');  
	//getchar();    
}
/****************************************************
 * time : 20180626
 * addby : swj
 * function :add_message() 新增函数 判断增加users / usergroups
 * ******************************************************/
void add_message()
{
	while ((getchar()) != '\n');  //解决上一级的回车操作带来的麻烦
	while(1){ 
		char op; 
		system("clear");
		printf("\t        ☆.°∴°☆﹒﹒‧☆°∴°☆.∴°☆☆.°∴°☆ ☆.°∴°☆☆.°∴°\n");
		printf("\t       ╰ /∕﹨\    /∕﹨\ ╰╮      /∕﹨\\n");
		printf("\t       /     \ /       \  /    \\n");
		printf("\t     /        /        \        \\n");
		printf("\t    ∕   ●   ●  ∕   ●   ●   ﹨  ●   ●  ﹨\n");
		printf("\t   |  ○   ▽  |  ○   ▽  ○ ︱         ▽ ○  ︱\n");
		printf("\t   ◥██████████████████████████████████████████████████████◤\n");
		printf("\t  ╭══════════════════════════════════════════════■□■□══════╮\n");
		printf("\t  │             operate  interface  ---  Add               │\n");
		printf("\t  ╰══════■□■□══════════════════════════════════════════════╯\n");
		printf("\t  ┌───—────────────────────────────────────────────────—───┐\n");
		printf("\t  │            1. users          2. usergroups     │\n");
		printf("\t  │                                                        │\n");  ;
		printf("\t  │                     0. Return                  │\n")    ;
		printf("\t  └───—────────────────────────────────────────────────—───┘\n");	
		printf("\n\t\t→_→	Choice:"); 
		scanf("%c",&op);  
		switch(op){  
			case '1':
				//添加用户
				add_user_msg();				
				while ((getchar()) != '\n');  
				getchar();   
				break;
			case '2':
				//添加用户组
				add_usergroup_msg();				
				while ((getchar()) != '\n');  
				getchar();   
				break;
			case '0':  
				while ((getchar()) != '\n');
				return;  
			default :  
				puts("\n\t\t\t!!! Please enter right choice !!! ");  
				while ((getchar()) != '\n');  
				getchar();  
				break;  
		}
	}
}
/****************************************************
 * time : 20180627
 * addby : swj
 * function :del_usergroup_msg() 删改用户组函数
 * ******************************************************/
void del_usergroup_msg(){
	int o,op;
	char p;
	int polistate;
	char ID[20];	
	//通过权限判定函数的返回值决定是否可以进行删改用户操作   只有root有此权限
	if(judge(4) == 0){  
		puts("\n\t\t\t!!!Insufficient permissions!!! ");  
		while ((getchar()) != '\n');  
		getchar();  
		//权限不够,退出函数  
		return ;  
	}  
	//可以执行  
	system("clear");  
	puts("\n\t\t\t!!!     del_usergroup_msg  !!!");  
	printf("\n\t\t→_→	Name:");scanf("%s",ope.name);  
	//判断要进行删改的用户是不是管理员用户,禁止对管理员用户进行删改操作  
	if(strcmp(ope.name,"root") == 0)  
	{  
		puts("\n\t\t\tAdministrator usergroup deletion is prohibited");  
		//while ((getchar()) != '\n');  
		//getchar();  
		return;  
	} 
	//通过用户名查看用户组表中是否有该用户组  
	sprintf(sql,"select id_ from usergroups where name_='%s';",ope.name);  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	int iNum_fields = mysql_num_fields(g_res);
	//将该用户组id取出来备用  
	while((g_row=mysql_fetch_row(g_res))){  
		sprintf(ID,"%s",g_row[0]);  
	} 
	//没有查到  
	if(iNum_rows == 0)  
	{  
		puts("\n\t\t\t!!!No such usergroup!!!");  
		puts("\n\t\t\t!!!Please check the name enterd!!!");  
		puts("\n\t\t\t!!! enter right choice !!! ");  
		return ;//当输入错误的用户组名 菜单返回上一级 
	}   
	//进入删改选择 
	else{
		system("clear");

		puts("\n\t\t!!!    del_usergroup_msg    !!!\n"); 
		printf("\t  ┌───—───────────────────────────────────────┐\n");
		printf("\t  │         1. change  name          │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         2. change enable type    │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         3. change policy type    │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         4. change remark         │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         5. delete  usergroup     │\n");
		printf("\t  └───—───────────────────────────────────────┘\n");  
		printf("\n\t\t→_→	Choice: ");scanf("%d",&o); 
		sprintf(sql,"select user_id_ from userGroupUser where usergroup_id_=%s;",ID);
		executesql(sql);
		g_res = mysql_store_result(g_conn);
		iNum_rows = mysql_num_rows(g_res); // 得到记录的行数
		switch(o)
		{
			case 1:
				//当有用户属于该用户组的时候  提示用户组的名称不能被修改
				if(iNum_rows != 0)
				{
					puts("\n\t\t\tBe quoted!User belongs to that user group!");
					puts("\n\t\t\tName can`t be chenge !");
				}else{
					system("clear");
					puts("\n\t\t!!!    del_usergroup_msg    !!! ");  
					printf("\n\t\t→_→	enter name: ");scanf("%s",ope.name);
					//更新用户名
					sprintf(sql,"update usergroups set name_='%s' where id_=%s",ope.name,ID);
					executesql(sql);	
				}			
				break;
			case 2:				
				//输入用户组 策略的状态 (0:enable 1:disabled)
				while(1){
					system("clear");

					puts("\n\t\t\t !!!    del_usergroup_msg   !!! \n");
					puts("\n\t\t\t!!!      POLICY STATE    !!! ");
					printf("\t  ┌───—───────────────────────────────────────┐\n");
					printf("\t  │         1. enable                    │\n");
					printf("\t  │                                           │\n");
					printf("\t  │         2. disabled                  │\n");
					printf("\t  └───—───────────────────────────────────────┘\n");
					printf("\n\t→_→	Choice the policy state of usergroup %s:",ope.name);scanf("%d",&op);
					switch(op){
						case 1:
							polistate = poliEnable;				
							break;
						case 2:
							polistate = poliDisable;
							break;
						default :
							puts("\n\t\t\t!!! enter right choice !!! ");
							while ((getchar()) != '\n');
							getchar();
					}
					break;
				}				
				sprintf(sql,"update usergroups set enable_type_=%d where id_=%s",polistate,ID);
				executesql(sql);					
				break;
			case 3:
				system("clear");
				puts("\n\t\t\t!!!    del_usergroup_msg   !!!\n");  
				printf("\n\t\t→_→	enter policy: ");scanf("%s",ope.policy);  
				//更新策略 
				sprintf(sql,"update usergroups set policy_type_='%s' where id_=%s;",ope.policy,ID);  
				executesql(sql);  
				break;
			case 4:
				system("clear");
				puts("\n\t\t\t!!!    del_usergroup_msg    !!!\n");  
				printf("\n\t\t→_→	enter remark: ");scanf("%s",ope.remark);  
				//更新备注  
				sprintf(sql,"update usergroups set remark_='%s' where id_=%s;",ope.remark,ID);  
				executesql(sql);  
				break;		
			case 5:
				system("clear");  
				puts("\n\t\t\t!!!    del_alt_msg    !!!\n");  
				printf("\n\t\t→_→	sure delete? (Y/N):");scanf("%s",&p);  
				switch(p)  
				{  
					case 'Y':  
					case 'y': 
						//当用户组被引用的时候 提示不能被删除(有用户属于该用户组)  
						if(iNum_rows != 0)
						{
							puts("\n\t\t\tBe quoted!User belongs to that user group!");
							puts("\n\t\t\tIt can`t be delete!");
						}
						else{
							//需要先删除用户用户组角色表当中的信息,才可删除用户组表中的信息  
							sprintf(sql,"delete from userGroupUser where usergroup_id_=%s;",ID);  
							executesql(sql);  
							sprintf(sql,"delete from usergroups where id_=%s;",ID);  
							executesql(sql);  
						}
						break;  
					case 'N':  
					case 'n':  
						return;  
				}
				break;
			default :  
				puts("\n\t\t\t!!! enter right choice !!! ");  
				while ((getchar()) != '\n');  
				getchar();          
				break;		
		}
		mysql_free_result(g_res);  
		//return ;
		//while ((getchar()) != '\n');  
		//getchar();
	} 
	puts("\n\t\t\t!!! success !!! "); 
}
/****************************************************
 * time : 20180625
 * addby : swj
 * function :del_user_msg() 删改用户函数
 * ******************************************************/
void del_user_msg()
{
	char o,op;  
	char p;  
	char ID[20];  
	//通过权限判定函数的返回值决定是否可以进行删改用户操作   只有root有此权限
	if(judge(4) == 0){  
		puts("\n\t\t\t!!!Insufficient permissions!!! ");  
		while ((getchar()) != '\n');  
		getchar();  
		//权限不够,退出函数  
		return ;  
	}  
	//可以执行  
	system("clear");  
	puts("\n\t\t\t!!!     del_user_msg  !!! ");  
	printf("\n\t\t→_→	Name:");scanf("%s",ope.name);  
	printf("\n\t\t→_→	Password:");scanf("%s",ope.passwd);  
	//判断要进行删改的用户是不是管理员用户,禁止对管理员用户进行删改操作  
	if(strcmp(ope.name,"root") == 0)  
	{  
		puts("\n\t\t\tAdministrator user deletion is prohibited");  
		//while ((getchar()) != '\n');  
		//getchar();  
		return;  
	}  
	//通过用户名和密码查看用户表中是否有该用户  
	sprintf(sql,"select id_ from users where name_='%s' and password_='%s';",ope.name,ope.passwd);  
	executesql(sql);  
	g_res = mysql_store_result(g_conn);  
	iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
	int iNum_fields = mysql_num_fields(g_res);  
	//将该用户id取出来备用  
	while((g_row=mysql_fetch_row(g_res))){  
		sprintf(ID,"%s",g_row[0]);  
	}
	//没有查到  
	if(iNum_rows == 0)  
	{  
		puts("\n\t\t\t!!!No such person!!!");  
		puts("\n\t\t\t!!!Please check the name or password enterd!!!");  
		puts("\n\t\t\t!!! enter right choice !!! ");  
		//while ((getchar()) != '\n');  
		//getchar();  							
		return;
	}   
	//进入删改选择  
	else{
		while ((getchar()) != '\n');
		system("clear");
		puts("\n\t\t!!!    del_user_msg    !!!\n"); 
		printf("\t  ┌───—───────────────────────────────────────┐\n");
		printf("\t  │         1. change  name          │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         2. change passwd         │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         3. change  role          │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         4. change remark         │\n");
		printf("\t  │                                           │\n");
		printf("\t  │         5. delete  user          │\n");
		printf("\t  └───—───────────────────────────────────────┘\n");
		printf("\n\t\t→_→	Choice:");scanf("%c",&o); 
		sprintf(sql,"select id_ from users where creator_id_=%s;",ID);
		executesql(sql);
		g_res = mysql_store_result(g_conn);
		iNum_rows = mysql_num_rows(g_res); // 得到记录的行数
		switch(o)
		{
			case '1':
				//当用户被引用的时候 提示名字不能被修改(其创建了其他用户)
				if(iNum_rows != 0)
				{
					puts("\n\t\t\tBe quoted!It created other users!");
					puts("\n\t\t\tName can`tbe chenge !");
				}else{
					system("clear");  
					puts("\n\t\t\t!!!    del_user_msg    !!! ");  
					printf("\n\t\t→_→	Name: ");scanf("%s",ope.name);
					//更新用户名
					sprintf(sql,"update users set name_='%s' where id_=%s",ope.name,ID);
					executesql(sql);
				}
				break;
			case '2':  
				system("clear");  
				puts("\n\t\t\t!!!    del_user_msg    !!! ");  
				printf("\n\t\t→_→	Password: ");scanf("%s",ope.passwd);  
				//更新密码  
				sprintf(sql,"update users set password_='%s' where id_=%s;",ope.passwd,ID);  
				executesql(sql);  
				break;
			case '3':  
				//当用户被引用的时候 提示角色不能被修改(其创建了其他用户)
				if(iNum_rows != 0)
				{
					puts("\n\t\t\tBe quoted!It created other users!");
					puts("\n\t\t\tRole can`tbe chenge !");
				}else{
					while ((getchar()) != '\n'); 
					system("clear"); 
					puts("\n\t\t!!!      del_user_msg     !!!\n");
					printf("\t  ┌───—─────────────────────────────────┐\n");
					printf("\t  │         1. user              │\n");
					printf("\t  │                                     │\n");
					printf("\t  │         2. other             │\n");
					printf("\t  └───—─────────────────────────────────┘\n");
					printf("\n\t\t→_→	Choice:");scanf("%c",&op);  
					switch(op)  
					{  
						case '1':  
							//设置角色为用户  
							sprintf(sql,"update userRole set role_id_=2 where user_id_=%s;",ID);  
							executesql(sql);  
							break;  
						case '2':  
							//设置角色为其他人  
							sprintf(sql,"update userRole set role_id_=3 where user_id_=%s;",ID);  
							executesql(sql);  
							break;  
						default :  
							puts("\n\t\t\t!!! enter right choice !!! ");  
							while ((getchar()) != '\n');  
							getchar();  
					}
				}  
				break; 
			case '4':  
				system("clear");  
				puts("\n\t\t!!!    del_user_msg    !!!\n");  
				printf("\n\t\t→_→	enter remark: ");scanf("%s",ope.remark);  
				//更新备注  
				sprintf(sql,"update users set remark_='%s' where id_=%s;",ope.remark,ID);  
				executesql(sql);  
				break;  
			case '5':  
				system("clear");  
				puts("\n\t\t!!!    del_user_msg    !!!\n");  
				printf("\n\t\t!!!    sure delete? (Y/N):");scanf("%s",&p);  
				switch(p)  
				{  
					case 'Y':  
					case 'y': 
						//当用户被引用的时候 提示不能被删除(其创建了其他用户)  
						if(iNum_rows != 0)
						{
							puts("\n\t\t\tBe quoted!It created other users!");
							puts("\n\t\t\tIt can`t be delete!");
						}
						else{
							//需要先删除用户角色表当中的信息,才可删除用户表中的信息  
							sprintf(sql,"delete from userRole where user_id_=%s;",ID);  
							executesql(sql);  
							sprintf(sql,"delete from users where id_=%s;",ID);  
							executesql(sql);  
						}
						break;  
					case 'N':  
					case 'n':  
						return;  
				}  
				break;
			default :  
				puts("\n\t\t\t!!! enter right choice !!! ");  
				while ((getchar()) != '\n');  
				getchar();          
				break;
		}
		mysql_free_result(g_res);  
		//while ((getchar()) != '\n');  
		//getchar();
	}
	puts("\n\t\t\t!!! success !!! ");  
}
/***************************************************
 * time : 20180627
 * addby : swj
 * function :del_message() 删除函数 判断删除users / usergroups
 * ******************************************************/
void del_message()
{
	while ((getchar()) != '\n');
	while(1){ 
		char op; 
		system("clear"); 
		printf("\t        ☆.°∴°☆﹒﹒‧☆°∴°☆.∴°☆☆.°∴°☆ ☆.°∴°☆☆.°∴°\n");
		printf("\t       ╰ /∕﹨\    /∕﹨\ ╰╮      /∕﹨\\n");
		printf("\t       /     \ /       \  /    \\n");
		printf("\t     /        /        \        \\n");
		printf("\t    ∕   ●   ●  ∕   ●   ●   ﹨  ●   ●  ﹨\n");
		printf("\t   |  ○   ▽  |  ○   ▽  ○ ︱         ▽ ○  ︱\n");
		printf("\t   ◥██████████████████████████████████████████████████████◤\n");
		printf("\t  ╭══════════════════════════════════════════════■□■□══════╮\n");
		printf("\t  │             operate  interface  ---  Delete            │\n");
		printf("\t  ╰══════■□■□══════════════════════════════════════════════╯\n");
		printf("\t  ┌───—────────────────────────────────────────────────—───┐\n");
		printf("\t  │            1. users          2. usergroups     │\n");
		printf("\t  │                                                        │\n");  ;
		printf("\t  │                     0. Return                  │\n")    ;
		printf("\t  └───—────────────────────────────────────────────────—───┘\n");	
		printf("\n\t\t→_→	Choice:");  
		scanf("%c",&op);  
		switch(op){  
			case '1':
				//删除用户
				del_user_msg();				
				while ((getchar()) != '\n');  
				getchar();   
				break;
			case '2':
				//删除用户组
				del_usergroup_msg();				
				while ((getchar()) != '\n');  
				getchar();   
				break;
			case '0': 
				while ((getchar()) != '\n'); 
				return ;  
			default :  
				puts("\n\t\t\t!!! Please enter right choice !!! ");  
				while ((getchar()) != '\n');  
				getchar();  
				break;  
		}
	}
}
/****************************************************
 * time : 20180625
 * addby : swj
 * function :operate_menu() 操作菜单 对用户进行增删改查
 * ******************************************************/
void operate_menu()
{
	while(i)
	{
		char choice;
		system("clear");
		printf("\t        ☆.°∴°☆﹒﹒‧☆°∴°☆.∴°☆☆.°∴°☆ ☆.°∴°☆☆.°∴°\n");
		printf("\t       ╰ /∕﹨\    /∕﹨\ ╰╮      /∕﹨\\n");
		printf("\t       /     \ /       \  /    \\n");
		printf("\t     /        /        \        \\n");
		printf("\t    ∕   ●   ●  ∕   ●   ●   ﹨  ●   ●  ﹨\n");
		printf("\t   |  ○   ▽  |  ○   ▽  ○ ︱         ▽ ○  ︱\n");
		printf("\t   ◥██████████████████████████████████████████████████████◤\n");
		printf("\t  ╭══════════════════════════════════════════════■□■□══════╮\n");
		printf("\t  │                   Function  interface                  │\n");
		printf("\t  ╰══════■□■□══════════════════════════════════════════════╯\n");
		printf("\t  ┌───—────────────────────────────────────────────────—───┐\n");
		printf("\t  │            1. query msg      2. add msg        │\n");
		printf("\t  │                                                        │\n");
		printf("\t  │            3. del|alt msg    4. display all    │\n");
		printf("\t  │                                                        │\n")    ;
		printf("\t  │            5. exit login     0. exit system    │\n")    ;
		printf("\t  └───—────────────────────────────────────────────────—───┘\n");	
		printf("\n\t\t→_→	Choice:");
		scanf("%c",&choice);
		switch(choice)
		{
			case '1':
				query_msg();//需判断权限,部分角色可使用此查询  
				break;
			case '2':				
				add_message();//添加用户操作  
				break;
			case '3':
				del_message();//删改用户操作  
				break;
			case '4':
				display();//显示所有用户及用户角色  
				break;
			case '5':
				//退出登录  
				flag = 0;//管理员权限开关  
				return;
			case '0':
				puts("\n\t\t!!! thank you for using !!! ");//退出系统  
				i = 0;
				break;
			default:
				puts("\n\t\t!!! enter right choice !!! ");
				while ((getchar()) != '\n');
				getchar();
				break;
		}
	}	
}
int main(void)
{
	while(i)
	{
		puts("!!!The system is initializing!!!");
		//初始化链接 
		if(init_mysql())
			print_mysql_error(NULL);//当链接数据库时候 有错误 会报错
		//选择数据库 没有的时候 创建数据库  有的时候 进去数据库
		create_database();
		//创建表
		create_table();	
		//初始化管理员账户
		init_administrator();
		//用户登录
		user_login();	
		//用户操作
		operate_menu();
	}
	mysql_close(g_conn);
	return EXIT_SUCCESS;
}

遇到的问题:

问题一:

错误提示:在创建users表的时候 有错误

MySQL ERROR1005 Can't create table (erron150) 

解决方式:

user表的创建:

puts("create users table");

        executesql("create table users(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,password_ char(32) not null,create_time_ datetime not null,creator_id_ int(11) unsigned,auth_type_ int(11) not null,dyn_sn_ char(10),dyn_pass_sn_ text,remark_ varchar(200),foreign key(creator_id_) references users(id_));");

id_ 与  creator_id_ 具有外键关系。 刚刚开始的时候 两个字段的类型或者大小不严格匹配。 之后都改为 int(11)。可以添加成功。

参考链接:

https://wenku.baidu.com/view/7a0a1f1b10a6f524ccbf85e6?pcf=2

已知原因:

1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer。另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配,更多关于signed 和 unsigned 的信息,请参阅:http://www.verysimple.com/blog/?p=57

2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primarykey, 如果其中一个不是primarykey 的放,你必须为它创建一个索引。

3, 外键的名字是一个已经存在的一个键值了,这个时候,你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。

4,其中一个或者两个表是MyISAM引擎的表,若想要使用外键约束,必须是InnoDB引擎,(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生外键),你可以通过查询浏览器来设置表的引擎类型。

5,你可能设置了 ON DELETE SET NULL,但是相关的键的字段又设置成了NOTS NULL 值,你可能通过修改cascade的属性值或者把字段属性设置成allow null来搞定这个bug

6,请确定你的charset collate 选项在表级和字段级上的一致,

7,你可能设置为外键设置了一个默认值,如default = 0

8,在这个关系里面,其中的一个字段是一个混合键值中的一个,它没有自己独立的索引,这时,你必须为他创建一个独立的索引。

9,ALTER声明中有语法错误

10,要链接的两个表的编码的格式不同。

问题二:

错误提示:user中的id_字段是自增的,在创建新的用户的时候,根据user表中的记录的条数+1,做为下一次新增用户的id,但是在有删除操作之后,新用户的id值可能已经存在,加入新用户信息失败。

    Eg:加入 id=1 name=aa;  id=2name=bb;  id=3,name=cc;

       删除  id=2 的用户,

       加入  name=dd的用户,此时条目数为2 用户dd加入进去的时候id3,但是此时cc用户的id已经为3.

       加入新用户失败。

//根据当前已有用户的行数判断,新建的用户id应为行数+1

sprintf(sql,"select id_ from users;");

executesql(sql);

g_res = mysql_store_result(g_conn);

iNum_rows = mysql_num_rows(g_res); // 得到记录的行数

int i = iNum_rows + 1;//新用户id

解决方式:

//根据当前已有用户的行数判断,新建的用户id应为Id_中最大值+1  

sprintf(sql,"select (@id_:=id_+1) as idnum_,users.* from users where id_ = (select max(id_) from users);");  

executesql(sql);  

g_res = mysql_store_result(g_conn);  

iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  

while((g_row = mysql_fetch_row(g_res))){

sprintf(NEWID,"%s",g_row[0]);

}

参考链接:

http://newmiracle.cn/?p=2539

 

//sql语句找一行中的id最大值

 select * from users where id_ = (select max(id_) from users);

 

//自增变量

select (@id_:=id_+1) as idnum_,users.* from users;

 

//以上相结合 找出最大id值 加一

select (@id_:=id_+1) as idnum_,users.* from users where id_ = (select max(id_) from users);

 


问题三:

错误提示:添加user时候,获取另一个数据表usergroups中的一列信息,打印成一定的形式,并根据switch 中的选择,给userGroupUser(用户与用户组关系表) 中的某个字段设置值。

 

                 !!!  choice usergroup  !!!

  ┌───—──────────────────────┐

  │                                     │

  │         1. aa               

  │                                     │

  │         2. root              

  │                                     │

  └───—──────────────────────┘

解决方式:

//输入用户所属的组

while(1){

system("clear");

int i = 1,j = 0;

char grous[100][100];

sprintf(sql,"select name_ from usergroups");  

executesql(sql);  

g_res = mysql_store_result(g_conn);  

iNum_rows = mysql_num_rows(g_res);  

int iNum_fields = mysql_num_fields(g_res);

puts("\n\t\t   !!!    Add_user   !!! \n");

puts("\n\t\t!!!  choice usergroup  !!!");

printf("\t  ┌───—─────────────────┐\n");

printf("\t  │                                     │\n");

while((g_row=mysql_fetch_row(g_res))){

printf("\t  │         %d. %s              \n",i,g_row[0]);

printf("\t  │                                     │\n");

sprintf(grous[i],"%s",g_row[0]);

j = i++;

}

printf("\t  └───—─────────────────┘\n");

//printf("i = %d\n",i);

//printf("j = %d\n",j);

//printf("grous = %s\n",grous[2]);

printf("\n\t_ Choice the group of user %s",ope.name);scanf("%d",&oop);

//printf("%d\n",oop);

if(oop <= j){

//printf("%s\n",grous[oop]);

//通过选择的用户组的名字找到用户组的id

sprintf(sql,"select id_ from usergroups where name_='%s';",grous[oop]);

executesql(sql);

g_res = mysql_store_result(g_conn);

iNum_rows = mysql_num_rows(g_res);

iNum_fields = mysql_num_fields(g_res);

while((g_row=mysql_fetch_row(g_res))){

                       //将用户id与用户组id写入 用户与用户组角色表

                      sprintf(sql,"insert into userGroupUser values(%s,%s);",NEWID,g_row[0]);

                      executesql(sql);

            }

return;  //当输入正确的时候 返回上一级

}else{

puts("\n\t\t\t!!! enter right choice !!! ");

while ((getchar()) != '\n');  //当输入错误时候 重新输入

getchar();

}

}

最终效果:

//用户表

 

//用户组的表

 

//用户与用户组关系表

 

 操作界面截图:







猜你喜欢

转载自blog.csdn.net/weixin_42167759/article/details/80848991