- vừa được xem lúc

Tạo Web CURD đơn giản với Nodejs + Mysql + EJS

0 0 24

Người đăng: PHẠM HOÀNG KIM

Theo Viblo Asia

Mở đầu

Trong bài viết này mình sẽ tạo web CRUD đơn giản bằng Nodejs sử dụng Mysql , Express, Ejs.

Chuẩn bị

Các bạn hãy xem bài viết này để tạo cơ sở dữ liệu cũng như tạo một dự án nodejs + express. Mình sẽ không nhắc lại để tránh mất thời gian của các bạn.

Cấu trúc thư mục

image.png

Tạo Model

Trong file bangDia.model.js ta sẽ tạo 2 class BangDiaQLBD.

"use strict";
const sql = require("../conf/db"); class BangDia { constructor(bangDia) { this.tenBangDia = bangDia?.tenBangDia; this.theLoai = bangDia?.theLoai; this.nhaSX = bangDia?.nhaSX; this.noiDung = bangDia?.noiDung; this.gia = bangDia?.gia; }
} class QLBD { static insert(bangDia, callback) { sql.query("INSERT INTO bangdia SET ?", bangDia, (err, res) => { if (err) { console.log("err", err); callback(err, null); return; } console.log("inserted:", { id: res.insertId }); callback(null, { id: res.insertId, ...bangDia, }); }); } static getById(id, callback) { sql.query(`SELECT * FROM bangdia WHERE id = ${id}`, (err, res) => { if (err) { console.log("err", err); callback(err, null); return; } if (res.length) { console.log("found: ", res[0]); callback(null, res[0]); return; } // not found with the id callback({ kind: "not_found" }, null); }); } static getAll(tenBangDia, callback) { let query = "SELECT * FROM bangdia"; if (tenBangDia) { query += ` WHERE tenBangDia LIKE '%${tenBangDia}%'`; } // nếu có truyền vào tên băng đĩa thì sẽ tìm kiếm theo tên sql.query(query, (err, res) => { if (err) { console.log("error: ", err); callback(null, err); return; } console.log("bangDia: ", res); callback(null, res); }); } static update(id, bangDia, callback) { sql.query( "UPDATE bangdia SET ? WHERE id = ?", [bangDia, id], (err, res) => { if (err) { console.log("error: ", err); callback(null, err); return; } if (res.affectedRows == 0) { // not found with the id callback({ kind: "not_found" }, null); return; } console.log("updated : ", { id: id, ...bangDia }); callback(null, { id: id, ...bangDia }); } ); } static delete(id, callback) { sql.query("DELETE FROM bangdia WHERE id = ?", id, (err, res) => { if (err) { console.log("error: ", err); callback(null, err); return; } if (res.affectedRows == 0) { // not found with the id callback({ kind: "not_found" }, null); return; } console.log("deleted with id: ", id); callback(null, res); }); }
} module.exports = { BangDia, QLBD };

Tạo Controller

Trong file bangDia.controller.js tạo class BangDiaCtrl.

"use strict";
const { BangDia, QLBD } = require("../models/bangDia.model"); class BangDiaCtrl { index(req, res) { res.locals.deleted = req.query.deleted; const tenBangDia = req.query.tenBangDia; QLBD.getAll(tenBangDia, (err, data) => { if (err) res.redirect("/500"); else res.render("bangDia/index", { bangDias: data }); }); } showFormCreate(req, res) { res.locals.status = req.query.status; res.render("bangDia/create"); } create(req, res) { if (!req.body) { res.redirect("bangDia/create?status=error"); } const newBangDia = new BangDia(req.body); QLBD.insert(newBangDia, (err, result) => { if (err) res.redirect("/bangDia/create?status=error"); else { console.log(result); res.redirect("/bangDia"); } }); } showFormEdit(req, res) { res.locals.status = req.query.status; QLBD.getById(req.params.id, (err, result) => { if (err) { if (err.kind === "not_found") { res.redirect("/404"); } else { res.redirect("/500"); } } else res.render("bangDia/edit", { bangDia: result }); }); } update(req, res) { const newBangDia = new BangDia(req.body); QLBD.update(req.params.id, newBangDia, (err, result) => { if (err) { if (err.kind === "not_found") { res.redirect("/404"); } else { res.redirect("/500"); } } else { res.redirect("/bangDia"); } }); } delete(req, res) { QLBD.delete(req.params.id, (err, result) => { if (err) { if (err.kind === "not_found") { res.redirect("/404"); } else { res.redirect("/500"); } } else res.redirect("/bangDia?deleted=true"); }); }
} module.exports = new BangDiaCtrl();

Tạo Router

Tạo file **bangDia.router.js ** .

const router = require("express").Router();
const bangDiaCtrl = require("../controllers/bangDia.controller"); module.exports = (app) => { router.get("/", bangDiaCtrl.index); router.get("/create", bangDiaCtrl.showFormCreate); router.post("/", bangDiaCtrl.create); router.get("/delete/:id", bangDiaCtrl.delete); router.put("/:id", bangDiaCtrl.update); router.get("/edit/:id",bangDiaCtrl.showFormEdit); app.use("/bangDia", router);
};

Tạo View

Tạo View index.ejs để hiển thị tất cả băng đĩa.

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="/css/index.css" /> <title>BangDia</title> </head> <body> <h1>Get All BangDia</h1> <% if (typeof deleted !=='undefined' ) { %> <%if (deleted=='true' ) { %> <div style="color: green">Deleted Successfully</div> <% } %> <br /> <% } %> <form action="/bangDia" method="get"> <input type="text" name="tenBangDia" placeholder="Enter tenBangDia" /> <button type="submit">Search</button> </form> <br /> <a href="/bangDia/create">insert</a> <br /> <table border="1" cellpadding="0" cellspacing="0"> <tr> <th>ID</th> <th>tenBangDia</th> <th>theLoai</th> <th>nhaSX</th> <th>noiDung</th> <th>gia</th> <th>Action</th> </tr> <% bangDias.forEach((item)=> { %> <tr> <td><%= item.id %></td> <td><%= item.tenBangDia %></td> <td><%= item.theLoai %></td> <td><%= item.nhaSX %></td> <td><%= item.noiDung %></td> <td><%= item.gia %></td> <td> <a href="/bangDia/edit/<%= item.id %>">Edit</a> <br /> <a href="/bangDia/delete/<%= item.id %>">Delete</a> </td> </tr> <% }) %> </table> <br /> <a href="/">back</a> <br /> </body>
</html>

Tạo view create.ejs để thêm mới băng đĩa.

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="/css/index.css" /> <title>Create BangDia</title> </head> <body> <h2>Create new BangDia</h2> <form action="/bangDia" method="post"> <label for="tenBangDia">tenBangDia</label> <input type="text" id="tenBangDia" name="tenBangDia" /> <br /> <br /> <label for="theLoai">theLoai</label> <input type="text" name="theLoai" id="theLoai" /> <br /> <br /> <label for="nhaSX">nhaSX</label> <input type="text" name="nhaSX" id="nhaSX" /> <br /><br /> <label for="noiDung">noiDung</label> <input type="text" name="noiDung" id="noiDung" /> <br /><br /> <label for="gia">gia</label> <input type="number" name="gia" id="gia" /> <br /><br /> <button type="submit">Save</button> </form> <br /> <a href="/bangDia">back</a> <br /> </body>
</html>

Tạo view edit.ejs để sửa thông tin băng đĩa.

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="/css/index.css" /> <title>Edit BangDia - <%= bangDia.tenBangDia %></title> </head> <body> <h2>Edit BangDia</h2> <form action="/bangDia/<%= bangDia.id %>" method="post"> <input name="_method" type="hidden" value="put" /> <label for="title">tenBangDia</label> <input type="text" id="tenBangDia" name="tenBangDia" value="<%= bangDia.tenBangDia %>" /> <br /> <br /> <label for="theLoai">theLoai</label> <input type="text" name="theLoai" id="theLoai" value="<%= bangDia.theLoai %>" /> <br /> <br /> <label for="nhaSX">nhaSX</label> <input type="text" name="nhaSX" id="nhaSX" value="<%= bangDia.nhaSX %>" /> <br /><br /> <br /> <label for="noiDung">noiDung</label> <input type="text" name="noiDung" id="noiDung" value="<%= bangDia.noiDung %>" /> <br /><br /> <br /> <label for="gia">gia</label> <input type="number" name="gia" id="gia" value="<%= bangDia.gia %>" /> <br /><br /> <button type="submit">Update</button> </form> <br /> <a href="/bangDia">back</a> <br /> </body>
</html>

Kết luận

Mình đã hướng dẫn xây dựng web crud đơn giản bằng nodejs các bạn có thể tham khảo sroure code tại đây.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tự build cho mình một hệ thống BADGE MARKDOWN siêu xịn xò - #1

Chào mọi người, lại là mình và cái serie "Something thú vị" của mình đây, serie tổng hợp những kiến thức mình cảm thấy thú vị ở trên google, github, bla bla... Qua đó chia sẻ những project nho nhỏ, thích hợp để mọi người làm cho vui hoặc relax hoặc giải trí. https://github.com/weebNeedWeed/custom-ba

0 0 20

- vừa được xem lúc

Node.js Tutorial: Phần 7 - Sử dụng EJS làm Template Engine trong Express

Tạo một project Express với express-generator. Cách nhanh nhất để tạo một project ExpressJS là sử dụng express-generator.

0 0 26

- vừa được xem lúc

File upload với Multer, Nodejs và Express

Khi một web client tải một tệp lên máy chủ, nó thường được gửi qua một biểu mẫu và được mã hóa dưới dạng dữ liệu multipart/form-data. Multer là một middleware cho Express và Nodejs giúp dễ dàng xử lý

0 0 99

- vừa được xem lúc

Bước đầu làm quen với NodeJS và Socket.io

Chào mọi người. Đôi điều chia sẻ trước khi đi vào nội dung chính của bài viết. Hôm nay là bài viết đầu tiên mình được viết trên Viblo.asia.

0 0 31

- vừa được xem lúc

CRUD với NodeJs, Express và MongoDB

1. Cài đặt môi trường. . B1: Tạo một thư mục dự án.

0 0 61

- vừa được xem lúc

Xây dựng app chat realtime với VueJS - NodeJS - Express - SocketIO

Mở đầu. Từ lâu mình đã ấp ủ tự mình làm được một app chat để chat với bạn bè.

0 0 126