Compare commits
No commits in common. "3144078860b19c81a8f6b9761f1ac7c728076c7d" and "4d7edeea88c6b05dde81e24b87769797cd7e96a2" have entirely different histories.
3144078860
...
4d7edeea88
84
README.md
84
README.md
@ -1,83 +1,3 @@
|
|||||||
# 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.
|
@ -1,19 +0,0 @@
|
|||||||
<?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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
<?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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
<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>
|
|
@ -1,11 +0,0 @@
|
|||||||
<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>
|
|
@ -1,13 +0,0 @@
|
|||||||
|
|
||||||
<!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>
|
|
@ -1,4 +0,0 @@
|
|||||||
<div>
|
|
||||||
<h1>Welcome to Habit Tracker!</h1>
|
|
||||||
<p>Track your habits and achieve your goals.</p>
|
|
||||||
</div>
|
|
@ -1,16 +0,0 @@
|
|||||||
<!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>
|
|
@ -1,4 +0,0 @@
|
|||||||
<header>
|
|
||||||
<a href="/signin">Log In</a>
|
|
||||||
<a href="/signup">Sign Up</a>
|
|
||||||
</header>
|
|
@ -1,28 +0,0 @@
|
|||||||
<?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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
<?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";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
<?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
1
storage/logs/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
*.log
|
|
Loading…
Reference in New Issue
Block a user