Files
Test/main.cpp

442 lines
16 KiB
C++
Raw Permalink Normal View History

2025-02-19 12:31:48 +01:00
#include <iostream>
#include <vector>
#include "user.h"
#include "zlecenie.h"
#include "ticket.h"
#include "animals.h"
#include <iomanip>
//#include "ui.h"
using std::cout;
using std::cin;
using std::string;
using std::endl;
using std::vector;
void AddUser(std::vector<User>& users_list, string login,string password, string name, string surname, int access_level){
users_list.push_back(User(login,password,name,surname,access_level));
}
// void AddZlecenie(std::vector<Zlecenie>& zlecenia,int id,string nazwa, string opis, string przypisany, int access_level){
// zlecenia.push_back(Zlecenie(id,nazwa,opis,przypisany));
// }
void Clear()
{
#if defined _WIN32
system("cls");
#elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
system("clear");
#elif defined (__APPLE__)
system("clear");
#endif
}
void Pause(){
cin.ignore();
do
{
cout << '\n' << "Zrobione, Nacisnij klawisz aby kontynuowac";
} while (cin.get() != '\n');
Clear();
}
void welcome(User* user){
cout<<"Zalogowano jako: "<<user->GetName()<<" "<<user->GetSurname()<<"\n";
}
void newticket(){
int typ = 0;
cout<<"----------------- Kupno Biletu -------------------------\n";
cout<<"\nwybierz jaki bilet chcesz kupic";
cout<<"\n1. Zwykly";
cout<<"\n2. Ulgowy\n";
cout<<": ";
cin>>typ;
cout<<"\n------ Oto dane twojego biletu, zapamietaj je -----------\n\n";
Ticket bilet(typ);
bilet.ticketInfo();
cout<<"\n---------------------------------------------------------\n";
}
void checkticket(string id){
Ticket bilet(id);
bilet.ticketValidityCheck();
}
void ticketchcecked(){
string id;
cout<<"Podaj id biletu: ";
cin>>id;
cout<<"\n";
Ticket bilet(id);
bilet.ticketUse();
}
User* authenticate(vector <User>& user_list,const string& login, const string& password){
for(auto& user : user_list){
if(user.authenticate(login,password)){
return &user;}
}
return nullptr;
}
void CreateUserForm(int powerlevel,std::vector<User>& lista){ //Funkcja dodaje formularz do tworzenia użytkowników
if(powerlevel<2){cout<<"Nie masz wystarczających uprawnień do tej operacji !\n";}
else {
string login,password,name,surname;
int newpowerlevel;
cout<<"Podaj imie nowego użytwkownika: ";
cin>>name;
cout<<"Podaj nazwisko nowego użytwkownika: ";
cin>>surname;
bool exist = true;
do{
cout<<"Podaj login nowego użytwkownika: ";
cin>>login;
for(auto& user : lista){
exist = user.checkifloginexist(login);
if(exist) break; //jesli uzytkownik istnieje to przerywa szukanie go w pliku
}
if(exist) cout<<"użytkowni o podanej nazwie istnieje, musisz podać inną nazwę";
}while(exist);
cout<<"Podaj haslo nowego użytwkownika: "; //do dopisania - sprawdzenie poprawnosci hasla, gwiazdki zamiast znaczkow
cin>>password;
if(powerlevel==2){newpowerlevel=2;} //jeśli użytkownika tworzy ;,,gość - użytkownik służacy do tworzenia użytkownikow
else{
cout<<"\nWybierz poziom uprawnien nowego użytwkownika: ";
cin>>newpowerlevel;
while(newpowerlevel>powerlevel or newpowerlevel<1){ //sprawdzenie czy użytkownik bedący moderatorem nei chce stworzyć użytkownika administatora
cout<<"\nTo nie jest poprawny poziom uprawnień, możesz jedynie wybrać zakres od 1 do "<< powerlevel <<"\nPodaj ponownie: ";
cin>>newpowerlevel;
}
}
AddUser(lista,login,password,name,surname,newpowerlevel);
cout<<"dodano użytkownika\n";
}
}
/*ten fragment moglby byc napisany z uzyciem wskaznikow i nawet byloby to zalecane ale nnie znalazlem jesszcze sposobu aby to zdzialalo z auto*/
string listusers(const vector<User>& user_list){
cout<<"\n----------------\n";
int i=0;
for(auto user:user_list){
cout<<i++<<". "<<user.GetName()<<" "<<user.GetSurname()<<endl;
}
cout<<"\n----------------\n";
cout<<"podaj numer użytkownika:";
i=0;
int numer;
cin>>numer;
for(auto user:user_list){
if(i==numer) return user.GetLogin();
i++;
}
return "nic";
}
void saveZlecenia(const vector<Zlecenie>& zlecenie_list,const string& filename){
std::ofstream outfile(filename);
if(outfile.is_open()){
for (auto zlecenie : zlecenie_list){ //dla kazdego uzytkownika w liscie
zlecenie.saveToFile(outfile);
}
outfile.close();
cout << "Zlecenia zapisane do pliku!" << endl;
}
else {
cout << "Błąd podczas otwierania pliku do zapisu!" << endl;
}
}
void NewZlecenie(const vector<User>& user_list,User* user,vector<Zlecenie>zlecenie_list,int id){
if(user->GetAccessLevel()<3) {
cout<<"Nie masz wystarczajacych uprawnien"; //prawdopodobnie sie nigdy nie wykona
return;
}
string nazwa,opis,przypisany;
cout<<"Wpisz nazwe nowego zlecenia: ";
cin.ignore();
std::getline(cin,nazwa);
cout<<"Podaj opis nowego zlecenia: ";
std::getline(cin,opis);
cout<<"Wybierz kogo chcesz przypisac do zlecenia: ";
przypisany = listusers(user_list);
zlecenie_list.push_back(Zlecenie(id,nazwa,opis,przypisany));
saveZlecenia(zlecenie_list,"zlecenia.txt");
}
void saveUsers(const vector <User>& user_list,const string& filename){
std::ofstream outfile(filename);
if(outfile.is_open()){
for (auto user : user_list){ //dla kazdego uzytkownika w liscie
user.saveToFile(outfile);
}
outfile.close();
cout << "Użytkownicy zapisani do pliku!" << endl;
}
else {
cout << "Błąd podczas otwierania pliku do zapisu!" << endl;
}
}
bool loadUsers(std::vector<User>& user_list, const std::string& filename) {
std::ifstream inFile(filename);
if (inFile.is_open()) {
try {
while (true) {
user_list.push_back(User::loadFromFile(inFile));
}
} catch (const std::runtime_error& e) {
// Wyświetl informację o błędzie, jeśli odczyt się nie powiedzie
if (!inFile.eof()) {
std::cerr << "Błąd odczytu użytkownika: " << e.what() << std::endl;
}
}
inFile.close();
return true;
} else {
std::cout << "Błąd odczytu, plik nie istnieje itp." << std::endl;
return false;
}
}
bool loadZlecenia(std::vector<Zlecenie>& zlecenie_list, const std::string& filename) { //skopiowane z users
std::ifstream inFile(filename);
if (inFile.is_open()) {
try {
while (true) {
zlecenie_list.push_back(Zlecenie::loadFromFile(inFile));
}
} catch (const std::runtime_error& e) {
// Wyświetl informację o błędzie, jeśli odczyt się nie powiedzie
if (!inFile.eof()) {
std::cerr << "Błąd odczytu użytkownika: " << e.what() << std::endl;
}
}
inFile.close();
return true;
} else {
std::cout << "Błąd odczytu, plik nie istnieje itp." << std::endl;
return false;
}
}
void animals_sound(vector<Animal*>& animals){
for (const auto& animal : animals) {
animal->voice(); // Wywołanie polimorficzne
}
}
void ShowZleceniafromuser(vector<Zlecenie>& zlecenie_list, User* user){
zlecenie_list.clear();
if(loadZlecenia(zlecenie_list, "zlecenia.txt")){ cout<<"";}
int input=-2;
while(input!=-1){
cout<<"\n-----Twoje zlecenia------\n";
int i=0;
cout << std::left << std::setw(5) << "Nr" << " | " << std::setw(20) << "Nazwa" << " | " << "ID" << endl;
cout << string(40, '-') << endl;
for(auto zlecenie: zlecenie_list){
if(zlecenie.GetPrzypisany()== user->GetLogin()){
cout << std::left << std::setw(5) << i++ << " | " << std::setw(20) << zlecenie.GetNazwa() << " | " << zlecenie.GetId() << endl;
}
}
cout<<"\n-------------------------";
cout<<"\nWpisz numer zlecenia aby zobaczyc zawartosc lub -1 aby wyjsc";
cin>>input;
i=0;
for(auto zlecenie: zlecenie_list){
if(zlecenie.GetPrzypisany()== user->GetLogin()){if(input==i){
Clear();
cout << std::left << std::setw(5) << i++ << " | " << std::setw(20) << zlecenie.GetNazwa() << " | " << zlecenie.GetId() << endl;
cout<<"----------------------\n";
cout<<zlecenie.GetOpis();
cout<<"\n----------------------\n";
}
i++;
}
}
Pause();
}
}
void ShowZleceniaall(vector<Zlecenie>& zlecenie_list){
zlecenie_list.clear();
if(loadZlecenia(zlecenie_list, "zlecenia.txt")){ cout<<"";}
int input=-2;
while(input!=-1){
cout<<"\n-----Wszystkie zlecenia------\n";
int i=0;
cout << std::left << std::setw(5) << "Nr" << " | " << std::setw(25) << "Nazwa" << " | " << "ID" <<" | " << "Przypisany Uzytkownik" << endl;
cout << string(40, '-') << endl;
for(auto zlecenie: zlecenie_list){
cout << std::left << std::setw(5) << i++ << " | " << std::setw(25) << zlecenie.GetNazwa() << " | " << zlecenie.GetId()<<" | " << zlecenie.GetPrzypisany() << endl;
}
cout<<"\n-------------------------";
cout<<"\nWpisz numer zlecenia aby zobaczyc zawartosc lub -1 aby wyjsc";
cin>>input;
i=0;
for(auto zlecenie: zlecenie_list){
if(input==i){
Clear();
cout << std::left << std::setw(5) << "Nr" << " | " << std::setw(25) << "Nazwa" << " | " << "ID" <<" | " << "Przypisany Uzytkownik" << endl;
cout << std::left << std::setw(5) << i++ << " | " << std::setw(25) << zlecenie.GetNazwa() << " | " << zlecenie.GetId()<< zlecenie.GetId()<<" | " << zlecenie.GetPrzypisany() << endl;
cout<<"----------------------\n";
cout<<zlecenie.GetOpis();
cout<<"\n----------------------\n";
}
i++;
}
Pause();
}
}
void displayHealthStatus(const std::vector<Animal*>& animals) {
std::cout << "Stan zdrowia wszystkich zwierzat:\n";
for (const auto& animal : animals) {
std::cout << "Zwoerze:: " << animal->getName() << "\n";
animal->healthStatus.printHealthStatus();
std::cout << "-----------------------\n";
}
}
/* access_level jest tym co określa uprawnienia do funkcji progtramu danego użytkownika
* 0 - nic, nie uzywa sie
* 1 - auto konto goscia
* 2 - użytkownik z zewnatrz, , posiadajacy swoje konto
* 3 - pracownik, może on rowniez kupic bilet, a także wyświetlić zlecenia które zostały mu przypisane
* 4 zarządca - może dodawać zlecenia i tworzyć nowych użytkowników(maksynalnie zarządców)
* 5. Administrator - może wszystko, jego konto jest tworzone przy pierwszym uruchomieniu programu
*/
int main(){
string login;
string password;
vector<User> user_list;
vector<Zlecenie> zlecenie_list;
vector<Animal*> animals;
animals.push_back(new Lion("Leo", 5));
animals.push_back(new Snake("Kaa", 3));
animals.push_back(new Lion("Simba", 2));
animals.push_back(new Snake("Nagini", 7));
//Animal zwierze;
int wybor = -1;
if(!loadUsers(user_list,"users.txt")){ //odpala tworzenie nowego użytkownika jeśli ten nie istnieje
cout<<"Witaj, ten formularz pozwoli ci dodać administratora systemu i przygotować go do pracy";
CreateUserForm(5,user_list);
saveUsers(user_list, "users.txt");
}
int id = 0;
if(loadZlecenia(zlecenie_list, "zlecenia.txt")){ cout<<"";
id=zlecenie_list.back().GetId();}
do{
User* loggeduser = nullptr;
AddUser(user_list,"gosc","ewtweugwehh","Gosc"," ",1);
do
{
cout<<"System zarzadzania Zoo v1.0, Jesli jestes gosciem naszego zoo wpisz zoo " << endl <<"login: ";
cin >> login;
if(login=="gosc"){
loggeduser = authenticate(user_list,"gosc","ewtweugwehh");
}else{
cout<<"podaj hasło: ";
cin >> password;
loggeduser = authenticate(user_list,login,password);} //po sprawdzeniu poprawnosci danych przypisuje uzytkownika do wskaznika
if(!loggeduser) cout<<"Bledne dane, sprobuj jeszcze raz";
}while(!loggeduser);
Clear();
do{
welcome(loggeduser);
//clear screen
if(loggeduser->GetAccessLevel()>=1){
cout<<"\n---- Wybierz funkcje programu: -----\n";
cout<<"2. Kup bilet\n";
cout<<"3. Dla dzieci : Sprawdz jakie dzwieki wydaje jakie zwierze !\n";}
if(loggeduser->GetAccessLevel()>3)
{
cout<<"4. Wyswietl swoje zlecenia:\n";
cout<<"5. Dodaj zlecenie\n";
cout<<"6. Dodaj uzytkownika\n";
cout<<"7. Skasuj bilet(kasa)\n";
cout<<"8. Sprawdz stan zwierzat\n";
}
if(loggeduser->GetAccessLevel()>4){
cout<<"9. Wyswietl wszystkie zlecenia\n\n";
}
cout<<"\n----------- System ----------- : \n";
cout<<"1.Zmien użytkownika\n";
cout<<"0. Wyjdz z programu\n";
cout<<"Podaj numer: \n";
cin>>wybor;
Clear();
switch(wybor){
case 2:{
newticket();
break;}
case 3:{
animals_sound(animals);
break;}
}
if(loggeduser->GetAccessLevel()>3){
switch(wybor){
case 4:{
ShowZleceniafromuser(zlecenie_list,loggeduser);
break;}
case 5:{
id++;
NewZlecenie(user_list,loggeduser,zlecenie_list,id);
break;}
case 6:{
CreateUserForm(loggeduser->GetAccessLevel(),user_list);
saveUsers(user_list, "users.txt");
break;}
case 7:{
ticketchcecked();;
break;}
case 8:{
displayHealthStatus(animals);
break;}
default: break;
}
}
if(loggeduser->GetAccessLevel()>4){
switch(wybor){
case 9:{
ShowZleceniaall(zlecenie_list);
break;}
default: break;
}
Pause();
cout<<"\n\n";
}
//kup bilet
}while(wybor!=0 && wybor!=1);
}while(wybor!=0);
for (auto& animal : animals) {
delete animal;
}
animals.clear();
return 0;
}