SwapS, kullanıcıların becerilerini paylaşarak karşılıklı öğrenme ve işbirliği yapabileceği modern bir skill swap (beceri takas) platformudur. Kullanıcılar sahip oldukları becerileri sunabilir (Offering), ihtiyaç duydukları becerileri arayabilir (Seeking) ve karşılıklı eşleşmeler bularak projeler üzerinde işbirliği yapabilir.
Frontend: https://swaps.com.tr
- Kullanıcı Adı:
user| Şifre:user - Kullanıcı Adı:
test| Şifre:test - Admin:
admin1@gmail.com| Şifre:admin-1
- HTML5 Semantic Markup: Modern web standartları ile erişilebilir yapı
- Kullanıcı Yönetimi: Kayıt, giriş ve profil ayarları
- Beceri Yönetimi: Offering (sunulan) ve Seeking (aranan) beceriler
- Karşılıklı Eşleşme: İki yönlü beceri eşleşmesi algoritması
- Proje Sistemi: Proje oluşturma, düzenleme ve başvuru yapma
- Mesajlaşma: Kullanıcılar arası gerçek zamanlı mesajlaşma
- Dashboard: Devam eden işler, teklifler ve öneriler
- Admin Paneli: Kullanıcı ve beceri yönetimi
- Responsive Tasarım: Mobil ve desktop uyumlu modern arayüz
Proje modern HTML5 standartlarına tam uyumludur:
<header>- Sayfa başlıkları ve navigasyon<nav>- Navigasyon menüleri<main>- Ana içerik alanı<section>- İçerik bölümleri<article>- Bağımsız içerik blokları<footer>- Sayfa alt bilgisi
<input type="email">- Email validasyonu<input type="password">- Şifre alanlarırequiredattribute - Zorunlu alan kontrolüaria-label- Erişilebilirlik özellikleri
<!DOCTYPE html>- HTML5 deklarasyonu<meta charset="UTF-8">- Karakter seti<meta name="viewport">- Responsive tasarım- Open Graph meta tags - Sosyal medya entegrasyonu
- HTML5 - Semantic markup ve modern web standartları
- React 19.2.0 - Modern UI kütüphanesi
- Vite - Hızlı geliştirme ortamı
- Material-UI (MUI) v7 - Modern komponent kütüphanesi
- React Router DOM - Sayfa yönlendirme
- Axios - HTTP istekleri
- Emotion - CSS-in-JS styling
- Node.js - JavaScript runtime
- Express 5 - Web framework
- PostgreSQL - İlişkisel veritabanı
- JWT - Token tabanlı kimlik doğrulama
- bcrypt - Şifre hashleme
- pg - PostgreSQL client
- Vercel - Frontend hosting
- Render - Backend hosting
- Docker - Containerization support
Proje artık Docker ile tam izole bir şekilde çalışmaktadır. Bilgisayarınızdaki mevcut veritabanı kurulumlarını etkilemez.
- Docker Desktop (Kurulu ve çalışıyor olmalı)
- Git
git clone https://github.com/yakuperoglu/swapsproject.git
cd swapsprojectTek bir komutla tüm sistemi (Frontend, Backend, Veritabanı) ayağa kaldırın:
docker-compose up -d --build(Bu işlem ilk seferde imajların indirilmesi ve oluşturulması nedeniyle birkaç dakika sürebilir)
Sistem şu adreslerde çalışacaktır:
- Frontend (Ana Site): http://localhost
- Backend API: http://localhost:3005
- Veritabanı (PostgreSQL):
localhost:5435
Veritabanı tabloları ve varsayılan veriler (yetenek listesi vb.) otomatik olarak oluşturulur. Ekstra bir kurulum yapmanıza gerek yoktur.
Eski Token Uyarısı: Veritabanı sıfırdan oluşturulduğu için eski kullanıcı kayıtlarınız silinmiştir. Sisteme giriş yapmadan önce yeni bir üyelik oluşturmanız gerekmektedir.
Veritabanına dışarıdan bağlanmak isterseniz:
- Host: localhost
- Port: 5435
- User: postgres
- Password: postgres
- Database: swaps_db
Mock User 1:
Email: user@gmail.com
Şifre: user
Mock User 2:
Email: test@gmail.com
Şifre: test
Admin Hesabı:
Email: admin1@gmail.com
Şifre: admin-1
Not:
- Demo için sisteme yeni kullanıcı kaydı da yapabilirsiniz
- Kayıt için herhangi bir doğrulama gerekmez
- Local:
http://localhost:3005 - Production:
https://swaps-backend.onrender.com
Not: 🔒 işareti olan endpoint'ler için
Authorization: Bearer <TOKEN>header'ı gereklidir.
POST /api/auth/register
Content-Type: application/json
{
"username": "string",
"email": "string",
"password": "string"
}Yanıt:
{
"message": "Kullanici basariyla olusturuldu!",
"user": {
"id": 1,
"username": "john_doe",
"email": "john@example.com"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}POST /api/auth/login
Content-Type: application/json
{
"email": "user@gmail.com",
"password": "user"
}Yanıt:
{
"message": "Giris basarili! (Demo User)",
"user": {
"id": 100001,
"username": "user",
"email": "user@gmail.com",
"role": "user"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}Not: Mock kullanıcılar için email:
"user@gmail.com"(şifre:"user") veya"test@gmail.com"(şifre:"test")
GET /api/profile/:userIdPOST /api/profile/save-settings
Content-Type: application/json
{
"userId": 1,
"profileData": {
"bio": "string",
"location": "string",
...
}
}DELETE /api/profile/delete-account/:userIdGET /api/skillsYanıt:
{
"success": true,
"skills": [
{
"id": 1,
"name": "JavaScript",
"category": "Programlama"
},
...
]
}POST /api/skills
Content-Type: application/json
{
"name": "React",
"category": "Programlama"
}PUT /api/skills/:skillId
Content-Type: application/json
{
"name": "React Native",
"category": "Programlama"
}DELETE /api/skills/:skillIdGET /api/categoriesGET /user-skills/:userIdYanıt:
{
"success": true,
"offering": [
{
"id": 1,
"skill_name": "JavaScript",
"skill_category": "Programlama",
"type": "Offering"
}
],
"seeking": [
{
"id": 2,
"skill_name": "Python",
"skill_category": "Programlama",
"type": "Seeking"
}
]
}POST /user-skills
Content-Type: application/json
{
"skill_id": 7,
"type": "Offering"
}
type: "Offering" (sunulan) veya "Seeking" (aranan)
DELETE /user-skills/:idGET /swaps/reciprocalAlgoritma:
- Kullanıcı A'nın Seeking becerileri = Kullanıcı B'nin Offering becerileri
- Kullanıcı B'nin Seeking becerileri = Kullanıcı A'nın Offering becerileri
Yanıt:
{
"success": true,
"matches_count": 2,
"matches": [
{
"id": 5,
"kullanici_adi": "jane_smith",
"email": "jane@example.com",
"matched_skills_a_needs": [
{
"skill_id": 8,
"skill_name": "Python",
"skill_category": "Programlama"
}
],
"matched_skills_b_needs": [
{
"skill_id": 7,
"skill_name": "JavaScript",
"skill_category": "Programlama"
}
]
}
]
}GET /projectsGET /projects/:idGET /projects/myPOST /projects
Content-Type: application/json
{
"title": "Web Sitesi Geliştirme",
"description": "E-ticaret projesi için React developer aranıyor"
}PUT /projects/:id
Content-Type: application/json
{
"title": "Updated Title",
"description": "Updated Description"
}DELETE /projects/:idGET /matches/userYanıt:
{
"success": true,
"applicantMatches": [],
"receivedMatches": []
}POST /matches
Content-Type: application/json
{
"project_id": 5
}PUT /matches/:id/status
Content-Type: application/json
{
"status": "Accepted"
}
status: "Pending", "Accepted", "Rejected"
DELETE /matches/:idDevam Eden İşler:
GET /user/tasks?filter=ongoingBekleyen Teklifler:
GET /user/tasks?filter=offersÖnerilen Projeler:
GET /user/tasks?filter=suggestionsPOST /api/messages
Content-Type: application/json
{
"receiver_id": 5,
"content": "Merhaba, projeniz hakkında konuşabilir miyiz?"
}GET /api/messages/conversationsGET /api/messages/conversation/:otherUserIdPOST /swap-requests
Content-Type: application/json
{
"receiver_id": 5
}GET /swap-requestsYanıt:
{
"success": true,
"incoming": [],
"outgoing": [],
"accepted": []
}PUT /swap-requests/:id/status
Content-Type: application/json
{
"status": "Accepted"
}
status: "Accepted" veya "Rejected"
GET /api/admin/usersPUT /api/admin/users/:userId
Content-Type: application/json
{
"username": "new_username",
"email": "new_email@example.com"
}DELETE /api/admin/users/:userId- Ana sayfada "Giriş Yap" butonuna tıklayın
- Email alanına:
user@gmail.comyazın - Şifre alanına:
useryazın - Giriş yapın ve platformu keşfedin!
- Ana sayfada "Kayıt Ol" butonuna tıklayın
- Kullanıcı adı, email ve şifre girin
- Otomatik olarak giriş yapılır ve token alınır
- Profil sayfasına gidin
- "Offering" (Sunduğunuz beceriler) veya "Seeking" (Aradığınız beceriler) sekmesini seçin
- Beceri ekleyin
- "Discover" sayfasına gidin
- Karşılıklı eşleşen kullanıcıları görüntüleyin
- İlgilendiğiniz kullanıcıya eşleşme isteği gönderin
- Dashboard'da "Yeni Proje" butonuna tıklayın
- Proje başlığı ve açıklama girin
- Diğer kullanıcılar projenize başvurabilir
- Eşleştiğiniz kullanıcıyla mesajlaşmak için "Messages" sayfasına gidin
- Konuşmayı başlatın veya devam ettirin
swapsproject/
├── backend/
│ ├── config/
│ │ └── database.js # PostgreSQL bağlantı ayarları
│ ├── controllers/
│ │ ├── authController.js # Kimlik doğrulama
│ │ └── messageController.js # Mesajlaşma
│ ├── middleware/
│ │ └── auth.js # JWT middleware
│ ├── routes/
│ │ ├── authroutes.js
│ │ └── messageRoutes.js
│ ├── index.js # Ana server dosyası
│ └── package.json
│
├── frontend/
│ ├── src/
│ │ ├── components/ # React bileşenleri
│ │ │ ├── Header.jsx
│ │ │ ├── Login.jsx
│ │ │ ├── Register.jsx
│ │ │ ├── ProfilePage.jsx
│ │ │ ├── Discover.jsx
│ │ │ ├── MessagesPage.jsx
│ │ │ └── ...
│ │ ├── services/ # API servisleri
│ │ │ ├── authService.js
│ │ │ ├── skillsService.js
│ │ │ └── swapsService.js
│ │ ├── App.jsx # Ana uygulama
│ │ └── main.jsx
│ ├── package.json
│ └── vite.config.js
│
└── README.md
- Docker servilerinin çalıştığından emin olun:
docker ps - Logları kontrol edin:
docker logs swaps-backend - Port 3005'in (Backend) veya 5435'in (DB) başka bir uygulama tarafından kullanılmadığından emin olun.
- Frontend artık Nginx üzerinden çalıştığı için
/apiisteklerini otomatik yönlendirir. - Tarayıcı önbelleğini temizlemeyi deneyin.
- Hata alıyorsanız
docker-compose restart frontendkomutunu deneyin.
- Token'ınızın süresi dolmuş olabilir, yeniden giriş yapın.
- Veritabanı sıfırlandığı için eski tokenlar geçersizdir, yeniden kayıt olun.
Bu proje açık kaynaklıdır. Katkıda bulunmak için:
- Bu repository'yi fork edin
- Yeni bir branch oluşturun (
git checkout -b feature/amazing-feature) - Değişikliklerinizi commit edin (
git commit -m 'feat: Add amazing feature') - Branch'inizi push edin (
git push origin feature/amazing-feature) - Pull Request açın
Bu proje MIT lisansı altında lisanslanmıştır. Detaylar için LICENSE dosyasına bakın.
Proje ile ilgili sorularınız için:
- GitHub: yakuperoglu
- Website: https://swaps.com.tr
SwapS platformunu kullandığınız için teşekkür ederiz! Becerilerinizi paylaşarak öğrenme topluluğuna katkıda bulunun.
Happy Swapping!