尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Online stall booking for events. Vendors log in, pick an event date, click stalls on the floor plan (like picking cinema seats), and pay by bank transfer. Admins create events, grey out stalls, confirm payments, manage vendors and send WhatsApp announcements.
Stack: Next.js 14 (App Router) on Vercel · Supabase (Postgres, Auth, Storage). This uses its own Supabase project, separate from any other app.
supabase/migrations/001_init.sql: tables, storage bucket, booking functionssupabase/migrations/002_seed_layout.sql: the master floor plan (34 stalls)supabase/migrations/003_lockdown.sql: turns on RLS and blocks the public key from tables/functions (required)supabase/migrations/004_event_date_range.sql: events get a start and end datesupabase/migrations/005_vendor_details.sql: vendor ID codes, vendor types, offerings, address, websitesupabase/migrations/006_social_links.sql: any number of social media links per vendorsupabase/migrations/007_documents.sql: invoices & receipts (company details pre-filled)supabase/migrations/008_site_social_links.sql: the market's social media links for the website footerhttps://<your-app>.vercel.app/** to Redirect URLs.Import the burbur1 repo in Vercel.
Add the environment variables from .env.example:
| Variable | Where to find it |
|---|---|
SUPABASE_URL / NEXT_PUBLIC_SUPABASE_URL | Supabase → Project Settings → Data API → Project URL |
SUPABASE_SERVICE_ROLE_KEY | Project Settings → API Keys → Secret key (sb_secret_…). Server only, never NEXT_PUBLIC_. (Legacy service_role also works.) |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Same page, Publishable key (sb_publishable_…). Used only for login. |
NEXT_PUBLIC_SITE_URL | Your Vercel URL, used in WhatsApp links |
Sign up on the site with your email, confirm it, then run in the SQL editor:
insert into admins (auth_user_id, name)
select id, 'Your Name' from auth.users where email = '[email protected]';
Log out and in again; an Admin link appears in the header.
Admin → Settings: bank name, account name/number, and how many hours unpaid holds last (default 48).
cp .env.example .env.local # fill in values
npm install
npm run dev
/): open events dated today or later./events/YYMMDD): click available stalls to add them to the cart. Works across several dates./cart) → Book: all stalls are held at once, or none if any were just taken (those are removed from the cart with a message)./bookings/:id): bank details + upload transfer receipt.Unpaid holds are released automatically after the hold time. Once a receipt is uploaded, the hold stays until an admin confirms or cancels.
YYMMDD of the start date; the end date can be changed later. Vendors can book until the end date passes. All layout stalls are copied in with a default price and power. New events start as Draft (hidden from vendors).<prefix>-<5 digits> (prefix & next number set on the event page); receipt = invoice number + R. Company details in Settings.V0001, editable), type (Products / Services / Activities, managed in Settings), offerings, contact person, phone (WhatsApp), email, address, website, social media links (as many as they have; platform recognised automatically), internal notes, booking history. Filter by type and search everything. Vendors you add without a login are linked automatically when they sign up with the same email.{name} {event} {date} {link} placeholders, and tap Send per vendor. This opens WhatsApp with the message ready, using your existing WhatsApp Business app (free). Sends are logged so you can see who hasn't been told yet.available ──checkout──▶ held ──admin confirms──▶ booked
▲ │
└──expired/cancelled──┘
blocked = greyed out for this event
create_booking() (SQL) locks the requested stall rows, re-checks them, and holds them in one transaction. Two vendors clicking the same stall at the same time: one wins, the other gets a "just taken" message.
Stall positions live in layout_stalls (pixel coordinates on an 830×1050 canvas, traced from the original layout image). Edit rows there to add/move stalls; new events pick up the change. Existing events keep their stall list.
/api/admin/notify for an API call).