siteforglod/README.md
2026-05-19 09:40:26 +03:00

4.8 KiB
Raw Blame History

FitnessCenter (Django + Bootstrap)

Простой сайт фитнес‑клуба с регистрацией, логином и покупкой абонементов. Упакован в Docker.

Стек и зависимости

  • Backend: Python 3.13, Django 5.1.4 (requirements.txt).
  • Frontend: Bootstrap 5 (CDN), шрифт Manrope (Google Fonts), кастомный CSS static/css/main.css.
  • БД по умолчанию: SQLite (db.sqlite3). Настроена смена на Postgres при необходимости.
  • Docker: python:3.13-slim, entrypoint выполняет миграции и стартует runserver.
  • Встроенный список клубов (Ростов-на-Дону) доступен во всех шаблонах через context processor.

Маршруты и HTTPзапросы

Все маршруты определены в club/urls.py и подключены через gymclub/urls.py.

  • GET / — главная витрина с планами (views.home).
  • GET /register/ — форма регистрации. POST /register/ — создаёт пользователя и профиль, логинит, редирект в кабинет.
  • GET /login/ — форма входа. POST /login/ — аутентификация через Django AuthenticationForm.
  • POST /logout/ (кнопка делает обычный GET, но view вызывает logout и редиректит) — выход из аккаунта.
  • GET /dashboard/ — личный кабинет (требует авторизации): активный абонемент, история, покупка новых.
  • POST /subscribe/<int:plan_id>/ — покупка абонемента, создаёт Subscription с расчётом даты окончания.
  • admin/ — стандартная Djangoадминка для планов/подписок/профилей.

Примечания:

  • Все формы используют CSRFтокен.
  • Сообщения пользователю выводятся через Django messages (успех/ошибка).
  • API JSON не реализован; взаимодействие сервер‑рендерингом HTML.
  • Проверка паролей упрощена: отключена CommonPasswordValidator (часто используемые пароли не блокируются).
  • Телефон проверяется на реальный российский номер: формат +7XXXXXXXXXX, сохраняется в профиль.

Модели данных (club/models.py)

  • MembershipPlan: name, description, duration_days, price, created_at.
  • Profile: user (OneToOne), phone, created_at.
  • Subscription: user, plan, start_date, end_date, created_at, вычисляемый is_active.
  • Миграция 0002_default_plans создаёт 3 дефолтных тарифа (1, 3, 12 месяцев).
  • Контекстный список клубов в Ростове-на-Дону (5 адресов).

Формы

  • RegistrationForm (расширенный UserCreationForm): username, имя, фамилия, телефон, email, пароль ×2; автосоздаёт Profile.
  • LoginForm (AuthenticationForm) с Bootstrapклассами.

Шаблоны и статика

  • Базовый шаблон: templates/base.html (шапка, футер, вывод messages).
  • Страницы: home.html, register.html, login.html, dashboard.html.
  • Статика: static/css/main.css, static/img/logo.jpg.

Как запустить в Docker

# 1) Скопируйте пример env
cp .env.example .env
# 2) Соберите контейнер
docker compose build
# 3) Запустите
docker compose up

Приложение будет доступно на http://localhost:8000

Локальный запуск без Docker

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver

Переменные окружения

  • DJANGO_DEBUG (True/False)
  • DJANGO_ALLOWED_HOSTS (список через запятую)
  • DJANGO_SECRET_KEY

Структура проекта

  • gymclub/ — настройки Django.
  • club/ — модели, формы, views, urls.
  • templates/ — Bootstrapшаблоны.
  • static/ — CSS и логотип.
  • docker-compose.yml, Dockerfile, entrypoint.sh — контейнеризация.

Замена БД на Postgres (пример)

Добавьте сервис postgres в docker-compose.yml и смените DATABASES в gymclub/settings.py на django.db.backends.postgresql с нужными переменными (HOST, PORT, USER, PASSWORD, NAME).