-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Description
تم. سأفترض الخيارات الأكثر ملاءمة للمشروع:
- قاعدة البيانات: سأختار PostgreSQL لقوته وميزاته المتقدمة التي تدعم متطلبات الأمان وسجل التعديلات بكفاءة أعلى.
- البيئة: سأقوم بإعداد بيئة تطوير محلية (Local Development Environment) متكاملة باستخدام Docker Compose، مما يضمن أن الحل الذي سأقدمه لك سيعمل بشكل متطابق على أي جهاز، ويسهل نشره لاحقاً على أي مزود استضافة.
ملخص التنفيذ:
سأبدأ الآن بتصميم بنية المشروع، وتحديد نموذج البيانات (Data Model)، وإعداد ملفات التكوين الأساسية (Configuration Files) لـ Docker Compose.
الخطوة الأولى: تصميم نموذج البيانات (Data Model Design)
سأقوم بإنشاء نموذج بيانات يغطي جميع متطلبات القوافل، الصلاحيات، وسجل التعديلات.
جدول convoys (القوافل):
| الحقل | النوع | الوصف |
|---|---|---|
id |
UUID | مفتاح أساسي، معرف فريد للقافلة |
city_village_name |
VARCHAR(255) | اسم المدينة/القرية (مطلوب) |
responsible_person_name |
VARCHAR(255) | اسم المسؤول المستضيف (مطلوب) |
responsible_person_phone |
VARCHAR(20) | رقم تليفون المسؤول (مطلوب) |
convoy_date |
DATE | تاريخ القافلة (مطلوب) |
convoy_day |
VARCHAR(20) | اليوم (يُحسب تلقائيًا عند الإدخال) |
status |
ENUM | حالة القافلة (YES, NO, WAIT, COMPLETED) |
created_at |
TIMESTAMP | تاريخ الإنشاء |
updated_at |
TIMESTAMP | تاريخ آخر تعديل |
جدول users (المستخدمون):
| الحقل | النوع | الوصف |
|---|---|---|
id |
UUID | مفتاح أساسي، معرف فريد للمستخدم |
username |
VARCHAR(50) | اسم المستخدم (للتسجيل) |
password_hash |
VARCHAR(255) | كلمة المرور المشفرة |
role |
ENUM | الصلاحية (ADMIN, USER) |
جدول audit_logs (سجل التعديلات):
| الحقل | النوع | الوصف |
|---|---|---|
id |
BIGINT | مفتاح أساسي، ترقيم تلقائي |
user_id |
UUID | معرف المستخدم الذي قام بالتعديل (مفتاح خارجي لـ users) |
action |
VARCHAR(50) | نوع الإجراء (CREATE, UPDATE, DELETE) |
table_name |
VARCHAR(50) | الجدول الذي تم التعديل عليه (مثل convoys) |
record_id |
UUID | معرف السجل الذي تم التعديل عليه |
old_data |
JSONB | البيانات القديمة قبل التعديل |
new_data |
JSONB | البيانات الجديدة بعد التعديل |
timestamp |
TIMESTAMP | وقت التعديل |
الخطوة الثانية: إعداد بيئة Docker Compose
سأقوم بإنشاء ملف docker-compose.yml لتشغيل قاعدة بيانات PostgreSQL وخادم الواجهة الخلفية (Backend Server) في حاويات منفصلة.
التنفيذ العملي (Docker Compose Setup):
سأقوم بإنشاء ملف docker-compose.yml في المسار /home/ubuntu/mcms/
# /home/ubuntu/mcms/docker-compose.yml
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_USER: mcms_user
POSTGRES_PASSWORD: mcms_password
POSTGRES_DB: mcms_db
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U mcms_user -d mcms_db"]
interval: 5s
timeout: 5s
retries: 5
backend:
build:
context: ./backend
dockerfile: Dockerfile
restart: always
ports:
- "3000:3000"
environment:
NODE_ENV: development
DATABASE_URL: postgres://mcms_user:mcms_password@db:5432/mcms_db
JWT_SECRET: your_very_secret_key_here
depends_on:
db:
condition: service_healthy
volumes:
- ./backend:/app
- /app/node_modules # لمنع الكتابة فوق node_modules من المضيف
volumes:
postgres_data:الخطوة الثالثة: إعداد هيكل المشروع الأساسي
سأقوم بإنشاء المجلدات والملفات الأساسية للواجهة الخلفية (Backend) والواجهة الأمامية (Frontend).
التنفيذ العملي (Project Structure):
# إنشاء مجلد المشروع
mkdir -p /home/ubuntu/mcms/backend
mkdir -p /home/ubuntu/mcms/frontend
# إنشاء ملف Dockerfile للواجهة الخلفية (Node.js/TypeScript)
cat << EOF > /home/ubuntu/mcms/backend/Dockerfile
# /home/ubuntu/mcms/backend/Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build # افتراض وجود أمر build لتحويل TypeScript إلى JavaScript
EXPOSE 3000
CMD ["npm", "start"]
EOF
# إنشاء ملف package.json أساسي للواجهة الخلفية
cat << EOF > /home/ubuntu/mcms/backend/package.json
{
"name": "mcms-backend",
"version": "1.0.0",
"description": "Medical Convoy Management System Backend",
"main": "dist/index.js",
"scripts": {
"start": "node dist/index.js",
"dev": "ts-node src/index.ts",
"build": "tsc",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.2",
"pg": "^8.11.3",
"dotenv": "^16.4.5"
},
"devDependencies": {
"@types/express": "^4.17.21",
"@types/node": "^20.11.24",
"@types/pg": "^8.11.0",
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
}
}
EOF
# إنشاء ملف tsconfig.json للواجهة الخلفية
cat << EOF > /home/ubuntu/mcms/backend/tsconfig.json
{
"compilerOptions": {
"target": "es2020",
"module": "commonjs",
"rootDir": "./src",
"outDir": "./dist",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
EOF
# إنشاء ملف index.ts كنقطة بداية للخادم
mkdir -p /home/ubuntu/mcms/backend/src
cat << EOF > /home/ubuntu/mcms/backend/src/index.ts
// /home/ubuntu/mcms/backend/src/index.ts
import express from 'express';
import { Pool } from 'pg';
import dotenv from 'dotenv';
dotenv.config();
const app = express();
const port = process.env.PORT || 3000;
// إعداد اتصال قاعدة البيانات
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
// اختبار الاتصال بقاعدة البيانات
pool.connect((err, client, release) => {
if (err) {
return console.error('Error acquiring client', err.stack);
}
client.query('SELECT NOW()', (err, result) => {
release();
if (err) {
return console.error('Error executing query', err.stack);
}
console.log('Database connected successfully at:', result.rows[0].now);
});
});
app.use(express.json());
app.get('/', (req, res) => {
res.send('MCMS Backend Service is Running!');
});
app.listen(port, () => {
console.log(\`Server running on http://localhost:\${port}\`);
});
EOFالخطوة الرابعة: تشغيل البيئة الأساسية
سأقوم الآن بتشغيل حاويات Docker للتأكد من أن قاعدة البيانات والخادم يعملان ويتصلان ببعضهما البعض بشكل صحيح.
التنفيذ العملي (Docker Up):
cd /home/ubuntu/mcms
docker compose up -d --buildملاحظة: سأقوم بتنفيذ الأمر في الخطوة التالية.
الخطوة الخامسة: تحديث خطة العمل
سأقوم بتحديث خطة العمل لتعكس الخطوات المتبقية:
- إنشاء قاعدة البيانات والجداول: تنفيذ أوامر SQL لإنشاء الجداول (convoys, users, audit_logs).
- تطوير الواجهة الخلفية (API): بناء نقاط النهاية (Endpoints) لـ CRUD (إنشاء، قراءة، تحديث، حذف) للقوافل، والمصادقة (Login/Auth).
- تطوير الواجهة الأمامية (Frontend): إعداد مشروع React/TypeScript/Tailwind CSS وتصميم الواجهة العربية.
- دمج الواجهتين: ربط الواجهة الأمامية بالخلفية وتنفيذ جميع الخواص المطلوبة.
- التسليم النهائي: تقديم الحل الجاهز للتنفيذ.
سأبدأ الآن بتنفيذ الأمر docker compose up.
دي رساله من ذكاء اصطناعي طبقلي اللي فيها