涉及到的知识有:面向对象的思想、泛型编程思想、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;
}
else
break;
}
}