Под ключДизайн, Laravel и Vue · 2026
Сервис ретуши фото
Клиент платит монетами, мастер берёт заказ с биржи, админ видит каждую монету и каждый рубль
Сервис, где можно заказать ретушь фото. Мы сделали его под ключ: прототип и дизайн, вёрстку, бэкенд на Laravel, три кабинета на Vue, монеты с платёжным контуром, запуск на сервере заказчика и почту. Название и адрес сервиса я не раскрываю: здесь только о том, как он устроен. Демонстрации собраны на копии с выдуманными людьми и нейтральными фото.
КлиентАнна●5 монет

Заказ 1017 · 2 фотоЗавершён
Принято
МастерДмитрийзаработок +200 ₽

Заказ 1017 с биржисдано за 18 мин
Сдано
Админжурналдоля платформы +200 ₽
- −2 монеты списание за заказ 1017
- +200 ₽ начислено мастеру: 2 фото × 100 ₽
- 3
- кабинета на одной платформе: клиент, мастер, администратор
- 7
- статусов заказа и матрица допустимых переходов между ними
- 30
- минут у мастера на заказ, потом он сам вернётся на биржу
- 24
- часа у клиента на приёмку, дальше заказ принимается сам
Под ключ
От схемы экранов до писем, которые доходят
Работа шла этапами, каждый со своей приёмкой. После первого заказчик оставил отзыв, дальше просто шли вперёд.
- 01
Проектирование и дизайн
Структура, сценарии трёх ролей и дизайн всех экранов: публичных страниц, кабинетов клиента и мастера, админки.
- 02
Вёрстка
Сначала статикой на Vite и Tailwind, чтобы прожить интерфейс до бэкенда, потом перенос в Laravel и Vue.
- 03
Бэкенд и кабинеты
Заказы, монеты, оплата, биржа, выплаты, уведомления, поддержка и админка с журналом действий.
- 04
Запуск
Сервер заказчика, HTTPS за прокси, сборка, миграции, почта, которая доходит до людей, и проверка каждого сценария.
1 этап завершен. Дизайн на высоте. Спасибо большое за проделанную работу. Идем дальше!
Жизнь заказа
Семь статусов и ни одного лишнего перехода
Все допустимые переходы собраны в одну матрицу. Любой сценарий, от приёмки до спора, проходит через неё, а каждый переход оставляет запись: кто, когда и из какого статуса. Попробуйте провести заказ сами.
- Новый
- В работе
- Готово, ждёт подтверждения
- На доработке
- Проблема с фото
- Завершён
- Отменён
Заказ создан и ждёт мастера на бирже. Монеты уже списаны.
null → newклиент создал заказ
- ДоработкиТри доработки на заказ. Каждая открывает новую итерацию результата и даёт мастеру новые полчаса.
- АвтоприёмкаЕсли клиент молчит сутки после сдачи, заказ принимается сам и мастер получает деньги. За два часа до этого клиенту приходит напоминание, ровно одно.
- Срок мастераПолчаса на заказ и напоминание за десять минут до конца. Пропустил срок: заказ уходит обратно на биржу, а в рейтинг мастеру ставится одна звезда.
- СпорыПроблему с фото разбирает админ: продолжить работу, попросить перезалить или отменить с возвратом монет.
Монеты
Монета вместо рубля, журнал вместо числа
Одна монета это одно фото. Клиент покупает пакеты, при регистрации получает две пробные, а за каждое фото в заказе списывается монета. Рубли считаются только целыми копейками.
Баланс не голое число, которое можно случайно перетереть: каждое движение пишется в журнал со своим типом и остатком после него, под блокировкой кошелька. Уведомление о платеже защищено трижды: уникальная запись события, уникальная задача на обработку и уникальная строка в журнале. Повтор уведомления второй раз монеты не начислит.
Баланс
2монетыНовый клиент: две пробные монеты уже на счёте.
- +2Пробные монеты
trial_grant
Биржа мастеров
Кто первый нажал, того и заказ
Новые заказы видят все мастера сразу. Двое могут нажать «Взять в работу» в одну секунду, поэтому заказ забирается внутри транзакции с блокировкой строки: один получает заказ, второй вежливый отказ, а не тот же заказ на двоих.

Заказ 10181 фото · новый
Екатеринамастер
Взять в работуЗаказ ваш, срок 30 минутСергеймастер
Взять в работу409: заказ уже взят другим мастеромSELECT … FOR UPDATE на строке заказа: второй запрос ждёт первый, видит, что заказ уже не «новый», и получает 409 «Заказ уже взят другим мастером».


Деньги мастеров
Начислено, собрано в выплату, выплачено
Мастер зарабатывает в момент, когда клиент принял заказ: ставка за фото задаётся в админке. Админ собирает начисленное за период в одну выплату, и мастер получает уведомление, когда деньги ушли.
- 01Начислено
Клиент принял заказ: мастеру начислено по ставке за каждое фото.
- 02Выплата за период
Админ выбирает период и способ: начисления за него собираются в одну выплату и больше ни в какую не попадут.
- 03Выплачено
Когда деньги ушли, выплата получает статус «выплачена», а мастер одно уведомление и запись в истории.


Админка
Платформа целиком на одном экране
Заказы, споры, клиенты, мастера, платежи, выплаты, поддержка и тексты сайта. Регистрация только по приглашениям: ссылка или код из восьми символов, роль и срок жизни, а мастер начинает работать после проверки. Блокировки, проверка мастеров и ручные начисления остаются в журнале действий.

Сводка платформы, выручка за 30 дней и заказы, которые требуют внимания.

Все заказы с фильтрами, поиском и пометками.

Споры по фото: продолжить работу, попросить перезалить или отменить с возвратом монет.

Выплаты мастерам за период: запланирована, в обработке, выплачена.

Платежи клиентов за пакеты монет со статусами провайдера.

Мастера с рейтингом, нагрузкой, доработками и жалобами.

Журнал действий с пользователями: создание, блокировки, проверка мастеров, ручные начисления монет.

Переписка с клиентами и мастерами в одном месте.
Запуск
Один Laravel, два лица и сервер заказчика
Публичные страницы отдаются сервером, чтобы их видели поисковики, а кабинеты работают как приложение на Vue внутри того же Laravel. Один домен, одна сессия, никаких отдельных фронтенда и бэкенда.
- Сервер за прокси.Сервер заказчика отдаёт сайт через nginx перед Apache. Laravel доверяет прокси и строит ссылки только по HTTPS, иначе куки и редиректы ломаются.
- Сборка без Node на сервере.Фронтенд собирается заранее, на сервер уходит готовая сборка, зависимости ставятся без dev-пакетов, кеши конфигурации и маршрутов прогреваются.
- Почта, которая доходит.Тестовое письмо прямо с сервера крупный почтовик отклонил как спам. Разобрались, а не гадали: почта домена жила у другого хостинга, и SPF разрешал отправку только его серверам. Решение: слать уведомления через SMTP того хостинга, тогда SPF проходит без единой правки DNS.
- Каждый сценарий руками браузера.Перед сдачей девятнадцать сценариев прогонялись в браузере: вход, заказ, покупка пакета, удаление пользователей, приглашения, выплаты, поддержка. Плюс 73 автотеста: заказы и монеты, уведомления, контент.
- Уведомления по вкусу.23 типа событий, и каждый сам выбирает, где их получать: в кабинете или на почту. Письмо уходит после коммита транзакции, и упавшая почта не ломает саму операцию.
- Настройки без деплоя.Ставка мастера, лимиты фото, срок автоприёмки, число доработок и напоминания меняются в админке. У каждого начисления остаётся ставка, по которой оно сделано.
Кабинет клиента
Заказ за минуту, результат в кабинете
Клиент видит баланс, заказы и то, что ждёт его решения. Готовый результат можно скачать или вернуть на доработку прямо со страницы заказа.




Что я вынес из проекта
Сервис работает у заказчика. Название и адрес по моему решению не указываю.
- Деньги считаются журналом.Баланс как сумма движений с уникальными ключами переживает и двойные уведомления, и ошибки в коде.
- Правила заказа в одном месте.Матрица переходов отвечает на вопрос «а так можно?» раньше, чем его задаст пользователь.
- Под ключ значит до письма во входящих.Запуск заканчивается не на деплое, а когда уведомления реально доходят до людей.
Давайте знакомиться
Хорошие проекты
начинаются
с разговора.
Нужен технический партнёр, помощь команде или решение для рабочего процесса? Расскажите, что хотите изменить — обсудим, чем я могу помочь.
@work_ilyaЛично мне в Telegram