Files
PracticaENERGO2/README.md

9.3 KiB
Raw Blame History

ROBO-OPS — личный кабинет оператора робота

Веб-приложение для управления роботами и ведения профиля оператора.
Стек: Python, FastAPI, SQLite, HTML, CSS, JavaScript.


Запуск приложения

Единственный способ запуска — скрипт start.sh.

Другие команды (python run.py, uvicorn, python -m http.server и т.п.) не поддерживаются — приложение откажется стартовать без переменной окружения, которую выставляет только start.sh.

Требования

  • Python 3.10 или новее
  • Bash (Linux, macOS, Git Bash или WSL на Windows)

Первый запуск

cd путь/к/ПРАКТИКА
chmod +x start.sh    # один раз, если скрипт не исполняемый
./start.sh

Что делает start.sh

  1. Определяет каталог проекта
  2. Создаёт виртуальное окружение .venv (если его нет) и устанавливает зависимости из requirements.txt
  3. Создаёт папку data/ и файл базы SQLite (если их нет)
  4. Запускает сервер FastAPI на порту 8000

Для проверяющего: в архив сдаётся только исходный код (16 файлов). Папки .venv, data/ и __pycache__/ не нужны — они создаются автоматически при первом запуске ./start.sh.

После запуска

Адрес Назначение
http://localhost:8000 Главная (панель роботов)
http://localhost:8000/register Регистрация
http://localhost:8000/login Вход
http://localhost:8000/docs Документация API (Swagger)

Остановка сервера: Ctrl+C в терминале.

Переменные окружения (необязательно)

Переменная По умолчанию Описание
PORT 8000 Порт сервера
EXTERNAL_API_KEY robo-ops-external-demo-key-2026 Ключ для внешнего API
DATABASE_PATH ./data/robo_ops.db Путь к файлу БД

Пример:

PORT=9000 ./start.sh

Принцип работы приложения

Общая схема

Браузер (HTML/CSS/JS)
        │
        ▼  HTTP + cookie-сессия
   FastAPI (app/main.py)
        │
        ▼
   SQLite (data/robo_ops.db)
        ▲
        │  X-API-Key
   Внешние приложения

Фронтенд — статические страницы в папке static/.
Бэкенд — REST API на FastAPI.
Данные хранятся в SQLite.

Регистрация и авторизация

  1. Пользователь регистрируется на /register (email + пароль от 6 символов).
  2. Пароль хешируется через bcrypt и сохраняется в таблице users.
  3. При регистрации или входе создаётся сессия в таблице sessions.
  4. В браузер отправляется HttpOnly-cookie robo_ops_session (срок — 24 часа).
  5. Токен сессии в БД хранится в виде SHA-256 хеша, не в открытом виде.

Без активной сессии доступ к главной странице и API закрыт — браузер перенаправляется на /login.

Личный кабинет

В профиле оператора хранятся и редактируются:

  • электронная почта (только чтение после регистрации)
  • имя, фамилия, отчество
  • возраст
  • номер телефона
  • рейтинг и баллы (обновляются также через внешнее API)

На странице профиля отображаются активные сессии текущего пользователя.

Панель управления роботами

У каждого пользователя — свой набор из 4 роботов (настройки в таблице robot_settings).

При изменении параметров (режим, скорость, чувствительность, аварийная остановка, ночной режим):

  • пересчитываются характеристики робота (скорость, температура, статус, датчики);
  • данные сохраняются в SQLite через API;
  • при переходе между страницами настройки не теряются.

Безопасность

Мера Реализация
Пароли bcrypt-хеширование
Сессии HttpOnly cookie, хеш токена в БД, срок жизни 24 ч
Внешний API Заголовок X-API-Key
Валидация Pydantic-схемы для всех входных данных
SQL Параметризованные запросы

API

Метод Путь Описание
POST /api/auth/register Регистрация
POST /api/auth/login Вход
POST /api/auth/logout Выход
GET /api/auth/me Текущий пользователь
GET/PUT /api/profile Профиль
GET /api/sessions Активные сессии
GET/PUT /api/robots Настройки роботов

Для внешних приложений (заголовок X-API-Key)

Метод Путь Описание
GET /api/external/users Список пользователей
GET /api/external/users/{id} Пользователь по ID
GET /api/external/users/by-email/{email} Пользователь по email
GET /api/external/sessions Активные сессии
POST /api/external/data Запись данных
GET /api/external/data Чтение записей

Пример записи баллов из внешней системы:

curl -X POST http://localhost:8000/api/external/data \
  -H "X-API-Key: robo-ops-external-demo-key-2026" \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": 1,
    "source_app": "mission-tracker",
    "data_key": "mission_complete",
    "data_value": {"points": 50, "rating": 4.5}
  }'

Поля points и rating в data_value автоматически обновляют профиль пользователя.


Структура проекта

ПРАКТИКА/
├── start.sh              ← единственная точка запуска
├── README.md             ← эта инструкция
├── requirements.txt      ← зависимости Python
├── app/
│   ├── __init__.py
│   ├── main.py           ← FastAPI, маршруты, API
│   ├── database.py       ← SQLite, модели данных
│   ├── security.py       ← bcrypt, токены сессий
│   ├── schemas.py        ← валидация запросов
│   └── config.py         ← настройки
└── static/
    ├── index.html        ← главная страница
    ├── login.html        ← вход
    ├── register.html     ← регистрация
    ├── css/styles.css    ← стили
    └── js/               ← api.js, app.js, auth.js

После первого запуска ./start.sh рядом появятся служебные каталоги (их не нужно сдавать):

  • .venv/ — виртуальное окружение Python
  • data/ — файл базы robo_ops.db

Типичные проблемы

«Приложение запускается только через ./start.sh»
Вы запустили сервер в обход скрипта. Используйте ./start.sh.

На Windows не работает ./start.sh
Запускайте через Git Bash или WSL, не через обычный PowerShell.

Порт 8000 занят

PORT=9000 ./start.sh

Нет Python
Установите Python 3.10+ с https://python.org и повторите ./start.sh.

Перед отправкой архива
Не включайте папки .venv, data/ и __pycache__/. Если .venv не удаляется (файлы заняты процессом Python), закройте терминалы и IDE, затем удалите папку вручную.