尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证replacing shopify
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Bilingual (English / Arabic) health & beauty e-commerce — Next.js 16, Tailwind v4, next-intl, Prisma 7 + PostgreSQL.
npm install # also generates the Prisma client
neon env pull # writes DATABASE_URL (pooled) + DATABASE_URL_UNPOOLED (direct) into .env
npm run db:migrate # apply migrations (uses the direct connection)
npm run db:seed # load categories, brands and products
npm run dev # http://localhost:3000
The database is Neon (project solitary-dawn-16358631, branch production, see neon.ts).
The app uses the pooled DATABASE_URL; Prisma CLI uses DATABASE_URL_UNPOOLED (prisma.config.ts).
After changing .env, restart npm run dev — the Prisma client keeps its connection pool across hot reloads.
Optional offline database: npm run db:start runs a local Prisma Dev Postgres — set DATABASE_URL and
DATABASE_URL_UNPOOLED to the TCP URL it prints. Prisma Studio does not work against it.
| Script | What it does |
|---|---|
npm run db:start / db:stop | Start / stop the local database |
npm run db:migrate | Create & apply a migration after editing prisma/schema.prisma |
npm run db:seed | Reset the catalogue from prisma/seed-data/ |
npm run db:studio | Browse the database in Prisma Studio (http://localhost:5555) |
npm run images:products | Product photos in design/products/<slug>.jpg → square packshots |
npm run images | Homepage banners in design/raw/<SLOT>.jpg → web images (see docs/homepage-image-plan.md) |
src/server/auth.ts, routes under /api/auth/*), users stored in Neon.npm run user:role -- [email protected] admin
(staff = can open /admin; admin = staff + manages staff). They must sign in again.SMTP_HOST empty, every email (verification, password reset) is saved as an HTML file in
.mail-outbox/ — open it in a browser and click the link. Fill SMTP_* + MAIL_FROM in .env to send for real.GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET are set..env or prisma/schema.prisma, restart npm run dev (the DB client is cached across hot reloads)./en/admin (staff and admins only — everyone else gets 404). Admins open every section; staff open only
the sections an admin ticked for them on Staff (src/lib/admin-sections.ts). Every admin page, server
action and admin API checks the section on the server.
slug).
AI assistant (src/server/ai/product-copy.ts): suggests category (matched to Google Merchant
categories, can create new ones), web address, EN/AR titles and descriptions; staff accept row by row.
Uses the free Gemini tier when GEMINI_API_KEY is set (aistudio.google.com), otherwise Claude via
ANTHROPIC_API_KEY. Changing a product's web address keeps the old one working (permanent redirect)./feeds/google/en.xml and /feeds/google/ar.xml for Google
Merchant Center; lists what to fix per product. Set SITE_URL to the live address in production.AuditLog.Demo orders for testing: npm run db:demo-orders (remove with npm run db:demo-orders -- --clear).
Uploaded photos (products and homepage banners) are stored on Cloudinary when CLOUDINARY_URL is set,
which is required on Vercel. Without it, local development saves them to public/uploads/, and on Vercel the
upload is refused with a clear message. To move earlier local uploads to Cloudinary and update the database:
npm run uploads:migrate (dry run), then npm run uploads:migrate -- --apply.
src/lib/store-settings.ts: VAT 5% (prices include it), standard delivery AED 15 (free
from AED 100), express +AED 20 on top (Dubai only), cash on delivery up to AED 2,000 and never for
Subscribe & save. Totals are always recalculated on the server (src/server/checkout/quote.ts).STRIPE_SECRET_KEY, NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY): card orders are reserved as
PENDING_PAYMENT, then confirmed when payment succeeds — by the webhook (/api/stripe/webhook, needs
STRIPE_WEBHOOK_SECRET) and also by the return page, so it works locally without the webhook.
Test cards: 4242 4242 4242 4242 (succeeds), 4000 0000 0000 0002 (declined), any future date / CVC./account/subscriptions lets customers skip, change
frequency, pause or cancel. Renewals run via POST /api/cron/subscriptions (Bearer CRON_SECRET) —
locally npm run subscriptions:renew; in production schedule it daily.prisma/ — schema, migrations, seed datasrc/server/ — database access (server-only)src/lib/catalog-types.ts — product/category shapes shared by server and clientsrc/app/[locale]/ — pages (/en/…, /ar/…)