Skip to content

عايز اعمل تطبيق ويب  #431

@Fawzziii

Description

@Fawzziii

تم. سأفترض الخيارات الأكثر ملاءمة للمشروع:

  1. قاعدة البيانات: سأختار PostgreSQL لقوته وميزاته المتقدمة التي تدعم متطلبات الأمان وسجل التعديلات بكفاءة أعلى.
  2. البيئة: سأقوم بإعداد بيئة تطوير محلية (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

ملاحظة: سأقوم بتنفيذ الأمر في الخطوة التالية.

الخطوة الخامسة: تحديث خطة العمل

سأقوم بتحديث خطة العمل لتعكس الخطوات المتبقية:

  1. إنشاء قاعدة البيانات والجداول: تنفيذ أوامر SQL لإنشاء الجداول (convoys, users, audit_logs).
  2. تطوير الواجهة الخلفية (API): بناء نقاط النهاية (Endpoints) لـ CRUD (إنشاء، قراءة، تحديث، حذف) للقوافل، والمصادقة (Login/Auth).
  3. تطوير الواجهة الأمامية (Frontend): إعداد مشروع React/TypeScript/Tailwind CSS وتصميم الواجهة العربية.
  4. دمج الواجهتين: ربط الواجهة الأمامية بالخلفية وتنفيذ جميع الخواص المطلوبة.
  5. التسليم النهائي: تقديم الحل الجاهز للتنفيذ.

سأبدأ الآن بتنفيذ الأمر docker compose up.

دي رساله من ذكاء اصطناعي طبقلي اللي فيها

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions