📄 train_booking_psngrop.c
字号:
// train_booking_psngrop.c -- 包含用户数据操作函数
//
/////////////////////////////////////////////////////////////////////////////
#ifndef TRAIN_BOOKING_PSNGROP_C_
#define TRAIN_BOOKING_PSNGROP_C_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "train_booking_declare.h"
#include "train_booking_const.h"
#include "train_booking_unit.h"
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 为刚注册的用户准备资料夹和空文件
//
// 函数参数: psngr_id:用户名
//
/////////////////////////////////////////////////////////////////////////////
status prepare_psngr_dir(char *psngr_id)
{
build_ii_dir(USER_INFO_DIR, psngr_id, NULL); // 创建专门的目录
// 创建空文件以准备写入
build_ii_dir(USER_INFO_DIR, psngr_id, PSNGR_INFO_FILE);
build_ii_dir(USER_INFO_DIR, psngr_id, BOOKED_INFO_FILE);
build_ii_dir(USER_INFO_DIR, psngr_id, MSGBOX_FILE);
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 注册隶属于某一车站的用户
//
// 函数参数: psngr_info_head:整个车站前台用户信息链表头结点指针
// system_info_pt:指向车站信息结构体的指针
// station_id:该车站名
// type:要注册的类型:0管理员;1普通用户;2特殊用户
//
////////////////////////////////////////////////////////////////////////////
status psngr_reg(passenger_info *psngr_info_head, system_info *system_info_pt,
char *station_id, char type)
{
passenger_info *psngr_info_buffer_pt; // 注册数据缓冲区
passenger_info *psngr_info_pt, *psngr_info_head_reset = psngr_info_head;
char t_id[MAX_PSNGR_ID_LEN * 2];
char t_pass1[MAX_PASS_LEN * 2], t_pass2[MAX_PASS_LEN * 2];
char call[32];
char ch;
actitle("注册车站新用户");
input_name: // 取得用户名
{
CLS;
// 信息链指针的复位
psngr_info_head = psngr_info_head_reset;
// 取得合适长度的临时用户名
if (!get_str("要注册的用户名", t_id, 4, MAX_PSNGR_ID_LEN))
{
message(WARN, "用户注册失败!", WC);
return FAIL;
}
// 检测该用户是否已存在
message(INFO, "正在验证用户名的合法性...", NULL);
while (psngr_info_head->next)
{
psngr_info_pt = psngr_info_head->next;
if (!strcpy(t_id, psngr_info_pt->passenger_id))
{
message(WARN, "抱歉!该用户名已被人注册过。", NULL);
printf("【1】换名重新注册\n");
printf("【2】放弃注册\n");
ch = get_choice("12");
if ('2' == ch)
{
message(WARN, "已放弃注册新用户!", WC);
return FAIL;
}
else
{
goto input_name;
}
}
psngr_info_head = psngr_info_head->next; // 依次往下搜索
}
printf("【信息】用户名(%s)没有被人使用过,可以注册。\n", t_id);
}
input_pass: // 取得用户密码
{
CLS;
// 取得第一个密码
if (!get_str("要设定的密码", t_pass1, 4, MAX_PASS_LEN))
{
message(WARN, "用户注册失败!", WC);
return FAIL;
}
// 再次取得密码
printf("【提示】需要再次输入密码以确认没有错误!\n");
if (!get_str("要设定的密码", t_pass2, 4, MAX_PSNGR_ID_LEN))
{
return FAIL;
}
// 比较两次输入的密码是否相同
if (strcmp(t_pass1, t_pass2))
{
message(WARN, "两次输入的密码不匹配!", NULL);
message(TIP, "必须重新输入密码!", W);
goto input_pass;
}
}
write_info: // 写入文件数据
{
CLS;
message(INFO, "正在写入新用户数据...", NULL);
if (!(psngr_info_buffer_pt = (passenger_info *)malloc(sizeof(passenger_info))))
{
message(ERROR, "创建新注册用户数据时申请内存出错!", NULL);
message(WARN, "注册新用户失败!", WC);
return FAIL;
}
// 写入用户的各项基本数据
strcpy(psngr_info_buffer_pt->passenger_id, t_id);
strcpy(psngr_info_buffer_pt->password, t_pass1);
strcpy(psngr_info_buffer_pt->station_id, station_id);
psngr_info_buffer_pt->type = type;
psngr_info_buffer_pt->total_booked_tickets = 0;
psngr_info_buffer_pt->total_booked_train = 0;
psngr_info_buffer_pt->total_cost = 0;
psngr_info_buffer_pt->sysmsg_amount = 0;
psngr_info_buffer_pt->sysmsg_new = 0;
psngr_info_buffer_pt->next = NULL;
if (!(save_psngr_info(psngr_info_buffer_pt))) // 写入磁盘文件
{
message(ERROR, "注册新用户写入文件时发生意外错误!", NULL);
message(WARN, "注册新用户失败!", WC);
free(psngr_info_buffer_pt);
return FAIL;
}
// 登记乘客索引记录
// 如果是管理员则登记入系统信息
if (1 == type)
{
if (system_info_pt->admin_amount > MAX_ADMIN_AMOUNT) // 管理员人数已满
{
message(ERROR, "本车站管理员已达到最大人数,不能再继续注册管理员了!", NULL);
message(WARN, "注册新用户(管理员)失败!", WC);
free(psngr_info_buffer_pt);
return FAIL;
}
else
{
// 写入管理员信息,将本用户名添加进入管理员列表
strcpy(system_info_pt->admin[system_info_pt->admin_amount], t_id);
system_info_pt->admin_amount++;
save_system_info(system_info_pt); // 更新文件数据
message(INFO, "该用户已注册为车站新管理员!", NULL);
message(INFO, "除了可以订票外,还可对车站、车次、列车进行管理!", WC);
}
}
system_info_pt->psngr_amount++; // 注册人数加1
save_system_info(system_info_pt); // 更新文件数据
// 为用户数据准备文件夹
prepare_psngr_dir(psngr_info_buffer_pt->passenger_id);
message(INFO, "新用户已经注册成功!", NULL);
printf("【信息】请记住您的用户名(%s)和所属车站(%s),不要登录错误!\n",
t_id, station_id);
message(INFO, "感谢您使用本系统。按任意键返回。", WC);
}
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 车站用户登录
//
// 函数参数: psngr_info_head:整个车站前台用户信息链表头结点指针
// psngr_info_pt:此指针指向的空间用于返回成功登录的用户信息
// station_id:用户所属的车站名
// type:登录类型:1为管理员,0为普通乘客
//
////////////////////////////////////////////////////////////////////////////
status psngr_login(passenger_info *psngr_info_head, passenger_info *psngr_info_buf,
char *station_id, char type)
{
passenger_info *psngr_info_head_reset = psngr_info_head;
char t_id[MAX_PSNGR_ID_LEN * 2];
char t_pass[MAX_PASS_LEN * 2];
char ch;
check_name: // 取得用户名
{
CLS;
actitle("车站订票用户登录");
if (!get_str("要登录的用户名", t_id, 4, MAX_PSNGR_ID_LEN))
{
message(WARN, "用户登录失败!", WC);
return FAIL;
}
// 检测该用户是否已存在
message(INFO, "正在验证用户名是否存在...", NULL);
while (psngr_info_head->next)
{
psngr_info_head = psngr_info_head->next;
// 找到该用户,即复制相关数据到内存中
if (!strcpy(t_id, psngr_info_head->passenger_id))
{
*psngr_info_buf = *psngr_info_head;
goto check_pass; // 直接跳到下一步
}
}
printf("【警告】无(%s)此用户存在!\n\n", t_id);
printf("【1】重新登录\n");
printf("【2】退出\n\n");
ch = get_choice("12");
if ('1' == ch)
{
psngr_info_head = psngr_info_head_reset; // 信息链指针的复位
goto check_name;
}
else
{
CLS;
message(WARN, "已放弃用户登录!", NULL);
message(WARN, "按任意键退出此系统!", WC);
return FAIL;
}
}
// 检测用户与车站的从属关系
if (strcmp(psngr_info_buf->station_id, station_id))
{
printf("【错误】用户(%s)不是本站(%s)的注册用户!\n",
psngr_info_buf->passenger_id);
message(WARN, "该用户不能在本车站登录!", NULL);
printf("【1】重新换名登录\n");
printf("【2】退出\n");
ch = get_choice("12");
if ('1' == ch)
{
psngr_info_head = psngr_info_head_reset;
goto check_name;
}
else
{
message(WARN, "已放弃用户登录!", WC);
return FAIL;
}
}
check_pass: // 取得密码
{
if (!get_str("密码", t_pass, 4, MAX_PASS_LEN))
{
message(WARN, "用户登录失败!", WC);
return FAIL;
}
// 密码出错处理
if (strcpy(t_pass, psngr_info_buf->password))
{
message(WARN, "您输入的密码有误!", NULL);
printf("【1】重新输入密码\n");
printf("【2】重新换名登录\n");
printf("【3】退出\n\n");
ch = get_choice("12");
if ('2' == ch)
{
psngr_info_head = psngr_info_head_reset;
goto check_name;
}
else if ('1' == ch)
{
goto check_pass;
}
else
{
message(WARN, "已放弃用户登录!", WC);
return FAIL;
}
}
}
// 从文件读取该用户的其他信息
if (!(load_booked_info_list(&psngr_info_buf->booked_links, psngr_info_buf->passenger_id,
psngr_info_buf->total_booked_train))) // 加载该用户的订票信息
{
message(ERROR, "读取用户订票信息出错!", NULL);
message(WARN, "用户登录失败!", WC);
return FAIL;
}
if (!(load_sysmsg_list(&psngr_info_buf->sysmsg_links, psngr_info_buf->passenger_id,
psngr_info_buf->sysmsg_amount))) // 加载该用户的系统消息
{
message(ERROR, "读取用户系统消息出错!", NULL);
message(WARN, "用户登录失败!", WC);
return FAIL;
}
printf("【信息】本站(%s)用户(%s)已成功登录订票系统!\n",
station_id, t_id);
WAIT;
CLS;
return OK;
}
////////////////////////////////////////////////////////////////////////////
// 函数功能: 车站用户登出
//
// 函数参数: psngr_info_pt:指向前台用户信息结构的指针
//
////////////////////////////////////////////////////////////////////////////
status psngr_logout(passenger_info *psngr_info_pt)
{
passenger_info passenger_info_dump;
if ((save_psngr_info(psngr_info_pt)) && // 保存前台用户信息
(save_booked_info(&psngr_info_pt->booked_links, psngr_info_pt->passenger_id)) &&
// 保存用户订票信息
(save_sysmsg(&psngr_info_pt->sysmsg_links, psngr_info_pt->passenger_id)))
// 保存用户接收到的系统消息
{
printf("【信息】用户(%s)已成功登出系统!\n", psngr_info_pt->passenger_id);
*psngr_info_pt = passenger_info_dump; // 填充垃圾数据
WAIT;
CLS;
}
else
{
printf("【信息】用户(%s)登出系统时保存数据出错!\n", psngr_info_pt->passenger_id);
message(WARN, "本次不正常的用户登出可能使您的数据发生异常!\n", WC);
return FAIL;
}
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 乘客修改密码
//
// 函数参数: psngr_info_pt:乘客信息单元指针
//
/////////////////////////////////////////////////////////////////////////////
status modify_psngr_pass(passenger_info *psngr_info_pt)
{
char t_pass1[64], t_pass2[64];
char ch;
actitle("修改乘客密码");
// 校验老密码
message(TIP, "更改密码需要验证原密码!", NULL);
if (!(get_str("原密码", t_pass1, 1, MAX_PASS_LEN)))
{
message(ERROR, "修改密码失败!", WC);
return FAIL;
}
if (strcmp(t_pass1, psngr_info_pt->password))
{
message(ERROR, "您输入的原密码有误,因此不能修改密码!", NULL);
message(WARN, "修改乘客密码失败!", WC);
return FAIL;
}
// 接收新密码
get_new_pass:
CLS;
message(TIP, "现在输入新密码。", NULL);
if (!(get_str("新密码", t_pass1, 1, MAX_PASS_LEN)))
{
message(ERROR, "接收新密码失败!", NULL);
message(WARN, "修改乘客密码失败!", WC);
return FAIL;
}
message(TIP, "需要再次输入新密码。", NULL);
if (!(get_str("新密码", t_pass2, 1, MAX_PASS_LEN)))
{
message(ERROR, "接收新密码失败!", NULL);
message(WARN, "修改乘客密码失败!", WC);
return FAIL;
}
// 匹配校验
if (!(strcmp(t_pass1, t_pass2)))
{
message(ERROR, "输入的两次密码不相同!要重新输入吗(Y/N)?", NULL);
ch = getch();
if (('y' == ch) || ('Y' == ch))
{
goto get_new_pass;
}
else
{
message(WARN, "修改乘客密码失败!", WC);
return FAIL;
}
}
// 改动保存
strcpy(psngr_info_pt->password, t_pass2);
if (!(save_psngr_info(psngr_info_pt)))
{
message(ERROR, "修改乘客密码保存文件时出错!", NULL);
message(WARN, "修改乘客密码失败!", WC);
return FAIL;
}
return OK;
}
/////////////////////////////////////////////////////////////////////////////
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -