From aa6c95218591c7b1e5f6433d474646db17f1d848 Mon Sep 17 00:00:00 2001 From: stmctommyau Date: Thu, 29 Sep 2022 15:50:59 +0800 Subject: [PATCH] not compiled version; showUser not yet write; maybe rewrite and intergrate all list to a more simplfied unified version --- admin_user.h | 176 +++++++++++++++++++++++++++++++++++++++++++++++++-- database.h | 1 + 2 files changed, 172 insertions(+), 5 deletions(-) diff --git a/admin_user.h b/admin_user.h index 54dd055..1c81ccd 100644 --- a/admin_user.h +++ b/admin_user.h @@ -19,7 +19,7 @@ void inv_control(); void tran_control(); void user_control(); -void admin_control(); +void role_control(); struct user_row *prompt_user(); int admin_menu_user_choices(char* name,char* role); @@ -45,10 +45,10 @@ void admin_menu(){ tran_control(); break; case 3://action with user - // user_control(); + user_control(); break; - case 4://action with admin user register - // admin_control(); + case 4://role management + // role_control(); break; case 5://Exit break; @@ -105,7 +105,6 @@ int admin_menu_user_choices(char* name,char* role){ printf("1. Inventory control\n"); printf("2. Transaction control\n"); printf("3. User control\n"); - printf("4. Admin user register\n"); printf("5. Exit and Logout\n"); printf(">"); scanf("%d", &choice); @@ -791,4 +790,171 @@ struct Map* sortTrans(struct transaction db,int choice){ break; } return map; +} + +//user control +void user_control(){ + struct user db = read_db_user(); + int choice = 0; + while(choice != 9){ + system("cls"); + printf("User Control\n"); + printf("1. Add User(shortcut)\n"); + printf("2. List User\n"); + printf("3. Exit\n"); + printf("Please input your choice\n>"); + fflush(stdin); + scanf("%d",&choice); + switch(choice){ + case 1: + db = add_user(db); + break; + case 2: + db = list_user(db); + break; + case 3: + break; + default: + printf("Invalid choice\n"); + printf("press any key to continue\n"); + fflush(stdin); + getchar(); + break; + } + } +} + +struct user add_user(struct user db){ + char temp[100]; + int index = db.db.row_count; + struct user_row *temprow = realloc(db.row, sizeof(struct user_row)); + temp = prompt_item("Please input the username\n>",temp); + strcpy(temprow.username,temp); + temp = prompt_item("Please input the role\n>",temp); + strcpy(temprow.role,temp); + + if(!append_user(temprow)){ + printf("Failed to add user\n"); + exit(1);//exit program to prevent errors + }else{ + printf("User added\n"); + } + printf("press any key to continue\n"); + fflush(stdin); + getchar(); + + return read_db_user(); +} +void print_user(struct user db, int cur, int end,struct Map* map); +struct Map* sortUser(struct user db,int choice); +struct user showUser(struct user db,int index); +struct user list_user(struct user db){ + int choice = -1; + int page = 0; + int page_size = PAGE_SIZE; + int total_pages = ceil((double)db.db.row_count / page_size); + int row = db.db.row_count; + struct Map* map = NULL; + do{ + system("cls"); + welcome_message(); + printf("User list\n"); + printf("0 exit\n"); + printf("1 sort User decending\n"); + printf("2 sort User ascending\n"); + printf("3 sort Role decending\n"); + printf("4 sort Role ascending\n"); + if(page+1==total_pages){ + print_user(db,page*page_size,db.db.row_count,map); + }else{ + print_user(db,page*page_size,(page+1)*page_size,map); + } + //page control + int current_page_size = page_size+8; + if(page+1 == total_pages){ + current_page_size = row - page*page_size+8; + } + printf("%d next page\n",current_page_size+1); + printf("%d previous page\n",current_page_size+2); + printf("%d set page size\n",current_page_size+3); + if(choice <=8 && choice > 0){ + printf("sorting...\n"); + map = sortUser(db,choice); + }else if(choice == current_page_size+1 ){ + if(page + 1 < total_pages){ + page++; + }else{ + printf("Already at last page\n"); + valid = false; + } + }else if(choice == current_page_size+2){ + if(page > 0){ + page--; + }else{ + printf("Already at first page\n"); + valid = false; + } + }else if(choice == current_page_size+3){ + printf("Enter page size: "); + fflush(stdin); + scanf("%d", &page_size); + total_pages = ceil(row / page_size); + }else if(choice >= 9 && choice <= current_page_size){ + if(map == NULL){ + db = showUser(db,choice - 9 + page_size*page); + }else{ + db = showUser(db,map[choice - 9 + page_size*page].key); + } + }else if(choice != 0){ + printf("Invalid choice\n"); + valid = false; + } +} + +void print_user(struct user db, int cur, int end,struct Map* map){ + printf("%-5s%-10s%-10s%-10s\n","No.","Username","Role","IsAdmin"); + for(int i = cur; i < end; i++){ + if(map[i].value != NULL){ + int index = (int)map[i].value; + bool isadmin = is_admin(db.row[index].role); + printf("%-5d%-10s%-10s%-10c\n",i+5,db.row[index].username,db.row[index].role,isadmin?'Y':'N'); + }else{ + bool isadmin = is_admin(db.row[(int)map[i].value].role); + printf("%-5s%-10s%-10s%-10c\n",i+5,db.row[(int)map[i].value].username,db.row[(int)map[i].value].role,isadmin?'Y':'N'); + } + } +} + +struct Map* sortUser(struct user db,int choice){ + struct Map *map = malloc(sizeof(struct Map) * db.db.row_count); + for (int i = 0; i < db.db.row_count; i++){ + + switch(choice){ + case 1: + case 2: + char* temp = malloc(sizeof(char) * 100); + strcpy(temp,db.row[i].username); + map[i].value = (void*)temp; + break; + + case 3: + case 4: + char* temp2 = malloc(sizeof(char) * 100); + strcpy(temp2,db.row[i].role); + map[i].value = (void*)temp2; + break; + + } + } + switch (choice){ + case 1: + case 3: + qsort(map, db.db.row_count, sizeof(struct Map), compare_decending); + break; + case 2: + case 4: + qsort(map, db.db.row_count, sizeof(struct Map), compare_ascending); + break; + } + return map; } \ No newline at end of file diff --git a/database.h b/database.h index c007aaf..8ce755e 100644 --- a/database.h +++ b/database.h @@ -103,6 +103,7 @@ bool is_admin(char* role){ return false; } + //list of db func int basic_get_row_count(int end, FILE *fp){ fseek(fp, 0, SEEK_SET);//prevent pointer on wrong position