MySQLManager.
MySQL admin client viết bằng Flutter — saved connections, browse databases → tables → rows, CRUD an toàn theo PK, và SQL shell tự do; cùng một codebase chạy trên 5 platform.
01.Overview
Tổng quanMọi DBA / dev backend đều gặp đúng tình huống này một lần: đang ngồi ngoài quán cà phê, sếp nhắn "check giùm bảng orders, sao 2 record sai trạng thái". Mở laptop / TablePlus thì mất 5 phút, mở web phpMyAdmin thì không có cổng public ra ngoài. Tôi muốn một client MySQL mỏng chạy thẳng trên điện thoại, gõ host + port + user là vào, không qua proxy nào.
Mysql-manager-mobile là Flutter app dùng mysql_client (driver Dart thuần, không cần native binary), nói chuyện trực tiếp với MySQL qua TCP. Có lưu profile connection, auto reconnect cái cuối cùng, browse databases → tables → rows, CRUD từng dòng theo primary key, và một SQL shell tự do. Cùng một codebase compile được cho Android, iOS, macOS, Linux, Windows — tôi dùng nó trên iPad cho ~90% công việc kiểm tra DB lặt vặt.
02.Features
Tính năng- 01Saved connectionsList · edit · auto-reconnect last used
Mỗi profile gồm name / host / port / user / password / autoReconnect. Tất cả lưu vào một file JSON ở
Directory.systemTempthông quaSessionStore. Khi mở app, nếu profile được dùng cuối cùng cóautoReconnect=true, nó tự connect ngay — đỡ một bước gõ tay. - 02Browse 3 lớpdatabases → tables → rows · pull-to-refresh
SHOW DATABASES→ list database;SHOW TABLES FROM <db>→ list table;SELECT * FROM db.table LIMIT 200→ preview row. Mỗi level có icon riêng (storage / table / row), pull-to-refresh native và breadcrumb navigation. - 03CRUD an toàn theo PKInsert · update · delete · LIMIT 1
Form Insert sinh từ
SHOW COLUMNS, có checkbox Set NULL per cột. Update / Delete bắt buộc có WHERE: ưu tiên columns cóKey=PRI, không thì WHERE bằng toàn bộ giá trị cũ. Mọi statement có thêmLIMIT 1— không bao giờ lỡ tay UPDATE toàn bảng. - 04SQL shell tự doFree-form SQL · auto detect SELECT vs DML
Trang Query có textarea + nút Run. Service phân loại:
SELECT / SHOW / DESC / EXPLAIN→ renderDataTablevới scroll ngang, các statement khác → hiện affected rows + last insert id. Parameter dùng named placeholder:v_xxx, identifier escape bằng backtick. - 055 platforms · 1 codebaseAndroid · iOS · macOS · Linux · Windows
Vì
mysql_clientlà Dart thuần (chỉ cần TCP), build chạy thẳng trên cả 5 platform Flutter hỗ trợ. UI Material 3 (seed teal#0D7A65),DataTabletự scroll cho màn nhỏ — tablet xài tốt, điện thoại vẫn dùng được nhờ horizontal scroll.
03.Tech stack
Công nghệ sử dụng| App | Flutter 3.11 · Dart · Material 3 (seed #0D7A65) · DataTable + Scrollbar · TextField + AlertDialog |
| MySQL driver | mysql_client ^0.0.27 · pure-Dart TCP client · named parameters (:v_xxx) · IResultSet → row.assoc() / row.colByName() |
| Safety | Identifier backtick-escape (` → ``) · WHERE bắt buộc trên UPDATE/DELETE · LIMIT 1 mọi mutation · _safeParam normalize tên cột về [a-zA-Z0-9_] |
| Storage | dart:io File JSON ở Directory.systemTemp · ConnectionStoreState + ConnectionProfile (id / name / host / port / user / password / autoReconnect) |
| UX | Friendly error: Android localhost → gợi ý 10.0.2.2 hoặc LAN IP · connection refused → gợi ý bind-address + firewall · access denied → user/password / remote permission |
| Platforms | Android · iOS · macOS · Linux · Windows · 1 Dart codebase, không native plugin |
04.How it works
Kiến trúc tổng thểToàn bộ logic SQL nằm trong một class MySqlAdminService giữ một instance MySQLConnection?. UI mỗi màn hình chỉ gọi 4-5 method (getDatabases, getTables, getTableSnapshot, insertRow / updateRow / deleteRow, executeCustomQuery) và render kết quả. Tách như vậy để khi đổi driver (sau này có thể chuyển sang mysql1 hay driver native qua FFI), UI không phải sửa.
Update một dòng là phần quan trọng nhất. updateRow chạy SHOW COLUMNS để biết cột nào có Key=PRI; nếu có PK thì WHERE = PK, không có thì WHERE = TẤT CẢ cột với giá trị cũ. NULL được dịch sang IS NULL (không thành = NULL luôn false). Mọi statement đều có LIMIT 1 ở cuối. Nếu vì lý do nào đó WHERE rỗng → Exception sớm trước cả khi gửi xuống MySQL.
"UPDATE và DELETE không bao giờ chạy không có WHERE. Đó là quy tắc tự áp đặt lên service, không phải lên user. Một app admin chạy trên điện thoại — nơi ngón tay run, mạng đứt, phải pin yếu — không thể cho phép 'lỡ tay UPDATE toàn bảng'."
BankNotify biến một chiếc điện thoại Android cũ thành cổng thanh toán DIY cho merchant nhỏ. App Flutter + Kotlin chạy nền trên điện thoại, đọc thông báo biến động số dư từ app ngân hàng và forward ngay về backend qua HTTP. Backend nhận thông báo, match với đơn hàng đang pending, rồi gọi callback để hoàn thành thanh toán — tất cả xảy ra trong vài giây, không cần tích hợp cổng thanh toán chính thức, không cần phí hàng tháng.

TradingSignals là công cụ phân tích tín hiệu mua/bán cá nhân cho crypto và chứng khoán — không phải bot copy trade đại trà, mà là hệ thống được xây riêng để phục vụ đúng một người, với dữ liệu kiểm chứng thực tế 2–5 năm trở lại. NestJS scan đồng thời trên nhiều khung thời gian từ 15 phút đến 1 tháng, chạy song song qua 4 engine độc lập: candlestick pattern, indicator, price action và volume analysis. Tín hiệu chỉ được ghi nhận khi nhiều khung đồng thuận — loại bỏ nhiễu, chỉ giữ lại những điểm vào lệnh thực sự đáng chú ý. Sau 10 ngày, hệ thống tự nhìn lại từng tín hiệu — đúng hay sai — tích lũy dần độ chính xác theo thời gian sử dụng. Kết quả được đẩy thẳng về Telegram cá nhân ngay khi có tín hiệu, pattern hiển thị realtime trên TradingView tích hợp trong Next.js.
API NestJS tự đăng nhập ChatGPT bằng puppeteer-real-browser (bypass Cloudflare anti-bot), hỗ trợ OTP qua email, lưu session để dùng lại cho route /ask để promt, và cron job mỗi giờ kiểm tra session — gửi cảnh báo qua Telegram khi hết hạn. Điều này giúp tôi promt và nhận câu trả lời trực tiếp từ api mà không cần mở trình duyệt.
CaptchaOCR là một micro-service FastAPI nhận ảnh captcha 4 chữ số dưới dạng base64 và trả về số nguyên tương ứng. Model ddddocr pretrained được load một lần duy nhất lúc process khởi động — mọi request sau đó chỉ là inference, latency vài chục ms mỗi ảnh. Service deploy bằng PM2 với auto-restart và giới hạn RAM cứng, đảm bảo chạy ổn định dài hạn mà không cần giám sát thủ công.
05.Bình luận
Ý kiến của bạnChưa có bình luận nào.