Asosiy qismga o'tish

templates — foydalanuvchi interfeysi

18-bob 4 kod bloki 557 so'z

Tayyor oling. HTML va CSS bu kursning mavzusi emas. Lekin nima uchun shunday qilinganini tushuning.

chat.html — asosiy

python40 qator
<div id="xabarlar"></div>

<form id="forma">
  <input id="savol" placeholder="Savolingizni yozing..." autocomplete="off">
  <button type="submit">Yuborish</button>
</form>

<script>
const forma = document.getElementById('forma');
const xabarlar = document.getElementById('xabarlar');

forma.onsubmit = async (e) => {
  e.preventDefault();
  const savol = document.getElementById('savol').value.trim();
  if (!savol) return;

  qoshish('siz', savol);
  document.getElementById('savol').value = '';

  const kutish = qoshish('bot', 'Javob tayyorlanmoqda...');

  try {
    const javob = await fetch('/api/ask', {
      method: 'POST',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify({question: savol})
    });

    if (!javob.ok) throw new Error('Server xatosi: ' + javob.status);

    const natija = await javob.json();
    kutish.remove();
    qoshish('bot', natija.answer, natija.sources);

  } catch (xato) {
    kutish.remove();
    qoshish('xato', 'Javob olinmadi: ' + xato.message);
  }
};
</script>

Uchta muhim tafsilot

1. e.preventDefault()

Busiz forma sahifani qayta yuklaydi va hamma narsa yo'qoladi. Bu eng ko'p unutiladigan qator.

2. Kutish xabari

python1 qator
const kutish = qoshish('bot', 'Javob tayyorlanmoqda...');

LLM javobi 2-5 sekund davom etadi. Bu vaqtda ekranda hech narsa bo'lmasa, foydalanuvchi tugmani qayta bosadi va ikkita so'rov ketadi.

3. try/catch

Server o'chgan bo'lishi mumkin. Busiz foydalanuvchi ekranga qarab qoladi va nima bo'lganini bilmaydi.

Manbalarni ko'rsatish

python18 qator
function qoshish(kim, matn, manbalar) {
  const div = document.createElement('div');
  div.className = 'xabar ' + kim;
  div.textContent = matn;

  if (manbalar && manbalar.length) {
    const m = document.createElement('div');
    m.className = 'manbalar';
    m.textContent = 'Manba: ' + manbalar
      .map(s => `${s.title} (${s.similarity})`)
      .join(', ');
    div.appendChild(m);
  }

  xabarlar.appendChild(div);
  xabarlar.scrollTop = xabarlar.scrollHeight;
  return div;
}

textContent, innerHTML EMAS.

python2 qator
div.textContent = matn;     // XAVFSIZ
div.innerHTML = matn;       // XAVFLI — XSS

Agar hujjatda <script>alert(1)</script> bo'lsa va siz innerHTML ishlatsangiz, u bajariladi. textContent esa uni oddiy matn sifatida ko'rsatadi.

Bu — RAG tizimidagi haqiqiy xavf: kontent tashqaridan keladi (PDF, sayt), siz uni nazorat qilmaysiz.

scrollTop = scrollHeight — yangi xabarga avtomatik siljish. Kichik tafsilot, lekin bu bo'lmasa foydalanuvchi har safar qo'lda pastga siljitadi.

Nima uchun React yo'q

Bu 60 qator vanilla JavaScript. React bilan bir xil natija uchun node_modules, build qadami, va yangi til kerak bo'lardi.

Kurs maqsadi — RAG, frontend emas. Talaba shu kodni to'liq o'qiy oladi va tushunadi. Bu muhimroq.


Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar