not compiled version;

showUser not yet write;
maybe rewrite and intergrate all list
to a more simplfied unified version
This commit is contained in:
stmctommyau 2022-09-29 15:50:59 +08:00
parent a0ddf33d85
commit aa6c952185
2 changed files with 172 additions and 5 deletions

View File

@ -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;
}

View File

@ -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