Điều hành hội nghị tập trung – Biểu quyết nhanh chóng bằng mã QR
VNC QR Voting là giải pháp số hóa quy trình tổ chức hội nghị, đại hội và các phiên biểu quyết, từ khâu lập danh sách đại biểu, điểm danh, điều hành phiên họp, phát hành mã QR, ghi nhận phiếu biểu quyết cho đến trình chiếu kết quả và xuất biên bản.
Giải pháp được thiết kế theo mô hình Web – Mobile – Màn hình LED, giúp ban tổ chức quản lý tập trung, đại biểu tham gia trực tiếp bằng trình duyệt điện thoại và hội trường có thể hiển thị mã QR, tiến độ cũng như kết quả biểu quyết trên màn hình lớn.
Mục tiêu của hệ thống là giảm thao tác tổng hợp thủ công, hạn chế sai sót khi kiểm phiếu và hỗ trợ chủ tọa theo dõi tiến độ biểu quyết ngay trong thời gian hội nghị đang diễn ra.
Thông tin giải pháp
Nội dung - Thông tin
Hình thức Web • Mobile • Màn hình LED
Phạm vi hội nghị: • Đại hội • Biểu quyết
Phương thức biểu quyết: Mã QR trên thiết bị di động
Cập nhật kết quả: Realtime thông qua SSE
Dữ liệu: Dữ liệu hội nghị, đại biểu, phiên và phiếu biểu quyết
Trình chiếu: Màn hình LED / máy chiếu
Hình ảnh minh họa hệ thống

Màn hình trình chiếu kết quả biểu quyết thực tế
VNC QR Voting tập trung dữ liệu của hội nghị vào một hệ thống thống nhất, cung cấp các công cụ riêng cho ban tổ chức, chủ tọa, đại biểu và khu vực hội trường.
Thay vì sử dụng quy trình giấy hoặc tổng hợp phiếu thủ công, hệ thống cho phép tổ chức hội nghị theo một quy trình số hóa xuyên suốt:
Tạo hội nghị → Quản lý đại biểu → Điểm danh → Cấu hình phiên → Mở phiên → Quét QR → Biểu quyết → Ghi nhận phiếu → Theo dõi kết quả → Đóng phiên → Xuất dữ liệu → Lập biên bản.
Giải pháp hướng tới việc giảm khối lượng công việc thủ công và giúp chủ tọa theo dõi tình trạng biểu quyết trong thời gian thực.
1.1. Dành cho ban tổ chức – Chuẩn bị và điều hành hội nghị
Ban tổ chức có thể tạo hội nghị, nhập danh sách đại biểu, điểm danh, thiết lập nội dung biểu quyết và điều hành từng phiên.
Toàn bộ hoạt động quản trị được thực hiện tập trung trên giao diện desktop.
Các chức năng chính gồm:
1.2. Dành cho đại biểu – Quét mã QR và biểu quyết
Đại biểu tham gia phiên biểu quyết trực tiếp bằng trình duyệt trên điện thoại.
Quy trình cơ bản:
Quét mã QR → Tham gia phiên → Xác nhận thông tin → Chọn phương án → Xác nhận phiếu.
Không cần cài đặt ứng dụng di động riêng. Giao diện được thiết kế responsive để sử dụng trên smartphone.
Tùy theo cấu hình phiên, hệ thống có thể hỗ trợ:
1.3. Dành cho hội trường – Theo dõi và công bố kết quả
Tại khu vực hội trường, hệ thống có thể trình chiếu:
Kết quả được cập nhật trực tiếp thông qua SSE – Server-Sent Events, giúp màn hình trình chiếu nhận được snapshot dữ liệu từ máy chủ.
Sau khi kết thúc phiên, dữ liệu có thể được xuất thành CSV hoặc biên bản HTML để phục vụ lưu trữ và in ấn.
Lưu ý về trạng thái triển khai
Trong tài liệu này:
Đây là đánh giá kỹ thuật dựa trên bản mã hiện tại, không phải biên bản nghiệm thu toàn bộ hệ thống.
Hệ thống hiện được xây dựng theo kiến trúc monolith chia module.
Kiến trúc này sử dụng React để cung cấp các giao diện quản trị, biểu quyết và trình chiếu; Fastify đảm nhiệm API và phục vụ bản build frontend; PostgreSQL lưu trữ dữ liệu nghiệp vụ và bảo đảm tính nhất quán khi ghi nhận phiếu.
Kiến trúc hiện tại – Một instance ứng dụng
Quản trị & Chủ tọa
React • Ant Design • Desktop
↓
Đại biểu
Responsive Web • Trình duyệt Mobile
↓
Trình chiếu hội trường
LED / Máy chiếu • 3 kiểu biểu đồ
↓
REST / JSON
↓
SSE / Kết quả realtime
↓
Node.js 24 + TypeScript + Fastify 5
Hệ thống API bao gồm:
Quy trình vận hành QR Voting được tổ chức theo 5 bước chính:
Bước 1 – Chuẩn bị
Ban tổ chức tạo hội nghị, thêm hoặc import danh sách đại biểu, cấp quyền và thực hiện điểm danh.
Bước 2 – Cấu hình
Thiết lập:
Bước 3 – Mở phiên
Chủ tọa mở phiên biểu quyết và trình chiếu mã QR để đại biểu sử dụng điện thoại tham gia.
Bước 4 – Ghi nhận phiếu
Hệ thống kiểm tra:
Sau đó phiếu được commit vào cơ sở dữ liệu.
Bước 5 – Kết thúc
Chủ tọa đóng phiên.
Tùy chính sách cấu hình, hệ thống thực hiện công bố kết quả và cho phép xuất:
Các con số và nội dung xuất hiện trong ảnh là dữ liệu demo, được sử dụng để minh họa chức năng và luồng vận hành, không đại diện cho kết quả của hội nghị thực tế.
Quản trị / /admin/login
Kết nối API
Giao diện đăng nhập dành cho quản trị viên và chủ tọa.
Người dùng đăng nhập bằng email và mật khẩu. Backend cấp cookie HttpOnly và CSRF token, đồng thời kiểm tra quyền truy cập tại API.

Quản trị / /admin
Giao diện mô phỏng
Màn hình tổng quan cung cấp bố cục KPI về hội nghị, số lượng đại biểu, tình trạng điểm danh và phiên đang diễn ra.
Các số liệu trên giao diện hiện được khai báo cố định trong frontend và chưa tổng hợp trực tiếp từ API.

Quản trị / /admin/meetings
Kết nối API
Danh sách hội nghị được đọc từ PostgreSQL thông qua API.
Người quản trị có thể truy cập vào từng hội nghị để quản lý đại biểu và các phiên biểu quyết.

Quản trị / /admin/meetings
Kết nối API
Cho phép nhập:
Form được kết nối với API để tạo hội nghị.

Quản trị / /admin/meetings/...
Kết nối API
Màn hình điều hành hỗ trợ ba hình thức:
Chủ tọa có thể chỉnh sửa phiên ở trạng thái nháp, mở hoặc đóng phiên và mở màn hình trình chiếu.

Quản trị / /admin/meetings/...
Kết nối API
Cho phép thiết lập:

Quản trị / /admin/meetings/...
Kết nối API
Người quản trị có thể chọn số lượng phương án tối đa.
Danh sách ứng viên có thể được chỉnh sửa trước khi phiên được mở.

Quản trị / /admin/meetings/...
Kết nối API
Cho phép cập nhật nội dung và các lựa chọn của phiên DRAFT.
Sau khi phiên được mở, backend khóa cấu hình theo vòng đời nghiệp vụ.

Quản trị / /admin/meetings/...
Kết nối API
Màn hình demo gồm 12 đại biểu, trong đó 10 người có mặt.
Chức năng thêm đại biểu, import và điểm danh trên trang chi tiết hội nghị được kết nối API thật.

Quản trị / /admin/meetings/...
Kết nối API
Cho phép nhập:
Danh sách đại biểu được khóa chỉnh sửa khi hội nghị đã mở phiên.

Quản trị / /admin/meetings/...
Kết nối API
Cho phép upload file XLSX vào hội nghị.
Backend kiểm tra:
Quá trình ghi dữ liệu được thực hiện nguyên giao dịch.

Quản trị / /admin/delegates
Giao diện mô phỏng
Trang đại biểu độc lập hiện sử dụng dữ liệu mẫu và state trong bộ nhớ.
Nút QR điểm danh hiện chỉ hiển thị thông báo.
Để thao tác với dữ liệu thật, sử dụng tab đại biểu trong trang chi tiết hội nghị.

Quản trị / /admin/users
Giao diện mô phỏng
Giao diện cung cấp tìm kiếm, lọc, thêm, sửa và khóa tài khoản.
Hiện tại các thao tác này sử dụng state cục bộ.
Backend đã có vai trò ADMIN/CHAIR, trong khi các vai trò SECRETARY/SUPERVISOR trên màn hình chưa được backend hỗ trợ.

Quản trị / /admin/users
Giao diện mô phỏng
Form cho phép nhập thông tin cán bộ và vai trò.
Hiện thao tác lưu chỉ thực hiện trong state của giao diện và chưa gọi API tạo tài khoản.

Quản trị / /admin/reports
Giao diện mô phỏng
KPI và bảng tổng hợp hiện sử dụng dữ liệu mẫu.
Các nút xuất dữ liệu trên trang tổng hợp chưa tạo tệp thật.
Chức năng xuất CSV và biên bản thực tế hiện nằm ở từng phiên biểu quyết.

Quản trị / /admin/settings
Giao diện mô phỏng
Giao diện đề xuất cho thông tin tổ chức và kỳ họp.
Hiện chưa có API lưu cấu hình hệ thống.

Quản trị / /admin/settings
Giao diện mô phỏng
Giao diện đề xuất các thiết lập về ngưỡng thông qua và quy tắc vận hành.
Đây chưa phải cấu hình đã được áp dụng trực tiếp vào engine kiểm phiếu.

Quản trị / /admin/settings
Giao diện mô phỏng
Giao diện cấu hình hiển thị sân khấu và màn hình trình chiếu.
Các tham số hiện chưa được lưu và đồng bộ trực tiếp sang giao diện trình chiếu.

Quản trị / /admin/settings
Giao diện mô phỏng
Đây là giao diện mô phỏng.
Hiện:

Quản trị / /admin/audit-logs
Giao diện mô phỏng
Tuyến /admin/audit-logs hiện render trang Cài đặt.
Backend có audit nghiệp vụ nhưng frontend chưa có màn hình nhật ký riêng.

Đại biểu / /vote/5AF8F9E1D4
Kết nối API
Mã QR mở liên kết chứa mã phiên.
Đại biểu nhập mã và họ tên. Backend đối chiếu danh sách theo cấu hình của phiên.

Đại biểu / /vote/5AF8F9E1D4
Kết nối API
Phiên nghị quyết có ba phương án.
Đại biểu lựa chọn phương án trên điện thoại và xác nhận phiếu bằng token riêng.

Đại biểu / /vote/5AF8F9E1D4
Kết nối API
Backend ghi nhận phiếu vào dữ liệu demo.
Đối với phiên công khai, đại biểu có thể đổi phiếu khi phiên vẫn còn mở và cấu hình cho phép.

Đại biểu / /vote/5AF8F9E1D4
Kết nối API
Đại biểu có thể lựa chọn lại trong thời gian phiên còn mở.
Phiếu chỉ được cập nhật sau lần xác nhận tiếp theo.

Đại biểu / /vote/C0CD0B3614
Kết nối API
Phiên biểu quyết một lựa chọn cho phép sử dụng các phương án tùy chỉnh theo nội dung hội nghị.

Đại biểu / /vote/184CE7E122
Kết nối API
Phiên kín không yêu cầu nhập họ tên.
Đại biểu nhập mã định danh và mật khẩu phiên.
Mã tự khai hiện chưa bảo đảm mỗi người chỉ sử dụng một định danh duy nhất.

Đại biểu / /vote/184CE7E122
Kết nối API
Cho phép bầu tối đa hai trong bốn ứng viên.
Bộ đếm hiển thị số lượng lựa chọn hiện tại và backend kiểm tra giới hạn độc lập.

Đại biểu / /vote/184CE7E122
Kết nối API
Hệ thống thông báo khi đại biểu lựa chọn vượt quá số lượng được cấu hình.
Các lựa chọn hợp lệ trước đó vẫn được giữ nguyên.

Đại biểu / /vote/184CE7E122
Kết nối API
Hệ thống ghi nhận tổng lựa chọn và trạng thái đã bỏ phiếu.
Không lưu quan hệ danh tính – lựa chọn trong bảng phiếu công khai.
Phiên kín hiện không hỗ trợ đổi phiếu.

Đại biểu / /vote/0000000000
Kết nối API
Hệ thống hiển thị thông báo khi mã phiên không tồn tại.
Người dùng được hướng dẫn nhận biết cần quét lại mã QR hợp lệ.

Trình chiếu / /present/...
Kết nối API
Kết quả thật của phiên demo cho thấy 9/12 đại biểu đã bỏ phiếu.
Màn hình nhận snapshot thông qua SSE, đồng thời hiển thị:

Trình chiếu / /present/...
Kết nối API
Cho phép chuyển cách hiển thị kết quả sang biểu đồ thanh ngang.
Kiểu biểu đồ này phù hợp khi cần so sánh nhiều phương án hoặc phương án có tên dài.

Trình chiếu / /present/...
Kết nối API
Biểu đồ tròn thể hiện cơ cấu lựa chọn.
Khu vực bên phải hiển thị thông tin tham gia và mã QR của cùng phiên biểu quyết.

Trình chiếu / /present/...
Kết nối API
Trạng thái kết thúc được cập nhật từ máy chủ.
Sau khi phiên đóng, các phiếu mới sẽ bị hệ thống từ chối.

Quản trị / /admin/meetings/...
Kết nối API
Bảng phiên hiển thị trạng thái đã đóng.
Người điều hành có thể thực hiện thao tác công bố và sử dụng các chức năng:

Báo cáo / /api/sessions/.../minutes
Kết nối API
Backend tạo biên bản HTML với:
Biên bản có thể được lưu thành PDF bằng chức năng in của trình duyệt.

Bảng dưới đây phân biệt rõ các chức năng đã được đối chiếu với phần cần tiếp tục hoàn thiện.
| Hạng mục | Hiện trạng đã đối chiếu | Việc cần hoàn thiện |
| Hội nghị & phiên | Kết nối API: Tạo hội nghị, danh sách, cấu hình và điều hành phiên. | Mở rộng UI cho phân công chủ tọa, lưu trữ và các tham số backend chưa đưa lên form. |
| Đại biểu | Trong hội nghị: Thêm/import/điểm danh nối API. Trang đại biểu độc lập là mẫu. |
Hợp nhất trang độc lập với nguồn dữ liệu và phạm vi hội nghị thực. |
| Bỏ phiếu | Kết nối API: Phiếu công khai, kín, một/nhiều lựa chọn và xác nhận. | Tăng cường định danh; hiển thị rõ hơn trạng thái hết hạn, đóng phiên và mất token. |
| Trình chiếu | SSE thực tế: Ba biểu đồ, QR và trạng thái OPEN/CLOSED. | Sửa phần nội dung cạnh phải đang bị cắt trên desktop; loại bỏ fallback số liệu demo khi snapshot ẩn/chưa tải; kiểm thử chính sách công bố trên UI. |
| Báo cáo | Xuất theo phiên: CSV và biên bản HTML hoạt động. Trang tổng hợp hiện là mẫu. | Tích hợp dashboard báo cáo; PDF phía máy chủ/ký số là phạm vi bổ sung nếu có nhu cầu. |
| Tài khoản | UI mô phỏng: Backend có ADMIN/CHAIR; UI người dùng chưa nối API. | Tích hợp CRUD và thống nhất vai trò thư ký/kiểm phiếu trước khi bổ sung. |
| Cài đặt & nhật ký | UI mô phỏng: Cài đặt chưa lưu backend; tuyến audit đang trỏ sang trang cài đặt. |
Xây dựng API cấu hình, trang nhật ký riêng và chức năng backup vận hành có kiểm soát. |
| Bảo mật | Cookie HttpOnly, scrypt, CSRF, token băm SHA-256, phân quyền và rate limit. | HTTPS, quy trình cấp mã và 2FA nếu nghiệp vụ yêu cầu. Không coi checkbox 2FA trên UI là tính năng đã triển khai. |
Backend hiện không lưu ánh xạ trực tiếp giữa danh tính và lựa chọn trong bảng phiếu công khai.
Tuy nhiên, cơ chế hiện tại chưa phải giao thức ẩn danh mật mã trước người vận hành.
Đối với phiên kín, hệ thống hiện tự sinh mã ở frontend và không bắt buộc roster. Vì vậy, cơ chế hiện tại chưa thể bảo đảm tuyệt đối rằng mỗi người chỉ có một phiếu bằng danh tính đã xác thực.
Nếu triển khai cho các hội nghị yêu cầu mức độ xác thực và kiểm soát cao, cần xác định rõ:
Lộ trình dưới đây là phương án đề xuất để tiếp tục phát triển từ phiên bản hiện tại.
Thời gian và chi phí triển khai cần được xác định sau khi chốt:
Thống nhất quy chế và phạm vi
Xác định:
Đầu ra:
Kết nối đầy đủ giao diện với dữ liệu thật
Tiếp tục hoàn thiện:
Đầu ra: toàn bộ thao tác trong phạm vi triển khai sử dụng dữ liệu lưu bền vững và phản ánh đúng quyền của từng người dùng.
Kiểm chứng trong điều kiện hội trường thực tế
Thực hiện kiểm thử:
Đầu ra:
Triển khai, đào tạo và bàn giao
Các công việc bao gồm:
Đầu ra:
Môi trường đang chạy
Ứng dụng: localhost:3000/admin
API: Swagger / OpenAPI tại /documentation
Database: PostgreSQL 17 thông qua Docker, cổng local 55432.
Hội nghị demo
[DEMO PROPOSAL] Hội nghị chuyển đổi số 2026
Phiên đã được chụp hình và đóng sau khi lấy ảnh kết quả.
Tài khoản quản trị được lấy từ môi trường local và không nhúng thông tin đăng nhập vào tài liệu.
Mô hình triển khai đề xuất:
Trình duyệt → Reverse Proxy HTTPS → Ứng dụng Node.js → PostgreSQL trong mạng riêng
Một instance là cấu hình khởi đầu.
Trong trường hợp triển khai nhiều replica, cần có:
Lưu ý đối với mã QR
Mã QR phải trỏ tới domain hoặc địa chỉ IP mà điện thoại của đại biểu có thể truy cập được.
Mã QR sử dụng localhost trong các ảnh demo chỉ phục vụ mục đích minh họa trên máy phát triển và không sử dụng trực tiếp cho hội trường thực tế.
Trước khi đưa hệ thống QR Voting vào vận hành chính thức, có thể sử dụng các tiêu chí sau để kiểm tra:
Quyền truy cập
Quyền của quản trị viên và chủ tọa phải đúng phạm vi hội nghị.
Các thao tác trái quyền phải bị backend từ chối.
Chống trùng phiếu
Gửi lại hoặc gửi đồng thời không tạo phiếu trùng.
Dữ liệu tổng hợp phải khớp với số lượng người đã bỏ phiếu.
Công bố kết quả
Kết quả phải được hiển thị đúng chính sách:
Chính sách này cần đồng nhất giữa:
Luồng biểu quyết
Quy trình:
Quét QR → Tham gia → Chọn phương án → Bỏ phiếu → Xác nhận
phải hoạt động ổn định trên các dòng điện thoại và mạng hội trường đã được lựa chọn.
Báo cáo và biên bản
CSV, biên bản và nội dung trình chiếu phải khớp dữ liệu của phiên.
Sao lưu phải có khả năng phục hồi thử nghiệm.
Kiểm thử tải
Quy mô tải, thời gian đáp ứng và thời gian khôi phục cần được đo lường và thống nhất trước khi nghiệm thu.
| Bằng chứng | Kết luận | Nguồn trong dự án |
| Build frontend/backend | Build thành công; Vite cảnh báo bundle lớn và cần tối ưu trước production. | package.json, client/package.json |
| Ảnh từng màn hình | Ảnh chụp browser thật, gồm desktop, mobile và trình chiếu. | docs/proposal/screenshots/, screens.json |
| Luồng demo API + UI | Tạo hội nghị/đại biểu/phiên; ghi phiếu công khai và kín, đóng phiên, xuất CSV/biên bản. | scripts/capture-proposal.mjs, capture-verification.json |
| Đối chiếu hiện trạng | Phân biệt UI mock với module backend và giới hạn quyền. |
client/src/features/, src/modules/, migrations/ |
Việc sử dụng QR Voting giúp chuyển một phần quan trọng của quy trình biểu quyết từ phương thức thủ công sang môi trường số.
Quản lý tập trung
Ban tổ chức có thể quản lý hội nghị, đại biểu và các phiên biểu quyết trên một hệ thống thống nhất.
Đại biểu biểu quyết trực tiếp bằng điện thoại
Đại biểu không cần cài ứng dụng riêng mà có thể sử dụng trình duyệt trên smartphone để truy cập phiên biểu quyết.
Biểu quyết bằng mã QR
Mã QR giúp rút ngắn thao tác truy cập phiên.
Đại biểu chỉ cần sử dụng camera hoặc trình quét QR trên điện thoại để mở liên kết của phiên.
Theo dõi kết quả trên màn hình lớn
Màn hình LED hoặc máy chiếu có thể hiển thị mã QR, tiến độ và biểu đồ kết quả.
Cập nhật kết quả realtime
Cơ chế SSE cho phép màn hình trình chiếu nhận snapshot dữ liệu từ máy chủ.
Hỗ trợ nhiều hình thức biểu quyết
Hệ thống hiện có các hình thức:
Xuất dữ liệu và lập biên bản
Dữ liệu có thể xuất CSV và biên bản HTML theo từng phiên, phục vụ việc lưu trữ, kiểm tra và in ấn.
Giải pháp có thể được nghiên cứu triển khai cho nhiều mô hình tổ chức có nhu cầu quản lý đại biểu và biểu quyết điện tử, chẳng hạn:
Tùy quy mô và yêu cầu thực tế, hệ thống có thể được cấu hình về số lượng đại biểu, số phiên, hình thức biểu quyết, phương thức xác thực, chính sách công bố và hạ tầng triển khai.
VNC QR Voting được xây dựng theo hướng số hóa xuyên suốt quy trình tổ chức hội nghị, từ quản lý đại biểu, điểm danh, cấu hình phiên biểu quyết, phát hành mã QR, ghi nhận phiếu, theo dõi kết quả realtime đến xuất dữ liệu và lập biên bản.
Kiến trúc hiện tại sử dụng React, TypeScript, Node.js, Fastify và PostgreSQL, kết hợp SSE để cập nhật kết quả trên màn hình trình chiếu.
Hệ thống đã có các luồng chức năng có thể trình diễn và đối chiếu, đồng thời tài liệu cũng phân biệt rõ giữa chức năng đã kết nối API, giao diện mô phỏng và các nội dung đề xuất hoàn thiện.
Trước khi triển khai chính thức, cần tiếp tục hoàn thiện các nội dung liên quan đến phân quyền, định danh đại biểu, biểu quyết kín, báo cáo, nhật ký, sao lưu, bảo mật, kiểm thử tải và nghiệm thu trong điều kiện hội trường thực tế.
Với mô hình Web – Mobile – Màn hình LED, giải pháp có thể trở thành nền tảng để tổ chức các phiên hội nghị và đại hội có biểu quyết điện tử bằng mã QR, giảm thao tác thủ công và tạo quy trình quản lý dữ liệu tập trung hơn.