ភាពខុសគ្នារវាងគំរូទំព័រស្តាទិកនិងទំព័រស្តាទិក គឺស្ថិតនៅត្រង់ថា គំរូទំព័រស្តាទិកជាពុម្ពគំរូសំរាប់បង្កើតទំព័រស្តាទិក។ នៅក្នុងគំរូទំព័រស្តាទិក មានកន្លែងជាច្រើនសំរាប់ទទួលយកទិន្នន័យដើម្បីបង្កើតជាសំណុំទិន្នន័យមួយតំណាងអោយទំព័រស្តាទិកមួយ យកទៅរក្សាទុកនៅក្នុងមូលដ្ឋានទិន្នន័យ MongoDB ។
ក្រោយពីបញ្ចូលទិន្នន័យទៅក្នុងទំរង់បែបបទនៃគំរូទំព័រស្តាទិករួចហើយ ការចុចប៊ូតុង «ចុះផ្សាយ» នឹងធ្វើអោយទិន្នន័យទាំងនោះត្រូវបញ្ជូនទៅក្បួនចុងផ្លូវឬ API Endpoint នៅក្នុងថត src/api/admin/page ។ ទិន្នន័យទាំងនោះនឹងត្រូវស្រង់យកពីសំណុំទិន្នន័យ formData ក្រោយពីបានត្រួតពិនិត្យតួនាទីរបស់អ្នកនិពន្ធថាពិតជា Admin ពិតប្រាកដមែន។
ទោះបីជាទិន្នន័យទាំងនោះត្រូវបានត្រួតពិនិត្យនៅក្នុង browser រួចម្តងហើយក៏ដោយ តែនៅលើ server ទិន្នន័យទាំងនោះនឹងត្រូវបានត្រួតពិនិត្យជាថ្មីម្តងទៀតនៅក្នុងក្បួនចុងផ្លូវឬ API Endpoint មានឈ្មោះថា create.js ។ ហើយបើទិន្នន័យទាំងនោះពិតជាត្រឹមត្រូវហើយ វានឹងត្រូវបញ្ជូនទៅបញ្ចូលនៅក្នុងមូលដ្ឋានទិន្នន័យ MongoDB បង្កើតជាទិន្នន័យនៃទំព័រស្តាទិកមួយនៅក្នុងនោះ។ បើគ្មានបញ្ហាអ្វីទេ ទិន្នន័យដែលជាទំព័រស្តាទិកនោះ នឹងត្រូវស្រង់យកមកបង្ហាញនៅផ្នែកខាងក្រោមនៃគំរូទំព័រស្តាទិក។
// src/pages/api/post/create.js
import page from "../../../../data/page.js"
export async function POST({ locals, request, redirect }){
const prisma = locals.prisma
const userAdmin = locals.userAdmin
if(userAdmin){
const data = await request.formData()
const title = data.get('title')
const content = data.get('content')
const thumb = data.get('thumb')
const datetime = data.get('datetime')
if(title && thumb && datetime){
const body = { title, content, thumb, datetime }
await page.create({ prisma, body })
}
}
return redirect("/admin/page", 302)
}
នៅក្នុងក្បួនចុងផ្លូវឬ API Endpoint ខាងលើ មានការនាំចូលក្បួនខ្នាតនៅក្នុងឯកសារ src/data/page.js យកមកប្រើប្រាស់ក្នុងការបង្កើតទិន្នន័យនៃទំព័រស្តាទិក។ គ្រប់ក្បួនខ្នាតនៅក្នុងគ្រប់ឯកសារនៅក្នុងថត src/data ត្រូវប្រើប្រាស់សំរាប់តែភ្ជាប់ទំនាក់ទំនងជាមួយនឹងមូលដ្ឋានទិន្នន័យ MongoDB ។
// src/data/page.js
class Page{
async count(req, query={}){
return await req.prisma.page.count(query)
}
async create(req){
const new_page = {
title: req.body.title,
content: req.body.content,
thumb: req.body.thumb,
date: req.body.datetime,
}
await req.prisma.page.create({ data: new_page })
}
async delete(req){
await req.prisma.page.delete({ where: {id: req.params.id } })
}
async getItems(req, amount){
return await req.prisma.page.findMany({
take: amount,
orderBy: [{ date: "desc" }, { id: "desc" }]
})
}
async paginate(req, amount){
const pages = await req.prisma.page.findMany({
orderBy: [{ date: "desc" }, { id: "desc" }],
skip: amount * (parseInt(req.currentPage) - 1),
take: amount
})
return pages
}
}
export default new Page()
Netlify: https://khmerweb-dynamic-blog.netlify.app/admin/page