NTM Solutions

Thứ Tư, 19 tháng 8, 2026

📘 Laravel 12 (2026) — BÀI 30 — SOFT DELETE

Ở các bài CRUD trước, khi gọi:

$user->delete();

record sẽ bị xóa khỏi database.

Ví dụ:

users
────────────────────────
id | name
1  | Nguyễn Văn A
2  | Trần Văn B
3  | Lê Văn C

Xóa User id = 2:

$user->delete();

thì record có thể biến mất hoàn toàn:

users
────────────────────────
id | name
1  | Nguyễn Văn A
3  | Lê Văn C

Trong hệ thống thực tế, cách này khá nguy hiểm.

Ví dụ Admin vô tình xóa một bài viết quan trọng. Chúng ta sẽ muốn:

🗑️ Xóa
   ↓
📦 Đưa vào Thùng rác
   ↓
♻️ Có thể khôi phục

Đây chính là Soft Delete.

Thứ Ba, 18 tháng 8, 2026

📘 Laravel 12 (2026) — BÀI 29 — SEARCH, SORT, FILTER, PAGINATION & DATATABLES

Trong các bài trước, chúng ta đã xây dựng được các chức năng CRUD cho:

  • Categories

  • Posts

  • Users

Tuy nhiên, khi dữ liệu bắt đầu nhiều lên, một bảng kiểu:

User::all();

sẽ nhanh chóng trở nên bất tiện.

Ví dụ hệ thống có 10.000 User:

  • Không thể hiển thị tất cả trên một trang.

  • Người quản trị cần tìm User theo tên/email.

  • Cần sắp xếp theo tên, ngày đăng ký...

  • Cần lọc theo Role.

  • Cần phân trang.

  • Và nếu dữ liệu lớn, nên để Database xử lý Search / Sort / Filter / Pagination thay vì tải toàn bộ dữ liệu về trình duyệt.

Trong Laravel 13, Query Builder/Eloquent hỗ trợ trực tiếp các cơ chế phân trang như paginate(), simplePaginate()cursorPaginate(). (Laravel API)

Thứ Hai, 17 tháng 8, 2026

📘 Laravel 12 (2026) — BÀI 28 — CRUD USERS TRONG LARAVEL 12 LTS

Trong các bài trước, chúng ta đã xây dựng CRUD CategoriesCRUD Posts.

Ở bài này, chúng ta tiếp tục xây dựng một chức năng rất quan trọng của Blog CMS:

👤 Quản lý người dùng — User Management

Sau bài học, trang quản trị có thể:

  • 👥 Hiển thị danh sách User

  • 🔎 Tìm kiếm User

  • 🛡️ Đổi Role

  • 🔒 Khóa / mở khóa tài khoản

  • 🔑 Reset Password

  • 🗑️ Xóa User

  • 📄 Phân trang

  • 🔗 Kết hợp với Middleware / Authorization

Chủ Nhật, 16 tháng 8, 2026
Thứ Bảy, 15 tháng 8, 2026

🥤Mục lục 10 bài thiết kế máy bán nước tự động

🥤 Bài 1 — Làm quen với máy bán nước tự động

🥤 Bài 2 — Thiết kế khung máy bán nước mini

🥤 Bài 3 — Thiết kế cơ cấu trục xoắn (Spiral Dispenser)

🥤 Bài 4 — Chọn động cơ và điều khiển bằng ESP32

🥤 Bài 5 — Điều khiển chính xác: Cảm biến và Encoder

🥤 Bài 6 — Thiết kế phần mềm điều khiển bằng State Machine

🥤 Bài 7 — Thiết kế giao diện cảm ứng cho máy bán nước

🥤 Bài 8 — Thanh toán QR cho máy bán nước tự động

🥤 Bài 9 — Quản lý kho và tự động báo hết hàng

🥤 Bài 10 — Hoàn thiện máy bán nước mini: ESP32 + Laravel + QR + Motor + Sensor



Thứ Sáu, 14 tháng 8, 2026

🥤 Bài 10 — Hoàn thiện máy bán nước mini: ESP32 + Laravel + QR + Motor + Sensor

Sau 9 bài, chúng ta đã lần lượt xây dựng:

  • Cơ cấu nhả lon.

  • Motor và driver.

  • ESP32.

  • Encoder/Sensor.

  • State Machine.

  • Màn hình cảm ứng.

  • Thanh toán QR.

  • Backend Laravel.

  • Quản lý tồn kho.

Bây giờ chúng ta ghép tất cả lại thành một hệ thống vending machine mini hoàn chỉnh.

Mục tiêu của bài này không phải làm một chiếc máy thương mại ngay lập tức.

Mục tiêu là:

Làm cho một người có thể chọn một lon nước → thanh toán → máy tự động nhả đúng một lon → cảm biến xác nhận → hệ thống cập nhật tồn kho.

Thứ Tư, 12 tháng 8, 2026

🥤 Bài 8 — Thanh toán QR cho máy bán nước tự động

Ở các bài trước, máy của chúng ta đã có:

  • ESP32 điều khiển.

  • Motor và cơ cấu trục xoắn.

  • Encoder/Hall Sensor.

  • Cảm biến phát hiện sản phẩm.

  • State Machine.

  • Giao diện cảm ứng.

Bây giờ chúng ta thêm một thành phần rất quan trọng:

Thanh toán QR.

Mục tiêu cuối cùng là:

Khách chọn Coca
        ↓
Máy tạo giao dịch
        ↓
Hiển thị QR
        ↓
Khách quét QR
        ↓
Thanh toán thành công
        ↓
Server xác nhận
        ↓
ESP32 nhận lệnh
        ↓
Nhả Coca
Thứ Hai, 10 tháng 8, 2026

🥤 Bài 7 — Thiết kế giao diện cảm ứng cho máy bán nước

Ở bài 6, chúng ta đã xây dựng State Machine cho bộ não của máy.

Bây giờ đến phần mà khách hàng nhìn thấy đầu tiên:

Giao diện người dùng (UI/UX).

Một máy bán nước có phần cơ khí rất tốt nhưng giao diện khó sử dụng thì trải nghiệm vẫn rất tệ.

Mục tiêu của chúng ta là tạo một giao diện hiện đại, đơn giản, dễ bấm, lấy cảm hứng từ phong cách giao diện Windows/Material nhưng không sao chép logo hay nhận diện thương hiệu.


1. Màn hình của máy

Phiên bản mini có thể bắt đầu với:

  • Màn hình cảm ứng 3.5–4.3 inch.

  • ESP32.

  • Độ phân giải khoảng 480×272 hoặc 800×480.

  • Giao tiếp SPI hoặc RGB tùy loại màn hình.

Nếu muốn làm giao diện đẹp hơn, có thể chọn:

ESP32 + màn hình cảm ứng 4.3 inch + LVGL

LVGL là thư viện giao diện rất phù hợp cho các thiết bị nhúng.

Chủ Nhật, 9 tháng 8, 2026

🚀Laravel 12 (2026) — Viết hàm riêng trong Laravel và chạy autoload để dùng

Laravel không có một thư mục helpers mặc định. Nếu bạn muốn tự viết sanitizeHtml() thì nên tự tạo một helper riêng.

Với project của bạn, mình khuyên:

app/
└── Helpers/
    └── helpers.php

1. Tạo file

app/Helpers/helpers.php

Ví dụ:

<?php

if (! function_exists('sanitizeHtml')) {

    function sanitizeHtml(string $html): string
    {
        // code sanitize của bạn

        return $html;
    }
}

🥤 Bài 6 — Thiết kế phần mềm điều khiển bằng State Machine

Ở bài trước, chúng ta đã có:

  • ESP32

  • Động cơ

  • Driver

  • Encoder

  • Cảm biến rơi sản phẩm

Nếu tiếp tục viết chương trình theo kiểu:

if(...)
{
    ...
}

if(...)
{
    ...
}

if(...)
{
    ...
}

Thì chỉ sau vài ngày, chương trình sẽ trở nên rất khó đọc và khó bảo trì.

Các máy bán hàng thương mại không lập trình như vậy.

Họ sử dụng một mô hình gọi là State Machine (Máy trạng thái).


Mục tiêu

Sau bài này bạn sẽ:

  • Hiểu State Machine là gì.

  • Biết cách chia chương trình thành từng trạng thái.

  • Thiết kế phần mềm giống máy bán hàng thương mại.

  • Viết bộ khung chương trình đầu tiên.

Thứ Bảy, 8 tháng 8, 2026

🚀 Laravel 12 (2026) — Bài 27 — CRUD Posts trong Laravel 12

Sau khi hoàn thành module Categories, chúng ta sẽ xây dựng chức năng quan trọng nhất của Blog CMS: quản lý bài viết (Posts).

Khác với Category chỉ có vài trường dữ liệu, Post sẽ liên kết với nhiều bảng khác nhau như Category, User, đồng thời hỗ trợ upload hình ảnh, kiểm tra dữ liệu đầu vào và hiển thị danh sách bài viết chuyên nghiệp.

Đây cũng là module có số lượng kiến thức nhiều nhất trong toàn bộ dự án.


Mục tiêu bài học

Sau bài này bạn sẽ thực hiện được:

  • CRUD bài viết

  • Upload ảnh đại diện

  • Chọn Category

  • Gán tác giả (User)

  • Validation dữ liệu

  • Hiển thị Relationship

  • Tự động tạo slug

  • Phân trang dữ liệu

🥤 Bài 5 — Điều khiển chính xác: Cảm biến và Encoder

Ở bài trước, chúng ta điều khiển động cơ bằng cách:

Quay 1 giây

↓

Dừng

Cách này hoạt động khá tốt để thử nghiệm.

Nhưng nếu muốn máy hoạt động liên tục ngoài thực tế thì không đủ chính xác.


Mục tiêu

Sau bài này bạn sẽ:

  • Hiểu vì sao không nên điều khiển bằng delay().

  • Biết Encoder là gì.

  • Biết Hall Sensor hoạt động như thế nào.

  • Chọn loại cảm biến phù hợp.

  • Điều khiển động cơ quay đúng một vòng.

Thứ Sáu, 7 tháng 8, 2026

🥤 Bài 4 — Chọn động cơ và điều khiển bằng ESP32

Sau khi đã hoàn thành phần cơ khí và hiểu nguyên lý hoạt động của trục xoắn, bước tiếp theo là lựa chọn động cơbộ điều khiển phù hợp.

Đây là phần quyết định chiếc máy của bạn có hoạt động ổn định hay không.


Mục tiêu

Sau bài này bạn sẽ:

  • Phân biệt động cơ DC, Servo và Stepper.

  • Biết loại nào phù hợp nhất cho máy bán nước.

  • Hiểu cách chọn mô-men xoắn.

  • Điều khiển một động cơ bằng ESP32.

  • Nhấn một nút và nhả đúng một lon nước.

Thứ Tư, 5 tháng 8, 2026

🚀 Laravel 12 (2026) — Bài 26 — CRUD Categories trong Laravel 12

Từ bài này chúng ta sẽ bắt đầu xây dựng dự án Blog CMS hoàn chỉnh. 

Chức năng đầu tiên là quản lý danh mục bài viết (Categories) với đầy đủ các thao tác thêm – sửa – xóa – tìm kiếm – phân trang.

Mục tiêu bài học

  • Tạo Resource Controller cho Category.

  • Xây dựng giao diện quản trị bằng Blade + Tailwind CSS.

  • Validate dữ liệu đầu vào.

  • Tìm kiếm theo tên danh mục.

  • Phân trang dữ liệu.

  • Hoàn thiện module CRUD chuẩn Laravel 12.

Thứ Ba, 4 tháng 8, 2026

🥤 Bài 2 — Thiết kế khung máy bán nước mini

Mục tiêu

Sau bài này bạn sẽ:

  • Biết cách thiết kế khung máy.

  • Hiểu kích thước của từng bộ phận.

  • Chuẩn bị sẵn để lắp động cơ ở bài sau.

Lưu ý: Chúng ta không cố gắng làm giống máy thương mại ngay từ đầu. Mục tiêu là tạo một phiên bản đơn giản, chắc chắn và dễ nâng cấp.


Cấu trúc tổng thể

Máy sẽ chia thành 3 tầng:

+---------------------------+
|  Bảng điều khiển          |
|  (Màn hình + Nút bấm)     |
+---------------------------+
|                           |
|   Kho chứa sản phẩm       |
|   4 ngăn                  |
|                           |
+---------------------------+
|   Khay nhận sản phẩm      |
+---------------------------+

Thứ Hai, 3 tháng 8, 2026

🥤 Bài 1 — Làm quen với máy bán nước tự động

Mục tiêu

Sau bài này bạn sẽ hiểu:

  • Máy bán nước hoạt động như thế nào.

  • Bên trong có những bộ phận gì.

  • Những gì chúng ta sẽ tự làm.

Không cần lập trình.

Không cần điện tử.

Chỉ cần hiểu nguyên lý.


Máy bán nước thật làm gì?

Ví dụ khách muốn mua Coca.

Quy trình diễn ra như sau:

Khách chọn số A1

↓

Máy kiểm tra thanh toán

↓

Động cơ A1 quay

↓

Lon Coca rơi xuống

↓

Cảm biến phát hiện

↓

Mở cửa lấy hàng

↓

Kết thúc

Toàn bộ quá trình chỉ khoảng 2–4 giây.

🚀 Laravel 12 (2026) — Bài 25 — Authorization trong Laravel 12

Kiểm soát quyền truy cập dữ liệu bằng Gate và Policy


Sau khi hoàn thành:

  • Bài 21 — Laravel Breeze

  • Bài 22 — Login

  • Bài 23 — Register

  • Bài 24 — Middleware

Chúng ta đã có hệ thống:

✅ Đăng ký tài khoản
✅ Đăng nhập
✅ Session Authentication
✅ Bảo vệ Route bằng Middleware

Nhưng hiện tại Laravel mới chỉ biết:

"Người này đã đăng nhập hay chưa?"

Ví dụ:

Route::middleware('auth')->group(function(){

    Route::get('/dashboard', function(){
        return view('dashboard');
    });

});

Middleware auth chỉ kiểm tra:

User có đăng nhập?
        |
        |
       Có
        |
Cho phép truy cập

Nhưng trong thực tế CMS Blog cần nhiều hơn:

Ví dụ:

User A tạo bài viết:

ID: 10
Title: Laravel 12 Tutorial
User_id: 5

User B đăng nhập.

Nếu User B truy cập:

/posts/10/edit

thì sao?

Nếu chỉ dùng:

Route::middleware('auth')

Laravel sẽ cho phép.

Vấn đề:

User B
   |
   |
   V

Sửa bài viết của User A

Đây là lỗi phân quyền.

Chủ Nhật, 2 tháng 8, 2026

🚀 Laravel 12 (2026) — Bài 24 — Middleware

Ở các bài trước, chúng ta đã cài đặt Laravel Breeze, đăng ký tài khoản và đăng nhập vào hệ thống.

Tuy nhiên, hiện tại nếu người dùng biết đường dẫn trực tiếp như:

/posts/create

hoặc:

/dashboard

thì liệu họ có thể truy cập được hay không?

Đó chính là nhiệm vụ của Middleware.

Middleware đóng vai trò như một lớp bảo vệ, kiểm tra mọi yêu cầu trước khi cho phép truy cập vào Controller hoặc Route.


Middleware là gì?

Middleware là đoạn mã nằm giữa RequestController.

Mọi yêu cầu gửi đến Laravel đều có thể đi qua một hoặc nhiều Middleware.

Sơ đồ:

Người dùng

      │

      ▼

HTTP Request

      │

      ▼

Middleware

      │

      ▼

Controller

      │

      ▼

Response

Nếu Middleware từ chối yêu cầu, Controller sẽ không được thực thi.

Phiên bản mini máy bán nước tự động

Một phiên bản mini sẽ giúp bạn học gần như toàn bộ nguyên lý của máy bán hàng tự động mà chi phí thấp hơn rất nhiều.

🚀 Laravel 12 (2026) — Bài 23 — Register

Ở bài trước, chúng ta đã tìm hiểu cách đăng nhập (Login) hoạt động trong Laravel.

Trong bài này, chúng ta sẽ tìm hiểu Register – chức năng tạo tài khoản mới cho người dùng.

Laravel Breeze đã tạo sẵn toàn bộ quy trình đăng ký, nhưng hiểu cách nó hoạt động sẽ giúp bạn dễ dàng tùy biến theo yêu cầu của từng dự án.


Register là gì?

Register là quá trình tạo một tài khoản mới.

Thông thường người dùng sẽ nhập:

  • Họ tên

  • Email

  • Mật khẩu

  • Xác nhận mật khẩu

Sau khi đăng ký thành công, Laravel sẽ:

  • Kiểm tra dữ liệu.

  • Mã hóa mật khẩu.

  • Lưu User vào Database.

  • Đăng nhập tự động.

  • Chuyển tới Dashboard.

Bài 12 — Promise trong Node.js

Thuộc phần 3: Asynchronous Programming


Mục tiêu bài học

Sau bài này, bạn sẽ hiểu:

  • Promise là gì.

  • Vì sao Promise ra đời.

  • Ba trạng thái của Promise.

  • Cách tạo Promise.

  • .then()

  • .catch()

  • .finally()

  • Promise Chaining.

  • Promise trong Node.js thực tế.

Facebook Youtube RSS