Files
2026-08-02 23:02:01 +04:00

177 lines
9.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div align="center">
<img src="static/images/igor-bezrukavov.jpg" alt="Игорь Олегович Безрукавов" width="180" height="180" style="object-fit: cover; border-radius: 50%;">
# ИО · physics & math
### Персональный сайт преподавателя физики и математики
Подготовка к ОГЭ и ЕГЭ, индивидуальные консультации и удобная онлайн-запись.
![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?style=flat-square&logo=python&logoColor=white)
![Django](https://img.shields.io/badge/Django-5.x-0C4B33?style=flat-square&logo=django&logoColor=white)
![SQLite](https://img.shields.io/badge/SQLite-development-003B57?style=flat-square&logo=sqlite&logoColor=white)
![Status](https://img.shields.io/badge/status-in%20development-ee7046?style=flat-square)
</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. Подготовка базы
```powershell
.\.venv\Scripts\python.exe manage.py migrate
.\.venv\Scripts\python.exe manage.py createsuperuser
```
Команда `createsuperuser` попросит придумать логин и пароль для кабинета преподавателя.
### 3. Запуск
```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>