?? 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, "用戶登錄失?。?quot;, 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, "修改密碼失?。?quot;, 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 + -