Không có nền tảng nào có thể giúp giải mọi bài toán, nhưng chúng ta có thể loại bỏ các bước lặp đi lặp lại, đưa người dùng vào trung tâm phát triển, giúp việc xây dựng phần mềm quản lý chỉ còn vài ngày, thậm chí vài giờ.
GPortal được sinh ra với mục tiêu giúp doanh nghiệp xây dựng phần mềm quản lý nhanh chóng – gọn nhẹ – dễ tích hợp AI – và hầu như không cần viết code.
GPortal cũng tích hợp toàn diện với nền tảng tự động hoá N8N, giúp việc xây dựng workflow trở nên đơn giản và mạnh mẽ.
Hầu hết phần mềm quản lý đều xoay quanh việc tạo – sửa – xoá – tìm kiếm các đối tượng quản lý (entity) khác nhau.
Ví dụ:
Các đối tượng quản lý này đều có các logic khác nhau.
Ví dụ:
Vậy, nếu chúng ta có giao diện đầy đủ để tuỳ chỉnh (config) các đối tượng quản lý (entity), ta hoàn toàn có thể loại bỏ các bước lập trình, xây dựng database, API...
Tương ứng, chúng ta sẽ cần 4 bước để có phần mềm quản lý cho riêng bạn
📷 Các bước thực hiện trên GPortal:

📷 Nhập liệu, tìm kiếm đối tượng quản lý:

📷 Xây dựng workflow:

📷 (Trường hợp nâng cao) Tạo thêm trang quản lý:

📷 (Trường hợp nâng cao) Tạo thêm trang quản lý Với AI:

Chúng tôi không tạo ra bất kỳ kiến trúc hay design pattern mới.
Điều chúng tôi làm là giúp bạn áp dụng những cấu trúc quen thuộc một cách dễ dàng hơn, trực quan hơn.
| Thuật ngữ | Giải thích |
|---|---|
| Entity (Đối tượng quản lý) | Là loại dữ liệu bạn muốn quản lý. Ví dụ: sản phẩm, khách hàng, nhân viên. Tương tự như một bảng trong database. |
| Attribute / Field (Thuộc tính) | Thông tin cụ thể của entity. Ví dụ: name, email, birthDay. "Field" và "Attribute" có nghĩa giống nhau. |
| Field Type (Kiểu dữ liệu) | Xác định dạng dữ liệu của thuộc tính: string, number, date, enum, reference, embedded document, v.v. |
| Validation (Kiểm tra hợp lệ) | Hàm kiểm tra dữ liệu trước khi lưu. Trả về true/false. Ví dụ: email phải có "@", số lượng > 0. |
| Computation (Tính toán tự động) | Hàm tự động sinh ra giá trị dựa trên các thuộc tính khác. Ví dụ: tạo mã nhân viên từ name + birthDay. |
| Workflow (Luồng tự động hoá) | Các hành động tự động xảy ra khi có sự kiện. Ví dụ: kiểm tra tồn kho, gửi email, tạo công việc tiếp theo. |
| Required (Bắt buộc nhập) | Thuộc tính không được phép bỏ trống khi nhập dữ liệu. |
| Function (Hàm) | Đoạn mã JavaScript được sử dụng trong Validation hoặc Computation để xử lý logic tuỳ chỉnh. |
Entity Configuration là nơi dùng để tuỳ chỉnh các đối tượng, bao gồm:
📷 Entity config overview:

Giả sử bạn muốn quản lý thông tin thành viên nhóm (teamMember) với 3 thuộc tính:
Bạn chỉ cần mở trang Config Entity và khai báo các field.
📹 Video tạo teamMember:

Sau khi cấu hình, bạn có thể:
📹 Video nhập liệu:

Mỗi đối tượng (entity) đều chứa một tập thuộc tính (field), và với mỗi thuộc tính, bạn có thể thiết lập:
| Thuộc tính | Giải thích |
|---|---|
| Field name | Tên thuộc tính, được sử dụng trong hệ thống và API. |
| View name | Tên hiển thị cho người dùng trong giao diện. |
| Description | Mô tả ý nghĩa hoặc mục đích của thuộc tính. |
| Field type | Kiểu dữ liệu của thuộc tính (string, number, date, enum, reference, v.v.). |
| Required | Xác định thuộc tính có bắt buộc nhập hay không. |
| Use Validation | Cho biết thuộc tính có sử dụng hàm kiểm tra hợp lệ (validation function) hay không. |
| Read Only | Thuộc tính chỉ được xem, không thể chỉnh sửa. |
| System Field | Thuộc tính đặc biệt của hệ thống, không thể xoá và đôi khi không thể sửa. |
📷 Ảnh giao diện:

📹 Validation – Hàm được thực thi để xác định giá trị có hợp lệ hay không:

📹 Computation – Hàm được thực thi để tính toán ra giá trị:

Mỗi thuộc tính đều có thể tuỳ chỉnh kiểu dữ liệu, đảm bảo tính chặt chẽ và tối ưu trong quản lý dữ liệu.
| Kiểu | Mô tả | Ví dụ |
|---|---|---|
| string | Chuỗi ký tự | "Nguyễn Văn A", "Active" |
| number | Số | 25, 1200000 |
| date | Ngày/giờ ISO 8601 | "2025-11-23T10:30:00Z" |
| richText | Chuỗi ký tự dài, HTML | dùng cho các đoạn văn bản dài, markdown hoặc HTML |
📹 Field types supported:

Tương tự lập trình, GPortal hỗ trợ các kiểu dữ liệu sau:
| Kiểu | Mô tả | Ví dụ |
|---|---|---|
| enum | Danh sách giá trị cố định | "status": "Active" với tập giá trị ["Active", "Inactive", "Pending"] |
| reference | Liên kết đến entity khác | "customerId": "CUS-00123" trỏ đến entity Customer |
| array reference | Liên kết nhiều entity | "tagIds": ["TAG-1", "TAG-2"] |
| embedded document | Object nhiều thuộc tính | "address": { "street": "12 Lê Lợi", "city": "Huế" } |
| array embedded documents | Danh sách object | "items": [ { "name": "SP A", "qty": 2 }, { "name": "SP B", "qty": 1 } ] |
Dùng để chứa một tập hằng số.
Enum gồm: key – name – color.
Giả sử cần tạo thuộc tính role để xác định vai trò của thành viên: junior, senior, leader.
Cách thiết lập:
📹 Demo:

Dùng để chứa key trỏ đến một entity khác.
Ví dụ: cần thêm thuộc tính team để biết thành viên thuộc team nào.
Cách thiết lập:
📹 Demo:

Dùng để chứa một tập key, trỏ đến nhiều entity khác.
Ví dụ: tạo thuộc tính projects để biết thành viên tham gia các dự án nào.
Cách thiết lập:
📹 Demo:

Dùng để lưu object.
Ví dụ: thuộc tính address gồm street và city.
Cách thiết lập:
📹 Demo:

Dùng để lưu danh sách object.
Ví dụ: thuộc tính workHistory để lưu quá trình làm việc.
Cách thiết lập:
📹 Demo:
(updating)
Hệ thống cho phép khai báo hàm kiểm tra và tính toán tự động khi dữ liệu thay đổi.
Ví dụ
Custom validation là hàm chạy mỗi khi dữ liệu thay đổi.
Hàm phải trả về:
Ví dụ: kiểm tra email có chứa ký tự @.
Cách dùng:
📹 Demo:

Computation chạy khi giá trị của các thuộc tính phụ thuộc (dependencies) thay đổi.
Ví dụ: tạo thuộc tính code = name + birthDay.
Cách dùng:
📹 Demo:

Mỗi entity khi lưu trữ sẽ được bao bọc trong một cấu trúc chuẩn, gồm:
{
"name": "Tên entity, ví dụ: teamMember",
"version": "Phiên bản schema của entity, mặc định là 0",
"value": "Object chứa toàn bộ dữ liệu (các thuộc tính) của entity"
}Giả sử entity teamMember có dữ liệu:
name: "Nguyen Van A"
email: "nguyenVanA@gmail.com"
role: "leader"Thì khi lưu trữ, hệ thống sẽ ghi:
{
"name": "teamMember",
"version": 0,
"value": {
"name": "Nguyen Van A",
"email": "nguyenVanA@gmail.com",
"role": "leader"
}
}Phần mềm quản lý hiện đại không chỉ CRUD.
Quan trọng hơn là tự động hoá vận hành.
Chúng tôi cung cấp đầy đủ node N8N để tương tác với dữ liệu GPortal.
Hỗ trợ đầy đủ CRUD, gọi API để thao tác entity.

Được sử dụng để tạo đối tượng quản lý (entity), có thể sử dụng như tool Agent.
📄 Bảng dữ liệu mô tả đối số
| Đối số | Kiểu dữ liệu | Mô tả | Hỗ trợ expression | Ví dụ |
|---|---|---|---|---|
| entityName | string | Tên đối tượng (entity) dùng để xác định loại dữ liệu cần truy vấn. Cho phép sử dụng biểu thức để lọc linh hoạt. | ✔️ | "Product*", "FAQ Guide", "/^User/" |
| entityData | object | Dữ liệu đối tượng được tạo hoặc dữ liệu dùng để lọc. Chấp nhận các biểu thức để so khớp theo thuộc tính. | ✔️ | { "status": { "$eq": "active" } }, { "category": "support" }, { "price": { "$gte": 1000 } } |
📘 Request payload tương ứng
{
"entityName": "Support*",
"entityData": {
"category": { "$eq": "guide" },
"status": { "$in": ["active", "published"] }
}
}demo:

Được sử dụng để chỉnh sửa đối tượng quản lý (entity), có thể sử dụng như tool Agent.
📄 Bảng mô tả đối số
| Đối số | Kiểu dữ liệu | Mô tả | Hỗ trợ expression |
|---|---|---|---|
| entityId | string / number / object | ID của đối tượng cần cập nhật. Có thể dùng expression để chọn nhiều ID hoặc chọn theo điều kiện. | ✔️ |
| entityData | object | Dữ liệu cần update vào đối tượng. | ❌ |
📘 Request payload tương ứng
{
"entityId": { "$in": ["101", "102", "103"] },
"entityData": {
"status": "active",
"updatedAt": "2025-01-10T10:00:00Z"
}
}demo

Được sử dụng để xoá đối tượng quản lý (entity), có thể sử dụng như tool Agent.
📄 Bảng mô tả đối số
| Đối số | Kiểu dữ liệu | Mô tả | Hỗ trợ expression |
|---|---|---|---|
| entityId | string / number / object | ID của đối tượng cần xoá. Có thể dùng expression để xoá nhiều ID hoặc xoá theo điều kiện. | ✔️ |
📘 Request payload tương ứng
{
"entityId": { "$in": ["A01", "A02", "A03"] }
}demo

Được sử dụng để tìm kiếm thông tin nhiều đối tượng quản lý, có thể sử dụng như API tool.
📄 Bảng mô tả đối số Search API
| Đối số | Kiểu dữ liệu | Mô tả | Hỗ trợ expression |
|---|---|---|---|
| searchParameters | object | Điều kiện tìm kiếm theo dạng MongoDB query object (so sánh, regex, in, range…). | ✔️ |
| limit | number | Số lượng dữ liệu cần trả về. | ❌ |
| entityName | string | Tên đối tượng (entity) cần tìm kiếm. | ✔️ |
📘 Request Payload tương ứng
{
"searchParameters": {
"status": { "$eq": "active" },
"category": { "$in": ["guide", "support"] }
},
"limit": 10,
"entityName": "SupportArticle"
}demo

Nhận tín hiệu điều khiển UI từ workflow.

Demo:
Truy vấn vector embedding phục vụ AI chatbot và semantic search.
Mỗi đối tượng, khi được tạo với lựa chọn sử dụng vector embedding, sẽ được lưu cùng với vector embedding và hỗ trợ việc semantic search (tìm kiếm theo ngữ nghĩa).
| Tham số | Kiểu dữ liệu | Bắt buộc | Mô tả chức năng |
|---|---|---|---|
| queryString | string | ✔️ | Chuỗi văn bản cần chuyển thành vector embedding để thực hiện tìm kiếm theo ngữ nghĩa. |
| limit | number | ✔️ | Số lượng kết quả tối đa cần trả về sau khi xếp hạng độ tương đồng vector. |
| numCandidates | number | ❌ | Số lượng ứng viên ban đầu để hệ thống mở rộng phạm vi tìm kiếm (dùng cho ANN search). |
| entityName | string | ❌ | Tên loại đối tượng (entity) để lọc trong kho dữ liệu. |

Demo:
