Compare commits

...

4 Commits
exit ... master

14 changed files with 163 additions and 90 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

@ -7,39 +7,34 @@
// 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 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";
cin >> selector;
cin.ignore(10000, '\n');
switch (selector) {
case 1: {
interface_member(spots);
break;
}
case 2: {
interface_admin(spots);
break;
}
}
}
void interface_member(vector<Park_spot>& spots) { cout << "\nWelcome to the parking system. Please login..";
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:\n";
std::getline(cin, password); std::getline(cin, password);
} }
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..";
}
}
void interface_member(vector<Park_spot>& spots,Customer& c) {
cout << "Logged in succesfully\n"; cout << "Logged in succesfully\n";
cout << "select an option\n [1] Parking options\n[2]monthy report\n"; cout << "select an option\n [1] Parking options\n[2]monthy report\n";
int option; int option;
@ -68,8 +63,9 @@ 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 << "option[1-8]:";
int option; int option;
cin >> option; cin >> option;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
@ -83,7 +79,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 +87,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,6 +103,9 @@ 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;
} }
@ -160,6 +159,7 @@ 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]twoweeler, [2] fourweeler: ";
@ -169,7 +169,24 @@ void new_customer() {
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();
} }
@ -182,4 +199,4 @@ void new_parkspot(vector<Park_spot>& spots) {
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";
} }

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.