Phần mềm quản lý bán hàng và kho hàng dành cho doanh nghiệp vừa và nhỏ, chạy offline trên máy tính để bàn.
- Giới thiệu
- Tính năng
- Kiến trúc hệ thống
- Yêu cầu hệ thống
- Cài đặt môi trường phát triển
- Cấu hình
- Lệnh thông dụng
- Cấu trúc thư mục
- Database & Migration
- Build & Đóng gói
- Đóng góp
- Quy ước code
TheSMS (v1.1.3) là ứng dụng desktop ERP dành cho doanh nghiệp bán lẻ và bán sỉ. Phần mềm hoạt động hoàn toàn offline, lưu trữ dữ liệu nội bộ qua SQLite, được đóng gói thành file .exe / .dmg / .AppImage thông qua Electron.
| Phân hệ | Mô tả |
|---|---|
| POS — Bán hàng | Giao diện bán hàng nhanh, hỗ trợ bán lẻ / sỉ / online / đặt trước |
| Đơn hàng & Hóa đơn | Quản lý vòng đời đơn hàng, xuất hóa đơn, theo dõi công nợ |
| Kho hàng | Nhập hàng, quản lý nhiều kho, vị trí kho, kiểm kê |
| Sản phẩm | Danh mục, thuộc tính, đơn vị tính (UOM), barcode, ảnh sản phẩm |
| Đối tác | Khách hàng, nhà cung cấp, nhóm khách hàng, công nợ |
| Bảng giá & Khuyến mãi | Bảng giá linh hoạt, chương trình khuyến mãi |
| Thanh toán | Tiền mặt, chuyển khoản, MoMo, ZaloPay, COD, công nợ |
| Tài chính | Thu chi, phụ phí, báo cáo tài chính tổng quan |
| Báo cáo | Báo cáo doanh thu, tồn kho, sản phẩm |
| In ấn | In hóa đơn nhiệt (thermal printer), mẫu in tùy chỉnh |
| Người dùng | Phân quyền RBAC, quản lý tài khoản |
| Cài đặt | Cấu hình công ty, tồn kho, phương thức thanh toán |
┌──────────────────────────────────────────────────┐
│ Electron Shell │
│ ┌─────────────────┐ ┌───────────────────────┐│
│ │ Frontend │ │ Backend (Main Process)││
│ │ Vue 3 + Vite │◄──►│ Express.js API ││
│ │ Tailwind CSS │IPC │ Prisma ORM ││
│ │ Vue Router │ │ SQLite Database ││
│ └─────────────────┘ └───────────────────────┘│
└──────────────────────────────────────────────────┘
- Frontend: Vue 3 (Composition API) + Vite + Tailwind CSS, chạy trong Renderer Process.
- Backend: Express.js server chạy trong Main Process, giao tiếp với Frontend qua IPC và HTTP.
- ORM: Prisma +
better-sqlite3— truy vấn type-safe, migration có version. - Đóng gói:
electron-buildertạo installer cho Windows / macOS / Linux.
| Thành phần | Phiên bản tối thiểu |
|---|---|
| Node.js | >= 18.x (LTS) |
| npm | >= 9.x |
| Python | >= 3.x (cần cho better-sqlite3 native build) |
| Windows Build Tools | Khi build trên Windows: npm i -g windows-build-tools |
| Git | Bất kỳ phiên bản hiện đại |
git clone https://github.com/nguyenminh121/TheSMS.git
cd TheSMSnpm installLệnh
postinstallsẽ tự động chạyelectron-builder install-app-depsvà rebuildbetter-sqlite3cho đúng phiên bản Electron.
# Đẩy schema lên SQLite và seed dữ liệu mẫu
npm run db:setupHoặc từng bước:
npm run prisma:push # Đẩy schema (không tạo migration file)
npm run prisma:seed # Seed dữ liệu mẫunpm run devỨng dụng Electron sẽ khởi động với Hot Reload cho cả Frontend và Backend.
Tạo file .env tại thư mục gốc (tham khảo .env.example nếu có):
DATABASE_URL="file:./database/dev.db"Trong production, đường dẫn database sẽ được override tự động bởi
src/backend/config/database.jssang thư mụcuserDatacủa hệ điều hành.
File storage/user_data/config/company.json lưu thông tin công ty hiển thị trên hóa đơn:
{
"name": "CÔNG TY TNHH ABC",
"address": "123 Đường ABC, Quận 1, TP.HCM",
"phone": "0909 123 456",
"email": "info@company.com",
"taxCode": "0123456789",
"website": "https://www.company.com",
"logo": null
}# Phát triển
npm run dev # Chạy ứng dụng dev mode
# Code quality
npm run lint # Kiểm tra linting (ESLint)
npm run format # Format code (Prettier)
# Prisma / Database
npm run prisma:generate # Tạo lại Prisma Client từ schema
npm run prisma:migrate:dev # Tạo migration mới trong dev
npm run prisma:migrate # Áp dụng migration (deploy)
npm run prisma:migrate:reset # Reset toàn bộ database (cẩn thận!)
npm run prisma:migrate:status # Xem trạng thái migration
npm run prisma:push # Đẩy schema trực tiếp (không migration)
npm run prisma:seed # Seed dữ liệu mẫu
# Test in ấn
npm run test:printer # Test kết nối máy in nhiệt
npm run test:print # In thử ngay lập tức
# Build
npm run build:win # Build installer Windows (x64)
npm run build:win:portable # Build portable Windows
npm run build:mac # Build installer macOS
npm run build:linux # Build installer Linux
npm run build:all # Build tất cả nền tảngTheSMS/
├── database/
│ ├── schema.prisma # Schema database chính
│ ├── migrations/ # Lịch sử migration
│ ├── seed.js # Entry point seed
│ ├── seeders/ # Dữ liệu mẫu theo module
│ └── template.db # Template DB đóng gói vào app
│
├── scripts/
│ ├── build-database-template.js
│ ├── prisma-migrate.js
│ └── prisma-seed.js
│
├── src/
│ ├── backend/ # Main Process — Express API + Business Logic
│ │ ├── config/ # Cấu hình database, paths
│ │ ├── controllers/ # Route handlers (MVC Controller)
│ │ ├── middlewares/ # Auth, upload middleware
│ │ ├── routes/ # Định nghĩa API routes
│ │ ├── services/ # Business logic layer
│ │ ├── ipc/ # IPC handlers (Electron IPC)
│ │ ├── utils/ # Helpers: logger, printer, storage...
│ │ ├── server.js # Khởi tạo Express server
│ │ └── index.js # Entry point Main Process
│ │
│ ├── frontend/ # Renderer Process — Vue 3 App
│ │ └── src/
│ │ ├── api/ # Axios API client
│ │ ├── components/ # UI components dùng chung
│ │ ├── composables/ # Vue composables (useXxx)
│ │ ├── layouts/ # Layout: header, sidebar, footer
│ │ ├── router/ # Vue Router
│ │ ├── store/ # Global state
│ │ ├── utils/ # Utility functions
│ │ └── views/ # Các màn hình theo phân hệ
│ │ ├── auth/
│ │ ├── sales/
│ │ ├── products/
│ │ ├── stock-management/
│ │ ├── invoices/
│ │ ├── partners/
│ │ ├── finance/
│ │ ├── pricing/
│ │ ├── payments/
│ │ ├── warehouses/
│ │ ├── reports/
│ │ ├── users/
│ │ └── settings/
│ │
│ └── preload/
│ └── index.js # Preload script (bridge IPC)
│
├── storage/
│ └── user_data/
│ └── config/
│ └── company.json # Thông tin công ty
│
├── electron.vite.config.js # Cấu hình electron-vite
├── electron-builder.yml # Cấu hình đóng gói
├── package.json
└── tailwind.config.js
TheSMS sử dụng Prisma làm ORM với SQLite (better-sqlite3). Schema được định nghĩa tại database/schema.prisma.
# 1. Sửa database/schema.prisma
# 2. Tạo migration file mới
npm run prisma:migrate:dev
# 3. Prisma Client tự động regenerate sau migrate
# Hoặc chủ động chạy:
npm run prisma:generate| Model | Mô tả |
|---|---|
User, Role |
Người dùng, phân quyền RBAC |
Product, Category, Attribute |
Sản phẩm, danh mục, thuộc tính |
UOM, UnitType |
Đơn vị tính, quy đổi |
Order, OrderItem |
Đơn hàng |
Invoice, InvoiceItem |
Hóa đơn |
Import, ImportItem |
Phiếu nhập kho |
Stock, StockMovement |
Tồn kho, lịch sử xuất nhập |
Warehouse, WarehouseLocation |
Kho hàng, vị trí kho |
Customer, CustomerGroup |
Khách hàng, nhóm |
Supplier |
Nhà cung cấp |
Payment |
Thanh toán |
PriceList |
Bảng giá |
Promotion |
Khuyến mãi |
Surcharge |
Phụ phí |
BusinessExpense |
Chi phí kinh doanh |
npm run build:win # Tạo file installer .exe (NSIS)
npm run build:win:portable # Tạo file portable .exe (không cần cài đặt)npm run build:mac # Tạo file .dmgCần chạy trên máy macOS hoặc macOS VM. Cần Apple Developer Certificate để notarize.
npm run build:linux # Tạo file .AppImage / .debbetter-sqlite3là native module, cần được rebuild cho đúng phiên bản Electron khi build.- Prisma Client được generate trước khi build (
prisma generate). database/template.dbđược đóng gói vào app — đây là database trống dùng cho lần chạy đầu tiên.
Chào mừng mọi đóng góp! Vui lòng đọc kỹ hướng dẫn dưới đây trước khi tạo Pull Request.
- Fork repository về tài khoản của bạn.
- Tạo branch mới từ
main:git checkout -b feat/ten-tinh-nang # hoặc git checkout -b fix/ten-bug - Thực hiện thay đổi và tuân thủ Quy ước code.
- Commit theo Conventional Commits:
git commit -m "feat(sales): thêm tính năng đặt hàng trước" git commit -m "fix(invoice): sửa lỗi tính tổng tiền sai" git commit -m "refactor(product): tách logic UOM ra service"
- Push lên fork của bạn:
git push origin feat/ten-tinh-nang
- Tạo Pull Request vào branch
maincủa repo gốc.
| Loại | Mô tả |
|---|---|
feat |
Tính năng mới |
fix |
Sửa bug |
refactor |
Tái cấu trúc code (không thêm tính năng, không sửa bug) |
style |
Thay đổi giao diện, CSS |
docs |
Cập nhật tài liệu |
chore |
Cấu hình build, dependencies |
perf |
Cải thiện hiệu năng |
Trước khi bắt đầu làm một tính năng lớn, hãy tạo Issue để thảo luận. Bao gồm:
- Mô tả rõ vấn đề / tính năng
- Lý do cần thiết (business case)
- Đề xuất hướng thực hiện (nếu có)
- Dùng ESLint + Prettier — chạy
npm run lintvànpm run formattrước khi commit. - Không commit file
.env,*.db, hay file nhạy cảm. - Tên biến / hàm:
camelCase. Tên class / component:PascalCase. Hằng số:UPPER_SNAKE_CASE.
- Mỗi phân hệ có đúng một
controller, mộtservice, mộtroute. - Business logic nằm trong
services/, không nằm trongcontrollers/. - Truy vấn database chỉ trong
services/— không dùng Prisma trực tiếp trong controller. - Luôn dùng
try/catchvà trả về lỗi chuẩn:{ success: false, message: '...' }.
// Ví dụ response chuẩn
res.status(200).json({ success: true, data: result })
res.status(400).json({ success: false, message: 'Lỗi validate' })- Dùng Composition API (
<script setup>) — không dùng Options API. - Logic tái sử dụng đặt trong
composables/useXxx.js. - Gọi API qua
src/frontend/src/api/index.js— không dùngaxiostrực tiếp trong component. - Tên component:
PascalCase. Tên file component:PascalCase.vue. - Tên view (route):
XxxView.vue.
- Mỗi thay đổi schema phải có migration (
npm run prisma:migrate:dev). - Tên migration ngắn gọn, mô tả đúng thay đổi:
add_product_images,update_order_status. - Giá trị tiền tệ dùng
Decimal, không dùngFloat. - Enum cho các trạng thái — không dùng chuỗi tự do.
Nguyen Minh — ngthminh121@gmail.com — ngminh.io.vn
TheSMS v1.1.3 — Built with Electron + Vue 3 + Prisma + SQLite