From 7e655356e570bef2d1a667b15c3a4a176c34f9f2 Mon Sep 17 00:00:00 2001
From: hamed <15238-genius.ha@users.noreply.drupalcode.org>
Date: Tue, 11 Nov 2025 09:43:57 +0330
Subject: [PATCH] docs: update README with project overview, features, and
setup instructions
---
README.md | 988 ++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 889 insertions(+), 99 deletions(-)
diff --git a/README.md b/README.md
index 22496e2..a574adb 100644
--- a/README.md
+++ b/README.md
@@ -1,104 +1,894 @@
-# نوبت 724 (Nobat724)
+# 🏥 نوبت724 (Nobat724) - سیستم نوبتدهی آنلاین پزشکی
-**نوبت 724** is an appointment booking platform built using **Next.js** and **React**. This project is designed to facilitate appointment scheduling—especially for clinics and healthcare providers—with support for Persian calendar, maps, responsive UI components, and beautiful animations.
+## 📋 فهرست مطالب
-## 🚀 Tech Stack
-
-- **Framework:** Next.js
-- **Language:** JavaScript / React
-- **UI Libraries:** MUI (Material-UI), Styled-Components, Emotion
-- **Date Handling:** Day.js, Date-fns, Jalali-Moment
-- **Calendar:** Jalaali React Date Picker
-- **Maps:** MapTiler SDK, Google Map Picker
-- **Forms & Uploads:** React Toastify, React Images Uploading
-- **Animations:** AOS (Animate on Scroll)
-- **Charts & Pickers:** @mui/x-charts, @mui/x-date-pickers
-- **Styling:** Tailwind CSS, Emotion, Styled-Components
-- **RTL Support:** Stylis Plugin RTL
-
-## 📦 Installation
-
-```bash
-# Clone the repo
-git clone https://github.com/your-username/nobat724.git
-cd nobat724
-
-# Install dependencies
-npm install
-```
-
-## 🛠 Available Scripts
-
-```bash
-npm run dev
-```
-
-Runs the app in development mode. Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
-
-```bash
-npm run build
-```
-
-Builds the app for production.
-
-```bash
-npm start
-```
-
-Starts the production server after building.
-
-```bash
-npm run lint
-```
-
-Checks the code for linting issues.
-
-## ⚙️ Environment Variables
-
-Create a `.env.local` file in the root directory with the following variables:
-
-```
-NEXT_PUBLIC_API_URL=https://back-dev.clinic-pro.ir
-NEXT_PUBLIC_CLIENT_ID=NWuujdYHjtAtrhrk_zoWB3w0kyf56wRCOaY36MIqvbs
-NEXT_PUBLIC_CLIENT_SECRET=trhrk_zoWB3w0kyf
-NODE_ENV=development # or production
-```
-
-**Note:** In Next.js, environment variables that need to be accessible in the browser must be prefixed with `NEXT_PUBLIC_`. Variables without this prefix are only available on the server side.
-
-## 🌐 Features
-
-- ✅ Responsive design using MUI and Tailwind
-- 🗕 Persian (Jalali) date picker
-- 🟠 Map location picker with MapTiler and Google Maps
-- 🔒 Cookie management with `universal-cookie`
-- 📸 Image uploading support
-- 🌙 Dark mode support using `next-themes`
-- 🌍 Right-to-left (RTL) support for Persian language
-
-## 📁 Project Structure
-
-```
-nobat724/
-├── pages/ # Next.js pages
-├── components/ # React components
-├── styles/ # Global styles and Tailwind config
-├── public/ # Static assets
-├── utils/ # Utility functions
-└── ...
-```
-
-## 🗕 Roadmap
-
-- [ ] Multi-language support
-- [ ] Admin panel for managing appointments
-- [ ] Role-based access
-- [ ] Notifications and reminders
-
-## 📜 License
-
-This project is private or under your preferred license.
+- [معرفی پروژه](#معرفی-پروژه)
+- [معماری و تکنولوژی](#معماری-و-تکنولوژی)
+- [ساختار پروژه](#ساختار-پروژه)
+- [ویژگیهای کلیدی](#ویژگیهای-کلیدی)
+- [راهاندازی پروژه](#راهاندازی-پروژه)
+- [سیستم Multi-Domain](#سیستم-multi-domain)
+- [احراز هویت و مجوزها](#احراز-هویت-و-مجوزها)
+- [مسیرها و صفحات](#مسیرها-و-صفحات)
+- [کامپوننتهای اصلی](#کامپوننتهای-اصلی)
+- [API و سرویسها](#api-و-سرویسها)
+- [Deployment](#deployment)
---
-> Developed with ❤️ by the Nobat724 team.
+## 🎯 معرفی پروژه
+
+**نوبت724** یک پلتفرم جامع و پیشرفته برای نوبتدهی آنلاین پزشکی است که امکان رزرو نوبت از پزشکان و کلینیکها را به صورت آنلاین فراهم میکند.
+
+### ویژگیهای اصلی:
+
+- ✅ **Multi-Domain Architecture**: پشتیبانی از دامنههای مختلف برای شهرهای مختلف
+- ✅ **رزرو نوبت آنلاین**: سیستم کامل رزرو نوبت با تقویم شمسی
+- ✅ **پنل مدیریتی**: پنل کامل برای نمایندگان و پزشکان
+- ✅ **احراز هویت**: سیستم ورود و احراز هویت با OTP
+- ✅ **پرداخت آنلاین**: سیستم پرداخت یکپارچه
+- ✅ **Responsive Design**: طراحی کاملاً واکنشگرا با Tailwind CSS
+- ✅ **Dark Mode**: پشتیبانی کامل از حالت تاریک
+- ✅ **SEO Optimized**: بهینهسازی کامل SEO با متادیتای داینامیک
+
+---
+
+## 🏗️ معماری و تکنولوژی
+
+### Frontend Framework
+
+- **Next.js 14.2.20** (App Router)
+- **React 18**
+- **Server Components** و **Client Components**
+
+### UI/UX
+
+- **Material-UI (MUI) v7**: کامپوننتهای UI
+- **Tailwind CSS 3.4**: استایلدهی
+- **Emotion**: CSS-in-JS
+- **Dark Mode**: با `next-themes`
+- **Responsive Design**: Mobile-first approach
+
+### State Management & Data Fetching
+
+- **React Context API**: مدیریت state سراسری
+- **Axios**: درخواستهای HTTP
+- **Server-Side Rendering (SSR)**
+
+### Authentication & Authorization
+
+- **CASL**: مدیریت دسترسیها
+- **JWT Tokens**: احراز هویت
+- **Cookie-based Auth**: ذخیره توکنها
+
+### کتابخانههای تخصصی
+
+- **jalali-moment & moment-jalaali**: تبدیل تاریخ شمسی
+- **jalaali-react-date-picker**: Date Picker فارسی
+- **react-toastify**: نوتیفیکیشنها
+- **html2canvas & jspdf**: تولید PDF
+- **qrcode.react**: تولید QR Code
+- **@maptiler/sdk**: نمایش نقشه
+
+### Development Tools
+
+- **Docker & Docker Compose**: Containerization
+- **ESLint**: Code Quality
+- **Prettier**: Code Formatting
+
+---
+
+## 📁 ساختار پروژه
+
+```
+nobat724_front/
+├── app/ # Next.js App Directory
+│ ├── layout.js # Root Layout با Metadata داینامیک
+│ ├── page.js # صفحه اصلی
+│ ├── globals.css # استایلهای سراسری
+│ ├── about-us/ # درباره ما
+│ ├── appointment/[doctorId]/ # صفحه رزرو نوبت (Dynamic Route)
+│ ├── blog/[slug]/ # صفحه جزئیات بلاگ
+│ ├── blogs/ # لیست بلاگها
+│ ├── clinic/[slug]/ # صفحه جزئیات کلینیک
+│ ├── clinics/ # لیست کلینیکها
+│ ├── contact-us/ # تماس با ما
+│ ├── dashboard/ # داشبورد عمومی
+│ ├── doctor/[slug]/ # صفحه جزئیات پزشک
+│ ├── doctors/ # لیست پزشکان
+│ ├── login/ # ورود
+│ ├── login-verify/ # تایید OTP
+│ ├── panel/(layout)/ # پنل مدیریتی (Route Group)
+│ │ ├── dashboard/ # داشبورد پنل
+│ │ ├── user-account/ # حساب کاربری
+│ │ ├── add-doctor/ # افزودن پزشک
+│ │ └── turns/ # مدیریت نوبتها
+│ ├── specialties/ # تخصصهای پزشکی
+│ └── component/ # کامپوننتهای مشترک App
+│
+├── components/ # کامپوننتهای اصلی
+│ ├── home/ # کامپوننتهای صفحه اصلی
+│ ├── appointment/ # کامپوننتهای رزرو نوبت
+│ ├── doctor/ # کامپوننتهای پزشک
+│ ├── doctors/ # کامپوننتهای لیست پزشکان
+│ ├── clinic/ # کامپوننتهای کلینیک
+│ ├── clinics/ # کامپوننتهای لیست کلینیکها
+│ ├── panel/ # کامپوننتهای پنل
+│ ├── layout/ # Layout کامپوننتها
+│ ├── layoutPanel/ # Layout پنل
+│ ├── register/ # ثبتنام و ورود
+│ └── icons/ # آیکونهای سفارشی
+│
+├── lib/ # کتابخانهها و Utilities
+│ ├── ability.js # تعریف دسترسیها (CASL)
+│ ├── auth.js # احراز هویت
+│ ├── getStateInfo.js # دریافت اطلاعات استان/شهر (Server)
+│ ├── getStateInfoClient.js # دریافت اطلاعات استان/شهر (Client)
+│ ├── getCanonicalUrl.js # تولید Canonical URL
+│ └── req.js # Helper برای Fetch
+│
+├── services/ # سرویسهای API
+│ ├── api.js # تنظیمات Axios
+│ ├── response.js # API Endpoints
+│ └── clinicApi.js # APIهای مربوط به کلینیک
+│
+├── context/ # React Context
+│ └── ProvinceProvider.js # Context استان/شهر
+│
+├── data/ # فایلهای JSON استاتیک
+│ ├── city.json # اطلاعات شهرها (Multi-Domain)
+│ ├── state.json # اطلاعات استانها
+│ ├── specialties.json # تخصصهای پزشکی
+│ ├── doctors.json # Mock Data پزشکان
+│ └── clinics.json # Mock Data کلینیکها
+│
+├── helper/ # توابع کمکی
+│ └── index.js # Utility Functions
+│
+├── utils/ # Utilities
+│ └── index.js # توابع کمکی (removeToken و...)
+│
+├── hooks/ # Custom Hooks
+│ └── useCanonicalUrl.js # Hook برای Canonical URL
+│
+├── mui/ # تنظیمات MUI
+│ └── index.js # Theme Configuration
+│
+├── public/ # فایلهای استاتیک
+│ ├── assets/ # تصاویر و آیکونها
+│ └── fonts/ # فونتها
+│
+├── middleware.js # Next.js Middleware
+├── next.config.js # تنظیمات Next.js
+├── tailwind.config.js # تنظیمات Tailwind
+├── docker-compose.yml # Docker Compose
+├── dockerfile # Dockerfile
+└── package.json # Dependencies
+```
+
+---
+
+## ✨ ویژگیهای کلیدی
+
+### 1. Multi-Domain Architecture
+
+پروژه از **معماری Multi-Domain** پشتیبانی میکند که به هر شهر اجازه میدهد دامنه مستقل خود را داشته باشد:
+
+```javascript
+// در data/city.json
+{
+ "id": "600",
+ "domain": "nobat724.com", // دامنه اصلی
+ "site_name": "نوبت724",
+ "title": "رزرو نوبت پزشکی",
+ // ...
+}
+```
+
+**نحوه عملکرد:**
+
+- در `lib/getStateInfo.js`: بررسی subdomain و تطبیق با شهر
+- در `app/layout.js`: تولید Metadata داینامیک بر اساس شهر
+- در `context/ProvinceProvider.js`: مدیریت Context شهر/استان
+
+### 2. سیستم احراز هویت
+
+```javascript
+// lib/auth.js - دریافت اطلاعات کاربر از Cookie
+export async function getUser() {
+ const cookieStore = cookies();
+ const raw =
+ cookieStore.get("access_token") &&
+ cookieStore.get("refresh_token") &&
+ cookieStore.get("uuid") &&
+ cookieStore.get("userInfo");
+ return raw ? raw : null;
+}
+
+// lib/ability.js - تعریف دسترسیها
+export function defineAbilitiesFor(user) {
+ if (user) {
+ can("access", "Dashboard");
+ const parsedData = JSON.parse(user.value);
+ if (parsedData.roles.find((item) => item === "representation")) {
+ can("access", "Panel");
+ }
+ } else {
+ can("access", "Login");
+ }
+}
+```
+
+### 3. سیستم رزرو نوبت
+
+فرآیند رزرو نوبت شامل مراحل زیر است:
+
+1. **انتخاب تاریخ و زمان** (`components/appointment/date/`)
+2. **ورود یا ثبتنام** (در صورت نیاز)
+3. **وارد کردن اطلاعات بیمار** (`components/appointment/detail/`)
+4. **پرداخت** (`components/appointment/paying/`)
+5. **تایید نهایی** (`components/appointment/successPay/`)
+
+### 4. پنل مدیریتی
+
+پنل مدیریتی برای نمایندگان شامل:
+
+- **داشبورد**: نمای کلی آمار
+- **حساب کاربری**: مدیریت پروفایل
+- **افزودن پزشک**: ثبت پزشک جدید
+- **مدیریت نوبتها**: مشاهده و مدیریت نوبتها
+
+**محافظت مسیر:**
+
+```javascript
+// app/panel/(layout)/layout.js
+async function LayoutPanel({ children }) {
+ const user = await getUser();
+ const ability = defineAbilitiesFor(user);
+
+ if (!ability.can("access", "Panel")) {
+ return redirect("/");
+ }
+
+ return
شهر: {isProvinceInclude.name}
}