keyboard_tabSkip to content
listVue Firebase Masterclass

ทำหน้า Order Management

สารบัญ

ทำ stores/admin/order.js สำหรับลองส่งข้อมูลระหว่างหน้า

เพิ่ม store สำหรับจำลองการมีข้อมูล order

สิ่งที่จะทำ

  • เพิ่ม state list สำหรับเก็บ order ตัวอย่างเอาไว้ และ field ตัวอย่างของข้อมูล order และ list product ใน order (ตาม code ด้านล่าง)
  • เพิ่ม action อันเดียวคือ getOrder (index) โดยได้ order ของ index นั้นออกมา
javascript
import { defineStore } from 'pinia'

export const useOrderStore = defineStore('order', {
  state: () => ({
    list: [{
      no: 'A112234',
      customerName: 'นายทดสอบ นะ',
      totalPrice: '25,000',
      status: 'Payment Completed',
      address: '111/892 Nonthaburi Thailand 99999',
      paymentMethod: 'Credit card',
      updatedAt: '9/15/2023, 11:50:24 PM',
      products: [{
        name: 'ทดสอบ',
        description: 'รายละเอียดสินค้า 1',
        imageUrl: 'https://fastly.picsum.photos/id/928/200/200.jpg?hmac=5MQxbf-ANcu87ZaOn5sOEObpZ9PpJfrOImdC7yOkBlg',
        quantity: 1,
        price: '13,000'
      },
      {
        name: 'ทดสอบ 2',
        description: 'รายละเอียดสินค้า 2',
        imageUrl: 'https://fastly.picsum.photos/id/59/200/200.jpg?hmac=q9DbuoFh1L_NWnGk3AGdzuEOlg5bBW4JmBSgWmQdT74',
        quantity: 1,
        price: '12,000'
      }]
    }]
  }),
  actions: {
    getOrder (index) {
      return this.list[index]
    }
  }
})

เพิ่ม router order

เพิ่ม path สำหรับ file order ListView, DetailView

javascript
import AdminOrderList from '@/views/admin/order/ListView.vue'
import AdminOrderDetail from '@/views/admin/order/DetailView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/admin/orders',
      name: 'admin-orders',
      component: AdminOrderList
    },
    {
      path: '/admin/orders/:id',
      name: 'admin-order-detail',
      component: AdminOrderDetail
    }
  ]
})

ทำ order/ListView.vue

ทำหน้าสำหรับแสดง order ทั้งหมดออกมา

สิ่งที่จะทำ

  • แต่ง UI ตารางสำหรับใส่ข้อมูล customer name, price (ราคารวม), status, updated at
  • ดึงข้อมูลจาก order store มาแสดง
  • เพิ่มปุ่ม "See detail" โดยเมื่อกดสามารถเข้าไปดู รายละเอียดของ order ได้
html
<script setup>
import { useOrderStore } from '@/stores/admin/order'
import { RouterLink } from 'vue-router'

import AdminLayout from '@/layouts/AdminLayout.vue'

const orderStore = useOrderStore()
</script>

<template>
  <AdminLayout>
    <div class="flex-1  pt-8 px-6 bg-base-100">
      <div class="card w-full p-6 mt-2">
        <div class="text-xl font-semibold inline-block">
          Order
        </div>
        <div class="divider mt-2"></div>
        <div class="h-full w-full pb-6 bg-base-100">
          <div class="overflow-x-auto w-full">
            <table class="table w-full">
              <thead>
                <tr>
                  <th>Customer Name</th>
                  <th>Price</th>
                  <th>Status</th>
                  <th>Updated At</th>
                  <th></th>
                </tr>
              </thead>
              <tbody>
                <tr v-for="(order, index) in orderStore.list" :key="index">
                  <td>
                    <div class="font-bold">
                      {{ order.customerName }}
                    </div>
                  </td>
                  <td>{{ order.totalPrice }} ฿</td>
                  <td>
                    <div class="badge">
                      {{ order.status }}
                    </div>
                  </td>
                  <td>{{ order.updatedAt }}</td>
                  <td>
                    <RouterLink :to="{ name: 'admin-order-detail', params: { id: index }}">
                      <button class="btn">
                        See detail
                      </button>
                    </RouterLink>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
      </div>
    </div>
  </AdminLayout>
</template>

ผลลัพธ์

order-01

ทำ order/DetailView.vue

ทำหน้าสำหรับแสดงรายละเอียด Order

สิ่งที่จะทำ

  • สร้าง UI style ที่มี field order ทั้งหมดออกมา โดยข้อมูลจะประกอบด้วย
    • ข้อมูลหลักของ Order (Order date, Order number, Payment method, Address)
    • รายละเอียดสินค้าที่สั่งไป
    • ราคารวมสินค้าทั้งหมด
html
<script setup>
import { onMounted , ref, reactive } from 'vue'
import { useRoute } from 'vue-router'
import { useOrderStore } from '@/stores/admin/order'

import AdminLayout from '@/layouts/AdminLayout.vue'

const route = useRoute()
const orderStore = useOrderStore()

const orderId = ref(-1)
let orderData = reactive({
  products: []
})

onMounted(() => {
  if (route.params.id) {
    orderId.value = route.params.id
    orderData = orderStore.getOrder(orderId.value)
  }
})
</script>

<template>
  <AdminLayout>
    <div class="flex pt-8 px-6">
      <div class="card w-full p-6 bg-base-100 shadow-xl">
        <div>
          <h1 class="text-3xl font-bold">Order detail id: {{ orderId }}</h1>
        </div>
        <div class="divider"></div>
        <div class="flex mb-2">
          <div class="flex-1">
            <div class="font-bold">Order date</div>
            <div>{{ orderData.updatedAt }}</div>
          </div>
          <div class="flex-1">
            <div class="font-bold">Order Number</div>
            <div>{{ orderData.no }}</div>
          </div>
        </div>
        <div class="flex">
          <div class="flex-1">
            <div class="font-bold">Payment method</div>
            <div>{{ orderData.paymentMethod }}</div>
          </div>
          <div class="flex-1">
            <div class="font-bold">Address</div>
            <div>{{ orderData.address }}</div>
          </div>
        </div>
        <div class="divider"></div>
        <div v-for="(product, index) in orderData.products" class="flex items-center my-2" :key="index">
          <div>
            <img
              class="w-24"
              :src="product.imageUrl"
            />
          </div>
          <div class="flex-1 ml-4">
            <div class="font-bold">{{ product.name }}</div>
            <div>{{ product.description }}</div>
          </div>
          <div class="flex-1">จำนวน {{ product.quantity }} ชิ้น</div>
          <div>{{ product.price }} ฿</div>
        </div>
        <div class="divider"></div>
        <div class="flex align-middle justify-between mb-2">
          <div class="font-bold">ราคาสินค้าทั้งหมด</div>
          <div>{{ orderData.totalPrice }} ฿</div>
        </div>
        <div class="flex justify-end">
          <RouterLink to="/admin/orders" class="btn btn-ghost">
            Back
          </RouterLink>
        </div>
      </div>
    </div>
  </AdminLayout>
</template>

ผลลัพธ์

order-02