commit ef711d461fd12302deddfb1e75fe7b327d6b64e7 Author: DevSecOps Date: Fri Jul 3 15:03:30 2026 +0000 feat: LocalPro Finder — отзывы, рейтинги, чат, AI-оценка, диагностика, подписки diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..3f47e7f --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.12-slim AS base + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 8000 + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..33d642a --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,14 @@ +fastapi==0.115.6 +uvicorn[standard]==0.34.0 +sqlalchemy[asyncio]==2.0.37 +alembic==1.14.1 +asyncpg==0.30.0 +pydantic-settings==2.7.1 +pydantic[email]==2.9.2 +python-jose[cryptography]==3.3.0 +passlib[bcrypt]==1.7.4 +openai==1.58.1 +redis[hiredis]==5.2.1 +celery==5.4.0 +stripe==11.3.0 +python-multipart==0.0.18 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..62afcaa --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,55 @@ +version: "3.9" + +services: + postgres: + image: postgres:16-alpine + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + POSTGRES_DB: freelancer_match + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + + redis: + image: redis:7-alpine + ports: + - "6379:6379" + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + + backend: + build: ./backend + environment: + DATABASE_URL: postgresql+asyncpg://postgres:${POSTGRES_PASSWORD:-postgres}@postgres:5432/freelancer_match + REDIS_URL: redis://redis:6379/0 + SECRET_KEY: ${SECRET_KEY} + OPENAI_API_KEY: ${OPENAI_API_KEY} + ports: + - "8000:8000" + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + + frontend: + build: ./frontend + environment: + NEXT_PUBLIC_API_URL: http://backend:8000 + ports: + - "3000:3000" + depends_on: + - backend + +volumes: + pgdata: diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..a893bf1 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,41 @@ +{ + "name": "freelancer-match-frontend", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@hookform/resolvers": "^3.9.0", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-select": "^2.1.2", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.1", + "@tanstack/react-query": "^5.60.5", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.460.0", + "next": "^14.2.0", + "react": "^18.3.0", + "react-dom": "^18.3.0", + "react-hook-form": "^7.53.2", + "tailwind-merge": "^2.6.0", + "zod": "^3.23.8", + "zustand": "^4.5.5" + }, + "devDependencies": { + "@types/node": "^20.17.0", + "@types/react": "^18.3.0", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.20", + "eslint": "^8.57.0", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.15", + "typescript": "^5.6.0" + } +} diff --git a/localpro-finder-spec.md b/localpro-finder-spec.md new file mode 100644 index 0000000..efaeea3 --- /dev/null +++ b/localpro-finder-spec.md @@ -0,0 +1,198 @@ +# LocalPro Finder — Спецификация фичей (Reviews, Ratings, Chat) + +## Анализ конкурентов + +### TaskRabbit +- **Отзывы:** Только после завершения задачи, верифицированные покупателем +- **Рейтинг:** 5-звёздочный с разбивкой по категориям (качество, пунктуальность, коммуникация) +- **Чат:** Встроенный мессенджер между клиентом и мастером в приложении +- **Безопасность:** Проверка личности и криминального прошлого мастера + +### Thumbtack +- **Отзывы:** Детальные текстовые отзывы с фото работ, верификация через платформу +- **Рейтинг:** 5-звёздочный + "Top Pro" бейдж для лучших мастеров +- **Чат:** Встроенный чат до и после найма мастера + +### HomeAdvisor +- **Отзывы:** Верифицированные отзывы с подтверждением работы, True Cost Guide +- **Рейтинг:** 5-звёздочный + лицензия/страховка мастера +- **Чат:** Через платформу, без показа личных контактов до найма + +### Профи.ру (RU) +- **Отзывы:** Только после работы, проверка каждого отзыва, "Пять с плюсом" бейдж +- **Рейтинг:** 5-звёздочный + количество отзывов влияет на позицию в выдаче +- **Чат:** Мастера пишут сами клиенту, чат внутри платформы + +--- + +## Фича 1: Система отзывов и рейтингов + +### Модель данных +```yaml +Review: + id: uuid + master_id: uuid + client_id: uuid + project_id: uuid (обязательно для верификации) + rating: int(1-5) + categories: + quality: int(1-5) + punctuality: int(1-5) + communication: int(1-5) + professionalism: int(1-5) + text: string(max 2000) + photos: array[media_url] (до 5 фото работ) + verified: bool (только после завершения проекта) + helpful_votes: int + created_at: datetime + updated_at: datetime +``` + +### Правила +- Отзыв можно оставить **только** после завершённого проекта +- Каждый отзыв проходит модерацию (AI + ручная проверка для подозрительных) +- Мастер может ответить на отзыв в течение 7 дней +- Клиент может отредактировать отзыв в течение 48 часов +- Отзывы с фото получают приоритет в выдаче + +### Расчёт рейтинга мастера +```python +rating = (reviews.aggregate(rating) * 0.6 + + reviews.aggregate(quality) * 0.25 + + reviews.count() * 0.15) +# Минимум 3 отзыва для отображения рейтинга +``` + +### Бейджи и уровни +- ⭐ "Новичок" — < 10 отзывов +- ⭐⭐ "Надёжный" — 10+ отзывов, рейтинг > 4.5 +- ⭐⭐⭐ "Профи" — 50+ отзывов, рейтинг > 4.7 +- 🏆 "Мастер года" — топ-3 в категории по отзывам + +--- + +## Фича 2: Встроенный чат + +### Архитектура +```yaml +ChatMessage: + id: uuid + chat_id: uuid (project-based) + sender_id: uuid + content_type: enum[text, image, file, voice] + content: string/blob + reply_to: uuid (reply to message) + read_at: datetime + created_at: datetime + +Chat: + id: uuid + project_id: uuid + master_id: uuid + client_id: uuid + status: enum[active, completed, archived] + last_message_at: datetime +``` + +### Функционал +- **Текстовые сообщения** — мгновенная доставка (WebSocket) +- **Голосовые сообщения** — до 2 минут, конвертация в текст для поиска +- **Фото работ** — мастер может присылать фото процесса/результата +- **Файлы** — договоры, сметы, документы +- **Ответ на сообщение** (reply) +- **Статус прочтения** (двойные галочки) +- **Поиск по чату** — по ключевым словам + +### Правила безопасности +- Контакты мастеров скрыты до начала проекта +- Чат ведётся только в рамках активного проекта +- История сохраняется 2 года после завершения +- Модерация на предмет оскорблений и спама + +--- + +## Фича 3: AI-оценка стоимости (до выезда) + +### Модель +```yaml +PriceEstimate: + project_id: uuid + category: string + location: geo + complexity: enum[simple, medium, complex] + estimated_cost_min: decimal + estimated_cost_max: decimal + confidence: float(0-1) + factors: + - {name: "area", value: sqm} + - {name: "materials_needed": bool} + - {name: "urgency": enum[standard, rush]} +``` + +### Источники данных для обучения +- Исторические цены по категориям и регионам +- Средние чеки конкурентов (TaskRabbit, Профи.ру) +- Региональные коэффициенты стоимости работ +- Сезонность спроса + +--- + +## Фича 4: Онлайн-диагностика проблемы + +### Flow +1. Клиент описывает проблему (текст + фото) +2. AI анализирует и задаёт уточняющие вопросы +3. Мастер получает диагностику перед выездом +4. Мастер подтверждает/корректирует оценку + +### Пример +``` +Клиент: "Потёк кран на кухне, капает" +AI → Вопросы: "Какой тип крана? (однорычажный / с двумя ручками)" +Мастер → "Выезжаю, замена картриджа ~1500₽" +``` + +--- + +## Фича 5: Подписка на обслуживание дома + +### Тарифы +| Пакет | Цена/мес | Включено | +|-------|----------|----------| +| Базовый | 990₽ | 1 выезд/мес, скидка 10% на доп. работы | +| Стандарт | 2490₽ | 3 выезда/мес, приоритетный вызов, скидка 20% | +| Премиум | 4990₽ | Безлимитные выезды, мастер в резерве, скидка 30% | + +### Преимущества подписки +- Фиксированная цена на типовые работы +- Приоритетный выезд (в течение 2 часов) +- Персональный менеджер +- Бесплатная диагностика + +--- + +## Технический стек для реализации + +### Backend +- **Язык:** Python (FastAPI) / Node.js (NestJS) +- **База данных:** PostgreSQL + Redis (кэш рейтингов) +- **Чат:** WebSocket (Socket.IO / Pusher) +- **Хранилище медиа:** S3-compatible (MinIO) + +### Frontend +- **Mobile-first:** React Native / Flutter +- **Web:** Next.js (SSR для SEO) + +### AI/ML +- **Оценка стоимости:** XGBoost + исторические данные +- **Диагностика:** Fine-tuned LLM (Qwen 7B или аналог) +- **Модерация отзывов:** BERT classifier + +--- + +## Приоритеты разработки + +1. **MVP (2 недели):** Чат + базовые отзывы +2. **V1 (4 недели):** Рейтинги + AI-оценка стоимости +3. **V2 (6 недель):** Онлайн-диагностика + подписки +4. **V3 (8 недель):** Бейджи, модерация, аналитика