الاتساق هو أساس الكود القابل للصيانة. في Databayt، نتبع أنماطاً راسخة تضمن بقاء قاعدة كودنا قابلة للتوسع وقابلة للقراءة وتعاونية. كل نمط يخدم غرضاً - من المكونات الذرية إلى إجراءات الخادم، من اصطلاحات التسمية إلى تنظيم الملفات.
button.tsx، user-profile.tsx)user-profile، sign-in)use-leads.ts، use-upwork.ts)UserData، ApiResponse)export function UserCard())export function formatCurrency())const userData = await fetchUser())const API_BASE_URL = 'https://api.example.com')user_profiles، order_items)/api/user-profile، /api/order-history)DATABASE_URL، NEXT_PUBLIC_API_KEY)مفضلة للأدوات ومعالجات الأحداث والدوال المضمنة.
const formatPrice = (amount: number) => {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
}).format(amount)
}تُستخدم لمكونات React ومعالجات مسارات API والدوال المُصدَّرة.
export function UserProfile({ userId }: Props) {
const { user, loading } = useUser(userId)
if (loading) return <Skeleton />
return <div>{user.name}</div>
}نستخدم إجراءات خادم Next.js لإرسال النماذج وتغييرات البيانات:
'use server'
import { revalidatePath } from 'next/cache'
import { redirect } from 'next/navigation'
export async function createUser(formData: FormData) {
const userData = {
name: formData.get('name') as string,
email: formData.get('email') as string,
}
try {
await db.user.create({ data: userData })
revalidatePath('/users')
redirect('/users')
} catch (error) {
throw new Error('Failed to create user')
}
}components/
├── atom/ # عناصر أساسية (Button، Input، Icon)
├── molecule/ # تركيبات بسيطة (SearchBox، FormField)
├── organism/ # مكونات معقدة (Header، UserTable)
├── template/ # تخطيطات وهياكل الصفحة
└── page/ # تركيبات الصفحة الكاملة
نمط المرآة يضمن أن كل ميزة تتبع هيكلاً متسقاً ومتوقعاً. كل دليل ميزة يحتوي نفس أنواع الملفات.
components/<feature>/
├── content.tsx # تركيب UI الرئيسي (مكون عميل)
├── actions.ts # إجراءات الخادم (التغييرات، CRUD)
├── validation.ts # مخططات Zod للتحقق من البيانات
├── types.ts # أنواع TypeScript والواجهات
├── form.tsx # مكونات النماذج (عميل)
├── table.tsx # جدول البيانات (عميل)
├── column.tsx # تعريفات الأعمدة (عميل)
├── use-<feature>.ts # خطافات React المخصصة
├── config.ts # التعدادات، الخيارات، الافتراضيات
└── README.md # توثيق الميزة
الصفحات تفوض إلى مكونات المحتوى، تعالج البيانات الوصفية وi18n:
import BrandingContent from "@/components/onboarding/branding/content";
import { getDictionary } from "@/components/internationalization/dictionaries";
import { type Locale } from "@/components/internationalization/config";
export const metadata = {
title: "Branding",
};
interface PageProps {
params: Promise<{ lang: Locale }>
}
export default async function Branding({ params }: PageProps) {
const { lang } = await params;
const dictionary = await getDictionary(lang);
return <BrandingContent dictionary={dictionary.school} />;
}إجراءات الخادم مع سياق المستأجر والتحقق وإعادة التحقق:
"use server";
import { z } from "zod";
import { revalidatePath } from "next/cache";
import { db } from "@/lib/db";
import { getTenantContext } from "@/lib/tenant-context";
import { studentCreateSchema } from "./validation";
export async function createStudent(input: z.infer<typeof studentCreateSchema>) {
const { schoolId } = await getTenantContext();
if (!schoolId) throw new Error("Missing school context");
const parsed = studentCreateSchema.parse(input);
const row = await db.student.create({
data: {
schoolId,
givenName: parsed.givenName,
surname: parsed.surname,
gender: parsed.gender,
},
});
revalidatePath("/students");
return { success: true as const, id: row.id };
}للتطبيقات التي تخدم مؤسسات متعددة، عزل المستأجر ليس اختيارياً - إنه قانون مقدس.
// كل استعلام قاعدة بيانات يجب أن يتضمن نطاق المستأجر
await db.student.findMany({
where: { schoolId, yearLevel: "10" } // schoolId = عزل المستأجر
})
// لا تستعلم أبداً بدون نطاق المستأجر
await db.student.findMany({
where: { yearLevel: "10" } // خطير: يكسر العزل
})strict: true في tsconfigcn()هذه الأنماط هي إرشادات حية تتطور مع قاعدة كودنا. إنها موثقة في دليل المساهمة ومُنفَّذة من خلال قواعد ESLint وتكوين Prettier وعمليات مراجعة الكود.
عندما تشك، أعطِ الأولوية للاتساق على التفضيل الشخصي. أنماطنا تخدم المجتمع، تضمن أن أي مطور يمكنه القفز إلى أي جزء من قاعدة الكود وفهم الهيكل والاصطلاحات فوراً.
On This Page
الأنماط سحرية، عندما تراها تعرفهااصطلاحات التسميةالملفات والمجلداتالمتغيرات والدوالقاعدة البيانات وAPIأنماط الدوالإجراءات الخادم وجلب البياناتنمط إجراءات الخادمتسلسل جلب البياناتبنية المكوناتهيكل التصميم الذريبنية نمط المرآةهيكل الميزةلماذا يعمل نمط المرآةأنماط الملفات القياسيةنمط page.tsxنمط actions.tsبنية تعدد المستأجرينالقاعدة الذهبيةأنماط TypeScriptاستراتيجية تعريف الأنواعأنماط التنسيقتنظيم Tailwind CSSتبني الأنماط