From ec67d847a43837f5c257b1bc24478dd7c4c3b099 Mon Sep 17 00:00:00 2001 From: Aset Date: Mon, 10 Aug 2026 18:08:23 +0000 Subject: [PATCH] =?UTF-8?q?v10:=20=D1=88=D0=B0=D2=93=D1=8B=D0=BC=20=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20=E2=80=94=20=D0=BC=D0=B0=D0=B7=D1=8C/?= =?UTF-8?q?=D1=83=D0=BA=D0=BE=D0=BB/=D0=B6=D0=B0=D1=82=D1=82=D1=8B=D2=93?= =?UTF-8?q?=D1=83=20=D0=B1=D3=A9=D0=BB=D1=96=D0=BC=D0=B4=D0=B5=D1=80=D1=96?= =?UTF-8?q?=D0=BD=D0=B5=20=D1=81=D1=96=D0=BB=D1=82=D0=B5=D0=BC=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script.js | 30 +++++++++++++++++++++++++++++- server.js | 2 +- style.css | 3 +++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/script.js b/script.js index 9a32b06..bb4f3de 100644 --- a/script.js +++ b/script.js @@ -192,6 +192,34 @@ function addMsg(who, text) { chatBox.scrollTop = chatBox.scrollHeight; } +function addQuickLinks(text) { + var t = text.toLowerCase(); + var links = []; + if (t.indexOf("жаттығу") !== -1 || t.indexOf("жаттыгу") !== -1 || t.indexOf("қозғал") !== -1 || t.indexOf("козгал") !== -1) { + links.push({ href: "#timer", label: "▶ Жаттығу бөлімі" }); + } + if (t.indexOf("мазь") !== -1 || t.indexOf("укол") !== -1 || t.indexOf("дәрі") !== -1 || t.indexOf("дәр") !== -1 || t.indexOf("дори") !== -1 || t.indexOf("гель") !== -1) { + links.push({ href: "#drugs", label: "💊 Дәрілер бөлімі" }); + links.push({ href: "#pharm", label: "🛒 Онлайн-аптека" }); + } + if (!links.length) return; + var row = document.createElement("div"); + row.className = "msg-quick"; + links.forEach(function (l) { + var a = document.createElement("a"); + a.className = "btn btn-ghost btn-quick"; + a.href = l.href; + a.textContent = l.label; + a.addEventListener("click", function () { + var sec = document.querySelector(l.href); + if (sec) sec.scrollIntoView({ behavior: "smooth" }); + }); + row.appendChild(a); + }); + chatBox.appendChild(row); + chatBox.scrollTop = chatBox.scrollHeight; +} + async function sendChat() { var text = chatInput.value.trim(); if (!text) return; @@ -210,7 +238,7 @@ async function sendChat() { }); var j = await r.json(); waiting.remove(); - if (j.ok) addMsg("bot", j.answer); + if (j.ok) { addMsg("bot", j.answer); addQuickLinks(j.answer); } else addMsg("bot", "Кешіріңіз, жауап қазір келмеді. Кейінірек қайталап көріңіз немесе шағымыңды басқаша жазып жіберіңіз."); } catch (e) { waiting.remove(); diff --git a/server.js b/server.js index a7e8c5d..f0e3b5c 100644 --- a/server.js +++ b/server.js @@ -22,7 +22,7 @@ async function ai(prompt) { model: process.env.AI_MODEL, temperature: 0.4, messages: [ - { role: "system", content: "Сен — артрит, артроз және анкилозды спондилит (Бехтерев ауруы) бар адамдарға арналған көмекші-кеңесші. Қазақ тілінде, жай сөзбен, қысқа әрі нақты жауап бер. Жауабыңда мыналар болсын: 1) шағымды қалай бағалауға болады; 2) қазір не істеу керек (жеңіл қозғалыс, жылу/суық, тыныштық) — жаттығуды тек ауырсынбай ғана орындау керектігін ескерт; 3) дәрі-дәрмекті тек дәрігер тағайындайтынын еске сал, дәрі атын ұсынба; 4) қандай белгілер кезінде дәрігерге шұғыл қаралу керектігін анық жаз (қатты күшейген ауырсыну, қатты ісіну, қызба, аяқ-қолды қозғалта алмау, сезімталдық жоғалуы). Ақырында: «Бұл ақпарат дәрігер кеңесінің орнын баспайды» деп қос. Сен медициналық маман емессің." }, + { role: "system", content: "Сен — артрит, артроз және анкилозды спондилит (Бехтерев ауруы) бар адамдарға арналған көмекші-кеңесші. Қазақ тілінде, жай сөзбен, қысқа әрі нақты жауап бер. Жауабыңда мыналар болсын: 1) шағымды қалай бағалауға болады; 2) қазір не істеу керек (жеңіл қозғалыс, жылу/суық, тыныштық) — жаттығуды тек ауырсынбай ғана орындау керектігін ескерт; 3) дәрі-дәрмекті тек дәрігер тағайындайтынын еске сал, дәрі атын ұсынба; 4) қандай белгілер кезінде дәрігерге шұғыл қаралу керектігін анық жаз (қатты күшейген ауырсыну, қатты ісіну, қызба, аяқ-қолды қозғалта алмау, сезімталдық жоғалуы). Шағымға байланысты пайдалы болса, осы бөлімдерге сілтеме ата: жаттығуларға — «Сайттағы Жаттығу бөлімінде дайын кешен бар» деп, дәрі/мазь/уколға — «Дәрілер және Аптека бөлімдерін қара» деп. Ақырында: «Бұл ақпарат дәрігер кеңесінің орнын баспайды» деп қос. Сен медициналық маман емессің." }, { role: "user", content: prompt } ] }) diff --git a/style.css b/style.css index 312cdac..2ffefba 100644 --- a/style.css +++ b/style.css @@ -87,6 +87,9 @@ h1,h2,h3{font-family:"Unbounded",sans-serif;line-height:1.15} .msg.bot{background:#1d2738;color:#e3eaf4;align-self:flex-start;border-bottom-left-radius:4px} .msg.user{background:var(--cyan);color:var(--ink);align-self:flex-end;border-bottom-right-radius:4px;font-weight:600} .msg.typing{color:#7d8796;font-style:italic} +.msg-quick{display:flex;gap:8px;flex-wrap:wrap;align-self:flex-start;max-width:100%} +.btn-quick{padding:9px 16px;font-size:13.5px;margin:0;background:transparent;color:#9beeff;border:1px solid #00b8cc} +.btn-quick:hover{filter:brightness(1.15);background:#0e1a26} .chat-in{display:flex;gap:10px} .chat-in textarea{flex:1;background:#141a26;border:1px solid #222b3c;border-radius:10px;color:var(--white);padding:12px 14px;font:15px/1.5 "Manrope",sans-serif;resize:vertical;min-height:52px} .chat-in textarea:focus{outline:none;border-color:var(--cyan)}