# Membina Aplikasi Perbankan Bahagian 2: Membina Borang Log Masuk dan Pendaftaran
## Kuiz Pra-Kuliah
[Kuiz pra-kuliah](https://ff-quizzes.netlify.app/web/quiz/43)
Pernahkah anda mengisi borang dalam talian dan ia menolak format e-mel anda? Atau kehilangan semua maklumat apabila anda klik hantar? Kita semua pernah mengalami situasi yang menjengkelkan ini.
Borang adalah jambatan antara pengguna anda dan fungsi aplikasi anda. Seperti protokol berhati-hati yang digunakan oleh pengawal trafik udara untuk membimbing pesawat dengan selamat ke destinasi mereka, borang yang direka dengan baik memberikan maklum balas yang jelas dan mencegah kesilapan yang mahal. Borang yang buruk, sebaliknya, boleh membuat pengguna menjauh lebih cepat daripada komunikasi yang salah di lapangan terbang yang sibuk.
Dalam pelajaran ini, kita akan mengubah aplikasi perbankan statik anda menjadi aplikasi interaktif. Anda akan belajar membina borang yang memvalidasi input pengguna, berkomunikasi dengan pelayan, dan memberikan maklum balas yang berguna. Anggaplah ia sebagai membina antara muka kawalan yang membolehkan pengguna menavigasi ciri aplikasi anda.
Pada akhirnya, anda akan mempunyai sistem log masuk dan pendaftaran lengkap dengan validasi yang membimbing pengguna ke arah kejayaan dan bukannya kekecewaan.
## Prasyarat
Sebelum kita mula membina borang, mari pastikan anda telah menyediakan semuanya dengan betul. Pelajaran ini bermula tepat di mana kita berhenti dalam pelajaran sebelumnya, jadi jika anda melangkau ke depan, anda mungkin ingin kembali dan memastikan asasnya berfungsi terlebih dahulu.
### Persediaan Diperlukan
| Komponen | Status | Penerangan |
|----------|--------|------------|
| [Templat HTML](../1-template-route/README.md) | โ Diperlukan | Struktur asas aplikasi perbankan anda |
| [Node.js](https://nodejs.org) | โ Diperlukan | Runtime JavaScript untuk pelayan |
| [Pelayan API Bank](../api/README.md) | โ Diperlukan | Perkhidmatan backend untuk penyimpanan data |
> ๐ก **Tip Pembangunan**: Anda akan menjalankan dua pelayan berasingan secara serentak โ satu untuk aplikasi perbankan front-end anda dan satu lagi untuk API backend. Persediaan ini mencerminkan pembangunan dunia sebenar di mana perkhidmatan front-end dan backend beroperasi secara bebas.
### Konfigurasi Pelayan
**Persekitaran pembangunan anda akan termasuk:**
- **Pelayan front-end**: Menyediakan aplikasi perbankan anda (biasanya port `3000`)
- **Pelayan API backend**: Mengendalikan penyimpanan dan pengambilan data (port `5000`)
- **Kedua-dua pelayan** boleh berjalan serentak tanpa konflik
**Menguji sambungan API anda:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Jika anda melihat respons versi API, anda sudah bersedia untuk meneruskan!**
---
## Memahami Borang dan Kawalan HTML
Borang HTML adalah cara pengguna berkomunikasi dengan aplikasi web anda. Anggaplah ia sebagai sistem telegraf yang menghubungkan tempat-tempat jauh pada abad ke-19 โ ia adalah protokol komunikasi antara niat pengguna dan respons aplikasi. Apabila direka dengan teliti, ia menangkap kesilapan, membimbing format input, dan memberikan cadangan yang berguna.
Borang moden jauh lebih canggih daripada input teks asas. HTML5 memperkenalkan jenis input khusus yang secara automatik mengendalikan validasi e-mel, format nombor, dan pemilihan tarikh. Penambahbaikan ini memberi manfaat kepada kebolehaksesan dan pengalaman pengguna mudah alih.
### Elemen Borang Penting
**Blok binaan yang diperlukan setiap borang:**
```html
```
**Apa yang dilakukan oleh kod ini:**
- **Mencipta** bekas borang dengan pengenal unik
- **Menentukan** kaedah HTTP untuk penghantaran data
- **Mengaitkan** label dengan input untuk kebolehaksesan
- **Menentukan** butang hantar untuk memproses borang
### Jenis Input Moden dan Atribut
| Jenis Input | Tujuan | Contoh Penggunaan |
|-------------|--------|-------------------|
| `text` | Input teks umum | `` |
| `email` | Validasi e-mel | `` |
| `password` | Input teks tersembunyi | `` |
| `number` | Input angka | `` |
| `tel` | Nombor telefon | `` |
> ๐ก **Kelebihan HTML5 Moden**: Menggunakan jenis input tertentu memberikan validasi automatik, papan kekunci mudah alih yang sesuai, dan sokongan kebolehaksesan yang lebih baik tanpa JavaScript tambahan!
### Jenis Butang dan Kelakuan
```html
```
**Apa yang dilakukan oleh setiap jenis butang:**
- **Butang hantar**: Mencetuskan penghantaran borang dan menghantar data ke endpoint yang ditentukan
- **Butang reset**: Memulihkan semua medan borang ke keadaan awal mereka
- **Butang biasa**: Tidak memberikan kelakuan lalai, memerlukan JavaScript khusus untuk fungsi
> โ ๏ธ **Nota Penting**: Elemen `` adalah penutup sendiri dan tidak memerlukan tag penutup. Amalan terbaik moden adalah menulis `` tanpa garis miring.
### Membina Borang Log Masuk Anda
Sekarang mari kita cipta borang log masuk praktikal yang menunjukkan amalan borang HTML moden. Kita akan bermula dengan struktur asas dan secara beransur-ansur meningkatkannya dengan ciri kebolehaksesan dan validasi.
```html
Bank App
Login
```
**Memecahkan apa yang berlaku di sini:**
- **Menyusun** borang dengan elemen HTML5 semantik
- **Mengelompokkan** elemen berkaitan menggunakan bekas `div` dengan kelas bermakna
- **Mengaitkan** label dengan input menggunakan atribut `for` dan `id`
- **Termasuk** atribut moden seperti `autocomplete` dan `placeholder` untuk UX yang lebih baik
- **Menambah** `novalidate` untuk mengendalikan validasi dengan JavaScript dan bukannya lalai pelayar
### Kuasa Label yang Betul
**Mengapa label penting untuk pembangunan web moden:**
```mermaid
graph TD
A[Label Element] --> B[Screen Reader Support]
A --> C[Click Target Expansion]
A --> D[Form Validation]
A --> E[SEO Benefits]
B --> F[Accessible to all users]
C --> G[Better mobile experience]
D --> H[Clear error messaging]
E --> I[Better search ranking]
```
**Apa yang dicapai oleh label yang betul:**
- **Membolehkan** pembaca skrin mengumumkan medan borang dengan jelas
- **Meluaskan** kawasan yang boleh diklik (klik pada label memfokuskan input)
- **Meningkatkan** kebolehgunaan mudah alih dengan sasaran sentuhan yang lebih besar
- **Menyokong** validasi borang dengan mesej ralat yang bermakna
- **Meningkatkan** SEO dengan memberikan makna semantik kepada elemen borang
> ๐ฏ **Matlamat Kebolehaksesan**: Setiap input borang harus mempunyai label yang berkaitan. Amalan mudah ini menjadikan borang anda boleh digunakan oleh semua orang, termasuk pengguna kurang upaya, dan meningkatkan pengalaman untuk semua pengguna.
### Membina Borang Pendaftaran
Borang pendaftaran memerlukan maklumat yang lebih terperinci untuk mencipta akaun pengguna lengkap. Mari kita bina dengan ciri HTML5 moden dan kebolehaksesan yang dipertingkatkan.
```html
Register
```
**Dalam kod di atas, kita telah:**
- **Mengatur** setiap medan dalam bekas div untuk gaya dan susun atur yang lebih baik
- **Menambah** atribut `autocomplete` yang sesuai untuk sokongan autofill pelayar
- **Termasuk** teks placeholder yang berguna untuk membimbing input pengguna
- **Menetapkan** lalai yang masuk akal menggunakan atribut `value`
- **Menerapkan** atribut validasi seperti `required`, `maxlength`, dan `min`
- **Menggunakan** `type="number"` untuk medan baki dengan sokongan perpuluhan
### Meneroka Jenis Input dan Kelakuan
**Jenis input moden memberikan fungsi yang dipertingkatkan:**
| Ciri | Kelebihan | Contoh |
|------|----------|--------|
| `type="number"` | Papan kekunci angka pada mudah alih | Memudahkan kemasukan baki |
| `step="0.01"` | Kawalan ketepatan perpuluhan | Membolehkan sen dalam mata wang |
| `autocomplete` | Autofill pelayar | Penyelesaian borang lebih cepat |
| `placeholder` | Petunjuk kontekstual | Membimbing jangkaan pengguna |
> ๐ฏ **Cabaran Kebolehaksesan**: Cuba navigasi borang menggunakan hanya papan kekunci anda! Gunakan `Tab` untuk bergerak antara medan, `Space` untuk menandakan kotak, dan `Enter` untuk menghantar. Pengalaman ini membantu anda memahami bagaimana pengguna pembaca skrin berinteraksi dengan borang anda.
## Memahami Kaedah Penghantaran Borang
Apabila seseorang mengisi borang anda dan klik hantar, data itu perlu pergi ke suatu tempat โ biasanya ke pelayan yang boleh menyimpannya. Terdapat beberapa cara berbeza ini boleh berlaku, dan mengetahui yang mana satu untuk digunakan boleh menyelamatkan anda daripada beberapa sakit kepala kemudian.
Mari kita lihat apa yang sebenarnya berlaku apabila seseorang klik butang hantar itu.
### Kelakuan Lalai Borang
Pertama, mari kita perhatikan apa yang berlaku dengan penghantaran borang asas:
**Uji borang semasa anda:**
1. Klik butang *Daftar* dalam borang anda
2. Perhatikan perubahan dalam bar alamat pelayar anda
3. Perhatikan bagaimana halaman dimuat semula dan data muncul dalam URL

### Perbandingan Kaedah HTTP
```mermaid
graph TD
A[Form Submission] --> B{HTTP Method}
B -->|GET| C[Data in URL]
B -->|POST| D[Data in Request Body]
C --> E[Visible in address bar]
C --> F[Limited data size]
C --> G[Bookmarkable]
D --> H[Hidden from URL]
D --> I[Large data capacity]
D --> J[More secure]
```
**Memahami perbezaan:**
| Kaedah | Kes Penggunaan | Lokasi Data | Tahap Keselamatan | Had Saiz |
|--------|---------------|-------------|-------------------|----------|
| `GET` | Pertanyaan carian, penapis | Parameter URL | Rendah (kelihatan) | ~2000 aksara |
| `POST` | Akaun pengguna, data sensitif | Badan permintaan | Tinggi (tersembunyi) | Tiada had praktikal |
**Memahami perbezaan asas:**
- **GET**: Menambahkan data borang ke URL sebagai parameter pertanyaan (sesuai untuk operasi carian)
- **POST**: Termasuk data dalam badan permintaan (penting untuk maklumat sensitif)
- **Had GET**: Kekangan saiz, data kelihatan, sejarah pelayar yang berterusan
- **Kelebihan POST**: Kapasiti data yang besar, perlindungan privasi, sokongan muat naik fail
> ๐ก **Amalan Terbaik**: Gunakan `GET` untuk borang carian dan penapis (pengambilan data), gunakan `POST` untuk pendaftaran pengguna, log masuk, dan penciptaan data.
### Mengkonfigurasi Penghantaran Borang
Mari kita konfigurasikan borang pendaftaran anda untuk berkomunikasi dengan betul dengan API backend menggunakan kaedah POST:
```html
```
**Memahami pengesahan yang dipertingkatkan:**
- **Menggabungkan** penunjuk medan wajib dengan penerangan yang membantu
- **Termasuk** atribut `pattern` untuk pengesahan format
- **Menyediakan** atribut `title` untuk kebolehaksesan dan tooltip
- **Menambah** teks pembantu untuk membimbing input pengguna
- **Menggunakan** struktur HTML semantik untuk kebolehaksesan yang lebih baik
### Peraturan Pengesahan Lanjutan
**Apa yang dicapai oleh setiap peraturan pengesahan:**
| Medan | Peraturan Pengesahan | Kelebihan Pengguna |
|-------|-----------------------|--------------------|
| Nama Pengguna | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Memastikan pengenal pasti yang sah dan unik |
| Mata Wang | `required`, `maxlength="3"`, `pattern="[A-Z$โฌยฃยฅโน]+"` | Menerima simbol mata wang biasa |
| Baki | `min="0"`, `step="0.01"`, `type="number"` | Menghalang baki negatif |
| Penerangan | `maxlength="100"` | Had panjang yang munasabah |
### Menguji Tingkah Laku Pengesahan
**Cuba senario pengesahan ini:**
1. **Hantar** borang dengan medan wajib kosong
2. **Masukkan** nama pengguna yang lebih pendek daripada 3 aksara
3. **Cuba** aksara khas dalam medan nama pengguna
4. **Masukkan** jumlah baki negatif

**Apa yang anda akan perhatikan:**
- **Pelayar memaparkan** mesej pengesahan asli
- **Perubahan gaya** berdasarkan keadaan `:valid` dan `:invalid`
- **Penghantaran borang** dihalang sehingga semua pengesahan lulus
- **Fokus secara automatik** bergerak ke medan pertama yang tidak sah
### Pengesahan Pelanggan vs Pelayan
```mermaid
graph LR
A[Client-Side Validation] --> B[Instant Feedback]
A --> C[Better UX]
A --> D[Reduced Server Load]
E[Server-Side Validation] --> F[Security]
E --> G[Data Integrity]
E --> H[Business Rules]
A -.-> I[Both Required]
E -.-> I
```
**Mengapa anda memerlukan kedua-dua lapisan:**
- **Pengesahan pelanggan**: Memberikan maklum balas segera dan meningkatkan pengalaman pengguna
- **Pengesahan pelayan**: Memastikan keselamatan dan mengendalikan peraturan perniagaan yang kompleks
- **Pendekatan gabungan**: Mencipta aplikasi yang kukuh, mesra pengguna, dan selamat
- **Peningkatan progresif**: Berfungsi walaupun JavaScript dilumpuhkan
> ๐ก๏ธ **Peringatan Keselamatan**: Jangan sekali-kali mempercayai pengesahan pelanggan sahaja! Pengguna berniat jahat boleh memintas pemeriksaan pelanggan, jadi pengesahan pelayan adalah penting untuk keselamatan dan integriti data.
---
---
## Cabaran Ejen GitHub Copilot ๐
Gunakan mod Ejen untuk melengkapkan cabaran berikut:
**Penerangan:** Tingkatkan borang pendaftaran dengan pengesahan pelanggan yang komprehensif dan maklum balas pengguna. Cabaran ini akan membantu anda berlatih pengesahan borang, pengendalian ralat, dan meningkatkan pengalaman pengguna dengan maklum balas interaktif.
**Arahan:** Cipta sistem pengesahan borang lengkap untuk borang pendaftaran yang merangkumi: 1) Maklum balas pengesahan masa nyata untuk setiap medan semasa pengguna menaip, 2) Mesej pengesahan tersuai yang muncul di bawah setiap medan input, 3) Medan pengesahan kata laluan dengan pengesahan padanan, 4) Petunjuk visual (seperti tanda semak hijau untuk medan yang sah dan amaran merah untuk medan yang tidak sah), 5) Butang hantar yang hanya diaktifkan apabila semua pengesahan lulus. Gunakan atribut pengesahan HTML5, CSS untuk gaya keadaan pengesahan, dan JavaScript untuk tingkah laku interaktif.
Ketahui lebih lanjut tentang [mod ejen](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) di sini.
## ๐ Cabaran
Paparkan mesej ralat dalam HTML jika pengguna sudah wujud.
Berikut adalah contoh bagaimana halaman log masuk akhir boleh kelihatan selepas sedikit gaya:

## Kuiz Selepas Kuliah
[Kuiz selepas kuliah](https://ff-quizzes.netlify.app/web/quiz/44)
## Ulasan & Kajian Sendiri
Pembangun telah menjadi sangat kreatif tentang usaha membina borang mereka, terutamanya berkaitan strategi pengesahan. Ketahui tentang aliran borang yang berbeza dengan melihat melalui [CodePen](https://codepen.com); bolehkah anda menemui beberapa borang yang menarik dan memberi inspirasi?
## Tugasan
[Gayakan aplikasi bank anda](assignment.md)
---
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.