#ifndef Users_H
#define Users_H
#include "common.h"
// 用户角色枚举
typedef enum {
ROLE_ADMIN, // 管理员
ROLE_OPERATOR, // 操作员
ROLE_FINANCE // 财务人员
} UserRole;
// 权限标志位(使用位域优化存储)
typedef struct {
unsigned int user_manage : 1; // 用户管理权限
unsigned int product_manage : 1; // 农产品管理
unsigned int member_manage : 1; // 社员管理
unsigned int inventory_manage : 1;// 库存管理
unsigned int sales_manage : 1; // 销售管理
unsigned int finance_manage : 1; // 财务管理
} Permissions;
// 用户结构体
typedef struct User {
int user_id; // 用户ID
char username[32]; // 用户名(限制长度)
char password[64]; // 密码(预留加密空间)
UserRole role; // 用户角色
Permissions perm; // 权限配置
struct User* next; // 链表指针
} User;
typedef enum LoginState {
LOGGED_OUT,
LOGGED_IN
} LoginState;
// 全局状态变量
extern User* current_user;
extern LoginState login_state;
// 全局用户链表头指针
User* user_list = NULL;
const char* get_role_name(UserRole role);
#endif
#ifndef Sales_H
#define Sales_H
#include "common.h"
// 订单状态枚举
typedef enum {
ORDER_PENDING, // 待处理
ORDER_SHIPPED, // 已发货
ORDER_COMPLETED, // 已完成
ORDER_CANCELED // 已取消
} OrderStatus;
// 销售记录结构体
typedef struct SalesRecord {
int order_id; // 订单编号(唯一)
int product_id; // 关联的农产品编号
int buyer_id; // 关联的买家编号
float quantity; // 销售数量(支持小数)
float unit_price; // 单价
float total_amount; // 总金额(quantity * unit_price)
OrderStatus status; // 订单状态
char sale_date[20]; // 销售日期(格式:YYYY-MM-DD)
struct SalesRecord* next; // 链表指针
} SalesRecord;
SalesRecord* sales_list = NULL;
void add_sales_record();// 添加销售记录
void delete_sales_record();// 删除销售记录
void modify_sales_record();// 修改销售记录
void query_sales();// 查询销售记录
void sales_statistics();// 统计销售数据
#endif
#ifndef Product_H
#define Product_H
#include "common.h"
typedef struct Product
{
int id;//农产品编号
char name[30];//农产品名称
char type[20];//农产品类型
float price;//单价
char description[100];//农产品描述
int stock_quantity;//库存数量
struct Product *next;//指向下一个节点
}Product;
//创建农产品结构体
Product* product_list = NULL;
Product* add_product(Product* head);
//添加农产品信息
Product* delete_product(Product* head, int target_id);
//删除农产品信息
void search_product(Product* head, int target_id);
//查询农产品信息
void modify_product(Product* head, int target_id);
//修改农产品信息
void statistics(Product* head);
//统计农产品信息
void summary(Product* head);
//汇总农产品信息
#endif
#ifndef MENU_H
#define MENU_H
#include "common.h"
// 函数原型声明
void admin_main_menu(void);
void operator_main_menu(void);
void finance_management_menu(void);
void role_based_menu();
User* add_user();
int delete_user();
void modify_permissions();
User* find_user_by_id();
void display_all_users();
User* current_user = NULL;
LoginState login_state = LOGGED_OUT;
#endif
#ifndef Member_H
#define Member_H
#include "common.h"
typedef struct Member {
int id; // 社员编号
char name[30]; // 社员姓名
char id_card[19]; // 身份证号(18位+结束符)
char phone[12]; // 联系方式(11位手机号)
float investment; // 入股金额
char crops[50]; // 种植作物信息(多个作物用逗号分隔)
char join_date[11]; // 加入日期(YYYY-MM-DD格式)
struct Member *next; // 链表指针
} Member;
//创建社员结构体
Member* member_list = NULL;
Member* add_member(Member* head);
//添加社员信息
Member* delete_member(Member* head, int target_id);
//删除社员信息
void modify_member(Member* head, int target_id);
//修改社员信息
void search_member(Member* head, int mode);
//查询社员信息
void statistics_member(Member* head);
//统计社员信息
void summary_member(Member* head);
//汇总社员信息
#endif
#ifndef Inventory_H
#define Inventory_H
#include "common.h"
typedef enum {
INBOUND, // 入库
OUTBOUND, // 出库
LOSS // 损耗
} OperationType;
// 库存记录结构体
typedef struct InventoryRecord {
int record_id; // 记录编号(唯一标识)
int product_id; // 关联的农产品编号
OperationType op_type; // 操作类型
int quantity; // 变动数量(正数表示增加,负数表示减少)
char date[11]; // 操作日期(YYYY-MM-DD格式)
char operator[20]; // 操作员姓名/ID
struct InventoryRecord* next; // 链表指针
} InventoryRecord;
InventoryRecord* inventory_list = NULL;
void add_inventory_record();
void delete_inventory_record(int target_id);
void modify_inventory_record(int target_id);
void query_inventory_records();
void inventory_summary();
#endif
#ifndef Finance_H
#define Finance_H
#include "common.h"
// 财务类型
typedef enum {
FINANCE_INCOME, // 收入(关联销售订单)
FINANCE_EXPENSE, // 支出(关联采购/损耗)
} FinanceType;
// 财务记录结构体
typedef struct FinancialRecord {
int record_id; // 记录编号(唯一)
FinanceType type; // 财务类型
double amount; // 金额(支持正负)
char record_date[20]; // 日期(YYYY-MM-DD)
int related_order; // 关联的销售订单ID(收入时使用)
int related_stock; // 关联的库存记录ID(支出时使用)
char operator[20]; // 操作员ID
struct FinancialRecord* next; // 链表指针
} FinancialRecord;
void add_finance_record();// 添加财务记录
void delete_finance_record();// 删除财务记录
void modify_finance_record();// 修改财务记录
void query_finance();// 查询财务记录
void finance_statistics();// 统计财务数据
// 验证函数原型
int validate_finance_date(const char* date);
int validate_amount(double amount);
int validate_finance_type(FinanceType type);
#endif
#ifndef Common_H
#define Common_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>
#include <ctype.h>
#include "product.h"
#include "member.h"
#include "inventory.h"
#include "buyer.h"
#include "sales.h"
#include "finance.h"
#include "user.h"
#endif
#include "user.h"
// 添加新用户(返回新用户指针)
User* add_user(const char* username, const char* password, UserRole role) {
// 检查用户名是否已存在
User* current = user_list;
while (current != NULL) {
if (strcmp(current->username, username) == 0) {
printf("错误:用户名 '%s' 已存在!\n", username);
return NULL;
}
current = current->next;
}
// 创建新用户节点
User* new_user = (User*)malloc(sizeof(User));
if (!new_user) {
perror("内存分配失败");
exit(EXIT_FAILURE);
}
// 自动生成用户ID(找最大值+1)
static int last_id = 1000;
new_user->user_id = ++last_id;
// 设置基础信息
strncpy(new_user->username, username, sizeof(new_user->username)-1);
strncpy(new_user->password, password, sizeof(new_user->password)-1);
new_user->role = role;
new_user->next = NULL;
// 设置默认权限(根据角色)
memset(&new_user->perm, 0, sizeof(Permissions));
switch(role) {
case ROLE_ADMIN:
new_user->perm = (Permissions){1,1,1,1,1,1}; // 所有权限
break;
case ROLE_OPERATOR:
new_user->perm = (Permissions){0,1,1,1,1,0}; // 业务操作权限
break;
case ROLE_FINANCE:
new_user->perm = (Permissions){0,0,0,0,0,1}; // 仅财务权限
break;
}
// 插入链表头部
if (user_list == NULL) {
user_list = new_user;
} else {
new_user->next = user_list;
user_list = new_user;
}
printf("用户 %s 添加成功!ID:%d\n", username, new_user->user_id);
return new_user;
}
// 删除用户(按用户ID)
int delete_user(int user_id) {
User *current = user_list, *prev = NULL;
while (current != NULL) {
if (current->user_id == user_id) {
if (prev == NULL) { // 删除头节点
user_list = current->next;
} else {
prev->next = current->next;
}
free(current);
printf("用户 ID %d 已删除\n", user_id);
return 1;
}
prev = current;
current = current->next;
}
printf("未找到用户 ID %d\n", user_id);
return 0;
}
// 修改用户权限(按用户ID)
void modify_permissions(int user_id, Permissions new_perm) {
User* user = find_user_by_id(user_id);
if (user) {
if (user->role == ROLE_ADMIN) {
printf("警告:管理员权限不可修改!\n");
return;
}
user->perm = new_perm;
printf("用户 %d 权限已更新\n", user_id);
} else {
printf("用户 ID %d 不存在\n", user_id);
}
}
// 查询用户(按用户ID)
User* find_user_by_id(int user_id) {
User* current = user_list;
while (current != NULL) {
if (current->user_id == user_id) {
return current;
}
current = current->next;
}
return NULL;
}
// 显示所有用户信息
void display_all_users() {
printf("\n%-8s %-20s %-12s %s\n",
"用户ID", "用户名", "角色", "权限");
printf("-------------------------------------------------\n");
User* current = user_list;
while (current != NULL) {
// 角色名称转换
const char* role_str = "";
switch(current->role) {
case ROLE_ADMIN: role_str = "管理员"; break;
case ROLE_OPERATOR: role_str = "操作员"; break;
case ROLE_FINANCE: role_str = "财务"; break;
}
// 权限详情转换
char perm_buf[100];
snprintf(perm_buf, sizeof(perm_buf),
"用户:%d 产品:%d 社员:%d 库存:%d 销售:%d 财务:%d",
current->perm.user_manage,
current->perm.product_manage,
current->perm.member_manage,
current->perm.inventory_manage,
current->perm.sales_manage,
current->perm.finance_manage);
printf("%-8d %-20s %-12s %s\n",
current->user_id,
current->username,
role_str,
perm_buf);
current = current->next;
}
printf("-------------------------------------------------\n");
}
#include "buyer.h"
void print_buyer(Buyer* buyer);
//打印函数
//添加买家
void add_buyer(){
Buyer* new_buyer = (Buyer*)malloc(sizeof(Buyer));
static int last_id = 1000;
new_buyer->buyer_id = ++last_id;
printf("输入买家名称: ");
fgets(new_buyer->name, 50, stdin);
new_buyer->name[strcspn(new_buyer->name, "\n")] = '\0';
printf("选择类型(0-个人/1-企业): ");
int type;
scanf("%d", &type);
getchar();
new_buyer->buyer_type = (BuyerType)type;
printf("输入联系方式: ");
fgets(new_buyer->contact, 30, stdin);
new_buyer->contact[strcspn(new_buyer->contact, "\n")] = '\0';
printf("输入收货地址: ");
fgets(new_buyer->address, 100, stdin);
new_buyer->address[strcspn(new_buyer->address, "\n")] = '\0';
new_buyer->next = buyer_head;
buyer_head = new_buyer;
printf("买家%d添加成功!\n", new_buyer->buyer_id);
}
//删除买家
void delete_buyer(int target_id) {
Buyer *current = buyer_head, *prev = NULL;
while (current) {
if (current->buyer_id == target_id) {
if (prev) prev->next = current->next;
else buyer_head = current->next;
free(current);
printf("买家%d已删除!\n", target_id);
return;
}
prev = current;
current = current->next;
}
printf("未找到买家%d!\n", target_id);
}
//修改买家信息
void modify_buyer(int target_id) {
Buyer* current = buyer_head;
while (current) {
if (current->buyer_id == target_id) {
printf("修改名称(当前值: %s): ", current->name);
char input[50];
fgets(input, 50, stdin);
if (strlen(input) > 1) {
input[strcspn(input, "\n")] = '\0';
strcpy(current->name, input);
}
printf("修改类型(当前值: %d): ", current->buyer_type);
int type;
scanf("%d", &type);
getchar();
current->buyer_type = (BuyerType)type;
printf("修改联系方式(当前值: %s): ", current->contact);
fgets(current->contact, 30, stdin);
current->contact[strcspn(current->contact, "\n")] = '\0';
printf("买家%d修改完成!\n", target_id);
return;
}
current = current->next;
}
printf("未找到买家%d!\n", target_id);
}
//查询买家信息
void query_buyers() {
int choice;
printf("查询方式:\n1.按ID\n2.按名称\n3.按类型\n4.按地址关键字\n选择: ");
scanf("%d", &choice);
getchar();
int count = 0;
Buyer* current = buyer_head;
switch (choice) {
case 1: {
int target_id;
printf("输入买家ID: ");
scanf("%d", &target_id);
while (current) {
if (current->buyer_id == target_id) {
printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name);
count++;
break;
}
current = current->next;
}
break;
}
case 2: {
char keyword[50];
printf("输入名称关键字: ");
fgets(keyword, 50, stdin);
keyword[strcspn(keyword, "\n")] = '\0';
while (current) {
if (strstr(current->name, keyword)) {
printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name);
count++;
}
current = current->next;
}
break;
}
case 3: {
int type;
printf("选择类型(0-个人/1-企业): ");
scanf("%d", &type);
while (current) {
if (current->buyer_type == type) {
printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name);
count++;
}
current = current->next;
}
break;
}
case 4: {
char keyword[100];
printf("输入地址关键字: ");
fgets(keyword, 100, stdin);
keyword[strcspn(keyword, "\n")] = '\0';
while (current) {
if (strstr(current->address, keyword)) {
printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name);
count++;
}
current = current->next;
}
break;
}
default:
printf("无效选择!\n");
return;
}
printf("共找到%d条记录\n", count);
}
// 统计买家信息
void buyer_statistics() {
int individual_count = 0, enterprise_count = 0;
Buyer* current = buyer_head;
while (current) {
if (current->buyer_type == INDIVIDUAL) {
individual_count++;
} else {
enterprise_count++;
}
current = current->next;
}
printf("\n=== 买家统计 ===\n");
printf("个人买家数量: %d\n", individual_count);
printf("企业买家数量: %d\n", enterprise_count);
printf("总买家数量: %d\n", individual_count + enterprise_count);
}
// 辅助打印函数
void print_buyer(Buyer* buyer) {
printf("[ID:%d] 名称:%s\n 类型:%s\n 联系方式:%s\n 地址:%s\n",
buyer->buyer_id,
buyer->name,
buyer->buyer_type == INDIVIDUAL ? "个人" : "企业",
buyer->contact,
buyer->address);
}
#include "finance.h"
// 生成唯一财务记录ID
int generate_finance_id() {
static int counter = 5000;
return counter++;
}
void print_finance_record(FinancialRecord* record);// 辅助打印函数
// 添加财务记录
void add_finance_record() {
FinancialRecord* new_record = (FinancialRecord*)malloc(sizeof(FinancialRecord));
new_record->record_id = generate_finance_id();
printf("财务类型 (0-收入 1-支出): ");
scanf("%d", (int*)&new_record->type);
printf("金额: ");
scanf("%lf", &new_record->amount);
printf("日期(YYYY-MM-DD): ");
scanf("%19s", new_record->record_date);
if (new_record->type == FINANCE_INCOME) {
printf("关联销售订单ID: ");
scanf("%d", &new_record->related_order);
} else {
printf("关联库存记录ID: ");
scanf("%d", &new_record->related_stock);
}
new_record->next = finance_head;
finance_head = new_record;
printf("财务记录%d添加成功!\n", new_record->record_id);
}
//删除财务记录
void delete_finance_record(int record_id) {
FinancialRecord *current = finance_head, *prev = NULL;
while (current) {
if (current->record_id == record_id) {
if (prev) prev->next = current->next;
else finance_head = current->next;
free(current);
printf("记录%d已删除!\n", record_id);
return;
}
prev = current;
current = current->next;
}
printf("未找到记录%d!\n", record_id);
}
// 修改财务记录
void modify_finance_record(int record_id) {
FinancialRecord* current = finance_head;
while (current) {
if (current->record_id == record_id) {
// 修改类型
printf("当前类型: %d 输入新类型 (0-收入 1-支出): ", current->type);
int new_type;
scanf("%d", &new_type);
if (new_type >= FINANCE_INCOME && new_type <= FINANCE_EXPENSE) {
current->type = new_type;
}
// 修改金额
printf("当前金额: %.2f 输入新金额: ", current->amount);
double new_amount;
scanf("%lf", &new_amount);
current->amount = new_amount;
printf("记录%d修改完成!\n", record_id);
return;
}
current = current->next;
}
printf("未找到记录%d!\n", record_id);
}
// 查询财务记录
void query_finance() {
int choice;
printf("查询方式:\n1.按记录号\n2.按类型\n3.按日期范围\n4.按金额范围\n选择: ");
scanf("%d", &choice);
int count = 0;
FinancialRecord* current = finance_head;
switch (choice) {
case 1: {
int target_id;
printf("输入记录号: ");
scanf("%d", &target_id);
while (current) {
if (current->record_id == target_id) {
print_finance_record(current);
count++;
break;
}
current = current->next;
}
break;
}
case 2: {
int type;
printf("类型 (0-收入 1-支出): ");
scanf("%d", &type);
while (current) {
if (current->type == type) {
print_finance_record(current);
count++;
}
current = current->next;
}
break;
}
case 3: {
char start_date[20], end_date[20];
printf("起始日期(YYYY-MM-DD): ");
scanf("%19s", start_date);
printf("结束日期(YYYY-MM-DD): ");
scanf("%19s", end_date);
while (current) {
if (strcmp(current->record_date, start_date) >= 0 &&
strcmp(current->record_date, end_date) <= 0) {
print_finance_record(current);
count++;
}
current = current->next;
}
break;
}
case 4: {
double min, max;
printf("最小金额: ");
scanf("%lf", &min);
printf("最大金额: ");
scanf("%lf", &max);
while (current) {
if (current->amount >= min && current->amount <= max) {
print_finance_record(current);
count++;
}
current = current->next;
}
break;
}
default:
printf("无效选择!\n");
return;
}
printf("共找到%d条财务记录\n", count);
}
// 统计财务数据
void finance_statistics() {
double total_income = 0, total_expense = 0;
FinancialRecord* current = finance_head;
while (current) {
if (current->type == FINANCE_INCOME) {
total_income += current->amount;
} else {
total_expense += current->amount;
}
current = current->next;
}
printf("\n=== 财务统计 ===\n");
printf("总收入: %.2f\n", total_income);
printf("总支出: %.2f\n", total_expense);
printf("净利润: %.2f\n", total_income + total_expense);
}
// 辅助打印函数
void print_finance_record(FinancialRecord* record) {
printf("[记录%d] 类型:%s 金额:%.2f\n 日期:%s 关联ID:%d\n",
record->record_id,
record->type == FINANCE_INCOME ? "收入" : "支出",
record->amount,
record->record_date,
record->type == FINANCE_INCOME ? record->related_order : record->related_stock);
}
#include "inventory.h"
// 库存记录链表头指针
InventoryRecord* inventory_head = NULL;
// 添加库存记录
void add_inventory_record() {
InventoryRecord* new_record = (InventoryRecord*)malloc(sizeof(InventoryRecord));
if (!new_record) {
printf("内存分配失败!\n");
return;
}
// 自动生成记录ID
static int last_id = 0;
new_record->record_id = ++last_id;
// 输入基本信息
printf("输入农产品编号: ");
scanf("%d", &new_record->product_id);
getchar();
printf("选择操作类型(0-入库 1-出库 2-损耗): ");
int type;
scanf("%d", &type);
new_record->op_type = (OperationType)type;
getchar();
printf("输入变动数量: ");
scanf("%d", &new_record->quantity);
getchar();
printf("输入操作日期(YYYY-MM-DD): ");
fgets(new_record->date, sizeof(new_record->date), stdin);
new_record->date[strcspn(new_record->date, "\n")] = '\0';
printf("输入操作员姓名: ");
fgets(new_record->operator, sizeof(new_record->operator), stdin);
new_record->operator[strcspn(new_record->operator, "\n")] = '\0';
// 插入链表头部
new_record->next = inventory_head;
inventory_head = new_record;
printf("记录添加成功!\n");
}
// 删除库存记录
void delete_inventory_record(int target_id) {
InventoryRecord *current = inventory_head, *prev = NULL;
while (current) {
if (current->record_id == target_id) {
if (prev) {
prev->next = current->next;
} else {
inventory_head = current->next;
}
free(current);
printf("记录%d已删除!\n", target_id);
return;
}
prev = current;
current = current->next;
}
printf("未找到记录%d!\n", target_id);
}
// 修改库存记录
void modify_inventory_record(int target_id) {
InventoryRecord* current = inventory_head;
while (current) {
if (current->record_id == target_id) {
printf("修改数量(当前值%d,直接回车跳过): ", current->quantity);
char input[20];
fgets(input, sizeof(input), stdin);
if (strlen(input) > 1) {
current->quantity = atoi(input);
}
printf("修改日期(当前值%s): ", current->date);
fgets(input, sizeof(input), stdin);
if (strlen(input) > 1) {
strncpy(current->date, input, 10);
current->date[10] = '\0';
}
printf("记录%d修改完成!\n", target_id);
return;
}
current = current->next;
}
printf("未找到记录%d!\n", target_id);
}
// 查询库存记录
void query_inventory_records() {
int choice;
printf("查询方式:\n1.按记录ID\n2.按农产品ID\n3.按日期范围\n4.按操作类型\n选择: ");
scanf("%d", &choice);
getchar();
InventoryRecord* current = inventory_head;
int count = 0;
switch (choice) {
case 1: {
int target_id;
printf("输入记录ID: ");
scanf("%d", &target_id);
while (current) {
if (current->record_id == target_id) {
printf("[ID:%d] 产品:%d 类型:%d 数量:%d 日期:%s 操作员:%s\n",
current->record_id, current->product_id, current->op_type,
current->quantity, current->date, current->operator);
count++;
break;
}
current = current->next;
}
break;
}
case 2: {
int product_id;
printf("输入农产品ID: ");
scanf("%d", &product_id);
while (current) {
if (current->product_id == product_id) {
printf("[ID:%d] 类型:%d 数量:%d 日期:%s\n",
current->record_id, current->op_type,
current->quantity, current->date);
count++;
}
current = current->next;
}
break;
}
case 3: {
char start[11], end[11];
printf("输入开始日期(YYYY-MM-DD): ");
fgets(start, sizeof(start), stdin);
start[strcspn(start, "\n")] = '\0';
printf("输入结束日期(YYYY-MM-DD): ");
fgets(end, sizeof(end), stdin);
end[strcspn(end, "\n")] = '\0';
while (current) {
if (strcmp(current->date, start) >= 0 &&
strcmp(current->date, end) <= 0) {
printf("[ID:%d] 产品:%d 类型:%d 数量:%d 日期:%s\n",
current->record_id, current->product_id, current->op_type,
current->quantity, current->date);
count++;
}
current = current->next;
}
break;
}
case 4: {
int type;
printf("输入操作类型(0-入库 1-出库 2-损耗): ");
scanf("%d", &type);
while (current) {
if (current->op_type == type) {
printf("[ID:%d] 产品:%d 数量:%d 日期:%s\n",
current->record_id, current->product_id,
current->quantity, current->date);
count++;
}
current = current->next;
}
break;
}
default:
printf("无效选择!\n");
return;
}
printf("共找到%d条记录\n", count);
}
// 统计汇总
void inventory_summary() {
int product_id;
printf("输入要统计的农产品ID: ");
scanf("%d", &product_id);
int total_in = 0, total_out = 0, total_loss = 0;
InventoryRecord* current = inventory_head;
while (current) {
if (current->product_id == product_id) {
switch (current->op_type) {
case INBOUND: total_in += current->quantity; break;
case OUTBOUND: total_out += abs(current->quantity); break;
case LOSS: total_loss += abs(current->quantity); break;
}
}
current = current->next;
}
printf("\n=== 产品%d库存汇总 ===\n", product_id);
printf("总入库量: %d\n", total_in);
printf("总出库量: %d\n", total_out);
printf("总损耗量: %d\n", total_loss);
printf("当前库存: %d\n", total_in - total_out - total_loss);
}
#include "member.h"
Member* add_member(Member* head) {
Member* new_mem = (Member*)malloc(sizeof(Member));
if (!new_mem) {
printf("内存分配失败!\n");
return head;
}
// 输入编号
printf("请输入社员编号: ");
scanf("%d", &new_mem->id);
getchar(); // 清除输入缓冲区
// 输入姓名
printf("请输入姓名: ");
fgets(new_mem->name, sizeof(new_mem->name), stdin);
new_mem->name[strcspn(new_mem->name, "\n")] = '\0';
// 输入身份证号
printf("请输入身份证号: ");
fgets(new_mem->id_card, sizeof(new_mem->id_card), stdin);
new_mem->id_card[strcspn(new_mem->id_card, "\n")] = '\0';
// 输入手机号
printf("请输入手机号: ");
fgets(new_mem->phone, sizeof(new_mem->phone), stdin);
new_mem->phone[strcspn(new_mem->phone, "\n")] = '\0';
// 输入加入日期
printf("请输入加入日期: ");
fgets(new_mem->join_date, sizeof(new_mem->join_date), stdin);
new_mem->join_date[strcspn(new_mem->join_date, "\n")] = '\0';
// 插入链表头部
new_mem->next = head;
return new_mem;
}//增加社员
Member* delete_member(Member* head, int target_id) {
if (!head) {
printf("当前没有社员记录\n");
return NULL;
}
Member *curr = head, *prev = NULL;
while (curr) {
if (curr->id == target_id) {
if (prev) {
prev->next = curr->next;
} else {
head = curr->next;
}
free(curr);
printf("成功删除社员%d\n", target_id);
return head;
}
prev = curr;
curr = curr->next;
}
printf("未找到社员%d\n", target_id);
return head;
}//删除社员
void modify_member(Member* head, int target_id) {
Member* curr = head;
while (curr) {
if (curr->id == target_id) {
printf("\n=== 修改社员 %d ===\n", target_id);
printf("1. 修改姓名\n2. 修改手机号\n3. 修改入股金额\n4. 修改作物信息\n请选择: ");
int choice;
scanf("%d", &choice);
getchar();
switch(choice) {
case 1:
printf("新姓名: ");
fgets(curr->name, 30, stdin);
curr->name[strcspn(curr->name, "\n")] = '\0';
break;
case 2:
printf("新手机号: ");
fgets(curr->phone, 12, stdin);
curr->phone[strcspn(curr->phone, "\n")] = '\0';
break;
case 3:
printf("新入股金额: ");
scanf("%f", &curr->investment);
getchar();
break;
case 4:
printf("新作物信息: ");
fgets(curr->crops, 50, stdin);
curr->crops[strcspn(curr->crops, "\n")] = '\0';
break;
default:
printf("无效选择\n");
}
return;
}
curr = curr->next;
}
printf("未找到社员%d\n", target_id);
}//修改社员信息
void print_member_details(Member* m);
void search_member(Member* head, int mode) {
if (!head) {
printf("当前没有社员记录\n");
return;
}
printf("\n=== 查询方式 ===\n");
printf("1.按编号查询\n2.按姓名查询\n请选择: ");
scanf("%d", &mode);
getchar();
char search_key[30];
int found = 0;
if (mode == 1) {
printf("请输入社员编号: ");
int target_id;
scanf("%d", &target_id);
getchar();
Member* curr = head;
while (curr) {
if (curr->id == target_id) {
print_member_details(curr);
found = 1;
break;
}
curr = curr->next;
}
} else if (mode == 2) {
printf("请输入社员姓名: ");
fgets(search_key, 30, stdin);
search_key[strcspn(search_key, "\n")] = '\0';
Member* curr = head;
while (curr) {
if (strcmp(curr->name, search_key) == 0) {
print_member_details(curr);
found = 1;
}
curr = curr->next;
}
}
if (!found) printf("未找到匹配记录\n");
}
// 辅助打印函数
void print_member_details(Member* m) {
printf("\n=== 社员详情 ===\n");
printf("编号: %d\n", m->id);
printf("姓名: %s\n", m->name);
printf("身份证: %s\n", m->id_card);
printf("手机号: %s\n", m->phone);
printf("入股金额: %.2f\n", m->investment);
printf("种植作物: %s\n", m->crops);
printf("加入日期: %s\n", m->join_date);
}//查询社员
void statistics_member(Member* head) {
if (!head) {
printf("当前没有社员记录\n");
return;
}
int total = 0;
float total_invest = 0;
Member* curr = head;
while (curr) {
total++;
total_invest += curr->investment;
curr = curr->next;
}
printf("\n=== 统计结果 ===\n");
printf("总社员数: %d\n", total);
printf("总入股金额: %.2f\n", total_invest);
printf("平均入股金额: %.2f\n", total_invest/total);
}//统计社员信息
void summary_member(Member* head) {
if (!head) {
printf("当前没有社员记录\n");
return;
}
printf("\n=== 社员汇总 ===\n");
printf("%-6s%-15s%-12s%-20s\n", "ID", "姓名", "手机号", "入股金额");
Member* curr = head;
while (curr) {
printf("%-6d%-15s%-12s%-20.2f\n",
curr->id,
curr->name,
curr->phone,
curr->investment);
curr = curr->next;
}
}//汇总社员信息
#include "menu.h"
// 管理员主菜单
void admin_main_menu() {
int choice;
do {
printf("\n==== 管理员主菜单 ====\n");
printf("1. 用户管理\n");
printf("2. 退出登录\n");
printf("请选择操作: ");
scanf("%d", &choice);
getchar(); // 清除输入缓冲区
switch(choice) {
case 1:
user_management_menu();
break;
case 2:
printf("已退出登录\n");
return;
default:
printf("无效选择,请重新输入!\n");
}
} while (1);
}
// 用户管理子菜单
void user_management_menu() {
int sub_choice;
do {
printf("\n--- 用户管理 ---\n");
printf("1. 添加用户\n");
printf("2. 删除用户\n");
printf("3. 修改权限\n");
printf("4. 查询用户\n");
printf("5. 显示所有用户\n");
printf("6. 返回上级\n");
printf("请选择操作: ");
scanf("%d", &sub_choice);
getchar();
switch(sub_choice) {
case 1: add_user(); break;
case 2: delete_user(); break;
case 3: modify_permissions(); break;
case 4: find_user_by_id(); break;
case 5: display_all_users(); break;
case 6: return;
default: printf("无效选择!\n");
}
} while (1);
}
// 显示主菜单
void operator_main_menu (){
int system_running = 1;
while (system_running) {
clear_screen();
printf("\n=== 农产品合作社管理系统 ===\n");
printf("1. 农产品管理\n");
printf("2. 社员管理\n");
printf("3. 库存管理\n");
printf("4. 销售管理\n");
printf("5. 买家管理\n");
printf("0. 退出系统\n");
printf("请选择操作:");
int choice;
scanf("%d", &choice);
getchar(); // 清除输入缓冲区
switch (choice) {
case 1: product_management_menu(); break;
case 2: member_management_menu(); break;
case 3: inventory_management_menu(); break;
case 4: sales_management_menu(); break;
case 5: buyer_management_menu(); break;
case 0: system_running = 0; break;
default:
printf("无效选择,请重新输入!\n");
getchar(); // 等待用户确认
}
}
}
void product_management_menu() {
int sub_running = 1;
while (sub_running) {
clear_screen();
printf("\n=== 农产品管理 ===\n");
printf("1. 添加农产品\n");
printf("2. 删除农产品\n");
printf("3. 修改农产品\n");
printf("4. 查询农产品\n");
printf("5. 统计汇总\n");
printf("6. 显示所有产品\n");
printf("0. 返回主菜单\n");
printf("请选择操作:");
int choice, target_id;
scanf("%d", &choice);
getchar();
switch (choice) {
case 1:
product_head = add_product(product_head);
break;
case 2:
printf("输入要删除的产品ID: ");
scanf("%d", &target_id);
product_head = delete_product(product_head, target_id);
break;
case 3:
printf("输入要修改的产品ID: ");
scanf("%d", &target_id);
modify_product(product_head, target_id);
break;
case 4:
printf("输入要查询的产品ID: ");
scanf("%d", &target_id);
search_product(product_head, target_id);
break;
case 5:
statistics(product_head);
break;
case 6:
summary(product_head);
break;
case 0:
sub_running = 0;
break;
default:
printf("无效选择!\n");
}
printf("\n按任意键继续...");
getchar();
}
}
void member_management_menu(){
int choice;
int running = 1;
while (running) {
printf("\n=== 社员管理系统 ===\n");
printf("1. 添加社员\n");
printf("2. 删除社员\n");
printf("3. 修改社员\n");
printf("4. 查询社员\n");
printf("5. 统计信息\n");
printf("6. 汇总显示\n");
printf("0. 返回主菜单\n");
printf("请选择操作:");
int target_id;
switch (choice) {
case 1:
member_head = add_member(member_head);
break;
case 2:
if (member_head) {
target_id = safe_input_int("请输入要删除的社员编号: ");
member_head = delete_member(member_head, target_id);
} else {
printf("当前没有社员记录!\n");
}
break;
case 3:
if (member_head) {
target_id = safe_input_int("请输入要修改的社员编号: ");
modify_member(member_head, target_id);
} else {
printf("当前没有社员记录!\n");
}
break;
case 4:
if (member_head) {
int mode = safe_input_int("请选择查询方式(1-编号 2-姓名): ");
search_member(member_head, mode);
} else {
printf("当前没有社员记录!\n");
}
break;
case 5:
statistics_member(member_head);
break;
case 6:
summary_member(member_head);
break;
case 0:
running = 0;
break;
default:
printf("无效选择,请重新输入!\n");
}
if (choice != 0) {
printf("\n按任意键继续...");
getchar(); // 等待用户确认
}
}
}
void inventory_management_menu() {
int sub_running = 1;
while (sub_running) {
clear_screen();
printf("\n=== 库存管理 ===\n");
printf("1. 添加库存记录\n");
printf("2. 删除库存记录\n");
printf("3. 修改库存记录\n");
printf("4. 查询库存记录\n");
printf("5. 库存统计\n");
printf("0. 返回主菜单\n");
printf("请选择操作:");
int choice, target_id;
scanf("%d", &choice);
getchar();
switch (choice) {
case 1: add_inventory_record(); break;
case 2:
printf("输入要删除的记录ID: ");
scanf("%d", &target_id);
delete_inventory_record(target_id);
break;
case 3:
printf("输入要修改的记录ID: ");
scanf("%d", &target_id);
modify_inventory_record(target_id);
break;
case 4: query_inventory_records(); break;
case 5: inventory_summary(); break;
case 0: sub_running = 0; break;
default: printf("无效选择!\n");
}
printf("\n按任意键继续...");
getchar();
}
}
// 买家管理主菜单
void buyer_management_menu() {
int choice;
int sub_running = 1;
while (sub_running) {
system("clear || cls"); // 清屏命令
printf("\n=== 买家管理系统 ===\n");
printf("1. 添加买家\n");
printf("2. 删除买家\n");
printf("3. 修改买家信息\n");
printf("4. 查询买家\n");
printf("5. 买家统计\n");
printf("6. 显示所有买家\n");
printf("0. 返回主菜单\n");
printf("请选择操作: ");
choice = safe_input_int("");
int target_id;
switch (choice) {
case 1:
add_buyer(buyer_head);
break;
case 2:
if (buyer_head) {
target_id = safe_input_int("请输入要删除的买家ID: ");
delete_buyer(buyer_head, target_id);
} else {
printf("当前没有买家记录!\n");
}
break;
case 3:
if (buyer_head) {
target_id = safe_input_int("请输入要修改的买家ID: ");
modify_buyer(buyer_head, target_id);
} else {
printf("当前没有买家记录!\n");
}
break;
case 4:
query_buyers(buyer_head);
break;
case 5:
buyer_statistics(buyer_head);
break;
case 6:
print_all_buyers(buyer_head);
break;
case 0:
sub_running = 0;
break;
default:
printf("无效选择,请重新输入!\n");
}
if (choice != 0) {
printf("\n操作完成,按回车键继续...");
getchar(); // 等待用户确认
}
}
}
void sales_management_menu(SalesRecord** head) {
int choice;
int sub_running = 1;
while (sub_running) {
system("clear || cls");
printf("\n=== 销售记录管理系统 ===\n");
printf("1. 添加销售记录\n");
printf("2. 删除销售记录\n");
printf("3. 修改销售记录\n");
printf("4. 查询销售记录\n");
printf("5. 销售统计\n");
printf("6. 显示所有记录\n");
printf("0. 返回主菜单\n");
printf("请选择操作: ");
int target_id;
switch (choice) {
case 1:
add_sales_record(sales_head);
break;
case 2:
if (sales_head) {
target_id = safe_input_int("请输入要删除的订单号: ");
delete_sales_record(sales_head, target_id);
} else {
printf("当前没有销售记录!\n");
}
break;
case 3:
if (sales_head) {
target_id = safe_input_int("请输入要修改的订单号: ");
modify_sales_record(sales_head, target_id);
} else {
printf("当前没有销售记录!\n");
}
break;
case 4:
query_sales(sales_head);
break;
case 5:
sales_statistics(sales_head);
break;
case 6:
print_all_sales(sales_head);
break;
case 0:
sub_running = 0;
break;
default:
printf("无效选择,请重新输入!\n");
}
if (choice != 0) {
printf("\n操作完成,按回车键继续...");
while (getchar() != '\n'); // 清空输入缓冲区
getchar();
}
}
}
int safe_input_int(const char* prompt) {
char buffer[128];
int value;
while (1) {
printf("%s", prompt);
if (fgets(buffer, sizeof(buffer), stdin)) {
if (sscanf(buffer, "%d", &value) == 1) {
return value;
}
}
printf("无效输入,请重新输入整数!\n");
}
}
void finance_management_menu() {
int choice;
do {
system("clear || cls");
printf("\n=== 财务管理系统 ===\n");
printf("1. 添加财务记录\n");
printf("2. 删除财务记录\n");
printf("3. 修改财务记录\n");
printf("4. 查询财务记录\n");
printf("5. 财务统计\n");
printf("6. 显示所有记录\n");
printf("0. 返回主菜单\n");
printf("请选择操作: ");
int target_id;
switch (choice) {
case 1:
add_finance_record(finance_head);
break;
case 2:
if (finance_head) {
target_id = safe_input_int("请输入要删除的记录号: ");
delete_finance_record(finance_head, target_id);
} else {
printf("当前没有财务记录!\n");
}
break;
case 3:
if (finance_head) {
target_id = safe_input_int("请输入要修改的记录号: ");
modify_finance_record(finance_head, target_id);
} else {
printf("当前没有财务记录!\n");
}
break;
case 4:
personnel_query_finance(finance_head);
break;
case 5:
personnel_finance_statistics(finance_head);
break;
case 6:
print_all_finance(finance_head);
break;
case 0:
break;
default:
printf("无效选择,请重新输入!\n");
}
if (choice != 0) {
printf("\n按回车键继续...");
while (getchar() != '\n'); // 清空输入缓冲区
getchar();
}
} while (choice != 0);
}
// 获取角色名称的辅助函数
const char* get_role_name(UserRole role) {
static const char* names[] = {
"管理员", "操作员", "财务人员"
};
return names[role];
}
#include "product.h"
Product* add_product(Product* head) {
Product* new_node = (Product*)malloc(sizeof(Product));
if (!new_node) {
printf("内存分配失败!\n");
return head;
}
printf("请输入产品ID: ");
scanf("%d", &new_node->id);
getchar(); // 清空输入缓冲区
printf("请输入产品名称: ");
fgets(new_node->name, 30, stdin);
new_node->name[strcspn(new_node->name, "\n")] = '\0'; // 去除换行符
printf("请输入产品类型: ");
fgets(new_node->type, 20, stdin);
new_node->type[strcspn(new_node->type, "\n")] = '\0';
printf("请输入价格: ");
scanf("%f", &new_node->price);
printf("请输入库存数量: ");
scanf("%d", &new_node->stock_quantity);
getchar();
printf("请输入产品描述: ");
fgets(new_node->description, 100, stdin);
new_node->description[strcspn(new_node->description, "\n")] = '\0';
new_node->next = head;
return new_node;
}//添加农产品
Product* delete_product(Product* head, int target_id) {
Product *current = head, *prev = NULL;
while (current) {
if (current->id == target_id) {
if (prev) {
prev->next = current->next;
} else {
head = current->next;
}
free(current);
printf("成功删除ID为%d的产品\n", target_id);
return head;
}
prev = current;
current = current->next;
}
printf("未找到ID为%d的产品\n", target_id);
return head;
}//删除农产品
void search_product(Product* head, int target_id) {
Product* current = head;
while (current) {
if (current->id == target_id) {
printf("\n=== 产品详情 ===\n");
printf("ID: %d\n", current->id);
printf("名称: %s\n", current->name);
printf("类型: %s\n", current->type);
printf("价格: %.2f\n", current->price);
printf("库存: %d\n", current->stock_quantity);
printf("描述: %s\n", current->description);
return;
}
current = current->next;
}
printf("未找到ID为%d的产品\n", target_id);
}//查询农产品
void modify_product(Product* head, int target_id) {
Product* current = head;
while (current) {
if (current->id == target_id) {
printf("请输入新的产品名称: ");
fgets(current->name, 30, stdin);
current->name[strcspn(current->name, "\n")] = '\0';
printf("请输入新的产品类型: ");
fgets(current->type, 20, stdin);
current->type[strcspn(current->type, "\n")] = '\0';
printf("请输入新的价格: ");
scanf("%f", ¤t->price);
printf("请输入新的库存数量: ");
scanf("%d", ¤t->stock_quantity);
getchar();
printf("请输入新的产品描述: ");
fgets(current->description, 100, stdin);
current->description[strcspn(current->description, "\n")] = '\0';
printf("产品信息更新成功!\n");
return;
}
current = current->next;
}
printf("未找到ID为%d的产品\n", target_id);
}//修改农产品
void statistics(Product* head) {
float total_value = 0;
int total_quantity = 0;
Product* current = head;
while (current) {
total_quantity += current->stock_quantity;
total_value += current->stock_quantity * current->price;
current = current->next;
}
printf("\n=== 统计结果 ===\n");
printf("总库存数量: %d\n", total_quantity);
printf("总库存价值: %.2f\n", total_value);
}//统计农产品
void summary(Product* head) {
printf("\n=== 产品汇总 ===\n");
Product* current = head;
int count = 1;
while (current) {
printf("%d. [ID:%d] %s (%s) 库存:%d\n",
count++,
current->id,
current->name,
current->type,
current->stock_quantity);
current = current->next;
}
if (count == 1) {
printf("当前没有产品记录\n");
}
}//汇总农产品
#include "sales.h"
// 生成唯一订单ID
int generate_order_id() {
static int counter = 1000;
return counter++;
}
int date_compare(const char* date1, const char* date2);// 日期比较函数
const char* get_status_name(OrderStatus status);// 辅助函数:获取状态名称
void print_sales_record(SalesRecord* record);// 辅助函数:获取状态名称
// 添加销售记录
void add_sales_record() {
SalesRecord* new_record = (SalesRecord*)malloc(sizeof(SalesRecord));
new_record->order_id = generate_order_id();
printf("输入农产品编号: ");
scanf("%d", &new_record->product_id);
printf("输入买家编号: ");
scanf("%d", &new_record->buyer_id);
printf("输入销售数量: ");
scanf("%f", &new_record->quantity);
printf("输入销售单价: ");
scanf("%f", &new_record->unit_price);
new_record->total_amount = new_record->quantity * new_record->unit_price;
printf("输入销售日期(YYYY-MM-DD): ");
scanf("%19s", new_record->sale_date);
new_record->status = ORDER_PENDING;
new_record->next = sales_head;
sales_head = new_record;
printf("订单%d添加成功!\n", new_record->order_id);
}
//删除销售记录
void delete_sales_record(int order_id) {
SalesRecord *current = sales_head, *prev = NULL;
while (current) {
if (current->order_id == order_id) {
if (prev) prev->next = current->next;
else sales_head = current->next;
free(current);
printf("订单%d已删除!\n", order_id);
return;
}
prev = current;
current = current->next;
}
printf("未找到订单%d!\n", order_id);
}
//修改销售记录
void modify_sales_record(int order_id) {
SalesRecord* current = sales_head;
while (current) {
if (current->order_id == order_id) {
printf("输入新数量: ");
scanf("%f", ¤t->quantity);
current->total_amount = current->quantity * current->unit_price;
printf("输入新状态(0-3): ");
scanf("%d", (int*)¤t->status);
printf("订单%d修改完成!\n", order_id);
return;
}
current = current->next;
}
printf("未找到订单%d!\n", order_id);
}
// 查询销售记录
void query_sales() {
int choice;
printf("查询方式:\n1.按订单号\n2.按产品\n3.按买家\n4.按日期范围\n5.按状态\n选择: ");
scanf("%d", &choice);
int count = 0;
SalesRecord* current = sales_head;
time_t start_t = 0, end_t = 0;
switch (choice) {
case 1: {
int target_id;
printf("输入订单号: ");
scanf("%d", &target_id);
while (current) {
if (current->order_id == target_id) {
print_sales_record(current);
count++;
break;
}
current = current->next;
}
break;
}
case 2: {
int product_id;
printf("输入农产品编号: ");
scanf("%d", &product_id);
while (current) {
if (current->product_id == product_id) {
print_sales_record(current);
count++;
}
current = current->next;
}
break;
}
case 3: {
int buyer_id;
printf("输入买家编号: ");
scanf("%d", &buyer_id);
while (current) {
if (current->buyer_id == buyer_id) {
print_sales_record(current);
count++;
}
current = current->next;
}
break;
}
case 4: {
char start_date[20], end_date[20];
printf("输入起始日期(YYYY-MM-DD): ");
scanf("%19s", start_date);
printf("输入结束日期(YYYY-MM-DD): ");
scanf("%19s", end_date);
while (current) {
if (date_compare(current->sale_date, start_date) >= 0 &&
date_compare(current->sale_date, end_date) <= 0) {
print_sales_record(current);
count++;
}
current = current->next;
}
break;
}
case 5: {
int status;
printf("输入状态(0-3): ");
scanf("%d", &status);
while (current) {
if (current->status == status) {
print_sales_record(current);
count++;
}
current = current->next;
}
break;
}
default:
printf("无效选择!\n");
return;
}
printf("共找到%d条销售记录\n", count);
}
// 统计销售数据
void sales_statistics() {
float total_sales = 0;
int status_counts[4] = {0};
SalesRecord* current = sales_head;
while (current) {
total_sales += current->total_amount;
status_counts[current->status]++;
current = current->next;
}
printf("\n=== 销售统计 ===\n");
printf("总销售额: %.2f\n", total_sales);
printf("订单状态分布:\n");
printf(" 待处理: %d\n", status_counts[ORDER_PENDING]);
printf(" 已发货: %d\n", status_counts[ORDER_SHIPPED]);
printf(" 已完成: %d\n", status_counts[ORDER_COMPLETED]);
printf(" 已取消: %d\n", status_counts[ORDER_CANCELED]);
}
// 辅助函数:打印销售记录
void print_sales_record(SalesRecord* record) {
const char* status_names[] = {"待处理", "已发货", "已完成", "已取消"};
printf("[订单%d] 产品:%d 买家:%d\n 数量:%.2f 单价:%.2f 总金额:%.2f\n 状态:%s 日期:%s\n",
record->order_id,
record->product_id,
record->buyer_id,
record->quantity,
record->unit_price,
record->total_amount,
status_names[record->status],
record->sale_date);
}
// 辅助函数:获取状态名称
const char* get_status_name(OrderStatus status) {
static const char* names[] = {"待处理", "已发货", "已完成", "已取消"};
return names[status];
}
// 日期比较函数
int date_compare(const char* date1, const char* date2) {
return strcmp(date1, date2);
}
#include "common.h"
int user_management_menu();
void role_based_menu();
void admin_main_menu();
void operator_main_menu ();
void finance_management_menu();
void initialize_system();
User* user_login();
void free_resources();
FinancialRecord* finance_head = NULL;
Buyer* buyer_head = NULL;
InventoryRecord* inventory_head = NULL;
Member* member_head = NULL;
Product* product_head = NULL;
SalesRecord* sales_head = NULL;
// 登录验证函数
int login_system() {
char username[32];
char password[64];
printf("\n======== 农业合作社管理系统 ========\n");
printf("用户名: ");
fgets(username, sizeof(username), stdin);
username[strcspn(username, "\n")] = '\0'; // 去除换行符
printf("密码: ");
fgets(password, sizeof(password), stdin);
password[strcspn(password, "\n")] = '\0';
// 遍历用户链表查找匹配
User* p = user_list;
while (p != NULL) {
if (strcmp(p->username, username) == 0 &&
strcmp(p->password, password) == 0) {
current_user = p;
login_state = LOGGED_IN;
return 1;
}
p = p->next;
}
printf("登录失败,用户名或密码错误!\n");
return 0;
}
// 主菜单控制流程
void main_menu() {
int choice;
do {
printf("\n==== 主菜单 ====\n");
printf("1. 登录系统\n");
printf("2. 退出程序\n");
printf("请选择操作: ");
scanf("%d", &choice);
getchar(); // 清除输入缓冲区
switch(choice) {
case 1:
if (login_system()) {
role_based_menu();
}
break;
case 2:
printf("系统已退出\n");
exit(0);
default:
printf("无效选择,请重新输入!\n");
}
} while (1);
}
// 角色菜单分发器
void role_based_menu() {
while (login_state == LOGGED_IN) {
printf("\n===== 欢迎 %s [%s] =====\n",
current_user->username,
get_role_name(current_user->role));
switch(current_user->role) {
case ROLE_ADMIN:
admin_main_menu();
break;
case ROLE_OPERATOR:
operator_main_menu();
break;
case ROLE_FINANCE:
finance_management_menu();
break;
default:
printf("未知用户角色!\n");
login_state = LOGGED_OUT;
}
}
}
int main() {
initialize_system();
current_user = user_login();
if (current_user) {
printf("\n欢迎您,%s!\n", current_user->username);
switch (current_user->role) {
case ROLE_ADMIN:
admin_main_menu();
break;
case ROLE_OPERATOR:
operator_main_menu();
break;
case ROLE_FINANCE:
finance_management_menu();
break;
default:
printf("未知用户角色!\n");
}
} else {
printf("登录失败,系统退出!\n");
}
// 释放内存资源
free_resources();
return 0;
}
这一大段全部代码有哪些错误