基于C语言的卡丁车管理系统【控制台应用程序】
注意:需要提前创建对应的.dat文件
本项目实现了数据的永久存储,有用户的注册、登录。
管理员对卡丁车的管理、查看预约用户、修改帐户权限。
用户对个人信息的管理、查看并预约卡丁车、卡丁车维修上报。
维修员对卡丁车的维修状态上报、个人信息管理。
登录信息页面
login.h
//
// Created by SGCNB666 on 2024/12/27.
//#ifndef GO_KARTS_LOGIN_H
#define GO_KARTS_LOGIN_H#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 账户机构提
typedef struct User
{char username[20]; // 用户名char password[20]; // 密码char permission; // 权限
}User;// 用户个人信息
typedef struct UserPerson
{char name[20]; //用户名char phone[15]; //电话int kart_booknot; //预约卡丁车编号
}UserPerson;// 用户链表
typedef struct UserList
{User data; // 用户信息struct UserList *next; // 指向下一个用户
}UserList;// 用户个人信息链表
typedef struct UserPersonList
{UserPerson data; //用户个人信息struct UserPersonList *next; //指向下一个用户个信息
}UserPersonList;/*** 登录验证* */
UserList* user(UserList *head);/*** 注册* */
int enroll_user(UserList **head);/*** 插入用户* */
int init_user_list(UserList **head, User user);/*** 用户信息的添加* */
void add_user_person(UserPersonList **head, UserList *user);/*** 创建用户个人信息* */
int init_user_Person_list(UserPersonList **head, UserPerson *userPerson);/*** 销毁用户列表* */
void destroy_user_list(UserList *head);/*** 销毁用户个人信息列表* */
void destroy_user_person_list(UserPersonList *head);/*** 保存用户列表到文件* */
void save_user_file(UserList *head);/*** 保存用户个人信息列表到文件* */
void save_user_person_file(UserPersonList *head);/*** 从文件加载用户列表* */
void load_user_file(UserList **head);/*** 从文件加载用户个人信息列表* */
void load_user_person_file(UserPersonList **head);/*** 程序欢迎界面* */
void login_welcome();/*** 登录主界面* */
UserList* login(UserList **head);/*** 输出用户列表* */
void print_user_list(UserList *head);#endif //GO_KARTS_LOGIN_H
login.c
#include "login.h"/*** 登录验证* */
UserList* user(UserList *head)
{UserList *p = head; // p指向头节点User user; // 用户信息printf("请输入用户名:");scanf("%s", user.username); // 输入用户名printf("请输入密码:");scanf("%s", user.password); // 输入密码while(p) // 遍历链表{if(!strcmp(p->data.username, user.username) && !strcmp(p->data.password, user.password)) // 用户名和密码都正确{return p;}p = p->next; // p指向下一个节点}return NULL;
}/*** 注册* */
int enroll_user(UserList **head)
{User user; // 用户信息UserList *p = *head; // p指向头节点int flag = 1; // 标志位while(flag) // 循环输入用户名{printf("请输入用户名:");scanf("%s", user.username); // 输入用户名while (p){if(!strcmp(p->data.username, user.username)) // 用户名已存在{printf("用户名已存在,请重新输入!\n");flag = 1;break;}flag = 0; // 没有找到相同的用户名,更改标志位p = p->next; // p指向下一个节点}p = *head; // p重新指向头节点}printf("请输入密码:");scanf("%s", user.password); // 输入密码if(strcmp(user.username, "admin")) // 如果是管理员,管理员有且仅有admin一个{user.permission = 'A'; // 管理员权限}else{user.permission = 'U'; // 否则是用户权限}if( init_user_list(head, user) ) // 插入用户{return -1;}return 0;
}/*** 插入用户* */
int init_user_list(UserList **head, User user)
{UserList *pNew = (UserList *)malloc(sizeof (UserList)); // 分配内存UserList *p = *head; // p指向头节点if(!pNew) // 分配内存失败{perror("内存分配失败!");return -1;}if(*head != NULL) // 链表不为空{while(p->next) // 遍历链表{p = p->next; // p指向下一个节点}p->next = pNew; // p指向新节点pNew->data = user; // 插入用户信息pNew->next = NULL; // 新节点的next指向NULLreturn 0;}pNew->next = NULL; // 新节点的next指向NULLpNew->data = user; // 插入用户信息*head = pNew; // 头节点指向新节点return 0;
}/*** 用户信息的添加* */
void add_user_person(UserPersonList **head, UserList *user)
{UserPersonList *p = *head; // p指向头节点while(p) // 遍历链表{if(!strcmp(p->data.name, user->data.username)) // 找到相同的用户名{return;}p = p->next; // p指向下一个节点}UserPerson userPerson; // 用户个人信息printf("您是第一次登录,请完善个人信息\n");strcpy(userPerson.name ,user->data.username); // 用户名userPerson.kart_booknot = 0; // 默认没有预约,默认为0,1表示已经被预约printf("请输入您的手机号:");scanf("%s", userPerson.phone); // 手机号while (getchar()!= '\n');init_user_Person_list(head, &userPerson); // 插入用户个人信息return;
}/*** 创建用户个人信息* */
int init_user_Person_list(UserPersonList **head, UserPerson *userPerson)
{UserPersonList *pNew = (UserPersonList *)malloc(sizeof (UserPersonList)); // 分配内存UserPersonList *p = *head; // p指向头节点if(!pNew) // 分配内存失败{perror("内存分配失败!");return -1;}if(*head != NULL) // 链表不为空{while(p->next) // 遍历链表{p = p->next; // p指向下一个节点}p->next = pNew; // p指向新节点pNew->data = *userPerson; // 插入用户个人信息pNew->next = NULL; // 新节点的next指向NULLreturn 0;}pNew->next = NULL; // 新节点的next指向NULLpNew->data = *userPerson; // 插入用户个人信息*head = pNew; // 头节点指向新节点return 0;
}/*** 销毁用户列表* */
void destroy_user_list(UserList *head)
{UserList *p = head, *q = NULL; // p指向头节点,q指向p的前一个节点while(p) // 遍历链表,指针尾随{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放q}
}/*** 销毁用户个人信息列表* */
void destroy_user_person_list(UserPersonList *head)
{UserPersonList *p = head, *q = NULL; // p指向头节点,q指向p的前一个节点while(p) // 遍历链表,指针尾随{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放q}
}/*** 保存用户列表到文件* */
void save_user_file(UserList *head)
{FILE *fp; // 文件指针fp = fopen("login_user.dat", "wb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}UserList *p = head; // p指向头节点while(p) // 遍历链表{fwrite(&(p->data), sizeof(User), 1, fp); // 写入文件,每次写入一个用户信息p = p->next; // p指向下一个节点}printf("保存成功!\n");fclose(fp); // 关闭文件
}/*** 保存用户个人信息列表到文件* */
void save_user_person_file(UserPersonList *head)
{FILE *fp; // 文件指针fp = fopen("person_info.dat", "wb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}UserPersonList *p = head; // p指向头节点while(p) // 遍历链表{fwrite(&(p->data), sizeof(UserPerson), 1, fp); // 写入文件,每次写入一个用户信息p = p->next; // p指向下一个节点}printf("保存成功!\n");fclose(fp); // 关闭文件
}/*** 从文件加载用户列表* */
void load_user_file(UserList **head)
{FILE *fp; // 文件指针fp = fopen("login_user.dat", "rb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}User user; // 用户信息while(fread(&user, sizeof (User), 1, fp) == 1 ) // 读取文件,每次读取一个用户信息{init_user_list(head, user); // 读取用户列表}fclose(fp); // 关闭文件
}/*** 从文件加载用户个人信息列表* */
void load_user_person_file(UserPersonList **head)
{FILE *fp; // 文件指针fp = fopen("person_info.dat", "rb"); // 以二进制方式打开文件if(!fp){perror("文件打开失败");return;}UserPerson userPerson1; // 用户信息while(fread(&userPerson1, sizeof (UserPerson), 1, fp) == 1 ) // 读取文件,每次读取一个用户信息{init_user_Person_list( head,&userPerson1); // 读取用户列表}fclose(fp); // 关闭文件
}/*** 程序欢迎界面* */
void login_welcome()
{system("clear"); // 清屏printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ ┃\n");printf("┃ 欢迎进入卡丁车管理系统有系统 ┃\n");printf("┃ ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("按任意键继续...\n");getchar();
}/*** 登录主界面* */
UserList* login(UserList **head)
{printf("登录页面\n");UserList* p = NULL; // p指向头节点char ch;while(1){system("clear"); // 清屏printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.登录 2.注册 3.退出 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':p = user(*head);if( p ){printf("登录成功!\n");return p;}else{printf("密码错误,登录失败!\n");}break;case '2':enroll_user(head);break;case '3':{return NULL;}break;case '4':print_user_list(*head);break;default:printf("输入错误,请重新输入!\n");break;}while (getchar() != '\n');printf("按任意键继续...\n");getchar();}
}/*** 打印用户列表* */
void print_user_list(UserList *head)
{UserList *p = head;while(p){printf("用户名:%s\n", p->data.username);printf("密码:%s\n", p->data.password);printf("权限:%c\n", p->data.permission);p = p->next;}
}
登录后页面
home_face.h
//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_HOME_FACE_H
#define GO_KARTS_HOME_FACE_H#include <stdio.h>
#include "login.h"
#include "user.h"
#include "admin.h"
#include "repair.h"/*** 显示管理员主页面*/
void admin_home(UserPersonList* head_person,KartNode** head, UserList* head_user);/*** 显示用户主页面*/
void user_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List);/*** 显示维修员主页面*/
void repair_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List);/*** 卡丁车信息界面* */
void karts_info(KartNode** head);/*** 权限管理页面* */
void user_info(UserList* head);/*** 卡丁车预约界面* */
void katrs_book(UserPerson* head_person,KartNode* head_kart);/*** 个人信息管理界面* */
void user_person(UserPerson* userPerson, UserList* user_List);/*** 卡丁车报修界面* */
void karts_repair(KartNode* head_kart);/*** 修改密码* */
void change_password(UserList* user);#endif //GO_KARTS_HOME_FACE_H
home_face.c
//
// Created by SGCNB666 on 2024/12/31.
//#include "home_face.h"/*** 显示管理员主界面* */
void admin_home(UserPersonList* head_person,KartNode** head_kart, UserList* head_user)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("管理员主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.卡丁车信息管理 3.权限管理 4.删除用户 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':save_user_person_file(head_person);save_user_file(head_user);return;break;case '2':karts_info( head_kart);break;case '3':user_info(head_user);break;case '4':delete_User(&head_user, &head_person);break;default:printf("输入错误,请重新输入!\n");break;}while (getchar() != '\n');printf("按任意键继续...\n");getchar();}}/*** 显示用户主页面*/
void user_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List)
{while (getchar() != '\n');UserPersonList *p = head_person;KartNode *p_kart = head_kart;while(p){if(strcmp(p->data.name,user_List->data.username)==0){break;}p = p->next;}UserPerson *userPerson = &(p->data);while(1){system("clear"); // 清屏char ch;while (getchar()!= '\n');printf("用户主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.卡丁车预约管理 3.个人信息管理 ┃\n");printf("┃ 4.卡丁车报修 5.卡丁车信息查询 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':user_kart_booknot_save(head_person,head_kart);return;break;case '2':katrs_book(&p->data,p_kart);break;case '3':user_person(&p->data,user_List);break;case '4':user_kart_repair(&p->data,p_kart);break;case '5':print_Kart_list(p_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar()!= '\n');getchar();}}/*** 显示维修员主页面*/
void repair_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List)
{while (getchar() != '\n');UserPersonList *p = head_person;KartNode *p_kart = head_kart;while(p){if(strcmp(p->data.name,user_List->data.username)==0){break;}p = p->next;}UserPerson *userPerson = &(p->data);while (1){system("clear"); // 清屏char ch;printf("维修员主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.卡丁车报修管理 3.个人信息管理 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':user_kart_booknot_save(head_person,head_kart);return;break;case '2':karts_repair(head_kart);break;case '3':user_person(&p->data,user_List);break;default:printf("输入错误,请重新输入!\n");break;}}}
/*** 卡丁车信息界面* */
void karts_info(KartNode** head)
{load_Kart_file(head);while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("卡丁车信息管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.保存退出 2.增加卡丁车信息 3.删除卡丁车信息 ┃\n");printf("┃ 4.修改卡丁车信息 5.查询卡丁车信息 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':save_Kart_file(*head);return;break;case '2':enroll_Kart(head);break;case '3':delete_Kart(head);break;case '4':modify_Kart(*head);break;case '5':print_Kart_list(*head);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');getchar();}
}/*** 权限管理页面* */
void user_info(UserList* head)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("权限身份管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.保存退出 2.修改用户权限身份标识 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_user_file(head);return;break;case '2':revise_User_perm(head);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 卡丁车预约界面* */
void katrs_book(UserPerson* userPerson,KartNode* head_kart)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("预约管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.卡丁车预约 3.卡丁车预约取消 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':return;break;case '2':user_kart_booknot(userPerson,head_kart);break;case '3':user_kart_booknot_cancel(userPerson,head_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 个人信息管理界面* */
void user_person(UserPerson* userPerson, UserList* user_List)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("个人信管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.查看个人信息 3.修改个人信息 4.修改密码 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_user_file(user_List);return;break;case '2':if(user_List->data.permission == 'R'){print_repair_info(userPerson);}else{print_user_info(userPerson);}break;case '3':revise_user_info(userPerson);break;case '4':change_password(user_List);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 卡丁车报修界面* */
void karts_repair(KartNode* head_kart)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("卡丁车报修管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.查看待报修卡丁车 3.上报维修完成或无法维修进行报废处理 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_Kart_file(head_kart);return;break;case '2':repair_karts_info(head_kart);break;case '3':report_repair_info(head_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 修改密码* */
void change_password(UserList* user)
{printf("请输入新密码:");scanf("%s",user->data.password);return;
}
管理员功能页面
admin.h
//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_ADMIN_H
#define GO_KARTS_ADMIN_H
#include <stdio.h>
#include <stdlib.h>
#include "login.h"// 赛车结构体
typedef struct Kart
{int kart_id; // 赛车编号char repair_not; // 是否需要维修char kart_name[20]; // 赛车名称char kart_type[20]; // 赛车类型char kart_color[20]; // 赛车颜色char book_not; // 是否被预定char user_name[20]; // 预定用户
}Kart;// 卡丁车链表
typedef struct KartNode
{Kart data;struct KartNode *next;
}KartNode;/*** 添加卡丁车信息* */
void enroll_Kart(KartNode **head);
/*** 添加卡丁车节点* */
void init_Kart_List(KartNode **head, Kart data);/*** 销毁卡丁车列表* */
void destroy_Kart_list(KartNode *head);/*** 保存卡丁车列表到文件* */
void save_Kart_file(KartNode *head);/*** 从文件加载卡丁车列表* */
void load_Kart_file(KartNode **head);/*** 查询卡丁车列表* */
void print_Kart_list(KartNode *head);/*** 删除卡丁车* */
void delete_Kart(KartNode **head);/*** 修改卡丁车信息* */
void modify_Kart(KartNode *head);/*** 修改用户权限身份* */
void revise_User_perm(UserList *head);/*** 删除用户* */
void delete_User(UserList **head, UserPersonList **head_person);/*** 删除用户信息* */
void delete_User_Person(UserList *head, UserPersonList **head_person);#endif //GO_KARTS_ADMIN_H
admin.c
//
// Created by SGCNB666 on 2024/12/31.
//#include "admin.h"/*** 添加卡丁车信息* */
void enroll_Kart(KartNode **head)
{int id; // 生成卡丁车编号KartNode *p = *head; // p指向头节点if(!p) // 链表为空{id = 1001;}else{while(p){id = p->data.kart_id + 1; // 生成卡丁车编号p = p->next; // p指向下一个节点}}Kart new_kart;new_kart.kart_id = id; // 生成卡丁车编号new_kart.repair_not = '0'; // 初始化是否维修,默认不需要维修new_kart.book_not = '0'; // 初始化是否预约,默认不需要预约new_kart.user_name[0] = '\0'; // 初始化预约人为空printf("添加编号为%d的车辆信息\n", id);printf("请输入卡丁车名称:");scanf("%s", new_kart.kart_name); // 输入卡丁车名称printf("请输入卡丁车类型:");scanf("%s", new_kart.kart_type); // 输入卡丁车类型printf("请输入卡丁车颜色:");scanf("%s", new_kart.kart_color); // 输入卡丁车颜色init_Kart_List(head, new_kart);
}/*** 添加卡丁车节点* */
void init_Kart_List(KartNode **head, Kart data)
{KartNode *pNew = (KartNode *)malloc(sizeof(KartNode)); // 分配内存if(!pNew) // 分配内存失败{perror("内存分配失败\n");return;}KartNode *p = *head; // p指向头节点if(*head != NULL) // 链表不为空{while(p->next) // 找到链表的尾节点{p = p->next; // p指向下一个节点}p->next = pNew; // 尾节点指向新节点pNew->data = data; // 新节点数据赋值pNew->next = NULL; // 新节点指向空return;}pNew->next = NULL; // 新节点指向空pNew->data = data; // 新节点数据赋值*head = pNew; // 头节点指向新节点return;
}/*** 销毁卡丁车列表* */
void destroy_Kart_list(KartNode *head)
{KartNode *p = head, *q = NULL; // p指向头节点,q指向尾节点while(p) // 遍历链表{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放内存}
}/*** 保存卡丁车列表到文件* */
void save_Kart_file(KartNode *head)
{FILE *fp = fopen("karts_info.dat", "wb"); // 以二进制方式打开文件if(!fp) // 打开文件失败{perror("文件打开失败!");return;}KartNode *p = head; // p指向头节点while(p) // 遍历链表{fwrite( &p->data, sizeof (Kart), 1, fp); // 写入文件p = p->next;}printf("保存成功!\n");fclose(fp); // 关闭文件return;
}/*** 从文件加载卡丁车列表* */
void load_Kart_file(KartNode **head)
{FILE *fp = fopen("karts_info.dat", "rb"); // 以二进制方式打开文件if(!fp) // 打开文件失败{perror("文件打开失败!");return;}Kart data; // 卡丁车信息while(fread(&data, sizeof (Kart), 1, fp)) // 读取文件{init_Kart_List(head, data); // 添加卡丁车节点}fclose(fp); // 关闭文件
}/*** 查询卡丁车列表* */
void print_Kart_list(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p){printf("卡丁车列表为空!\n");return;}printf("卡丁车编号\t卡丁车名称\t卡丁车类型\t卡丁车颜色\t是否维修或报废\t是否预约\t预约人\n");while(p) // 遍历链表{printf("%d\t\t", p->data.kart_id);printf("%s\t\t", p->data.kart_name);printf("%s\t\t", p->data.kart_type);printf("%s\t\t", p->data.kart_color);if(p->data.repair_not == '0'){printf("%c(无损坏)\t", p->data.repair_not);}else if(p->data.repair_not == '1'){printf("%c(报修中)\t", p->data.repair_not);}else{printf("%c(已报废)\t", p->data.repair_not);}printf("%c\t\t", p->data.book_not);printf("%s\t\t\n", p->data.user_name);p = p->next; // p指向下一个节点}
}/*** 删除卡丁车* */
void delete_Kart(KartNode **head)
{KartNode *p = *head; // p指向头节点if(!p) // 链表为空{printf("卡丁车列表为空!\n");}int id;printf("请输入要删除的卡丁车编号:");scanf("%d", &id); // 输入卡丁车编号KartNode *q = NULL; // q置空while(p) // 遍历链表,指针尾随{ if(id == p->data.kart_id){if(p == *head) // 要删除的是头节点{*head = p->next; // 头节点后移free(p); // 释放内存return;}else{q->next = p->next; // 前一个节点指向后一个节点free(p); // 释放内存return;}}q = p; // q指向pp = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}/*** 修改卡丁车信息* */
void modify_Kart(KartNode *head)
{KartNode *p = head, *q = NULL; // p指向头节点,q指向尾节点if(!p) // 链表为空{printf("卡丁车列表为空!\n");}int id; // 卡丁车编号printf("请输入要修改的卡丁车编号:");scanf("%d", &id); // 输入卡丁车编号while(p) // 遍历链表{if(id == p->data.kart_id) // 找到了要修改的卡丁车{while(1) // 循环修改卡丁车信息{printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.全部修改 2.是否维修 3.卡丁车名称 ┃\n");printf("┃ 4.卡丁车类型 5.卡丁车颜色 6.预约用户名 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");while(getchar() != '\n'); // 清空缓冲区printf("请选择:\n");char ch;scanf("%c", &ch); // 输入选择while(getchar() != '\n'); // 清空缓冲区switch(ch){case '1':printf("请输入卡丁车名称:");scanf("%s", p->data.kart_name);printf("请输入卡丁车类型:");scanf("%s", p->data.kart_type);printf("请输入卡丁车颜色:");scanf("%s", p->data.kart_color);while(getchar() != '\n');printf("请输入是否维修:");scanf("%c", &p->data.repair_not);while(getchar() != '\n');printf("请输入预约用户名:");scanf("%s", p->data.user_name);p->data.book_not = '1';while(getchar() != '\n');return;break;case '2':printf("请输入是否维修:");scanf("%c", &p->data.repair_not);while(getchar() != '\n');return;break;case '3':printf("请输入卡丁车名称:");scanf("%s", p->data.kart_name);while(getchar() != '\n');return;break;case '4':printf("请输入卡丁车类型:");scanf("%s", p->data.kart_type);while(getchar() != '\n');return;break;case '5':printf("请输入卡丁车颜色:");scanf("%s", p->data.kart_color);while(getchar() != '\n');return;break;case '6':printf("请输入预约用户名:");scanf("%s", p->data.user_name);p->data.book_not = '1';while(getchar() != '\n');return;break;default:printf("不存在该选项,请重新输入!\n");}printf("按回车健继续...");getchar();}}q = p; // q指向pp = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}/*** 修改用户权限身份* */
void revise_User_perm(UserList *head)
{UserList *p = head; // p指向头节点if(!p) // 链表为空{printf("用户列表为空!\n");return;}char username[20]; // 用户名printf("请输入要修改权限的用户名:");scanf("%s", username); // 输入用户名while(getchar() != '\n');if(strcmp(username, "admin") == 0) // 要修改的是admin用户{printf("admin用户是管理员,不能修改权限!\n");return;}while(p) // 遍历链表{if(strcmp(username, p->data.username) == 0) // 找到了要修改的用户{printf("开始修改用户权限:('A'是普通用户,'R'是维修员)\n");scanf("%c", &p->data.permission);printf("修改成功!\n");printf("%s, %s, %c\n", p->data.username, p->data.password, p->data.permission);return;}p = p->next; // p指向下一个节点}printf("用户不存在!\n");return;
}/*** 删除用户* */
void delete_User(UserList **head, UserPersonList **head_person)
{printf("请输入想要删除的用户名:\n");char username[20];scanf("%s", username);while(getchar()!= '\n');UserList *p = *head;if(strcmp(username, "admin") == 0) // 要删除的是admin用户{printf("admin用户是管理员,不能删除!\n");return;}if(!p) // 链表为空{printf("用户列表为空!\n");return;}if(strcmp(username, p->data.username) == 0) // 要删除的是头节点{delete_User_Person(*head, head_person); // 删除用户信息*head = p->next; // 头节点后移free(p); // 释放内存return;}UserList *q = NULL;while(p) // 遍历链表{if(strcmp(username, p->data.username) == 0) // 找到了要删除的用户{ delete_User_Person(*head, head_person); // 删除用户信息q->next = p->next; // 前一个节点指向后一个节点free(p); // 释放内存return;}q = p; // q指向pp = p->next; // p指向下一个节点}printf("该用户不存在!\n");return;
}/*** 删除用户信息* */
void delete_User_Person(UserList *user, UserPersonList **head_person)
{UserList *p_user = user; // p_user指向头节点UserPersonList *p_person = *head_person; // p_person指向头节点if(strcmp(p_user->data.username,p_person->data.name) == 0) // 要删除的是头节点{*head_person = p_person->next; // 头节点后移free(p_person); // 释放内存return;}UserPersonList *q_person = NULL; // q_person指向尾节点while(p_person) // 遍历链表{if(strcmp(p_user->data.username,p_person->data.name) == 0) // 找到了要删除的用户{q_person->next = p_person->next; // 前一个节点指向后一个节点free(p_person); // 释放内存return;}q_person = p_person; // q_person指向p_personp_person = p_person->next; // p_person指向下一个节点}printf("该用户不存在!\n");return;
}
用户功能页面
user.h
//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_USER_H
#define GO_KARTS_USER_H#include "admin.h"
#include "login.h"/*** 卡丁车预约* */
void user_kart_booknot(UserPerson *userPerson,KartNode *kart);/*** 卡丁车查询* */
void user_kart_booknot_query(KartNode *kart);/*** 卡丁车预约取消* */
void user_kart_booknot_cancel(UserPerson *userPerson,KartNode *kart);/*** 卡丁车预约信息保存* */
void user_kart_booknot_save(UserPersonList *head,KartNode *kart);/*** 卡丁车预约信息加载* */
void user_kart_booknot_load(UserPersonList **head);/*** 卡丁车报修* */
void user_kart_repair(UserPerson *userPerson,KartNode *kart);/*** 个人信息查询* */
void print_user_info(UserPerson *userPerson);/*** 个人信息修改* */
void revise_user_info(UserPerson *userPerson);#endif //GO_KARTS_USER_H
user.c
//
// Created by SGCNB666 on 2024/12/31.
//#include "user.h"/*** 卡丁车预约* */
void user_kart_booknot(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点while(p) // 遍历链表{if(!strcmp(userPerson->name,p->data.user_name)) // 判断是否预约过{printf("您已经预约了卡丁车!\n");return;}p = p->next; // p指向下一个节点}p = kart; // p重新指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输入要预约的卡丁车编号:");int num; // 输入的编号scanf("%d", &num); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(p->data.kart_id == num) // 找到了{p->data.book_not = '1'; // 预约成功userPerson->kart_booknot = num; // 修改用户个人信息strcpy(p->data.user_name ,userPerson->name); // 修改车辆信息printf("预约成功!\n");return;}p = p->next;}printf("查询不到该编号的卡丁车!\n");return;
}/*** 卡丁车预约查询* */
void user_kart_booknot_query(KartNode *kart)
{KartNode *p = kart; // p指向头节点print_Kart_list(kart); // 打印卡丁车列表
}/*** 卡丁车预约取消* */
void user_kart_booknot_cancel(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输取消预约的卡丁车编号:");int num; // 输入的编号scanf("%d", &num);while(getchar() != '\n'); // 清空缓冲区while(p) // 遍历链表{ if(p->data.kart_id == num) // 找到了{p->data.book_not = '0'; // 取消预约成功userPerson->kart_booknot = 0; // 修改用户个人信息strcpy(p->data.user_name ,""); // 修改车辆信息printf("取消预约成功!\n"); return;}p = p->next; // p指向下一个节点}printf("查询不到该编号的卡丁车!\n");return;
}/*** 卡丁车预约信息保存* */
void user_kart_booknot_save(UserPersonList *head,KartNode *kart)
{save_user_person_file(head); // 保存用户个人信息列表到文件save_Kart_file(kart); // 保存卡丁车列表到文件
}/*** 卡丁车预约信息加载* */
void user_kart_booknot_load(UserPersonList **head)
{load_user_person_file(head); // 加载用户个人信息列表
}/*** 卡丁车报修* */
void user_kart_repair(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输入要报修的卡丁车编号:");int num; // 输入的编号scanf("%d", &num); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(p->data.kart_id == num) // 找到了{p->data.repair_not = '1'; // 报修成功printf("报修成功!\n");return;}p = p->next; // p指向下一个节点}printf("查询不到该编号的卡丁车!\n");return;
}/*** 个人信息查询* */
void print_user_info(UserPerson *userPerson)
{printf("个人信息如下:\n");printf("用户名:%s\n", userPerson->name);printf("手机号:%s\n", userPerson->phone);printf("预约卡丁车编号:%d\n", userPerson->kart_booknot);return;
}/*** 个人信息修改* */
void revise_user_info(UserPerson *userPerson)
{printf("请输入新的手机号:");scanf("%s", userPerson->phone); // 输入新的手机号while(getchar()!= '\n');return;
}
维修员功能实现
repair.h
//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_REPAIR_H
#define GO_KARTS_REPAIR_H#include "admin.h"
#include "user.h"
#include "login.h"/*** 显示维修员信息* */
void print_repair_info(UserPerson *userPerson);/*** 显示待维修的车辆信息* */
void repair_karts_info(KartNode *head);/*** 上报维修情况* */
void report_repair_info(KartNode *head);#endif //GO_KARTS_REPAIR_H
repair.c
//
// Created by SGCNB666 on 2024/12/31.
//#include "repair.h"/*** 显示维修员信息* */
void print_repair_info(UserPerson *userPerson)
{printf("个人信息如下:\n");printf("用户名:%s\n", userPerson->name);printf("手机号:%s\n", userPerson->phone);return;
}/*** 显示待维修的车辆信息* */
void repair_karts_info(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p) // 如果链表为空{printf("卡丁车列表为空!\n");return;}while(p) // 遍历链表{if (p->data.repair_not == '1') // 如果需要维修{printf("编号:%d\t\t", p->data.kart_id);printf("名称:%s\t\t", p->data.kart_name);printf("类型:%s\t\t", p->data.kart_type);printf("颜色:%s\t\n", p->data.kart_color);}p = p->next; // p指向下一个节点}
}/*** 上报维修情况* */
void report_repair_info(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p) // 如果链表为空{printf("卡丁车列表为空!\n");return;}printf("请输入你想上报的卡丁车编号:");int id; // 输入的编号scanf("%d", &id); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(id == p->data.kart_id) // 找到了{while(getchar()!= '\n');printf("请输入维修情况(1:报废无法维修,2:维修完成):");char ch;scanf("%c", &ch); // 输入维修情况if(ch == '1'){p->data.repair_not = '3';printf("维修完成!\n");}else if(ch == '2'){p->data.repair_not = '0';printf("维修完成!\n");}else{printf("不存在该选项!\n");}return;}p = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}
主函数main.c
/*************************************************************************> File Name: main.c> Author: sgc> Description: 卡丁车管理系统> Created Time: 2024年12月30日 星期一 17时53分14秒************************************************************************/#include <stdio.h>
#include "login.h"
#include "home_face.h"
#include "admin.h"int main(int argc,char *argv[])
{UserList *head_user = NULL;KartNode *head_kart = NULL;UserPersonList *head_person = NULL;load_user_file(&head_user); // 加载用户列表login_welcome(); // 显示欢迎界面UserList *p = NULL;p = login(&head_user); // 登录主界面if(!p) // 判断是否是正常登录{save_user_file(head_user);return 0;}save_user_file(head_user); // 保存用户列表到文件// 显示管理员主界面if(p->data.permission == 'U') // 管理员{load_user_person_file(&head_person); // 加载用户个人信息列表save_user_person_file(head_person); // 保存用户个人信息列表到文件admin_home( head_person,&head_kart,head_user); // 管理员主界面}else if(p->data.permission == 'A') // 普通用户{load_user_person_file(&head_person); // 加载用户个人信息列表add_user_person(&head_person, p); // 添加用户个人信息save_user_person_file(head_person); // 保存用户个人信息列表到文件load_Kart_file(&head_kart); // 加载卡丁车列表user_home(head_person,head_kart,p); // 用户主界面}else if(p->data.permission == 'R') // 维修员{load_user_person_file(&head_person); // 加载用户个人信息列表add_user_person(&head_person, p); // 添加用户个人信息save_user_person_file(head_person); // 保存用户个人信息列表到文件load_Kart_file(&head_kart); // 加载卡丁车列表repair_home(head_person,head_kart,p); // 维修员主界面}else // 其他{printf("权限错误!请联系管理员进行修改!\n");}destroy_user_list(head_user); // 销毁用户列表destroy_user_person_list(head_person); // 销毁用户个人信息列表destroy_Kart_list(head_kart); // 销毁卡丁车列表return 0;
}
相关文章:

基于C语言的卡丁车管理系统【控制台应用程序】
注意:需要提前创建对应的.dat文件 本项目实现了数据的永久存储,有用户的注册、登录。 管理员对卡丁车的管理、查看预约用户、修改帐户权限。 用户对个人信息的管理、查看并预约卡丁车、卡丁车维修上报。 维修员对卡丁车的维修状态上报、个人信息管理。 …...

Docker 搭建 Gogs
Docker 搭建 Gogs 准备工作 先准备配置目录和持久化目录,举个栗子:mkdir -p /opt/module/gogs/{data,backup} 拉取官方Gogs镜像 # 拉取 gogs:0.13 docker pull gogs/gogs:0.13 # 拉取最新版 gogs 镜像 docker pull gogs/gogs启动一个临时容器【通过创…...

PostgreSQL的备份方式
PostgreSQL 提供多种方式进行备份,适用于不同需求的场景。常用的备份方法如下: 1. 逻辑备份(pg_dump 和 pg_dumpall) 1.1 使用 pg_dump 备份单个数据库 pg_dump 是 PostgreSQL 内置的逻辑备份工具,可以将数据库导出为…...

Springboot 3项目整合Knife4j接口文档(接口分组详细教程)
文章目录 前言一、Spring Boot 3.0整合Knife4j二、OpenApi 3注解的使用规范三、使用步骤 1.Spring Boot 3.0项目中使用knife4j2.在application.yml中添加knife4j相关配置3.设置WebMvc相关配置(解决封装统一异常处理后doc.html无法打开的问题)4.创建Knif…...

深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)
深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时,例如执行命令: conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包,保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...

Redis核心技术知识点全集
Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...

【Unity3D】ECS入门学习(九)SystemBase
SystemBase:支持主线程或多线程执行筛选实体任务。 主要介绍是内部成员:Entities的各种筛选方法,其内部成员还有EntityManager ForEach方法筛选,传递一个有参委托函数进去,参数ref xxx组件类(可填多个&…...

【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
模型部署系列文章 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程【保姆级教程附代码(二)】Pytor…...

CertiK《Hack3d:2024年度安全报告》(附报告全文链接)
CertiK《Hack3d:2024年度安全报告》现已发布,本次报告深入分析了2024年Web3.0领域的安全状况。2024年损失总额超过23亿美元,同比增幅高达31.61%;其中,12月的损失金额最少。过去一年,网络钓鱼攻击和私钥泄露…...

TIOBE 指数 12 月排行榜公布,VB.Net排行第九
IT之家 12 月 10 日消息,TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎,今天 TIOBE 官网公布了 2024 年 12 月的编程语言排行榜,IT之家整理如下: …...

【网络协议】开放式最短路径优先协议OSPF详解(一)
OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议,它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…...

嵌入式Linux驱动开发的基本知识(驱动程序的本质、常见的设备类型、设备号的本质理解、设备实例的注册过程)
基本概念之什么是驱动程序()? 驱动程序本质上是代码逻辑的集合,通常用于管理、驱动多个设备实例。某个设备要想使用驱动程序,需要实例化相应的驱动程序的结构体,并在系统中注册,获得主设备号、次设备号,并…...

爱死机第四季(秘密关卡)4KHDR国语字幕
通过网盘分享的文件:love_death_robot 链接: https://pan.baidu.com/s/1bG3Xtdopenil2O_y93hY_g?pwd8kib 提取码: 8kib...

kubelet状态错误报错
journalctl -xeu kubelet 执行后的日志如下: -- -- The process exit code is exited and its exit status is 1. Jan 02 14:20:06 iv-ydipyqxfr4wuxjsij0bd systemd[1]: kubelet.service: Failed with result exit-code. -- Subject: Unit failed -- Defined-By: system…...

<div>{{ $t(“collectionPlan“) }}</div> 中的$t是什么
$t是Vue I18n插件提供的一种方法,用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例,展示如何在Vue I18n中定义消息: const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...

[C++刷题] 求回文素数
求回文素数 题目 素数回文数的个数 题目描述 求 11 11 11 到 n n n 之间(包括 n n n),既是素数又是回文数的整数有多少个。 输入格式 一个大于 11 11 11 小于 10000 10000 10000 的整数 n n n。 输出格式 11 11 11 到 n n n 之…...

SQLALchemy如何将SQL语句编译为特定数据库方言
最近在一个使用fastapitortoise-orm的项目中,需要将orm的语句编译成特定数据库方言,但是查询了官方文档及一些资料却找不到合适的方法论😔,于是乎我就把目光放到了sqlalchemy身上,东找西找给我找着了。话不多说&#x…...

[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析
目录 [卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波(Kalman …...

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据
存储器模式:在HAL库中,I2C有专门对存储器外设设置的库函数 I2C(一):存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…...

scrapy 教程
Scrapy Tutorial In this tutorial, we’ll assume that Scrapy is already installed on your system. If that’s not the case, see Installation guide. We are going to scrape quotes.toscrape.com, a website that lists quotes from famous authors. This tutorial …...

2025元旦源码免费送
我们常常在当下感到时间慢,觉得未来遥远,但一旦回头看,时间已经悄然流逝。对于未来,尽管如此,也应该保持一种从容的态度,相信未来仍有许多可能性等待着我们。 免费获取源码。 更多内容敬请期待。如有需要可…...

高级架构五 设计模式
一 设计模式七大原则 1.1. 设计模式目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好的&#…...

RFID手持机与RFID工业平板在仓储物流管理系统中的选型
概述 随着物联网技术在仓储物流管理系统中的普及,RFID手持机与RFID工业平板作为基于RFID技术手持式读写器的两种重要终端设备形态,得到了广泛应用。尽管RFID手持机与RFID工业平板都具备读写 RFID标签的基本功能,使用场景较为类似,…...

IoC设计模式详解:控制反转的核心思想
前言:在软件开发中,设计模式是一种经过验证的、在特定场景下能有效解决问题的解决方案。控制反转(Inversion of Control,IoC) 作为一种设计模式,通过让程序的控制流和对象管理反转,从而使得代码…...

《云原生安全攻防》-- K8s安全配置:CIS安全基准与kube-bench工具
在本节课程中,我们来了解一下K8s集群的安全配置,通过对CIS安全基准和kube-bench工具的介绍,可以快速发现K8s集群中不符合最佳实践的配置项,及时进行修复,从而来提高集群的安全性。 在这个课程中,我们将学习…...

LINUX下载编译gtk
下载 选择自己合适的版本 GNOME / gtk GitLab 下载meson GNOME / gtk GitLab 编译 BUILD_DIRbuilddir INSTALL_DIR${HOME}/gtk-resultMESON_PATHpwd/meson-1.6.1/meson.py${MESON_PATH} setup \--prefix ${INSTALL_DIR} \${BUILD_DIR}cd builddir${MESON_PATH} compile…...

基于VSCode软件框架的RISC-V IDE MRS2正式上线发布
基于VSCode软件框架的RISC-V IDE MRS2正式上线发布 一、概述 MounRiver Studio Ⅱ(MRS2)为MounRiver Studio的换代版本,从V2.1开始,框架更换至更现代的VSCode,并深度定制开发。在工程管理、代码编辑、编译、调试等方面均兼容之前版本&#…...

AWS re:Invent 2024 - Dr. Werner Vogels 主题演讲
今年,我有幸亲临现场参加了所有的 keynote,每一场都让我感受到深深的震撼。无论是全新的功能发布,还是令人眼前一亮的新特性展示,每一场 keynote 都精彩纷呈,充满干货,值得反复学习和回味。 恰好ÿ…...

前端小案例——520表白信封
前言:我们在学习完了HTML和CSS之后,就会想着使用这两个东西去做一些小案例,不过又没有什么好的案例让我们去练手,本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…...

FPGA随记——过约束
什么是过约束? 从字面意思来看,所谓过约束是指约束过紧了。这个“过”体现在setup requirement变小了,对于单周期路径,这个值通常与时钟周期一致,但在过约束情况下,等效于这个值变小了,也就是时…...