NocoBase - Nền Tảng Low-Code Cho Doanh Nghiệp Hiện Đại
Chào các bạn! Trong thời đại số hóa bùng nổ, việc phát triển ứng dụng nhanh chóng và hiệu quả đang trở thành yếu tố then chốt quyết định sự thành công của doanh nghiệp. NocoBase - một nền tảng Low-Code tiên tiến đang cách mạng hóa cách chúng ta xây dựng ứng dụng! Từ việc tạo ra các hệ thống quản lý phức tạp đến ứng dụng nội bộ doanh nghiệp, NocoBase mở ra một thế giới khả năng vô hạn! 🚀
Nền Tảng Low-Code và No-Code: Cuộc Cách Mạng Trong Phát Triển Phần Mềm
Định Nghĩa và Khái Niệm
Nền tảng Low-Code và No-Code không chỉ là từ khóa hot mà là một cuộc cách mạng thực sự trong ngành phần mềm:
🔧 Nền Tảng Low Code:
- Ít viết code hơn: Giảm 60-90% lượng code cần viết
- Visual Development: Sử dụng giao diện kéo thả trực quan
- Pre-built Components: Thư viện component có sẵn phong phú
- Có thể tùy chỉnh: Vẫn cho phép custom code khi cần thiết
- Rapid Prototyping: Tạo prototype nhanh chóng trong vài giờ
🚫 Nền Tảng No Code:
- Không cần viết code: Hoàn toàn không cần viết code
- Template-based: Dựa trên các template có sẵn
- Hạn chế tùy chỉnh: Giới hạn khả năng customization sâu
- Business-focused: Tập trung vào business user
- Quick deployment: Triển khai nhanh chóng
Xu Hướng Low-Code/No-Code Trong Công Ty Phần Mềm
📈 Thống Kê Ấn Tượng:
- Gartner dự đoán: 65% ứng dụng sẽ được phát triển bằng low-code vào năm 2024
- Forrester báo cáo: Thị trường low-code tăng trưởng 23% mỗi năm
- OutSystems khảo sát: 85% doanh nghiệp đã áp dụng hoặc dự định áp dụng low-code
- Microsoft thống kê: Power Platform có hơn 40 triệu người dùng monthly
🏢 Tại Sao Các Công Ty Chuyển Sang Low-Code?
1. Thiếu Hụt Nhân Lực IT:
- Thế giới thiếu hơn 4 triệu developer
- Chi phí thuê developer ngày càng cao
- Thời gian training developer mới rất lâu
- Business user có thể tự tạo ứng dụng đơn giản
2. Tốc Độ Development:
- Giảm 70% thời gian development
- MVP có thể hoàn thành trong vài tuần thay vì vài tháng
- Rapid iteration và feedback nhanh chóng
- Time-to-market cạnh tranh hơn
3. Giảm Chi Phí:
- Giảm 50-90% chi phí development
- Ít dependency vào technical team
- Maintenance đơn giản hơn
- ROI nhanh chóng và rõ ràng
4. Democratization of Development:
- Business analyst có thể tạo ứng dụng
- Nhóm IT tập trung vào core system
- Innovation từ mọi phòng ban
Ưu Nhược Điểm Của Nền Tảng Low-Code/No-Code
✅ Ưu Điểm Vượt Trội
🚀 Tốc Độ Development Nhanh:
- Rapid Prototyping: Tạo prototype trong vài giờ thay vì vài tuần
- Visual Development: Kéo thả thay vì viết code từng dòng
- Pre-built Templates: Sử dụng template có sẵn cho các use case phổ biến
- Instant Preview: Xem kết quả ngay lập tức khi thay đổi
💰 Tiết Kiệm Chi Phí:
- Reduced Development Cost: Giảm 60-80% chi phí development
- Lower Maintenance: Ít bug hơn, maintenance đơn giản hơn
- No Infrastructure Hassle: Không cần lo về server, scaling
- Faster ROI: Return on investment nhanh chóng
👥 Dễ Tiếp Cận:
- Phát triển: Người dùng kinh doanh có thể tự tạo ứng dụng
- Learning Curve Thấp: Học trong vài tuần thay vì vài năm
- Visual Interface: Giao diện trực quan, dễ hiểu
- Documentation Tốt: Hướng dẫn chi tiết và community support
🔄 Linh Hoạt và Scalability:
- Modular Architecture: Thêm/bớt tính năng dễ dàng
- Integration Ready: Kết nối với hệ thống hiện có
- Cloud-Native: Tự động scale theo nhu cầu
- Version Control: Quản lý version tự động
❌ Nhược Điểm Cần Lưu Ý
🔒 Vendor Lock-in:
- Platform Dependency: Phụ thuộc hoàn toàn vào vendor
- Migration Challenges: Khó migrate sang platform khác
- Pricing Control: Vendor có thể tăng giá bất cứ lúc nào
- Feature Limitations: Bị giới hạn bởi roadmap của vendor
⚡ Hạn Chế Performance:
- Performance Overhead: Thường chậm hơn custom code
- Resource Heavy: Tiêu tốn nhiều resource hơn
- Scalability Issues: Khó scale cho ứng dụng lớn
- Database Limitations: Giới hạn query phức tạp
🎨 Giới Hạn Customization:
- UI/UX Constraints: Giao diện bị giới hạn bởi template
- Business Logic: Khó implement logic phức tạp
- Integration Limits: Không thể integrate với mọi hệ thống
- Compliance Issues: Có thể không đáp ứng được compliance đặc biệt
🔐 Vấn Đề Security:
- Data Privacy: Dữ liệu được lưu trữ ở bên thứ 3
- Security Standards: Có thể không đáp ứng security standards riêng
- Audit Trails: Khó kiểm soát audit và logging
- Compliance: Khó đảm bảo compliance với regulations
Giới Thiệu NocoBase - The Future of Low-Code
NocoBase Là Gì?
NocoBase là một nền tảng low-code mã nguồn mở được thiết kế đặc biệt cho việc xây dựng các ứng dụng doanh nghiệp nội bộ. Được phát triển bởi team Trung Quốc với triết lý "Scalability, Extensibility, and No vendor lock-in".
🎯 Điểm Đặc Biệt của NocoBase:
📊 Database-First Approach:
- Thiết kế database trực quan bằng visual editor
- Support multiple database: MySQL, PostgreSQL, SQLite
- Real-time schema migration
- Advanced relationship management
🧩 Plugin Architecture:
- Kiến trúc plugin mạnh mẽ và linh hoạt
- Marketplace với hàng trăm plugin có sẵn
- Custom plugin development với TypeScript
- Hot-reload plugin trong development
🎨 Flexible UI Builder:
- Drag & drop interface builder
- Component-based architecture
- Responsive design tự động
- Custom CSS và JavaScript
🔧 Developer-Friendly:
- Full source code access
- TypeScript/JavaScript support
- RESTful API tự động
- GraphQL support
Tính Năng Nổi Bật
📋 Form Builder Mạnh Mẽ:
- Dynamic form generation - Tạo form động
- Field validation phức tạp và real-time
- Conditional logic - Logic có điều kiện
- File upload & media management tiện lợi
- Multi-step forms - Form nhiều bước
📊 Data Visualization:
- Charts và graphs đa dạng phong phú
- Dashboard builder trực quan
- Real-time data updates - Cập nhật dữ liệu thời gian thực
- Export to Excel/PDF dễ dàng
- Print-friendly layouts - Bố cục thân thiện in ấn
👤 User Management:
- Role-based access control (RBAC) đầy đủ
- Department và team management hiệu quả
- Single Sign-On (SSO) support
- Multi-tenant architecture - Kiến trúc đa tenant
- Audit logs chi tiết và đầy đủ
🔄 Workflow Engine:
- Visual workflow designer - Thiết kế workflow trực quan
- Approval processes - Quy trình phê duyệt
- Email notifications tự động
- Webhook integrations linh hoạt
- Scheduled tasks - Tác vụ theo lịch
📱 Mobile-Ready:
- Progressive Web App (PWA) chuẩn
- Mobile-optimized interface - Giao diện tối ưu mobile
- Offline capabilities - Khả năng hoạt động offline
- Push notifications thông minh
- Native app export option
So Sánh NocoBase Với Các Nền Tảng Khác
Tiêu Chí | NocoBase | Supabase | Appsmith | OutSystems |
---|---|---|---|---|
💰 Giá cả | ✅ Miễn phí (self-hosted) | 💰 $25/project/tháng | ✅ Miễn phí (self-hosted) | 💰 $1,513/tháng |
🏠 Deployment | ✅ Self-hosted + Cloud | ⚡ Cloud + Self-hosted | ✅ Self-hosted + Cloud | ❌ Cloud only |
🔧 Customization | ✅ Full source code access | ⚡ Limited customization | ✅ High customization | ⚡ Medium customization |
💾 Database | ✅ Multiple DB support | ✅ PostgreSQL focus | ✅ Multiple DB support | ✅ Multiple DB support |
🔌 API Access | ✅ Full REST/GraphQL | ✅ Auto-generated APIs | ✅ Full API access | ✅ Enterprise APIs |
👥 Target User | 🔧 Developer + Business | 🔧 Developers | 🔧 Developers | 🏢 Enterprise teams |
🏢 Enterprise Ready | ✅ Production ready | ⚡ Growing enterprise | ⚡ Medium enterprise | ✅ Full enterprise |
🔒 Security | ✅ Self-controlled | ✅ Enterprise security | ✅ Self-controlled | ✅ Enterprise security |
🌐 Offline Support | ✅ PWA support | ❌ Online only | ❌ Online only | ⚡ Limited offline |
📱 Mobile | ✅ Mobile-optimized | ⚡ Mobile responsive | ⚡ Mobile responsive | ✅ Native mobile |
🏆 Kết luận: NocoBase thắng thế ở khả năng customization, cost-effectiveness và no vendor lock-in.
Chi Tiết So Sánh
🆚 NocoBase vs Supabase:
- Focus: NocoBase là full low-code platform, Supabase là backend-as-a-service
- Database: Cả hai đều mạnh về database, nhưng NocoBase có visual database designer
- UI Building: NocoBase có drag-drop UI builder, Supabase cần code frontend
- Target: NocoBase cho business apps, Supabase cho modern web apps
🆚 NocoBase vs Appsmith:
- Scope: NocoBase toàn diện hơn với database design, Appsmith focus vào internal tools
- Learning curve: NocoBase dễ hơn cho non-developers
- Database: NocoBase có built-in database designer, Appsmith connect external DBs
- Community: Cả hai đều open-source với community mạnh
🆚 NocoBase vs OutSystems:
- Cost: NocoBase free self-hosted, OutSystems rất đắt
- Target: NocoBase cho SME và enterprises, OutSystems chỉ large enterprises
- Flexibility: NocoBase open-source linh hoạt hơn, OutSystems proprietary
- Deployment: NocoBase flexible deployment, OutSystems cloud-only
Phần Mở Rộng Trong NocoBase: Sức Mạnh Của Khả Năng Mở Rộng
Kiến Trúc Phần Mở Rộng
NocoBase được xây dựng theo Kiến Trúc Phần Mở Rộng Ưu Tiên, nghĩa là mọi tính năng đều được triển khai như phần mở rộng:
🧩 Phần Mở Rộng Cốt Lõi:
- @nocobase/plugin-users: Quản lý người dùng
- @nocobase/plugin-acl: Kiểm soát truy cập
- @nocobase/plugin-workflow: Công cụ quy trình
- @nocobase/plugin-file-manager: Quản lý tệp
- @nocobase/plugin-charts: Trực quan hóa dữ liệu
🔌 Phần Mở Rộng Cộng Đồng:
- Phần mở rộng lịch: Quản lý sự kiện
- Phần mở rộng Kanban: Bảng tác vụ
- Phần mở rộng nhập/xuất: Di chuyển dữ liệu
- Trình tạo PDF: Tạo tài liệu
- Phần mở rộng email: Tích hợp email
Hướng Dẫn Viết Phần Mở Rộng
Bước 1: Khởi Tạo Phần Mở Rộng
# Tạo phần mở rộng mới
npx create-nocobase-plugin my-custom-plugin
# Cấu trúc thư mục
my-custom-plugin/
├── src/
│ ├── client/ # Mã giao diện người dùng
│ ├── server/ # Mã máy chủ
│ └── locale/ # Quốc tế hóa
├── package.json
└── README.md
Bước 2: Định Nghĩa Phần Mở Rộng
// src/server/plugin.ts
import { Plugin } from '@nocobase/server';
export class MyCustomPluginServer extends Plugin {
getName(): string {
return 'my-custom-plugin';
}
async load() {
// Đăng ký bộ sưu tập cơ sở dữ liệu
this.db.collection({
name: 'products',
fields: [
{ type: 'string', name: 'name' },
{ type: 'text', name: 'description' },
{ type: 'float', name: 'price' },
{ type: 'integer', name: 'stock' }
]
});
// Đăng ký tuyến đường giao diện lập trình ứng dụng
this.app.resource({
name: 'products',
actions: {
async list(ctx) {
const products = await ctx.db.getRepository('products').find();
ctx.body = products;
},
async create(ctx) {
const product = await ctx.db.getRepository('products').create({
values: ctx.request.body
});
ctx.body = product;
}
}
});
}
}
export default MyCustomPluginServer;
Bước 3: Thành Phần Giao Diện
// src/client/ProductManager.tsx
import React from 'react';
import { Table, Button, Form, Input, Modal } from 'antd';
import { useRequest } from '@nocobase/client';
export const ProductManager: React.FC = () => {
const [form] = Form.useForm();
const [visible, setVisible] = React.useState(false);
const { data: products, loading, run: refreshProducts } = useRequest({
resource: 'products',
action: 'list'
});
const handleSubmit = async (values: any) => {
await fetch('/api/products:create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(values)
});
setVisible(false);
refreshProducts();
form.resetFields();
};
const columns = [
{ title: 'Tên sản phẩm', dataIndex: 'name', key: 'name' },
{ title: 'Mô tả', dataIndex: 'description', key: 'description' },
{ title: 'Giá', dataIndex: 'price', key: 'price', render: (price: number) => `${price.toLocaleString()} VND` },
{ title: 'Tồn kho', dataIndex: 'stock', key: 'stock' }
];
return (
<div>
<Button type="primary" onClick={() => setVisible(true)} style={{ marginBottom: 16 }}>
Thêm sản phẩm
</Button>
<Table
columns={columns}
dataSource={products}
loading={loading}
rowKey="id"
/>
<Modal
title="Thêm sản phẩm mới"
visible={visible}
onCancel={() => setVisible(false)}
onOk={() => form.submit()}
>
<Form form={form} onFinish={handleSubmit} layout="vertical">
<Form.Item name="name" label="Tên sản phẩm" rules={[{ required: true }]}>
<Input placeholder="Nhập tên sản phẩm" />
</Form.Item>
<Form.Item name="description" label="Mô tả">
<Input.TextArea placeholder="Nhập mô tả sản phẩm" />
</Form.Item>
<Form.Item name="price" label="Giá" rules={[{ required: true }]}>
<Input type="number" placeholder="Nhập giá sản phẩm" />
</Form.Item>
<Form.Item name="stock" label="Tồn kho" rules={[{ required: true }]}>
<Input type="number" placeholder="Nhập số lượng tồn kho" />
</Form.Item>
</Form>
</Modal>
</div>
);
};
Bước 4: Đăng Ký Phần Mở Rộng
// src/client/index.ts
import { Plugin } from '@nocobase/client';
import { ProductManager } from './ProductManager';
export class MyCustomPluginClient extends Plugin {
async load() {
// Thêm mục menu
this.app.pluginManager.add('product-manager', {
Component: ProductManager,
title: 'Quản lý sản phẩm',
icon: 'ShoppingCartOutlined'
});
// Thêm vào menu quản trị
this.app.addRoute('admin.product-manager', {
path: '/admin/products',
component: ProductManager
});
}
}
export default MyCustomPluginClient;
Bước 5: Xây Dựng và Triển Khai Phần Mở Rộng
# Xây dựng phần mở rộng
npm run build
# Cài đặt vào NocoBase
npm install ./my-custom-plugin
# Kích hoạt phần mở rộng
npm run nocobase pm enable my-custom-plugin
npm run nocobase db sync
npm run nocobase start
Tính Năng Phần Mở Rộng Nâng Cao
🔄 Hook Phần Mở Rộng:
// Hook vòng đời
export class MyPlugin extends Plugin {
async beforeLoad() {
// Chạy trước khi tải phần mở rộng
}
async load() {
// Logic tải chính
}
async install() {
// Chạy khi cài đặt phần mở rộng lần đầu
}
async enable() {
// Chạy khi kích hoạt phần mở rộng
}
async disable() {
// Chạy khi vô hiệu hóa phần mở rộng
}
}
📡 Hệ Thống Sự Kiện:
// Lắng nghe sự kiện
this.app.on('beforeStart', async () => {
console.log('Ứng dụng đang khởi động...');
});
// Phát sự kiện tùy chỉnh
this.app.emit('product:created', product);
🗄️ Di Chuyển Cơ Sở Dữ Liệu:
// Tệp di chuyển
export async function up(knex: Knex): Promise<void> {
await knex.schema.createTable('products', (table) => {
table.increments('id').primary();
table.string('name').notNullable();
table.text('description');
table.decimal('price', 10, 2);
table.integer('stock').defaultTo(0);
table.timestamps(true, true);
});
}
Cài Đặt NocoBase Với Docker
🐳 Chuẩn Bị Môi Trường
Yêu cầu hệ thống:
- Docker và Docker Compose
- Tối thiểu: 2GB RAM, 10GB dung lượng
- Khuyến nghị: 4GB RAM, 50GB dung lượng
- Cổng: 13000 (có thể thay đổi)
📁 Cấu Trúc Thư Mục
mkdir nocobase-docker && cd nocobase-docker
mkdir -p {storage,data,backups}
🔧 Cấu Hình Docker Compose
Tạo tệp docker-compose.yml
:
version: '3.8'
services:
postgres:
image: postgres:15
container_name: nocobase_postgres
restart: unless-stopped
environment:
POSTGRES_DB: nocobase
POSTGRES_USER: nocobase
POSTGRES_PASSWORD: changeme_secure_password
volumes:
- ./data/postgres:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U nocobase -d nocobase"]
interval: 30s
timeout: 10s
retries: 5
redis:
image: redis:7-alpine
container_name: nocobase_redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- ./data/redis:/data
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 5
nocobase:
image: nocobase/nocobase:latest
container_name: nocobase_app
restart: unless-stopped
environment:
# Cấu hình cơ sở dữ liệu
DB_DIALECT: postgres
DB_HOST: postgres
DB_PORT: 5432
DB_DATABASE: nocobase
DB_USER: nocobase
DB_PASSWORD: changeme_secure_password
# Cấu hình Redis
CACHE_DEFAULT_STORE: redis
CACHE_REDIS_URL: redis://redis:6379
# Cấu hình ứng dụng
APP_ENV: production
APP_HOST: 0.0.0.0
APP_PORT: 13000
APP_KEY: your-secret-app-key-change-this
# Cấu hình quản trị viên
INIT_ROOT_EMAIL: [email protected]
INIT_ROOT_PASSWORD: admin123456
INIT_ROOT_NICKNAME: Admin
# Lưu trữ tệp
LOCAL_STORAGE_BASE_URL: http://localhost:13000
# Cấu hình phần mở rộng
PLUGIN_STORAGE_PATH: /app/storage/plugins
# Múi giờ
TZ: Asia/Ho_Chi_Minh
ports:
- "13000:13000"
volumes:
- ./storage:/app/storage
- ./data/uploads:/app/storage/uploads
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
command: >
sh -c "
npm run build &&
npm run start
"
volumes:
postgres_data:
redis_data:
nocobase_storage:
🚀 Khởi Chạy NocoBase
# Khởi động tất cả dịch vụ
docker-compose up -d
# Kiểm tra nhật ký
docker-compose logs -f nocobase
# Kiểm tra trạng thái
docker-compose ps
🔐 Truy Cập NocoBase
Truy cập ứng dụng:
- Địa chỉ:
http://localhost:13000
- Email quản trị:
[email protected]
- Mật khẩu quản trị:
admin123456
Lần đầu truy cập:
- Mở trình duyệt và vào
http://localhost:13000
- Đăng nhập với thông tin quản trị viên
- Hoàn thành trình hướng dẫn thiết lập
- Thay đổi mật khẩu quản trị ngay lập tức
Cập Nhật NocoBase Bằng Docker
🔄 Sao Lưu Trước Khi Cập Nhật
# Sao lưu cơ sở dữ liệu
docker-compose exec postgres pg_dump -U nocobase nocobase > backup_$(date +%Y%m%d_%H%M%S).sql
# Sao lưu tệp lưu trữ
tar -czf storage_backup_$(date +%Y%m%d_%H%M%S).tar.gz storage/
# Sao lưu cấu hình docker-compose
cp docker-compose.yml docker-compose.yml.backup
📦 Quy Trình Cập Nhật
# 1. Dừng NocoBase (giữ cơ sở dữ liệu và redis)
docker-compose stop nocobase
# 2. Tải ảnh mới nhất
docker-compose pull nocobase
# 3. Khởi động lại với ảnh mới
docker-compose up -d nocobase
# 4. Kiểm tra nhật ký để đảm bảo cập nhật thành công
docker-compose logs -f nocobase
🔧 Cập Nhật Phiên Bản Cụ Thể
# Trong docker-compose.yml, thay đổi phiên bản ảnh
services:
nocobase:
image: nocobase/nocobase:1.0.0 # Chỉ định phiên bản chính xác
# ... phần còn lại của cấu hình
Plugin Trong NocoBase: Sức Mạnh Của Extensibility
Kiến Trúc Plugin
NocoBase được xây dựng theo Plugin-First Architecture, nghĩa là mọi tính năng đều được implement như plugin:
🧩 Core Plugins:
- @nocobase/plugin-users: User management
- @nocobase/plugin-acl: Access control
- @nocobase/plugin-workflow: Workflow engine
- @nocobase/plugin-file-manager: File management
- @nocobase/plugin-charts: Data visualization
🔌 Community Plugins:
- Calendar Plugin: Event management
- Kanban Plugin: Task boards
- Import/Export Plugin: Data migration
- PDF Generator: Document generation
- Email Plugin: Email integration
Hướng Dẫn Viết Plugin
Bước 1: Khởi Tạo Plugin
# Tạo plugin mới
npx create-nocobase-plugin my-custom-plugin
# Cấu trúc thư mục
my-custom-plugin/
├── src/
│ ├── client/ # Frontend code
│ ├── server/ # Backend code
│ └── locale/ # Internationalization
├── package.json
└── README.md
Bước 2: Định Nghĩa Plugin
// src/server/plugin.ts
import { Plugin } from '@nocobase/server';
export class MyCustomPluginServer extends Plugin {
getName(): string {
return 'my-custom-plugin';
}
async load() {
// Đăng ký database collections
this.db.collection({
name: 'products',
fields: [
{ type: 'string', name: 'name' },
{ type: 'text', name: 'description' },
{ type: 'float', name: 'price' },
{ type: 'integer', name: 'stock' }
]
});
// Đăng ký API routes
this.app.resource({
name: 'products',
actions: {
async list(ctx) {
const products = await ctx.db.getRepository('products').find();
ctx.body = products;
},
async create(ctx) {
const product = await ctx.db.getRepository('products').create({
values: ctx.request.body
});
ctx.body = product;
}
}
});
}
}
export default MyCustomPluginServer;
Bước 3: Frontend Component
// src/client/ProductManager.tsx
import React from 'react';
import { Table, Button, Form, Input, Modal } from 'antd';
import { useRequest } from '@nocobase/client';
export const ProductManager: React.FC = () => {
const [form] = Form.useForm();
const [visible, setVisible] = React.useState(false);
const { data: products, loading, run: refreshProducts } = useRequest({
resource: 'products',
action: 'list'
});
const handleSubmit = async (values: any) => {
await fetch('/api/products:create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(values)
});
setVisible(false);
refreshProducts();
form.resetFields();
};
const columns = [
{ title: 'Tên sản phẩm', dataIndex: 'name', key: 'name' },
{ title: 'Mô tả', dataIndex: 'description', key: 'description' },
{ title: 'Giá', dataIndex: 'price', key: 'price', render: (price: number) => `${price.toLocaleString()} VND` },
{ title: 'Tồn kho', dataIndex: 'stock', key: 'stock' }
];
return (
<div>
<Button type="primary" onClick={() => setVisible(true)} style={{ marginBottom: 16 }}>
Thêm sản phẩm
</Button>
<Table
columns={columns}
dataSource={products}
loading={loading}
rowKey="id"
/>
<Modal
title="Thêm sản phẩm mới"
visible={visible}
onCancel={() => setVisible(false)}
onOk={() => form.submit()}
>
<Form form={form} onFinish={handleSubmit} layout="vertical">
<Form.Item name="name" label="Tên sản phẩm" rules={[{ required: true }]}>
<Input placeholder="Nhập tên sản phẩm" />
</Form.Item>
<Form.Item name="description" label="Mô tả">
<Input.TextArea placeholder="Nhập mô tả sản phẩm" />
</Form.Item>
<Form.Item name="price" label="Giá" rules={[{ required: true }]}>
<Input type="number" placeholder="Nhập giá sản phẩm" />
</Form.Item>
<Form.Item name="stock" label="Tồn kho" rules={[{ required: true }]}>
<Input type="number" placeholder="Nhập số lượng tồn kho" />
</Form.Item>
</Form>
</Modal>
</div>
);
};
Bước 4: Đăng Ký Plugin
// src/client/index.ts
import { Plugin } from '@nocobase/client';
import { ProductManager } from './ProductManager';
export class MyCustomPluginClient extends Plugin {
async load() {
// Thêm menu item
this.app.pluginManager.add('product-manager', {
Component: ProductManager,
title: 'Quản lý sản phẩm',
icon: 'ShoppingCartOutlined'
});
// Thêm vào menu quản trị
this.app.addRoute('admin.product-manager', {
path: '/admin/products',
component: ProductManager
});
}
}
export default MyCustomPluginClient;
Bước 5: Build và Deploy Plugin
# Build plugin
npm run build
# Cài đặt vào NocoBase
npm install ./my-custom-plugin
# Kích hoạt plugin
npm run nocobase pm enable my-custom-plugin
npm run nocobase db sync
npm run nocobase start
Advanced Plugin Features
🔄 Plugin Hooks:
// Lifecycle hooks
export class MyPlugin extends Plugin {
async beforeLoad() {
// Chạy trước khi tải phần mở rộng
}
async load() {
// Logic tải chính
}
async install() {
// Chạy khi cài đặt plugin lần đầu
}
async enable() {
// Chạy khi kích hoạt plugin
}
async disable() {
// Chạy khi vô hiệu hóa plugin
}
}
📡 Event System:
// Lắng nghe events
this.app.on('beforeStart', async () => {
console.log('Application is starting...');
});
// Emit custom events
this.app.emit('product:created', product);
🗄️ Database Migrations:
// Migration file
export async function up(knex: Knex): Promise<void> {
await knex.schema.createTable('products', (table) => {
table.increments('id').primary();
table.string('name').notNullable();
table.text('description');
table.decimal('price', 10, 2);
table.integer('stock').defaultTo(0);
table.timestamps(true, true);
});
}
Cài Đặt NocoBase Với Docker
🐳 Chuẩn Bị Environment
System requirements:
- Docker và Docker Compose
- Minimum: 2GB RAM, 10GB storage
- Recommended: 4GB RAM, 50GB storage
- Port: 13000 (có thể thay đổi)
📁 Directory Structure
mkdir nocobase-docker && cd nocobase-docker
mkdir -p {storage,data,backups}
🔧 Docker Compose Configuration
Tạo file docker-compose.yml
:
version: '3.8'
services:
postgres:
image: postgres:15
container_name: nocobase_postgres
restart: unless-stopped
environment:
POSTGRES_DB: nocobase
POSTGRES_USER: nocobase
POSTGRES_PASSWORD: changeme_secure_password
volumes:
- ./data/postgres:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U nocobase -d nocobase"]
interval: 30s
timeout: 10s
retries: 5
redis:
image: redis:7-alpine
container_name: nocobase_redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- ./data/redis:/data
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 5
nocobase:
image: nocobase/nocobase:latest
container_name: nocobase_app
restart: unless-stopped
environment:
# Database Configuration
DB_DIALECT: postgres
DB_HOST: postgres
DB_PORT: 5432
DB_DATABASE: nocobase
DB_USER: nocobase
DB_PASSWORD: changeme_secure_password
# Redis Configuration
CACHE_DEFAULT_STORE: redis
CACHE_REDIS_URL: redis://redis:6379
# Application Configuration
APP_ENV: production
APP_HOST: 0.0.0.0
APP_PORT: 13000
APP_KEY: your-secret-app-key-change-this
# Admin Configuration
INIT_ROOT_EMAIL: [email protected]
INIT_ROOT_PASSWORD: admin123456
INIT_ROOT_NICKNAME: Admin
# File Storage
LOCAL_STORAGE_BASE_URL: http://localhost:13000
# Plugin Configuration
PLUGIN_STORAGE_PATH: /app/storage/plugins
# Timezone
TZ: Asia/Ho_Chi_Minh
ports:
- "13000:13000"
volumes:
- ./storage:/app/storage
- ./data/uploads:/app/storage/uploads
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
command: >
sh -c "
npm run build &&
npm run start
"
volumes:
postgres_data:
redis_data:
nocobase_storage:
🚀 Start NocoBase
# Khởi động tất cả services
docker-compose up -d
# Check logs
docker-compose logs -f nocobase
# Check status
docker-compose ps
🔐 Access NocoBase
Application access:
- URL:
http://localhost:13000
- Admin Email:
[email protected]
- Admin Password:
admin123456
First time setup:
- Mở browser và vào
http://localhost:13000
- Login với admin credentials
- Complete setup wizard
- Change admin password ngay lập tức
Update NocoBase Bằng Docker
🔄 Backup Trước Khi Update
# Backup database
docker-compose exec postgres pg_dump -U nocobase nocobase > backup_$(date +%Y%m%d_%H%M%S).sql
# Backup storage files
tar -czf storage_backup_$(date +%Y%m%d_%H%M%S).tar.gz storage/
# Backup docker-compose config
cp docker-compose.yml docker-compose.yml.backup
📦 Update phiên bản
# 1. Stop NocoBase (keep database và redis)
docker-compose stop nocobase
# 2. Pull latest image
docker-compose pull nocobase
# 3. Start với image mới
docker-compose up -d nocobase
# 4. Kiểm tra nhật ký để đảm bảo cập nhật thành công
docker-compose logs -f nocobase
🔧 Update phiên bản cụ thể
# Trong docker-compose.yml, change image version
services:
nocobase:
image: nocobase/nocobase:1.0.0 # Specify exact version
# ... rest of config
Tổng Kết
NocoBase thực sự là một game-changer trong thế giới low-code development! Với khả năng customization cao, plugin architecture mạnh mẽ và open-source philosophy, NocoBase mở ra những khả năng vô hạn cho việc xây dựng enterprise applications.
NocoBase không chỉ là một platform, mà là gateway to the future of software development! Hãy start your low-code journey ngay hôm nay! 🌟