6 Commits

Author SHA1 Message Date
2ab5be430f added pspots and ptimes 2019-07-20 23:24:37 -03:00
ca8b361ce5 Population and minor changes 2019-07-19 22:03:59 -03:00
cd2f723a04 implementation of admin added, animation commented out for faster testing and while loop added with exit in main() 2019-07-17 22:30:47 -03:00
0c06192f81 while loop in admin and exit 2019-07-17 10:26:22 -03:00
3eb00a0da9 Merge branch 'animation'
Adding animation, 2n try
2019-07-12 11:43:00 -03:00
574092db34 Animation added 2019-07-08 20:46:19 -03:00
14 changed files with 249 additions and 103 deletions

View File

@ -1,51 +1,54 @@
cmake_minimum_required(VERSION 3.10)
project(park)
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11) project(park)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp)
set(CMAKE_CXX_STANDARD 11)
include_directories( add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp)
${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp/include
) include_directories(
${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp/include
)
add_executable(park
main.cpp
add_executable(park
data.cpp main.cpp
headers/data.h
encrypt.cpp data.cpp
headers/encrypt.h headers/data.h
encrypt.cpp
Customer.cpp headers/encrypt.h
headers/Customer.h
Park_spot.cpp Customer.cpp
headers/Park_spot.h headers/Customer.h
Park_time.cpp Park_spot.cpp
headers/Park_time.h headers/Park_spot.h
Query.cpp Park_time.cpp
headers/Query.h headers/Park_time.h
Interface.cpp Query.cpp
headers/Interface.h headers/Query.h
) Interface.cpp
headers/Interface.h
)
if (UNIX)
target_link_libraries(park
SQLiteCpp if (UNIX)
sqlite3 target_link_libraries(park
pthread SQLiteCpp
dl sqlite3
sodium pthread
) dl
elseif (MSYS OR MINGW) sodium
target_link_libraries(park )
SQLiteCpp elseif (MSYS OR MINGW)
sqlite3 target_link_libraries(park
pthread SQLiteCpp
ssp sqlite3
libsodium pthread
) ssp
endif() libsodium
)
endif()

View File

@ -2,12 +2,13 @@
// constructors // constructors
Customer::Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_) Customer::Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_, int role_)
: id{auto_increment_db() + 1}, : id{auto_increment_db() + 1},
name{name_}, name{name_},
password{hash_password(password_)}, password{hash_password(password_)},
vehicle{vehicle_}, vehicle{vehicle_},
telephone{telephone_} { telephone{telephone_},
role{role_} {
save_db(); save_db();
} }
@ -54,8 +55,9 @@ int Customer::parked_at() { return park_instances[park_instances.size() - 1].spo
// functions that interact with the database // functions that interact with the database
void Customer::save_db() { void Customer::save_db() {
string statement{"insert into Customer values (, '', '', ,'');"}; string statement{"insert into Customer values (, '', '', ,'', );"};
// after ( = 28) // after ( = 28)
statement.insert(43, to_string(role));
statement.insert(41, telephone); statement.insert(41, telephone);
statement.insert(38, to_string(int(vehicle))); statement.insert(38, to_string(int(vehicle)));
statement.insert(36, password); statement.insert(36, password);
@ -70,8 +72,9 @@ void Customer::save_db() {
void Customer::update_db() { void Customer::update_db() {
string statement = string statement =
"UPDATE Customer SET name = '', password = '', " "UPDATE Customer SET name = '', password = '', "
"vehicle = '', telephone = '' where id = '';"; "vehicle = '', telephone = '', role = '' where id = '';";
statement.insert(87, to_string(id)); statement.insert(89, to_string(id));
statement.insert(84, to_string(role));
statement.insert(73, telephone); statement.insert(73, telephone);
statement.insert(57, to_string(int(vehicle))); statement.insert(57, to_string(int(vehicle)));
statement.insert(43, password); statement.insert(43, password);

View File

@ -1,66 +1,90 @@
#include "headers/Interface.h" #include "headers/Interface.h"
#include <stdlib.h>
#include <synchapi.h>
// I added it to pass spots, because the parking options need it to check where // I added it to pass spots, because the parking options need it to check where
// is free parking_spots is declared in main, and if i declare it // is free parking_spots is declared in main, and if i declare it
// liberal use of // liberal use of
// cin.ignore(10000, '\n'); // cin.ignore(10000, '\n');
// so it skips to the next newline, in essence clearing the cin buffer // so it skips to the next newline, in essence clearing the cin buffer
void update_information(Customer& c);//temp declaration of independence
void interface(vector<Park_spot>& spots) { void interface(vector<Park_spot>& spots) {
int selector; /*
cout << "\nHello and welcome to the parking spot! Please select a suitable " string introduction = "P A R K M A N N E"; //logo animation, disable during testing
"option:"; text_animation(introduction, 50);
cout << "\n[1]Log in as member"; */
cout << "\n[2]Log in as administrator"; __label__ begin;
cin >> selector; begin:
cin.ignore(10000, '\n'); cout << "\nWelcome to the parking system. Please login..";
switch (selector) {
case 1: {
interface_member(spots);
break;
}
case 2: {
interface_admin(spots);
break;
}
}
}
void interface_member(vector<Park_spot>& spots) {
int id; int id;
string password; string password;
cout << "\nPlease input id:"; cout << "\nEnter your id: ";
cin >> id; cin >> id;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
Customer c = query_customer_with_id(id); Customer c = query_customer_with_id(id);
cout << "\nPlease input password:"; cout << "\nEnter your password: ";
std::getline(cin, password); std::getline(cin, password);
while (!(verify_password(c.password, password))) { while (!(verify_password(c.password, password))) {
cout << "ERROR: wrong password. Please retype your password:\n"; cout << "ERROR: wrong password. Please retype your password or type [exit] to exit:\n";
std::getline(cin, password); std::getline(cin, password);
if (password=="exit") {goto begin;}
} }
if(query_role_customer(id)==1){
interface_admin(spots);
} else if(query_role_customer(id)==0){
interface_member(spots, c);
} else {
cout << "ERROR ROLE_INVALID..";
}
}
cout << "Logged in succesfully\n"; void interface_member(vector<Park_spot>& spots,Customer& c) {
cout << "select an option\n [1] Parking options\n[2]monthy report\n"; __label__ exit,begin ;
begin:
cout << "Logged in succesfully as "<<c.name<<"\n";
cout << "Please select an option\n[1] Parking options\n[2]Monthly report\n[3]Edit information\n[4]Exit\n";
int option; int option;
cin >> option; cin >> option;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
switch (option) { switch (option) {
case 1: { case 1:
park(c, spots); park(c, spots);
break; break;
}
case 2: { case 2:
cout << "Has not been implemented yet\n"; cout << "Has not been implemented yet\n";
break; break;
}
case 3:
update_information(c);
break;
case 4:
goto exit;
break;
default: default:
break; break;
}
}
cout<<"\n[1]Return or [2]Log out?\n";
//cin.ignore(10000, '\n');
cin>>option;
if(option==1)goto begin;
exit:
cout<<"Logging out...";
Sleep(3000);//testing wait synchapi header
system ("CLS");//testing clear screen , stdlib header
} }
void interface_admin(vector<Park_spot>& spots) { void interface_admin(vector<Park_spot>& spots) {
__label__ begin,exit;
begin:
Sleep(1000);
system("CLS");
cout << "Welcome to the admin interface. It is not completely ready yet.\n"; cout << "Welcome to the admin interface. It is not completely ready yet.\n";
cout << "[1] See monthly report of ALL parking spots\n"; cout << "[1] See monthly report of ALL parking spots\n";
cout << "[2] See weekly report of ALL parking spots\n"; cout << "[2] See weekly report of ALL parking spots\n";
@ -68,8 +92,10 @@ void interface_admin(vector<Park_spot>& spots) {
cout << "[4] See weekly report of a specific parking spot\n"; cout << "[4] See weekly report of a specific parking spot\n";
cout << "[5] See current status of parking spots\n"; cout << "[5] See current status of parking spots\n";
cout << "[6] Make new customer\n"; cout << "[6] Make new customer\n";
cout << "[7] Make new parking spot\n"; cout << "[7] Make new admin\n";
cout << "option[1-7]:"; cout << "[8] Make new parking spot\n";
cout << "[9] Exit\n";
cout << "option[1-9]:";
int option; int option;
cin >> option; cin >> option;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
@ -83,7 +109,7 @@ void interface_admin(vector<Park_spot>& spots) {
break; break;
} }
case 3: { case 3: {
cout << "Which parking spot would you like a report on?ID:"; cout << "Which parking spot would you like a report on?\nID:";
int spotid; int spotid;
cin >> spotid; cin >> spotid;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
@ -91,7 +117,7 @@ void interface_admin(vector<Park_spot>& spots) {
break; break;
} }
case 4: { case 4: {
cout << "Which parking spot would you like a report on?ID:"; cout << "Which parking spot would you like a report on?\nID:";
int spotid; int spotid;
cin >> spotid; cin >> spotid;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
@ -107,13 +133,28 @@ void interface_admin(vector<Park_spot>& spots) {
break; break;
} }
case 7: { case 7: {
new_admin();
}
case 8: {
new_parkspot(spots); new_parkspot(spots);
break; break;
} }
case 9: {
goto exit;
break;
}
default: default:
break; break;
} }
cout<<"\n[1]Return or [2]Log out?\n";
cin.ignore(10000, '\n');
cin>>option;
if(option==1)goto begin;
exit:
cout<<"Logging out...";
Sleep(3000);
system("CLS");
} }
// --------- individual things. // --------- individual things.
@ -122,9 +163,9 @@ void park(Customer& c, vector<Park_spot>& spots) {
cout << "You have selected parking option"; cout << "You have selected parking option";
if (!(c.parked())) { if (!(c.parked())) {
cout << "The following spots[which can fit your vehicle] are " cout << "The following spots[which can fit your vehicle] are "
"available: "; "available: \n";
for (Park_spot i : spots) { for (Park_spot i : spots) {
if (i.v_type == c.vehicle) { if ((i.v_type == c.vehicle)&(i.taken==false)) {
cout << i.id << ", "; cout << i.id << ", ";
} }
} }
@ -142,7 +183,7 @@ void park(Customer& c, vector<Park_spot>& spots) {
} else { } else {
cout << "You are parked at spot " << c.parked_at() cout << "You are parked at spot " << c.parked_at()
<< ", do you want to clock out?\n enter [1] for yes and [0] for no"; << ", do you want to clock out?\n Enter [1] for yes and [0] for no:";
int answer = 0; int answer = 0;
cin >> answer; cin >> answer;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
@ -151,6 +192,8 @@ void park(Customer& c, vector<Park_spot>& spots) {
cout << "You have sucessfully clocked out."; cout << "You have sucessfully clocked out.";
} else { } else {
cout << "OK, have a nice day"; cout << "OK, have a nice day";
Sleep(3000);
system("CLS");
} }
} }
} }
@ -160,26 +203,73 @@ void new_customer() {
string name; string name;
string password; string password;
string telephone; string telephone;
int role = 0;
cout << "What's the name of the customer? "; cout << "What's the name of the customer? ";
std::getline(cin, name); std::getline(cin, name);
cout << "What's the vehicle type? [1]twoweeler, [2] fourweeler: "; cout << "What's the vehicle type? [1]Twowheeler, [2] Fourwheeler: ";
cin >> vtype; cin >> vtype;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
cout << "What's the telephone number? "; cout << "What's the telephone number? ";
std::getline(cin, telephone); std::getline(cin, telephone);
cout << "What's the password?"; cout << "What's the password?";
std::getline(cin, password); std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone}; Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "New customer sucessfully created\n";
newcustomer.update_db();
}
void new_admin() {
int vtype = 2; //revision required!
string name;
string password;
string telephone;
int role = 1;
cout << "What's the name of the admin? ";
std::getline(cin, name);
cout << "What's the telephone number? ";
std::getline(cin, telephone);
cout << "What's the password?";
std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "New customer sucessfully created\n"; cout << "New customer sucessfully created\n";
newcustomer.update_db(); newcustomer.update_db();
} }
void new_parkspot(vector<Park_spot>& spots) { void new_parkspot(vector<Park_spot>& spots) {
cout << "What type of parking spot? [1] twoweeler, [2] fourweeler: "; cout << "What type of parking spot? [1] Twowheeler, [2] Fourwheeler: ";
int vtype; int vtype;
cin >> vtype; cin >> vtype;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
Park_spot newspot{Vehicle_type(vtype)}; Park_spot newspot{Vehicle_type(vtype)};
spots.push_back(newspot); spots.push_back(newspot);
cout << "new parking spot sucessfully created.\n"; cout << "new parking spot sucessfully created.\n";
}
void update_information(Customer& c)//Do not know how to use customer::update_db()
{
string string0; int int0;
std::cout<<"\n fixme pls Input to update name or press 0 to keep name:\n";
std::getline(cin,string0);
//cin.ignore(10000, '\n');
if (string0=="0");
else c.name=string0;
//vehicle type give problem//std::cout<<"\n Input to update vehicle to [1]Two-Wheeler, [2]Four-Wheeler or press [0] to keep vehicle type:\n";
//std::cin>>int0;
//if (int0==0);
//else c.Vehicle_type(int0);
std::cout<<"\n Input to update password or press [0] to keep current password:\n";
std::getline(cin,string0);
if (string0=="0");
else c.password=string0;
//cin.ignore(10000, '\n');
std::cout<<"\n Input to update phone number or press [0] to keep current number:\n";
std::getline(cin,string0);
//cin.ignore(10000, '\n');
if (string0=="0");
else c.telephone=string0;
c.update_db();
} }

View File

@ -121,4 +121,14 @@ purposes mostly. TODO: Needs to be removed at completion of project, or seperate
cpp/header cpp/header
*/ */
std::this_thread::sleep_for(seconds{sec}); std::this_thread::sleep_for(seconds{sec});
} }
// text animtion duh
void text_animation(const string& text, unsigned int pause_time)
{
for(const char m:text) // range loop; for each character in string
{
cout << m << flush;
sleep_for(milliseconds(pause_time));
}
}

View File

@ -72,6 +72,15 @@ Customer query_customer_with_id(int id) {
} }
} }
int query_role_customer(int id){
SQLite::Statement query(data::db, "SELECT * FROM Customer WHERE id = ?;");
query.bind(1, id);
while(query.executeStep()){
int role = query.getColumn(5);
return role;
}
}
//------------------------------- parkspot info //------------------------------- parkspot info
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) { Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) {

View File

@ -40,7 +40,8 @@ class Customer {
string password; string password;
Vehicle_type vehicle; Vehicle_type vehicle;
string telephone; string telephone;
Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_); int role;
Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_, int role);
Customer(int id_, string name_, string password_, Vehicle_type vehicle_, Customer(int id_, string name_, string password_, Vehicle_type vehicle_,
vector<Park_time> instances, string telephone_); vector<Park_time> instances, string telephone_);
void clock_in(int s_id); void clock_in(int s_id);

View File

@ -6,8 +6,9 @@
using std::cin; using std::cin;
void interface(vector<Park_spot>& spots); void interface(vector<Park_spot>& spots);
void interface_member(vector<Park_spot>& spots); void interface_member(vector<Park_spot>& spots, Customer& c);
void interface_admin(vector<Park_spot>& spots); void interface_admin(vector<Park_spot>& spots);
void park(Customer& c, vector<Park_spot>& spots); void park(Customer& c, vector<Park_spot>& spots);
void new_customer(); void new_customer();
void new_admin();
void new_parkspot(vector<Park_spot>& spots); void new_parkspot(vector<Park_spot>& spots);

View File

@ -12,8 +12,11 @@
using namespace std::chrono; using namespace std::chrono;
using std::cout; using std::cout;
using std::flush;
using std::string; using std::string;
using std::to_string; using std::to_string;
using std::this_thread::sleep_for;
using std::chrono::milliseconds;
/* /*
@ -64,7 +67,10 @@ class Park_time {
int start_to_int(); // helper int start_to_int(); // helper
}; };
// test funciton // test function
void Wait(int sec); void Wait(int sec);
#endif // Park_time // function that slowly outputs each character one by one
void text_animation(const string& text, unsigned int pause_time);
#endif // Park_time

View File

@ -59,6 +59,7 @@ Customer query_customer_with_id(int id);
vector<Park_spot> populate_spots(); vector<Park_spot> populate_spots();
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots); Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots);
int query_role_customer(int id);
void reports_from_parkspot(int spotid, bool weekly = false); void reports_from_parkspot(int spotid, bool weekly = false);
void reports_from_allparkspots(bool weekly = false); void reports_from_allparkspots(bool weekly = false);

View File

@ -47,8 +47,17 @@ int main() {
// state of db: // state of db:
// er zijn 10 parkspots, 5 met biketype en 5 met pickup type // er zijn 10 parkspots, 5 met biketype en 5 met pickup type
// er is een customer met id 1(testcustomer) met password "password" // er is een customer met id 1(testcustomer) met password "password"
while(true) {
interface(parking_spots); cin.clear();
interface(parking_spots);
/* cout<<"\nexit? Input 'y' or 'n'..";
char n;
cin >> n;
cin.clear();
if(n=='y'){
break;
}*/
}
} }
/* /*

5
newParkManne.cpp Normal file
View File

@ -0,0 +1,5 @@
#include <iostream>
void say_hello(){
std::cout << "Hello, from newParkManne!\n";
}

BIN
park Executable file

Binary file not shown.

View File

@ -12,6 +12,14 @@ Or click the build icon in vscode *shrugs*
# Parkmanne # Parkmanne
## A stroll in the park ## A stroll in the park
######TO-DO List:
- [x] Admin login
- [ ] Billing report menu
- [ ] Report from a specific month i.e. january
- [ ] Edit option in menu
- [ ] Option to confirm edit after input
- [ ] Divide menu in sub menus
- [ ] Analytics of customer (e.g. # customers with 2-wheeler or list of customer and telephone numbers etc.)
This is a graph of how everything is connected. This is a graph of how everything is connected.
If you need to add functionality that doesn't fall in any of these, and you're unsure of what to include, you can decide something like this: If you need to add functionality that doesn't fall in any of these, and you're unsure of what to include, you can decide something like this:

BIN
test.db3

Binary file not shown.