尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
وبسایت مدیلینک — ارائهدهندهی سیستمهای هوش مصنوعی و اتوماسیون برای کلینیکها و مراکز پزشکی. سایتی چندصفحهای فارسی/RTL که محصولات را معرفی میکند و مدیران کلینیک را به «درخواست دمو» هدایت میکند. ساختار صفحات بر اساس Medilink-Website-Brief.docx (نسخه ۱٫۰) پیاده شده است. ۲. یک پروژه Supabase بسازید و فایل محیطی را از نمونه کپی کنید: سپس مقادیر را از مسیر Supabase › Project Settings › API Keys پر کنید:查看完整 README ↗
وبسایت مدیلینک — ارائهدهندهی سیستمهای هوش مصنوعی و اتوماسیون برای کلینیکها و مراکز پزشکی. سایتی چندصفحهای فارسی/RTL که محصولات را معرفی میکند و مدیران کلینیک را به «درخواست دمو» هدایت میکند.
ساختار صفحات بر اساس Medilink-Website-Brief.docx (نسخه ۱٫۰) پیاده شده است.
| لایه | فناوری |
|---|---|
| فریمورک | Next.js 16 (App Router) + React 19 |
| استایل | Tailwind CSS v4 |
| دیتابیس | Supabase (Postgres + RLS) |
| اعتبارسنجی | Zod |
| فونت | Shabnam از طریق next/font/local (self-hosted، لایسنس OFL) |
۱. نصب پکیجها:
npm install
۲. یک پروژه Supabase بسازید و فایل محیطی را از نمونه کپی کنید:
cp .env.example .env.local
سپس مقادیر را از Supabaseِ پروژهی اپ (Project Settings › API Keys) پر کنید:
NEXT_PUBLIC_SITE_URL — دامنه سایت، برای تگهای canonical و Open Graph (اختیاری؛ پیشفرض https://medilinkapp.online).
NEXT_PUBLIC_PANEL_URL — آدرس پنل کلینیک (اختیاری؛ پیشفرض https://app.medilinkapp.online).
APP_SUPABASE_URL، APP_SUPABASE_PUBLISHABLE_KEY (کلید publishable، sb_publishable_…)، APP_SUPABASE_SERVICE_ROLE_KEY (کلید secret) — فقط سمت سرور. هرگز پیشوند NEXT_PUBLIC_ نگیرند و در گیت کامیت نشوند.
ZARINPAL_MERCHANT_ID، ZARINPAL_SANDBOX — درگاه پرداخت.
NEXT_PUBLIC_WHATSAPP_NUMBER — شمارهی دکمهی شناور واتساپ، فرمت بینالمللی بدون + (اختیاری).
۳. مایگریشنهای دیتابیس را اجرا کنید. فایلهای supabase/migrations/ را به ترتیب در SQL Editor داشبورد Supabase اجرا کنید، یا با CLI:
supabase db push
۴. سرور توسعه:
npm run dev
سایت روی http://localhost:3000 بالا میآید.
npm run dev # سرور توسعه
npm run build # بیلد پروداکشن
npm run start # اجرای بیلد پروداکشن
npm run lint # ESLint
npm run typecheck # بررسی تایپها با tsc
| مسیر | صفحه |
|---|---|
/ | خانه |
/products | فهرست محصولات |
/products/[slug] | صفحهی اختصاصی هر محصول (۵ محصول) |
/pricing | تعرفهها و پلنها |
/about | دربارهی ما |
/clients | نمونهکارها و مشتریان |
/blog و /blog/[slug] | بلاگ و منابع |
/faq | سوالات متداول |
/contact | تماس و درخواست دمو |
/privacy و /terms | صفحات حقوقی |
sitemap.xml و robots.txt بهصورت پویا از همین دادهها ساخته میشوند.
app/
actions/
leads.ts # Server Action فرم دمو (اعتبارسنجی Zod + درج در دیتابیس)
newsletter.ts # Server Action عضویت خبرنامه
checkout.ts # ثبت سفارش و انتقال به زرینپال
checkout/ # فرم خرید، تأیید پرداخت، صفحات نتیجه
components/ # کامپوننتهای مشترک و سکشنهای صفحات
lib/
site.ts # اطلاعات تماس، منوی ناوبری، آدرس سایت
products.ts # دادهی ۵ محصول (منبع مشترک صفحات و sitemap)
packages.ts # بستهها و قیمتهای قابل خرید (منبع واقعی قیمت)
pricing.ts # سوالات مالی صفحهی تعرفه
blog.ts # خواندن مقالات منتشرشده از دیتابیس اپ
zarinpal.ts # کلاینت درگاه زرینپال
faq.ts # سوالات متداول
clinic-types.ts # فهرست انواع کلینیک برای فرم دمو
legacy-admin-redirect.ts # نگاشتِ مسیرهای قدیمیِ /admin/** به پنلِ ادمین اپ (فقط Redirect؛ از proxy.ts)
lib/app-db/ # دیتابیس اپ (سفارش، بلاگ، لید، خبرنامه)
server.ts # کلاینت عمومی (publishable) و service_role — بدونِ نشستِ کاربر
layout.tsx # هدر، فوتر و دکمهی واتساپ مشترک همهی صفحات
sitemap.ts, robots.ts # سئو
تصاویر محصول هنوز ماکاپ برداریاند؛ اسکرینشات واقعی را در
public/images/products/بگذارید.
anon جز خواندن مقالات منتشرشده به هیچچیز دسترسی ندارد؛ خواندن لید، سفارش و خبرنامه فقط برای ادمین پلتفرم است.service_role انجام میشود که RLS را دور میزند. فایلهای app/lib/app-db/ با server-only علامتگذاری شدهاند تا اگر تصادفاً از یک کامپوننت کلاینتی import شود، بیلد خطا بدهد.سایت دیتابیس جداگانه ندارد و فقط به دیتابیس اپ وصل است: سفارشها، بلاگ، لیدهای فرم دمو، خبرنامه و حساب ادمینها. اسکیما در ریپوی medilink-app است (supabase/migrations/0022، 0023، 0024). پرداخت «اتوماسیون مطب» مستقیم به اشتراک همان کلینیک وصل میشود و یک حساب ادمین هر دو پنل را باز میکند.
بستهها و قیمتها در app/lib/packages.ts تعریف شدهاند — منبع واقعی قیمت است. /checkout سفارش را در جدول orders دیتابیس اپ ثبت میکند.
تا وقتی ZARINPAL_MERCHANT_ID ست نشده (وضعیتِ فعلی، چون مرچنتِ زرینپال هنوز تأیید نشده): خریدار به هیچ درگاهی فرستاده نمیشود — سفارش با وضعیتِ pending ثبت میشود («ثبتِ سفارش») و تیم برای هماهنگیِ پرداخت (کارتبهکارت/فاکتور) تماس میگیرد؛ ادمین از پنلِ اپ (/admin/payments) آن را دستی «پرداخت شد» میکند و به کلینیک وصل میکند. هیچ اشتراکی خودکار تمدید نمیشود.
با ستشدنِ ZARINPAL_MERCHANT_ID: خریدار به زرینپال فرستاده میشود؛ /checkout/verify پرداخت را تأیید میکند (Idempotent — Callback دوباره خطرناک نیست). آدرس بازگشت از درگاه از خود درخواست ساخته میشود، پس روی هر دامنهای درست کار میکند. زرینپال شارژ خودکار دورهای ندارد؛ هر دورهی ماهانه جدا پرداخت میشود و ادمین از پنل اپ اشتراک را تمدید میکند.
فعالسازیِ نهاییِ Production (بعد از تأییدِ مرچنت):
ZARINPAL_MERCHANT_ID=<merchant id واقعی>
ZARINPAL_SANDBOX=false
برای تستِ Sandbox (بدون تراکنشِ واقعی، پیش از تأیید یا برای QA):
ZARINPAL_MERCHANT_ID=<merchant id سازگار با sandbox>
ZARINPAL_SANDBOX=true
دکمههای «۱۴ روز رایگان» به /signup پنل (NEXT_PUBLIC_PANEL_URL) میروند. خود دوره در دیتابیس اپ ساخته و اعمال میشود (تریگر start_clinic_trial).
این ریپو دیگر رابطِ ادمین ندارد. سفارشها، بلاگ (نوشتن، ویرایش، انتشار، تصویر شاخص)، درخواستهای دمو و خبرنامه همه در Admin Hub اپ مدیریت میشوند: https://app.medilinkapp.online/admin (با حساب ادمین پلتفرم در دیتابیس اپ). لینکِ «ورود مدیریت» در فوتر سایت مستقیم به همانجا میرود.
آدرسهای قدیمیِ /admin/** در سایت فقط Redirect هستند (proxy.ts + app/lib/legacy-admin-redirect.ts): GET/HEAD به مسیرِ معادل در پنل اپ میرود (/admin/orders ← /admin/payments، /admin/blog ← /admin/site/blog، /admin/leads ← /admin/site/leads، /admin/newsletter ← /admin/site/newsletter، بقیه ← /admin) و هر درخواستِ غیر GET/HEAD با 405 رد میشود. سایت هیچ احرازِ هویتِ ادمینی انجام نمیدهد.
مقالههایی که از پنلِ اپ منتشر میشوند، چون اپ نمیتواند Cache سایت را مستقیم باطل کند، با تأخیر روی سایت دیده میشوند: صفحههای /blog تا حدود ۵ دقیقه (revalidate = 300) و sitemap.xml تا حدود ۱ ساعت.
ساختِ حسابِ ادمین (دیتابیس اپ):
insert into public.platform_admins (user_id) select id from auth.users where email = 'ایمیل@ادمین';روی Vercel: متغیرهای محیطی بالا (دیتابیس اپ + زرینپال) را در تنظیمات پروژه ثبت کنید. دامنه: medilinkapp.online (سایت) و app.medilinkapp.online (پنل).