chengelog:
数据库图标显示:
表内字段设置:
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 ERROR:1005 Can't create table (erron:150) : |
解决方式: |
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 把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=2,name=bb; id=3,name=cc; 删除 id=2 的用户, 加入 name=dd的用户,此时条目数为2 用户dd加入进去的时候id为3,但是此时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]); } |
参考链接: |
//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(); } } |
最终效果: |
//用户表
//用户组的表
//用户与用户组关系表
|
操作界面截图: