ะกะพะฒัะตะผะตะฝะฝัะน, ะผะฐัััะฐะฑะธััะตะผัะน ะธะฝัะตัะฝะตั-ะผะฐะณะฐะทะธะฝ ั REST API ะฝะฐ FastAPI ะธ SPA frontend ะฝะฐ Vue.js 3
- ะ ะฟัะพะตะบัะต
- ะกัััะบัััะฐ ะฟัะพะตะบัะฐ
- ะขะตั ะฝะพะปะพะณะธัะตัะบะธะน ััะตะบ
- ะัััััะน ััะฐัั
- ะ ะฐะทะฒะตัััะฒะฐะฝะธะต
- API ะดะพะบัะผะตะฝัะฐัะธั
- ะัั ะธัะตะบัััะฐ
FastAPI Shop - ััะพ ัะพะฒัะตะผะตะฝะฝะพะต ะฒะตะฑ-ะฟัะธะปะพะถะตะฝะธะต ะดะปั ัะปะตะบััะพะฝะฝะพะน ะบะพะผะผะตััะธะธ. ะัะพะตะบั ะดะตะผะพะฝัััะธััะตั best practices ัะฐะทัะฐะฑะพัะบะธ full-stack ะฟัะธะปะพะถะตะฝะธะน ั ัะฐะทะดะตะปะตะฝะธะตะผ backend ะธ frontend.
- ๐ ะฃะฟัะฐะฒะปะตะฝะธะต ะบะพัะทะธะฝะพะน - ะดะพะฑะฐะฒะปะตะฝะธะต, ัะดะฐะปะตะฝะธะต, ะธะทะผะตะฝะตะฝะธะต ะบะพะปะธัะตััะฒะฐ ัะพะฒะฐัะพะฒ
- ๐ฆ ะะฐัะฐะปะพะณ ัะพะฒะฐัะพะฒ - ะฟัะพัะผะพัั ัะพะฒะฐัะพะฒ ั ัะธะปัััะฐัะธะตะน ะฟะพ ะบะฐัะตะณะพัะธัะผ
- ๐ ะะตัะฐะปัะฝะฐั ะธะฝัะพัะผะฐัะธั - ะฟะพะดัะพะฑะฝัะต ัััะฐะฝะธัั ัะพะฒะฐัะพะฒ
- ๐พ ะะตััะธััะตะฝัะฝะพััั ะดะฐะฝะฝัั - ัะพั ัะฐะฝะตะฝะธะต ะบะพัะทะธะฝั ะฒ localStorage
- ๐จ ะกะพะฒัะตะผะตะฝะฝัะน UI - ะฐะดะฐะฟัะธะฒะฝัะน ะดะธะทะฐะนะฝ ะฝะฐ Tailwind CSS
- ๐ Production-ready - ะฐะฒัะพะผะฐัะธัะตัะบะธะน ะดะตะฟะปะพะน ั SSL ัะตััะธัะธะบะฐัะฐะผะธ
fastapi-shop/
โ
โโโ backend/ # Backend ัะฐััั (FastAPI)
โ โโโ app/
โ โ โโโ models/ # SQLAlchemy ะผะพะดะตะปะธ ะะ
โ โ โ โโโ category.py # ะะพะดะตะปั ะบะฐัะตะณะพัะธะน
โ โ โ โโโ product.py # ะะพะดะตะปั ัะพะฒะฐัะพะฒ
โ โ โ
โ โ โโโ schemas/ # Pydantic ัั
ะตะผั ะดะปั ะฒะฐะปะธะดะฐัะธะธ
โ โ โ โโโ cart.py # ะกั
ะตะผั ะบะพัะทะธะฝั
โ โ โ โโโ category.py # ะกั
ะตะผั ะบะฐัะตะณะพัะธะน
โ โ โ โโโ product.py # ะกั
ะตะผั ัะพะฒะฐัะพะฒ
โ โ โ
โ โ โโโ repositories/ # ะกะปะพะน ัะฐะฑะพัั ั ะะ (Repository Pattern)
โ โ โ โโโ category_repository.py
โ โ โ โโโ product_repository.py
โ โ โ
โ โ โโโ services/ # ะะธะทะฝะตั-ะปะพะณะธะบะฐ ะฟัะธะปะพะถะตะฝะธั
โ โ โ โโโ cart_service.py
โ โ โ โโโ category_service.py
โ โ โ โโโ product_service.py
โ โ โ
โ โ โโโ routes/ # API endpoints (Controllers)
โ โ โ โโโ cart.py # ะญะฝะดะฟะพะธะฝัั ะบะพัะทะธะฝั
โ โ โ โโโ categories.py # ะญะฝะดะฟะพะธะฝัั ะบะฐัะตะณะพัะธะน
โ โ โ โโโ products.py # ะญะฝะดะฟะพะธะฝัั ัะพะฒะฐัะพะฒ
โ โ โ
โ โ โโโ config.py # ะะพะฝัะธะณััะฐัะธั ะฟัะธะปะพะถะตะฝะธั
โ โ โโโ database.py # ะะฐัััะพะนะบะฐ SQLAlchemy
โ โ โโโ main.py # ะขะพัะบะฐ ะฒั
ะพะดะฐ FastAPI
โ โ
โ โโโ static/images/ # ะกัะฐัะธัะตัะบะธะต ัะฐะนะปั (ะธะทะพะฑัะฐะถะตะฝะธั)
โ โโโ Dockerfile # Docker ะพะฑัะฐะท backend
โ โโโ requirements.txt # Python ะทะฐะฒะธัะธะผะพััะธ
โ โโโ run.py # ะกะบัะธะฟั ะทะฐะฟััะบะฐ ัะตัะฒะตัะฐ
โ โโโ seed_data.py # ะะฐะฟะพะปะฝะตะฝะธะต ะะ ัะตััะพะฒัะผะธ ะดะฐะฝะฝัะผะธ
โ
โโโ frontend/ # Frontend ัะฐััั (Vue.js 3)
โ โโโ src/
โ โ โโโ components/ # Vue ะบะพะผะฟะพะฝะตะฝัั
โ โ โ โโโ CartItem.vue # ะญะปะตะผะตะฝั ะบะพัะทะธะฝั
โ โ โ โโโ CategoryFilter.vue # ะคะธะปััั ะบะฐัะตะณะพัะธะน
โ โ โ โโโ Header.vue # ะจะฐะฟะบะฐ ัะฐะนัะฐ
โ โ โ โโโ ProductCard.vue # ะะฐััะพัะบะฐ ัะพะฒะฐัะฐ
โ โ โ
โ โ โโโ views/ # ะกััะฐะฝะธัั ะฟัะธะปะพะถะตะฝะธั
โ โ โ โโโ HomePage.vue # ะะปะฐะฒะฝะฐั (ะบะฐัะฐะปะพะณ)
โ โ โ โโโ ProductDetailPage.vue # ะะตัะฐะปะธ ัะพะฒะฐัะฐ
โ โ โ โโโ CartPage.vue # ะกััะฐะฝะธัะฐ ะบะพัะทะธะฝั
โ โ โ
โ โ โโโ stores/ # Pinia stores (State Management)
โ โ โ โโโ cart.js # Store ะบะพัะทะธะฝั
โ โ โ โโโ products.js # Store ัะพะฒะฐัะพะฒ
โ โ โ
โ โ โโโ services/ # API ะบะปะธะตะฝัั
โ โ โ โโโ api.js # Axios ะบะพะฝัะธะณััะฐัะธั ะธ ะผะตัะพะดั
โ โ โ
โ โ โโโ router/ # Vue Router ะบะพะฝัะธะณััะฐัะธั
โ โ โ โโโ index.js # ะะฟัะตะดะตะปะตะฝะธะต ะผะฐัััััะพะฒ
โ โ โ
โ โ โโโ assets/ # ะกัะฐัะธัะตัะบะธะต ัะตััััั
โ โ โโโ App.vue # ะะพัะฝะตะฒะพะน ะบะพะผะฟะพะฝะตะฝั
โ โ โโโ main.js # ะขะพัะบะฐ ะฒั
ะพะดะฐ ะฟัะธะปะพะถะตะฝะธั
โ โ
โ โโโ Dockerfile # Docker ะพะฑัะฐะท frontend
โ โโโ nginx.conf # ะะพะฝัะธะณััะฐัะธั Nginx ะดะปั SPA
โ โโโ package.json # NPM ะทะฐะฒะธัะธะผะพััะธ
โ โโโ vite.config.js # ะะพะฝัะธะณััะฐัะธั Vite
โ
โโโ nginx/ # Reverse proxy ะบะพะฝัะธะณััะฐัะธั
โ โโโ nginx.conf # ะะปะฐะฒะฝะฐั ะบะพะฝัะธะณััะฐัะธั Nginx
โ
โโโ docker-compose.yml # ะัะบะตัััะฐัะธั Docker ะบะพะฝัะตะนะฝะตัะพะฒ
โโโ deploy.sh # ะกะบัะธะฟั ะฐะฒัะพะผะฐัะธัะตัะบะพะณะพ ะดะตะฟะปะพั
โโโ README.md # ะะพะบัะผะตะฝัะฐัะธั ะฟัะพะตะบัะฐ
| ะะพะผะฟะพะฝะตะฝั | ะะฐะทะฝะฐัะตะฝะธะต |
|---|---|
| models/ | SQLAlchemy ะผะพะดะตะปะธ ะดะปั ัะฐะฑะพัั ั ะะ (ORM) |
| schemas/ | Pydantic ัั ะตะผั ะดะปั ะฒะฐะปะธะดะฐัะธะธ ะฒั ะพะดััะธั /ะธัั ะพะดััะธั ะดะฐะฝะฝัั |
| repositories/ | ะะฝะบะฐะฟััะปััะธั ะปะพะณะธะบะธ ัะฐะฑะพัั ั ะะ (Repository Pattern) |
| services/ | ะะธะทะฝะตั-ะปะพะณะธะบะฐ ะฟัะธะปะพะถะตะฝะธั (Service Layer) |
| routes/ | HTTP endpoints ะธ ะผะฐัััััะธะทะฐัะธั (Controllers) |
| config.py | ะะฐัััะพะนะบะธ ะฟัะธะปะพะถะตะฝะธั (CORS, DB, ะฟััะธ) |
| database.py | ะะพะฝัะธะณััะฐัะธั SQLAlchemy ะธ ัะฟัะฐะฒะปะตะฝะธะต ัะตััะธัะผะธ |
| main.py | ะะฝะธัะธะฐะปะธะทะฐัะธั FastAPI, ะฟะพะดะบะปััะตะฝะธะต middleware ะธ ัะพััะตัะพะฒ |
| ะะพะผะฟะพะฝะตะฝั | ะะฐะทะฝะฐัะตะฝะธะต |
|---|---|
| components/ | ะะตัะตะธัะฟะพะปัะทัะตะผัะต UI ะบะพะผะฟะพะฝะตะฝัั |
| views/ | ะกััะฐะฝะธัั ะฟัะธะปะพะถะตะฝะธั (ัะพััะธะฝะณ) |
| stores/ | ะะปะพะฑะฐะปัะฝะพะต ัะพััะพัะฝะธะต ะฟัะธะปะพะถะตะฝะธั (Pinia) |
| services/ | HTTP ะบะปะธะตะฝั ะดะปั ะฒะทะฐะธะผะพะดะตะนััะฒะธั ั API |
| router/ | ะะพะฝัะธะณััะฐัะธั ะผะฐัััััะธะทะฐัะธะธ (Vue Router) |
- FastAPI 0.119.0 - ัะพะฒัะตะผะตะฝะฝัะน, ะฑัััััะน web-framework
- SQLAlchemy 2.0.44 - ORM ะดะปั ัะฐะฑะพัั ั ะฑะฐะทะพะน ะดะฐะฝะฝัั
- Pydantic 2.12.1 - ะฒะฐะปะธะดะฐัะธั ะดะฐะฝะฝัั ะธ ะฝะฐัััะพะตะบ
- SQLite - ะปะตะณะบะพะฒะตัะฝะฐั ัะตะปััะธะพะฝะฝะฐั ะกะฃะะ
- Uvicorn - ASGI ัะตัะฒะตั ะดะปั production
- Vue.js 3.5.22 - ะฟัะพะณัะตััะธะฒะฝัะน JavaScript ััะตะนะผะฒะพัะบ
- Pinia 3.0.3 - ะพัะธัะธะฐะปัะฝัะน state management ะดะปั Vue 3
- Vue Router 4.5.1 - ัะพััะธะฝะณ ะดะปั SPA
- Axios 1.12.2 - HTTP ะบะปะธะตะฝั
- Tailwind CSS - utility-first CSS ััะตะนะผะฒะพัะบ
- Vite 7.1.7 - ะฑัััััะน build tool
- Docker - ะบะพะฝัะตะนะฝะตัะธะทะฐัะธั ะฟัะธะปะพะถะตะฝะธะน
- Docker Compose - ะพัะบะตัััะฐัะธั multi-container ะฟัะธะปะพะถะตะฝะธะน
- Nginx - reverse proxy ะธ ะฒะตะฑ-ัะตัะฒะตั
- Let's Encrypt - ะฑะตัะฟะปะฐัะฝัะต SSL ัะตััะธัะธะบะฐัั
- Certbot - ะฐะฒัะพะผะฐัะธัะตัะบะพะต ะพะฑะฝะพะฒะปะตะฝะธะต ัะตััะธัะธะบะฐัะพะฒ
- Python 3.11+
- Node.js 20+
- npm/yarn
- Git
git clone https://github.com/yourusername/fastapi-shop.git
cd fastapi-shop# ะะตัะตั
ะพะด ะฒ ะดะธัะตะบัะพัะธั backend
cd backend
# ะกะพะทะดะฐะฝะธะต ะฒะธัััะฐะปัะฝะพะณะพ ะพะบััะถะตะฝะธั
python -m venv venv
source venv/bin/activate # Linux/Mac
# ะธะปะธ
venv\Scripts\activate # Windows
# ะฃััะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพััะตะน
pip install -r requirements.txt
# ะะฐะฟะพะปะฝะตะฝะธะต ะฑะฐะทั ะดะฐะฝะฝัั
ัะตััะพะฒัะผะธ ะดะฐะฝะฝัะผะธ
python seed_data.py
# ะะฐะฟััะบ ัะตัะฒะตัะฐ ัะฐะทัะฐะฑะพัะบะธ
python run.pyBackend ะฑัะดะตั ะดะพัััะฟะตะฝ ะฟะพ ะฐะดัะตัั: http://localhost:8000 API ะดะพะบัะผะตะฝัะฐัะธั (Swagger UI): http://localhost:8000/api/docs
# ะะตัะตั
ะพะด ะฒ ะดะธัะตะบัะพัะธั frontend (ะฝะพะฒัะน ัะตัะผะธะฝะฐะป)
cd frontend
# ะฃััะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพััะตะน
npm install
# ะะฐะฟััะบ dev ัะตัะฒะตัะฐ
npm run devFrontend ะฑัะดะตั ะดะพัััะฟะตะฝ ะฟะพ ะฐะดัะตัั: http://localhost:5173
ะัะพะตะบั ะฒะบะปััะฐะตั ะฟะพะปะฝะพัััั ะฐะฒัะพะผะฐัะธะทะธัะพะฒะฐะฝะฝัะน ัะบัะธะฟั ัะฐะทะฒะตัััะฒะฐะฝะธั ะฝะฐ production ัะตัะฒะตั ั Ubuntu.
โ ะะฑะฝะพะฒะปัะตั ัะธััะตะผั Ubuntu โ ะฃััะฐะฝะฐะฒะปะธะฒะฐะตั Docker ะธ Docker Compose โ ะฃััะฐะฝะฐะฒะปะธะฒะฐะตั Certbot ะดะปั SSL โ ะะพะปััะฐะตั SSL ัะตััะธัะธะบะฐัั ะพั Let's Encrypt โ ะะฐัััะฐะธะฒะฐะตั Nginx ะบะฐะบ reverse proxy โ ะกะพะฑะธัะฐะตั ะธ ะทะฐะฟััะบะฐะตั Docker ะบะพะฝัะตะนะฝะตัั โ ะะฐะฟะพะปะฝัะตั ะฑะฐะทั ะดะฐะฝะฝัั ัะตััะพะฒัะผะธ ะดะฐะฝะฝัะผะธ โ ะะฐัััะฐะธะฒะฐะตั ะฐะฒัะพะผะฐัะธัะตัะบะพะต ะพะฑะฝะพะฒะปะตะฝะธะต SSL ัะตััะธัะธะบะฐัะพะฒ
# ะะพะดะบะปััะตะฝะธะต ะบ VPS ัะตัะฒะตัั
ssh root@your-server-ip
# ะะปะพะฝะธัะพะฒะฐะฝะธะต ัะตะฟะพะทะธัะพัะธั
git clone https://github.com/yourusername/fastapi-shop.git
cd fastapi-shopะะตัะตะด ะทะฐะฟััะบะพะผ ัะบัะธะฟัะฐ ัะฑะตะดะธัะตัั, ััะพ DNS ะทะฐะฟะธัะธ ะฒะฐัะตะณะพ ะดะพะผะตะฝะฐ ัะบะฐะทัะฒะฐัั ะฝะฐ IP ะฐะดัะตั ัะตัะฒะตัะฐ:
A ะทะฐะฟะธัั: yourdomain.com โ SERVER_IP
A ะทะฐะฟะธัั: www.yourdomain.com โ SERVER_IP
ะัะพะฒะตัะธัั ะผะพะถะฝะพ ะบะพะผะฐะฝะดะพะน:
dig yourdomain.com +short
dig www.yourdomain.com +short# ะกะดะตะปะฐัั ัะบัะธะฟั ะธัะฟะพะปะฝัะตะผัะผ
chmod +x deploy.sh
# ะะฐะฟัััะธัั ั ะฟัะฐะฒะฐะผะธ root
sudo ./deploy.shะกะบัะธะฟั ะทะฐะฟัะพัะธั ั ะฒะฐั:
- ะะพะผะตะฝ (ะฝะฐะฟัะธะผะตั:
myshop.com) - Email ะดะปั SSL (ะฝะฐะฟัะธะผะตั:
admin@myshop.com) - ะะฐะทะฒะฐะฝะธะต ะผะฐะณะฐะทะธะฝะฐ (ะฝะฐะฟัะธะผะตั:
My Awesome Shop)
ะะพัะปะต ะฒะฒะพะดะฐ ะดะฐะฝะฝัั ัะบัะธะฟั:
- ะกะพะทะดะฐัั ะบะพะฝัะธะณััะฐัะธะพะฝะฝัะต ัะฐะนะปั
- ะะพะปััะธั SSL ัะตััะธัะธะบะฐัั
- ะกะพะฑะตัะตั ะธ ะทะฐะฟัััะธั ะฒัะต ัะตัะฒะธัั
ะะพัะปะต ะทะฐะฒะตััะตะฝะธั ัะบัะธะฟัะฐ ะฒะฐั ะผะฐะณะฐะทะธะฝ ะฑัะดะตั ะดะพัััะฟะตะฝ ะฟะพ ะฐะดัะตัะฐะผ:
- ๐ ะะฐะณะฐะทะธะฝ:
https://yourdomain.com - ๐ API ะดะพะบัะผะตะฝัะฐัะธั:
https://yourdomain.com/api/docs - โ
Health check:
https://yourdomain.com/health
# ะัะต ัะตัะฒะธัั
docker compose logs -f
# ะขะพะปัะบะพ backend
docker compose logs -f backend
# ะขะพะปัะบะพ frontend
docker compose logs -f frontend
# Nginx
docker compose logs -f nginx# ะะตัะตะทะฐะฟััะบ ะฒัะตั
ะบะพะฝัะตะนะฝะตัะพะฒ
docker compose restart
# ะะตัะตะทะฐะฟััะบ ะบะพะฝะบัะตัะฝะพะณะพ ัะตัะฒะธัะฐ
docker compose restart backend# ะััะฐะฝะพะฒะธัั ะฒัะต ะบะพะฝัะตะนะฝะตัั
docker compose down
# ะััะฐะฝะพะฒะธัั ะธ ัะดะฐะปะธัั volumes (ะะ ะฑัะดะตั ัะดะฐะปะตะฝะฐ!)
docker compose down -v# ะะพะปััะธัั ะฟะพัะปะตะดะฝะธะต ะธะทะผะตะฝะตะฝะธั
git pull
# ะะตัะตัะพะฑัะฐัั ะธ ะฟะตัะตะทะฐะฟัััะธัั ะบะพะฝัะตะนะฝะตัั
docker compose up -d --build# ะกะพะทะดะฐัั backup ะฑะฐะทั ะดะฐะฝะฝัั
docker compose exec backend cp /app/shop.db /app/backup_shop.db
# ะกะบะพะฟะธัะพะฒะฐัั ะฝะฐ ั
ะพัั ะผะฐัะธะฝั
docker cp fashop_backend:/app/backup_shop.db ./backup_shop.dbะกะตััะธัะธะบะฐัั ะฐะฒัะพะผะฐัะธัะตัะบะธ ะพะฑะฝะพะฒะปััััั ัะตัะตะท ะบะพะฝัะตะนะฝะตั certbot ะบะฐะถะดัะต 12 ัะฐัะพะฒ.
ะ ััะฝะพะต ะพะฑะฝะพะฒะปะตะฝะธะต:
docker compose restart certbotะัะพะฒะตัะบะฐ ััะพะบะฐ ะดะตะนััะฒะธั:
sudo certbot certificates| ะะตัะพะด | Endpoint | ะะฟะธัะฐะฝะธะต |
|---|---|---|
| GET | /api/products |
ะะพะปััะธัั ะฒัะต ัะพะฒะฐัั |
| GET | /api/products/{id} |
ะะพะปััะธัั ัะพะฒะฐั ะฟะพ ID |
| GET | /api/products/category/{category_id} |
ะขะพะฒะฐัั ะฟะพ ะบะฐัะตะณะพัะธะธ |
| ะะตัะพะด | Endpoint | ะะฟะธัะฐะฝะธะต |
|---|---|---|
| GET | /api/categories |
ะะพะปััะธัั ะฒัะต ะบะฐัะตะณะพัะธะธ |
| GET | /api/categories/{id} |
ะะพะปััะธัั ะบะฐัะตะณะพัะธั ะฟะพ ID |
| ะะตัะพะด | Endpoint | ะะฟะธัะฐะฝะธะต |
|---|---|---|
| POST | /api/cart/add |
ะะพะฑะฐะฒะธัั ัะพะฒะฐั ะฒ ะบะพัะทะธะฝั |
| POST | /api/cart |
ะะพะปััะธัั ัะพะดะตัะถะธะผะพะต ะบะพัะทะธะฝั |
| PUT | /api/cart/update |
ะะฑะฝะพะฒะธัั ะบะพะปะธัะตััะฒะพ ัะพะฒะฐัะฐ |
| DELETE | /api/cart/remove/{id} |
ะฃะดะฐะปะธัั ัะพะฒะฐั ะธะท ะบะพัะทะธะฝั |
curl -X GET "http://localhost:8000/api/products"ะัะฒะตั:
{
"products": [
{
"id": 1,
"name": "Wireless Headphones",
"description": "High-quality wireless headphones...",
"price": 299.99,
"category_id": 1,
"image_url": "https://...",
"created_at": "2024-01-15T10:30:00",
"category": {
"id": 1,
"name": "Electronics",
"slug": "electronics"
}
}
],
"total": 13
}curl -X POST "http://localhost:8000/api/cart/add" \
-H "Content-Type: application/json" \
-d '{
"product_id": 1,
"quantity": 2,
"cart": {}
}'ะัะฒะตั:
{
"cart": {
"1": 2
}
}ะะพะปะฝะฐั ะดะพะบัะผะตะฝัะฐัะธั API ั ะธะฝัะตัะฐะบัะธะฒะฝัะผะธ ะฟัะธะผะตัะฐะผะธ ะดะพัััะฟะฝะฐ ะฟะพ ะฐะดัะตัั: http://localhost:8000/api/docs (Swagger UI)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ API Layer (Routes) โ โ HTTP Endpoints
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Service Layer (Services) โ โ Business Logic
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Repository Layer (Repositories) โ โ Data Access
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Database Layer (SQLAlchemy) โ โ ORM
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ะัะตะธะผััะตััะฒะฐ ะฟะพะดั ะพะดะฐ:
- โ ะ ะฐะทะดะตะปะตะฝะธะต ะพัะฒะตัััะฒะตะฝะฝะพััะธ (Separation of Concerns)
- โ ะะตะณะบะพะต ัะตััะธัะพะฒะฐะฝะธะต ะบะฐะถะดะพะณะพ ัะปะพั
- โ ะะพะทะผะพะถะฝะพััั ะทะฐะผะตะฝั ะบะพะผะฟะพะฝะตะฝัะพะฒ ะฑะตะท ะธะทะผะตะฝะตะฝะธั ะดััะณะธั ัะปะพะตะฒ
- โ ะะฐัััะฐะฑะธััะตะผะพััั ะบะพะดะฐ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Views (Pages) โ โ Route Components
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Components โ โ Reusable UI
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Stores (Pinia) โ โ State Management
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Services (API) โ โ HTTP Client
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ
โ Vue.js โ โโโโโโ> โ Nginx โ โโโโโโ> โ FastAPI โ โโโโโโ> โ SQLite โ
โ Frontend โ <โโโโโโ โ Proxy โ <โโโโโโ โ Backend โ <โโโโโโ โ DB โ
โโโโโโโโโโโโ HTTPS โโโโโโโโโโโ HTTP โโโโโโโโโโโโ SQL โโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Docker Host โ
โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ Nginx โ โ Frontend โ โ Backend โ โ
โ โ (Port 80/443)โ โ (Vue.js) โ โ (FastAPI) โ โ
โ โโโโโโโโฌโโโโโโโโ โโโโโโโโฌโโโโโโโโ โโโโโโโโฌโโโโโโโ โ
โ โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Docker Network (fashop_network) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโ โ
โ โ Certbot โ (SSL Certificate Renewal) โ
โ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cd backend
pytestcd frontend
npm run testะะผะฟะพััะธััะนัะต ะบะพะปะปะตะบัะธั ะธะท ัะฐะนะปะฐ backend/test_commands.md