Презентация: https://www.figma.com/deck/6pIztF333xwHe9RwAraEOg
Веб-платформа для внутренней обратной связи в командах:
- сотрудники оставляют отзывы коллегам;
- менеджеры анализируют динамику по командам;
- есть выгрузка отчетов и экспорт таблиц в Excel;
- дополнительно подключен сервис опросов.
- 1. Что внутри проекта
- 2. Архитектура
- 3. Основной функционал
- 4. API: подробное описание ручек
- 5. Запуск проекта
- 6. Переменные окружения
- 7. Фронтенд: страницы и сценарии
- 8. Полезные замечания
Монорепозиторий состоит из:
frontend/www- React + Vite приложение (порт3000);backend/services/auth_service- сервис пользователей/сессий/профилей (FastAPI, порт8000);backend/services/rate_service- сервис отзывов и топиков (FastAPI, порт8001);backend/services/survey_service- сервис опросов и уведомлений (Go, порт8002);backend/services/django_admin- Django-admin сервис;backend/dockerиfrontend/docker- docker-compose и docker-окружение.
flowchart LR
FE["Frontend (React, :3000)"] --> AUTH["auth_service (:8000)"]
FE --> RATE["rate_service (:8001)"]
FE --> SURVEY["survey_service (:8002)"]
SURVEY --> AUTH
AUTH --> DB[(PostgreSQL :5432)]
RATE --> DB
SURVEY --> DB
Ключевая модель данных:
departments->users(обязательная связь черезdepartment_id);topics->rewiews(по полюtopic);users->rewiews(from_user_id,to_user_id).
- вход по логину/паролю через
POST /v1/sessions/; - токен возвращается:
- в заголовках (
Auth-Token,X-Auth-Token,Authorization: Bearer ...); - в body (
token).
- в заголовках (
- проверка текущего пользователя по токену:
GET /v1/sessions/.
- страница
/team; - форма отзыва:
- выбор команды;
- выбор сотрудника внутри команды;
- выбор топика и нескольких категорий;
- оценка и комментарий;
- отправка отзыва(ов) в
rate_service.
- страница
/dashboard; - загрузка списка команд из API;
- запрос отзывов по выбранной команде;
- визуализация:
- граф взаимодействий;
- фильтруемая таблица отзывов;
- экспорт текущей таблицы в Excel (
.xlsx).
rate_serviceподдерживает экспорт отчета:GET /v1/reviews/report/csvGET /v1/reviews/report/excel
Базовые health-ручки:
GET /v1/api/healthGET /v1/sessions/healthGET /v1/users/healthGET /v1/departments/healthGET /v1/profiles/health
-
POST /v1/sessions/- логин- body:
{ "username": "your_username", "password": "your_password" } - успешный ответ:
200{ "message": "login success", "token": "..." } - также токен приходит в заголовках.
- body:
-
GET /v1/sessions/- получить пользователя по токену- header:
Authorization: Bearer <token> - успешный ответ:
200(объект пользователя с ролью иdepartment_id).
- header:
-
POST /v1/users/- создать пользователя
body:{ "username": "ivan.petrov", "fullname": "Иван Петров", "department_id": "UUID", "password": "secret" } -
GET /v1/users/?skip=0&limit=100- список пользователей -
GET /v1/users/{username}- пользователь по username -
PUT /v1/users/{username}- обновление пользователя -
DELETE /v1/users/{username}- удаление пользователя
POST /v1/departments/- создать отдел
body:{ "name": "Разработка продукта", "description": "Команда разработки и поддержки" }GET /v1/departments/- список отделов
GET /v1/profiles/by-id/{user_id}GET /v1/profiles/by-username/{username}POST /v1/profiles/{user_id}/photo- загрузка фото (multipart/form-data)
Health:
GET /v1/reviews/healthGET /v1/topics/health
-
POST /v1/topics/
body:{ "name": "Соблюдение сроков", "categories": ["Планирование", "Ответственность"], "is_positive": true, "is_active": true } -
GET /v1/topics/- список топиков с категориями
-
POST /v1/reviews/- создать отзыв
body:{ "from_user_id": "UUID", "to_user_id": "UUID", "topic": "Соблюдение сроков", "category": "Ответственность", "context": "Комментарий", "is_positive": true, "rate": 5 } -
GET /v1/reviews/- все отзывы -
GET /v1/reviews/from/{user_id}- отзывы от пользователя -
GET /v1/reviews/to/{user_id}- отзывы к пользователю -
GET /v1/reviews/category/{category}- фильтр по категории -
GET /v1/reviews/positive/{is_positive}- позитив/негатив -
GET /v1/reviews/rate/{rate}- фильтр по оценке -
GET /v1/reviews/department/{department_id}- отзывы по команде (департаменту) -
GET /v1/reviews/report/csv- скачать CSV-отчет -
GET /v1/reviews/report/excel- скачать XLSX-отчет
Health:
GET /health
Все ручки /v1/* требуют:
Authorization: Bearer <session_token>
Ручки:
GET /v1/forms(ADMIN/ROOT)POST /v1/forms(ADMIN/ROOT)GET /v1/forms/{id}(ADMIN/ROOT)POST /v1/forms/{id}/questions(ADMIN/ROOT)POST /v1/forms/{id}/publish(ADMIN/ROOT)GET /v1/my/assignmentsPOST /v1/assignments/{id}/submitGET /v1/my/notificationsGET /v1/my/notifications/unread-countPOST /v1/my/notifications/{id}/read
- Поднимите backend:
cd backend/docker
docker compose up --build- Поднимите frontend:
cd frontend/docker
docker compose up --buildПосле запуска:
- Frontend:
http://localhost:3000 - Auth API:
http://localhost:8000 - Rate API:
http://localhost:8001 - Survey API:
http://localhost:8002 - PostgreSQL:
localhost:5432
Требования:
- Python
3.10+ - Node.js
18+ - Go
1.22+(дляsurvey_service) - PostgreSQL
cd backend/services/auth_service
poetry install
# .env должен содержать DATABASE_URL
poetry run uvicorn app.main:app --reload --port 8000cd backend/services/rate_service
poetry install
# .env должен содержать DATABASE_URL
poetry run uvicorn app.main:app --reload --port 8001cd backend/services/survey_service
# обязательный DATABASE_URL
# опционально AUTH_SERVICE_URL и PORT
go run ./cmd/apicd frontend/www
npm install
npm run devauth_service/.env:
DATABASE_URL=postgresql+asyncpg://postgres:main0000@localhost:5432/postgresrate_service/.env:
DATABASE_URL=postgresql+asyncpg://postgres:main0000@localhost:5432/postgressurvey_service:
DATABASE_URL=postgresql://postgres:main0000@localhost:5432/postgres
AUTH_SERVICE_URL=http://localhost:8000
PORT=8002frontend/www/.env (или .env.local):
VITE_API_BASE_URL=http://localhost:8000
VITE_RATE_API_BASE_URL=http://localhost:8001Роуты:
/- welcome/login;/team- кабинет сотрудника (форма отзыва);/dashboard- кабинет менеджера;/profile- профиль;/employee/:employeeId- страница сотрудника;/notifications- уведомления.
- загрузка команд, сотрудников и топиков;
- выбор сотрудника внутри выбранной команды;
- выбор нескольких категорий;
- отправка отзывов в
rate_service.
- фильтр по команде;
- загрузка отзывов через
GET /v1/reviews/department/{department_id}; - граф связей и таблица отзывов на одних данных;
- экспорт текущей таблицы в Excel.
- приватные страницы доступны только при валидной сессии (
RequireSession); - роль берется из сессии и хранится в
localStorage.
- В коде исторически используется имя сущности
rewiew(с опечаткой). Это нормально для текущего API-контракта. - При старте
auth_serviceиrate_serviceприменяютseed_dataи создают базовые данные. - FastAPI docs доступны по стандартным адресам:
http://localhost:8000/docshttp://localhost:8001/docs