# 📅 Teacher Schedule Веб-приложение для просмотра расписания преподавателей ПГУТИ. Парсит расписание с сайта [lk.ks.psuti.ru](https://lk.ks.psuti.ru/?mn=3) и отображает в удобном тёмном интерфейсе с поиском по ФИО. ![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=flat&logo=python&logoColor=white) ![Flask](https://img.shields.io/badge/Flask-2.3+-000000?style=flat&logo=flask) ![License](https://img.shields.io/badge/license-MIT-green?style=flat) ## Возможности - 🔍 **Поиск по ФИО** — живой поиск по всем 100+ преподавателям с подсветкой совпадений - ⭐ **Избранные** — быстрые табы для часто просматриваемых преподавателей (настраиваются в `config.yaml`) - 📆 **Навигация по неделям** — переключение вперёд/назад - 🟢 **Текущая пара** — автоматически подсвечивается идущее сейчас занятие - 📊 **Статистика недели** — рабочие дни, количество пар, групп и часов - 📱 **Адаптивный интерфейс** — удобно на телефоне и десктопе ## Скриншоты ![screenshot](screen1.png) ## Стек - **Backend:** Python 3, Flask, BeautifulSoup4 (lxml) - **Frontend:** Vanilla JS, CSS Grid, без фреймворков - **Deploy:** systemd + Caddy (автоматический HTTPS) ## Быстрый старт ### 1. Клонировать репозиторий ```bash git clone https://github.com/kilyabin/kspsuti-teacher-schedule.git cd kspsuti-teacher-schedule ``` ### 2. Создать виртуальное окружение и установить зависимости ```bash bash setup.sh ``` ### 3. Настроить `config.yaml` ```yaml base_url: "https://lk.ks.psuti.ru" default_teacher: 244 # чье расписание будет при входе в веб-приложение, obj= из ссылки нужного преподавателя teachers: # избранные — отображаются как быстрые табы - id: 244 name: "ПОЛНОЕ ФИО" short: "КРАТКО ФИО" - id: 229 name: "ПОЛНОЕ ФИО" short: "КРАТКОЕ ФИО" ``` ID преподавателя берётся из ссылки на сайте: `https://lk.ks.psuti.ru/?mn=3&obj=`**244** → `id: 244` ### 4. Запустить ```bash source venv/bin/activate python app.py ``` Открыть в браузере: [http://localhost:5609](http://localhost:5609) --- ## Деплой на сервер ### systemd сервис ```bash sudo bash install-service.sh ``` Скрипт автоматически определяет путь к проекту и текущего пользователя, копирует unit-файл в `/etc/systemd/system/schedule.service` и запускает сервис. Управление сервисом: ```bash sudo systemctl status schedule # статус sudo systemctl restart schedule # перезапуск sudo systemctl stop schedule # остановить journalctl -u schedule -f # логи в реальном времени ``` ### Caddy — HTTPS по домену Установить Caddy ([официальная инструкция](https://caddyserver.com/docs/install)): ```bash sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \ | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \ | sudo tee /etc/apt/sources.list.d/caddy-stable.list sudo apt update && sudo apt install caddy ``` Конфиг `/etc/caddy/Caddyfile`: ```caddy { acme_ca https://acme-v02.api.letsencrypt.org/directory email your@email.com } your.domain.com { reverse_proxy localhost:5609 encode gzip } ``` ```bash sudo systemctl reload caddy ``` Caddy автоматически получит TLS-сертификат от Let's Encrypt. Убедись что порты **80** и **443** открыты в файрволе и security groups облака. --- ## Структура проекта ``` . ├── app.py # Flask-приложение, парсер расписания ├── config.yaml # Настройки: URL, избранные преподаватели ├── requirements.txt # Зависимости Python ├── setup.sh # Создаёт venv и ставит зависимости ├── install-service.sh # Устанавливает systemd сервис ├── schedule.service.template # Шаблон systemd unit-файла ├── Caddyfile # Пример конфига Caddy └── templates/ └── index.html # Фронтенд (всё в одном файле) ``` ## API | Метод | Эндпоинт | Описание | |-------|----------|----------| | GET | `/api/teachers` | Избранные преподаватели из `config.yaml` | | GET | `/api/all-teachers` | Все преподаватели с сайта (кэш 1 час) | | GET | `/api/schedule?obj=244` | Расписание на текущую неделю | | GET | `/api/schedule?obj=244&wk=321` | Расписание на конкретную неделю | | GET | `/api/reload-config` | Перечитать `config.yaml` без перезапуска | ## Обновление конфига без перезапуска Если добавил преподавателей в `config.yaml` на живом сервере: ```bash curl http://localhost:5609/api/reload-config ``` ## Лицензия MIT