21일오블완챌린지_vue.js와fastapi로 만드는 웹 주문 시스템
Day 9: 서버에서 주문 상태 설정 (예: 대기 중, 승인됨, 완료됨)
@thiskorea
2024. 11. 15. 07:27
오늘은 주문 데이터를 관리하기 위해 주문 상태 기능을 추가해보겠습니다. 이 기능을 통해 각 주문의 진행 상태를 추적하고, 클라이언트와 서버 간 상호작용을 보다 직관적으로 만들 수 있습니다. 예를 들어, "대기 중", "승인됨", "완료됨"과 같은 상태를 설정하여 가게 주인이 주문을 관리하기 쉽게 할 수 있습니다.
1. FastAPI에서 주문 상태 필드 추가하기
main.py에서 주문 데이터 구조에 상태 필드를 추가하고, 기본 상태를 "대기 중"으로 설정하도록 합니다.
- main.py 파일을 열고, Order 모델에 status 필드를 추가합니다.
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field
from typing import List, Optional
app = FastAPI()
# CORS 설정
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:5173"], # Vue.js가 실행 중인 포트
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 주문 데이터 구조 정의
class Order(BaseModel):
name: str
item: str
quantity: int
notes: Optional[str] = None
status: str = Field(default="대기 중") # 주문 상태 필드 추가, 기본값은 "대기 중"
# 임시로 주문을 저장할 리스트
orders: List[Order] = []
# 주문 접수 엔드포인트
@app.post("/order")
async def create_order(order: Order):
orders.append(order) # 주문 데이터를 리스트에 저장
return {"message": "Order received", "order": order}
# 모든 주문 조회 엔드포인트
@app.get("/orders")
async def get_orders():
return {"orders": orders}
- status 필드: 주문 상태를 관리하기 위한 필드로, 기본값을 "대기 중"으로 설정했습니다. 주문이 처음 생성될 때 상태는 "대기 중"으로 저장됩니다.
- create_order 엔드포인트: 주문을 리스트에 추가할 때 status 필드에 기본값인 "대기 중"이 포함되도록 합니다.
2. 주문 상태를 확인하는 API 테스트하기
FastAPI 서버를 실행한 후, /orders 엔드포인트를 통해 저장된 주문의 상태를 확인해 보세요.
uvicorn main:app --reload
- FastAPI 서버를 실행하고, http://127.0.0.1:8000/docs에 접속하여 /order와 /orders 엔드포인트를 테스트합니다.
- 주문을 생성한 후 /orders 엔드포인트를 조회하여 각 주문의 상태가 "대기 중"으로 표시되는지 확인합니다.
3. Vue 클라이언트에서 주문 상태 표시하기 (선택 사항)
Vue 클라이언트에서 주문 상태를 표시할 수도 있습니다. 이를 통해 가게 주인이 주문 상태를 쉽게 확인할 수 있습니다.
- OrderList.vue 컴포넌트 수정
- OrderList.vue 컴포넌트에 상태 필드를 추가하여 주문 상태를 화면에 표시합니다.
<template>
<div class="order-list">
<h2>주문 목록</h2>
<ul>
<li v-for="(order, index) in orders" :key="index">
{{ order.name }} - {{ order.item }} (수량: {{ order.quantity }}) - 상태: {{ order.status }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: "OrderList",
data() {
return {
orders: [],
};
},
async created() {
try {
const response = await fetch("http://127.0.0.1:8000/orders");
const data = await response.json();
this.orders = data.orders;
} catch (error) {
console.error("주문 목록을 불러오는 중 오류가 발생했습니다:", error);
}
},
};
</script>
<style scoped>
.order-list {
max-width: 400px;
margin: 20px auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}
</style>
- status 필드 표시: 주문의 상태를 {{ order.status }}로 화면에 표시하여 각 주문의 상태를 쉽게 확인할 수 있도록 합니다.
4. 오늘의 마무리
오늘은 주문 상태 필드를 추가하여 각 주문의 상태를 관리할 수 있도록 서버를 확장했습니다. 이제 주문이 "대기 중", "승인됨", "완료됨"과 같은 상태를 가질 수 있으며, 이 상태는 클라이언트에서 확인할 수 있습니다.
내일은 이 주문 상태를 업데이트할 수 있는 API 엔드포인트를 추가하여, 가게 주인이 주문 상태를 변경할 수 있는 기능을 구현해보겠습니다.