- settings.py: load_dotenv из .env (python-dotenv) - requirements.txt: + python-dotenv - .env.example: DJANGO_SECRET_KEY / DJANGO_DEBUG / DJANGO_ALLOWED_HOSTS с инструкциями - README: секция настройки окружения, миграции (в т.ч. таблицы django-axes) - проверено: manage.py check без ошибок, migrate создал таблицы axes
195 lines
9.8 KiB
Markdown
195 lines
9.8 KiB
Markdown
<div align="center">
|
||
|
||
<img src="static/images/igor-bezrukavov.jpg" alt="Игорь Олегович Безрукавов" width="180" height="180" style="object-fit: cover; border-radius: 50%;">
|
||
|
||
# ИО · physics & math
|
||
|
||
### Персональный сайт преподавателя физики и математики
|
||
|
||
Подготовка к ОГЭ и ЕГЭ, индивидуальные консультации и удобная онлайн-запись.
|
||
|
||

|
||

|
||

|
||

|
||
|
||
</div>
|
||
|
||
<br>
|
||
|
||
## О проекте
|
||
|
||
Сайт Игоря Олеговича Безрукавова — преподавателя физики и математики, выпускника АГУ с опытом преподавания и репетиторства более 10 лет.
|
||
|
||
Главная задача проекта — превратить первый интерес ученика в понятный путь к консультации: показать подход преподавателя, помочь выбрать свободное время и сохранить заявку в рабочем кабинете.
|
||
|
||
## Возможности
|
||
|
||
| Для ученика | Для преподавателя |
|
||
| --- | --- |
|
||
| Адаптивный лендинг с личной подачей | Дашборд с ключевыми показателями |
|
||
| Раздельные направления: физика и математика | Управление свободными окнами |
|
||
| ОГЭ, ЕГЭ и школьная программа | Статусы заявок от «Новая» до «Проведена» |
|
||
| Выбор класса, формата и свободного времени | Быстрые массовые действия |
|
||
| Защита от двойной записи на один слот | Ссылка на онлайн-встречу и заметки |
|
||
| Политика конфиденциальности и согласие | Фильтры, поиск и история изменений |
|
||
|
||
### Как работает запись
|
||
|
||
```text
|
||
Преподаватель открывает время в админке
|
||
↓
|
||
Свободный слот появляется на сайте
|
||
↓
|
||
Ученик заполняет форму и выбирает слот
|
||
↓
|
||
Заявка появляется в кабинете преподавателя
|
||
↓
|
||
Подтверждение → консультация → статус «Проведена»
|
||
```
|
||
|
||
## Технологии
|
||
|
||
- **Backend:** Django 5, Python
|
||
- **Database:** SQLite для разработки
|
||
- **Frontend:** Django Templates, HTML, CSS
|
||
- **Admin:** кастомизированная Django Admin с дашбордом
|
||
- **Static:** локальные CSS и изображения
|
||
- **Timezone:** `Europe/Astrakhan`
|
||
|
||
## Быстрый запуск
|
||
|
||
### 1. Установка зависимостей
|
||
|
||
В терминале PyCharm, находясь в корне проекта:
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
|
||
```
|
||
|
||
### 2. Настройка окружения
|
||
|
||
Скопируйте `.env.example` в `.env` и заполните:
|
||
|
||
```powershell
|
||
Copy-Item .env.example .env
|
||
```
|
||
|
||
Обязательные переменные (без них приложение не стартует):
|
||
|
||
| Переменная | Описание |
|
||
| --- | --- |
|
||
| `DJANGO_SECRET_KEY` | Секретный ключ Django. Сгенерировать: `python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"` |
|
||
| `DJANGO_DEBUG` | `1` для разработки, пусто/`0` для продакшена |
|
||
| `DJANGO_ALLOWED_HOSTS` | Разрешённые хосты через запятую (в проде — домен) |
|
||
|
||
`.env` в git не попадает (уже в `.gitignore`).
|
||
|
||
### 3. Подготовка базы
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe manage.py migrate
|
||
.\.venv\Scripts\python.exe manage.py createsuperuser
|
||
```
|
||
|
||
`migrate` создаст таблицы проекта и django-axes (защита от брутфорса).
|
||
|
||
### 4. Запуск
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe manage.py runserver
|
||
```
|
||
|
||
После запуска:
|
||
|
||
| Адрес | Назначение |
|
||
| --- | --- |
|
||
| `http://127.0.0.1:8000/` | Публичный сайт |
|
||
| `http://127.0.0.1:8000/admin/` | Кабинет преподавателя |
|
||
| `http://127.0.0.1:8000/privacy/` | Политика конфиденциальности |
|
||
|
||
## Ежедневная работа преподавателя
|
||
|
||
1. Откройте раздел **«Расписание»** в админ-панели.
|
||
2. Добавьте свободное окно: дату, время, длительность, предмет и формат.
|
||
3. Убедитесь, что у слота включён флаг **«Открыт для записи»**.
|
||
4. Новая заявка появится в разделе **«Записи на консультации»**.
|
||
5. Проверьте контакты, подтвердите заявку и при необходимости добавьте ссылку на встречу.
|
||
6. После занятия переведите заявку в статус **«Проведена»**.
|
||
|
||
Отменённый слот снова становится доступным для записи. Копировать регулярное расписание можно массовым действием **«Создать копии на следующую неделю»**.
|
||
|
||
> Важно: сайт показывает только заранее созданные свободные окна. Если в расписании нет слотов, на главной странице будет отображаться `0` свободных мест.
|
||
|
||
## Статусы заявок
|
||
|
||
| Статус | Когда использовать |
|
||
| --- | --- |
|
||
| **Новая** | Заявка пришла с сайта и ещё не обработана |
|
||
| **Подтверждена** | Время согласовано с учеником |
|
||
| **Проведена** | Консультация состоялась |
|
||
| **Отменена** | Занятие отменено, слот можно использовать снова |
|
||
| **Не пришёл** | Ученик не подключился или не пришёл |
|
||
|
||
## Структура проекта
|
||
|
||
```text
|
||
teacher_site/
|
||
├── config/ # настройки и маршруты Django
|
||
├── consultations/ # основное приложение
|
||
│ ├── migrations/ # миграции базы данных
|
||
│ ├── templates/
|
||
│ │ ├── admin/ # дашборд и тема админ-панели
|
||
│ │ └── consultations/ # публичные страницы
|
||
│ ├── admin.py # расписание, заявки и действия
|
||
│ ├── forms.py # форма записи и валидация
|
||
│ ├── models.py # слоты и записи
|
||
│ └── views.py # публичные страницы
|
||
├── static/
|
||
│ ├── admin/css/ # оформление кабинета
|
||
│ ├── css/ # оформление сайта
|
||
│ └── images/ # фотография преподавателя
|
||
├── manage.py
|
||
├── requirements.txt
|
||
└── README.md
|
||
```
|
||
|
||
## Проверка проекта
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe manage.py check
|
||
.\.venv\Scripts\python.exe manage.py makemigrations --check --dry-run
|
||
```
|
||
|
||
Обе команды должны завершиться без ошибок и сообщений о новых миграциях.
|
||
|
||
## Перед публикацией
|
||
|
||
В `config/settings.py` обязательно:
|
||
|
||
- заменить `SECRET_KEY` на секретное значение;
|
||
- установить `DEBUG = False`;
|
||
- указать домен в `ALLOWED_HOSTS`;
|
||
- настроить `STATIC_ROOT` и выполнить `collectstatic`;
|
||
- заменить SQLite на PostgreSQL, если проектом будут пользоваться постоянно;
|
||
- настроить резервное копирование базы и защиту админ-панели.
|
||
|
||
Для автоматических уведомлений в Telegram или по email понадобятся отдельные токены и данные для подключения. Сейчас заявки надёжно сохраняются в админ-панели, а поле напоминания позволяет отмечать обработку вручную.
|
||
|
||
## Идеи для следующего этапа
|
||
|
||
- Telegram-уведомление о новой заявке;
|
||
- автоматическое подтверждение и напоминание о занятии;
|
||
- интеграция с календарём преподавателя;
|
||
- онлайн-оплата консультаций;
|
||
- личный кабинет ученика;
|
||
- публикация отзывов и полезных материалов.
|
||
|
||
<br>
|
||
|
||
<div align="center">
|
||
|
||
Сделано для спокойной и понятной подготовки к экзаменам.
|
||
|
||
</div>
|