目录
2.2 管理类(CRRSManangement.h & CRRSManangement.cpp)
2.2.4 管理员登录分支(showAdminMenu())
1. 作业内容
1.1 系统简介
学校现有几个规格不同的机房,由于使用时经常出现"撞车"现象,现开发一套机房预约系统,解决这一问题。
1.2 身份简介
分别有三种身份使用该程序
-
学生代表:申请使用机房
-
教师:审核学生的预约申请
-
管理员:给学生、教师创建账号
1.3 机房简介
-
机房总共有3间
-
1号机房 --- 最大容量20人
-
2号机房 --- 最多容量50人
-
3号机房 --- 最多容量100人
1.4 申请简介
-
申请的订单每周由管理员负责清空。
-
学生可以预约未来一周内的机房使用,预约的日期为周一至周五,预约时需要选择预约时段(上午、下午)
-
教师来审核预约,依据实际情况审核预约通过或者不通过
1.5 系统具体要求
-
首先进入登录界面,可选登录身份有:
-
学生代表
-
老师
-
管理员
-
退出
-
-
每个身份都需要进行验证后,进入子菜单
-
学生需要输入 :学号、姓名、登录密码
-
老师需要输入:职工号、姓名、登录密码
-
管理员需要输入:管理员姓名、登录密码
-
-
学生具体功能
-
申请预约 --- 预约机房
-
查看自身的预约 --- 查看自己的预约状态
-
查看所有预约 --- 查看全部预约信息以及预约状态
-
取消预约 --- 取消自身的预约,预约成功或审核中的预约均可取消
-
注销登录 --- 退出登录
-
-
教师具体功能
-
查看所有预约 --- 查看全部预约信息以及预约状态
-
审核预约 --- 对学生的预约进行审核
-
注销登录 --- 退出登录
-
-
管理员具体功能
-
添加账号 --- 添加学生或教师的账号,需要检测学生编号或教师职工号是否重复
-
查看账号 --- 可以选择查看学生或教师的全部信息
-
查看机房 --- 查看所有机房的信息
-
清空预约 --- 清空所有预约记录
-
注销登录 --- 退出登录
-
2. 作业复盘
和上次一样,还是首先通过老师的作业内容构思如何写这次作业。然后复刻老师的程序输出内容,自己写自己的代码,作业结构如下:
2.1 主函数(CRRSMain.cpp)
主函数是程序是入口,和以往的作业一样,首先显示菜单。提示用户输入选择功能,根据用户的输入跳转不同的功能。
程序运行时的界面如下:
主函数的内容如下:
#include"CRRSManagement.h"
int main()
{
CRRSManager crrsm;
int userSelect = 0;
while (true)
{
crrsm.showL1Menu();
cout << "Please enter your select:" << endl;
cin >> userSelect;
switch (userSelect)
{
case 1: // Student branch
crrsm.showStudentMenu();
break;
case 2: // Teacher branch
crrsm.showTeacherMenu();
break;
case 3: // Admin branch
// show administrator menu after login.
crrsm.showAdminMenu();
break;
case 0: // Exit system
crrsm.exitSystem();
break;
default:
cout << "Wrong input, please input again." << endl;
system("pause");
system("cls");
break;
}
}
system("pause");
return 0;
}
而首先调用的显示菜单函数我定义为: crrsm.showL1Menu();crrsm.showL1Menu();
如果用户选择学生登录,跳转showStudentMenu()函数;用户选择教师身份登录,跳转showTeacherMenu()函数;用户选择以管理员身份登录,跳转showAdminMenu()函数;如果用户输入0,退出系统,调用exitSystem()函数。
若用户输入了0、1、2、3之外的内容,则提示用户输入错误,请重新输入。放在default分支中。以上便是主函数的全部内容。
而其他的各项功能函数都注册在CRRSManagement类中。
2.2 管理类(CRRSManangement.h & CRRSManangement.cpp)
在管理类中,把需要使用到的功能函数都注册在其中。例如,通过分析刚才的主函数的几个功能。
管理类的头文件全部内容如下:
#pragma once
#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
#include<vector>
#include<cstdlib>
#include"Student.h"
#include"Teacher.h"
#include"Order.h"
using namespace std;
class CRRSManager
{
public:
CRRSManager();
// initialize vector
void initVector();
void initOrderVector();
// show L1 menu
void showL1Menu();
// show Admin menu
void showAdminMenu();
// administrator add accout
void addAccount();
// check wether id is repeat
bool checkRepeat(int id, int type);
// administrator view accout
void viewAccount();
// administrator show computer room
void viewComputerRoom();
// show Student menu
void showStudentMenu();
// student applay for an appointment
void stuApplyAppointment(int ID, string name);
// student view his/her own appointments
void stuViewOwnAppointment(int ID);
// view all appointments
void viewAllAppointment();
// Cancle student appointment
void cancaleAppointment(int ID);
// show teacher's menu
void showTeacherMenu();
// teacher audit appointment
void auditAppointment();
// administrator clear all the appointments
void clearAppointment();
// exit system
void exitSystem();
~CRRSManager();
public:
vector<Student> vStu;
vector<Teacher> vTech;
vector<Order> vOrder;
};
2.2.1 显示主菜单函数(showL1Menu())
就是一堆cout打印输出。
// show Main Menu
void CRRSManager::showL1Menu()
{
cout << "=============== Welcome to Computer Room Reservation System ===========" << endl;
cout << endl;
cout << "Please enter your identity" << endl;
cout << "\t\t----------------------------------- " << endl;
cout << "\t\t| 1. Student | " << endl;
cout << "\t\t| 2. Teacher | " << endl;
cout << "\t\t| 3. Administrator | " << endl;
cout << "\t\t| 0. Exit | " << endl;
cout << "\t\t----------------------------------- " << endl;
}
2.2.3 退出程序功能(exitSystem())
打印输出,告诉用户欢迎下次再来。 然后使用exi(0)退出程序就ok。
// exit system
void CRRSManager::exitSystem()
{
cout << "Welcome to use next time." << endl;
system("pause");
system("cls");
exit(0);
}
2.2.4 管理员登录分支(showAdminMenu())
之所以先写这个功能,是因为需要首先管理员登录之后创建出老师、学生的账户。
那么如何在程序运行之初就让管理员账户存在呢?我的想法是在管理类的构造函数中生成管理员账户,保存在本地。同样的,机房信息也是固定不变的,包括机房号码及容量。把它也可以在构造函数中进行创建。
通过构造,管理员的用户名及密码保存在了AdminFile中,我定义为".//admin.txt"。
#define AdminFile ".//admin.txt"
同样的,机房信息保存在ComRoom中,我定义为".//computerRoom.txt"。
#define ComRoom ".//computerRoom.txt"
构造函数内容如下:
CRRSManager::CRRSManager()
{
// initialize vector
CRRSManager::initVector();
// create admin database
ofstream ofs;
ofs.open(AdminFile,ios::trunc);
ofs << "admin";
ofs << " 123" << endl;
ofs.close();
ofs.open(ComRoom, ios::trunc);
ofs << "1";
ofs << " 20" << endl;
ofs << "2";
ofs << " 50" << endl;
ofs << "3";
ofs << " 100" << endl;
ofs.close();
}
有了管理员账户,就可以进行验证登录的操作。
通过读取本地文件,对字符串进行截取,获得用户名与密码。将本地文件中的用户名与密码与用户输入对比, 管理员分支的内容如下:
// show Admin menu
void CRRSManager::showAdminMenu()
{
ifstream ifs;
ifs.open(AdminFile,ios::in);
string temp;
getline(ifs, temp);
string adminName;
adminName = temp.substr(0, 5);
string adminPWD;
adminPWD = temp.substr(6, 9);
/*cout << adminName << endl;
cout << adminPWD << endl;*/
cout << "Please enter user name:" << endl;
string name;
cin >> name;
cout << "Please enter your password:" << endl;
string password;
cin >> password;
if (name == adminName && password == adminPWD)
{
// log in succeed