Commit e3a39fc7 authored by Samson's avatar Samson
Browse files

done and dusted

parent 456e89b9
......@@ -7,7 +7,6 @@
* Versionumero 0.1
* [Fitness Studio](http://142.93.231.94/)
## Sisällysluettelo
* [Vaatimusmäärittely](#vaatimusmäärittely)
......@@ -17,7 +16,6 @@
* [Käyttäjäroolit](#käyttäjäroolit)
* [Ominaisuudet](#ominaisuudet)
* [Käyttötapaukset](#käyttötapaukset)
* [Hyväksyntätestit](#hyväksyntätestit)
* [Käsitemalli](#käsitemalli)
* [Luokkakaavio](#luokkamalli)
* [Työnjako](#työnjako)
......@@ -26,7 +24,6 @@
* [Asennus](#asennus)
* [Tetoa ohjelmasta](#tietoa-ohjelmasta)
* [Kuvaruutukaappaukset](#kuvaruutukaappaukset)
* [Mukana tulevat tiedostot](#mukana-tulevat-tiedostot)
* [Tietokanta](#tietokanta)
* [Ongelmat, jatkokehitysideat](#ongelmat-jatkokehitysideat)
* [Työmäärä](#työmäärä)
......@@ -76,13 +73,17 @@ Master-käyttäjä ylläpitää palvelua: lisää/poistaa tulevat liikuntatunnit
| Tunnus | Ominaisuus | Prioriteetti | Muuta |
| :-: | :-: | :-: | :-: |
| FT01 | [ Tunnusten luominen ja kirjautuminen](links/f1_login.md) | Pakollinen | |
| FT02 | [ Lisää/poistaa varauksia ](links/f2_bookings.md) | Pakollinen | |
| FT03 | [ Tunnusten poistaminen](links/f3_delete_account.md) | Pakollinen | |
| FT04 | [ Profiilin editointi](links/f4_edit_account.md) | Pakollinen | |
| FT05 | [ Admin/Master ominnaisuudet](links/f5_admin.md) | Nice to Have | |
| FT06 | [ Lisää/poista liikuntatunti ](links/f6_add_a_class.md) | Nice to Have | |
| FT01 | Tunnusten luominen ja kirjautuminen | Pakollinen | |
| FT02 | Lisää/poistaa varauksia | Pakollinen | |
| FT03 | Liikuntatuntien selailu | Pakollinen | |
| FT04 | Liikuntatuntien haku | Nice to have | |
| FT05 | Tunnusten poistaminen | Pakollinen | |
| FT06 | Profiilin editointi | Pakollinen | |
| FT07 | Admin/Master ominnaisuudet | Pakollinen | |
| FT08 | Bännää käyttäjiä | Pakollinen | |
| FT09 | Unbännää käyttäjiä | Pakollinen | |
| FT10 | Käyttäjäkuvat | Nice to have | |
| FT11 | Lisää/poista liikuntatunnit | Pakollinen | |
## Käyttötapaukset
......@@ -165,16 +166,6 @@ Master-käyttäjä ylläpitää palvelua: lisää/poistaa tulevat liikuntatunnit
* Kerran per sähköposti
## Hyväksyntätestit
| TestiID | Kuvaus |
|:-:|:-:|
| AT01 | [Tunnusten luominen ja sovellukseen kirjautuminen](linkit/at1_tunnusten_luominen.md) |
| AT02 | [Liikuntatunnin varaus/peruutus](linkit/at2_add_class_.md) |
| AT03 | [Tunnusten editointi](linkit/at3_edit_profile.md) |
| AT04 | [Tunnusten poistaminen](linkit/at4_delete.md) |
| AT05 | [Admin/master ominaisuudet](linkit/at5_admin.md) |
## Käsitemalli
### Käsitteet
......@@ -280,11 +271,12 @@ toteutus (20h)
# Loppuraportti
## Asennus
* Sovellus on pakattu zip-pakkaukseen, pakkaus pitää purkkaa sellaisenaan
* Hakemistorakenteen pitää olla tasan tarkkaan sellainen kun pakkauksessa, koska sovellus käyttää 'images' - kansiotta kuvien tallentaamiseen ja esittämiseen
* Exe-tiedosto löytyy bin/Debug kansiosta
* Sovelluksen käyttöä varten pitää olla joko kirjautuneena labranetin tietokoneelle tai käyttää labranetin VPN-yhteyttä, koska tietokanta sijaitsee mysql.labranet palvelimella
## Tekniikat ja ympäristöt
* Sovellus on implementoitu Laravel ympäristöllä, joka pyötii apache palvelimella, Digital Oceanin ubuntu-koneella.
* Laravelin päälle on asennettu React.js ympäristö, jota on hyödynnetty ainoastaan "Classes" sivulla. Oli tarkoitus lisätä kalenteri-komponentti siihe, mutta oli hankalaa ja aika alkoi loppumaan kesken, joten luovutin sen.
* Käytin mm Javascript, PHP, HTML, CSS, Jquery, Blade, Bootstrap
* Asensin reactiin muutaman kirjaston: Stringify, Momentjs, Axios
## Tietoa ohjelmasta
......@@ -294,13 +286,17 @@ Sovellus on toteutettu suunnitelman mukaan, ei poikennut vaatimusmäärittelyst
| Tunnus | Ominaisuus | Prioriteetti | Toteuttumisprosentti | Muuta |
| :-: | :-: | :-: | :-: | :-: |
| FT01 | [ Tunnusten luominen ja kirjautuminen](links/f1_login.md) | Pakollinen | 100% ||
| FT02 | [ Lisää/poistaa varaus ](links/f2_booking.md) | Pakollinen | 100% ||
| FT02 | [ Lisää/poistaa varauksia ](links/f2_bookings.md) | Pakollinen | 100% ||
| FT03 | [ Tunnusten poistaminen](links/f3_delete_account.md) | Pakollinen | 100% ||
| FT04 | [ Profiilin editointi](links/f4_edit_account.md) | Pakollinen | 100% ||
| FT05 | [ Admin/Master ominnaisuudet](links/f5_admin.md) | Nice to Have | 100% ||
| FT06 | [ Lisää/poista liikuntatunti ](links/f6_add_a_class.md) | Nice to Have | 60% ||
| FT01 | Tunnusten luominen ja kirjautuminen| Pakollinen | 100% ||
| FT02 | Lisää/poistaa varauksia | Pakollinen | 100% ||
| FT03 | Liikuntatuntien selailu | Pakollinen | 100% ||
| FT04 | Liikuntatuntien haku | Nice to have | 100% ||
| FT05 | Tunnusten poistaminen | Pakollinen | 100% ||
| FT06 | Profiilin editointi | Pakollinen | 100% ||
| FT07 | Admin/Master ominnaisuudet | Pakollinen | 100% ||
| FT08 | Bännää käyttäjiä | Pakollinen | 100% ||
| FT09 | Unbännää käyttäjiä | Pakollinen | 100% ||
| FT10 | Käyttäjäkuvat | Nice to have | 100% ||
| FT11 | Lisää/poista liikuntatunnit | Pakollinen | 50% ||
### Toteuttamatta jääneet toiminnalliset vaatimukset
......@@ -309,20 +305,24 @@ Yksi, joka on jäänyt toteutumtta on "posta liikuntatunti". Laravel ei hyväksy
Toinen ongelma oli silloin kun yritin asentaa erillisen kalenteri-komponentin Reactiin.
Sain asennettu komponentin, mutta en saanut siihen dataa tietokannasta.
### Kalenteri-komponentti
<img src="links/syncfusion_schedule.JPG" alt="FinessStudio" width="700" style="border: 1px solid black">
## Kuvaruutukaappaukset
### 'Login'-sivu
<img src="links/login.JPG" alt="FinessStudio" width="400">
<img src="links/login.JPG" alt="FinessStudio" width="700" style="border: 1px solid black">
* Login ikkunassa pystyy kirjautumaan Fitness Studioon sisään.
### 'Register'-sivu
<img src="links/register.JPG" alt="FinessStudio" width="400">
<img src="links/register.JPG" alt="FinessStudio" width="700" style="border: 1px solid black">
* Register ikkunassa pystyy rekiströitymään fitness-studioon, kaikki kentät on pakollisia.
### 'Classes'-sivu
<img src="links/classes.JPG" alt="FinessStudio" width="700">
<img src="links/classes.JPG" alt="FinessStudio" width="700" style="border: 1px solid black">
* Classes-ikkunssa voi selailla ja varata tulevia liikuntatunteja
* Liikuntatuntia kllikkaamalla pääsee lukemaan enemmän infoa tunnista
......@@ -330,13 +330,13 @@ Sain asennettu komponentin, mutta en saanut siihen dataa tietokannasta.
* Adminit ja Masterit näkee "Add Class" - ikkunan, josta pääsee lisäämään tulevia liikuntatunteja
### 'Bookings'-sivu
<img src="links/bookings.JPG" alt="FinessStudio" width="500">
<img src="links/bookings.JPG" alt="FinessStudio" width="700" style="border: 1px solid black">
* Bookings sivulla pääsee selaamaan omat tulevat liikuntatunnit.
* Pystyy myös peruuttaamaan ne
### 'Settings'-sivu
<img src="links/settings.JPG" alt="FinessStudio" width="800">
<img src="links/settings.JPG" alt="FinessStudio" width="700" style="border: 1px solid black">
* Settings sivulla näkee omat tiedot
* Voi vaihtaa salasana
......@@ -344,17 +344,17 @@ Sain asennettu komponentin, mutta en saanut siihen dataa tietokannasta.
* Voi poistaa tunnukset
### 'Change Password'-sivu
<img src="links/change.JPG" alt="FitnessStudio" width="700">
<img src="links/change.JPG" alt="FitnessStudio" width="700" style="border: 1px solid black">
* Change Password sivulla voi vaihtaa salasana
### 'Change Email'-sivu
<img src="links/email.JPG" alt="FitnessStudio" width="700">
<img src="links/email.JPG" alt="FitnessStudio" width="700" style="border: 1px solid black">
* Change Email sivulla pääsee vaihtaa s-posti
### Users-sivu
<img src="links/users.JPG" alt="FitnessStudio" width="300">
<img src="links/users.JPG" alt="FitnessStudio" width="700" style="border: 1px solid black">
* Users sivulla adminit ja masterit pystyy hallinoimaan käyttäjiä.
* Antaa bannia
......@@ -363,79 +363,94 @@ Sain asennettu komponentin, mutta en saanut siihen dataa tietokannasta.
* Ylentää (master)
* Alentaa (master)
## Mukana tulevat tiedostot
* Mukana tulee [zip-pakkaus](https://student.labranet.jamk.fi/~M3156/iTool/iTool_v0.1.zip)
## Tietokanta
Tietokannan suunnittelin tietokannat opintojakson harjoitustyönä. Tietokannasta on luotu 2 versitota prosessin aikana.
Lopullisessa tietokannassa on 4 taulua. Alkuperäisessä oli 3 taulua, siitä puuttui class_is_available taulu. Alkuperäisestä myös puuttui users taulusta "group" ja "status" kolumnit.
### iTool tietokanta versio 1
### Fitness Studio Tietokanta
<img src="images/iTool.JPG" alt="iTool v1" width="900">
Tässä versiossa tietokannassa oli tr_completion taulu, se taulu oli työkalun palautusta varten. Käyttäjä palauuttaa työkalun, samalla palautustapahtuma tallentuisi
tr_completion tauluun, johon kirjautuu palautus PVM, palautus kunto ja arvio kaupan toisesta osapuolesta. Transaction ja tr_completion taulujen välissä oli
yksi yhteen liitos, joten tr_completion on jätetty kokonaan pois ja transaction tauluun on lisätty palautusPVM (actualEndDate) kenttä, joka transaction käynnistyessä olisi null.
### iTool tietokanta lopullinen versio 2
Tietokantaan on luotu pari näkymää.
<img src="images/iTool_v3_no_captions.JPG" alt="iTool v2" width="900">
### CALENDAR näkymä
Tässä on lopullinen versio iTool tietokannasta, tr_completion taulu on jätetty pois ja tietokantaan on lisätty rating taulu arvioita varten. Rating taululle on tehty [trigger](liitteet/trigger.md),
joka pitää huolta siitä, että käyttäjä joka jättää arvion voi vain ainoastaan arvioida kyseisen transaktion toista osapuolta yhden kerran. Comment taulussa on itseensä liitos,
koska vastaukset kommenteihin vaatii parentID.<br>
* Näkymä on luotu Classes sivua varten
[Täältä löytyy tietokannan luontiskripti](liitteet/database_script.md)
[Queryhistoriasta](liitteet/queryhistory.md) löytyy näkymien luonti, testidatan lisäys ja erilaisia hakuja. Piti luoda 2 isoa näkymää (all_tools ja rented_tools) käyttöliittymän
toiminnallisuutta varten.
```sql
CREATE VIEW calendar AS
SELECT class_is_available.id, class.class_name as class, class.capacity as capacity, class.class_description as description, users.name as teacher, class_is_available.start_time as start, class_is_available.end_time as end
FROM class_is_available
INNER JOIN class
ON class.id = class_is_available.class_id
INNER JOIN users
ON class_is_available.teacher_id = users.id;
```
## Ongelmat, jatkokehitysideat
### MY_BOOKING näkymä
Tämä sovellus oli vaan hiekkalaatikkoprototyyppi mahdollisesta tulevasta toimivasta sovelluksesta, siihen nähden ei ole esiintynyt hirveän isoja ongelmia.
On olemassa kuitenkin muutamaa kehitysideaa.
* Näkymä on luotu Bookings sivua varten
### Kommentit
```sql
CREATE VIEW my_booking AS
SELECT class_is_available.id, booking.user_id as user_id, class.class_name as class, booking.id as booking_id, class.capacity as capacity, class.class_description as description, users.name as teacher, class_is_available.start_time as start, class_is_available.end_time as end
FROM class_is_available
INNER JOIN class
ON class.id = class_is_available.class_id
INNER JOIN users
ON class_is_available.teacher_id = users.id
INNER JOIN booking
ON class_is_available.id = booking.class_is_available_id;
```
* Kommentit ei esinny oikeassa järjestyksessä
* Täytyy käydä koodi läpi ja parantaa
* Kommentteihin täytyy pystyä päästä käsiksi myös Profiili-ikkunasta (pieni ja helppo päivitys)
[Alkuperäisen tietokannan luontiskripti ja queryhistoria](linkit/database_queries.md)
### Images kansio
## Ongelmat, jatkokehitysideat
* Images kansio on olemassa vain paikallisesti
* Täytyy siirtää webclietille, jota se päivittyisi kaikilla käyttäjillä dynaamisesti
#### Kalenteri
Suurin ongelma oli se Reactin kalenterikomponentti, johon suhteen luovutin pitkän tuhlatun ajan jälkeen. Joku hyvä ja toimiva kalenteri olisi kannatava jatkokehitysidea.
### Tietokantakyselyt
#### Liikuntatuntien poistaminen
Toinen ongelma oli liikuntatuntien poistaminen Classes sivulla, Laravel ja React ei suostunut tekemään yhteistyötä. FORBIDDEN DELETE METHOD 403. Tämän ominaisuuden voi siirtää ihan puhtaaseen Laraveliin. Teen sen, jos jää aikaa.
* Koodissa on vähän liikaa ylimääräisiä yhteydenottoja mysql palvelimelle
* Pitää muuttaa koodia, että otetaan vaan kerran per uusi ikkuna yhteyden palvelimelle
* Täytyy implementoida 'Entity Framework' tulevissa versioissa
#### Inputissa datetime-local
Jostain syystä näytti koulukoneella aika jenkkiformatissa, omalla koneella kuitenkin toimii normaalisti. Täytyy tutkia.
### Samanaikainen kirjautuminen
#### Käyttöliittymän ulkonäkö
Käyttöliittymän ulkonäköön en ehdinnyt panostaa, se vähän harmittaa. Sovellus näyttää vähän liikaa perus Bootstrapilta. Positiivistä tässä on se, että sovellus toimii usealla alustalla. Jatkossa kehitän.
* Täytyy implementoida sellainen toiminnallisuus, jolla sama käyttäjä ei voisi olla kirjautuneena moneella päätelaitteella samanaikaisesti
#### Sähköposti palvelin
Oli aluksi mielessä laittaa s-posti palvelin pystyy ja ilmoittaa käyttäjille, jos tulevat tunnin on peruttu tai kayttäjä on saanut bannin jne.. Tämän ehtii tekemään kyllä tulevaisuudessa.
### Katselmoinnin aikana ilmestyneet bugit
### Käyttäjäkuvat
* Lisättäessä uusi työkalu ilmeni ongelma samannimisen kuvatiedoston kanssa (bugi korjattu)
* Käyttäjä pystyi poistamaan oman profiilin vaikka sillä oli auki olevia transaktioita (bugi korjattu)
Olisin halunnut lisätä mahdollisuuden uippimaan käyttäjäkuvia, mutta deadline tuli vastaan ja en millään kerennyt.
## Työmäärä
Olen tehnyt kaiken yksin, joten on mennyt paljon aikaa tekemiseen. Täältä löytyy karkea arvio työtunneista:
* XAML ja ulkoasu: 15h
* Code behind: 25h
* Reactjs (Classes): 25h
* Backend: 25h
* Tietokanta: 10h
* Dokumentointi: 5-10h
* Itseopiskelu: 10-20h
## Yhteenveto
* Samson Azizyan (M3156)
### Web-palvelinohjelmointi
* Arvosanaehdotus: 5
* Perustelut: Asetin itselleni arvosanaehdotukseksi 5, koska tein tosi paljon hommaa ja siihen kului noin 60h. Saattoi olla vähän liian kunniahimoinen projekti. Lopputulokseen olen tyytyväinen, kaikki toimii niin kuin pitääkin. Ulkoasu olisi voinut olla näyttävämpi, mutta toiminnallisuus oli prioriteettina tässä projektissa. Tietokanta oli monipuolinen ja hyvin toimiva. Tämä on hyvä pohja jatkokehitystä varten.
* Mitä opin: Opin tekemään yksinkertaisia käyttöliittymiä, implementoimaan mysql-tietokantoja, opin syvemmin käsittelemään olioita ja luokkia. Tämän opintojakson aikana minun ohjelmointitaito on kolmenkertaistunut.
* Mitä pitää oppia: Käsittelemään interfaceja, käyttämään webclientia (tallentamaan sinne tiedostoja), Entity Framework
* Perustelut: Olen tehnyt ison määrän työtä yksin, laravelin ympäristössä tehty palvelinohjelmointi toimii ongelmitta. Reititys, Controllerit, Matodit toimii. Olen myös tehnyt Reactjs backendia jonkin verran. Monenlaista tekniikkaa on käytetty tähän projektiin. Tietokanta on hyvin laaja ja monipuolinen (onneksi kävin hyvän tietokantaopintojakson aiemmin).
### Webohjelmointi
* Arvosanaehdotus webohjelmointi: 4
* Perustelut: En ihan viitsinyt laittaa arvosananksi 5, koska on hieman spagettiä minun react-komponentti. Olen kuitenkin käyttänyt siihe paljon aikaa ja kaikki mahdolliset tekniikat. Komponentti toimii niin kuin pitääkin.
### Pohdinta
* Molemmat kurssit olivat tosi työläistä, mutta se on vaan hyvä asia. Mitä työläämpi kurssi, sitä paremmin oppii. Ehkä minun ei olisi pitänyt sekoittaa React, php, javascript, node. Olisin varmaan voinut päästä hempommalla, mutta tulipa opittu paljon.
* Mitä opin: Opin tekemään web-sovelluksia käyttämällä monta eri tekniikkaa. Eniten opin käyttämään Laravelia, se vaikutti alussa tosi sekaavalta, mutta loppujen lopsi se osoittautui todella käteväksi ympäristöksi.
* Mitä pitää oppia: Pitää opetella Reactia paremmin, vaikka se nyt aukesi jo jonkin verran. Se silti vaatii harjoittelua.
# LUONTISKRIPTI
```sql
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema fitness
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema fitness
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `fitness` DEFAULT CHARACTER SET utf8 ;
USE `fitness` ;
-- -----------------------------------------------------
-- Table `fitness`.`user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`user` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(128) NOT NULL,
`password` VARCHAR(500) NOT NULL,
`group` VARCHAR(128) NULL,
`image` VARCHAR(128) NULL,
`email_verified_at` DATETIME NULL,
`remember_token` VARCHAR(100) NULL,
`created_at` DATETIME NULL,
`updated_at` DATETIME NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`class`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`class` (
`id` INT NOT NULL AUTO_INCREMENT,
`course_name` VARCHAR(255) NOT NULL,
`course_length` DECIMAL(10) NOT NULL,
`course_description` VARCHAR(1000) NULL,
`start_at` DATETIME NOT NULL,
`difficulty` INT NOT NULL,
`capacity` INT NOT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`booking`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`booking` (
`booking_id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL,
`course_id` INT NOT NULL,
`booking_time` DATETIME NOT NULL,
INDEX `fk_user_has_course_course1_idx` (`course_id` ASC),
INDEX `fk_user_has_course_user_idx` (`user_id` ASC),
PRIMARY KEY (`booking_id`),
CONSTRAINT `fk_user_has_course_user`
FOREIGN KEY (`user_id`)
REFERENCES `fitness`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_user_has_course_course1`
FOREIGN KEY (`course_id`)
REFERENCES `fitness`.`class` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
```
# TESTIDATA
## USER
```sql
INSERT INTO user (`name`,`email`,`password`,`group`,`created_at`)
VALUES ('Samson Azizyan','samsonitto@gmail.com','samson13','master',NOW());
INSERT INTO users (`name`,`email`,`password`,`group`,`created_at`,`updated_at`)
VALUES ('Jaber Askari','jaber@gmail.com','jaber1234','admin',NOW(),NOW()),
('Niina Mattola','niina.mattola@gmail.com','niina','admin',NOW(),NOW()),
('Jussi Juntunen','jussi.juntunen@gmail.com','jussi123','admin',NOW(),NOW()),
('Joel Aalto','joel@gmail.com','joel1234',null,NOW(),NOW()),
('Ken Guru','kg@gmail.com','ken12345',null,NOW(),NOW()),
('Lorppa Huuli','lorppa@gmail.com','lorppa12',null,NOW(),NOW());
```
## CLASS
```sql
INSERT INTO class (`class_name`,`difficulty`,`capacity`,`created_at`,`updated_at`)
VALUES ('Yin Yoga',3,15,NOW(),NOW()),
('Brazilian Jiu-Jitsu',5,20,NOW(),NOW()),
('Pole Dancing 1',2,15,NOW(),NOW()),
('Boxing Basics',1,10,NOW(),NOW()),
('Spinning',1,10,NOW(),NOW()),
('Hot Yoga',1,15,NOW(),NOW()),
('Aerial Yoga',1,10,NOW(),NOW());
```
## CLASS IS AVAILABLE
```sql
INSERT INTO class_is_available (`teacher_id`,`class_id`,`start_time`,`end_time`,`created_at`,`updated_at`)
VALUES (1,2,'2019-11-25 08:00:00','2019-11-25 09:30:00',NOW(),NOW()),
(3,1,'2019-11-25 09:30:00','2019-11-25 10:30:00',NOW(),NOW()),
(2,3,'2019-11-25 10:30:00','2019-11-25 12:00:00',NOW(),NOW()),
(1,4,'2019-11-26 09:00:00','2019-11-26 10:00:00',NOW(),NOW()),
(2,7,'2019-11-27 12:00:00','2019-11-27 13:00:00',NOW(),NOW()),
(3,6,'2019-11-29 18:00:00','2019-11-29 19:30:00',NOW(),NOW()),
(2,7,'2019-11-30 12:00:00','2019-11-30 13:00:00',NOW(),NOW()),
(2,7,'2019-12-01 12:00:00','2019-12-01 13:00:00',NOW(),NOW()),
(2,7,'2019-12-02 12:00:00','2019-12-02 13:00:00',NOW(),NOW()),
(2,7,'2019-12-03 12:00:00','2019-12-03 13:00:00',NOW(),NOW()),
(2,7,'2019-12-04 12:00:00','2019-12-04 13:00:00',NOW(),NOW())
```
## BOOKING
```sql
INSERT INTO booking (`user_id`,`course_id`,`booking_time`)
VALUES (4,2,NOW()),
(4,1,NOW()),
(5,3,NOW()),
(6,1,NOW()),
(6,5,NOW()),
(4,6,NOW()),
(3,7,NOW());
```
## MY_BOOKING VIEW
```sql
CREATE VIEW my_booking AS
SELECT class_is_available.id, booking.user_id as user_id, class.class_name as class, booking.id as booking_id, class.capacity as capacity, class.class_description as description, users.name as teacher, class_is_available.start_time as start, class_is_available.end_time as end
FROM class_is_available
INNER JOIN class
ON class.id = class_is_available.class_id
INNER JOIN users
ON class_is_available.teacher_id = users.id
INNER JOIN booking
ON class_is_available.id = booking.class_is_available_id;
```
## CALENDAR VIEW
```sql
CREATE VIEW calendar AS
SELECT class_is_available.id, class.class_name as class, class.capacity as capacity, class.class_description as description, users.name as teacher, class_is_available.start_time as start, class_is_available.end_time as end
FROM class_is_available
INNER JOIN class
ON class.id = class_is_available.class_id
INNER JOIN users
ON class_is_available.teacher_id = users.id;
```
## UPDATE CLASS DESCRIPTIONS
UPDATE class SET `class_description` = 'Brazilian jiu-jitsu is a martial art and combat sport system that focuses on
grappling with particular emphasis on ground fighting. Brazilian jiu-jitsu was developed from Kodokan judo
ground fighting (newaza) fundamentals that were taught by a number of Japanese individuals including Takeo Yano,
Mitsuyo Maeda, Soshihiro Satake, and Isao Okano. Brazilian jiu-jitsu eventually came to be its own defined combat sport
through the innovations, practices, and adaptation of judo.' WHERE `id` = 2;
\ No newline at end of file
```sql
CREATE VIEW my_bookings AS
```
\ No newline at end of file
......@@ -88322,7 +88322,8 @@ function (_Component) {
if (document.getElementById('calendar').className == '40520' && isInClass == false && !isBanned) {
content.appendChild(takeClassButton);
} else {
if (!isBanned) {
if (!isBanned && !isNaN(userID)) {
console.log("else: " + userID);
var pYouAreIn = document.createElement('p');
pYouAreIn.appendChild(document.createTextNode('You have already booked this class!'));
pYouAreIn.style.color = 'red';
......@@ -330,7 +330,8 @@ export default class Course extends Component {
content.appendChild(takeClassButton);
}
else {
if(!isBanned){
if(!isBanned && !isNaN(userID)){
console.log("else: " + userID);
var pYouAreIn = document.createElement('p');
pYouAreIn.appendChild(document.createTextNode('You have already booked this class!'));
pYouAreIn.style.color = 'red';
......
......@@ -8,7 +8,7 @@
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Fitness Studio v1.0</title>
<title>Fitness Studio v0.1</title>
@if (!(Route::current()->getName() == 'calendar'))
<!-- Scripts -->
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment