Детализация технического задания для платформы Русинвестпроект
Проанализировав ТЗ и замечания, предлагаю следующие решения по разделу «Требует детализации»:
—
1. КОНКРЕТНЫЕ ЛИМИТЫ ТАРИФОВ
Таблица сравнения тарифных планов
| Функционал | FREE/START | PRO | PREMIUM/CLUB |
|---|---|---|---|
| СТОИМОСТЬ | Бесплатно | 2 990 ₽/мес<br>29 900 ₽/год (-17%) | 9 990 ₽/мес<br>99 900 ₽/год (-17%) |
| ОБЪЯВЛЕНИЯ | |||
| Инвестпроекты | 1 активное | 5 активных | Неограниченно |
| Готовый бизнес | 1 активное | 3 активных | Неограниченно |
| Франшизы | 1 активная | 3 активных | 10 активных |
| Вакансии | 1 активная | 5 активных | 20 активных |
| Резюме | 1 активное | 1 активное | 3 активных |
| Образовательные программы | — | 2 активных | 10 активных |
| КОММУНИКАЦИИ | |||
| Просмотр контактов в месяц | 3 | 30 | 200 |
| Запросы документов | 2 | 20 | 100 |
| Активных диалогов | 5 | 50 | Неограниченно |
| Исходящих откликов в месяц | 10 | 100 | Неограниченно |
| ПРОДВИЖЕНИЕ | |||
| Поднятие объявлений в месяц | — | 5 | 30 |
| Выделение цветом | — | 2 объявления | 10 объявлений |
| Размещение в топ-блоке | — | — | 3 объявления |
| Спецразмещение на главной | — | — | 1 раз в месяц |
| АНАЛИТИКА | |||
| Статистика просмотров | Базовая (общее число) | Детальная (график, источники) | Расширенная + экспорт |
| Аналитика откликов | — | ✓ | ✓ + конверсии |
| Отчеты по эффективности | — | — | ✓ |
| КОНТЕНТ И СЕРВИСЫ | |||
| База знаний | 30% материалов | 70% материалов | 100% материалов |
| Закрытые кейсы | — | — | ✓ |
| Закрытый клуб | — | — | ✓ |
| Персональные рекомендации | — | ✓ (10/день) | ✓ (50/день) |
| Приоритетная модерация | — | — | ✓ (до 2 часов) |
| Персональный менеджер | — | — | ✓ |
| ДОПОЛНИТЕЛЬНО | |||
| Верификация профиля | — | ✓ | ✓ (ускоренная) |
| Брендированный профиль | — | — | ✓ |
| Сохраненные поиски | 2 | 10 | Неограниченно |
| Экспорт данных | — | ✓ (CSV) | ✓ (CSV, Excel, PDF) |
| Размещение в рассылках | — | — | ✓ |
| Участие в закрытых питчах | — | — | ✓ |
Дополнительные платные услуги (для всех тарифов)
Разовые промо-услуги:
- Поднятие объявления: 490 ₽
- Выделение цветом (7 дней): 990 ₽
- Топ-размещение (7 дней): 2 490 ₽
- Размещение на главной (7 дней): 4 990 ₽
- Включение в email-рассылку: 3 990 ₽
Пакеты промо:
- Пакет «Старт» (5 поднятий + 2 выделения): 3 990 ₽
- Пакет «Рост» (15 поднятий + 5 выделений + 1 топ): 9 990 ₽
- Пакет «Максимум» (50 поднятий + 10 выделений + 3 топа + главная): 24 990 ₽
Услуги упаковки проектов:
- Консультация по презентации (1 час): 5 000 ₽
- Разработка презентации проекта: от 25 000 ₽
- Финансовая модель: от 35 000 ₽
- Комплексная упаковка проекта: от 80 000 ₽
- Аудит инвестиционной привлекательности: от 50 000 ₽
Дополнительные лимиты (докупка):
- +10 просмотров контактов: 990 ₽
- +5 запросов документов: 490 ₽
- +1 активное объявление (30 дней): 790 ₽
—
2. ДЕТАЛЬНЫЕ СПРАВОЧНИКИ
2.1. Справочник отраслей (иерархический)
1. ТЕХНОЛОГИИ И IT
1.1. Искусственный интеллект и машинное обучение
1.2. Большие данные и аналитика
1.3. Кибербезопасность
1.4. Облачные технологии и SaaS
1.5. Мобильные приложения
1.6. Enterprise-решения
1.7. Blockchain и криптовалюты
1.8. IoT и умные устройства
1.9. AR/VR технологии
1.10. Разработка ПО на заказ
2. ФИНТЕХ И ФИНАНСЫ
2.1. Платежные системы
2.2. Кредитование и микрофинансирование
2.3. Инвестиционные платформы
2.4. Страхование (InsurTech)
2.5. Бухгалтерия и финансовый учет
2.6. Управление личными финансами
2.7. Криптовалютные сервисы
2.8. Факторинг и лизинг
3. E-COMMERCE И РИТЕЙЛ
3.1. Маркетплейсы
3.2. Интернет-магазины (B2C)
3.3. B2B-платформы
3.4. Дропшиппинг
3.5. Subscription-commerce
3.6. Офлайн-ритейл
3.7. Франчайзинг в ритейле
4. МЕДИЦИНА И ЗДРАВООХРАНЕНИЕ
4.1. Телемедицина
4.2. Медицинское оборудование
4.3. Фармацевтика
4.4. Биотехнологии
4.5. Медицинские IT-решения
4.6. Лабораторная диагностика
4.7. Стоматология
4.8. Wellness и профилактика
5. ОБРАЗОВАНИЕ (EDTECH)
5.1. Онлайн-курсы и платформы
5.2. Корпоративное обучение
5.3. Языковые школы
5.4. Детское образование
5.5. Профессиональная переподготовка
5.6. Образовательный контент
5.7. Системы управления обучением (LMS)
6. МАРКЕТИНГ И РЕКЛАМА
6.1. Performance-маркетинг
6.2. Контент-маркетинг
6.3. Influencer-маркетинг
6.4. Рекламные технологии (AdTech)
6.5. Email-маркетинг
6.6. SMM и таргетированная реклама
6.7. Маркетинговая аналитика
7. ЛОГИСТИКА И ТРАНСПОРТ
7.1. Грузоперевозки
7.2. Курьерские службы
7.3. Складская логистика
7.4. Транспортные агрегаторы
7.5. Каршеринг и аренда транспорта
7.6. Международная логистика
8. НЕДВИЖИМОСТЬ (PROPTECH)
8.1. Коммерческая недвижимость
8.2. Жилая недвижимость
8.3. Аренда и управление недвижимостью
8.4. Строительство
8.5. Девелопмент
8.6. Платформы поиска недвижимости
9. ПРОИЗВОДСТВО
9.1. Пищевое производство
9.2. Легкая промышленность
9.3. Химическая промышленность
9.4. Машиностроение
9.5. Электроника
9.6. Мебельное производство
9.7. Упаковка
10. СЕЛЬСКОЕ ХОЗЯЙСТВО (AGTECH)
10.1. Растениеводство
10.2. Животноводство
10.3. Аквакультура
10.4. Агротехнологии
10.5. Органическое земледелие
10.6. Переработка с/х продукции
11. ЭНЕРГЕТИКА И ЭКОЛОГИЯ
11.1. Возобновляемая энергетика
11.2. Энергоэффективность
11.3. Утилизация отходов
11.4. Водоочистка
11.5. Экологический мониторинг
11.6. GreenTech
12. ТУРИЗМ И ГОСТЕПРИИМСТВО
12.1. Онлайн-бронирование
12.2. Отели и гостиницы
12.3. Туроператоры
12.4. Рестораны и общепит
12.5. Развлечения и досуг
12.6. Event-индустрия
13. КРАСОТА И ЗДОРОВЬЕ
13.1. Салоны красоты
13.2. Фитнес и спорт
13.3. SPA и wellness
13.4. Косметика и уходовые средства
13.5. Здоровое питание
14. МЕДИА И РАЗВЛЕЧЕНИЯ
14.1. Стриминговые сервисы
14.2. Игровая индустрия
14.3. Производство контента
14.4. Издательское дело
14.5. Подкасты и аудиоконтент
15. HR И РЕКРУТИНГ
15.1. Job-борды
15.2. Кадровые агентства
15.3. HR-tech решения
15.4. Аутсорсинг персонала
15.5. Оценка и развитие персонала
16. ДРУГОЕ
16.1. Социальные проекты
16.2. Консалтинг
16.3. Юридические услуги
16.4. Безопасность
16.5. Прочее
2.2. Справочник регионов
Структура:
РОССИЯ
├── Центральный федеральный округ
│ ├── Москва
│ ├── Московская область
│ ├── Белгородская область
│ └── ... (все регионы ЦФО)
├── Северо-Западный федеральный округ
│ ├── Санкт-Петербург
│ ├── Ленинградская область
│ └── ...
├── Южный федеральный округ
├── Северо-Кавказский федеральный округ
├── Приволжский федеральный округ
├── Уральский федеральный округ
├── Сибирский федеральный округ
└── Дальневосточный федеральный округ
СНГ
├── Беларусь
│ ├── Минск
│ └── Другие регионы
├── Казахстан
│ ├── Алматы
│ ├── Астана
│ └── Другие регионы
├── Армения
├── Азербайджан
├── Киргизия
├── Таджикистан
├── Узбекистан
└── Туркменистан
ДРУГИЕ СТРАНЫ
├── Европа
│ ├── Германия
│ ├── Великобритания
│ ├── Франция
│ └── ...
├── Азия
├── Америка
└── Другие регионы
2.3. Справочник стадий проектов
| Код | Название | Описание | Типичные характеристики |
|---|---|---|---|
| IDEA | Идея | Концепция проекта без реализации | — Нет MVP<br>- Нет команды<br>- Нет выручки<br>- Есть бизнес-план |
| PRE_SEED | Pre-seed | Начальная разработка, формирование команды | — Разработка MVP<br>- Формирование команды<br>- Первые тесты<br>- Нет выручки |
| SEED | Seed | Есть MVP, первые пользователи | — Готовый MVP<br>- Первые пользователи (100-1000)<br>- Минимальная выручка или её отсутствие<br>- Поиск product-market fit |
| EARLY | Ранняя стадия | Подтвержденная модель, растущая база | — Product-market fit найден<br>- 1000+ активных пользователей<br>- Выручка: 1-10 млн ₽/год<br>- Команда 5-15 человек |
| GROWTH | Рост | Масштабирование бизнеса | — Стабильный рост выручки<br>- Выручка: 10-100 млн ₽/год<br>- Расширение команды<br>- Выход на новые рынки |
| EXPANSION | Экспансия | Зрелый бизнес, экспансия | — Выручка: 100+ млн ₽/год<br>- Прибыльность<br>- Масштабирование на новые регионы<br>- Команда 50+ человек |
| EXIT | Выход | Подготовка к продаже/IPO | — Стабильная прибыль<br>- Отлаженные процессы<br>- Готовность к due diligence<br>- Поиск покупателя/выход на IPO |
2.4. Справочник форм инвестиций
| Код | Название | Описание |
|---|---|---|
| EQUITY | Доля в капитале | Инвестор получает долю в компании |
| EQUITY_MINORITY | Миноритарная доля | Доля менее 25% |
| EQUITY_BLOCKING | Блокирующий пакет | Доля 25%+ с правом вето |
| EQUITY_CONTROL | Контрольный пакет | Доля 50%+ |
| EQUITY_FULL | 100% выкуп | Полная покупка бизнеса |
| LOAN | Заём | Возвратное финансирование с процентами |
| CONVERTIBLE | Конвертируемый заём | Заём с возможностью конвертации в долю |
| SAFE | SAFE | Simple Agreement for Future Equity |
| REVENUE_SHARE | Revenue Share | Процент от выручки |
| ROYALTY | Роялти | Платежи за использование |
| PARTNERSHIP | Партнёрство | Совместная деятельность без доли |
| FRANCHISE | Франшиза | Покупка франшизы |
| GRANT | Грант | Безвозвратное финансирование |
| SUBSIDY | Субсидия | Государственная поддержка |
2.5. Справочник типов инвесторов
| Код | Название | Описание | Типичный чек |
|---|---|---|---|
| ANGEL | Бизнес-ангел | Частный инвестор | 1-10 млн ₽ |
| FAMILY_OFFICE | Family Office | Семейный офис | 10-100 млн ₽ |
| VC_FUND | Венчурный фонд | Профессиональный VC | 10-500 млн ₽ |
| PE_FUND | Private Equity фонд | Фонд прямых инвестиций | 100+ млн ₽ |
| CORPORATE_VC | Корпоративный VC | Венчурное подразделение корпорации | 20-200 млн ₽ |
| ACCELERATOR | Акселератор | Программа акселерации | 1-5 млн ₽ |
| INCUBATOR | Бизнес-инкубатор | Инкубационная программа | 0.5-3 млн ₽ |
| BANK | Банк | Банковское финансирование | 5+ млн ₽ |
| INVESTMENT_CLUB | Инвестклуб | Клуб частных инвесторов | 3-30 млн ₽ |
| CROWDFUNDING | Краудфандинг | Платформа коллективных инвестиций | 0.1-10 млн ₽ |
| STATE_FUND | Государственный фонд | Фонд государственной поддержки | 10+ млн ₽ |
| STRATEGIC | Стратегический инвестор | Отраслевой игрок | 50+ млн ₽ |
2.6. Справочник статусов объявлений
const STATUSES = {
DRAFT: {
code: 'draft',
name: 'Черновик',
description: 'Объявление создано, но не отправлено на модерацию',
userActions: ['edit', 'delete', 'submit_moderation'],
color: '#6c757d'
},
MODERATION: {
code: 'moderation',
name: 'На модерации',
description: 'Объявление проверяется модератором',
userActions: ['view'],
moderatorActions: ['approve', 'reject', 'request_changes'],
color: '#ffc107'
},
CHANGES_REQUIRED: {
code: 'changes_required',
name: 'Требуются правки',
description: 'Модератор запросил изменения',
userActions: ['edit', 'submit_moderation', 'delete'],
color: '#fd7e14'
},
ACTIVE: {
code: 'active',
name: 'Опубликовано',
description: 'Объявление активно и видно другим пользователям',
userActions: ['edit', 'deactivate', 'promote', 'view_stats'],
color: '#28a745'
},
VERIFIED: {
code: 'verified',
name: 'Проверено',
description: 'Объявление прошло верификацию',
userActions: ['edit', 'deactivate', 'promote', 'view_stats'],
badge: true,
color: '#007bff'
},
PAUSED: {
code: 'paused',
name: 'Приостановлено',
description: 'Объявление временно снято с публикации пользователем',
userActions: ['activate', 'edit', 'delete'],
color: '#6c757d'
},
CLOSED: {
code: 'closed',
name: 'Закрыто',
description: 'Сделка состоялась или проект завершён',
userActions: ['view', 'reopen'],
color: '#17a2b8'
},
BLOCKED: {
code: 'blocked',
name: 'Заблокировано',
description: 'Объявление заблокировано модератором',
userActions: ['appeal'],
moderatorActions: ['unblock', 'delete'],
color: '#dc3545'
},
EXPIRED: {
code: 'expired',
name: 'Истёк срок',
description: 'Закончился оплаченный период размещения',
userActions: ['renew', 'delete'],
color: '#6c757d'
},
DELETED: {
code: 'deleted',
name: 'Удалено',
description: 'Объявление удалено',
userActions: [],
color: '#343a40'
}
};
—
3. ДЕТАЛЬНЫЕ БИЗНЕС-ПРАВИЛА
3.1. Правила модерации
3.1.1. Автоматическая пре-модерация
// Автоматические проверки перед отправкой на ручную модерацию
const autoModerationRules = {
// Проверка на спам
spam_check: {
triggers: [
'Более 3 одинаковых объявлений от одного пользователя',
'Более 5 ссылок в описании',
'Использование запрещенных слов из черного списка',
'Caps Lock в заголовке (более 50% заглавных букв)',
'Более 3 восклицательных знаков подряд'
],
action: 'auto_reject',
message: 'Объявление отклонено автоматически. Причина: подозрение на спам'
},
// Проверка контактов
contacts_check: {
triggers: [
'Email в описании (должен быть в специальном поле)',
'Телефон в описании (должен быть в специальном поле)',
'Ссылки на мессенджеры в описании'
],
action: 'flag_for_review',
message: 'Контактные данные должны быть в соответствующих полях'
},
// Проверка на дубли
duplicate_check: {
algorithm: 'Сравнение по названию (80%+ совпадение) и описанию',
action: 'flag_for_review',
message: 'Обнаружено похожее объявление'
},
// Проверка обязательных полей
required_fields: {
project: ['название', 'отрасль', 'стадия', 'сумма', 'описание'],
business: ['название', 'отрасль', 'выручка', 'цена', 'описание'],
franchise: ['название', 'отрасль', 'паушальный взнос', 'описание'],
investor: ['тип', 'чек_от', 'чек_до', 'отрасли', 'стадии']
},
// Проверка на мошенничество
fraud_check: {
triggers: [
'Нереалистичные цифры (ROI > 1000%)',
'Гарантии доходности',
'Требование предоплаты без гарантий',
'Пирамидальные схемы (ключевые слова)'
],
action: 'auto_reject',
message: 'Объявление отклонено. Возможные признаки мошенничества'
}
};
3.1.2. Ручная модерация
Очередь модерации:
- Приоритет 1: Premium-пользователи (SLA: 2 часа)
- Приоритет 2: Pro-пользователи (SLA: 12 часов)
- Приоритет 3: Free-пользователи (SLA: 48 часов)
- Приоритет 4: Повторная модерация после правок (SLA: 24 часа)
Чек-лист модератора:
## Проверка объявления
### 1. Соответствие категории
- [ ] Объявление размещено в правильной категории
- [ ] Тип объявления соответствует содержанию
### 2. Качество контента
- [ ] Заголовок информативный и корректный
- [ ] Описание содержательное (минимум 200 символов)
- [ ] Нет грамматических ошибок (критичных)
- [ ] Загружены необходимые документы/изображения
### 3. Достоверность информации
- [ ] Финансовые показатели выглядят реалистично
- [ ] Контактные данные корректны
- [ ] Нет противоречий в описании
### 4. Соответствие правилам
- [ ] Нет запрещенного контента
- [ ] Нет признаков мошенничества
- [ ] Нет дублирования объявлений
- [ ] Контакты в соответствующих полях
### 5. Юридическая чистота
- [ ] Нет нарушений авторских прав
- [ ] Нет использования чужих товарных знаков
- [ ] Соответствие законодательству РФ
### Решение:
○ Одобрить
○ Отклонить (указать причину)
○ Запросить правки (указать что исправить)
Шаблоны ответов модератора:
const moderationTemplates = {
rejection: {
spam: 'Ваше объявление отклонено по причине: признаки спама. Пожалуйста, создайте уникальное объявление с подробным описанием вашего проекта.',
duplicate: 'Обнаружено дублирование объявления. У вас уже есть активное объявление с похожим содержанием. Пожалуйста, отредактируйте существующее объявление вместо создания нового.',
incomplete: 'Объявление отклонено: недостаточно информации. Пожалуйста, заполните все обязательные поля и добавьте подробное описание (минимум 200 символов).',
contacts_in_description: 'Контактные данные должны быть размещены в соответствующих полях профиля, а не в описании объявления. Пожалуйста, удалите контакты из текста и заполните поля "Email" и "Телефон".',
unrealistic: 'Указанные финансовые показатели выглядят нереалистично. Пожалуйста, предоставьте обоснование или скорректируйте данные.',
fraud_signs: 'Ваше объявление содержит признаки мошеннической схемы и нарушает правила платформы. Размещение подобного контента запрещено.',
wrong_category: 'Объявление размещено в неверной категории. Пожалуйста, выберите корректную категорию и отправьте объявление повторно.'
},
changes_required: {
improve_description: 'Пожалуйста, дополните описание проекта. Укажите: текущую стадию, бизнес-модель, целевую аудиторию, конкурентные преимущества. Минимальная длина описания: 200 символов.',
add_documents: 'Для повышения доверия к проекту рекомендуем загрузить презентацию или бизнес-план. Это увеличит количество откликов от инвесторов.',
clarify_financials: 'Пожалуйста, уточните финансовые показатели: укажите период (месяц/год), валюту, подтверждающие документы (при наличии).',
remove_contacts: 'Удалите контактные данные из описания. Они должны быть только в соответствующих полях профиля.'
},
approved: {
standard: 'Ваше объявление одобрено и опубликовано! Для увеличения количества просмотров рекомендуем использовать инструменты продвижения.',
with_recommendations: 'Объявление одобрено! Рекомендации для повышения эффективности: {recommendations}'
}
};
3.2. Правила верификации
3.2.1. Верификация инвесторов
Уровни верификации:
const investorVerification = {
levels: {
UNVERIFIED: {
name: 'Не верифицирован',
badge: null,
access: 'Базовый доступ',
trust_score: 0
},
BASIC: {
name: 'Базовая верификация',
badge: '✓ Контакты подтверждены',
requirements: [
'Подтвержденный email',
'Подтвержденный телефон',
'Заполненный профиль (минимум 70%)'
],
access: 'Стандартный доступ',
trust_score: 30
},
STANDARD: {
name: 'Стандартная верификация',
badge: '✓✓ Проверенный инвестор',
requirements: [
'Базовая верификация',
'Паспортные данные',
'ИНН физлица или реквизиты юрлица',
'Подтверждение финансовой состоятельности (выписка, справка 2-НДФЛ)'
],
processing_time: '3-5 рабочих дней',
access: 'Расширенный доступ + приоритет в откликах',
trust_score: 70
},
PREMIUM: {
name: 'Премиум верификация',
badge: '✓✓✓ VIP-инвестор',
requirements: [
'Стандартная верификация',
'Портфолио инвестиций',
'Рекомендации от 2+ проверенных участников',
'Личная встреча с представителем платформы (опционально)'
],
processing_time: '5-7 рабочих дней',
access: 'Полный доступ + закрытые сделки + персональный менеджер',
trust_score: 100
}
},
process: {
steps: [
'1. Подача заявки на верификацию',
'2. Загрузка документов',
'3. Проверка службой безопасности',
'4. Принятие решения',
'5. Присвоение статуса'
],
documents: {
individual: [
'Скан паспорта (разворот с фото)',
'Скан паспорта (регистрация)',
'ИНН',
'Справка 2-НДФЛ или выписка по счету'
],
legal_entity: [
'Выписка из ЕГРЮЛ (не старше 30 дней)',
'Устав',
'Свидетельство о регистрации',
'Приказ о назначении директора',
'Паспорт руководителя'
]
},
rejection_reasons: [
'Недостаточно документов',
'Документы не читаемы',
'Данные не совпадают',
'Компания в стадии ликвидации',
'Негативная кредитная история',
'Подозрение в мошенничестве'
]
}
};
3.2.2. Верификация проектов
const projectVerification = {
criteria: {
BASIC: {
requirements: [
'Полностью заполненная карточка проекта',
'Презентация или бизнес-план',
'Подтвержденные контакты основателя',
'Реквизиты юрлица (если есть)'
],
badge: '✓ Проверенный проект',
benefits: [
'Значок верификации',
'Повышение в поисковой выдаче',
'+30% к количеству просмотров'
]
},
ADVANCED: {
requirements: [
'Базовая верификация',
'Финансовая модель',
'Подтверждение финансовых показателей',
'Информация о команде с контактами',
'Наличие MVP или прототипа'
],
badge: '✓✓ Детально проверен',
benefits: [
'Расширенный значок',
'Приоритет в рекомендациях',
'Доступ к закрытым инвестклубам',
'+50% к количеству просмотров'
]
},
DUE_DILIGENCE: {
requirements: [
'Расширенная верификация',
'Проверка юридической чистоты',
'Аудит финансовых показателей',
'Проверка интеллектуальной собственности',
'Интервью с основателями'
],
badge: '✓✓✓ Due Diligence пройден',
cost: 'от 50 000 ₽',
benefits: [
'Максимальное доверие инвесторов',
'Отчет о проверке для инвесторов',
'Гарантия достоверности данных',
'+100% к количеству качественных откликов'
]
}
}
};
3.3. Правила работы с отзывами
const reviewsSystem = {
// Кто может оставлять отзывы
eligibility: {
about_project: [
'Инвесторы, которые вели переговоры с проектом',
'Инвесторы, которые инвестировали в проект',
'Эксперты, проводившие аудит'
],
about_investor: [
'Проекты, получившие отклик от инвестора',
'Проекты, получившие инвестиции',
'Другие инвесторы (партнеры по сделкам)'
],
about_service: [
'Пользователи, заказавшие услугу',
'Участники программ/мероприятий'
]
},
// Структура отзыва
review_structure: {
rating: {
type: 'number',
range: [1, 5],
required: true
},
criteria: {
for_project: [
'Качество презентации (1-5)',
'Реалистичность планов (1-5)',
'Компетентность команды (1-5)',
'Прозрачность коммуникации (1-5)'
],
for_investor: [
'Скорость ответа (1-5)',
'Профессионализм (1-5)',
'Прозрачность условий (1-5)',
'Выполнение обязательств (1-5)'
]
},
text: {
min_length: 100,
max_length: 2000,
required: true
},
deal_status: {
options: [
'Сделка состоялась',
'Переговоры в процессе',
'Переговоры не состоялись',
'Отказ после анализа'
],
required: false
},
anonymity: {
options: ['Публичный отзыв', 'Анонимный отзыв'],
default: 'Публичный отзыв'
}
},
// Модерация отзывов
moderation: {
auto_publish: false, // Все отзывы проходят модерацию
checks: [
'Отсутствие мата и оскорблений',
'Отсутствие личных данных третьих лиц',
'Конструктивность критики',
'Отсутствие рекламы конкурентов',
'Достоверность (проверка факта взаимодействия)'
],
rejection_reasons: [
'Ненормативная лексика',
'Недостоверная информация',
'Отсутствие подтвержденного взаимодействия',
'Реклама третьих лиц',
'Клевета без доказательств'
],
sla: {
standard: '48 часов',
premium: '12 часов'
}
},
// Ответы на отзывы
responses: {
who_can_respond: 'Владелец профиля/объявления',
time_limit: '30 дней с момента публикации отзыва',
moderation: true,
max_length: 1000
},
// Жалобы на отзывы
complaints: {
reasons: [
'Недостоверная информация',
'Оскорбления',
'Клевета',
'Отзыв от конкурента',
'Нарушение правил платформы'
],
process: [
'1. Подача жалобы с обоснованием',
'2. Рассмотрение модератором (3-5 дней)',
'3. Запрос доказательств у обеих сторон',
'4. Принятие решения',
'5. Удаление/сохранение отзыва'
]
},
// Расчет рейтинга
rating_calculation: {
formula: 'Средневзвешенная оценка',
weights: {
verified_users: 1.5, // Отзывы от верифицированных пользователей весят больше
completed_deals: 2.0, // Отзывы при состоявшихся сделках весят больше
standard_users: 1.0
},
display: {
average_rating: 'С точностью до 0.1',
total_reviews: 'Общее количество',
rating_distribution: 'Распределение по звездам (1-5)'
}
},
// Стимулирование отзывов
incentives: {
for_leaving_review: {
bonus: '+5 просмотров контактов',
condition: 'За детальный отзыв (200+ символов)'
},
for_getting_reviews: {
boost: 'Повышение в поисковой выдаче',
condition: '5+ положительных отзывов (4+ звезды)'
}
}
};
3.4. Антиспам и защита от злоупотреблений
const antiSpamRules = {
// Лимиты на действия
rate_limits: {
object_creation: {
free: '1 объявление в день',
pro: '3 объявления в день',
premium: '10 объявлений в день'
},
messages: {
free: '10 исходящих сообщений в день',
pro: '50 исходящих сообщений в день',
premium: '200 исходящих сообщений в день'
},
contact_requests: {
free: '3 запроса в день',
pro: '30 запросов в день',
premium: '200 запросов в день'
},
responses: {
all: '50 откликов в день (защита от спама)'
}
},
// Обнаружение подозрительной активности
suspicious_activity: {
triggers: [
'Более 100 одинаковых сообщений',
'Более 50 запросов контактов за час',
'Создание 10+ похожих объявлений',
'Массовая отправка одного текста разным пользователям',
'Множественные жалобы от пользователей'
],
actions: [
'Временная блокировка функции (24 часа)',
'Уведомление пользователя',
'Проверка модератором',
'При повторении - полная блокировка аккаунта'
]
},
// Защита от накрутки
anti_fraud: {
view_counting: {
rules: [
'Один просмотр от одного IP в день',
'Исключение просмотров от ботов',
'Исключение просмотров от владельца объявления',
'Минимальное время на странице: 5 секунд'
]
},
rating_manipulation: {
detection: [
'Множественные положительные отзывы от новых аккаунтов',
'Отзывы с одинаковым IP',
'Отзывы без подтвержденного взаимодействия'
],
actions: [
'Удаление подозрительных отзывов',
'Блокировка аккаунтов-ботов',
'Понижение рейтинга объекта'
]
}
},
// Captcha
captcha_triggers: [
'Регистрация нового пользователя',
'Восстановление пароля',
'Отправка 10+ сообщений за час',
'Создание 3+ объявлений за день',
'Подозрительная активность'
]
};
—
4. СРОКИ ЭТАПОВ РАЗРАБОТКИ
Фазы проекта и дедлайны
ФАЗА 1: ПОДГОТОВКА И ПРОЕКТИРОВАНИЕ (4 недели)
├── Неделя 1-2: Детализация требований
│ ├── Финализация ТЗ
│ ├── Согласование макетов и дизайна
│ ├── Проектирование архитектуры
│ └── Выбор технологического стека
│
├── Неделя 3-4: Проектирование БД и API
│ ├── Схема базы данных
│ ├── API endpoints спецификация
│ ├── Настройка инфраструктуры
│ └── Создание репозиториев
ФАЗА 2: MVP / БАЗОВЫЙ ФУНКЦИОНАЛ (8 недель)
├── Неделя 1-2: Фундамент
│ ├── Регистрация и авторизация
│ ├── Профили пользователей
│ ├── Базовая админ-панель
│ └── Тестирование
│
├── Неделя 3-4: Каталоги (часть 1)
│ ├── Инвестпроекты (CRUD)
│ ├── Готовый бизнес (CRUD)
│ ├── Поиск и фильтры (базовые)
│ └── Тестирование
│
├── Неделя 5-6: Каталоги (часть 2) и коммуникации
│ ├── Франшизы (CRUD)
│ ├── Инвесторы (CRUD)
│ ├── Внутренний мессенджер
│ ├── Система откликов
│ └── Тестирование
│
├── Неделя 7-8: Монетизация и интеграции
│ ├── Тарифные планы
│ ├── Интеграция платежей
│ ├── Промо-инструменты (базовые)
│ ├── Email-уведомления
│ └── Тестирование MVP
ФАЗА 3: РАСШИРЕННЫЙ ФУНКЦИОНАЛ (6 недель)
├── Неделя 1-2: Дополнительные каталоги
│ ├── Вакансии и резюме
│ ├── Образовательные программы
│ ├── Мероприятия
│ └── Тестирование
│
├── Неделя 3-4: Продвинутые функции
│ ├── Верификация (KYC)
│ ├── Система отзывов и рейтингов
│ ├── Персональные рекомендации
│ ├── Расширенная аналитика
│ └── Тестирование
│
├── Неделя 5-6: Контент и комьюнити
│ ├── База знаний
│ ├── Форум/сообщество
│ ├── Закрытый клуб
│ ├── Каталоги экосистемы
│ └── Тестирование
ФАЗА 4: ПОЛИРОВКА И ЗАПУСК (4 недели)
├── Неделя 1: Интеграции и оптимизация
│ ├── Аналитика (Метрика, GA)
│ ├── SEO-оптимизация
│ ├── Оптимизация производительности
│ └── Багфиксинг
│
├── Неделя 2: Тестирование
│ ├── Функциональное тестирование
│ ├── Нагрузочное тестирование
│ ├── Тестирование безопасности
│ └── UX-тестирование
│
├── Неделя 3: Подготовка к запуску
│ ├── Наполнение контентом
│ ├── Создание обучающих материалов
│ ├── Настройка мониторинга
│ └── Финальные проверки
│
├── Неделя 4: Запуск
│ ├── Beta-запуск (закрытая группа)
│ ├── Сбор обратной связи
│ ├── Исправления критичных багов
│ └── Публичный запуск
ФАЗА 5: ПОСТ-РЕЛИЗНАЯ ПОДДЕРЖКА (непрерывно)
├── Мониторинг и поддержка
├── Сбор обратной связи
├── Приоритизация доработок
└── Итеративное развитие
Детальный план спринтов (Agile)
Длительность спринта: 2 недели
СПРИНТ 1 (Недели 1-2): Проектирование
Цель: Завершить проектирование и подготовить инфраструктуру
Задачи:
- Финализация ТЗ и согласование
- Создание wireframes и макетов
- Проектирование архитектуры системы
- Проектирование БД
- Настройка dev/stage окружений
- Создание репозиториев и CI/CD
СПРИНТ 2 (Недели 3-4): Дизайн и API
Цель: Завершить дизайн и спроектировать API
Задачи:
- Финализация UI/UX дизайна
- Создание дизайн-системы
- Спецификация API endpoints
- Настройка фронтенд-фреймворка
- Настройка бэкенд-фреймворка
СПРИНТ 3 (Недели 5-6): Авторизация и профили
Цель: Реализовать регистрацию, авторизацию и профили
Задачи:
- Регистрация (email, телефон, соцсети)
- Авторизация и восстановление пароля
- Профили пользователей (CRUD)
- Выбор ролей
- Базовая верстка
СПРИНТ 4 (Недели 7-8): Админка и модерация
Цель: Создать базовую админ-панель
Задачи:
- Интерфейс админки
- Управление пользователями
- Очередь модерации
- Справочники
- Логирование действий
СПРИНТ 5 (Недели 9-10): Инвестпроекты
Цель: Реализовать каталог инвестпроектов
Задачи:
- Создание карточек проектов
- Редактирование и удаление
- Статусы объявлений
- Модерация проектов
- Базовый поиск и фильтры
СПРИНТ 6 (Недели 11-12): Готовый бизнес и франшизы
Цель: Добавить каталоги бизнеса и франшиз
Задачи:
- Каталог готового бизнеса (CRUD)
- Каталог франшиз (CRUD)
- Расширение фильтров
- Модерация
- Верстка карточек
СПРИНТ 7 (Недели 13-14): Инвесторы и поиск
Цель: Каталог инвесторов и продвинутый поиск
Задачи:
- Профили инвесторов
- Инвестиционный фокус
- Продвинутые фильтры
- Сортировки
- Сохраненные поиски
СПРИНТ 8 (Недели 15-16): Коммуникации
Цель: Реализовать мессенджер и отклики
Задачи:
- Внутренний мессенджер
- Система откликов
- Запросы контактов и документов
- Уведомления (email)
- Лимиты по тарифам
СПРИНТ 9 (Недели 17-18): Монетизация
Цель: Внедрить тарифы и платежи
Задачи:
- Тарифные планы
- Страница сравнения тарифов
- Интеграция платежной системы
- Управление подпиской
- Промокоды
СПРИНТ 10 (Недели 19-20): Промо-инструменты
Цель: Добавить инструменты продвижения
Задачи:
- Поднятие объявлений
- Выделение цветом
- Топ-размещение
- Спецблоки на главной
- Учет использования промо
СПРИНТ 11 (Недели 21-22): Вакансии и резюме
Цель: Реализовать job-board функционал
Задачи:
- Каталог вакансий
- Каталог резюме
- Отклики на вакансии
- Фильтры для вакансий
- Модерация
СПРИНТ 12 (Недели 23-24): Образование и мероприятия
Цель: Добавить образовательный контент
Задачи:
- Каталог образовательных программ
- Календарь мероприятий
- Регистрация на мероприятия
- Напоминания
- Модерация
СПРИНТ 13 (Недели 25-26): Верификация и отзывы
Цель: Внедрить систему доверия
Задачи:
- KYC верификация (инвесторы)
- Верификация проектов
- Система отзывов
- Рейтинги
- Модерация отзывов
СПРИНТ 14 (Недели 27-28): Рекомендации и аналитика
Цель: Добавить персонализацию и аналитику
Задачи:
- Персональные рекомендации
- Аналитика для пользователей
- Дашборды в админке
- Экспорт данных
- Отчеты
СПРИНТ 15 (Недели 29-30): База знаний и комьюнити
Цель: Создать контентные разделы
Задачи:
- База знаний (статьи, кейсы)
- Форум/Q&A
- Закрытый клуб
- Каталоги экосистемы
- Модерация контента
СПРИНТ 16 (Недели 31-32): Интеграции и SEO
Цель: Подключить внешние сервисы и оптимизировать SEO
Задачи:
- Яндекс.Метрика, Google Analytics
- Email-сервис (рассылки)
- SEO-оптимизация
- Микроразметка
- Sitemap и robots.txt
СПРИНТ 17 (Недели 33-34): Тестирование
Цель: Провести полное тестирование
Задачи:
- Функциональное тестирование
- Нагрузочное тестирование
- Тестирование безопасности
- UX-тестирование
- Багфиксинг
СПРИНТ 18 (Недели 35-36): Запуск
Цель: Подготовить и запустить платформу
Задачи:
- Наполнение контентом
- Beta-тестирование
- Финальные правки
- Публичный запуск
- Мониторинг
Критические вехи (Milestones)
| Веха | Дата | Критерии завершения |
|---|---|---|
| M1: Завершение проектирования | Конец недели 4 | — ТЗ согласовано<br>- Макеты утверждены<br>- Архитектура спроектирована<br>- БД спроектирована |
| M2: MVP готов | Конец недели 16 | — Регистрация работает<br>- 4 основных каталога функционируют<br>- Мессенджер работает<br>- Платежи интегрированы<br>- Базовая модерация работает |
| M3: Полный функционал | Конец недели 30 | — Все каталоги реализованы<br>- Верификация работает<br>- Отзывы и рейтинги функционируют<br>- База знаний наполнена<br>- Аналитика работает |
| M4: Beta-запуск | Неделя 35 | — Все тесты пройдены<br>- Критичные баги исправлены<br>- Контент загружен<br>- Мониторинг настроен |
| M5: Публичный запуск | Неделя 36 | — Beta-тестирование завершено<br>- Обратная связь учтена<br>- Маркетинг подготовлен<br>- Поддержка готова |
Риски и буферы
Заложенные буферы времени:
- 10% на непредвиденные задачи в каждом спринте
- 2 недели буфера перед запуском для исправления критичных багов
- Возможность параллельной разработки некритичных функций
Основные риски:
1. Задержки в согласовании ТЗ и дизайна
Митигация: Еженедельные синки с заказчиком
2. Проблемы с интеграциями (платежи, внешние API)
Митигация: Ранее тестирование интеграций, запасные варианты
3. Недооценка сложности функционала
Митигация: Детальная декомпозиция задач, буферы времени
4. Изменения требований в процессе
Митигация: Agile-подход, приоритизация, управление scope
—
5. ДЕТАЛЬНЫЕ ТРЕБОВАНИЯ К ДИЗАЙНУ
5.1. Дизайн-система
Цветовая палитра
/* Основные цвета */
:root {
/* Primary - основной акцентный цвет */
--primary-50: #fff5f5;
--primary-100: #ffe3e3;
--primary-200: #ffc9c9;
--primary-300: #ffa8a8;
--primary-400: #ff8787;
--primary-500: #ff6b6b; /* Основной */
--primary-600: #fa5252;
--primary-700: #f03e3e;
--primary-800: #e03131;
--primary-900: #c92a2a;
/* Secondary - дополнительный цвет */
--secondary-50: #e7f5ff;
--secondary-100: #d0ebff;
--secondary-200: #a5d8ff;
--secondary-300: #74c0fc;
--secondary-400: #4dabf7;
--secondary-500: #339af0; /* Основной */
--secondary-600: #228be6;
--secondary-700: #1c7ed6;
--secondary-800: #1971c2;
--secondary-900: #1864ab;
/* Neutral - нейтральные цвета */
--gray-50: #f8f9fa;
--gray-100: #f1f3f5;
--gray-200: #e9ecef;
--gray-300: #dee2e6;
--gray-400: #ced4da;
--gray-500: #adb5bd;
--gray-600: #868e96;
--gray-700: #495057;
--gray-800: #343a40;
--gray-900: #212529;
/* Semantic - семантические цвета */
--success: #51cf66;
--success-light: #d3f9d8;
--success-dark: #2f9e44;
--warning: #ffd43b;
--warning-light: #fff3bf;
--warning-dark: #fab005;
--error: #ff6b6b;
--error-light: #ffe3e3;
--error-dark: #c92a2a;
--info: #4dabf7;
--info-light: #d0ebff;
--info-dark: #1971c2;
/* Backgrounds */
--bg-primary: #ffffff;
--bg-secondary: #f8f9fa;
--bg-tertiary: #e9ecef;
/* Text */
--text-primary: #212529;
--text-secondary: #495057;
--text-tertiary: #868e96;
--text-disabled: #adb5bd;
--text-inverse: #ffffff;
/* Borders */
--border-color: #dee2e6;
--border-color-hover: #adb5bd;
--border-color-focus: #339af0;
/* Shadows */
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
--shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15);
}
Типографика
/* Шрифты */
:root {
/* Font families */
--font-primary: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-secondary: 'Roboto', sans-serif;
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
/* Font sizes */
--text-xs: 0.75rem; /* 12px */
--text-sm: 0.875rem; /* 14px */
--text-base: 1rem; /* 16px */
--text-lg: 1.125rem; /* 18px */
--text-xl: 1.25rem; /* 20px */
--text-2xl: 1.5rem; /* 24px */
--text-3xl: 1.875rem; /* 30px */
--text-4xl: 2.25rem; /* 36px */
--text-5xl: 3rem; /* 48px */
--text-6xl: 3.75rem; /* 60px */
/* Font weights */
--font-light: 300;
--font-normal: 400;
--font-medium: 500;
--font-semibold: 600;
--font-bold: 700;
--font-extrabold: 800;
/* Line heights */
--leading-none: 1;
--leading-tight: 1.25;
--leading-snug: 1.375;
--leading-normal: 1.5;
--leading-relaxed: 1.625;
--leading-loose: 2;
/* Letter spacing */
--tracking-tighter: -0.05em;
--tracking-tight: -0.025em;
--tracking-normal: 0;
--tracking-wide: 0.025em;
--tracking-wider: 0.05em;
--tracking-widest: 0.1em;
}
/* Заголовки */
h1, .h1 {
font-size: var(--text-4xl);
font-weight: var(--font-bold);
line-height: var(--leading-tight);
letter-spacing: var(--tracking-tight);
color: var(--text-primary);
margin-bottom: 1rem;
}
h2, .h2 {
font-size: var(--text-3xl);
font-weight: var(--font-bold);
line-height: var(--leading-tight);
color: var(--text-primary);
margin-bottom: 0.875rem;
}
h3, .h3 {
font-size: var(--text-2xl);
font-weight: var(--font-semibold);
line-height: var(--leading-snug);
color: var(--text-primary);
margin-bottom: 0.75rem;
}
h4, .h4 {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
line-height: var(--leading-snug);
color: var(--text-primary);
margin-bottom: 0.625rem;
}
/* Основной текст */
body {
font-family: var(--font-primary);
font-size: var(--text-base);
font-weight: var(--font-normal);
line-height: var(--leading-normal);
color: var(--text-primary);
}
.text-small {
font-size: var(--text-sm);
}
.text-large {
font-size: var(--text-lg);
}
/* Вспомогательные классы */
.text-muted {
color: var(--text-secondary);
}
.text-subtle {
color: var(--text-tertiary);
}
.font-medium {
font-weight: var(--font-medium);
}
.font-semibold {
font-weight: var(--font-semibold);
}
Отступы и размеры
:root {
/* Spacing scale (8px base) */
--space-0: 0;
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-3: 0.75rem; /* 12px */
--space-4: 1rem; /* 16px */
--space-5: 1.25rem; /* 20px */
--space-6: 1.5rem; /* 24px */
--space-8: 2rem; /* 32px */
--space-10: 2.5rem; /* 40px */
--space-12: 3rem; /* 48px */
--space-16: 4rem; /* 64px */
--space-20: 5rem; /* 80px */
--space-24: 6rem; /* 96px */
/* Border radius */
--radius-none: 0;
--radius-sm: 0.25rem; /* 4px */
--radius-base: 0.375rem; /* 6px */
--radius-md: 0.5rem; /* 8px */
--radius-lg: 0.75rem; /* 12px */
--radius-xl: 1rem; /* 16px */
--radius-2xl: 1.5rem; /* 24px */
--radius-full: 9999px;
/* Container widths */
--container-sm: 640px;
--container-md: 768px;
--container-lg: 1024px;
--container-xl: 1280px;
--container-2xl: 1536px;
/* Z-index scale */
--z-dropdown: 1000;
--z-sticky: 1020;
--z-fixed: 1030;
--z-modal-backdrop: 1040;
--z-modal: 1050;
--z-popover: 1060;
--z-tooltip: 1070;
}
5.2. Компоненты UI
Кнопки
/* Базовая кнопка */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
padding: var(--space-3) var(--space-6);
font-family: var(--font-primary);
font-size: var(--text-base);
font-weight: var(--font-medium);
line-height: var(--leading-none);
text-align: center;
text-decoration: none;
white-space: nowrap;
border: 1px solid transparent;
border-radius: var(--radius-md);
cursor: pointer;
transition: all 0.2s ease;
user-select: none;
}
.btn:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(51, 154, 240, 0.3);
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* Варианты кнопок */
.btn-primary {
background: var(--primary-500);
color: white;
border-color: var(--primary-500);
}
.btn-primary:hover:not(:disabled) {
background: var(--primary-600);
border-color: var(--primary-600);
transform: translateY(-1px);
box-shadow: var(--shadow-md);
}
.btn-secondary {
background: var(--secondary-500);
color: white;
border-color: var(--secondary-500);
}
.btn-secondary:hover:not(:disabled) {
background: var(--secondary-600);
border-color: var(--secondary-600);
}
.btn-outline {
background: transparent;
color: var(--primary-500);
border-color: var(--primary-500);
}
.btn-outline:hover:not(:disabled) {
background: var(--primary-50);
}
.btn-ghost {
background: transparent;
color: var(--text-primary);
border-color: transparent;
}
.btn-ghost:hover:not(:disabled) {
background: var(--gray-100);
}
/* Размеры кнопок */
.btn-sm {
padding: var(--space-2) var(--space-4);
font-size: var(--text-sm);
}
.btn-lg {
padding: var(--space-4) var(--space-8);
font-size: var(--text-lg);
}
.btn-xl {
padding: var(--space-5) var(--space-10);
font-size: var(--text-xl);
}
/* Кнопка на всю ширину */
.btn-block {
width: 100%;
}
/* Кнопка с иконкой */
.btn-icon {
padding: var(--space-3);
aspect-ratio: 1;
}
Карточки
.card {
background: var(--bg-primary);
border: 1px solid var(--border-color);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
overflow: hidden;
transition: all 0.3s ease;
}
.card:hover {
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
.card-header {
padding: var(--space-6);
border-bottom: 1px solid var(--border-color);
}
.card-body {
padding: var(--space-6);
}
.card-footer {
padding: var(--space-6);
border-top: 1px solid var(--border-color);
background: var(--bg-secondary);
}
/* Варианты карточек */
.card-project {
position: relative;
}
.card-project-badge {
position: absolute;
top: var(--space-4);
right: var(--space-4);
padding: var(--space-2) var(--space-3);
background: var(--primary-500);
color: white;
font-size: var(--text-xs);
font-weight: var(--font-semibold);
border-radius: var(--radius-full);
}
.card-project-title {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
margin-bottom: var(--space-2);
color: var(--text-primary);
}
.card-project-meta {
display: flex;
gap: var(--space-4);
margin-bottom: var(--space-4);
font-size: var(--text-sm);
color: var(--text-secondary);
}
.card-project-description {
font-size: var(--text-base);
line-height: var(--leading-relaxed);
color: var(--text-secondary);
margin-bottom: var(--space-4);
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.card-project-tags {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
margin-bottom: var(--space-4);
}
.card-project-stats {
display: flex;
justify-content: space-between;
padding-top: var(--space-4);
border-top: 1px solid var(--border-color);
}
Формы
/* Группа формы */
.form-group {
margin-bottom: var(--space-6);
}
.form-label {
display: block;
margin-bottom: var(--space-2);
font-size: var(--text-sm);
font-weight: var(--font-medium);
color: var(--text-primary);
}
.form-label-required::after {
content: '*';
color: var(--error);
margin-left: var(--space-1);
}
/* Поля ввода */
.form-control {
display: block;
width: 100%;
padding: var(--space-3) var(--space-4);
font-family: var(--font-primary);
font-size: var(--text-base);
line-height: var(--leading-normal);
color: var(--text-primary);
background: var(--bg-primary);
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
transition: all 0.2s ease;
}
.form-control:hover {
border-color: var(--border-color-hover);
}
.form-control:focus {
outline: none;
border-color: var(--border-color-focus);
box-shadow: 0 0 0 3px rgba(51, 154, 240, 0.1);
}
.form-control:disabled {
background: var(--bg-secondary);
color: var(--text-disabled);
cursor: not-allowed;
}
.form-control.is-invalid {
border-color: var(--error);
}
.form-control.is-invalid:focus {
box-shadow: 0 0 0 3px rgba(255, 107, 107, 0.1);
}
.form-control.is-valid {
border-color: var(--success);
}
/* Textarea */
textarea.form-control {
resize: vertical;
min-height: 100px;
}
/* Select */
select.form-control {
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23495057' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 1rem center;
padding-right: 2.5rem;
}
/* Сообщения валидации */
.form-feedback {
display: block;
margin-top: var(--space-2);
font-size: var(--text-sm);
}
.form-feedback.invalid-feedback {
color: var(--error);
}
.form-feedback.valid-feedback {
color: var(--success);
}
.form-text {
display: block;
margin-top: var(--space-2);
font-size: var(--text-sm);
color: var(--text-tertiary);
}
/* Checkbox и Radio */
.form-check {
display: flex;
align-items: center;
gap: var(--space-3);
margin-bottom: var(--space-3);
}
.form-check-input {
width: 1.25rem;
height: 1.25rem;
border: 2px solid var(--border-color);
border-radius: var(--radius-sm);
cursor: pointer;
transition: all 0.2s ease;
}
.form-check-input:checked {
background: var(--primary-500);
border-color: var(--primary-500);
}
.form-check-input[type="radio"] {
border-radius: var(--radius-full);
}
.form-check-label {
font-size: var(--text-base);
color: var(--text-primary);
cursor: pointer;
}
Бейджи и теги
.badge {
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: var(--space-1) var(--space-3);
font-size: var(--text-xs);
font-weight: var(--font-semibold);
line-height: var(--leading-none);
border-radius: var(--radius-full);
white-space: nowrap;
}
.badge-primary {
background: var(--primary-100);
color: var(--primary-700);
}
.badge-secondary {
background: var(--secondary-100);
color: var(--secondary-700);
}
.badge-success {
background: var(--success-light);
color: var(--success-dark);
}
.badge-warning {
background: var(--warning-light);
color: var(--warning-dark);
}
.badge-error {
background: var(--error-light);
color: var(--error-dark);
}
.badge-info {
background: var(--info-light);
color: var(--info-dark);
}
.badge-outline {
background: transparent;
border: 1px solid currentColor;
}
/* Теги */
.tag {
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-3);
font-size: var(--text-sm);
background: var(--gray-100);
color: var(--text-secondary);
border-radius: var(--radius-md);
transition: all 0.2s ease;
}
.tag:hover {
background: var(--gray-200);
}
.tag-removable {
padding-right: var(--space-2);
}
.tag-remove {
display: flex;
align-items: center;
justify-content: center;
width: 1rem;
height: 1rem;
background: transparent;
border: none;
border-radius: var(--radius-full);
cursor: pointer;
transition: background 0.2s ease;
}
.tag-remove:hover {
background: var(--gray-300);
}
5.3. Макеты ключевых страниц
Главная страница
┌─────────────────────────────────────────────────────────────┐
│ HEADER │
│ [Логотип] [Меню навигации] [Поиск] [Войти] [Регистрация] │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ HERO SECTION │
│ │
│ Найдите инвестора для вашего проекта │
│ или инвестируйте в перспективный бизнес │
│ │
│ [Я ищу инвестиции] [Я инвестор] [Узнать больше] │
│ │
│ 📊 1000+ проектов 💰 500+ инвесторов 🤝 200+ сделок │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ БЫСТРЫЙ ПОИСК │
│ │
│ [Поиск...] [Отрасль ▼] [Стадия ▼] [Сумма ▼] [Найти] │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ГОРЯЧИЕ ПРОЕКТЫ │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Проект 1│ │ Проект 2│ │ Проект 3│ │ Проект 4│ │
│ │ [img] │ │ [img] │ │ [img] │ │ [img] │ │
│ │ Название│ │ Название│ │ Название│ │ Название│ │
│ │ 5М ₽ │ │ 10М ₽ │ │ 3М ₽ │ │ 15М ₽ │ │
│ │ IT │ │ Fintech │ │ E-comm │ │ Medtech │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ [Все проекты →] │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ПРОВЕРЕННЫЕ ИНВЕСТОРЫ │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │✓✓ Фонд 1│ │✓✓ Фонд 2│ │✓ Ангел 1│ │✓✓ Клуб 1│ │
│ │ [logo] │ │ [logo] │ │ [avatar]│ │ [logo] │ │
│ │ 5-50М ₽ │ │ 10-100М │ │ 1-10М ₽ │ │ 3-30М ₽ │ │
│ │ IT, Tech│ │ Fintech │ │ Любые │ │ Разное │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ [Все инвесторы →] │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ КАК ЭТО РАБОТАЕТ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 1 │ → │ 2 │ → │ 3 │ │
│ │Регистрация│ │ Создайте │ │ Получайте│ │
│ │и профиль │ │объявление│ │ отклики │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ВОЗМОЖНОСТИ ПЛАТФОРМЫ │
│ │
│ [4 блока с иконками и описанием возможностей] │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ УСПЕШНЫЕ КЕЙСЫ │
│ │
│ [3 карточки с историями успеха] │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ТАРИФЫ │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ FREE │ │ PRO │ │ PREMIUM │ │
│ │ Бесплатно│ │ 2990₽/мес│ │ 9990₽/мес│ │
│ │ [список]│ │ [список]│ │ [список]│ │
│ │[Начать] │ │[Выбрать]│ │[Выбрать]│ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ FOOTER │
│ [Ссылки] [Соцсети] [Контакты] [Подписка на рассылку] │
└─────────────────────────────────────────────────────────────┘
Каталог проектов
┌─────────────────────────────────────────────────────────────┐
│ HEADER │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ BREADCRUMBS │
│ Главная > Инвестиционные проекты │
└─────────────────────────────────────────────────────────────┘
┌───────────────────┬─────────────────────────────────────────┐
│ ФИЛЬТРЫ │ РЕЗУЛЬТАТЫ ПОИСКА │
│ │ │
│ 🔍 Поиск │ Найдено: 247 проектов │
│ [_________] │ [Сортировка: Новые ▼] [Вид: □ ≡] │
│ │ │
│ Отрасль │ ┌────────────────────────────────────┐ │
│ ☐ IT (120) │ │ [TOP] ✓✓ Название проекта │ │
│ ☐ Fintech (45) │ │ [Изображение] │ │
│ ☐ E-commerce (67) │ │ Краткое описание проекта... │ │
│ ☐ Медицина (34) │ │ 💰 5 000 000 ₽ | 📊 Seed | 📍 Москва│ │
│ [Показать все] │ │ #IT #SaaS #B2B │ │
│ │ │ 👁 245 | 💬 12 | ⭐ 4.5 │ │
│ Стадия │ └────────────────────────────────────┘ │
│ ☐ Идея (89) │ │
│ ☐ MVP (102) │ ┌────────────────────────────────────┐ │
│ ☐ Рост (56) │ │ ✓ Название проекта 2 │ │
│ │ │ [Изображение] │ │
│ Сумма инвестиций │ │ Краткое описание... │ │
│ От: [_____] ₽ │ │ 💰 10 000 000 ₽ | 📊 Growth │ │
│ До: [_____] ₽ │ │ #Fintech #Mobile │ │
│ │ │ 👁 189 | 💬 8 | ⭐ 4.2 │ │
│ Регион │ └────────────────────────────────────┘ │
│ ☐ Москва (145) │ │
│ ☐ СПб (67) │ [Еще проекты...] │
│ ☐ Регионы (35) │ │
│ │ [Pagination: 1 2 3 ... 25] │
│ Форма инвестиций │ │
│ ☐ Доля (187) │ │
│ ☐ Заём (45) │ │
│ ☐ Партнёрство(15) │ │
│ │ │
│ [Сбросить фильтры]│ │
└───────────────────┴─────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ FOOTER │
└─────────────────────────────────────────────────────────────┘
Карточка проекта
┌─────────────────────────────────────────────────────────────┐
│ HEADER │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ BREADCRUMBS │
│ Главная > Проекты > IT > Название проекта │
└─────────────────────────────────────────────────────────────┘
┌───────────────────────────────┬─────────────────────────────┐
│ ОСНОВНАЯ ИНФОРМАЦИЯ │ БОКОВАЯ ПАНЕЛЬ │
│ │ │
│ [TOP] ✓✓ Название проекта │ ┌─────────────────────────┐ │
│ #IT #SaaS #B2B │ │ КЛЮЧЕВЫЕ ПОКАЗАТЕЛИ │ │
│ │ │ │ │
│ [Галерея изображений] │ │ 💰 Требуется: │ │
│ [Главное фото] │ │ 5 000 000 ₽ │ │
│ [Фото 2] [Фото 3] [Фото 4] │ │ │ │
│ │ │ 📊 Стадия: Seed │ │
│ ┌───────────────────────────┐ │ │ 🏢 Отрасль: IT │ │
│ │ КРАТКОЕ ОПИСАНИЕ │ │ │ 📍 Регион: Москва │ │
│ │ Краткое описание проекта │ │ │ 📅 Создан: 15.01.2024 │ │
│ │ в 2-3 предложениях... │ │ │ │ │
│ └───────────────────────────┘ │ │ 👁 Просмотры: 245 │ │
│ │ │ 💬 Отклики: 12 │ │
│ ┌───────────────────────────┐ │ │ ⭐ Рейтинг: 4.5/5 │ │
│ │ ДЕТАЛЬНОЕ ОПИСАНИЕ │ │ └─────────────────────────┘ │
│ │ │ │ │
│ │ Подробное описание │ │ ┌─────────────────────────┐ │
│ │ проекта, бизнес-модель, │ │ │ ДЕЙСТВИЯ │ │
│ │ целевая аудитория, │ │ │ │ │
│ │ конкурентные │ │ │ [Отправить отклик] │ │
│ │ преимущества... │ │ │ [Запросить контакты] │ │
│ │ │ │ │ [Запросить документы] │ │
│ │ [Развернуть полностью] │ │ │ [❤ В избранное] │ │
│ └───────────────────────────┘ │ │ [↗ Поделиться] │ │
│ │ │ [⚠ Пожаловаться] │ │
│ ┌───────────────────────────┐ │ └─────────────────────────┘ │
│ │ ФИНАНСОВЫЕ ПОКАЗАТЕЛИ │ │ │
│ │ │ │ ┌─────────────────────────┐ │
│ │ Выручка: 2 000 000 ₽/год │ │ │ АВТОР ПРОЕКТА │ │
│ │ Прибыль: 500 000 ₽/год │ │ │ │ │
│ │ Юнит-экономика: [данные] │ │ │ [Аватар] │ │
│ │ Метрики: [данные] │ │ │ Иван Петров │ │
│ │ │ │ │ ✓ Проверенный │ │
│ │ [График динамики] │ │ │ │ │
│ └───────────────────────────┘ │ │ Предприниматель │ │
│ │ │ Опыт: 5 лет │ │
│ ┌───────────────────────────┐ │ │ Проектов: 3 │ │
│ │ КОМАНДА │ │ │ ⭐ Рейтинг: 4.8/5 │ │
│ │ │ │ │ │ │
│ │ [Фото] Иван - CEO │ │ │ [Написать сообщение] │ │
│ │ [Фото] Мария - CTO │ │ │ [Посмотреть профиль] │ │
│ │ [Фото] Петр - CMO │ │ └─────────────────────────┘ │
│ └───────────────────────────┘ │ │
│ │ ┌─────────────────────────┐ │
│ ┌───────────────────────────┐ │ │ ПОХОЖИЕ ПРОЕКТЫ │ │
│ │ ДОКУМЕНТЫ │ │ │ │ │
│ │ │ │ │ [Проект 1] │ │
│ │ 📄 Презентация проекта │ │ │ [Проект 2] │ │
│ │ 📄 Бизнес-план │ │ │ [Проект 3] │ │
│ │ 📄 Финансовая модель │ │ └─────────────────────────┘ │
│ │ │ │ │
│ │ [Запросить доступ] │ │ │
│ └───────────────────────────┘ │ │
│ │ │
│ ┌───────────────────────────┐ │ │
│ │ ОТЗЫВЫ И РЕЙТИНГ │ │ │
│ │ │ │ │
│ │ ⭐⭐⭐⭐⭐ 4.5/5 (8 отзывов) │ │ │
│ │ │ │ │
│ │ [Отзыв 1] │ │ │
│ │ [Отзыв 2] │ │ │
│ │ [Показать все отзывы] │ │ │
│ └───────────────────────────┘ │ │
└───────────────────────────────┴─────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ FOOTER │
└─────────────────────────────────────────────────────────────┘
5.4. Адаптивный дизайн
Брейкпоинты
/* Breakpoints */
:root {
--breakpoint-xs: 0;
--breakpoint-sm: 640px;
--breakpoint-md: 768px;
--breakpoint-lg: 1024px;
--breakpoint-xl: 1280px;
--breakpoint-2xl: 1536px;
}
/* Mobile First подход */
/* Extra Small devices (phones, less than 640px) */
/* Базовые стили */
/* Small devices (tablets, 640px and up) */
@media (min-width: 640px) {
.container {
max-width: 640px;
}
}
/* Medium devices (tablets, 768px and up) */
@media (min-width: 768px) {
.container {
max-width: 768px;
}
/* Двухколоночная сетка для каталогов */
.catalog-grid {
grid-template-columns: repeat(2, 1fr);
}
}
/* Large devices (desktops, 1024px and up) */
@media (min-width: 1024px) {
.container {
max-width: 1024px;
}
/* Трехколоночная сетка */
.catalog-grid {
grid-template-columns: repeat(3, 1fr);
}
/* Боковая панель фильтров */
.catalog-layout {
display: grid;
grid-template-columns: 280px 1fr;
gap: var(--space-8);
}
}
/* Extra Large devices (large desktops, 1280px and up) */
@media (min-width: 1280px) {
.container {
max-width: 1280px;
}
/* Четырехколоночная сетка */
.catalog-grid {
grid-template-columns: repeat(4, 1fr);
}
}
/* 2XL devices (larger desktops, 1536px and up) */
@media (min-width: 1536px) {
.container {
max-width: 1536px;
}
}
Мобильная навигация
<!-- Мобильное меню (< 1024px) -->
<header class="header-mobile">
<div class="header-mobile-top">
<button class="menu-toggle" aria-label="Открыть меню">
<span></span>
<span></span>
<span></span>
</button>
<a href="/" class="logo">
<img src="logo.svg" alt="Русинвестпроект">
</a>
<div class="header-mobile-actions">
<button class="search-toggle" aria-label="Поиск">
<i class="icon-search"></i>
</button>
<a href="/login" class="btn-login">
<i class="icon-user"></i>
</a>
</div>
</div>
<!-- Выдвижное меню -->
<nav class="mobile-menu">
<div class="mobile-menu-header">
<button class="mobile-menu-close">×</button>
</div>
<ul class="mobile-menu-list">
<li><a href="/projects">Проекты</a></li>
<li><a href="/investors">Инвесторы</a></li>
<li><a href="/business">Готовый бизнес</a></li>
<li><a href="/franchise">Франшизы</a></li>
<li><a href="/jobs">Вакансии</a></li>
<li><a href="/education">Образование</a></li>
<li><a href="/events">Мероприятия</a></li>
<li><a href="/knowledge">База знаний</a></li>
</ul>
<div class="mobile-menu-footer">
<a href="/register" class="btn btn-primary btn-block">
Регистрация
</a>
<a href="/pricing" class="btn btn-outline btn-block">
Тарифы
</a>
</div>
</nav>
</header>
<style>
.header-mobile {
display: none;
}
@media (max-width: 1023px) {
.header-desktop {
display: none;
}
.header-mobile {
display: block;
position: sticky;
top: 0;
z-index: var(--z-sticky);
background: white;
border-bottom: 1px solid var(--border-color);
}
.header-mobile-top {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-4);
}
.menu-toggle {
display: flex;
flex-direction: column;
gap: 4px;
background: none;
border: none;
padding: var(--space-2);
cursor: pointer;
}
.menu-toggle span {
display: block;
width: 24px;
height: 2px;
background: var(--text-primary);
transition: all 0.3s ease;
}
.mobile-menu {
position: fixed;
top: 0;
left: -100%;
width: 80%;
max-width: 320px;
height: 100vh;
background: white;
box-shadow: var(--shadow-xl);
transition: left 0.3s ease;
z-index: var(--z-modal);
overflow-y: auto;
}
.mobile-menu.is-open {
left: 0;
}
.mobile-menu-list {
list-style: none;
padding: 0;
margin: 0;
}
.mobile-menu-list li a {
display: block;
padding: var(--space-4);
color: var(--text-primary);
text-decoration: none;
border-bottom: 1px solid var(--border-color);
}
.mobile-menu-list li a:hover {
background: var(--bg-secondary);
}
}
</style>
—
6. СТРУКТУРА API ENDPOINTS
6.1. Общие принципы API
BASE_URL: https://api.rusinvestproject.ru/v1
Формат ответов: JSON
Аутентификация: Bearer Token (JWT)
Rate Limiting: Зависит от тарифа пользователя
Стандартная структура ответа:
{
"success": true|false,
"data": {...} | [...],
"message": "Success message",
"errors": [...],
"meta": {
"page": 1,
"per_page": 20,
"total": 100,
"total_pages": 5
}
}
Коды ответов:
200 - OK
201 - Created
204 - No Content
400 - Bad Request
401 - Unauthorized
403 - Forbidden
404 - Not Found
422 - Validation Error
429 - Too Many Requests
500 - Internal Server Error
6.2. Аутентификация и пользователи
POST /auth/register
POST /auth/login
POST /auth/logout
POST /auth/refresh
POST /auth/forgot-password
POST /auth/reset-password
POST /auth/verify-email
POST /auth/resend-verification
GET /users/me
PUT /users/me
DELETE /users/me
GET /users/{id}
POST /users/me/avatar
DELETE /users/me/avatar
GET /users/me/roles
POST /users/me/roles
DELETE /users/me/roles/{role_id}
POST /users/me/verification/request
POST /users/me/verification/submit
GET /users/me/verification/status
6.3. Инвестиционные проекты
GET /projects
POST /projects
GET /projects/{id}
PUT /projects/{id}
DELETE /projects/{id}
PATCH /projects/{id}/status
GET /projects/{id}/views
POST /projects/{id}/views
GET /projects/{id}/responses
POST /projects/{id}/responses
GET /projects/{id}/contacts
POST /projects/{id}/contacts/request
GET /projects/{id}/documents
POST /projects/{id}/documents/request
POST /projects/{id}/favorite
DELETE /projects/{id}/favorite
GET /projects/favorites
POST /projects/{id}/promote
GET /projects/{id}/stats
GET /projects/{id}/reviews
POST /projects/{id}/reviews
PUT /projects/{id}/reviews/{review_id}
DELETE /projects/{id}/reviews/{review_id}
6.4. Готовый бизнес
GET /businesses
POST /businesses
GET /businesses/{id}
PUT /businesses/{id}
DELETE /businesses/{id}
PATCH /businesses/{id}/status
GET /businesses/{id}/responses
POST /businesses/{id}/responses
GET /businesses/{id}/contacts/request
POST /businesses/{id}/documents/request
POST /businesses/{id}/favorite
DELETE /businesses/{id}/favorite
POST /businesses/{id}/promote
GET /businesses/{id}/stats
6.5. Франшизы
GET /franchises
POST /franchises
GET /franchises/{id}
PUT /franchises/{id}
DELETE /franchises/{id}
GET /franchises/{id}/applications
POST /franchises/{id}/applications
GET /franchises/{id}/applications/{app_id}
PATCH /franchises/{id}/applications/{app_id}/status
POST /franchises/{id}/favorite
DELETE /franchises/{id}/favorite
POST /franchises/{id}/promote
GET /franchises/{id}/stats
GET /franchises/{id}/reviews
POST /franchises/{id}/reviews
6.6. Инвесторы
GET /investors
POST /investors
GET /investors/{id}
PUT /investors/{id}
DELETE /investors/{id}
GET /investors/me/focus
PUT /investors/me/focus
GET /investors/{id}/portfolio
POST /investors/{id}/portfolio
GET /investors/{id}/recommendations
POST /investors/{id}/contact-request
POST /investors/{id}/favorite
DELETE /investors/{id}/favorite
6.7. Вакансии и резюме
GET /jobs
POST /jobs
GET /jobs/{id}
PUT /jobs/{id}
DELETE /jobs/{id}
GET /jobs/{id}/applications
POST /jobs/{id}/applications
GET /resumes
POST /resumes
GET /resumes/{id}
PUT /resumes/{id}
DELETE /resumes/{id}
GET /resumes/{id}/responses
6.8. Образование и мероприятия
GET /education/programs
POST /education/programs
GET /education/programs/{id}
PUT /education/programs/{id}
DELETE /education/programs/{id}
POST /education/programs/{id}/apply
GET /education/programs/{id}/applications
GET /events
POST /events
GET /events/{id}
PUT /events/{id}
DELETE /events/{id}
POST /events/{id}/register
DELETE /events/{id}/register
GET /events/{id}/participants
6.9. Коммуникации
GET /messages/conversations
POST /messages/conversations
GET /messages/conversations/{id}
DELETE /messages/conversations/{id}
GET /messages/conversations/{id}/messages
POST /messages/conversations/{id}/messages
PUT /messages/{message_id}
DELETE /messages/{message_id}
PATCH /messages/{message_id}/read
POST /messages/conversations/{id}/typing
GET /notifications
GET /notifications/unread
PATCH /notifications/{id}/read
PATCH /notifications/read-all
DELETE /notifications/{id}
GET /notifications/settings
PUT /notifications/settings
6.10. Поиск и фильтры
GET /search
GET /search/projects
GET /search/investors
GET /search/businesses
GET /search/franchises
GET /search/jobs
GET /search/resumes
GET /saved-searches
POST /saved-searches
GET /saved-searches/{id}
PUT /saved-searches/{id}
DELETE /saved-searches/{id}
GET /recommendations
GET /recommendations/projects
GET /recommendations/investors
6.11. Тарифы и платежи
GET /subscriptions/plans
GET /subscriptions/current
POST /subscriptions/subscribe
POST /subscriptions/change-plan
POST /subscriptions/cancel
POST /subscriptions/resume
GET /payments/history
GET /payments/{id}
POST /payments/create
POST /payments/verify
POST /promocodes/apply
GET /promocodes/validate
GET /services
POST /services/{id}/order
GET /services/orders
GET /services/orders/{id}
6.12. Контент и база знаний
GET /articles
GET /articles/{id}
GET /articles/categories
GET /articles/tags
GET /cases
GET /cases/{id}
GET /ecosystem/accelerators
GET /ecosystem/funds
GET /ecosystem/grants
GET /ecosystem/techparks
6.13. Сообщество
GET /community/topics
POST /community/topics
GET /community/topics/{id}
PUT /community/topics/{id}
DELETE /community/topics/{id}
GET /community/topics/{id}/comments
POST /community/topics/{id}/comments
PUT /community/comments/{id}
DELETE /community/comments/{id}
POST /community/topics/{id}/like
DELETE /community/topics/{id}/like
POST /community/comments/{id}/like
DELETE /community/comments/{id}/like
6.14. Отзывы и рейтинги
GET /reviews
POST /reviews
GET /reviews/{id}
PUT /reviews/{id}
DELETE /reviews/{id}
POST /reviews/{id}/response
PUT /reviews/{id}/response
DELETE /reviews/{id}/response
POST /reviews/{id}/complaint
GET /reviews/{id}/complaints
GET /ratings/{entity_type}/{entity_id}
6.15. Админ-панель
GET /admin/users
GET /admin/users/{id}
PATCH /admin/users/{id}/status
PATCH /admin/users/{id}/role
DELETE /admin/users/{id}
GET /admin/moderation/queue
GET /admin/moderation/{entity_type}/{id}
POST /admin/moderation/{entity_type}/{id}/approve
POST /admin/moderation/{entity_type}/{id}/reject
POST /admin/moderation/{entity_type}/{id}/request-changes
GET /admin/complaints
GET /admin/complaints/{id}
PATCH /admin/complaints/{id}/resolve
GET /admin/analytics/dashboard
GET /admin/analytics/users
GET /admin/analytics/listings
GET /admin/analytics/revenue
GET /admin/analytics/conversions
GET /admin/dictionaries/{type}
POST /admin/dictionaries/{type}
PUT /admin/dictionaries/{type}/{id}
DELETE /admin/dictionaries/{type}/{id}
GET /admin/subscriptions/plans
POST /admin/subscriptions/plans
PUT /admin/subscriptions/plans/{id}
DELETE /admin/subscriptions/plans/{id}
GET /admin/promocodes
POST /admin/promocodes
PUT /admin/promocodes/{id}
DELETE /admin/promocodes/{id}
6.16. Примеры запросов/ответов
Регистрация пользователя
POST /auth/register
Content-Type: application/json
{
"email": "user@example.com",
"password": "SecurePassword123!",
"password_confirmation": "SecurePassword123!",
"name": "Иван Петров",
"phone": "+79991234567",
"roles": ["entrepreneur"],
"agree_terms": true
}
Response 201:
{
"success": true,
"data": {
"user": {
"id": 12345,
"email": "user@example.com",
"name": "Иван Петров",
"phone": "+79991234567",
"roles": ["entrepreneur"],
"email_verified": false,
"created_at": "2024-01-15T10:30:00Z"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"message": "Регистрация успешна. Проверьте email для подтверждения."
}
Создание проекта
POST /projects
Authorization: Bearer {token}
Content-Type: application/json
{
"title": "Инновационная SaaS-платформа",
"industry_id": 15,
"stage": "seed",
"investment_amount": 5000000,
"investment_form": "equity",
"equity_offered": 15,
"region_id": 77,
"short_description": "Краткое описание проекта...",
"full_description": "Детальное описание проекта...",
"business_model": "Описание бизнес-модели...",
"target_audience": "Описание целевой аудитории...",
"competitive_advantages": "Конкурентные преимущества...",
"revenue": 2000000,
"profit": 500000,
"has_mvp": true,
"team": [
{
"name": "Иван Петров",
"role": "CEO",
"experience": "10 лет в IT"
}
],
"tags": ["saas", "b2b", "it"]
}
Response 201:
{
"success": true,
"data": {
"id": 67890,
"title": "Инновационная SaaS-платформа",
"status": "moderation",
"slug": "innovacionnaya-saas-platforma",
"created_at": "2024-01-15T11:00:00Z",
"moderation_eta": "2024-01-17T11:00:00Z"
},
"message": "Проект создан и отправлен на модерацию"
}
Поиск проектов с фильтрами
GET /projects?industry=15&stage=seed&investment_min=1000000&investment_max=10000000®ion=77&page=1&per_page=20&sort=created_at&order=desc
Authorization: Bearer {token}
Response 200:
{
"success": true,
"data": [
{
"id": 67890,
"title": "Инновационная SaaS-платформа",
"slug": "innovacionnaya-saas-platforma",
"industry": {
"id": 15,
"name": "IT / SaaS"
},
"stage": "seed",
"investment_amount": 5000000,
"region": {
"id": 77,
"name": "Москва"
},
"short_description": "Краткое описание...",
"image": "https://cdn.rusinvestproject.ru/projects/67890/main.jpg",
"verified": true,
"promoted": false,
"views_count": 245,
"responses_count": 12,
"rating": 4.5,
"created_at": "2024-01-15T11:00:00Z",
"author": {
"id": 12345,
"name": "Иван Петров",
"verified": true,
"avatar": "https://cdn.rusinvestproject.ru/users/12345/avatar.jpg"
}
},
// ... другие проекты
],
"meta": {
"page": 1,
"per_page": 20,
"total": 247,
"total_pages": 13
}
}
—
7. СТРУКТУРА БАЗЫ ДАННЫХ
7.1. Основные таблицы
users (Пользователи)
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) UNIQUE NOT NULL,
phone VARCHAR(20) UNIQUE,
password_hash VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
avatar VARCHAR(500),
email_verified_at TIMESTAMP NULL,
phone_verified_at TIMESTAMP NULL,
subscription_plan_id INT,
subscription_status ENUM('active', 'trial', 'expired', 'cancelled') DEFAULT 'trial',
subscription_started_at TIMESTAMP NULL,
subscription_expires_at TIMESTAMP NULL,
verification_status ENUM('unverified', 'pending', 'verified', 'rejected') DEFAULT 'unverified',
verification_level ENUM('none', 'basic', 'standard', 'premium') DEFAULT 'none',
status ENUM('active', 'suspended', 'banned', 'deleted') DEFAULT 'active',
last_login_at TIMESTAMP NULL,
last_login_ip VARCHAR(45),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
INDEX idx_email (email),
INDEX idx_phone (phone),
INDEX idx_subscription (subscription_plan_id, subscription_status),
INDEX idx_status (status),
INDEX idx_created (created_at)
);
user_roles (Роли пользователей)
CREATE TABLE user_roles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
role ENUM('entrepreneur', 'investor', 'recruiter', 'job_seeker', 'educator', 'admin', 'moderator') NOT NULL,
is_primary BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE KEY unique_user_role (user_id, role),
INDEX idx_user (user_id),
INDEX idx_role (role)
);
projects (Инвестиционные проекты)
CREATE TABLE projects (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
industry_id INT NOT NULL,
stage ENUM('idea', 'pre_seed', 'seed', 'early', 'growth', 'expansion', 'exit') NOT NULL,
investment_amount DECIMAL(15, 2) NOT NULL,
investment_form ENUM('equity', 'equity_minority', 'equity_blocking', 'equity_control',
'loan', 'convertible', 'safe', 'revenue_share', 'partnership') NOT NULL,
equity_offered DECIMAL(5, 2),
region_id INT NOT NULL,
short_description TEXT NOT NULL,
full_description LONGTEXT,
business_model TEXT,
target_audience TEXT,
competitive_advantages TEXT,
revenue DECIMAL(15, 2),
profit DECIMAL(15, 2),
has_mvp BOOLEAN DEFAULT FALSE,
main_image VARCHAR(500),
status ENUM('draft', 'moderation', 'changes_required', 'active', 'verified',
'paused', 'closed', 'blocked', 'expired', 'deleted') DEFAULT 'draft',
verified_at TIMESTAMP NULL,
published_at TIMESTAMP NULL,
closed_at TIMESTAMP NULL,
views_count INT DEFAULT 0,
responses_count INT DEFAULT 0,
favorites_count INT DEFAULT 0,
promoted_until TIMESTAMP NULL,
highlighted_until TIMESTAMP NULL,
top_until TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (industry_id) REFERENCES industries(id),
FOREIGN KEY (region_id) REFERENCES regions(id),
INDEX idx_user (user_id),
INDEX idx_industry (industry_id),
INDEX idx_stage (stage),
INDEX idx_region (region_id),
INDEX idx_status (status),
INDEX idx_investment (investment_amount),
INDEX idx_published (published_at),
INDEX idx_promoted (promoted_until),
FULLTEXT idx_search (title, short_description, full_description)
);
businesses (Готовый бизнес)
CREATE TABLE businesses (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
industry_id INT NOT NULL,
business_type VARCHAR(100),
price DECIMAL(15, 2) NOT NULL,
sale_format ENUM('full', 'share', 'partnership') NOT NULL,
share_percentage DECIMAL(5, 2),
region_id INT NOT NULL,
revenue DECIMAL(15, 2) NOT NULL,
profit DECIMAL(15, 2),
assets_value DECIMAL(15, 2),
liabilities DECIMAL(15, 2),
employees_count INT,
short_description TEXT NOT NULL,
full_description LONGTEXT,
sale_reason TEXT,
main_image VARCHAR(500),
status ENUM('draft', 'moderation', 'changes_required', 'active', 'verified',
'paused', 'closed', 'blocked', 'expired', 'deleted') DEFAULT 'draft',
views_count INT DEFAULT 0,
responses_count INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (industry_id) REFERENCES industries(id),
FOREIGN KEY (region_id) REFERENCES regions(id),
INDEX idx_user (user_id),
INDEX idx_industry (industry_id),
INDEX idx_region (region_id),
INDEX idx_status (status),
INDEX idx_price (price),
FULLTEXT idx_search (title, short_description, full_description)
);
franchises (Франшизы)
CREATE TABLE franchises (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
industry_id INT NOT NULL,
lump_sum_payment DECIMAL(15, 2) NOT NULL,
royalty_percentage DECIMAL(5, 2),
royalty_amount DECIMAL(15, 2),
initial_investment_min DECIMAL(15, 2) NOT NULL,
initial_investment_max DECIMAL(15, 2),
payback_period_months INT,
active_locations_count INT DEFAULT 0,
short_description TEXT NOT NULL,
full_description LONGTEXT,
support_description TEXT,
requirements TEXT,
main_image VARCHAR(500),
logo VARCHAR(500),
status ENUM('draft', 'moderation', 'changes_required', 'active', 'verified',
'paused', 'closed', 'blocked', 'expired', 'deleted') DEFAULT 'draft',
views_count INT DEFAULT 0,
applications_count INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (industry_id) REFERENCES industries(id),
INDEX idx_user (user_id),
INDEX idx_industry (industry_id),
INDEX idx_status (status),
INDEX idx_lump_sum (lump_sum_payment),
FULLTEXT idx_search (title, short_description, full_description)
);
investors (Инвесторы)
CREATE TABLE investors (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
investor_type ENUM('angel', 'family_office', 'vc_fund', 'pe_fund', 'corporate_vc',
'accelerator', 'incubator', 'bank', 'investment_club',
'crowdfunding', 'state_fund', 'strategic') NOT NULL,
company_name VARCHAR(255),
logo VARCHAR(500),
check_min DECIMAL(15, 2) NOT NULL,
check_max DECIMAL(15, 2),
investment_forms JSON,
preferred_stages JSON,
preferred_industries JSON,
preferred_regions JSON,
description LONGTEXT,
investment_approach TEXT,
portfolio_description TEXT,
deals_count INT DEFAULT 0,
visibility ENUM('public', 'semi_public', 'private') DEFAULT 'public',
verified_at TIMESTAMP NULL,
status ENUM('active', 'inactive', 'blocked') DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user (user_id),
INDEX idx_type (investor_type),
INDEX idx_check (check_min, check_max),
INDEX idx_status (status),
FULLTEXT idx_search (company_name, description)
);
jobs (Вакансии)
CREATE TABLE jobs (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
role VARCHAR(100) NOT NULL,
industry_id INT,
description LONGTEXT NOT NULL,
requirements TEXT,
responsibilities TEXT,
salary_min DECIMAL(12, 2),
salary_max DECIMAL(12, 2),
salary_currency CHAR(3) DEFAULT 'RUB',
employment_type ENUM('full_time', 'part_time', 'contract', 'internship') DEFAULT 'full_time',
work_format ENUM('office', 'remote', 'hybrid') DEFAULT 'office',
region_id INT,
city VARCHAR(100),
company_name VARCHAR(255),
company_logo VARCHAR(500),
status ENUM('draft', 'active', 'paused', 'closed', 'expired') DEFAULT 'draft',
views_count INT DEFAULT 0,
applications_count INT DEFAULT 0,
expires_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (industry_id) REFERENCES industries(id),
FOREIGN KEY (region_id) REFERENCES regions(id),
INDEX idx_user (user_id),
INDEX idx_industry (industry_id),
INDEX idx_region (region_id),
INDEX idx_status (status),
INDEX idx_salary (salary_min, salary_max),
FULLTEXT idx_search (title, description)
);
resumes (Резюме)
CREATE TABLE resumes (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
desired_role VARCHAR(100) NOT NULL,
desired_industries JSON,
summary TEXT NOT NULL,
experience LONGTEXT,
education TEXT,
skills JSON,
desired_salary_min DECIMAL(12, 2),
desired_salary_max DECIMAL(12, 2),
salary_currency CHAR(3) DEFAULT 'RUB',
desired_employment_type JSON,
desired_work_format JSON,
desired_regions JSON,
relocation_ready BOOLEAN DEFAULT FALSE,
status ENUM('draft', 'active', 'paused', 'deleted') DEFAULT 'draft',
views_count INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user (user_id),
INDEX idx_status (status),
FULLTEXT idx_search (title, summary, experience)
);
messages (Сообщения)
CREATE TABLE conversations (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user1_id BIGINT NOT NULL,
user2_id BIGINT NOT NULL,
last_message_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user1_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (user2_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE KEY unique_conversation (user1_id, user2_id),
INDEX idx_user1 (user1_id),
INDEX idx_user2 (user2_id),
INDEX idx_last_message (last_message_at)
);
CREATE TABLE messages (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
conversation_id BIGINT NOT NULL,
sender_id BIGINT NOT NULL,
message TEXT NOT NULL,
read_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
FOREIGN KEY (sender_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_conversation (conversation_id),
INDEX idx_sender (sender_id),
INDEX idx_created (created_at)
);
responses (Отклики)
CREATE TABLE responses (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
entity_type ENUM('project', 'business', 'franchise', 'job', 'investor') NOT NULL,
entity_id BIGINT NOT NULL,
message TEXT,
status ENUM('new', 'viewed', 'in_progress', 'accepted', 'rejected', 'closed') DEFAULT 'new',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user (user_id),
INDEX idx_entity (entity_type, entity_id),
INDEX idx_status (status),
INDEX idx_created (created_at)
);
reviews (Отзывы)
CREATE TABLE reviews (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
author_id BIGINT NOT NULL,
entity_type ENUM('project', 'business', 'franchise', 'investor', 'user') NOT NULL,
entity_id BIGINT NOT NULL,
rating TINYINT NOT NULL CHECK (rating BETWEEN 1 AND 5),
criteria_scores JSON,
title VARCHAR(255),
text TEXT NOT NULL,
deal_status ENUM('completed', 'in_progress', 'cancelled', 'declined'),
is_anonymous BOOLEAN DEFAULT FALSE,
status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending',
moderation_comment TEXT,
response_text TEXT,
response_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_author (author_id),
INDEX idx_entity (entity_type, entity_id),
INDEX idx_rating (rating),
INDEX idx_status (status),
INDEX idx_created (created_at)
);
7.2. Справочники
industries (Отрасли)
CREATE TABLE industries (
id INT PRIMARY KEY AUTO_INCREMENT,
parent_id INT NULL,
name VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
sort_order INT DEFAULT 0,
is_active BOOLEAN DEFAULT TRUE,
FOREIGN KEY (parent_id) REFERENCES industries(id) ON DELETE SET NULL,
INDEX idx_parent (parent_id),
INDEX idx_slug (slug)
);
regions (Регионы)
CREATE TABLE regions (
id INT PRIMARY KEY AUTO_INCREMENT,
parent_id INT NULL,
name VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
type ENUM('country', 'federal_district', 'region', 'city') NOT NULL,
sort_order INT DEFAULT 0,
is_active BOOLEAN DEFAULT TRUE,
FOREIGN KEY (parent_id) REFERENCES regions(id) ON DELETE SET NULL,
INDEX idx_parent (parent_id),
INDEX idx_type (type),
INDEX idx_slug (slug)
);
subscription_plans (Тарифные планы)
CREATE TABLE subscription_plans (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
slug VARCHAR(100) UNIQUE NOT NULL,
price_monthly DECIMAL(10, 2) NOT NULL,
price_yearly DECIMAL(10, 2),
features JSON NOT NULL,
limits JSON NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
sort_order INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_slug (slug)
);
7.3. ER-диаграмма (упрощенная)
users
├─ user_roles
├─ projects
│ ├─ project_images
│ ├─ project_documents
│ ├─ project_team
│ └─ project_tags
├─ businesses
│ ├─ business_images
│ └─ business_documents
├─ franchises
│ ├─ franchise_images
│ └─ franchise_regions
├─ investors
│ └─ investor_portfolio
├─ jobs
├─ resumes
├─ conversations
│ └─ messages
├─ responses
├─ reviews
├─ favorites
├─ saved_searches
└─ notifications
Справочники:
├─ industries
├─ regions
├─ subscription_plans
└─ tags
—
8. ИНТЕГРАЦИЯ С СУЩЕСТВУЮЩЕЙ БАЗОЙ ДАННЫХ
8.1. Анализ текущей ситуации
Вопросы для уточнения:
- Существует ли текущая база данных?
- Да → Переход к миграции
- Нет → Создание с нуля
- Если существует:
- Какая СУБД используется? (MySQL, PostgreSQL, другая)
- Какая версия?
- Какой объем данных? (количество пользователей, объявлений)
- Какая структура таблиц?
- Есть ли документация схемы БД?
- Требуется ли перенос данных?
- Да → Разработка стратегии миграции
- Нет → Начало с чистой БД
8.2. Сценарий 1: Создание новой БД с нуля
Рекомендуется, если:
- Текущей БД нет
- Текущая БД устарела и не подлежит миграции
- Объем данных минимальный
План действий:
1. Выбор СУБД
Рекомендация: MySQL 8.0+ или PostgreSQL 14+
2. Создание схемы БД
- Выполнение SQL-скриптов создания таблиц
- Создание индексов
- Настройка foreign keys
3. Наполнение справочников
- Загрузка отраслей
- Загрузка регионов
- Создание тарифных планов
- Загрузка других справочников
4. Создание тестовых данных
- Генерация тестовых пользователей
- Создание тестовых объявлений
- Наполнение для тестирования
5. Настройка бэкапов
- Автоматические бэкапы
- Тестирование восстановления
8.3. Сценарий 2: Миграция из существующей БД
Если существует база данных, требуется:
Этап 1: Аудит текущей БД
-- Примерный скрипт для анализа текущей структуры
-- Получить список всех таблиц
SHOW TABLES;
-- Для каждой таблицы получить структуру
SHOW CREATE TABLE table_name;
-- Получить количество записей
SELECT
TABLE_NAME,
TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name';
-- Анализ связей
SELECT
TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = 'database_name';
Этап 2: Mapping (сопоставление) данных
Создание таблицы соответствия:
| Старая таблица | Старое поле | Новая таблица | Новое поле | Преобразование |
|---|---|---|---|---|
| old_users | user_id | users | id | Прямое |
| old_users | user_email | users | Прямое | |
| old_users | user_name | users | name | Прямое |
| old_projects | project_id | projects | id | Прямое |
| old_projects | project_title | projects | title | Прямое |
| old_projects | project_category | projects | industry_id | Через справочник |
| old_projects | project_stage | projects | stage | Enum mapping |
Этап 3: Скрипты миграции
-- Пример скрипта миграции пользователей
-- Создание временной таблицы для маппинга ID
CREATE TABLE migration_user_mapping (
old_id INT,
new_id BIGINT,
PRIMARY KEY (old_id),
INDEX (new_id)
);
-- Миграция пользователей
INSERT INTO users (
email,
name,
phone,
password_hash,
created_at
)
SELECT
old_email,
old_name,
old_phone,
old_password,
old_created_date
FROM old_database.old_users
WHERE old_status = 'active';
-- Сохранение маппинга ID
INSERT INTO migration_user_mapping (old_id, new_id)
SELECT
old_id,
LAST_INSERT_ID()
FROM old_database.old_users;
-- Миграция проектов с использованием маппинга
INSERT INTO projects (
user_id,
title,
industry_id,
stage,
investment_amount,
short_description,
created_at
)
SELECT
m.new_id,
op.title,
CASE
WHEN op.category = 'IT' THEN 1
WHEN op.category = 'Fintech' THEN 2
-- ... другие маппинги
END,
CASE
WHEN op.stage = 'Идея' THEN 'idea'
WHEN op.stage = 'MVP' THEN 'seed'
-- ... другие маппинги
END,
op.investment_sum,
op.description,
op.created_date
FROM old_database.old_projects op
JOIN migration_user_mapping m ON op.user_id = m.old_id
WHERE op.status = 'active';
Этап 4: Валидация миграции
-- Проверка количества записей
SELECT
'old_users' as source,
COUNT(*) as count
FROM old_database.old_users
UNION ALL
SELECT
'new_users' as source,
COUNT(*) as count
FROM users;
-- Проверка целостности данных
SELECT
u.id,
u.email,
COUNT(p.id) as projects_count
FROM users u
LEFT JOIN projects p ON u.id = p.user_id
GROUP BY u.id, u.email
HAVING projects_count = 0;
-- Проверка foreign keys
SELECT
p.id,
p.user_id,
u.id as user_exists
FROM projects p
LEFT JOIN users u ON p.user_id = u.id
WHERE u.id IS NULL;
Этап 5: План миграции
ПОДГОТОВКА (1-2 недели)
├── Аудит текущей БД
├── Создание mapping таблиц
├── Разработка скриптов миграции
├── Тестирование на копии БД
└── Документирование процесса
МИГРАЦИЯ (выходные/ночь)
├── Создание полного бэкапа старой БД
├── Создание новой БД
├── Выполнение скриптов миграции
├── Валидация данных
├── Тестирование функционала
└── Откат при критичных ошибках
ПОСТ-МИГРАЦИЯ (1 неделя)
├── Мониторинг работы системы
├── Исправление выявленных проблем
├── Дополнительная валидация
└── Архивирование старой БД
8.4. Сценарий 3: Параллельная работа двух систем
Если требуется плавный переход:
ФАЗА 1: Подготовка (2-4 недели)
├── Развертывание новой системы
├── Настройка синхронизации данных
├── Тестирование на ограниченной группе
└── Обучение пользователей
ФАЗА 2: Параллельная работа (1-2 месяца)
├── Новые пользователи → новая система
├── Старые пользователи → старая система
├── Постепенная миграция пользователей
└── Синхронизация критичных данных
ФАЗА 3: Полный переход
├── Миграция оставшихся пользователей
├── Отключение старой системы
├── Архивирование старых данных
└── Удаление дублирующих данных
8.5. Рекомендации
Для минимизации рисков:
- Всегда создавайте резервные копии перед миграцией
- Тестируйте миграцию на копии продакшн-данных
- Проводите миграцию в период минимальной активности
- Имейте план отката на случай критичных ошибок
- Валидируйте данные после каждого этапа миграции
- Документируйте процесс для возможного повторения
Контрольный чеклист миграции:
☐ Создан полный бэкап старой БД
☐ Новая БД развернута и протестирована
☐ Скрипты миграции написаны и протестированы
☐ Mapping таблицы созданы
☐ Валидационные запросы подготовлены
☐ План отката документирован
☐ Команда уведомлена о времени миграции
☐ Пользователи уведомлены о возможном downtime
☐ Мониторинг настроен
☐ Тестовые сценарии подготовлены
—
ИТОГО
Данная детализация охватывает:
✅ Конкретные лимиты тарифов — полная таблица с цифрами
✅ Детальные справочники — отрасли, регионы, стадии, формы инвестиций, типы инвесторов, статусы
✅ Детальные бизнес-правила — модерация, верификация, отзывы, антиспам
✅ Конкретные сроки — поэтапный план на 36 недель с детализацией по спринтам
✅ Детальные требования к дизайну — дизайн-система, компоненты, макеты страниц, адаптивность
✅ Структура API endpoints — полный список эндпоинтов с примерами
✅ Структура БД — детальные SQL-схемы основных таблиц
✅ Стратегия интеграции — 3 сценария работы с БД (новая/миграция/параллельная)
Все разделы содержат конкретные, реализуемые решения, готовые к использованию командой разработки.




