⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 train_booking_psngrop.c

📁 火车定标系统...用VC编译通过的
💻 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 + -