BookStore App هو تطبيق ويب متكامل (Full-Stack) يُمكّن المستخدمين من تصفح مجموعة واسعة من الكتب التقنية والبرمجية، والاطلاع على تفاصيل كل كتاب بشكل احترافي. يجمع التطبيق بين واجهة أمامية حديثة مبنية بـ Angular 20 وخادم خلفي قوي مبني بـ ASP.NET Core 10، مع قاعدة بيانات PostgreSQL وتكامل كامل مع Entity Framework Core.
🔨 المشروع لا يزال قيد التطوير — يُعدّ هذا إصدارًا تجريبيًا أوليًا تم بناؤه لإتقان أسس تطوير التطبيقات المتكاملة (Full-Stack).
simpleFullStackLibrary/
├── 📁 Backend/ # الخادم الخلفي — ASP.NET Core 10
│ ├── 📁 Controllers/
│ │ └── BookController.cs # نقاط نهاية API للكتب
│ ├── 📁 Models/
│ │ └── Book.cs # نموذج بيانات الكتاب
│ ├── 📁 Data/
│ │ └── AppDbContext.cs # سياق قاعدة البيانات + بيانات أولية (Seed)
│ ├── 📁 Migrations/ # ملفات هجرة قاعدة البيانات
│ ├── Program.cs # نقطة دخول التطبيق والإعدادات
│ ├── appsettings.json # إعدادات التطبيق
│ └── BookStoreBackend.csproj # ملف مشروع .NET
│
└── 📁 FrontEnd/ # الواجهة الأمامية — Angular 20
└── 📁 src/app/
├── 📁 pages/
│ ├── book-list/ # صفحة عرض قائمة الكتب
│ └── about/ # صفحة عن التطبيق
├── 📁 components/
│ ├── header/ # مكوّن الترويسة
│ └── details/ # مكوّن تفاصيل الكتاب
├── 📁 services/
│ └── book-service.ts # خدمة الاتصال بالـ API
├── ibook.ts # واجهة TypeScript للكتاب
└── app.routes.ts # مسارات التطبيق
| التقنية | الإصدار | الوصف |
|---|---|---|
| ASP.NET Core | 10.0 | إطار عمل الخادم الخلفي |
| Entity Framework Core | 10.0.9 | ORM لإدارة قاعدة البيانات |
| PostgreSQL (Npgsql) | 10.0.0 | قاعدة البيانات العلائقية |
| ASP.NET Identity | 10.0.9 | نظام المصادقة والمستخدمين |
| Scalar API | 2.16.11 | واجهة تصفح وتوثيق الـ API |
| OpenAPI | 10.0.9 | توثيق الـ API تلقائيًا |
| التقنية | الإصدار | الوصف |
|---|---|---|
| Angular | 20.3 | إطار عمل الواجهة الأمامية |
| TypeScript | 5.9 | لغة البرمجة |
| Tailwind CSS | v4.1 | إطار تصميم الواجهات |
| RxJS | 7.8 | البرمجة التفاعلية (Reactive) |
| Angular HttpClient | — | الاتصال بالـ API |
| Angular Router | — | إدارة مسارات الصفحات |
public class Book
{
[Key]
public string Isbn { get; set; } // رقم ISBN — المفتاح الأساسي
public string Title { get; set; } // عنوان الكتاب
public string SubTitle { get; set; } // العنوان الفرعي
public string Author { get; set; } // اسم المؤلف
public DateTime PublishDate { get; set; } // تاريخ النشر
public string Publisher { get; set; } // دار النشر
public decimal Pages { get; set; } // عدد الصفحات
public string? Description { get; set; } // وصف الكتاب
public string? Website { get; set; } // رابط الكتاب الرسمي
public string ImageUrl { get; set; } // رابط صورة الغلاف
}| الطريقة | المسار | الوصف |
|---|---|---|
GET |
/api/Book |
جلب جميع الكتب |
GET |
/api/Book/{isbn} |
جلب كتاب بواسطة رقم ISBN |
| الطريقة | المسار | الوصف |
|---|---|---|
POST |
/register |
تسجيل مستخدم جديد |
POST |
/login |
تسجيل دخول |
POST |
/logout |
تسجيل خروج |
GET |
/manage/info |
معلومات المستخدم الحالي |
🔍 يمكنك استعراض جميع نقاط الـ API من خلال واجهة Scalar على:
http://localhost:5000/scalar
يقوم التطبيق تلقائيًا بزرع 9 كتب برمجية في قاعدة البيانات عند تطبيق الـ Migrations لأول مرة، وذلك من خلال OnModelCreating في AppDbContext:
| # | عنوان الكتاب | المؤلف | دار النشر | الصفحات |
|---|---|---|---|---|
| 1 | ASP.NET Core in Action, 2nd Ed. | Andrew Lock | Manning | 624 |
| 2 | Git Pocket Guide | Richard E. Silverman | O'Reilly | 234 |
| 3 | Learning JavaScript Design Patterns | Addy Osmani | O'Reilly | 254 |
| 4 | Designing Evolvable Web APIs with ASP.NET | Glenn Block | O'Reilly | 238 |
| 5 | Speaking JavaScript | Axel Rauschmayer | O'Reilly | 460 |
| 6 | You Don't Know JS: ES6 & Beyond | Kyle Simpson | O'Reilly | 278 |
| 7 | Programming JavaScript Applications | Eric Elliott | O'Reilly | 254 |
| 8 | Eloquent JavaScript, 2nd Ed. | Marijn Haverbeke | No Starch | 472 |
| 9 | Understanding ECMAScript 6 | Nicholas C. Zakas | No Starch | 352 |
| المسار | المكوّن | الوصف |
|---|---|---|
/ |
BookList |
الصفحة الرئيسية — عرض جميع الكتب مع بحث |
/details/:isbn |
Details |
صفحة تفاصيل كتاب محدد |
/about |
About |
صفحة عن التطبيق |
قبل البدء، تأكد من تثبيت التالي على جهازك:
- ✅ .NET SDK 10.0
- ✅ Node.js 20+
- ✅ Angular CLI (
npm install -g @angular/cli) - ✅ PostgreSQL 15+
git clone https://github.com/YOUR_USERNAME/simpleFullStackLibrary.git
cd simpleFullStackLibrary# الانتقال إلى مجلد الخادم الخلفي
cd Backend
# تعديل سلسلة الاتصال في appsettings.json
# عدّل كلمة المرور حسب إعدادات PostgreSQL لديك:
# "DefaultConnection": "Host=localhost;Port=5432;Username=postgres;Password=YOUR_PASSWORD;"
# تثبيت الحزم
dotnet restore
# تطبيق هجرات قاعدة البيانات (سيتم زرع البيانات تلقائيًا)
dotnet ef database update
# تشغيل الخادم
dotnet run✅ سيعمل الخادم على:
http://localhost:5000📖 واجهة Scalar API:
http://localhost:5000/scalar
# في نافذة طرفية جديدة، انتقل إلى مجلد الواجهة الأمامية
cd FrontEnd
# تثبيت الحزم
npm install
# تشغيل خادم التطوير
npm start✅ ستعمل الواجهة على:
http://localhost:4200
يسمح الخادم الخلفي بالاتصالات القادمة من http://localhost:4200 فقط (أي الواجهة الأمامية في بيئة التطوير):
builder.Services.AddCors(Options =>
{
Options.AddPolicy("AllowSpecificOrigin", policy =>
{
policy.WithOrigins("http://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod();
});
});// src/app/services/book-service.ts
export class BookService {
baseURL = 'http://localhost:5000/api';
// ...
}| اسم الهجرة | التاريخ | الوصف |
|---|---|---|
20260714153942_init |
14 يوليو 2026 | إنشاء الجداول الأولية + Identity + بيانات الكتب |
# إنشاء هجرة جديدة
dotnet ef migrations add اسم_الهجرة
# تطبيق الهجرات على قاعدة البيانات
dotnet ef database update
# التراجع عن آخر هجرة
dotnet ef database update 0
# عرض قائمة الهجرات
dotnet ef migrations list- 🔐 واجهة تسجيل الدخول والتسجيل من الـ Frontend
- 🛒 سلة التسوق (Cart)
- ❤️ قائمة الأمنيات (Wishlist)
- 🔍 بحث متقدم وفلترة حسب المؤلف والناشر والسنة
- 📄 ترقيم الصفحات (Pagination)
- ⭐ نظام التقييمات والمراجعات
- 👤 لوحة تحكم المدير (Admin Dashboard)
- 🌙 الوضع الليلي (Dark Mode)
- 📱 تحسين التصميم للهاتف المحمول
BookController.cs — التحكم بالكتب
[Route("api/[controller]")]
[ApiController]
public class BookController : ControllerBase
{
private readonly AppDbContext _context;
public BookController(AppDbContext context) => _context = context;
// GET api/Book — جلب جميع الكتب
[HttpGet()]
public async Task<ActionResult<Book[]>> GetAllBooksAsync()
{
var books = await _context.Books.ToListAsync();
return Ok(books);
}
// GET api/Book/{isbn} — جلب كتاب بالـ ISBN
[HttpGet("{id}")]
public async Task<ActionResult<Book>> GetBookByIdAsync(string id)
{
var book = await _context.Books.FirstOrDefaultAsync(x => x.Isbn.Contains(id));
if (book == null) return NotFound("الكتاب المطلوب غير موجود.");
return Ok(book);
}
}book-service.ts — خدمة الاتصال بالـ API
@Injectable({ providedIn: 'root' })
export class BookService {
baseURL = 'http://localhost:5000/api';
httpClient = inject(HttpClient);
getAllBooks(): Observable<IBook[]> {
return this.httpClient.get<IBook[]>(`${this.baseURL}/Book`);
}
getBookById(id: string | number): Observable<IBook> {
return this.httpClient.get<IBook>(`${this.baseURL}/Book/${id}`);
}
}ibook.ts — واجهة TypeScript للكتاب
export interface IBook {
isbn: string;
title: string;
subTitle: string;
author: string;
publish_date: string;
publisher: string;
pages: number;
description: string;
website: string;
imageUrl: string;
}هذا المشروع مرخص تحت رخصة MIT — راجع ملف LICENSE لمزيد من التفاصيل.
صُنع بـ ❤️ باستخدام ASP.NET Core و Angular
⭐ إذا أعجبك المشروع، لا تنسَ وضع نجمة على الـ Repository!

