涉及到的知识有:面向对象的思想、泛型编程思想、STL的使用、文件的读写操作
项目需求:
1.创建主界面
2.定义身份类(父类)
学生、老师以及管理员都有用户名和密码的属性,这是他们的共性,所以可以通过继承实现
对于不同人的显示功能方法不同,可以通过多态(纯虚函数)重写。
创建三个类student、teacher、manager
3.全局文件
本项目将不同身份的数据存放在不同的文件中,可以将文件名宏定义到一个全局文件中,在后面写操作时会有智能联想,方便文件管理。
4.登录函数
根据不同的用户选择不同的身份登录
在system.cpp文件中添加全局函数 LoginIn(string filename,int type)
filename:操作的文件,调用不同文件的数据进行用户比对。
type:登录的身份
5.管理员模块
5.1管理员登录与注销
//用父类指针Identity* 接收上面创建的父类对象->子类对象void managerMenu(Identity* &manager){while (true){//登陆界面manager->open_menu();//父类指针强转为子类指针,不然父类指针只能调用公共部分的接口Manager* m = (Manager*)manager;//manager只有三个接口,m有七个接口int select = 0;cin >> select;if (select == 1) //添加账号{m->add_person();}else if (select == 2) //查看账号{m->show_person();}else if (select == 3) //查看机房{m->show_house();}else if (select == 4) //清空预约{m->clear();}//注销退出else {delete manager;cout << "注销成功!" << endl;system("pause");system("cls");return;}}}
int main(){LoginIn(ADMIN_FILE, 3);}void LoginIn(string filename,int type){if (type == 3){while(ifs >> fname && ifs >> fpw){if (name == fname && pw == fpw){cout << "管理员验证登录成功!" << endl;system("pause");system("cls");person = new Manager(name, pw);//进入管理员的子菜单界面managerMenu(person);return;}}}}
5.2添加账号
1、添加功能操作
写文件
void test(){ofstream ofs;ofs.open("test.txt", ios::out);ofs << "姓名:张三" << ' '<< "性别:男" << ' ' << "年龄:18" <<endl;cout << "写入成功!" << endl;ofs.close();}
void Manager::add_person(){cout << "请输入添加账号的类型" << endl;cout << "1、添加学生" << endl;cout << "2、添加老师" << endl;ofstream ofs;string filename;string tip;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 pw;cout << tip; //妙cin >> id;cout << "请输入姓名:";cin >> name;cout << "请输入密码:";cin >> pw;ofs << id << ' ' << name << ' ' << pw << ' ' << endl;cout << "添加成功!" << endl;system("pause");system("cls");ofs.close();}
2、去重操作
首先要获取到学生和老师的账号信息
新建容器Vector(Student)和Vector(Teacher)用于存放学生和老师的账号信息
读文件
void test(){ifstream ifs;ifs.open("test.txt", ios::in);person p;ifs >> p.m_id << endl;cout << "读取成功!" << endl;ifs.close();}
void Manager::InitVector(){//确保容器为空,然后再将数据读取进来对比vStu.clear();vTea.clear();ifstream ifs;//统计学生信息ifs.open(STUDENT_FILE, ios::in);if (!ifs.is_open()){cout << "文件读取失败!" << endl;return;}Student s;while (ifs >> s.m_id && ifs >> s.m_name && ifs >> s.m_pw){vStu.push_back(s);}ifs.close();//统计老师信息ifs.open(TEACHER_FILE, ios::in);if (!ifs.is_open()){cout << "文件读取失败!" << endl;return;}Teacher t;while (ifs >> t.m_empID && ifs >> t.m_name && ifs >> t.m_pw){vTea.push_back(t);}ifs.close();}
在添加账号前进行验证是否已重复添加(姓名可重复,学号/职工号不能重复),如果重复就重新添加
void Manager::add_person(){//检查添加的名字是否重复while (true){cin >> id;bool ret = this->cheak_same(id, select);if (ret){cout << errorTip << endl; //妙cout << tip;}elsebreak;}}
