Jiya Opticals
안경 스튜디오·광학 청구 POS·시력 검사 클리닉·재고 관리 시스템
세 제품, 하나의 언어. Carta(메뉴), Casa(인사 카드), Screen(로비 디스플레이) – 외식·환대업을 위한 조용한 럭셔리
Drei Produkte. Eine Sprache. Carta (Speisekarte), Casa (Begrüßungskarte), Screen (Lobby-Display) — quiet luxury für Gastronomie & Hospitality.
커머스TypeScript · JavaScriptGitHub @NSM1276온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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