今天把之前那个简单用户登录程序,进行修改并且加一些新的程序:
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>
int total = 0; /* 登陆错误的次数,三次为上限 */
int successflag = 0; /* 登陆成功标识 */
int flag = 0;
int rc;
char strSQL[200]; /* 要执行的sql查询 */
char strlogin[200]; /* 用户名 */
char strpwd[200]; /* 密码 */
char userid[200]; /* 用户的id */
int strsum = 0; /* <8的roleid出现的次数 */
int tabids[4] = { 0 }; /* 收集当前用户可以操作的权限:用户管理(1)、角色管理(2) */
/* 登陆部分的回调函数 */
static int callback_login( void *data, int argc, char **argv, char **azColName )
{
flag = 1;
int i;
for ( i = 0; i < 3; i++ )
{
printf( "请输入密码:\n" );
scanf( "%s", strpwd );
if ( strcmp( argv[1], strpwd ) != 0 )
{
printf( "密码错误!\n" );
total++;
}else if ( strcmp( argv[2], "1" ) != 0 )
{
printf( "账户被锁定!\n" );
break;
}else{
printf( "登陆成功!\n" );
strcpy( userid, argv[3] );
printf( "当前用户id:%s\n", userid );
successflag = 1;
break;
}
}
if ( i == 3 )
{
printf( "3次密码错误+账户被锁定!\n" );
memset( strSQL, 0, 200 );
strcpy( strSQL, "update USER set status=0 where LoginName ='" );
strcat(strSQL, argv[2]);
strcat( strSQL, "';" );
sql = strSQL;
rc= sqlite3_exec( db, sql,NULL,NULL, &zErrMsg );
if ( rc != SQLITE_OK )
{
fprintf( stderr, "SQL error: %s\n", zErrMsg );
sqlite3_free( zErrMsg );
}
}
}
/* 主页的回调函数 */
static int callback_index( void *data, int argc, char **argv, char **azColName )
{
/* argv[1] 它是roleid的值 */
if ( atoi( argv[1] ) == 11 )
{
printf( "1.用户角色分配 " );
printf( "2.角色管理 " );
printf( "3.用户管理 " );
printf( "4.图书管理 " );
tabids[0] = 1;
tabids[1] = 2;
tabids[2] = 3;
tabids[3] = 4;
}else if ( atoi( argv[1] ) == 10 )
{
printf( "1.用户角色分配 " );
tabids[0] = 1;
}else if ( atoi( argv[1] ) == 9 )
{
printf( "2.角色管理 " );
tabids[1] = 2;
}else if ( atoi( argv[1] ) == 8 )
{
printf( "3.用户管理 " );
tabids[2] = 3;
}else if ( atoi( argv[1] ) < 8 )
{
strsum++;
if ( strsum < 2 )
{
tabids[3] = 4;
printf( "4.图书管理 " );
}
}
return(0);
}
/* 主函数 */
int main( int argc, char* argv[] )
{
sqlite3 *db;
char *zErrMsg = 0;
char *sql; /* 要执行的sql */
char *SuccessMsg = 0; /* 提示成功的消息 */
const char * data;
/* 打开数据库 */
rc = sqlite3_open( "test.db", &db );
if ( rc )
{
fprintf( stderr, "无法打开数据库 : %s\n", sqlite3_errmsg( db ) );
exit( 0 );
}else{
fprintf( stdout, "打开数据库成功!\n" );
}
/* 登录模块 */
while ( 1 )
{
memset( strSQL, 0, 200 );
memset( strlogin, 0, 200 );
memset( strpwd, 0, 200 );
strcpy( strSQL, "select LoginName,Passwd,Status,userid from User where LoginName ='" );
printf( "请输入用户名:\n" );
scanf( "%s", strlogin );
/* 拼接字符串 */
strcat( strSQL, strlogin );
strcat( strSQL, "';" );
sql = strSQL; /* 登陆查询sql */
rc = sqlite3_exec( db, sql, callback_login, (void *) data, &zErrMsg );
if ( rc != SQLITE_OK )
{
fprintf( stderr, "SQL error: %s\n", zErrMsg );
sqlite3_free( zErrMsg );
}
if ( flag == 0 )
{
printf( "查无此户!\n" );
}
if ( successflag == 1 )
{
break;
}
}
/* 主页 */
memset( strSQL, 0, 200 );
strcpy( strSQL, "select userid,roleid from ur where userid=" );
strcat( strSQL, userid );
strcat( strSQL, " order by roleid desc;" );
sql = strSQL; /* 跟据userid查询当前用户的所有roleid */
rc = sqlite3_exec( db, sql, callback_index, (void *) data, &zErrMsg );
if ( rc != SQLITE_OK )
{
fprintf( stderr, "错误: %s\n", zErrMsg );
sqlite3_free( zErrMsg );
}else{
printf( "\n" );
strsum = 0;
}
/* 模块操作:用户管理、角色管理、图书管理等 */
int tabid; /* 您选择的id */
char tabname[20]; /* 您选择的id对应模块,如:用户管理 */
while ( 1 )
{
printf( "请选择ID:\n" );
scanf( "%d", &tabid );
int y = 0; /* 判断是否有进入的权限 */
int x; /* 当前循环次数 */
for ( x = 0; x < 4; x++ ) /* 遍历可选id集合 */
{
if ( tabids[x] == tabid ) /* 判断当前选择的id在可选集合中 */
{
y = 1;
switch ( tabid ) /* 通知您的选择 */
{
case 1:
strcpy( tabname, "用户角色分配" );
break;
case 2:
strcpy( tabname, "角色管理" );
break;
case 3:
strcpy( tabname, "用户管理" );
break;
case 4:
strcpy( tabname, "图书管理" );
break;
default:
break;
}
printf( "您已进入:%s\n", tabname );
}
}
if ( y == 0 )
{
printf( "无此权限!\n" );
}else{
break;
}
}
/* 关闭数据库 */
sqlite3_close( db );
return(0);
}