-
Day 19: 관리자 화면 개선 – 주문 관리 인터페이스 확장21일오블완챌린지_vue.js와fastapi로 만드는 웹 주문 시스템 2024. 11. 25. 06:32
오늘은 가게 주인을 위한 관리자 화면을 개선하여, 주문 데이터를 더 효율적으로 관리할 수 있는 기능을 추가합니다. 특히, 여러 주문 상태를 한눈에 볼 수 있는 테이블 기반의 관리 인터페이스를 구현하고, 정렬 및 필터링 기능을 추가합니다.
1. 관리자 화면의 UI 설계
목표
- 주문 목록 테이블: 주문 데이터를 테이블 형식으로 표시.
- 정렬 기능: 주문 상태, 상품명, 또는 고객 이름 기준으로 정렬.
- 상태별 필터링: 주문 상태에 따라 데이터를 필터링.
- 빠른 상태 변경: 주문 상태를 테이블에서 바로 변경.
2. 클라이언트 구현
AdminOrder.vue 파일 생성
src/components 폴더에 AdminOrder.vue 파일을 생성합니다.
vue코드 복사<template> <div class="container mt-5"> <h2 class="text-center mb-4">주문 관리</h2> <!-- 상태별 필터 --> <div class="mb-4 d-flex justify-content-between"> <div> <label for="statusFilter" class="form-label">상태별 필터링:</label> <select v-model="selectedStatus" id="statusFilter" class="form-select" @change="fetchOrders" > <option value="">모든 주문</option> <option value="대기 중">대기 중</option> <option value="승인됨">승인됨</option> <option value="완료됨">완료됨</option> </select> </div> <div> <label for="sortFilter" class="form-label">정렬:</label> <select v-model="sortBy" id="sortFilter" class="form-select" @change="sortOrders" > <option value="name">이름</option> <option value="item">상품명</option> <option value="status">상태</option> </select> </div> </div> <!-- 주문 목록 테이블 --> <table class="table table-striped"> <thead> <tr> <th>이름</th> <th>상품명</th> <th>수량</th> <th>상태</th> <th>작업</th> </tr> </thead> <tbody> <tr v-for="(order, index) in orders" :key="index"> <td>{{ order.name }}</td> <td>{{ order.item }}</td> <td>{{ order.quantity }}</td> <td>{{ order.status }}</td> <td> <button @click="updateStatus(order.id, '승인됨')" class="btn btn-success btn-sm me-2" > 승인 </button> <button @click="updateStatus(order.id, '완료됨')" class="btn btn-secondary btn-sm" > 완료 </button> </td> </tr> </tbody> </table> </div> </template> <script> export default { name: "AdminOrder", data() { return { orders: [], selectedStatus: "", // 필터링 상태 sortBy: "name", // 정렬 기준 }; }, methods: { async fetchOrders() { try { const query = this.selectedStatus ? `?status=${this.selectedStatus}` : ""; const response = await fetch(`http://127.0.0.1:8000/orders${query}`); const data = await response.json(); this.orders = data.orders; this.sortOrders(); } catch (error) { console.error("주문 목록을 불러오는 중 오류가 발생했습니다:", error); } }, sortOrders() { if (this.sortBy === "name") { this.orders.sort((a, b) => a.name.localeCompare(b.name)); } else if (this.sortBy === "item") { this.orders.sort((a, b) => a.item.localeCompare(b.item)); } else if (this.sortBy === "status") { this.orders.sort((a, b) => a.status.localeCompare(b.status)); } }, async updateStatus(orderId, newStatus) { try { const response = await fetch( `http://127.0.0.1:8000/order/${orderId}/status`, { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ status: newStatus }), } ); if (!response.ok) { throw new Error("상태 업데이트 중 오류가 발생했습니다."); } this.fetchOrders(); // 업데이트 후 목록 새로고침 } catch (error) { console.error("주문 상태 업데이트 중 오류가 발생했습니다:", error); } }, }, async created() { this.fetchOrders(); // 초기 데이터 로드 }, }; </script> <style scoped> .container { max-width: 800px; } </style>
3. 주요 기능 설명
- 상태 필터링: selectedStatus 값을 기준으로 특정 상태("대기 중", "승인됨", "완료됨")의 주문만 표시합니다.
- 정렬: sortBy 값을 기준으로 이름, 상품명, 또는 상태별로 주문 목록을 정렬합니다.
- 빠른 상태 변경: "승인" 또는 "완료" 버튼을 사용하여 주문 상태를 빠르게 변경할 수 있습니다.
4. 라우팅 추가
router/index.js에 관리자 화면 라우트를 추가합니다.
javascript코드 복사import { createRouter, createWebHistory } from "vue-router"; import OrderForm from "@/components/OrderForm.vue"; import OrderList from "@/components/OrderList.vue"; import AdminOrder from "@/components/AdminOrder.vue"; const routes = [ { path: "/", name: "OrderForm", component: OrderForm, }, { path: "/orders", name: "OrderList", component: OrderList, }, { path: "/admin", name: "AdminOrder", component: AdminOrder, }, ]; const router = createRouter({ history: createWebHistory(), routes, }); export default router;
5. 테스트 및 검증
테스트 시나리오
- /admin 경로로 이동하여 주문 목록이 테이블 형식으로 표시되는지 확인.
- 상태별 필터를 적용하여 주문이 올바르게 필터링되는지 확인.
- 정렬 기준을 변경하며 목록이 올바르게 정렬되는지 확인.
- 상태 변경 버튼을 클릭하여 주문 상태를 "승인됨" 또는 "완료됨"으로 변경하고, 즉시 반영되는지 확인.
오늘의 마무리
오늘은 관리자 화면을 개선하여 주문 데이터를 효율적으로 관리할 수 있는 인터페이스를 구현했습니다. 테이블 형식의 UI와 필터링 및 정렬 기능을 통해, 가게 주인이 더욱 효과적으로 주문을 관리할 수 있게 되었습니다.
내일은 이번 주 작업을 복습하며, 추가적인 최적화 및 문제 해결을 진행하겠습니다. 🚀
'21일오블완챌린지_vue.js와fastapi로 만드는 웹 주문 시스템' 카테고리의 다른 글
Day 21: 최종 리뷰와 프로젝트 마무리 (1) 2024.11.27 Day 20: 2주차 작업 복습 및 최적화 (0) 2024.11.26 Day 18: 클라이언트 측에서 주문 기록 데이터 불러오기 및 상세보기 기능 추가 (1) 2024.11.24 Day 17: 주문 기록 조회 기능 구현 – 클라이언트에서 과거 주문 데이터 확인하기 (0) 2024.11.23 Day 16: 주문 상태를 데이터베이스에서 업데이트하기 (0) 2024.11.22