feat: LocalPro Finder — отзывы, рейтинги, чат, AI-оценка, диагностика, подписки

This commit is contained in:
2026-07-03 15:03:30 +00:00
commit ef711d461f
5 changed files with 320 additions and 0 deletions
+12
View File
@@ -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"]
+14
View File
@@ -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
+55
View File
@@ -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:
+41
View File
@@ -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"
}
}
+198
View File
@@ -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 недель):** Бейджи, модерация, аналитика