ระบบแจ้งเหตุทุจริตเลือกตั้ง — Flutter CRUD + Node.js/Express + MySQL
- View Polling Stations: ดูรายการหน่วยเลือกตั้ง
- View Violation Types: ดูประเภทการทุจริตพร้อมระดับความรุนแรง
- View Reports: ดูรายการรายงานเหตุการณ์ทั้งหมด
- Create Report: สร้างรายงานเหตุการณ์ใหม่
- AI Classification Demo: จำลองการวิเคราะห์ด้วย AI
- Material 3 Design: UI ทันสมัยด้วย Material 3
- เปิด MySQL Workbench 8.0 CE และเชื่อมต่อ MySQL Server (localhost:3306)
- หรือตรวจสอบผ่าน Command Prompt:
sc query mysqlวิธีที่ 1 — ใช้ไฟล์ SQL อัตโนมัติ (แนะนำ):
cd server
mysql -u root -p PassWord < setup.sqlวิธีที่ 2 — รันทีละคำสั่งใน MySQL Workbench:
CREATE DATABASE IF NOT EXISTS per_fn;
USE per_fn;
CREATE TABLE IF NOT EXISTS polling_station (
station_id INT AUTO_INCREMENT PRIMARY KEY,
station_name VARCHAR(255) NOT NULL,
zone VARCHAR(100) NOT NULL,
province VARCHAR(100) NOT NULL
);
CREATE TABLE IF NOT EXISTS violation_type (
type_id INT AUTO_INCREMENT PRIMARY KEY,
type_name VARCHAR(255) NOT NULL,
severity VARCHAR(50) NOT NULL
);
CREATE TABLE IF NOT EXISTS incident_report (
report_id INT AUTO_INCREMENT PRIMARY KEY,
station_id INT NOT NULL,
type_id INT NOT NULL,
reporter_name VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
evidence_photo VARCHAR(500) NULL,
timestamp DATETIME NOT NULL,
ai_result VARCHAR(100) NULL,
ai_confidence DECIMAL(5,2) NULL,
FOREIGN KEY (station_id) REFERENCES polling_station(station_id),
FOREIGN KEY (type_id) REFERENCES violation_type(type_id)
);
INSERT INTO polling_station (station_id, station_name, zone, province) VALUES
(101, 'โรงเรียนวัดพระมหาธาตุ', 'เขต 1', 'นครศรีธรรมราช'),
(102, 'เต็นท์หน้าตลาดท่าวัง', 'เขต 1', 'นครศรีธรรมราช'),
(103, 'ศาลากลางหมู่บ้านคีรีวง', 'เขต 2', 'นครศรีธรรมราช'),
(104, 'หอประชุมอำเภอทุ่งสง', 'เขต 3', 'นครศรีธรรมราช');
INSERT INTO violation_type (type_id, type_name, severity) VALUES
(1, 'ซื้อสิทธิ์ขายเสียง (Buying Votes)', 'High'),
(2, 'ขนคนไปลงคะแนน (Transportation)', 'High'),
(3, 'หาเสียงเกินเวลา (Overtime Campaign)', 'Medium'),
(4, 'ทำลายป้ายหาเสียง (Vandalism)', 'Low'),
(5, 'เจ้าหน้าที่วางตัวไม่เป็นกลาง (Bias Official)', 'High');Backend อยู่ในโฟลเดอร์ server/ ค่า connection ตั้งอยู่ในไฟล์ server/.env:
DB_HOST=localhost
DB_USER=root
DB_PASS=PassWord
DB_NAME=per_fn
PORT=3000
หากต้องการเปลี่ยนค่า ให้แก้ไขที่ไฟล์ server/.env
cd server
npm install
node index.jsเมื่อสำเร็จจะแสดง:
Server running on http://localhost:3000
Database connected successfully
หากเห็น
Database connection failed:แสดงว่า MySQL มีปัญหา — ให้ตรวจสอบขั้นตอนที่ 1
- Health check:
http://localhost:3000/api/health - ดู stations:
http://localhost:3000/api/stations - ดู violation types:
http://localhost:3000/api/violation_types - ดู reports:
http://localhost:3000/api/reports
ค่า API URL ตั้งอยู่ที่ lib/constants/api.dart:
- Android Emulator: เปลี่ยนเป็น
http://10.0.2.2:3000/api - iOS Simulator / Web:
http://127.0.0.1:3000/api(ค่าเริ่มต้น) - Physical Device: เปลี่ยนเป็น IP ของเครื่องคอมพิวเตอร์ เช่น
http://192.168.x.x:3000/api
flutter pub get
flutter run -d chrome- เปิด Android Emulator ผ่าน Android Studio
- แก้
lib/constants/api.dartเป็นhttp://10.0.2.2:3000/api - รัน:
flutter pub get
flutter run- เปิด Developer Options + USB Debugging บนมือถือ
- ต่อสาย USB แล้วอนุญาต USB Debugging
- แก้
lib/constants/api.dartเป็น IP ของคอมพิวเตอร์ เช่นhttp://192.168.x.x:3000/api - รัน:
flutter pub get
flutter runflutter pub get
flutter build apk --releaseไฟล์ APK จะอยู่ที่:
build\app\outputs\flutter-apk\app-release.apk
flutter build apk --split-per-abiไฟล์ APK จะอยู่ที่ build\app\outputs\flutter-apk\:
app-armeabi-v7a-release.apk— สำหรับมือถือ 32-bit (เก่า)app-arm64-v8a-release.apk— สำหรับมือถือ 64-bit (ส่วนใหญ่)app-x86_64-release.apk— สำหรับ Emulator
แนะนำ: ใช้
app-arm64-v8a-release.apkสำหรับมือถือทั่วไป
วิธีที่ 1 — ติดตั้งผ่าน ADB:
adb install build\app\outputs\flutter-apk\app-release.apkวิธีที่ 2 — ติดตั้งด้วยมือ:
- คัดลอกไฟล์
.apkไปยังมือถือ (ผ่าน USB หรือ Google Drive) - เปิดไฟล์
.apkบนมือถือ - อนุญาต "ติดตั้งจากแหล่งที่ไม่รู้จัก" (Install from Unknown Sources)
- กด ติดตั้ง
- API Server ต้องรันอยู่ — มือถือต้องเข้าถึง API Server ได้
- แก้ API URL ก่อน build — ใน
lib/constants/api.dartต้องใส่ IP ของเครื่อง server เช่นhttp://192.168.x.x:3000/api(ห้ามใช้localhostหรือ127.0.0.1) - มือถือและคอมพิวเตอร์ต้องอยู่ WiFi เดียวกัน
- หาก build ไม่ผ่าน ให้ลอง:
flutter clean
flutter pub get
flutter build apk --release| Method | Endpoint | Description |
|---|---|---|
| GET | /api/health |
Health check (ไม่ต้องใช้ DB) |
| GET | /api/stations |
ดูหน่วยเลือกตั้งทั้งหมด |
| GET | /api/violation_types |
ดูประเภทการทุจริตทั้งหมด |
| GET | /api/reports |
ดูรายงานทั้งหมด (พร้อม JOIN) |
| POST | /api/create_report |
สร้างรายงานใหม่ |
| POST | /api/update_ai |
อัปเดตผล AI |
Final66106337/
├── lib/
│ ├── constants/
│ │ └── api.dart # API URL configuration
│ ├── models/
│ │ ├── station.dart # Station model
│ │ ├── violation_type.dart # ViolationType model
│ │ └── incident_report.dart # IncidentReport model
│ ├── screens/
│ │ ├── home_screen.dart # หน้าแรก
│ │ ├── stations_screen.dart # หน้าดูหน่วยเลือกตั้ง
│ │ ├── violation_types_screen.dart # หน้าดูประเภทการทุจริต
│ │ ├── reports_screen.dart # หน้าดูรายงาน
│ │ ├── report_form_screen.dart # หน้าสร้างรายงาน
│ │ └── report_detail_screen.dart # หน้ารายละเอียด + AI
│ ├── services/
│ │ └── api_service.dart # API service (HTTP calls)
│ └── main.dart
├── server/
│ ├── index.js # Express server + routes
│ ├── db.js # MySQL connection pool
│ ├── .env # Database config
│ ├── setup.sql # Database setup script
│ └── package.json
├── pubspec.yaml
└── README.md