kilyabin 2893a9fd18 feat: добавлена навигация по неделям с возможностью отключения через админ-панель
feat: добавлена навигация по неделям с возможностью отключения через админ-панель

Реализована навигация по неделям в расписании с парсингом ссылок из HTML страницы
оригинального сайта. Добавлена возможность управления навигацией через админ-панель
с сохранением настроек в файл.

Основные изменения:

- Парсинг навигации по неделям:
  * Добавлены типы WeekInfo и ParseResult в парсер
  * Реализована функция parseWeekNavigation для извлечения ссылок с параметром wk
  * Парсер ищет ссылки в href, onclick, формах и других атрибутах
  * Автоматическое определение номеров недель из текста ссылок и контекста
  * Вычисление соседних недель на основе найденных данных

- API и функции:
  * Обновлена функция getSchedule для поддержки параметра wk в URL
  * Обновлен getServerSideProps для чтения параметра wk из query string
  * Кэширование расписания с учетом недели (ключ включает group + wk)

- Компоненты:
  * Создан компонент WeekNavigation с кнопками навигации
  * Интегрирована навигация в компонент Schedule
  * Навигация работает через изменение URL параметра wk

- Система настроек:
  * Создан settings-loader для загрузки/сохранения настроек в JSON
  * Добавлен API endpoint /api/admin/settings для управления настройками
  * Добавлен переключатель в админ-панели для включения/выключения навигации
  * Настройки сохраняются в src/shared/data/settings.json и переживают перезапуски

- Файлы:
  * src/app/parser/schedule.ts - парсинг навигации по неделям
  * src/app/agregator/schedule.ts - поддержка параметра wk
  * src/pages/[group].tsx - чтение wk из query и передача настроек
  * src/widgets/schedule/week-navigation.tsx - компонент навигации
  * src/widgets/schedule/index.tsx - интеграция навигации
  * src/pages/admin.tsx - управление настройками
  * src/shared/data/settings-loader.ts - загрузка/сохранение настроек
  * src/pages/api/admin/settings.ts - API для настроек
  * src/shared/data/settings.json - файл с настройками
2025-11-23 02:24:27 +04:00
2025-11-18 04:13:20 +04:00
2025-11-18 04:23:31 +04:00
2023-10-01 20:18:37 +04:00
2025-11-18 04:13:20 +04:00
2023-10-01 18:53:04 +04:00
2025-11-18 03:36:47 +04:00
2025-11-18 03:57:22 +04:00
2025-11-18 03:57:22 +04:00
2023-10-15 01:01:34 +04:00
2023-10-01 18:53:04 +04:00
2025-11-18 04:16:52 +04:00

Schedule for колледж связи пгути

Reskin of https://lk.ks.psuti.ru/ since it lacks mobile support.

Screenshot

Screenshot

Visit website

Tech stack & features

  • React 19.2.0 with Next.js 16.0.3 (pages router)
  • Tailwind CSS
  • @shadcn/ui components (built with Radix UI)
  • JSDOM for parsing scraped pages, rehydration strategy for cache
  • TypeScript 5.6.0 with types for each package
  • Telegram Bot API (via [node-telegram-bot-api]) for parsing failure notifications
  • Custom js parser for teachers' photos
  • Accessability & tab navigation support
  • Dark theme with automatic switching based on system settings

Tools used: pnpm, eslint, react-icons. Deployed with Netlify and supported by Cloudflare.

Development

Prerequisites

  • Node.js 20+ (see .nvmrc)
  • npm 10+ or pnpm

Local development

# Install dependencies
npm install
# or
pnpm install

# Run development server
npm run dev
# or
pnpm dev

Docker deployment

Build and run with Docker

# Build the image
docker build -t kspguti-schedule .

# Run the container
docker run -p 3000:3000 kspguti-schedule

Using Docker Compose

# Build and start
docker-compose up -d

# View logs
docker-compose logs -f

# Stop
docker-compose down

Environment variables: Edit docker-compose.yml to add your environment variables:

  • PROXY_URL - URL for schedule parsing
  • PARSING_FAILURE_NOTIFICATIONS_TELEGRAM_BOTAPI_TOKEN - Telegram bot token
  • PARSING_FAILURE_NOTIFICATIONS_TELEGRAM_CHAT_ID - Telegram chat ID

Production deployment

Netlify

The project includes netlify.toml for automatic deployment configuration.

Docker

The Dockerfile uses Next.js standalone output for optimized production builds. The image includes:

  • Multi-stage build for smaller image size
  • Non-root user for security
  • Health checks
  • Production optimizations

System installation (Linux systemd)

Install the application directly on a Linux system as a systemd service:

Prerequisites:

  • Linux system with systemd
  • Node.js 20+ installed
  • Root/sudo access
  • ICU library (for Node.js):
    • Arch Linux: sudo pacman -S icu
    • Ubuntu/Debian: sudo apt-get install libicu-dev
    • Fedora/RHEL/CentOS: sudo dnf install libicu or sudo yum install libicu

Installation:

# Clone the repository
git clone <repository-url>
cd kspguti-schedule

# Run the installation script
sudo ./scripts/install.sh

The installation script will:

  • Check Node.js and npm versions
  • Copy files to /opt/kspguti-schedule
  • Install dependencies
  • Build the production version
  • Install and enable systemd service

Configuration:

  1. Edit environment variables:
sudo nano /opt/kspguti-schedule/.env

The installation script will:

  • Copy .env file from source directory if it exists
  • Preserve existing .env in installation directory if it already exists
  • Create .env from .env.production.example if no .env file is found
  1. Update systemd service if needed:
sudo nano /etc/systemd/system/kspguti-schedule.service

Managing the service:

Use the management script for easy service control:

# Start the service
sudo ./scripts/manage.sh start

# Stop the service
sudo ./scripts/manage.sh stop

# Restart the service
sudo ./scripts/manage.sh restart

# Check status
./scripts/manage.sh status

# View logs
./scripts/manage.sh logs
./scripts/manage.sh logs -f  # Follow logs

# Update application
sudo ./scripts/manage.sh update

# Enable/disable autostart
sudo ./scripts/manage.sh enable
sudo ./scripts/manage.sh disable

Or use systemctl directly:

sudo systemctl start kspguti-schedule
sudo systemctl stop kspguti-schedule
sudo systemctl restart kspguti-schedule
sudo systemctl status kspguti-schedule
sudo journalctl -u kspguti-schedule -f

Service configuration:

  • Installation directory: /opt/kspguti-schedule
  • Service user: www-data
  • Port: 3000 (configurable via environment variables)
  • Logs: journalctl -u kspguti-schedule

Environment variables:

See .env.production.example or .example.env for available options. The application uses .env file in production:

  • PROXY_URL - URL for schedule parsing (optional)
  • PARSING_FAILURE_NOTIFICATIONS_TELEGRAM_BOTAPI_TOKEN - Telegram bot token (optional)
  • PARSING_FAILURE_NOTIFICATIONS_TELEGRAM_CHAT_ID - Telegram chat ID (optional)

Other platforms

The project can be deployed to any platform supporting Node.js 20+:

  • Vercel
  • Railway
  • DigitalOcean App Platform
  • AWS App Runner
  • Any Docker-compatible platform
Description
No description provided
Readme AGPL-3.0 1.7 MiB
Languages
TypeScript 81.4%
JavaScript 11.7%
Shell 5.1%
CSS 1.2%
Dockerfile 0.5%
Other 0.1%