Dùng AI + m2a_v2.php để thiết kế nhanh ứng dụng AppGini từ file SQL

Bắt đầu bởi admin, T04 26, 2026, 10:23 CHIỀU

Chủ đề trước - Chủ đề tiếp theo

admin

Dùng AI + m2a_v2.php để thiết kế nhanh ứng dụng AppGini từ file SQL

Chào mọi người,

Mình muốn chia sẻ một cách làm khá nhanh để thiết kế ứng dụng AppGini bằng cách kết hợp AI, MySQL/MariaDB và phiên bản cải tiến của công cụ m2a.php, tạm gọi là m2a_v2.php.

Ý tưởng chính là:

Thay vì tạo từng table, từng field, từng lookup thủ công trong AppGini, ta dùng AI để thiết kế trước database schema chuẩn MySQL/MariaDB. Sau đó import schema vào MySQL, dùng m2a_v2.php đọc cấu trúc database và convert thành file .axp. Cuối cùng mở file .axp bằng AppGini để tiếp tục tinh chỉnh, generate code và deploy ứng dụng.

Cách này đặc biệt hữu ích khi cần dựng nhanh prototype hoặc thiết kế ứng dụng CRUD có nhiều bảng như: quản lý hóa đơn, CRM, ITSM, quản lý kho, quản lý tài sản, quản lý nhân sự, quản lý ticket nội bộ...

Quy trình tổng thể

Quy trình mình đang dùng gồm 6 bước:

  • Dùng AI tạo file SQL theo chuẩn tương thích với m2a_v2.php
  • Import file SQL vào MySQL/MariaDB qua phpMyAdmin trên WampServer
  • Chép file m2a_v2.php vào thư mục: C:\wamp64\www\
  • Mở Chrome và truy cập:  http://localhost/m2a_v2.php
  • Điền thông số kết nối MySQL, chọn database và tải về file .axp
  • Mở file .axp bằng AppGini, kiểm tra lại cấu hình, generate code và deploy ứng dụng

Mô hình hoạt động

Luồng xử lý có thể hiểu đơn giản như sau:

AI Prompt
  ↓
File SQL chuẩn MySQL/MariaDB
  ↓
Import vào MySQL qua phpMyAdmin
  ↓
m2a_v2.php đọc metadata database
  ↓
Sinh file AppGini .axp
  ↓
Mở bằng AppGini
  ↓
Generate code ứng dụng
  ↓
Deploy lên web server

Vì sao nên dùng cách này?

Theo mình, cách này có một số lợi ích rõ ràng:

  • Tốc độ thiết kế database nhanh hơn rất nhiều. Chỉ cần mô tả nghiệp vụ cho AI, sau đó yêu cầu AI tạo schema theo một bộ quy tắc rõ ràng.
  • Cấu trúc database nhất quán hơn. Nếu prompt tốt, AI có thể tạo đầy đủ primary key, foreign key, table comment, column comment, seed data và các bảng lookup cần thiết.
  • Giảm thao tác thủ công trong AppGini. Những việc như tạo bảng, tạo field, đặt caption, nhận diện lookup field có thể được chuẩn bị từ trước ở tầng database.
  • Dễ chuẩn hóa quy trình phát triển nội bộ. Team có thể thống nhất một prompt chuẩn, sau đó dùng lại cho nhiều dự án khác nhau.

ChatGPT Image 22_54_00 26 thg 4, 2026.png

Các bước thực hiện chi tiết

Bước 1: Dùng AI tạo file SQL

Khi làm việc với AI, điểm quan trọng nhất là phải yêu cầu AI tạo SQL theo đúng chuẩn mà m2a_v2.php đọc tốt.

Mình thường dùng prompt dưới đây:

Hãy thiết kế MySQL/MariaDB schema tương thích tốt với tool m2a_v2.php để convert sang AppGini AXP.

Yêu cầu bắt buộc:

1. Chỉ tạo BASE TABLE, không tạo VIEW để import vào AppGini.
  Nếu cần view báo cáo, đặt ở section riêng cuối file và ghi chú không import view vào AppGini.

2. Mỗi bảng phải có primary key rõ ràng:
  - Ưu tiên cột `id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY`
  - Không dùng bảng không có primary key.

3. Dùng InnoDB, utf8mb4:
  ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

4. Tất cả bảng phải có TABLE COMMENT bằng caption người dùng đọc được.
  Ví dụ:
  COMMENT='Hóa đơn'

5. Tất cả cột phải có COLUMN COMMENT bằng caption đẹp để m2a.php dùng làm field caption.
  Ví dụ:
  invoice_number VARCHAR(100) NULL COMMENT 'Số hóa đơn'

6. Foreign key phải khai báo thật bằng CONSTRAINT:
  - Cột FK nên đặt dạng `{entity}_id`
  - Ví dụ `customer_id INT UNSIGNED NULL`
  - Có index cho FK.
  - Có CONSTRAINT FOREIGN KEY (...) REFERENCES parent_table(id)
  - Dùng ON UPDATE CASCADE.
  - Dùng ON DELETE SET NULL cho quan hệ optional, ON DELETE CASCADE cho detail/log child.

7. Bảng lookup/master nên có các cột dễ làm caption:
  - `code` hoặc `{entity}_code`
  - `name` hoặc `{entity}_name`
  - m2a.php sẽ ưu tiên `{base}_name`, `{base}_code`, `name`, `title`, `code`.

8. Kiểu dữ liệu nên map tốt sang AppGini:
  - ID/FK: INT UNSIGNED hoặc BIGINT UNSIGNED
  - Text ngắn: VARCHAR(n)
  - Text dài: TEXT/LONGTEXT
  - Số tiền: DECIMAL(18,2)
  - Tỷ lệ: DECIMAL(8,4)
  - Ngày: DATE
  - Ngày giờ: DATETIME
  - Boolean: TINYINT(1) NOT NULL DEFAULT 0/1
  - File upload: VARCHAR(255) NULL COMMENT 'File ...'
  - JSON nên dùng LONGTEXT, không dùng JSON native nếu muốn AppGini xử lý mượt.

9. Default value:
  - Số có thể dùng DEFAULT 0 hoặc 0.00.
  - DATETIME tạo mới dùng DEFAULT CURRENT_TIMESTAMP.
  - DATETIME cập nhật dùng DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP.
  - Hạn chế default string nếu không thật cần thiết vì AppGini có thể validate default khác MySQL.
  - Nếu cần default string, ghi chú để set trong AppGini sau.

10. Không dùng:
  - composite primary key
  - generated columns
  - trigger bắt buộc
  - stored procedure
  - CHECK phức tạp
  - enum/set nếu có thể thay bằng lookup table
  - view trong danh sách import AppGini

11. Output cần gồm:
  - CREATE DATABASE IF NOT EXISTS ...
  - USE ...
  - SET FOREIGN_KEY_CHECKS = 0
  - DROP VIEW IF EXISTS ... nếu có
  - DROP TABLE IF EXISTS theo thứ tự child trước parent
  - SET FOREIGN_KEY_CHECKS = 1
  - CREATE TABLE parent/master trước
  - INSERT seed data cho lookup/master nếu cần
  - CREATE TABLE transaction/detail sau
  - section optional views ở cuối, ghi chú không import view vào AppGini

Hãy tạo SQL hoàn chỉnh, có comment tiếng Việt cho table/column, tối ưu để m2a.php convert sang AppGini mà ít phải chỉnh tay nhất.

Sau prompt này, mình bổ sung thêm phần mô tả nghiệp vụ. Ví dụ:

Nghiệp vụ cần thiết kế: hệ thống quản lý hóa đơn đầu vào.

Bao gồm:
- Nhà cung cấp
- Hóa đơn
- Dòng hàng hóa/dịch vụ trên hóa đơn
- Thuế suất
- Trạng thái xử lý hóa đơn
- File hóa đơn gốc
- Người duyệt
- Lịch sử xử lý

AI sẽ tạo ra file SQL hoàn chỉnh. Sau đó nên đọc lại nhanh để kiểm tra các điểm quan trọng:

- Có CREATE DATABASE và USE database hay chưa
- Có primary key cho tất cả bảng hay chưa
- Có TABLE COMMENT và COLUMN COMMENT hay chưa
- Foreign key có khai báo bằng CONSTRAINT thật hay chưa
- Có dùng enum, json native, generated column, trigger hoặc view lẫn vào phần import không
- Thứ tự CREATE TABLE có hợp lý không

Bước 2: Import SQL vào MySQL bằng phpMyAdmin

Trên WampServer, mở phpMyAdmin:

http://localhost/phpmyadmin

Sau đó:

Import → chọn file .sql → Go

Nếu SQL đúng, database sẽ được tạo cùng toàn bộ table, field, foreign key và seed data.

Lưu ý: nên import vào một database mới để tránh lẫn với các project khác.

Bước 3: Chép m2a_v2.php vào thư mục web root

Chép file:

m2a_v2.php

vào thư mục:

C:\wamp64\www\

Khi đó đường dẫn truy cập sẽ là:

http://localhost/m2a_v2.php

Bước 4: Mở m2a_v2.php trên Chrome

Mở Chrome và truy cập:

http://localhost/m2a_v2.php

Tại giao diện của tool, nhập thông tin kết nối MySQL, ví dụ:

Host: localhost
Port: 3306
User: root
Password:
Database: tên_database_vừa_import

Với WampServer mặc định, user thường là root và password có thể để trống, tùy cấu hình máy.

Sau khi kết nối thành công, tool sẽ đọc metadata từ database, bao gồm:

- Danh sách table
- Danh sách column
- Kiểu dữ liệu
- Primary key
- Foreign key
- Comment của table
- Comment của column

Sau đó tải về file .axp.

Bước 5: Mở file AXP bằng AppGini

Mở AppGini, chọn:

File → Open

Sau đó chọn file .axp vừa tải về.

Lúc này, các bảng trong MySQL sẽ được chuyển thành table trong AppGini. Nếu SQL được thiết kế tốt, phần lớn caption, field type và lookup relationship sẽ được nhận diện khá ổn.

Tuy nhiên vẫn nên kiểm tra lại các phần sau trong AppGini:

- Caption của table
- Caption của field
- Lookup field
- Parent/children relationship
- Field type cho date, datetime, money, file upload
- Required field
- Default value
- Table permissions
- Detail view layout
- Filters
- Quick search fields

Bước 6: Generate code và deploy

Sau khi kiểm tra project trong AppGini, tiến hành generate code như bình thường:

Generate → chọn thư mục output → OK

Sau đó deploy source code lên web server hoặc chạy trực tiếp trong môi trường local.

Nếu chạy local bằng WampServer, có thể đặt source code generated vào:

C:\wamp64\www\tên_ứng_dụng\

Sau đó truy cập:

http://localhost/tên_ứng_dụng/

Một số kinh nghiệm khi dùng AI để tạo SQL cho AppGini

1. Đừng chỉ yêu cầu AI "tạo database"

Nếu chỉ nói chung chung như:

Tạo database quản lý hóa đơn

thì AI có thể tạo ra schema không tối ưu cho AppGini, ví dụ dùng ENUM, thiếu comment, thiếu foreign key thật, dùng composite key hoặc tạo view lẫn trong file import.

Nên luôn dùng prompt chuẩn và nêu rõ yêu cầu tương thích với m2a_v2.php.

2. Luôn yêu cầu TABLE COMMENT và COLUMN COMMENT

Đây là phần rất quan trọng.

Ví dụ:

CREATE TABLE suppliers (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ID',
  supplier_code VARCHAR(50) NULL COMMENT 'Mã nhà cung cấp',
  supplier_name VARCHAR(255) NOT NULL COMMENT 'Tên nhà cung cấp'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Nhà cung cấp';

Nếu có comment tốt, khi convert sang AppGini sẽ dễ có caption đẹp hơn, giảm việc sửa tay.

3. Ưu tiên lookup table thay vì ENUM

Không nên để AI tạo:

status ENUM('draft', 'approved', 'rejected')

Nên chuyển thành bảng lookup:

CREATE TABLE invoice_statuses (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ID',
  status_code VARCHAR(50) NOT NULL COMMENT 'Mã trạng thái',
  status_name VARCHAR(100) NOT NULL COMMENT 'Tên trạng thái'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Trạng thái hóa đơn';

Sau đó bảng hóa đơn dùng:

status_id INT UNSIGNED NULL COMMENT 'Trạng thái'

Cách này hợp với AppGini hơn vì dễ làm lookup, dễ mở rộng và dễ quản trị dữ liệu danh mục.

4. Cột file upload nên dùng VARCHAR(255)

Ví dụ:

invoice_file VARCHAR(255) NULL COMMENT 'File hóa đơn'

Không nên dùng kiểu BLOB để lưu trực tiếp file nếu muốn xử lý mượt với AppGini. Thực tế nên lưu file trên filesystem và lưu đường dẫn hoặc tên file trong database.

5. JSON nên dùng LONGTEXT

Nếu cần lưu dữ liệu OCR raw, API response hoặc metadata linh hoạt, nên dùng:

ocr_raw_text LONGTEXT NULL COMMENT 'Nội dung OCR gốc'

hoặc:

ai_extract_json LONGTEXT NULL COMMENT 'Kết quả AI trích xuất dạng JSON'

Không nên dùng kiểu JSON native nếu mục tiêu là tương thích tốt với AppGini và dễ chỉnh sửa trên giao diện.

6. Foreign key phải khai báo thật

Nên có đầy đủ index và constraint:

customer_id INT UNSIGNED NULL COMMENT 'Khách hàng',
INDEX idx_invoices_customer_id (customer_id),
CONSTRAINT fk_invoices_customer
  FOREIGN KEY (customer_id) REFERENCES customers(id)
  ON UPDATE CASCADE
  ON DELETE SET NULL

Nếu chỉ đặt tên cột là customer_id nhưng không khai báo foreign key thật, tool convert có thể không đủ thông tin để nhận diện lookup relationship chính xác.

Cấu trúc SQL nên có

Một file SQL tốt nên có cấu trúc như sau:

CREATE DATABASE IF NOT EXISTS app_demo
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

USE app_demo;

SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS invoice_items;
DROP TABLE IF EXISTS invoices;
DROP TABLE IF EXISTS suppliers;
DROP TABLE IF EXISTS invoice_statuses;

SET FOREIGN_KEY_CHECKS = 1;

CREATE TABLE invoice_statuses (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ID',
  status_code VARCHAR(50) NOT NULL COMMENT 'Mã trạng thái',
  status_name VARCHAR(100) NOT NULL COMMENT 'Tên trạng thái'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Trạng thái hóa đơn';

INSERT INTO invoice_statuses (status_code, status_name) VALUES
('draft', 'Nháp'),
('pending', 'Chờ duyệt'),
('approved', 'Đã duyệt'),
('rejected', 'Từ chối');

CREATE TABLE suppliers (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ID',
  supplier_code VARCHAR(50) NULL COMMENT 'Mã nhà cung cấp',
  supplier_name VARCHAR(255) NOT NULL COMMENT 'Tên nhà cung cấp',
  tax_code VARCHAR(50) NULL COMMENT 'Mã số thuế',
  phone VARCHAR(50) NULL COMMENT 'Điện thoại',
  email VARCHAR(255) NULL COMMENT 'Email',
  address TEXT NULL COMMENT 'Địa chỉ'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Nhà cung cấp';

CREATE TABLE invoices (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ID',
  supplier_id INT UNSIGNED NULL COMMENT 'Nhà cung cấp',
  status_id INT UNSIGNED NULL COMMENT 'Trạng thái',
  invoice_number VARCHAR(100) NULL COMMENT 'Số hóa đơn',
  invoice_date DATE NULL COMMENT 'Ngày hóa đơn',
  subtotal DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT 'Tiền trước thuế',
  tax_amount DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT 'Tiền thuế',
  grand_total DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT 'Tổng thanh toán',
  invoice_file VARCHAR(255) NULL COMMENT 'File hóa đơn',
  note TEXT NULL COMMENT 'Ghi chú',
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Ngày tạo',
  updated_at DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Ngày cập nhật',
  INDEX idx_invoices_supplier_id (supplier_id),
  INDEX idx_invoices_status_id (status_id),
  CONSTRAINT fk_invoices_supplier
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id)
    ON UPDATE CASCADE
    ON DELETE SET NULL,
  CONSTRAINT fk_invoices_status
    FOREIGN KEY (status_id) REFERENCES invoice_statuses(id)
    ON UPDATE CASCADE
    ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Hóa đơn';

CREATE TABLE invoice_items (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ID',
  invoice_id INT UNSIGNED NOT NULL COMMENT 'Hóa đơn',
  item_name VARCHAR(255) NOT NULL COMMENT 'Tên hàng hóa dịch vụ',
  unit_name VARCHAR(50) NULL COMMENT 'Đơn vị tính',
  quantity DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT 'Số lượng',
  unit_price DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT 'Đơn giá',
  line_total DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT 'Thành tiền',
  INDEX idx_invoice_items_invoice_id (invoice_id),
  CONSTRAINT fk_invoice_items_invoice
    FOREIGN KEY (invoice_id) REFERENCES invoices(id)
    ON UPDATE CASCADE
    ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Dòng hóa đơn';

Một số lỗi thường gặp

Lỗi 1: AI tạo bảng không có primary key

AppGini cần primary key rõ ràng. Nên yêu cầu AI luôn dùng:

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

Lỗi 2: Thiếu table comment hoặc column comment

Nếu thiếu comment, caption khi đưa vào AppGini có thể không đẹp. Nên bắt buộc AI tạo comment tiếng Việt cho tất cả table và column.

Lỗi 3: Tạo view chung với base table

AppGini chủ yếu làm việc tốt với base table. Nếu cần view báo cáo, nên để ở section riêng cuối file và ghi chú rõ là không import view vào AppGini.

Lỗi 4: Dùng ENUM quá nhiều

ENUM có thể tiện ở MySQL nhưng không linh hoạt khi đưa vào AppGini. Nên chuyển thành lookup table.

Lỗi 5: Foreign key chỉ đặt tên chứ không tạo constraint

Chỉ có customer_id là chưa đủ. Nên có CONSTRAINT FOREIGN KEY thật để tool nhận diện quan hệ.

Kết luận

Cách dùng AI + SQL + m2a_v2.php giúp rút ngắn đáng kể thời gian dựng ứng dụng AppGini.

Theo mình, quy trình này phù hợp nhất cho các tình huống:

- Dựng nhanh prototype
- Thiết kế ứng dụng CRUD nội bộ
- Chuẩn hóa database trước khi đưa vào AppGini
- Tạo các hệ thống quản lý có nhiều bảng liên kết
- Làm bản demo cho khách hàng trong thời gian ngắn

Tuy nhiên, sau khi import vào AppGini, vẫn nên kiểm tra lại kỹ phần lookup, permission, layout, validation và business logic trước khi deploy production.

Nếu cộng đồng quan tâm, mình có thể chia sẻ tiếp:

- Bộ prompt mẫu cho từng loại ứng dụng
- Ví dụ SQL hoàn chỉnh cho CRM, ITSM, quản lý hóa đơn, quản lý kho
- Checklist kiểm tra file .axp sau khi convert
- Cách tối ưu m2a_v2.php để nhận diện caption, lookup và field type tốt hơn

Rất mong nhận được góp ý từ mọi người để quy trình này ngày càng hoàn thiện hơn.