Commit 456e89b9 authored by Samson's avatar Samson
Browse files

readme

parent 487d6289
......@@ -260,9 +260,9 @@ Master-käyttäjä ylläpitää palvelua: lisää/poistaa tulevat liikuntatunnit
Booking --|> ClassIsAvailable
ClassIsAvailable --|> Class
User --> ClassIsAvaialble
User --> Comment
Booking --> DB
ClassIsAvailable --> DB
@enduml
```
......@@ -294,81 +294,74 @@ Sovellus on toteutettu suunnitelman mukaan, ei poikennut vaatimusmäärittelyst
| Tunnus | Ominaisuus | Prioriteetti | Toteuttumisprosentti | Muuta |
| :-: | :-: | :-: | :-: | :-: |
| FT01 | [ Tunnusten luominen ja kirjautuminen](../liitteet/f1_login.md) | Pakollinen | 100% ||
| FT02 | [ Lisää/poistaa työkalu ](../liitteet/f2_tools.md) | Pakollinen | 100% ||
| FT03 | [ Tunnusten poistaminen](../liitteet/f3_delete_account.md) | Pakollinen | 100% ||
| FT04 | [ Mahdollisuus arvioida käyttäjiä ](../liitteet/f4_rating.md) | Nice to Have | 100% ||
| FT05 | [ Työkalujen kommentoiminen ](../liitteet/f5_comment.md) | Nice to Have | 70% | Kommentit ei esinny oikeassa järjestyksessä |
| FT06 | [ Työkalujen vuokraaminen ](../liitteet/f6_rentatool.md) | Pakollinen | 100% ||
| FT07 | [ Työkalujen palautus ](../liitteet/f7_returntool.md) | Pakollinen | 100% ||
| 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% ||
### Toteuttamatta jääneet toiminnalliset vaatimukset
Ei jäänyt yhtään toiminnallista ominaisuutta/vaatimusta toteuttamatta, ainoa missä on ongelma on 'kommentit' - ei esinny oikeassa järjestyksessä käyttöliittymässä, muuten toimii.
### Yli alkuperäisten vaatimusten toteutetut toiminnallisuudet
Yksi, joka on jäänyt toteutumtta on "posta liikuntatunti". Laravel ei hyväksynyt Reactista saapuvan DELETE metodia. Ilmestyi koko ajan FORBIDDEN 403 virhe.
Toteutin piilotetun ikkunan, jossa on toiminnallisuus, joka lisää käyttäjän asettaman määrän satunnaisia työkaluja testaamista varten. Käsiksi siihen ikkunaan pääsee painamalla F1
'AddATool' ikkunan auki ollessa. Sitä ennen 'Register'-ikkunalle tein samantyylisen toiminnallisuuden, joka ei ole niinkään piilotettu. Sieltä löytyy 'Fill'-button, jota klikkamalla
pystyy täyttämään kaikki rekiströintikentät satunnaisilla arvoilla, tämäkin ominaisuus on tehty testaamista varten.
Toinen ongelma oli silloin kun yritin asentaa erillisen kalenteri-komponentin Reactiin.
Sain asennettu komponentin, mutta en saanut siihen dataa tietokannasta.
## Kuvaruutukaappaukset
### 'Login'-ikkuna
<img src="images/itool_login.JPG" alt="iTool v1" width="400">
### 'Login'-sivu
<img src="links/login.JPG" alt="FinessStudio" width="400">
* Login ikkunassa pystyy kirjautumaan iTool-sovellukseen sisään tai siirtymään rekiströintiin.
* Login ikkunassa pystyy kirjautumaan Fitness Studioon sisään.
### 'Register'-ikkuna
<img src="images/itool_register.JPG" alt="iTool v1" width="700">
### 'Register'-sivu
<img src="links/register.JPG" alt="FinessStudio" width="400">
* Register ikkunassa pystyy rekiströitymään iTool-palveluun, kaikki kentät on pakollisia, paitsi kuva.
* Löytyy myös 'Fill' nappi, jota klikkaamalla voi täyttää kentät satunnaisilla tiedoilla. Nappi on luotu testausta varten.
* Register ikkunassa pystyy rekiströitymään fitness-studioon, kaikki kentät on pakollisia.
### 'Main'-ikkuna
<img src="images/itool_main.JPG" alt="iTool v1" width="900">
### 'Classes'-sivu
<img src="links/classes.JPG" alt="FinessStudio" width="700">
* Mainissa voi selailla ja vuokrata työkaluja.
* Datagridissa työkalua klikkaamalla voi nähdä työkalun kuvan ja tiedot yksityiskohtaisemmin ikkunan alaosassa.
* Vasemmassa laidassa on suodattimia, jotka suodattaa joko sijainnin tai kategorian mukaan.
* Yläpalkista löytyy 'Etsi'-kenttä, jonka avulla voi etsiä työkaluja nimen tai nimen osan mukaan.
* Profiilikuvaa klikkaamalla pääsee siirtymään 'User profile'-ikkunaan.
* Työkalua valitsemalla ja 'Comment'-nappia painamalla aukee 'Comment'-ikkuna.
* Classes-ikkunssa voi selailla ja varata tulevia liikuntatunteja
* Liikuntatuntia kllikkaamalla pääsee lukemaan enemmän infoa tunnista
* Take Class - näppäintä klikkaamalla varataan liikuntatunnin
* Adminit ja Masterit näkee "Add Class" - ikkunan, josta pääsee lisäämään tulevia liikuntatunteja
### 'Commment'-ikkuna
<img src="images/itool_comment.JPG" alt="iTool v1" width="500">
### 'Bookings'-sivu
<img src="links/bookings.JPG" alt="FinessStudio" width="500">
* Comment ikkunassa voi jättää uusia kommentteja koskien kyseistä työkalua
* Voi myös vastata olemassa oleviin kommenteihin klikkaamalla kommenttia
* Kommentit jätetään painamalla 'Enter'-nappia
* Bookings sivulla pääsee selaamaan omat tulevat liikuntatunnit.
* Pystyy myös peruuttaamaan ne
### 'Profile'-ikkuna
<img src="images/itool_profile.JPG" alt="iTool v1" width="800">
### 'Settings'-sivu
<img src="links/settings.JPG" alt="FinessStudio" width="800">
* Profiili-ikkunassa nähdään 3 listaa: "Omat työkalut", "Omat vuokratut työkalut" ja "Omat transaktiot"
* Työkaluja tai transaktioita valitsemalla pääsee näkemään niiden tiedot iksityiskohtaisemmin
* Valitsemalla työkalu "Omat työkalut" listasta ja painamalla 'Delete' nappia voidaan poistaa työkalu kokonaan
* Valitsemalla työkalu "Omat vuokratut työkalut" listasta ja painamalla 'Space' nappia voidaan palauttaa vuokratun työkalun omistajalleen
* Valitsemalla transaktio "Omat transaktiot" listasta ja painamalla 'Space' nappia voidaan antaa transaktion toiselle osapuolelle arvion
* Vasemassa laidassa on palkki, josta pääsee muokkaamaan omaa profiiliä
* Settings sivulla näkee omat tiedot
* Voi vaihtaa salasana
* Voi vaihtaa s-posti
* Voi poistaa tunnukset
### 'Edit Profile'-ikkuna
<img src="images/itool_edit.JPG" alt="iTool v1" width="700">
### 'Change Password'-sivu
<img src="links/change.JPG" alt="FitnessStudio" width="700">
* Edit profile ikkunassa voi muokata omat profiilitiedot
* Change Password sivulla voi vaihtaa salasana
### 'Add a Tool'-ikkuna
<img src="images/itool_addtool.JPG" alt="iTool v1" width="700">
### 'Change Email'-sivu
<img src="links/email.JPG" alt="FitnessStudio" width="700">
* Lisää työkalu - ikkunassa voi lisätä uusia työkaluja
* Kaikki kentät työkalun kuvaa lukuunottamatta ovat pakollisia
* Change Email sivulla pääsee vaihtaa s-posti
### Piilotettu 'Add random tools'-ikkuna
<img src="images/itool_addrandomtools.JPG" alt="iTool v1" width="300">
### Users-sivu
<img src="links/users.JPG" alt="FitnessStudio" width="300">
* Add random tools ikkuna on piilotettu ikkuna, johon pääsee käsiksi painamalla 'F1'-nappia "Add a Tool" ikkunan auki ollessa
* Tämä ikkuna oli luotu testaamista varten
* Tämä metodi generoi käyttäjän syöttämän määrän satunnaisia työkaluja kaikkien käyttäjien kesken iTool-tietokantaan
* Users sivulla adminit ja masterit pystyy hallinoimaan käyttäjiä.
* Antaa bannia
* Peruuttaa bannit
* Poistaa käyttäjät
* Ylentää (master)
* Alentaa (master)
## Mukana tulevat tiedostot
......
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class ChangePasswordController extends Controller
{
public function index()
{
return view('auth.passwords.change');
}
public function email()
{
return view('auth.email');
}
public function changePassword(Request $request)
{
$this->validate($request, [
'oldpassword' => 'required',
'password' =>'required|confirmed'
]);
$hashedPassword = Auth::user()->password;
if(Hash::check($request->oldpassword,$hashedPassword)){
$user = User::find(Auth::id());
$user->password = Hash::make($request->password);
$user->save();
Auth::logout();
return redirect()->route('login')->with('successMsg', 'Password is changed succesfully!');
} else {
return redirect()->back()->with('errorMsg', "Current password is invalid!");
}
}
public function changeEmail(Request $request)
{
$this->validate($request, [
'password' =>'required'
]);
$hashedPassword = Auth::user()->password;
if(Hash::check($request->password,$hashedPassword)){
$user = User::find(Auth::id());
$user->email = $request->email;
$user->save();
Auth::logout();
return redirect()->route('login')->with('successMsg', 'Email is changed succesfully!');
} else {
return redirect()->back()->with('errorMsg', "Password is invalid!");
}
}
}
......@@ -88,4 +88,11 @@ class UserController extends Controller
$user->save();
return redirect()->to('/users')->with('success', 'User ' . $user->name . " has been downgraded to regular person, payroll is getting smaller!");
}
public function deleteAccount($id)
{
$user = User::find($id);
$user->delete();
return redirect()->route('login')->with('success', 'User ' . $user->name . " has been deleted!");
}
}
\ No newline at end of file
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Change Email') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('email.update') }}">
@csrf
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('New E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Update Email') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
\ No newline at end of file
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
@if (session('errorMsg'))
<div class="alert alert-icon alert-danger alert-dismissible fade in" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<strong>Oh snap!</strong> {{ session('errorMsg') }}
</div>
@endif
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Change Password') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('password.update') }}">
@csrf
<div class="form-group row{{ $errors->has('oldpassword') ? ' has-error' : '' }}">
<label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Current Password') }}</label>
<div class="col-md-6">
<input id="oldpassword" type="password" class="form-control @error('oldpassword') is-invalid @enderror" name="oldpassword" value="{{ old('oldpassword') }}" required autocomplete="name" autofocus>
@error('oldpassword')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('New Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm New Password') }}</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Update Password') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
File mode changed from 100644 to 100755
......@@ -8,8 +8,6 @@
<div class="card-header">{{ Auth::user()->name }}</div>
<div class="card-body">
<form method="POST" action="{{ route('register') }}">
@csrf
......@@ -23,7 +21,7 @@
</div>
<div class="form-group row">
<label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
<label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Group') }}</label>
<div class="col-md-6">
<label for="password-confirm" class="col-form-label text-md-left">
......@@ -40,12 +38,19 @@
<div class="form-group row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Edit Profile') }}
</button>
<a style="margin:10px" href="{{ route('password.change') }}" class="btn btn-primary">
{{ __('Change Password') }}
</a>
<a style="margin:10px" href="{{ route('email.change') }}" class="btn btn-primary">
{{ __('Change Email') }}
</a>
<form method="post" class="delete-form" action="{{ route('delete.account', Auth::user()->id) }}">
{{csrf_field()}}
<input type="hidden" name="_method" value="DELETE" />
<button style="margin:10px" type="submit" class="btn btn-danger">Delete Account</button>
</form>
</div>
</div>
</form>
</div>
</div>
</div>
......
......@@ -13,11 +13,13 @@
@endif
<div class="card">
<div class="card-header">{{ __('Welcome') }}</div>
<div class="card-header">{{ __('Welcome, now you can be as jacked as me!') }}</div>
<img class="front-img" src="images\welcome.jpg" style="width:300px; margin:10px; border:1px solid gray">
<div class="card-body">
Fitness Studio v1.0 - Root folder [ / ]<br>
Login is not required to view this page
<h3>Fitness Studio v0.1</h3><br>
Physical fitness is a state of health and well-being and, more specifically, the ability to perform aspects of sports, occupations and daily activities. Physical fitness is generally achieved through proper nutrition, moderate-vigorous physical exercise, and sufficient rest.
Before the industrial revolution, fitness was defined as the capacity to carry out the days activities without undue fatigue. However, with automation and changes in lifestyles physical fitness is now considered a measure of the body's ability to function efficiently and effectively in work and leisure activities, to be healthy, to resist hypokinetic diseases, and to meet emergency situations.
</div>
</div>
</div>
......
......@@ -27,6 +27,7 @@ Route::group(['middleware' => ['auth','admin']], function() {
Route::get('json-users','UserController@list_json');
Route::get('coursejson', 'UserController@coursejson');
Route::delete('users/delete/{id}', 'UserController@destroy');
Route::delete('settings/delete-account/{id}', 'UserController@deleteAccount')->name('delete.account');
Route::post('users/ban/{id}', 'UserController@ban');
Route::post('users/unban/{id}', 'UserController@unban');
Route::post('users/make_admin/{id}', 'UserController@make_master');
......@@ -39,3 +40,9 @@ Route::group(['middleware' => ['auth']], function() {
});
Route::delete('bookings/delete/{id}', 'BookingController@destroy');
Route::get('change-password', 'Auth\ChangePasswordController@index')->name('password.change');
Route::post('change-password', 'Auth\ChangePasswordController@changePassword')->name('password.update');
Route::get('change-email', 'Auth\ChangePasswordController@email')->name('email.change');
Route::post('change-email', 'Auth\ChangePasswordController@changeEmail')->name('email.update');
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