مدیر تورنمنت برای بازی eFootball (PS5) با تمرکز بر زبان فارسی و چیدمان RTL. امکانات اصلی شامل: ایجاد و مدیریت گروهها، برنامه بازیها، ثبت نتایج، محاسبه ردهبندی، مدیریت بازیکنها، گزارش/خبر با مدیا، لایک/نظر، و پنل ویرایش/حذف فقط برای مدیر.
Tech: Next.js 15 · Prisma · SQLite (پیشفرض) · TailwindCSS · (اختیاری) shadcn/ui · Persian RTL
- بازیکنها: ساخت/ویرایش/حذف، لیستبندی، جستوجو
- بازیها (Matches): ثبت میزبان/میهمان، هفته، نتیجه، زمان شروع، وضعیت (SCHEDULED/DONE)، ویرایش/حذف (فقط مدیر)
- برنامه بازیها (Fixtures): نمایش گروهبهگروه + تاریخ شمسی + نتیجه
- گروهها (Groups): لیست، برنامه و نتایج هر گروه
- گزارشها (Reports): ایجاد خبر/گزارش با آپلود تصویر/ویدیو، آدرسخوان (slug) فارسی، نمایش لایک/نظر
- احراز هویت سبک: ورود/خروج، نمایش دکمههای مدیریتی فقط برای کاربر واردشده
- زبان فارسی & RTL: فونت/راستچین، قالببندی تاریخ شمسی (
faDateTime) - Server Actions و Route Handlers در Next.js 15
- بهینهسازی رفرش با
dynamic = "force-dynamic"در صفحاتی که داده زنده دارند
web/
├─ src/
│ ├─ app/
│ │ ├─ admin/ # ورودیهای مدیریتی (اختیاری)
│ │ ├─ api/
│ │ │ └─ upload/route.ts # آپلود فایل → برمیگرداند { url }
│ │ ├─ fixtures/page.tsx # برنامه بازیها + تاریخ شمسی
│ │ ├─ groups/page.tsx # جدول گروهها
│ │ ├─ login/page.tsx # ورود
│ │ ├─ logout/page.tsx # خروج
│ │ ├─ matches/
│ │ │ ├─ page.tsx # لیست بازیها
│ │ │ └─ [id]/edit/page.tsx # ویرایش/حذف بازی (مدیر)
│ │ ├─ players/
│ │ │ ├─ page.tsx # لیست بازیکنها (+ دکمه ویرایش برای مدیر)
│ │ │ ├─ new/page.tsx # ساخت بازیکن
│ │ │ └─ [id]/edit/page.tsx # ویرایش/حذف بازیکن
│ │ ├─ reports/
│ │ │ ├─ page.tsx # لیست گزارشها
│ │ │ ├─ new/page.tsx # ساخت گزارش + آپلود مدیا
│ │ │ └─ [slug]/page.tsx # نمایش گزارش + لایک/نظر
│ │ └─ page.tsx # خانه
│ ├─ components/ # NavClient و اجزای UI
│ ├─ lib/
│ │ ├─ auth.ts # کوکی/توکن و کمکمتد requireUser
│ │ ├─ db.ts # Prisma Client
│ │ ├─ date.ts # faDateTime, faDate
│ │ └─ prisma-helpers.ts # پارسرهای عدد/تاریخ (intOrNull, dateOrNull,…)
│ └─ styles/ # Tailwind, globals
├─ prisma/
│ ├─ schema.prisma
│ └─ migrations/ # مهاجرتها
└─ public/
└─ uploads/YYYY-MM-DD/ # فایلهای آپلودشده
فایل کامل:
prisma/schema.prisma
- Player:
id, fullName, dept?, groupId - Group:
id, name, … - Match:
id, groupId, homeId, awayId, week?, kickoffAt?, homeScore?, awayScore?, status(enum) - Report:
id, slug, title, summary?, content?, likesCount, commentsCount, medias[] - Media:
id, reportId, url, type(IMAGE|VIDEO) - Comment:
id, reportId, author?, content, approved - (بهروزرسانی شده) Cascade حذف مدیا/کامنت هنگام حذف گزارش
- Node.js 18+
- pnpm یا npm/yarn
- (پیشفرض) SQLite – قابلتعویض با Postgres/MySQL
git clone https://github.com/setarehHosseinNet/carton-ps5-efootball-cup.git
cd carton-ps5-efootball-cup/web
pnpm installنمونه:
# Prisma
DATABASE_URL="file:./dev.db"
# Auth (نمونه)
AUTH_SECRET="a-very-strong-secret"
# مسیر آپلودها (اختیاری)
UPLOAD_DIR="public/uploads"
MAX_UPLOAD_MB=10pnpm prisma migrate dev --name init
# (اختیاری) اگر اسکریپت seed دارید:
pnpm prisma db seedpnpm dev
# http://localhost:3000pnpm build
pnpm start-
کاربر وارد نشده: فقط مشاهده (بازیکنها، برنامه، گروهها، گزارشها)
-
مدیر (وارد شده): دکمههای «ویرایش/حذف/ایجاد» را میبیند و میتواند:
/players/new,/players/[id]/edit/matches/[id]/edit/reports/new, و حذف/ویرایش گزارشها (در صفحهی گزارش)
-
کنترل دسترسی با هلپرهای
getSessionUser()وrequireUser()(درlib/auth.ts) انجام میشود.
- Route:
POST /api/upload - ورودی:
FormDataبا فیلدfile - خروجی:
{ url: string } - فایلها در
public/uploads/YYYY-MM-DD/ذخیره میشوند. - در ساخت گزارش، ابتدا فایلها آپلود و URLها ذخیره میشوند؛ سپس گزارش با آرایه
mediaUrls[]ایجاد میشود.
نکته: در ویندوز اگر خطاهای مربوط به
pagefile.sysیاDumpStack.log.tmpدیدید، مربوط به Watchpack است و ارتباطی با پروژه ندارد.
| مسیر | دسترسی | توضیح |
|---|---|---|
/ |
عمومی | خانه |
/players |
عمومی | لیست بازیکنها (با دکمه ویرایش برای مدیر) |
/players/new |
مدیر | ساخت بازیکن |
/players/[id]/edit |
مدیر | ویرایش/حذف بازیکن |
/matches |
عمومی | لیست بازیها |
/matches/[id]/edit |
مدیر | ویرایش/حذف بازی |
/fixtures |
عمومی | برنامهی بازیها گروهبهگروه + تاریخ شمسی |
/groups |
عمومی | جدول گروهها |
/reports |
عمومی | لیست گزارشها/اخبار |
/reports/new |
مدیر | ایجاد گزارش + آپلود |
/reports/[slug] |
عمومی | صفحه گزارش (لایک/نظر + مدیا) |
/login, /logout |
عمومی | ورود/خروج |
- صفحات دادهمحور با
export const dynamic = "force-dynamic"تعریف شدهاند تا داده همیشه تازه باشد. - برای مقداردهی ورودیها از
defaultValueاستفاده شده (نهvalue) تا با Server Components سازگار باشد. - در فرمها، به جای state-management، از Server Actions استفاده شده است.
- در TypeScript: فیلدهای نتیجه بازیها
homeScoreوawayScoreهستند (نهgHome/gAway).
- Module not found: './like.client' اگر لایک/کامنت کلاینتی را لازم ندارید، importها را حذف یا کامنت کنید.
- cookies was called outside a request scope
تابعهای Auth را فقط داخل مسیرهای RSC/Route Handler فراخوانی کنید و از
dynamic = "force-dynamic"کمک بگیرید. - خطای Watchpack در ویندوز
پیامهای
EINVAL pagefile.sysبیخطرند و به File Watcher مربوطاند.
- پنل مدیریتی یکپارچه برای همه عملیات
- محاسبه ردهبندی زنده گروهها
- فیلتر/جستوجوی پیشرفته
- چندزبانهسازی (i18n)
- OAuth و نقشهای چندگانه کاربری
MIT – آزاد برای استفاده/توسعه. اگر از پروژه استفاده کردید، یک ⭐️ به مخزن بدهید!
۱) فورک → ۲) برنچ feat/your-feature → ۳) کامیتهای معنیدار → ۴) PR
قوانین کامیت:
feat: ...، fix: ...، chore: ...، docs: ..., refactor: ...
pnpm dev # اجرای توسعه
pnpm build # ساخت تولید
pnpm start # اجرای تولید
pnpm prisma db push
pnpm prisma migrate dev --name <name>
pnpm prisma studioهرجا گیر کردید یا ایدهای داشتید، ایشو باز کنید 😊