Soukbase
Sell datasets, prompt sets, templates and reports. Agents pay in USDC, straight to the seller's wallet. Soukbase never holds the money.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證oriz.at
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Premium SaaS — заменяет бумажное меню и сайт ресторана. Тихая роскошь, живые данные, мгновенные обновления. Production: https://oriz.at Supabase project: btydsogglgrtldfiezfu (Frankfurt, eu-central-1) Vercel: авто-деплой из ветки main • Тип: email + пароль (Supabase Auth) • Super Admin: [email protected] — видит все venues и редактирует их через SuperAdminView • Обычный владелец: видит только свой venue • Redirect: /admin → /admin/login если не залогинен (server-side getUser()) Полностью вымышленный ресторан, доступен всем без логина по адресу /demo.檢視完整 README ↗
Premium SaaS — заменяет бумажное меню и сайт ресторана. Тихая роскошь, живые данные, мгновенные обновления.
Production: https://oriz.at
Supabase project: btydsogglgrtldfiezfu (Frankfurt, eu-central-1)
Vercel: авто-деплой из ветки main
| Слой | Технология |
|---|---|
| Frontend | Next.js 16 App Router · TypeScript strict · Tailwind v4 |
| Backend | Supabase — Postgres + Auth + Realtime + Storage |
| Хостинг | Vercel (Frankfurt edge) |
| DNS | IONOS → oriz.at |
.env.local)NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY= # только на сервере — для demo и admin-reset
| URL | Что это |
|---|---|
/ | Лендинг (маркетинг) |
/[venueSlug] | Гостевое меню (RSC + Realtime) |
/[venueSlug]/print | Печатная версия / PDF |
/admin | Владелец — управление меню |
/admin/login | Вход (email + пароль) |
/demo | Публичная демо-админка (без логина) |
/api/demo/update | PATCH — изменить поле блюда в демо |
/api/demo/reset | POST/GET — сбросить демо к оригиналу |
/api/caption | POST — AI-генерация Story через Claude |
/api/bot/hook | Telegram bot webhook |
[email protected] — видит все venues и редактирует их через SuperAdminView/admin → /admin/login если не залогинен (server-side getUser())Полностью вымышленный ресторан, доступен всем без логина по адресу /demo.
Venue ID: 9019d1cf-f1af-482f-9673-2a78846fa405
Venue slug: belvedere
Гостевое меню: oriz.at/belvedere
| Секция | section_id |
|---|---|
| Antipasti | 7db0d81e-e139-4586-8e57-599dd85bb948 |
| Zuppe & Insalate | 3e118b21-eddd-4ee2-8575-9a5ced5e60ea |
| Pasta & Risotto | 2db00df6-15f7-4a61-9b51-c2584439a70b |
| Secondi Piatti | 784b8549-e6ff-40ec-915b-157ed82d8a93 |
| Contorni | 7c521dce-3756-46c5-9ade-2dc9b3b58e5f |
| Dolci | 972fe15e-66ea-4809-b298-6490e1f0c498 |
color_bg: #1C1208 (тёмный эспрессо)
color_primary: #C8963E (итальянское золото)
price_cents)is_active) → «Verfügbar» / «Ausverkauft»ai_caption) — через модалallergens)vercel.json → cron 0 3 * * * (каждую ночь в 3:00) вызывает /api/demo/reset.
Эндпоинт делает upsert всех 33 блюд по ID, восстанавливая оригинальные значения включая ai_caption: null и allergens: null.
Важно: в RESET_DATA обязательно должны присутствовать section_id и venue_id — иначе upsert падает с NOT NULL constraint.
/api/demo/update)price_cents, is_active, description, ai_caption, allergensvenue_id = DEMO_VENUE_ID — нельзя изменить блюда из других venue/admin)Компонент ItemEditor (src/components/admin/ItemEditor.tsx):
| Поле | Как работает |
|---|---|
| Цена | Текстовый input, blur → supabase.update, optimistic UI |
| Статус | Кнопка «Verfügbar» / «Ausverkauft», optimistic toggle |
| Фото | Upload в Supabase Storage item-images, сохраняется image_url |
| Story | Модал с textarea (280 символов) + AI-кнопка → /api/caption |
| Аллергены | Inline input, blur → сохранение |
Компонент QRCodeBlock генерирует QR через api.qrserver.com, ссылка ведёт на oriz.at/{slug}.
/[venueSlug]/print — чистая страница для PDF. Скрытые блюда (is_active=false) не отображаются.
/api/caption)itemId → берёт из DB name + descriptionitems.ai_captionai_credits_used / ai_credits_reset в таблице venues, лимит зависит от плана (src/lib/plans.ts)src/lib/plans.ts)| Plan | AI лимит/месяц |
|---|---|
| trial | 5 |
| starter | 20 |
| pro | 100 |
Гостевое меню подписывается на канал venue:{venueId}:items через Supabase Realtime.
Фильтр: venue_id=eq.{venueId}. При UPDATE/INSERT/DELETE — мгновенное обновление без перезагрузки.
Требует: ALTER TABLE items REPLICA IDENTITY FULL (миграция 0002_realtime.sql).
// src/app/page.tsx
const DEMO_VENUES = [
{ slug: "belvedere", isAdmin: false, cta: "Menü öffnen" }, // → /belvedere
{ slug: "demo", isAdmin: true, cta: "Ausprobieren" }, // → /demo
]
Email [email protected] → видит SuperAdminView с таблицей всех venues.
Можно редактировать: название, slug, about, цвета (color_bg, color_primary), logo_url, план, Instagram, Google Maps.
npm install
npm run dev # http://localhost:3000
Суперадмин входит через /admin/login с email + паролем.
Применяются вручную в Supabase SQL Editor:
| Файл | Что делает |
|---|---|
0001_schema.sql | Основные таблицы: venues, sections, items + RLS |
0002_realtime.sql | Realtime publication + replica identity |
0003_... и выше | Добавочные колонки, смотри файлы |
src/
app/
page.tsx — Лендинг
[venueSlug]/page.tsx — Гостевое меню
[venueSlug]/print/page.tsx — Печать/PDF
admin/page.tsx — Реальная админка
demo/page.tsx — Публичная демо-админка
api/
caption/route.ts — AI Story-генерация
demo/update/route.ts — Изменение данных в демо
demo/reset/route.ts — Сброс демо (cron)
components/
admin/
ItemEditor.tsx — Основной редактор блюда
QRCodeBlock.tsx — QR-код блок
SectionNav.tsx — Стики-навигация по секциям (prop topOffset для демо)
SuperAdminView.tsx — Super admin таблица venue
demo/
DemoItemEditor.tsx — Редактор блюда для демо (без фото и AI)
landing/
HeroAtmosphere.tsx — Hero с фото-слайдшоу и cycling-словами
lib/
supabase/
client.ts — Browser client
server.ts — RSC server client (cookies)
types.ts — DB types
plans.ts — AI лимиты по планам
imageUpload.ts — Upload в Supabase Storage