Sistem pembelajaran bahasa Inggris dengan fokus pada Speaking & Writing untuk TOEFL iBT (Internet-Based Test) menggunakan Flask dan MySQL dengan integrasi AI (Alysa dan Gemini).
- Latihan soal speaking/writing dengan feedback AI real-time
- Pilihan model AI: Alysa (lokal) atau Gemini (cloud)
- Analisis grammar, coherence, dan scoring otomatis
- Riwayat latihan dan progress tracking
- Simulasi test TOEFL iBT
- Timer countdown untuk pengalaman test yang realistis
- Scoring komprehensif dengan feedback detail
- Laporan hasil test dengan saran improvement
- Upload gambar dengan teks bahasa Indonesia
- Ekstraksi teks otomatis menggunakan EasyOCR
- Terjemahan ke bahasa Inggris dengan penjelasan grammar
- Analisis vocabulary dan struktur kalimat
- URL:
/admin/login - Authentication: Simple Admin Auth (Username/Password dari
.env) - Fitur:
- CRUD (Create, Read, Update, Delete) untuk Learning Questions
- CRUD untuk Test Questions
- Interface modern dengan Tailwind CSS (Zinc theme)
- Proteksi route dengan decorator
@admin_required
- Backend: Flask, SQLAlchemy, Flask-JWT-Extended
- Database: MySQL
- AI Models:
- Alysa (LanguageTool + Sentence Transformers)
- Google Gemini API
- OCR: EasyOCR + PIL
- Authentication: JWT dengan bcrypt password hashing
# Install MySQL
brew install mysql # macOS
# atau
sudo apt-get install mysql-server # Ubuntu
# Start MySQL service
brew services start mysql # macOS
# atau
sudo systemctl start mysql # Ubuntugit clone <repository-url>
cd alysa-enginepip install -r requirements.txt# Copy environment file
cp .env.example .env
# Edit .env file dengan konfigurasi Anda
nano .envIsi file .env:
# Database Configuration
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_mysql_password
DB_NAME=toefl_learning
DB_PORT=3306
# JWT Configuration
JWT_SECRET_KEY=your-super-secret-jwt-key
# AI Model Configuration
GEMINI_API_KEY=your-gemini-api-key
# Flask Configuration
FLASK_ENV=development
FLASK_DEBUG=True# Jalankan script inisialisasi database
python init_db.pypython app.pyServer akan berjalan di http://localhost:5000
POST /api/register- Registrasi user baruPOST /api/login- Login user
GET /api/learning/questions- Ambil daftar soal learningPOST /api/learning/submit- Submit jawaban dengan AI feedback
POST /api/test/start- Mulai sesi test baruPOST /api/test/submit- Submit jawaban test lengkap
POST /api/ocr/translate- Upload gambar untuk OCR dan terjemahan
GET /api/user/attempts- Riwayat latihan userGET /api/user/test-sessions- Riwayat test sessionsGET /api/user/ocr-history- Riwayat OCR translations
GET /api/health- Status kesehatan API
id- Primary keyusername- Username unikemail- Email unikpassword_hash- Password ter-hashcreated_at- Timestamp pembuatan
id- Primary keyuser_id- Foreign key ke usersquestion_title- Judul soaluser_input- Jawaban userai_feedback- Feedback AI (JSON)score- Skor hasil evaluasicreated_at- Timestamp pengerjaan
id- Primary keyuser_id- Foreign key ke userstotal_score- Total skor keseluruhanai_feedback- Feedback keseluruhan (JSON)started_at- Waktu mulai testfinished_at- Waktu selesai test
id- Primary keyuser_id- Foreign key ke usersoriginal_text- Teks asli dari gambartranslated_and_explained- Hasil terjemahan + penjelasan (JSON)created_at- Timestamp pemrosesan
curl -X POST http://localhost:5000/api/register \
-H "Content-Type: application/json" \
-d '{
"username": "john_doe",
"email": "john@example.com",
"password": "password123"
}'curl -X POST http://localhost:5000/api/login \
-H "Content-Type: application/json" \
-d '{
"username": "john_doe",
"password": "password123"
}'curl -X POST http://localhost:5000/api/learning/submit \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"question_id": 1,
"answer": "My hometown is Jakarta, the capital city of Indonesia...",
"model": "alysa"
}'curl -X POST http://localhost:5000/api/ocr/translate \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-F "image=@/path/to/image.jpg"- Grammar Check: LanguageTool untuk deteksi kesalahan grammar
- Coherence Analysis: Sentence Transformers untuk analisis keterkaitan antar kalimat
- Scoring: Algoritma heuristik berdasarkan grammar errors dan coherence
- Kelebihan: Cepat, tidak memerlukan internet, gratis
- Kekurangan: Terbatas pada aturan grammar yang sudah ada
- Dynamic Analysis: AI generatif untuk analisis komprehensif
- Natural Feedback: Feedback yang lebih natural dan kontekstual
- Advanced Scoring: Scoring yang lebih akurat berdasarkan standar TOEFL
- Kelebihan: Lebih akurat, feedback lebih detail dan natural
- Kekurangan: Memerlukan API key, bergantung pada internet
export FLASK_ENV=development
export FLASK_DEBUG=True
python app.py# Install testing dependencies
pip install pytest pytest-flask
# Run tests
pytest# Initialize migration
flask db init
# Create migration
flask db migrate -m "Initial migration"
# Apply migration
flask db upgrade- Set environment variables untuk production
- Gunakan WSGI server seperti Gunicorn
- Setup reverse proxy dengan Nginx
- Configure SSL certificate
- Setup database backup strategy
# Install Gunicorn
pip install gunicorn
# Run with Gunicorn
gunicorn -w 4 -b 0.0.0.0:5000 app:app-
Database Connection Error
- Pastikan MySQL service berjalan
- Cek kredensial database di
.env - Pastikan database sudah dibuat
-
JWT Token Error
- Pastikan JWT_SECRET_KEY sudah di-set
- Cek format Authorization header:
Bearer <token>
-
AI Model Error
- Pastikan Gemini API key valid
- Cek koneksi internet untuk Gemini
- Pastikan dependencies AI model ter-install
-
OCR Error
- Pastikan format gambar didukung (jpg, png, etc.)
- Cek ukuran file tidak melebihi limit
- Pastikan gambar mengandung teks yang jelas
- Fork repository
- Create feature branch
- Commit changes
- Push to branch
- Create Pull Request
MIT License - lihat file LICENSE untuk detail lengkap.
Fitur Admin Dashboard diimplementasikan menggunakan pendekatan Server-Side Rendering (SSR) dengan Flask render_template dan styling menggunakan Tailwind CSS.
Sistem login admin dibuat sederhana namun aman untuk kebutuhan internal:
- Credentials: Username dan password admin disimpan di environment variables (
ADMIN_USERNAME,ADMIN_PASSWORD). - Session: Menggunakan Flask
sessionuntuk menyimpan status login (session['admin_logged_in'] = True). - Decorator: Custom decorator
@admin_requireddibuat untuk memproteksi route admin. Jika user belum login, akan di-redirect ke halaman login.
# app/routes/question.py
def admin_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not session.get('admin_logged_in'):
return redirect(url_for('question.admin_login'))
return f(*args, **kwargs)
return decorated_functionSetiap entitas (LearningQuestion dan TestQuestion) memiliki set route lengkap:
- List (GET): Mengambil semua data dari database dan me-render tabel.
- Create (GET/POST): Menampilkan form kosong (GET) dan memproses input baru (POST).
- Edit (GET/POST): Menampilkan form terisi data lama (GET) dan memproses update (POST).
- Delete (POST): Menghapus data berdasarkan ID.
- Base Template:
base.htmlmemuat CDN Tailwind CSS dan konfigurasi tema warna Zinc. - Components: Menggunakan utility classes Tailwind untuk membuat UI yang konsisten (Card, Form Input, Button, Table).
- Feedback: Menggunakan Flask
-messages untuk notifikasi sukses/gagal operasi.
Pastikan .env memiliki konfigurasi berikut:
ADMIN_USERNAME=admin
ADMIN_PASSWORD=adminJika tidak di-set, defaultnya adalah admin / admin.