📄 libsystem.cpp
字号:
#include "List.h"
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <conio.h>
char USERTYPE[10]; //标志当前用户类型,进行权限管理,其中ADMIN具有3级权限,其中POWERUSER具有3级权限,其中USER具有3级权限,
bool BOOKFILE; //标志需要打开BOOKDATAS文件,向链表摸板中录入bookData类数据
bool USERFILE; //标志需要打开USERINFO文件,向链表摸板中录入userInfo类数据
bool READERFILE; //标志需要打开READERINFO文件,向链表摸板中录入readerInfo类数据
//**********************************************************************************
//进行当前用户权限验证 。其中ADMIN具有3级权限,其中POWERUSER具有3级权限,其中USER具有3级权限,
//通过级别验证返回TRUE,否则返回FALSE。
bool POPEDOM(int PopedomRequire) //PopedomRequire:当前要求权限等级
{ //其中ADMIN具有3级权限,其中POWERUSER具有3级权限,其中USER具有3级权限,
int popedom;
if(strcmp(USERTYPE,"USER") == 0)
popedom = 1;
if(strcmp(USERTYPE,"POWERUSER") == 0)
popedom = 2;
if(strcmp(USERTYPE,"ADMIN") == 0)
popedom = 3;
if(popedom < PopedomRequire)
{
cout<<"您的权限不够,不能访问此功能!"<<endl<<endl;
cout<<"按任意键继续.........."<<endl<<endl;
getch();
return false;
}
else
return true;
}
//**********************************************************************************
//打开特定文件,初始化LIST。
//此函数中用IF语句进行判断打开文件的顺序不能变,因为主程序中对对象初始化有顺序要求
template <class T>
void FILEOPEN(List <T> & list) //打开特定文件,初始化LIST,
{
fstream file;
if(USERFILE == true) //USERFILE标志打开USERINFO文件
file.open("USERINFO.txt",ios::in|ios::binary);
else if(READERFILE == true) //READERFILE标志打开READERINFO文件
file.open("READERINFO.txt",ios::in|ios::binary);
else if(BOOKFILE == true) //BOOKFILE标志打开BOOKDATAS文件
file.open("BOOKDATAS.txt",ios::in|ios::binary);
else
{
cout<<"打开文件初始化LIST时选择出错!"<<endl;
cout<<"按任意键继续.........."<<endl<<endl;
getch();
return;
}
if(!file)
{
cout<<"文件打开失败!";
return;
}
if(!file.eof())
list.creatList(file); //使用当前打开文件创建链表
file.close();
return ;
}
//************************************************************************************
//主菜单
void MAINMENU()
{
void SEARCHMENU(); //信息查询菜单
void CHECKMENU(); //借书菜单
void RETURNBOOKMENU(); //还书菜单
void LIBABOUTMENU(); //书库管理菜单
void USERABOUT(); //用户管理菜单
void READERABOUT(); //读者管理菜单
char select;
for(;;)
{
system("cls");
cout<<"********************************************************************************";
cout<<"**********************************"<<"图 书 馆 理 系 统"<<"*****************************";
cout<<"**********************************************************************作者:孔辉"<<endl<<endl;
cout<<setw(47)<<"主 菜 单"<<endl<<endl<<endl<<endl;
cout<<setw(48)<<"a.信 息 查 询"<<endl
<<setw(48)<<"b.图 书 借 阅"<<endl //含超期罚款
<<setw(48)<<"c.还 书 管 理"<<endl
<<setw(48)<<"d.书 库 管 理"<<endl
<<setw(48)<<"e.用 户 管 理"<<endl
<<setw(48)<<"f.读 者 管 理"<<endl
<<setw(48)<<"g.退 出 系 统"<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"请输入相应的序号进行(a~g)选择:"<<endl;
select = getch();
switch(select)
{
case 'a': cout<<endl<<endl<<endl;
SEARCHMENU(); //信息查询菜单
break;
case 'b': cout<<endl<<endl<<endl;
CHECKMENU(); //借书菜单
break;
case 'c': cout<<endl<<endl<<endl;
RETURNBOOKMENU(); //还书菜单
break;
case 'd': cout<<endl<<endl<<endl;
LIBABOUTMENU(); //书库管理菜单
break;
case 'e': cout<<endl<<endl<<endl;
USERABOUT(); //用户管理菜单
break;
case 'f': cout<<endl<<endl<<endl;
READERABOUT(); //读者管理菜单
break;
case 'g': return;
default: cout<<"输入有误!请重新输入:"<<endl;
break;
}
}
return;
}
//**************************************************************************************
//登录页面
void ENTRYMENU()
{
List<userInfo> UserList;
userInfo FirstUser; //创建链表
USERFILE = true; //标志打开USERFILE文件
dataNode<userInfo> * curNodePtr;//由来接受UserList.returnCurPtr()返回的当前数据的地址,
//以对该数据进行操作
// userInfo UserForCheck;
FILEOPEN(UserList);
char userName[30];
char passWord[30];
if(UserList.listIsEmpty()) //判断系统是否第一次使用
{
cout<<"本系统第一次使用,请输入管理员信息:"<<endl;
FirstUser.setForFirst(); //设置第一个用户信息,其中以默认权限为ADMIN
UserList.insert(FirstUser);
strcpy(USERTYPE,FirstUser.getType()); //设置当前用户类型
cout<<"按任意键继续.........."<<endl<<endl;
getch();
}
else
{
for(;strcmp(passWord,"n");) //退出按n
{
cout<<"请输入用户名:"<<endl;
cin>>userName;
if(!UserList.search(userName)) //查询用户是否存在
cout<<"该用户不存在!请重新输入:"<<endl;
else
{
curNodePtr = UserList.returnCurPtr();
cout<<"请输入密码:"<<endl;
for(int i=1; i<=3&&strcmp(passWord,"n");i++)
{
cin>>passWord;
if(!strcmp(passWord,(curNodePtr->data).getPassword())) //验证密码
{
strcpy(USERTYPE,(curNodePtr->data).getType()); //设置当前用户类型
// USERTYPE = (curNodePtr->data).type;
cout<<"登录成功!按任意键继续.........."<<endl;
getch();
return;
}
else
cout<<"密码输入不正确!请重新输入:(退出请按n)"<<endl;
}
}
}
exit(0);
}
}
//************************************************************************************
//信息查询页面菜单
void SEARCHMENU()
{
char select;
for(;;)
{
system("cls"); //清屏
cout<<"********************************************************************************";
cout<<"**********************************"<<"图 书 馆 理 系 统"<<"*****************************";
cout<<"********************************************************************************"<<endl<<endl;
cout<<setw(47)<<"信 息 查 询"<<endl<<endl<<endl<<endl
<<setw(45)<<"a. 书库列表"<<endl
<<setw(49)<<"b. 图书信息查询"<<endl
<<setw(49)<<"c. 用户信息查询"<<endl
<<setw(49)<<"d. 读者信息查询"<<endl
<<setw(47)<<"e. 返回主菜单"<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"请输入相应的序号进行(a~e)选择:"<<endl;
select = getch();
switch(select)
{
case 'a': BOOKFILE = true; //标志打开BOOKDATAS文件
{ //括号用来限制LIST类对象的生存期,本选项结束时系统将调用析构函数,
//在析构函数中将重新向文件写入更新后的数据
List<bookData> bookList;//创建链表
FILEOPEN(bookList); //打开特定文件,初始化LIST。
cout<<"显示所有数据:"<<"共条"<<bookList.getTotal()<<"数据。"<<endl;
//LIST类的getTotal()将返回链表中数据的总数
bookList.displayAllData();
//LIST类的displayAllData()将显示链表中的所有数据,并根据权限不同显示不同的信息
}
cout<<"按任意键继续.........."<<endl<<endl;
getch();
break;
case 'b': BOOKFILE = true; //标志打开BOOKDATAS文件
{ //括号用来限制LIST类对象的生存期,本选项结束时系统将调用析构函数,
//在析构函数中将重新向文件写入更新后的数据
List<bookData> bookList;//创建链表
char bookInfo[14];
FILEOPEN(bookList);
cout<<"请输入要查询的图书的ISBN号、作者、书名或出版社进行查询:"<<endl;
cin>>bookInfo;
if(!bookList.search(bookInfo))//search(bookInfo)如果没有查到图书信息将返回FALSE,否则返回TRUE
cout<<"没有查到数据。"<<endl;
else
cout<<"查找的数据:"<<endl<<bookList.returnCurData()<<endl;//返回当前链表中检索到的数据
}
cout<<"按任意键继续.........."<<endl<<endl;
getch();
break;
case 'c': if(!POPEDOM(2))
break;
USERFILE = true; //标志需要打开USERINFO文件
{ //括号用来限制LIST类对象的生存期,本选项结束时系统将调用析构函数,
//在析构函数中将重新向文件写入更新后的数据
List<userInfo> userList;//创建链表
char userName[10];
FILEOPEN(userList);
cout<<"请输入要查询的用户名:"<<endl;
cin>>userName;
if(!userList.search(userName))//search(userName)如果没有查到用户信息将返回FALSE,否则返回TRUE
cout<<"没有查到数据。"<<endl;
else
cout<<"查找的数据:"<<endl<<userList.returnCurData()<<endl;//返回当前链表中检索到的数据
}
cout<<"按任意键继续.........."<<endl<<endl;
getch();
break;
case 'd': READERFILE = true; //标志打开READERINFO文件
{
//括号用来限制LIST类对象的生存期,本选项结束时系统将调用析构函数,
//在析构函数中将重新向文件写入更新后的数据
List<readerInfo> readerList;//创建链表
char readerID[10];
FILEOPEN(readerList);
cout<<"请输入要查询的读者信息:"<<endl;
cin>>readerID;
if(!readerList.search(readerID))//search(readerID)如果没有查到读者信息将返回FALSE,否则返回TRUE
cout<<"没有查到数据。"<<endl;
else
cout<<"查找的数据:"<<endl<<readerList.returnCurData()<<endl;//返回当前链表中检索到的数据
}
cout<<"按任意键继续.........."<<endl<<endl;
getch();
break;
case 'e': cout<<endl<<endl<<endl; return;
default: cout<<"输入有误!请重新输入:"<<endl;break;
}
}
return;
}
//**************************************************************************************
void CHECKMENU()
{
if(!POPEDOM(2))//权限验证,通过返回TRUE,否则返回FALSE,此处级别要求为2
return;
dataNode<bookData> * curBookNodePtr;//由来接受UserList.returnCurPtr()返回的当前数据的地址,
//以对该数据进行操作
dataNode<readerInfo> * curReaderNodePtr;//由来接受UserList.returnCurPtr()返回的当前数据的地址,
//以对该数据进行操作
char select;
for(;;)
{
system("cls");
cout<<"********************************************************************************";
cout<<"**********************************"<<"图 书 馆 理 系 统"<<"*****************************";
cout<<"********************************************************************************"<<endl<<endl;
cout<<setw(47)<<"图 书 借 阅"<<endl<<endl<<endl<<endl
<<setw(45)<<"a. 图书借阅"<<endl //含超期罚款(由于时间紧迫没有完成)
<<setw(45)<<"b. 还款管理"<<endl //根据书的性质设置超期罚款比率(由于时间紧迫没有完成)
<<setw(49)<<"c. 图书信息查询"<<endl
<<setw(49)<<"d. 读者信息查询"<<endl
<<setw(45)<<"e. 书库列表"<<endl
<<setw(47)<<"f. 返回主菜单"<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"请输入相应的序号进行(a~f)选择:"<<endl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -