这个项目是教程里最后一个项目了,也是最复杂的,用了三天时间才做完,现在,做一下大致的梳理叭。
项目内容是建立一个机房预约系统,里面涉及的身份:学生代表(申请使用)、教师(审核预约申请)、管理员(给学生、教师创建账号,管理数据),机房信息(机房号、最大容量),申请(管理员每周清空申请订单,学生可以预约未来一周的机房使用,且预约周期为周一到周五,预约时需要选择预约时间段是上午还是下午,教师审核预约),预约状态(审核中、预约成功、预约失败、取消预约)
系统的具体要求如下:
1、进入登录界面
2、身份验证后进入各自的子界面
3、学生功能:
- 申请预约
- 查看自身的所有预约
- 查看所有的预约
- 取消预约
- 注销登录
4、教师功能:
- 查看所有预约
- 审核预约
- 注销登录
5、管理员功能:
- 添加账号
- 查看账号
- 查看机房
- 清空预约
- 注销登录
首先和以前的项目不一样的是,这里不需要单独创建一个管理类来串联所有的功能,因为这里各个功能都是封装在不同的身份类中的,所以这里只需要一个主菜单界面,用来整合各个接口,实现与用户的交互。
其次,因为三种身份存在一定的共性(显示子菜单函数、登录用户名、登录密码),但同时又存在各自不同的属性和函数,所以创建一个identity类用来存放共性部分,而student类、teacher类和manager类就public继承一下,然后在各自的类里扩展功能。
管理类:
先说一下为什么要先写管理类呢,因为管理员是唯一有资格给学生和教师申请账号的,且他的工作室最复杂的,所以先写他。
- 显示管理员操作的菜单界面
- 添加账号:首先给个学生和教师各准备一个vector来存放现有的账号和密码,根据选择的添加账号类型去相应地判断此账号是否已经存在了,所以这里涉及到两个函数(init_vector()和checkrepeat()两个函数),如果不重复,则以追加的方式写进对应的文件里,并及时更新vector。
- 查看账号:就是简单的遍历各vector里的信息。
- 查看机房信息:机房信息也对应有单独的一类和单独的存放文件以及vector,这里也是init_vector以后,遍历vector就行。
- 清空预约记录:老套路了,用trunc的形式打开文件,记得delete掉对象,避免内存泄漏。
学生类:
- 显示学生操作的菜单界面
- 申请预约:这一部分主要就是要在规定的范围内输入,输入完成以后要及时写进文件中
- 查看自身预约:主要涉及对order_file文件的读操作,并且找到是自己的预约信息,然后输出出来。因为对order_file的操作对于不同的类来说都是一样的,所以单独把这个功能封装在一个ORDERFILE类中。
- 查看所有预约:直接读order_file文件。
- 取消预约:先要把所有可以取消预约的预约信息列出来,这得在查看自身预约的那些信息里面再筛选,然后选择要取消的那条信息,将它的状态信息置“0”。
教师类:
- 显示教师操作的菜单界面
- 查看所有预约:用ORDERFILE类来读取预约信息,然后输出。
- 审核预约:先输出待审核的预约信息,然后进行选择,将选到的信息的status位置为2或-1。
ORDERFILE类:
主要是对预约信息的一些操作。
成员参数:map<int, map<string, string>>,int m_Size(预约条数)
成员函数:构造函数、更新预约记录
这个类的难点在于构造函数里面,需要对读出的一行string作分割,放进对应的map的key和value中。
大致梳理是这样了,直接放代码了:
//头文件部分
********************************************************************************
//identity.h
********************************************************************************
#pragma once
#include<iostream>
#include<string>
#include"orderfile.h"
using namespace std;
class Identity {
public:
//操作菜单
virtual void operMenu() = 0;
//用户姓名
string m_Name;
//用户密码
string m_PassWord;
};
********************************************************************************
//manager.h
********************************************************************************
#pragma once
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include"identity.h"
#include"student.h"
#include"teacher.h"
#include"globalfile.h"
#include"computerroom.h"
using namespace std;
class Manager : public Identity{
public:
//默认构造
Manager();
//有参构造
Manager(string name, string pwd);
//菜单界面
virtual void operMenu();
//添加账号
void addPerson();
//查看账号
void showPerson();
//查看机房信息
void showComputer();
//清空所有预约记录
void cleanFile();
//初始化容器
void initVector();
//检测重复
bool checkReapet(int id, int type);//id表示学号/职工号,type表示学生还是教师
vector<Student> vStu;
vector<Teacher> vTea;
vector<ComputerRoom> vCom;
};
********************************************************************************
//student.h
********************************************************************************
#pragma once
#include<iostream>
#include<vector>
#include<fstream>
#include"identity.h"
#include"computerroom.h"
#include"globalfile.h"
#include"orderfile.h"
using namespace std;
class Student : public Identity {
public:
//构造函数
Student();
//有参构造
Student(int id, string name, string pwd);
//菜单界面
virtual void operMenu();
//申请预约
void applyOrder();
// 查看自身预约
void showMyOrder();
// 查看所有预约
void showAllOrder();
// 取消预约
void cancelOrder();
//学生学号
int m_Id;
vector<ComputerRoom> vCom;
};
********************************************************************************
//teacher.h
********************************************************************************
#pragma once
#include<iostream>
#include<string>
#include<vector>
#include"identity.h"
#include"orderfile.h"
using namespace std;
class Teacher : public Identity {
public:
//默认构造
Teacher();
//有参构造
Teacher(int id, string name, string pwd);
//菜单界面
virtual void operMenu();
//查看所有预约
void showAllOrder();
//审核预约
void validOrder();
//职工号
int m_EmpId;
};
********************************************************************************
//computerroom.h
********************************************************************************
#pragma once
#include<iostream>
using namespace std;
class ComputerRoom {
public:
int m_ComId;//机房号
int m_MaxNum;//机房最大容量
};
********************************************************************************
//orderfile.h
********************************************************************************
#pragma once
#include<iostream>
#include<fstream>
#include<string>
#include<map>
#include"globalfile.h"
using namespace std;
class OrderFile {
public:
//构造函数
OrderFile();
//更新预约记录
void updateOrder();
//记录预约条数
int m_Size;
//记录所有预约信息的容器 key记录条数,value具体记录
map<int, map<string, string>> m_orderDate;
};
********************************************************************************
//orderfile.h
********************************************************************************
#pragma once
#include<iostream>
#include<fstream>
#include<string>
#include<map>
#include"globalfile.h"
using namespace std;
class OrderFile {
public:
//构造函数
OrderFile();
//更新预约记录
void updateOrder();
//记录预约条数
int m_Size;