Vĩnh Khánh Food Tour là một ứng dụng Web Tiến Bộ (Progressive Web App - PWA) hỗ trợ khách du lịch khi tham quan Phố ẩm thực Vĩnh Khánh (Quận 4, TP.HCM). Ứng dụng cung cấp bản đồ số, thuyết minh đa ngôn ngữ tự động (Audio Guide), quét mã QR, và tính năng hỗ trợ giao tiếp cho người khuyết tật/người khó nói (AAC).
-
🗺️ Bản Đồ Số & Định Vị GPS (Interactive Map)
- Sử dụng Leaflet.js để hiển thị bản đồ trực quan.
- Định vị người dùng theo thời gian thực (Real-time GPS tracking).
- Tự động phát hiện khi người dùng đi vào vùng địa lý của một quán ăn (Geofencing) bằng Haversine formula và hiển thị gợi ý mở thuyết minh.
-
🔊 Thuyết Minh Tự Động Đa Ngôn Ngữ & Dịch AI (Multilingual Audio Guide)
- Hỗ trợ 20 ngôn ngữ quốc tế phổ biến (VI, EN, JA, ZH, KO, TH, FR, ES, DE, RU, PT, IT, ID...).
- Tích hợp tính năng Dịch AI Tự Động: Admin chỉ cần nhập văn bản nội dung quán ăn bằng Tiếng Việt hoặc Tiếng Anh. Hệ thống lazy-load bản dịch sang 18 ngôn ngữ còn lại khi du khách chọn, cache bằng RAM +
localStoragevà chống gọi trùng request. - Phát âm thanh thuyết minh sử dụng Web Speech API; nếu thiết bị thiếu voice hoặc voice lỗi, frontend fallback qua
/api/ttsđể lấyaudio/mpegtừ Google Translate TTS proxy, có cache header và range processing ổn định hơn trên mobile/LAN.
-
📱 Hỗ Trợ Offline & Cài Đặt PWA (Offline Support & Service Worker)
- Khả năng "Cài đặt" trực tiếp app web xuống màn hình Home Screen của điện thoại nhanh chóng.
- Sử dụng Service Worker để bộ nhớ hệ thống (Cache Storage) giữ lại giao diện UI nội bộ dự phòng mất mạng.
- Hiển thị thông báo khi mạng yếu, cho phép di chuyển bản đồ bình thường.
-
📷 Quét Mã QR (QR Scanner Integration)
- Tích hợp HTML5-QRCode quét máy ảnh trực tiếp trên trình duyệt.
- QR thực tế encode URL dạng
/index.html?tour=<TOUR_CODE>: quét bằng camera hệ thống hoặc scanner trong app sẽ mở tour, hiển thị danh sách quán theo thứ tự và cho chuyển tiếp từng quán. - Admin CMS tạo QR local bằng thư viện
qrcode; nếu CDN lỗi mới fallback sang QR server bên ngoài. - Mobile browser thường chặn autoplay, nên sau khi quét QR app mở chi tiết POI và hiện nút “Nghe thuyết minh” để user bấm phát audio hợp lệ.
-
💬 Nói Giúp Tôi (AAC Ngôn ngữ & Nhận diện tự động)
- Tính năng đặc biệt hỗ trợ quy trình giao tiếp hai chiều dành cho người câm/khuyết tật ngôn ngữ hoặc du khách nước ngoài mua hàng.
- Tính năng Nhấn & Nhận diện: Sử dụng thuật toán toán học Regex duyệt bảng nhóm mã Unicode giúp nhận diện tự động cấu trúc ngôn ngữ chữ viết (hỗ trợ phân biệt 50+ ngôn ngữ bao gồm tượng hình, Cyrillic, hệ Latin...).
- Tự động lấy cấu trúc ngôn ngữ nhận diện điểu khiển Web Speech API giao tiếp thoại cho chủ quán ăn.
-
📊 Xử lý & Quản Lý Dữ Liệu (Admin CMS & Analytics)
- Bảng điều khiển (Dashboard) đăng nhập bằng token HMAC ký server-side; token gửi qua
Authorization: Bearer ...cho các API quản trị. - Theo dõi số phiên truy cập, lưu vết (Log) sự kiện nghe Audio, quét QR tour và hoàn thành điểm đi.
- Dashboard tải lại 5 giây/lần khi đang mở trang Dashboard: widget QR Scans lấy
qr_scan, Top POIs chỉ xếp hạng theopoi_listen, Recent Activities lấy log mới nhất từ database, Heatmap dùng tọa độ analytics hoặc tọa độ POI fallback để demo LAN không bị trống. - Admin CMS có trang
Online Users: web app gửi heartbeat/api/presence/heartbeatmỗi 15 giây, admin xem danh sách phiên online qua/api/admin/online-usersvà có thể kick session đang sử dụng. - Quản lý POI toàn diện: Thêm, Sửa, Xóa, Xem báo cáo theo chuẩn REST API.
- Bảng điều khiển (Dashboard) đăng nhập bằng token HMAC ký server-side; token gửi qua
- Framework: ASP.NET Core 10 Web API
- Database: MongoDB (Atlas Cloud)
- Kiến trúc: RESTful API, Dependency Injection, CORS, tích hợp Middleware xử lý Analytics Auth.
- Ngôn ngữ: HTML5, Vanilla JavaScript, CSS3
- Thư viện bản đồ: Leaflet.js
- Quét QR: html5-qrcode
- Lưu trữ Offline: Service Worker PWA, Cache Storage API, Session Storage.
- Engine Xử lý Text & Audio: Google Translate API, Window Web Speech API.
- .NET 10 SDK
- MongoDB Atlas URI (Hoặc cài đặt MongoDB Compass dưới Local).
-
Sửa cấu hình Database (không commit secret): File
appsettings.jsonkhông chứa mật khẩu thật. Khi cần kết nối MongoDB, tạo file localappsettings.Local.jsontừ mẫuappsettings.Local.example.jsonhoặc dùng biến môi trườngMongoDB__ConnectionString:{ "MongoDB": { "ConnectionString": "mongodb+srv://<user>:<password>@cluster.mongodb.net/", "DatabaseName": "VinhKhanhFoodTour" } }Nếu chưa cấu hình MongoDB, backend tự mở demo API in-memory và frontend vẫn có demo fallback POI để bảo vệ chức năng UI/i18n/QR/TTS. Khi chạy thật, nên đặt thêm biến môi trường
AUTH_TOKEN_SECRETđể thay secret demo dùng ký token admin. -
Khởi Chạy Máy Chủ Backend API / LAN Demo: Mở terminal tại thư mục dự án và chạy:
dotnet run --project CShape/VinhKhanhFoodTour.Api/VinhKhanhFoodTour.Api.csproj
App bind mặc định
0.0.0.0:5000, nên máy khác cùng WiFi/LAN có thể truy cập bằng IP LAN của máy chạy demo. -
Truy Cập Ứng Dụng:
- Trên máy chạy demo:
http://localhost:5000/index.htmlvàhttp://localhost:5000/admin.html - Trên điện thoại/máy giảng viên cùng WiFi:
http://<IP-LAN-của-máy>:5000/index.html - Trang Admin LAN:
http://<IP-LAN-của-máy>:5000/admin.html - Có thể xem IP LAN app tự nhận tại
http://localhost:5000/api/system/network - Tài khoản Admin cấp sẵn mặc định:
admin/admin123 - Khi mở modal QR trong Admin, QR sẽ ưu tiên sinh link LAN để điện thoại quét mở được; nếu máy có nhiều card mạng, nhập đúng
http://192.168.x.x:5000vào ô LAN origin trong modal QR.
- Trên máy chạy demo:
Luồng thực tế khi demo QR là dùng camera mặc định của điện thoại quét mã QR tour đã in/dán tại cổng, QR mở thẳng URL http://<IP-LAN>:5000/index.html?tour=...; luồng này không cần Web Camera API trong app. Riêng nút “Quét QR” bên trong web app dùng Camera API, nên khi chạy qua LAN dạng HTTP một số trình duyệt sẽ chặn camera; muốn demo nút này cần HTTPS hoặc bật Insecure Origins cho địa chỉ http://<IP-LAN>:5000 trên Chrome.
- Mở
HUONG_DAN_BAO_VE_I18N_DEMO.mdđể xem câu trả lời theo kiểu giảng viên hỏi sequence → method → code. - Mô hình đa ngôn ngữ: Admin chỉ nhập
vi/en; 18 ngôn ngữ còn lại dịch runtime ở frontend, cache bằnglocalStorage+ RAM, đổi ngôn ngữ render ngay bằng cache/source rồi warm-up bản dịch POI ở nền. - Nút
record_voice_overcạnh dropdown dùng để test nhanh TTS của ngôn ngữ đang chọn; các mã nhưzh-CN,pt-BRđược chuẩn hóa để fallback audio phát đúng. - Trang CMS
Online Usersdùng để demo số người đang online và nútKick; khi bị kick, user app dừng audio/GPS và hiện màn hình "Phiên đã bị ngắt". - Nếu Google Translate/TTS hoặc MongoDB không khả dụng, app fallback về
vi/en, demo API in-memory và dữ liệu demo để buổi bảo vệ không bị trắng màn hình. - QR là luồng thực tế nhất khi GPS trong phố nhỏ bị lệch; app có banner nhắc quét QR nếu GPS lỗi hoặc chưa bắt vị trí.
- Demo cho giảng viên/điện thoại phải dùng
http://<IP-LAN>:5000, không dùng QR chứalocalhostvìlocalhosttrên điện thoại là chính điện thoại chứ không phải laptop chạy server.
- Google Translate/TTS client-side phù hợp demo; triển khai thật nên dùng API chính thức hoặc backend proxy để kiểm soát quota/lỗi mạng.
- GPS trong phố nhỏ có thể sai lệch; QR dán tại quán là luồng thực tế và ổn định hơn.
- Mobile browser thường chặn autoplay; app dùng prompt/nút nghe để tuân thủ chính sách trình duyệt.
- Unicode regex của AAC là heuristic nhận diện hệ chữ, không phải mô hình AI phân loại ngôn ngữ tuyệt đối.
- Nâng cấp tiếp theo: lưu translation cache vào IndexedDB, xuất QR PDF theo lô để in/dán tại quán, triển khai HTTPS/public hosting, thêm backend translation proxy và quản lý nội dung ảnh/menu thật.
VinhKhanhFoodTour.Api/
├── Controllers/ # Controller xử lý Endpoints (POIs, Auth Login, Analytics tracking).
├── Models/ # POCO C# đại diện JSON mapping cho Document MongoDB.
├── Services/ # Service xử lý tác vụ tương tác CRUD với DB.
├── wwwroot/ # Nơi chứa Web PWA UI Client (Tầng tĩnh)
│ ├── css/ # File Style định dạng giao diện PWA.
│ ├── js/ # Kiến trúc code Vanilla JS (app.js + admin.js).
│ ├── index.html # Cổng giao diện View chính của du khách.
│ ├── admin.html # Trang quản trị Backend cho Admin.
│ └── sw.js # File trung tâm Service Worker Offline Catch API.
├── Program.cs # Entry Point setup hệ thống Middleware ASP.NET.
└── appsettings.json # Hệ thống cài đặt chuỗi kết nối Variables.