ΠΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°ΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.
WOOJ - ΡΡΠΎ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π»ΠΈΡΠ½ΡΠΌΠΈ Π·Π°ΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ ("Π²ΡΠ΄ΠΆΠ°ΠΌΠΈ"). Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΎΠΏΠΈΠΊΠΎΠ², ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ rich-text ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠΎΠΌ.
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅ΡΠΎΠΊ Ρ rich-text ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΎΠΌ (TipTap)
- Π’ΠΎΠΏΠΈΠΊΠΈ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°
- ΠΠ°ΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅ Π²Π°ΠΆΠ½ΡΡ Π·Π°ΠΌΠ΅ΡΠΎΠΊ
- Drag & Drop Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π·Π°ΠΌΠ΅ΡΠΎΠΊ
- ΠΠΎΡΠ·ΠΈΠ½Π° Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
- Π‘ΠΈΡΡΠ΅ΠΌΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ email
- ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π°Π²Π°ΡΠ°ΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
- ΠΠ΄Π°ΠΏΡΠΈΠ²Π½ΡΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ²
(Π±Π»ΠΈΠ½, Π½Π°Π΄ΠΎ ΠΆΠ΅ Π±ΡΠ»ΠΎ ΡΡΠΎ-ΡΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ... ππ)
ΠΡΠΎΠ΅ΠΊΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ Π½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π° frontend ΠΈ backend:
- API: RESTful API Ρ Laravel Sanctum Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
- ΠΠΎΠ΄Π΅Π»ΠΈ: User, Wooj, Topic, WoojTopic
- ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ : PostgreSQL Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΠΌΠΈ
- Π‘Π΅ΡΠ²ΠΈΡΡ: WoojService, TopicService, UserService (Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠ°)
- Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅: Pinia stores Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ
- Π ΠΎΡΡΠΈΠ½Π³: Vue Router Ρ Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΌΠΈ ΠΌΠ°ΡΡΡΡΡΠ°ΠΌΠΈ
- UI: ΠΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈ ΡΡΠΈΠ»ΠΈ
- Π Π΅Π΄Π°ΠΊΡΠΎΡ: TipTap Π΄Π»Ρ rich-text ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- Framework: Laravel 12.x
- PHP: 8.4
- Database: PostgreSQL
- Authentication: Laravel Sanctum
- Package: Compoships Π΄Π»Ρ ΡΠΎΡΡΠ°Π²Π½ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ
- Framework: Vue.js 3.5
- Build Tool: Vite 6.x
- State Management: Pinia 3.x
- Routing: Vue Router 4.x
- Editor: TipTap 2.x
- Styles: SCSS
- Icons: Font Awesome
- Additional: Swiper.js, Lodash, Advanced Cropper, Draggable
- Containerization: Docker & Docker Compose
- Web Server: Nginx
- Mail: MailHog Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ
- Docker
- Docker Compose
- Git
# ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
git clone https://github.com/scottwalker87/wooj.git
cd wooj
# Π‘ΠΎΠ·Π΄Π°ΡΡ .env ΡΠ°ΠΉΠ» Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ .env.example
cp api/.env.example api/.env
# ΠΠ°ΡΡΡΠΎΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π² .env
vim api/.env
# ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
docker-compose up -d
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ backend
docker-compose exec api composer install
# ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ
docker-compose exec api php artisan migrate
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ frontend
docker-compose exec front npm install
# ΠΠ°ΠΏΡΡΡΠΈΡΡ dev ΡΠ΅ΡΠ²Π΅Ρ frontend
docker-compose exec front npm run dev- Frontend (dev): http://localhost:5173
- Frontend (build): http://localhost:8080
- API: http://localhost:7070
- MailHog: http://localhost:8025
- Database: localhost:5432
- users: ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ
- woojs: ΠΠ°ΠΌΠ΅ΡΠΊΠΈ (Π²ΡΠ΄ΠΆΠΈ)
- topics: Π’ΠΎΠΏΠΈΠΊΠΈ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ
- woojs_topics: Π‘Π²ΡΠ·Ρ Π·Π°ΠΌΠ΅ΡΠΎΠΊ ΠΈ ΡΠΎΠΏΠΈΠΊΠΎΠ²
pinned- ΠΠ°ΠΊΡΠ΅ΠΏΠ»Π΅Π½Π½ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠΊΠΈpublic- ΠΡΠ±Π»ΠΈΡΠ½ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠΊΠΈcustom- ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΠΎΠΏΠΈΠΊΠΈ
POST /api/register # Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ
POST /api/login # ΠΡ
ΠΎΠ΄
POST /api/logout # ΠΡΡ
ΠΎΠ΄
GET /api/check # ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ
POST /api/resend # ΠΠΎΠ²ΡΠΎΡΠ½Π°Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΠΏΠΈΡΡΠΌΠ°
GET /api/woojs # Π‘ΠΏΠΈΡΠΎΠΊ Π·Π°ΠΌΠ΅ΡΠΎΠΊ
POST /api/woojs # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅ΡΠΊΠΈ
GET /api/woojs/{id} # ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅ΡΠΊΠΈ
PUT /api/woojs/{id} # ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅ΡΠΊΠΈ
DELETE /api/woojs/{id} # Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π² ΠΊΠΎΡΠ·ΠΈΠ½Ρ
PUT /api/woojs/{id}/restore # ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅
PUT /api/woojs/{id}/pin # ΠΠ°ΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅
PUT /api/woojs/{id}/unpin # ΠΡΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅
GET /api/topics # Π‘ΠΏΠΈΡΠΎΠΊ ΡΠΎΠΏΠΈΠΊΠΎΠ²
POST /api/topics # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΏΠΈΠΊΠ°
PUT /api/topics/{id} # ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΏΠΈΠΊΠ°
DELETE /api/topics/{id} # Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΏΠΈΠΊΠ°
PUT /api/topics/{id}/sort # Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΌΠ΅ΡΠΎΠΊ
- ΠΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
- ΠΠ΄Π°ΠΏΡΠΈΠ²Π½Π°Ρ Π²Π΅ΡΡΡΠΊΠ° Π΄Π»Ρ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²
- ΠΠ½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΈ ΠΏΠ»Π°Π²Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ
- ΠΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅ΡΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠΏΠΈΠΊΠ°ΠΌΠΈ
- ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π·Π°ΠΌΠ΅ΡΠΎΠΊ Π²Π½ΡΡΡΠΈ ΡΠΎΠΏΠΈΠΊΠ°
- ΠΠΈΠ·ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΠ±ΡΠ°ΡΠ½Π°Ρ ΡΠ²ΡΠ·Ρ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΠΈ
# ΠΠΎΠΉΡΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ API
docker-compose exec api bash
# Artisan ΠΊΠΎΠΌΠ°Π½Π΄Ρ
php artisan migrate
php artisan tinker
php artisan make:model ModelName
php artisan make:controller ControllerName
# Composer
composer install
composer update# ΠΠΎΠΉΡΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Frontend
docker-compose exec front bash
# NPM ΠΊΠΎΠΌΠ°Π½Π΄Ρ
npm run dev # ΠΠ°ΠΏΡΡΠΊ dev ΡΠ΅ΡΠ²Π΅ΡΠ°
npm run build # Π‘Π±ΠΎΡΠΊΠ° Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°
npm run preview # ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΌΠΎΡΡ ΡΠ±ΠΎΡΠΊΠΈ
npm run format # Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°ΠΡΠΎΠ΅ΠΊΡ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ MIT License.