1. Обзор и архитектура
Что такое витрина
Витрина — публичный сайт бизнеса: интернет-магазин, запись на услуги или и то, и другое. У каждого бизнеса своя витрина на:
- поддомене платформы —
{shop}.irisaicrm.shop, или - собственном домене —
www.example.com.
Витрина обслуживает покупателя: показать товары/услуги → собрать заказ или запись → принять оплату → показать статус. Управление бизнесом (каталог, заказы, персонал, оплата, доставка) — в панели (app.irisaicrm.shop), это не часть витрины.
Три роли — и что каждая держит
| Роль | Что это | Что держит |
|---|---|---|
| Ядро (платформа) | API + бизнес-логика + БД | данные, корзина/состояние, подсчёт сумм, остатки, заказы, записи, оплата, доступность слотов |
| Рантайм витрины | сайт, который видит покупатель | рендер темы, проксирование к ядру с ключом, сессия покупателя |
| Тема | бандл шаблонов + CSS + JS | только внешний вид витринных экранов |
Ключевой инвариант: тема управляет ВИДОМ, платформа — ДАННЫМИ и ДЕНЬГАМИ. Тема не считает цены, не трогает оплату, не выполняет серверный код.
Почему так: темы пишут ИИ и сообщество
Раз авторы тем недоверенные, тема обязана быть песочницей:
- Тема — это шаблоны на Liquid (+ CSS + JS), а не .NET/Razor-код. Liquid не может выполнить произвольный код, обратиться к файлам или БД.
- Один рантайм витрины исполняет любую тему на фиксированной объектной модели (см. 03-object-model).
- Тема = данные (бандл ассетов), загружаемые в рантайм, а не отдельное приложение.
Это модель Shopify (Liquid + один рантайм + платформенный checkout), выбранная сознательно: только так можно безопасно пустить чужой код в рендер и иметь тысячи тем без дублирования логики.
Исключение: несколько флагманских тем, которые пишем МЫ (доверенные), или headless-партнёры могут быть отдельными .NET-проектами — но это не путь для массовых тем.
Градиент владения: вид vs данные
Чем ближе к деньгам — тем меньше свободы у темы.
| Экран | Разметка (ВИД) | Состояние / логика / подсчёты (ДАННЫЕ) |
|---|---|---|
| Главная / каталог / товар / услуга | тема | платформа (read) |
| Корзина (страница / drawer) | тема | платформа (позиции, кол-во, итоги, остатки) |
| Выбор слота / мастера (запись) | тема | платформа (доступность, удержание слота) |
| Checkout (контакт → оплата → подтверждение) | платформа (токены + блоки темы) | платформа |
| Статус заказа / записи, аккаунт | платформа (токены темы) | платформа |
Правило: markup может быть темы почти везде; но вычисления денег/остатков/доступности и оплата — всегда платформа. Тема их отображает, а не считает.
Как это собрано технически
Покупатель (браузер)
│ только к своей витрине, без ключей платформы
▼
Рантайм витрины ──► рендер выбранной ТЕМЫ (Liquid) на данных из ядра
│ server-side, приватный X-Api-Key
▼
Ядро платформы (API) ──► каталог · корзина · заказы · запись · оплата · доступность
│
▼
Postgres · Redis (корзина) · RabbitMQ (уведомления)
- SSR (server-side rendering): рантайм рендерит HTML на сервере → SEO и скорость. Динамика (add-to-cart, выбор варианта/слота) — небольшой JS, дергающий API рантайма.
- Браузер никогда не ходит в ядро напрямую и не видит приватный ключ. Рантайм — это BFF (backend-for-frontend): добавляет ключ и ходит в ядро. Подробнее — api-security.
- Тенант (какой это магазин) рантайм знает из своего конфига или из Host. Теме это не важно — она работает с объектом
shop.
Что дальше
- Как устроен путь покупателя и кто владеет каждым шагом — 02. Флоу.
- Какие объекты видит тема — 03. Объектная модель.