163 lines
6.0 KiB
Markdown
163 lines
6.0 KiB
Markdown
# 📅 Teacher Schedule
|
||
|
||
Веб-приложение для просмотра расписания преподавателей ПГУТИ. Парсит расписание с сайта [lk.ks.psuti.ru](https://lk.ks.psuti.ru/?mn=3) и отображает в удобном тёмном интерфейсе с поиском по ФИО.
|
||
|
||

|
||

|
||

|
||
|
||
## Возможности
|
||
|
||
- 🔍 **Поиск по ФИО** — живой поиск по всем 100+ преподавателям с подсветкой совпадений
|
||
- ⭐ **Избранные** — быстрые табы для часто просматриваемых преподавателей (настраиваются в `config.yaml`)
|
||
- 📆 **Навигация по неделям** — переключение вперёд/назад
|
||
- 🟢 **Текущая пара** — автоматически подсвечивается идущее сейчас занятие
|
||
- 📊 **Статистика недели** — рабочие дни, количество пар, групп и часов
|
||
- 📱 **Адаптивный интерфейс** — удобно на телефоне и десктопе
|
||
|
||
## Скриншоты
|
||
|
||

|
||
|
||
## Стек
|
||
|
||
- **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
|