ทำหน้า User Management
ทำ stores/admin/user.js
สำหรับลองส่งข้อมูลระหว่างหน้า
เราจะสร้าง store สำหรับจัดการ user ออกมาก่อนโดยการสร้างไฟล์ stores/admin/user.js
สิ่งที่เราจะทำ
- เพิ่ม state list สำหรับเก็บ list user เอาไว้ (แต่เราจะไม่ใช้ localstorage เนื่องจากไม่ได้มีโจทย์ใช้งานต่อเนื่องในตอนนี้)
- เพิ่ม action
getUser (index)
ดึงข้อมูล user ตาม indexupdateUser (index, userData)
แก้ไขข้อมูล user ตาม index โดยส่ง userData ไป updateremoveUser (index)
ลบข้อมูล user ตาม index
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
list: [
{
name: 'Mike',
role: 'admin',
status: 'active',
updatedAt: '9/15/2023, 11:50:24 PM',
},
{
name: 'Test',
role: 'moderator',
status: 'inactive',
updatedAt: '9/15/2023, 11:50:24 PM',
},
{
name: 'TP',
role: 'member',
status: 'active',
updatedAt: '9/15/2023, 11:50:24 PM',
}
]
}),
actions: {
getUser (index) {
return this.list[index]
},
updateUser (index, userData) {
this.list[index].name = userData.name
this.list[index].status = userData.status
this.list[index].role = userData.role
this.list[index].updatedAt = (new Date()).toLocaleString()
},
removeUser (index) {
this.list.splice(index, 1)
}
}
})
เพิ่ม router user
เพิ่ม path สำหรับ file user ListView
, UpdateView
import AdminUserList from '@/views/admin/user/ListView.vue'
import AdminUserUpdate from '@/views/admin/user/UpdateView.vue'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/admin/users',
name: 'admin-users',
component: AdminUserList
},
{
path: '/admin/users/:id',
name: 'admin-user-update',
component: AdminUserUpdate
}
]
})
ทำ user/ListView.vue
เพิ่มหน้าแสดง user ทั้งหมดออกมาโดย
- แต่ง UI ตารางสำหรับใส่ข้อมูล user name, role, status, updated at
- โดยในหน้านี้จะมีปุ่ม 2 ปุ่มคือ
- ปุ่ม "Edit" = สำหรับไปยังหน้าแก้ไขข้อมูล user
- ปุ่ม "Enable / Disable" = สำหรับปรับ status ระหว่าง active, inactive ไปมา
- เพิ่ม function
toggleStatus
สำหรับปรับ status ปุ่ม "Enable / Disable"
<script setup>
import { useUserStore } from '@/stores/admin/user'
import { RouterLink } from 'vue-router'
import AdminLayout from '@/layouts/AdminLayout.vue'
const userStore = useUserStore()
const toggleStatus = (index) => {
const updateUser = userStore.list[index]
updateUser.status = updateUser.status === 'inactive' ? 'active' : 'inactive'
userStore.updateUser(index, updateUser)
}
</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">
User
</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>Name</th>
<th>Role</th>
<th>Status</th>
<th>Updated At</th>
<th></th>
</tr>
</thead>
<tbody>
<tr v-for="(user, index) in userStore.list" :key="index">
<td>
<div class="font-bold">{{ user.name }}</div>
</td>
<td>{{ user.role }}</td>
<td>
<div class="badge" :class="user.status === 'active' ? 'badge-success' : 'badge-ghost'">
{{ user.status }}
</div>
</td>
<td>{{ user.updatedAt }}</td>
<td>
<RouterLink :to="{ name: 'admin-user-update', params: { id: index } }">
<button class="btn">
Edit
</button>
</RouterLink>
<button @click="toggleStatus(index)" class="btn mx-2">
{{ user.status === 'active' ? 'Enable' : 'Disable' }}
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</AdminLayout>
</template>