基于linux环境下的C++机房预约系统开发

1.1申请简介
  • 申请的订单每周由管理员负责清空。
  • 学生可以预约未来一周内的机房使用,预约的日期为周一至周五,预约时需要选择预约时段(上午、下午)
  • 教师来审核预约,依据实际情况审核预约通过或者不通过
1.2系统具体需求
  • 首先进入登录界面,可选登录身份有:
    • 学生代表
    • 老师
    • 管理员
    • 退出
  • 每个身份都需要进行验证后,进入子菜单。
    • 学生需要输入∶学号、姓名、登录密码。
    • 老师需要输入:职工号、姓名、登录密码。
    • 管理员需要输入:管理员姓名、登录密码
  • 学生具体功能
    • 申请预约---预约机房
    • 查看自身的预约---查看自己的预约状态
    • 查看所有预约--查看全部预约信息以及预约状态
    • 取消预约---取消自身的预约,预约成功或审核中的预约均可取消

2.创建主菜单
功能描述:
  • 设计主菜单,与用户进行交互
cout << "=============  欢迎来到我的机房预约系统 =============" << endl;
               cout << endl << "请输入您的身份" << endl;
               cout << "\t\t ---------------------------------------\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t|               1.学生代表              |\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t|               2.老     师             |\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t|               3.管  理 员             |\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t|               0.退     出             |\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t ---------------------------------------\n";
               cout << "输入您的选择:";

3.退出功能实现
  • 在main函数分支0选项中,添加退出程序的代码:
case 0: //退出系统
                       cout << "欢迎下一次使用" << endl;
                       system("pause");
                       return 0;
                       break;

4.创建身份类
  • 在整个系统中,有三种身份,分别为:学生代表、老师以及管理员
  • 三种身份有其共性也有其特性,因此我们可以将三种身份抽象出一个身份基类identity
  • 在头文件下创建ldentity.h文件
ldentity.h中添加如下代码:
//身份抽象类
class
{
public:
        
        //操作菜单  纯虚函数
        virtual void operMenu() = 0;
        //用户名
        string m_Name;
        //密码
        string m_Pwd
};

4.2学生类
4.2.1功能分析
  • 学生类主要功能是可以通过类中成员函数,实现预约实验室操作
  • 学生类中主要功能有:
    • 显示学生操作的菜单界面。
    • 申请预约
    • 查看自身预约。
    • 查看所有预约。
    • 取消预约
5.2.2类的创建
  • 在头文件以及源文件下创建student.h和student.cpp文件
student.h中添加如下代码:
//学生类
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;
};

5.3老师类
5.3.1功能分析
  • 教师类主要功能是查看学生的预约,并进行审核
  • 教师类中主要功能有:
    • 显示教师操作的菜单界面
    • 查看所有预约
    • 审核预约
5.3.2类的创建
在头文件以及源文件下创建teacher.h和teacher.cpp文件
teacher.h中添加如下代码:
class Teacher :public Identity
{
public:
        //默认构造
        Teacher();
        //有参构造
        Teacher(int empId,string name, string pwd);
        //菜单界面
        virtual void operMenu();
        //查看所有预约
        void showAllOrder();
        //审核预约
        void validOrder();
        //职工号
        int m_EmpId;
};

5.4管理类
5.4.1功能分析
  • 管理员类主要功能是对学生和老师账户进行管理,查看机房信息以及清空预约记录
  • 管理员类中主要功能有:
    • 显示管理员操作的菜单界面
    • 添加账号
    • 查看账号
    • 查看机房信息
    • 清空预约记录
5.4.2类的创建
  • 在头文件以及源文件下创建manager.h和manager.cpp文件
manager.h中添加如下代码:
//管理员类设计
class Manager :public Identity
{
public:
        //默认构造
        Manager();
        //有参构造
        Manager(string name,string pwd);
        //菜单界面
        virtual void operMenu();
        //添加账号
        void  addPerson();
        //查看账号
        void showPerson();
        //查看机房信息
        void showComputer();
        //清空预约记录
        void cleanFile();
};

6.登录模块
6.1全局文件添加
功能描述:
  • 不同的身份可能会用到不同的文件操作,我们可以将所有的文件名定义到一个全局的文件中
  • 在头文件中添加globalFile.h文件
  • 并添加如下代码:
//管理员文件
#define ADMIN_FILE "admin.txt"
//管理员文件
#define STUDENT_FILE "student.txt"
//管理员文件
#define TEACHER_FILE "teacher.txt"
//管理员文件
#define COMPUTER_FILE "computerRoom.txt"
//订单文件
#define ORDER_FILE "order.txt"

6.2登录函数封装
功能描述:
  • 根据用户的选择,进入不同的身份登录
在预约系统的.cpp文件中添加全局函数void LoginIn(string fileName,int type)
参数:
  • fileName ---操作的文件名
  • type.…登录的身份―(1代表学生、2代表老师、3代表管理员)
LoginIn中添加如下代码:
//登录功能
void LoginIn(string fileName, int type)
{
        //父类指针,用于指向子类对象
        Identity * person = NULL;
        //读文件
        ifstream ifs;
        ifs.open(fileName, ios::in);
        //判断文件是否存在
        if (!ifs.is_open())
        {
               cout << "文件不存在" << endl;
               ifs.close();
               return;
        }
        //接收用户的信息
        int id = 0;
        string name;
        string pwd;
        //判断身份
        if (type == 1)//学生身份
        {
               cout << "请输入你的学号:" << endl;
               cin >> id;
        }
        else if(type==2)
        {
               cout << "请输入您的职工号:" << endl;
               cin >> id;
        }
        cout << "请输入用户名:" << endl;
        cin >> name;
        cout << "请输入密码:" << endl;
        cin >> pwd;
        if (type == 1)
        {
               //学生身份验证
               int fId;       //从文件中读取的id号
               string fName;  //从文件中获取的姓名
               string fPwd;   //从文件中获取密码
               while (ifs >> fId && ifs>>fName && ifs>>fPwd )
               {
                       //与用户输入的信息做对比
                       if (fId == id && fName == name && fPwd == pwd)
                       {
                              cout << "学生验证登录成功!" << endl;
                              system("pause");
                              system("cls");
                              person = new Student(id,name,pwd);
                              //进入学生身份的子菜单
                       }
               }
        }
        else if (type == 2)
        {
               //教师身份验证
        }
        else if (type == 3)
        {
               //管理员身份验证
        }
        cout << "验证登录失败!" << endl;
        system("pause");
        system("cls");
}

7.管理员模块
7.1管理员登录和注销
7.1.1构造函数
在Manager类的构造函数中,初始化管理员信息,代码如下:
//登录功能
void LoginIn(string fileName, int type)
{
        //父类指针,用于指向子类对象
        Identity * person = NULL;
        //读文件
        ifstream ifs;
        ifs.open(fileName, ios::in);
        //判断文件是否存在
        if (!ifs.is_open())
        {
               cout << "文件不存在" << endl;
               ifs.close();
               return;
        }
        //接收用户的信息
        int id = 0;
        string name;
        string pwd;
        //判断身份
        if (type == 1)//学生身份
        {
               cout << "请输入你的学号:" << endl;
               cin >> id;
        }
        else if(type==2)
        {
               cout << "请输入您的职工号:" << endl;
               cin >> id;
        }
        cout << "请输入用户名:" << endl;
        cin >> name;
        cout << "请输入密码:" << endl;
        cin >> pwd;
        if (type == 1)
        {
               //学生身份验证
               int fId;       //从文件中读取的id号
               string fName;  //从文件中获取的姓名
               string fPwd;   //从文件中获取密码
               while (ifs >> fId && ifs>>fName && ifs>>fPwd )
               {
                       //与用户输入的信息做对比
                       if (fId == id && fName == name && fPwd == pwd)
                       {
                              cout << "学生验证登录成功!" << endl;
                              system("pause");
                              system("cls");
                              person = new Student(id,name,pwd);
                              //进入学生身份的子菜单
                       }
               }
        }
        else if (type == 2)
        {
               //教师身份验证
        }
        else if (type == 3)
        {
               //管理员身份验证
        }
        cout << "验证登录失败!" << endl;
        system("pause");
        system("cls");
}

7.2添加账号
功能描述:
  • 给学生或教师添加新的账号
功能要求:
  • 添加时学生学号不能重复、教师职工号不能重复7.2.1添加功能实现
在Manager的addPerson成员函数中,实现添加新账号功能,代码如下:
//添加账号
void  Manager::addPerson()
{
        cout << "请输入添加账号类型" << endl;
        cout << "1.添加学生" << endl;
        cout << "2.添加老师" << endl;
        string fileName; //操作文件名
        string tip;            //提示id号
        ofstream ofs;  //文件操作对象
        int select = 0;
        cin >> select; //接收用户的选项
        if (select == 1)
        {
               //添加的是学生
               fileName = STUDENT_FILE;
               tip = "请输入学号: ";
                       
        }
        else
        {
               fileName = TEACHER_FILE;
               tip = "请输入职工编号:";
        }
        //利用追加的方式  写文件
        ofs.open(fileName,ios::out | ios::app);
        int id;        //学号  / 职工号
        string name;   //姓名
        string pwd;            //密码
        cout << tip << endl;
        cin >> id;
        cout << "请输入姓名:" << endl;
        cin >> name;
        cout << "请输入密码:" << endl;
        cin >> pwd;
        //向文件中添加数据
        ofs << id << " " << name << " " << pwd << " " << endl;
        cout << "添加成功" << endl;
        system("pause");
        system("cls");
        ofs.close();
}

7.2.2去重操作
  • 功能描述:添加新账号时,如果是重复的学生编号,或是重复的教师职工编号,提示有误
7.2.2.1读取信息
  • 要去除重复的账号,首先要先将学生和教师的账号信息获取到程序中,方可检测
  • 在manager.h中,添加两个容器,用于存放学生和教师的信息
  • 添加一个新的成员函数void initvector()初始化容器
7.3.1显示功能
//查看账号
void Manager::showPerson()
{
        cout << "请选择查看内容:" << endl;
        cout << "1.查看所有学生" << endl;
        cout << "2.查看所有老师" << endl;
        int select = 0;        //接收用户选择
        cin >> select;
        if (select == 1)
        {
               //查看学生
               cout << "所有学生信息如下:" << endl;
               for_each(vStu.begin(),vStu.end(),printStudent);
        }
        else
        {
               //查看老师
               cout << "所有教师信息如下:" << endl;
               for_each(vTea.begin(), vTea.end(), printTeacher);
        }
        system("pause");
        system("cls");
}

7.4查看机房
7.4.1天假机房信息
案例需求:案例需求中,机房一共有三个,其中1号机房容量20台机器,2号50台,3号100台我们可以将信息录入到domputerRoom.txt中
8.学生模块
8.1学生登录和注销
8.1.1构造函数
8.3显示预约
8.3.1创建预约类
功能描述:显示预约记录时,需要从文件中获取到所有记录,用来显示,创建预约的类来管理记录以及更新在头文件以及源文件下分别创建orqerFile.h和orderFile.cpp文件
orderFile.h中添加如下代码:
class OrderFile
{
public:
        //构造函数
        OrderFile();
        
        //更新预约记录
        void updateOrder();
        //记录预约条数
        int m_Size;
        记录所有预约信息的容器key记录条数value 具体记录键值对信息
        map<int, map<string, string>>m_orderData;
};

8.3.2显示自身预约
首先我们先添加几条预约记录,可以用程序添加或者直接修改order.txt文件order.txt文件内容如下:比如我们有三名同学分别产生了3条预约记录
//查看自身预约
void Student::showMyOrder()
{
        OrderFile of;
        if (of.m_Size == 0)
        {
               cout << "无预约记录!" << endl;
               system("pause");
               system("cls");
               return;
        }
        for (int i = 0; i < of.m_Size; i++)
        {
               //string 转 int
               //string 利用 .c_str()转const char *
               //利用atoi(const char *)转int
               if (this->m_Id == atoi(of.m_orderData[i]["stuId"].c_str()))
               {
                       cout<<"预约日期:周"<<of.m_orderData[i]["date"];
                       cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
                       cout << " 机房号 " << of.m_orderData[i]["roomId"];
                       string status = "状态:";
                       //1.审核中 2.已预约 -1 预约失败 0取消预约
                       if (of.m_orderData[i]["status"] == "1")
                       {
                              status += "审核中";
                       }
                       else if(of.m_orderData[i]["status"]=="2")
                       {
                              status += "预约成功";
                       }
                       else if(of.m_orderData[i]["status"]=="-1")
                       {
                              status += "预约失败,审核未通过";
                       }
                       else
                       {
                              status += "预约已取消";
                       }
                       cout << status << endl;
               }
        }
}

9.1.2教师子菜单
  • 在机房预约系统.cpp中,当用户登录的是教师,添加教师菜单接口
  • 将不同的分支提供出来
    • 查看所有预约o审核预约
    • 注销登录
    • 实现注销功能
添加全局函数void TeacherMenu(Person * &manager)]代码如下:

案例全部代码
computerRoom.h
#pragma once
#include<iostream>
using namespace std;
//机房类
class ComputerRoom
{
public:
        int m_ComId;   //机房Id号
        int m_MaxNum;  //机房最大容量
};

globalFile.h
#pragma once
//管理员文件
#define ADMIN_FILE "admin.txt"
//学生文件
#define STUDENT_FILE "student.txt"
//教师文件
#define TEACHER_FILE "teacher.txt"
//机房信息文件
#define COMPUTER_FILE "computerRoom.txt"
//订单文件
#define ORDER_FILE "order.txt"

Identity.h
#pragma once //防止头文件重复包含
#include <iostream>
using namespace std;
//身份抽象类
class Identity
{
public:
        
        //操作菜单  纯虚函数
        virtual void operMenu() = 0;
        //用户名
        string m_Name;
        //密码
        string m_Pwd;
};

manager.h
#pragma once
#include <iostream>
using namespace std;
#include <string>
#include "Identity.h"
#include <fstream>
#include "globalFile.h"
#include <vector>
#include "student.h"
#include "teacher.h"
#include <algorithm>
#include "computerRoom.h"
//管理员类设计
class Manager :public Identity
{
public:
        //默认构造
        Manager();
        //有参构造
        Manager(string name,string pwd);
        //菜单界面
        virtual void operMenu();
        //添加账号
        void  addPerson();
        //查看账号
        void showPerson();
        //查看机房信息
        void showComputer();
        //清空预约记录
        void cleanFile();
        //初始化容器
        void initVector();
        //检查重复 参数1  检测学号/职工号 参数2  检测类型
        bool checkRepea(int id,int type);
        //学生容器
        vector<Student>vStu;
        //教师容器
        vector<Teacher>vTea;
        //机房信息容器
        vector<ComputerRoom>vCom;
};

orderFile.h
#pragma once
#include <iostream>
using namespace std;
#include "globalFile.h"
#include <fstream>
#include <map>
#include <string>
//管理预约类
class OrderFile
{
public:
        //构造函数
        OrderFile();
        
        //更新预约记录
        void updateOrder();
        //记录预约条数
        int m_Size;
        记录所有预约信息的容器key记录条数value 具体记录键值对信息
        map<int, map<string, string>>m_orderData;
};

student.h
#pragma once //防止头文件重复包含
#include <iostream>
using namespace std;
#include "Identity.h"
#include <string>
#include <vector>
#include "computerRoom.h"
#include <fstream>
#include "globalFile.h"
#include "orderFile.h"
//学生类
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>
using namespace std;
#include "Identity.h"
#include <string>
#include "orderFile.h"
#include <vector>
class Teacher :public Identity
{
public:
        //默认构造
        Teacher();
        //有参构造
        Teacher(int empId,string name, string pwd);
        //菜单界面
        virtual void operMenu();
        //查看所有预约
        void showAllOrder();
        //审核预约
        void validOrder();
        //职工号
        int m_EmpId;
};

manager.cpp
#include "manager.h"
//默认构造
Manager::Manager()
{
}
//有参构造
Manager::Manager(string name, string pwd)
{
        //初始化管理员信息
        this->m_Name = name;
        this->m_Pwd = pwd;
        //初始化容器  获取到所有文件中  学生、老师信息
        this->initVector();
        //初始化机房信息
        ifstream ifs;
        ifs.open(COMPUTER_FILE, ios::in);
        ComputerRoom com;
        while (ifs>>com.m_ComId&&ifs>>com.m_MaxNum)
        {
               vCom.push_back(com);
        }
        ifs.close();
        cout << "机房的数量为:" << vCom.size() << endl;
}
//菜单界面
void Manager::operMenu()
{
        cout <<  "欢迎管理员:"<< this->m_Name << "登录!" << endl;
        cout << "\t\t ---------------------------------------\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               1.添加账号              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               2.查看账号              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               3.查看机房              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               4.清空预约              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               0.注销登录              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t ---------------------------------------\n";
        cout << "输入您的选择:";
}
//添加账号
void  Manager::addPerson()
{
        cout << "请输入添加账号类型" << endl;
        cout << "1.添加学生" << endl;
        cout << "2.添加老师" << endl;
        string fileName; //操作文件名
        string tip;            //提示id号
        string errorTip; //重复错误提示
        ofstream ofs;  //文件操作对象
        int select = 0;
        cin >> select; //接收用户的选项
        if (select == 1)
        {
               //添加的是学生
               fileName = STUDENT_FILE;
               tip = "请输入学号: ";
               errorTip = "学号重复,请重新输入";
        }
        else
        {
               fileName = TEACHER_FILE;
               tip = "请输入职工编号:";
               errorTip = "职工号重复,请重新输入";
        }
        //利用追加的方式  写文件
        ofs.open(fileName,ios::out | ios::app);
        int id;        //学号  / 职工号
        string name;   //姓名
        string pwd;            //密码
        cout << tip << endl;
        while (true)
        {
               cin >> id;
               bool ret=checkRepea(id,select);
               if (ret)//有重复
               {
                       cout << errorTip << endl;
               }
               else
               {
                       break;
               }
        }
        cout << tip << endl;
        cin >> id;
        cout << "请输入姓名:" << endl;
        cin >> name;
        cout << "请输入密码:" << endl;
        cin >> pwd;
        //向文件中添加数据
        ofs << id << " " << name << " " << pwd << " " << endl;
        cout << "添加成功" << endl;
        system("pause");
        system("cls");
        ofs.close();
        //调用初始化容器接口,从新获取文件中的数据
        this->initVector();
}
void printStudent(Student &s)
{
        cout << "学号:" << s.m_Id << " 姓名:" << s.m_Name << " 密码:" << s.m_Pwd <<  endl;
}
void printTeacher(Teacher &s)
{
        cout << "职工号:" << s.m_EmpId << " 姓名:" << s.m_Name << " 密码:" << s.m_Pwd  << endl;
}
//查看账号
void Manager::showPerson()
{
        cout << "请选择查看内容:" << endl;
        cout << "1.查看所有学生" << endl;
        cout << "2.查看所有老师" << endl;
        int select = 0;        //接收用户选择
        cin >> select;
        if (select == 1)
        {
               //查看学生
               cout << "所有学生信息如下:" << endl;
               for_each(vStu.begin(),vStu.end(),printStudent);
        }
        else
        {
               //查看老师
               cout << "所有教师信息如下:" << endl;
               for_each(vTea.begin(), vTea.end(), printTeacher);
        }
        system("pause");
        system("cls");
}
//查看机房信息
void Manager::showComputer()
{
        cout << "机房信息如下:" << endl;
        for (vector<ComputerRoom>::iterator it = vCom.begin(); it != vCom.end(); it++)
        {
               cout << "机房编号:" << it->m_ComId << " 机房最大容量:" << it->m_MaxNum <<  endl;
        }
        system("pause");
        system("cls");
}
//清空预约记录
void Manager::cleanFile()
{
        ofstream ofs(ORDER_FILE, ios::trunc);
        ofs.close();
        cout << "清空成功!" << endl;
        system("pause");
        system("cls");
}
//初始化容器
void Manager::initVector()
{
        //读取信息     学生、老师
        ifstream ifs;
        ifs.open(STUDENT_FILE, ios::in);
        if (!ifs.is_open())
        {
               cout << "文件读取失败" << endl;
               return;
        }
        //确保容器清空状态
        vStu.clear();
        vTea.clear();
        Student s;
        while (ifs>>s.m_Id && ifs >>s.m_Name && ifs >> s.m_Pwd)
        {
               vStu.push_back(s);
        }
        cout << "当前学生数量为:" << vStu.size() << endl;
        ifs.close();
        //读取信息  学生
        ifs.open(TEACHER_FILE,ios::in);
        Teacher t;
        while (ifs>>t.m_EmpId && ifs>>t.m_Name && ifs>>t.m_Pwd)
        {
               vTea.push_back(t);
        }
        cout << "当前老师数量为:" << vTea.size() << endl;
        ifs.close();
}
//检查重复 参数1  检测学号/职工号 参数2  检测类型
bool Manager::checkRepea(int id, int type)
{
        if (type == 1)
        {
               // 检测学生
               for (vector<Student>::iterator it = vStu.begin(); it != vStu.end(); it++)
               {
                       if (id == it->m_Id)
                       {
                              return true;
                       }
               }
        }
        else
        {
               //检测老师
               for (vector<Teacher>::iterator it = vTea.begin(); it != vTea.end(); it++ )
               {
                       if (id == it->m_EmpId)
                       {
                              return true;
                       }
               }
        }
        return false;
        
}

orderFile.cpp
#include "orderFile.h"
//构造函数
OrderFile::OrderFile()
{
        ifstream ifs;
        ifs.open(ORDER_FILE, ios::in);
        string date;   //日期
        string interval;       //时间段
        string stuId;  //学生编号
        string stuName;        //学生姓名
        string roomId; //机房编号
        string status; //预约状态
        this->m_Size = 0;
        while (ifs>>date&&ifs>>interval&&ifs>>stuId
               &&ifs>>stuName &&ifs>>roomId&&ifs>>status)
        {
               
               
               //date:11111
               string key;
               string value;
               map<string, string>m;
               int pos = date.find(":");     //4
               if (pos != -1)
               {
                       key = date.substr(0, pos);
                       value = date.substr(pos + 1, date.size() - pos - 1); //size=9 pos=4  size-pos -1 = 5-1
               
                       m.insert(make_pair(key,value));
               }
        
               
               //截取间隔
               pos = date.find(":");  //4
               if (pos != -1)
               {
                       key = interval.substr(0, pos);
                       value = interval.substr(pos + 1, interval.size() - pos - 1);        //size=9 pos=4 size-pos -1 = 5-1
                       m.insert(make_pair(key, value));
               }
               //截取学号
               pos = stuId.find(":"); //4
               if (pos != -1)
               {
                       key = stuId.substr(0, pos);
                       value = stuId.substr(pos + 1, stuId.size() - pos - 1);      //size=9 pos=4 size-pos -1 = 5-1
                       m.insert(make_pair(key, value));
               }
               //截取姓名
               pos = stuName.find(":");      //4
               if (pos != -1)
               {
                       key = stuName.substr(0, pos);
                       value = stuName.substr(pos + 1, stuName.size() - pos - 1);  //size=9 pos=4 size-pos -1 = 5-1
                       m.insert(make_pair(key, value));
               }
               //截取机房号
               pos = roomId.find(":");       //4
               if (pos != -1)
               {
                       key = roomId.substr(0, pos);
                       value = roomId.substr(pos + 1, roomId.size() - pos - 1);    //size=9 pos=4 size-pos -1 = 5-1
                       m.insert(make_pair(key, value));
               }
               //截取预约状态
               pos = status.find(":");       //4
               if (pos != -1)
               {
                       key = status.substr(0, pos);
                       value = status.substr(pos + 1, status.size() - pos - 1);    //size=9 pos=4 size-pos -1 = 5-1
                       m.insert(make_pair(key, value));
               }
               //将小map容器放入到大的map容器中
               this->m_orderData.insert(make_pair(this->m_Size, m));
               this->m_Size++;
        }
        ifs.close();
        测试最大map容器
        //for (map<int, map<string, string>>::iterator it = m_orderData.begin(); it !=  m_orderData.end(); it++)
        //{
        //      cout << " key=" << it->first << " value=" << endl;
        //      for (map<string, string>::iterator mit = (*it).second.begin(); mit !=  (*it).second.end(); mit++)
        //      {
        //             cout << " key=" << mit->first << " value=" << mit->second << " ";
        //      }
        //      cout << endl;
        //}
}
//更新预约记录
void OrderFile::updateOrder()
{
        if (this->m_Size == 0)
        {
               return; //预约记录0条,直接return
        }
        ofstream ofs(ORDER_FILE, ios::out | ios::trunc);
        for (int i = 0; i < this->m_Size; i++)
        {
               ofs << "date:" << this->m_orderData[i]["date"] << " ";
               ofs << "interval:" << this->m_orderData[i]["interval"] << " ";
               ofs << "stuId:" << this->m_orderData[i]["stuId"] << " ";
               ofs << "stuName:" << this->m_orderData[i]["stuName"] << " ";
               ofs << "roomId:" << this->m_orderData[i]["roomId"] << " ";
               ofs << "status:" << this->m_orderData[i]["status"] << endl;
        }
        ofs.close();
}

student.cpp
#include "student.h"
#include "globalFile.h"
//默认构造
Student::Student()
{
}
//有参构造  参数:学号、姓名、密码
Student::Student(int id, string name, string pwd)
{
        //初始化属性
        this->m_Id = id;
        this->m_Name = name;
        this->m_Pwd = pwd;
        //初始化机房信息
        ifstream ifs;
        ifs.open(COMPUTER_FILE,ios::in);
        ComputerRoom com;
        while (ifs>>com.m_ComId && ifs >> com.m_MaxNum)
        {
               //将就读的信息放入到  容器中
               vCom.push_back(com);
        }
        ifs.close();
}
//菜单界面
void Student::operMenu()
{
        cout << "欢迎学生代表:" << this->m_Name << "登录!" << endl;
        cout << "\t\t ---------------------------------------\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               1.申请预约              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               2.查看我的预约          |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               3.查看所有预约          |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               4.取消预约              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               0.注销登录              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t ---------------------------------------\n";
        cout << "输入您的选择:";
}
//申请预约
void Student::applyOrder()
{
        cout << "机房开放时间为周一至周五!" << endl;
        cout << "请输入申请预约的时间:" << endl;
        cout << "1.周一" << endl;
        cout << "2.周二" << endl;
        cout << "3.周三" << endl;
        cout << "4.周四" << endl;
        cout << "5.周五" << endl;
        int date = 0;  //日期
        int interval = 0; //时间段
        int room = 0;  //机房编号
        while (true)
        {
               cin >> date;
               if (date >= 1 && date <= 5)
               {
                       break;
               }
               cout << "输入有误,请重新输入" << endl;
        }
        cout << "请输入申请预约时间段:" << endl;
        cout << "1.上午 "<< endl;
        cout << "2.下午 " << endl;
        while (true)
        {
               cin >> interval;
               if (interval >= 1 && interval <= 2)
               {
                       break;
               }
               cout << "输入有误,请重新输入" << endl;
        }
        cout << "请选择机房:" << endl;
        for (int i = 0; i < vCom.size(); i++)
        {
               cout << vCom[i].m_ComId << "号机房容量为:" << vCom[i].m_MaxNum << endl;
        }
        while (true)
        {
               cin >> room;
               if (room >= 1 && room <= 3)
               {
                       break;
               }
               cout << "输入有误,请重新输入" << endl;
        }
        cout << "预约成功!审核中" << endl;
        ofstream ofs;
        ofs.open(ORDER_FILE,ios::app);
        ofs << "date:" << date << " ";
        ofs << "interval:" << interval << " ";
        ofs << "stuId:" <<this->m_Id << " ";
        ofs << "stuName:" << this->m_Name << " ";
        ofs << "roomId:" << room << " ";
        ofs << "status:" << 1 << endl;
        ofs.close();
        system("pause");
        system("cls");
}
//查看自身预约
void Student::showMyOrder()
{
        OrderFile of;
        if (of.m_Size == 0)
        {
               cout << "无预约记录!" << endl;
               system("pause");
               system("cls");
               return;
        }
        for (int i = 0; i < of.m_Size; i++)
        {
               //string 转 int
               //string 利用 .c_str()转const char *
               //利用atoi(const char *)转int
               if (this->m_Id == atoi(of.m_orderData[i]["stuId"].c_str()))
               {
                       cout<<"预约日期:周"<<of.m_orderData[i]["date"];
                       cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
                       cout << " 机房号 " << of.m_orderData[i]["roomId"];
                       string status = "状态:";
                       //1.审核中 2.已预约 -1 预约失败 0取消预约
                       if (of.m_orderData[i]["status"] == "1")
                       {
                              status += "审核中";
                       }
                       else if(of.m_orderData[i]["status"]=="2")
                       {
                              status += "预约成功";
                       }
                       else if(of.m_orderData[i]["status"]=="-1")
                       {
                              status += "预约失败,审核未通过";
                       }
                       else
                       {
                              status += "预约已取消";
                       }
                       cout << status << endl;
               }
        }
}
//查看所有预约
void Student::showAllorder()
{
        OrderFile of;
        if (of.m_Size == 0)
        {
               cout << "无预约记录" << endl;
               system("pause");
               system("cls");
               return;
        }
        for (int i = 0; i < of.m_Size; i++)
        {
               cout << i + 1 << " 、";
               cout << "预约日期:周" << of.m_orderData[i]["date"];
               cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
               cout << " 学号:" << of.m_orderData[i]["stuId"];
               cout << " 姓名:" << of.m_orderData[i]["stuName"];
               cout << " 机房编号:" << of.m_orderData[i]["roomId"];
               string status = " 状态:";
               //1.审核中 2.已预约 -1预约·失败 0 取消预约
               if (of.m_orderData[i]["status"] == "1")
               {
                       status += "审核中";
               }
               else if (of.m_orderData[i]["status"] == "2")
               {
                       status += "预约成功";
               }
               else if (of.m_orderData[i]["status"] == "-1")
               {
                       status += "预约失败,审核未通过";
               }
               else
               {
                       status += "预约已取消";
               }
               cout << endl;
               
        }
        system("pause");
        system("cls");
}
//取消预约
void Student::cancelOrder()
{
        OrderFile of;
        if (of.m_Size == 0)
        {
               cout << "无预约记录" << endl;
               system("pause");
               system("cls");
               return;
        }
        cout << "审核中或预约成功的记录可以取消,请输入取消的记录" << endl;
        vector<int>v;  //存放在最大容器中的下标编号
        int index = 1;
        for (int i = 0; i < of.m_Size; i++)
        {
               //先判断是自身学号
               if (this->m_Id == atoi(of.m_orderData[i]["stuId"].c_str()))
               {
                       //再筛选状态  审核中或预约成功
                       if (of.m_orderData[i]["status"] == "1" ||  of.m_orderData[i]["status"] == "2")
                       {
                              v.push_back(i);
                              cout << index++ << " 、";
                              cout << "预约日期:周" << of.m_orderData[i]["date"];
                              cout << "时间段:" << (of.m_orderData[i]["interval"] == "1"  ? "上午" : "下午");
                              cout << "机房编号:" << of.m_orderData[i]["roomId"];
                              string status = "状态:";
                              if (of.m_orderData[i]["status"] == "1")
                              {
                                      status += "审核中";
                              }
                              else if (of.m_orderData[i]["status"] == "2")
                              {
                                      status += "预约成功";
                              }
                              cout << status << endl;
                       }
                       
               }
        }
        cout << "请输入取消的记录,0代表返回" << endl;
        int select = 0;
        while (true)
        {
               cin >> select;
               if (select >= 0 && select <= v.size())
               {
                       if (select == 0)
                       {
                              break;
                       }
                       else
                       {
                              of.m_orderData[v[select - 1]]["status"] = "0";
                              of.updateOrder();
                              cout << "已取消预约" << endl;
                              break;
                       }
               }
               cout << "输入有误,请重新输入" << endl;
        }
        system("pause");
        system("cls");
}

teacher.cpp
#include "teacher.h"
//默认构造
Teacher::Teacher()
{
}
//有参构造
Teacher::Teacher(int empId, string name, string pwd)
{
        //初始化属性
        this->m_EmpId = empId;
        this->m_Name = name;
        this->m_Pwd = pwd;
}
//菜单界面
void Teacher::operMenu()
{
        cout << "欢迎学生代表:" << this->m_Name << "登录!" << endl;
        cout << "\t\t ---------------------------------------\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               1.查看所有预约          |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               2.审核预约              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t|               0.注销登录              |\n";
        cout << "\t\t|                                       |\n";
        cout << "\t\t ---------------------------------------\n";
        cout << "输入您的选择:"<< endl;
}
//查看所有预约
void Teacher::showAllOrder()
{
        OrderFile of;
        if (of.m_Size == 0)
        {
               cout << "无预约记录" << endl;
               system("pause");
               system("cls");
               return;
        }
        for (int i = 0; i < of.m_Size; i++)
        {
               cout << i + 1 << " 、";
               cout << "预约日期:周" << of.m_orderData[i]["date"];
               cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
               cout << " 学号:" << of.m_orderData[i]["stuId"];
               cout << " 姓名:" << of.m_orderData[i]["stuName"];
               cout << " 机房编号:" << of.m_orderData[i]["roomId"];
               string status = " 状态:";
               //1 审核中 2 已预约 -1 预约失败  0 取消预约
               if (of.m_orderData[i]["status"] == "1")
               {
                       status += "审核中";
               }
               else if (of.m_orderData[i]["status"] == "2")
               {
                       status += "预约成功";
               }
               else if(of.m_orderData[i]["status"]=="-1")
               {
                       status += "预约失败,审核未通过";
               }
               else
               {
                       status += "预约已取消";
               }
               cout << status << endl;
        }
        system("pause");
        system("cls");
}
//审核预约
void Teacher::validOrder()
{
        OrderFile of;
        if (of.m_Size == 0)
        {
               cout << "无预约记录" << endl;
               system("pause");
               system("cls");
               return;
        }
        vector<int>v;
        int index = 0;
        cout << "待审核的预约记录如下:" << endl;
        for (int i = 0; i < of.m_Size; i++)
        {
               if (of.m_orderData[i]["status"] == "1")
               {
                       v.push_back(i);
                       cout << ++index << "、 ";
                       cout << "预约日期:周" << of.m_orderData[i]["date"];
                       cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
                       cout << " 学号:" << of.m_orderData[i]["stuId"];
                       cout << " 姓名:" << of.m_orderData[i]["stuName"];
                       cout << " 机房编号:" << of.m_orderData[i]["roomId"];
                       string status = " 状态:审核中";
                       cout << status << endl;
               }
        }
        cout << "请输入审核的预约记录,0代表返回" << endl;
        int select = 0;        //接收用户选择的预约记录
        int ret = 0; //接收预约结果记录
        while (true)
        {
               cin >> select;
               if (select >= 0 && select <= v.size())
               {
                       if (select == 0)
                       {
                              break;
                       }
                       else
                       {
                              cout << "请输入审核结果" << endl;
                              cout << "1.通过" << endl;
                              cout <<"2.不通过" << endl;
                              cin >> ret;
                              if (ret == 1)
                              {
                                      //通过情况
                                      of.m_orderData[v[select - 1]]["status"] = "2";
                              }
                              else
                              {
                                      //不通过情况
                                      of.m_orderData[v[select - 1]]["status"] = "-1";
                              }
                              of.updateOrder(); //更新预约记录
                              cout << "审核完毕" << endl;
                              break;
                       }
               }
               cout << "输入有误,请重新输入!" << endl;
        }
        system("pause");
        system("cls");
}

机房预约系统.cpp
#include <iostream>
using namespace std;
#include "Identity.h"
#include <fstream>
#include <string>
#include "globalFile.h"
#include "student.h"
#include "teacher.h"
#include "manager.h"
//进入学生子菜单界面
void studentMenu(Identity* &student)
{
        while (true)
        {
               //调用学生子菜单
               student->operMenu();
               Student * stu = (Student *)student;
               int select = 0;
               cin >> select; //接收用户选择
               if (select == 1)//申请预约
               {
                       stu->applyOrder();
               }
               else if(select==2) //查看自身预约
               {
                       stu->showMyOrder();
               }
               else if (select == 3) //查看所有人预约
               {
                       stu->showAllorder();
               }
               else if (select == 4) //取消预约
               {
                       stu->cancelOrder();
               }
               else
               {
                       //注销登录
                       delete student;
                       cout << "注销成功" << endl;
                       system("pause");
                       system("cls");
                       return;
               }
        }
}
//进入教师子菜单界面
void teacherMenu(Identity*&teacher)
{
        while (true)
        {
               //调用子菜单界面
               teacher->operMenu();
               Teacher*tea = (Teacher*)teacher;
               int select = 0;        //接收用户选择
               cin >> select;
               if (select == 1)//查看所有预约
               {
                       tea->showAllOrder();
               }
               else if(select==2)//审核预约
               {
                       tea->validOrder();
               }
               else
               {
                       delete teacher;
                       cout << "注销成功" << endl;
                       system("pause");
                       system("cls");
                       return;
               }
        }
}
//进入管理员子菜单界面
void managerMenu(Identity * &manager)
{
        while (true)
        {
               //调用管理员子菜单
               manager->operMenu();
               //将父类指针转为子类指针,调用子类里其他接口
               Manager * man = (Manager*)manager;
               int select = 0;
               //接收用户选择
               cin >> select;
               if (select == 1)//添加账号
               {
               //      cout << "添加账号" << endl;
                       man->addPerson();
               }
               else if (select == 2) //查看账号
               {
               //      cout << "查看账号" << endl;
                       man->showPerson();
               }
               else if(select ==3 )//查看机房
               {
               //      cout << "查看机房" << endl;
                       man->showComputer();
               }
               else if (select == 4)//清空预约
               {
               //      cout << "清空预约" << endl;
                       man->cleanFile();
               }
               else
               {
                       delete manager; //销毁掉堆区对象
                       cout << "注销成功" << endl;
                       system("pause");
                       system("cls");
                       return;
               }
        }
}
//登录功能
void LoginIn(string fileName, int type)
{
        //父类指针,用于指向子类对象
        Identity * person = NULL;
        //读文件
        ifstream ifs;
        ifs.open(fileName, ios::in);
        //判断文件是否存在
        if (!ifs.is_open())
        {
               cout << "文件不存在" << endl;
               ifs.close();
               return;
        }
        //接收用户的信息
        int id = 0;
        string name;
        string pwd;
        //判断身份
        if (type == 1)//学生身份
        {
               cout << "请输入你的学号:" << endl;
               cin >> id;
        }
        else if(type==2)
        {
               cout << "请输入您的职工号:" << endl;
               cin >>id;
        }
        cout << "请输入用户名:" << endl;
        cin >> name;
        cout << "请输入密码:" << endl;
        cin >> pwd;
        if (type == 1)
        {
               //学生身份验证
               int fId;       //从文件中读取的id号
               string fName;  //从文件中获取的姓名
               string fPwd;   //从文件中获取密码
               while (ifs >> fId && ifs >> fName && ifs >> fPwd)
               {
                       //与用户输入的信息做对比
                       if (id == fId && name == fName && pwd == fPwd)
                       {
                              cout << "学生验证登录成功!" << endl;
                              system("pause");
                              system("cls");
                              person = new Student(id, name, pwd);
                              //进入学生身份的子菜单
                              studentMenu(person);
                              return;
                       }
               }
        }
        else if (type == 2)
        {
               //教师身份验证
               int fId;       //从文件中获取的id号
               string fName; //从文件中获取的姓名
               string fPwd; //从文件中获取的密码
               while (ifs>>fId && ifs>>fName && ifs>>fPwd)
               {
                       if (fId == id && fName == name && fPwd == pwd)
                       {
                              cout << "教师验证登陆成功!" << endl;
                              system("pause");
                              system("cls");
                              person = new Teacher(id,name,pwd);
                              //进入教师子菜单
                              teacherMenu(person);
                              return;
                       }
               }
        }
        else if (type == 3)
        {
               //管理员身份验证
               string fName;  //从文件中获取姓名
               string fPwd;   //从文件名中获取密码
               while (ifs >> fName && ifs >> fPwd)
               {
                       if (name == fName && pwd == fPwd)
                       {
                              cout << "管理员验证登录成功!" << endl;
                              system("pause");
                              system("cls");
                              //创建管理员对象
                              person = new Manager(name, pwd);
                              //进入管理员子菜单
                              managerMenu(person);
                              return;
                       }
               }
        }
        
        cout << "验证登录失败!" << endl;
        system("pause");
        system("cls");
}
int main()
{
        int select = 0;//初始化接受用户输入的变量
        
        while (true)
        {
               cout << "=============  欢迎来到我的机房预约系统 =============" << endl;
               cout << endl << "请输入您的身份" << endl;
               cout << "\t\t ---------------------------------------\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t|               1.学生代表              |\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t|               2.老     师             |\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t|               3.管  理 员             |\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t|               0.退     出             |\n";
               cout << "\t\t|                                       |\n";
               cout << "\t\t ---------------------------------------\n";
               cout << "输入您的选择:";
               cin >> select; //接收用户选择
               switch (select)//根据用户选择  事现不同接口
               {
               case 1: //学生身份
                       LoginIn(STUDENT_FILE, 1);
                       break;
               case 2: //老师身份
                       LoginIn(TEACHER_FILE, 2);
                       break;
               case 3: //管理员身份
                       LoginIn(ADMIN_FILE, 3);
                       break;
               case 0: //退出系统
                       cout << "欢迎下一次使用" << endl;
                       system("pause");
                       return 0;
                       break;
               default:
                       cout << "您输入有误,请重新选择!" << endl;
                       system("pause");
                       system("cls");
                       break;
               }
        }
        system("pause");
        return 0;
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 黑马机房预约系统是一款用于管理和预约机房资源的系统。该系统可以方便高效地帮助用户进行机房预约和管理。 首先,该系统提供了一个用户界面,用户可以通过该界面浏览机房的可用时间和预约情况。用户可以根据自己的需要选择合适的时间段进行预约。 其次,系统还提供了预约管理功能。管理员可以登录系统进行机房资源的管理和调度。管理员可以查看所有预约情况,对预约进行审核和处理。如果有冲突或者其他问题,管理员可以通过系统与用户进行沟通和协商。 此外,该系统还提供了提醒功能。系统会在预约时间将近时给用户发送短信或者邮件提醒,确保用户不会忘记约定的使用时间。 黑马机房预约系统的好处是多方面的。首先,它提高了机房资源的利用率,避免了资源的浪费。通过合理的调度和管理,可以确保尽可能多的用户能够享受到机房的使用权。其次,该系统提供了便利的预约和管理功能,方便了用户和管理员的操作,节省了时间和精力。最后,该系统的提醒功能可以避免预约的遗忘,提高了效率和准确性。 总之,黑马机房预约系统是一款方便实用的系统,可以有效管理和预约机房资源,提高资源利用率和用户满意度。 ### 回答2: 黑马机房预约系统是一个方便学生预约机房使用的系统。这个系统主要有以下几个功能: 1. 预约机房:学生可以通过系统预约机房的使用时间。他们可以选择日期和时间段,并在系统中查看机房的实时可用情况。这有助于有效安排机房的使用,避免冲突和浪费。 2. 查看预约记录:学生可以通过系统查看他们的预约记录。这包括他们预约的日期,时间段以及预约成功与否的状态。这一功能方便他们随时了解自己的预约情况以及进行相应的调整。 3. 取消预约:对于一些情况下无法按计划使用机房的学生,他们可以通过系统取消预约。这样可以及时释放机房资源,方便其他学生进行预约。 4. 管理员权限:系统设有管理员权限,负责管理机房资源和学生预约情况。管理员可以查看机房使用情况,审核和确认学生的预约申请。他们还可以处理预约冲突和问题,确保机房资源的最有效利用。 5. 通知功能:系统可以通过短信、邮件等方式通知学生预约情况的变化,以及管理员的审核结果等。这样,学生能及时了解自己的预约状态,管理员也能更方便地与学生进行沟通。 总之,黑马机房预约系统通过有效的预约管理和信息传递,方便了学生对机房的使用,提升了机房资源的利用率。它是一个便捷、高效的工具,为学生和管理员带来了更好的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑马金牌编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值