Compare commits
2 Commits
4d7edeea88
...
3144078860
Author | SHA1 | Date | |
---|---|---|---|
3144078860 | |||
7b4b349816 |
84
README.md
84
README.md
@ -1,3 +1,83 @@
|
||||
# habit-tracker
|
||||
# Habit Tracker
|
||||
|
||||
Aplikace pro sledování návyků a motivaci k dosažení osobních cílů.
|
||||
|
||||
## Funkce
|
||||
- **Uživatelská autentizace:** Možnost registrace a přihlášení.
|
||||
- **Správa návyků:** Přidávání, úprava a mazání návyků.
|
||||
- **Denní kontrola:** Označování splněných návyků každý den.
|
||||
- **Gamifikace:** Získávání bodů za splněné návyky, odemykání odznaků a postup na vyšší úrovně.
|
||||
- **Přehled:** Statistiky o pokroku a dosažených úspěších.
|
||||
- **(Volitelné) Žebříček:** Srovnání bodů mezi uživateli.
|
||||
|
||||
## Použité technologie
|
||||
- **Backend:** PHP (OOP)
|
||||
- **Databáze:** MySQL
|
||||
- **Frontend:** HTML, CSS, JavaScript (Bootstrap pro responzivní design)
|
||||
|
||||
## Instalace
|
||||
1. Klonujte tento repozitář:
|
||||
```bash
|
||||
git clone https://github.com/vase-repozitar/habit-tracker.git
|
||||
```
|
||||
2. Importujte databázovou strukturu ze souboru `database.sql` do MySQL.
|
||||
3. Nakonfigurujte připojení k databázi v souboru `config.php`:
|
||||
```php
|
||||
define('DB_HOST', 'localhost');
|
||||
define('DB_USER', 'uzivatel');
|
||||
define('DB_PASS', 'heslo');
|
||||
define('DB_NAME', 'habit_tracker');
|
||||
```
|
||||
4. Spusťte lokální server (např. pomocí XAMPP nebo WAMP) a přistupte k aplikaci přes prohlížeč.
|
||||
|
||||
## Struktura databáze
|
||||
|
||||
### Tabulka `users` (uživatelé)
|
||||
| Sloupec | Typ | Popis |
|
||||
|---------------|-------------|----------------------------|
|
||||
| id | INT | Primární klíč |
|
||||
| username | VARCHAR(50) | Uživatelské jméno |
|
||||
| email | VARCHAR(100)| Email |
|
||||
| password | VARCHAR(255)| Heslo (hashované) |
|
||||
| points | INT | Celkový počet bodů |
|
||||
| created_at | TIMESTAMP | Datum registrace |
|
||||
|
||||
### Tabulka `habits` (návyků)
|
||||
| Sloupec | Typ | Popis |
|
||||
|---------------|-------------|----------------------------|
|
||||
| id | INT | Primární klíč |
|
||||
| user_id | INT | ID uživatele (cizí klíč) |
|
||||
| title | VARCHAR(100)| Název návyku |
|
||||
| frequency | VARCHAR(50) | Frekvence (denní/týdenní) |
|
||||
| reward_points | INT | Počet bodů za splnění |
|
||||
| created_at | TIMESTAMP | Datum vytvoření |
|
||||
|
||||
### Tabulka `progress` (pokrok)
|
||||
| Sloupec | Typ | Popis |
|
||||
|---------------|-------------|----------------------------|
|
||||
| id | INT | Primární klíč |
|
||||
| user_id | INT | ID uživatele (cizí klíč) |
|
||||
| habit_id | INT | ID návyku (cizí klíč) |
|
||||
| date | DATE | Datum splnění |
|
||||
| status | ENUM | Stav (např. 'Done') |
|
||||
|
||||
### Tabulka `achievements` (odznaky)
|
||||
| Sloupec | Typ | Popis |
|
||||
|---------------|-------------|----------------------------|
|
||||
| id | INT | Primární klíč |
|
||||
| user_id | INT | ID uživatele (cizí klíč) |
|
||||
| achievement | VARCHAR(100)| Název odznaku |
|
||||
| unlocked_at | TIMESTAMP | Datum odemknutí |
|
||||
|
||||
## Použití
|
||||
1. Zaregistrujte se a přihlaste do aplikace.
|
||||
2. Přidejte své návyky pomocí intuitivního rozhraní.
|
||||
3. Každý den označte splněné návyky a sledujte svůj pokrok.
|
||||
4. Sbírejte body a odemykejte odznaky za svou vytrvalost!
|
||||
|
||||
## Autor
|
||||
Tento projekt byl vytvořen jako součást školního zadání.
|
||||
|
||||
## Licence
|
||||
Tento projekt je licencován pod GNU GENERAL PUBLIC LICENSE verze 3. Více informací v souboru `LICENSE`.
|
||||
|
||||
An app for tracking habits and motivation to achieve personal goals.
|
19
app/controllers/AuthController.php
Normal file
19
app/controllers/AuthController.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
class AuthController {
|
||||
public function signin() {
|
||||
$view = new View();
|
||||
$data = [
|
||||
'title' => 'Log In'
|
||||
];
|
||||
$view->render('auth/signin', $data);
|
||||
}
|
||||
|
||||
public function signup() {
|
||||
$view = new View();
|
||||
$data = [
|
||||
'title' => 'Register'
|
||||
];
|
||||
$view->render('auth/signup', $data);
|
||||
}
|
||||
}
|
22
app/controllers/HomeController.php
Normal file
22
app/controllers/HomeController.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
class HomeController {
|
||||
//private function render($view) {
|
||||
// ob_start();
|
||||
// require_once views . $view;
|
||||
// $content = ob_get_clean();
|
||||
// require_once views . 'layouts/base.php';
|
||||
//}
|
||||
public function index() {
|
||||
$view = new View();
|
||||
$data = [
|
||||
'title' => 'Home'
|
||||
];
|
||||
$view->render('home/index', $data);
|
||||
//require_once views . 'home/index.php';
|
||||
}
|
||||
|
||||
public function home() {
|
||||
$this->index();
|
||||
}
|
||||
}
|
9
app/views/auth/signin.php
Normal file
9
app/views/auth/signin.php
Normal file
@ -0,0 +1,9 @@
|
||||
<section class="signin">
|
||||
<form>
|
||||
<label for="username">Username</label>
|
||||
<input type="text" name="username" id="username">
|
||||
<label for="password">Password</label>
|
||||
<input type="password" name="password" id="password">
|
||||
<input type="submit" value="Sign In" id="submit-signin">
|
||||
</form>
|
||||
</section>
|
11
app/views/auth/signup.php
Normal file
11
app/views/auth/signup.php
Normal file
@ -0,0 +1,11 @@
|
||||
<section class="signup">
|
||||
<form>
|
||||
<label for="username">Username</label>
|
||||
<input type="text" name="username" id="username">
|
||||
<label for="password">Password</label>
|
||||
<input type="password" name="password" id="password">
|
||||
<label for="password-2">Password again</label>
|
||||
<input type="password" name="password-2" id="password-2">
|
||||
<input type="submit" value="Sign Up" id="submit-signup">
|
||||
</form>
|
||||
</section>
|
0
app/views/dashboard/index.php
Normal file
0
app/views/dashboard/index.php
Normal file
13
app/views/errors/404.php
Normal file
13
app/views/errors/404.php
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Habit Tracker | Error 494</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Error 404 - Page not found</h1>
|
||||
<a href="/">Go back home</a>
|
||||
</body>
|
||||
</html>
|
0
app/views/habits/create.php
Normal file
0
app/views/habits/create.php
Normal file
0
app/views/habits/edit.php
Normal file
0
app/views/habits/edit.php
Normal file
4
app/views/home/index.php
Normal file
4
app/views/home/index.php
Normal file
@ -0,0 +1,4 @@
|
||||
<div>
|
||||
<h1>Welcome to Habit Tracker!</h1>
|
||||
<p>Track your habits and achieve your goals.</p>
|
||||
</div>
|
16
app/views/layouts/base.php
Normal file
16
app/views/layouts/base.php
Normal file
@ -0,0 +1,16 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Habit Tracker | <?= $data['title'] ?></title>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<a href="/auth/signin">Log In</a>
|
||||
<a href="/auth/signup">Sign Up</a>
|
||||
</header>
|
||||
<section class="content">
|
||||
<?= $content ?>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
0
app/views/shared/footer.php
Normal file
0
app/views/shared/footer.php
Normal file
4
app/views/shared/header.php
Normal file
4
app/views/shared/header.php
Normal file
@ -0,0 +1,4 @@
|
||||
<header>
|
||||
<a href="/signin">Log In</a>
|
||||
<a href="/signup">Sign Up</a>
|
||||
</header>
|
0
core/Controller.php
Normal file
0
core/Controller.php
Normal file
28
core/Router.php
Normal file
28
core/Router.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
class Router {
|
||||
private $routes = [];
|
||||
|
||||
public function add($route, $action) {
|
||||
$this->routes[$route] = $action;
|
||||
}
|
||||
|
||||
public function dispatch() {
|
||||
$uri = $_SERVER['REQUEST_URI'];
|
||||
$uri = parse_url($uri, PHP_URL_PATH);
|
||||
|
||||
if (array_key_exists($uri, $this->routes)) {
|
||||
$action = $this->routes[$uri];
|
||||
list($controllerName, $methodName) = explode('@', $action);
|
||||
|
||||
require_once controllers . "{$controllerName}.php";
|
||||
|
||||
$controller = new $controllerName();
|
||||
$controller->$methodName();
|
||||
} else {
|
||||
http_response_code(404);
|
||||
$view = new View();
|
||||
$view->render('errors/404');
|
||||
}
|
||||
}
|
||||
}
|
17
core/View.php
Normal file
17
core/View.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
class View
|
||||
{
|
||||
public function render($view, $data = [], $layout = 'base')
|
||||
{
|
||||
// Extract variables to be accessible in the view
|
||||
extract($data);
|
||||
|
||||
// Capture the view content
|
||||
ob_start();
|
||||
require_once views . $view . '.php';
|
||||
$content = ob_get_clean();
|
||||
|
||||
// Include the base layout and inject the view content
|
||||
require_once views . "layouts/$layout.php";
|
||||
}
|
||||
}
|
23
public/index.php
Normal file
23
public/index.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
// Show errors and warnings
|
||||
ini_set('display_errors', '1');
|
||||
ini_set('log_errors', '1');
|
||||
ini_set('error_log', '../storage/logs/error_log.log');
|
||||
|
||||
define('models', __DIR__ . '/../app/models/');
|
||||
define('views', __DIR__ . '/../app/views/');
|
||||
define('controllers', __DIR__ . '/../app/controllers/');
|
||||
|
||||
require_once '../core/Router.php';
|
||||
require_once '../core/View.php';
|
||||
require_once '../core/Controller.php';
|
||||
|
||||
// Initialize router
|
||||
$router = new Router();
|
||||
$router->add('/', 'HomeController@index');
|
||||
$router->add('/home', 'HomeController@home');
|
||||
|
||||
// auth routes
|
||||
$router->add('/auth/signin', 'AuthController@signin');
|
||||
$router->add('/auth/signup', 'AuthController@signup');
|
||||
$router->dispatch();
|
1
storage/logs/.gitignore
vendored
Normal file
1
storage/logs/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
*.log
|
Loading…
Reference in New Issue
Block a user