diff --git a/index.html b/index.html index d816683..cc23647 100644 --- a/index.html +++ b/index.html @@ -24,12 +24,22 @@ + +

Демо: админ — 1001 / Admin123 · қызметкер — 2001 / Worker123

diff --git a/script.js b/script.js index 3e9951a..7b48c93 100644 --- a/script.js +++ b/script.js @@ -175,6 +175,45 @@ function lsSet(k, v) { localStorage.setItem("qcom_" + k, JSON.stringify(v)); } /* ---------------- КІРУ ---------------- */ document.getElementById("forgotBtn").addEventListener("click", function () { document.getElementById("recoverBox").classList.toggle("hidden"); + document.getElementById("registerBox").classList.add("hidden"); +}); + +document.getElementById("registerBtn").addEventListener("click", function () { + document.getElementById("registerBox").classList.toggle("hidden"); + document.getElementById("recoverBox").classList.add("hidden"); +}); + +document.getElementById("regGo").addEventListener("click", async function () { + var name = document.getElementById("regName").value.trim(); + var phone = document.getElementById("regPhone").value.trim(); + var login = document.getElementById("regLogin").value.trim(); + var pass = document.getElementById("regPass").value.trim(); + var msg = document.getElementById("regMsg"); + if (!name || !login || !pass) { msg.textContent = "Аты-жөнін, логинді және құпия сөзді толтырыңыз"; return; } + var res = await apiPost("/api/register", { name: name, login: login, password: pass, phone: phone }); + if (res.ok) { + state.user = res.user; + state.token = res.token; + await loadServerData(); + enterApp(); + return; + } + if (res.offline) { + if (MOCK_USERS.find(function (u) { return u.login === login; })) { + msg.textContent = "Мұндай логин бар (демо-режим)"; + return; + } + MOCK_USERS.push({ login: login, password: pass, name: name, phone: phone, role: "user" }); + state.user = { login: login, name: name, role: "user" }; + state.offline = true; + state.content = MOCK_CONTENT; + state.complaints = lsGet("complaints", []); + state.testResults = lsGet("testResults", []); + state.directMessages = lsGet("directMessages", []); + enterApp(); + return; + } + msg.textContent = res.error || "Қате"; }); document.getElementById("recoverGo").addEventListener("click", async function () { @@ -685,7 +724,9 @@ async function renderUsers(el) { html += '
'; html += '
'; html += '
'; + html += '
'; html += '
'; + html += '
'; html += '
'; html += '
'; html += ''; @@ -705,9 +746,10 @@ async function loadUsersList() { if (!r.ok) return; users = r.data; } - var html = '
'; + var html = '
ЛогинАты-жөніРөлҚұпия сөз
'; users.forEach(function (u) { html += ""; + html += ""; html += '"; html += ''; @@ -720,21 +762,23 @@ async function loadUsersList() { async function addUser() { var login = document.getElementById("uLogin").value.trim(); var name = document.getElementById("uName").value.trim(); + var phone = document.getElementById("uPhone").value.trim(); var pass = document.getElementById("uPass").value.trim(); var role = document.getElementById("uRole").value; var msg = document.getElementById("uMsg"); if (!login || !name || !pass) { msg.innerHTML = '
Барлық өрістерді толтырыңыз
'; return; } if (state.offline) { - MOCK_USERS.push({ login: login, name: name, password: pass, role: role }); + MOCK_USERS.push({ login: login, name: name, phone: phone, password: pass, role: role }); msg.innerHTML = '
✅ Қосылды (демо)
'; loadUsersList(); return; } - var res = await apiPost("/api/users", { login: login, name: name, password: pass, role: role }); + var res = await apiPost("/api/users", { login: login, name: name, phone: phone, password: pass, role: role }); if (res.ok) { msg.innerHTML = '
✅ Қызметкер қосылды
'; document.getElementById("uLogin").value = ""; document.getElementById("uName").value = ""; + document.getElementById("uPhone").value = ""; document.getElementById("uPass").value = ""; loadUsersList(); } else msg.innerHTML = '
' + esc(res.error || "Қате") + "
"; diff --git a/server.js b/server.js index 34c38cd..3891146 100644 --- a/server.js +++ b/server.js @@ -75,11 +75,25 @@ http.createServer(async (req, res) => { return send(res, 200, { ok: true, password: newPass, name: u.name }); } + // ---------- ТІРКЕЛУ ---------- + if (req.method === "POST" && url === "/api/register") { + const b = await body(req); + if (!b.login || !b.name || !b.password) return send(res, 400, { ok: false, error: "Аты-жөні, логин және құпия сөз міндетті" }); + const users = loadUsers(); + if (users.find((x) => x.login === String(b.login))) return send(res, 400, { ok: false, error: "Мұндай логин бар, басқа нөмір жазыңыз" }); + users.push({ login: String(b.login), password: String(b.password), name: String(b.name), phone: String(b.phone || ""), role: "user" }); + saveUsers(users); + const token = crypto.randomBytes(24).toString("hex"); + const nu = users[users.length - 1]; + sessions.set(token, nu); + return send(res, 200, { ok: true, token, user: publicUser(nu) }); + } + // ---------- АККАУНТТАРДЫ БАСҚАРУ (админ) ---------- if (req.method === "GET" && url === "/api/users") { if (user.role !== "admin") return send(res, 403, { ok: false, error: "Құқық жоқ" }); return send(res, 200, { ok: true, data: loadUsers().map((x) => ({ - login: x.login, name: x.name, role: x.role, password: x.password, + login: x.login, name: x.name, role: x.role, password: x.password, phone: x.phone || "", })) }); } @@ -89,7 +103,7 @@ http.createServer(async (req, res) => { if (!b.login || !b.name || !b.password) return send(res, 400, { ok: false, error: "Логин, аты-жөні және құпия сөз міндетті" }); const users = loadUsers(); if (users.find((x) => x.login === String(b.login))) return send(res, 400, { ok: false, error: "Мұндай логин бар" }); - users.push({ login: String(b.login), password: String(b.password), name: String(b.name), role: b.role === "admin" ? "admin" : "user" }); + users.push({ login: String(b.login), password: String(b.password), name: String(b.name), phone: String(b.phone || ""), role: b.role === "admin" ? "admin" : "user" }); saveUsers(users); return send(res, 200, { ok: true }); } diff --git a/users.json b/users.json index 1b68764..d32ea28 100644 --- a/users.json +++ b/users.json @@ -1,6 +1,6 @@ [ - { "login": "1001", "password": "Admin123", "name": "Асет (Комплаенс офицер)", "role": "admin" }, - { "login": "2001", "password": "Worker123", "name": "Айгүл Серікқызы", "role": "user" }, - { "login": "2002", "password": "Worker123", "name": "Бауыржан Нұрланұлы", "role": "user" }, - { "login": "2003", "password": "Worker123", "name": "Дана Қайратқызы", "role": "user" } + { "login": "1001", "password": "Admin123", "name": "Асет (Комплаенс офицер)", "phone": "+7 (777) 100-10-01", "role": "admin" }, + { "login": "2001", "password": "Worker123", "name": "Айгүл Серікқызы", "phone": "+7 (777) 200-10-01", "role": "user" }, + { "login": "2002", "password": "Worker123", "name": "Бауыржан Нұрланұлы", "phone": "+7 (777) 200-10-02", "role": "user" }, + { "login": "2003", "password": "Worker123", "name": "Дана Қайратқызы", "phone": "+7 (777) 200-10-03", "role": "user" } ]
ЛогинАты-жөніТелефонРөлҚұпия сөз
" + esc(u.login) + "" + esc(u.name) + "" + esc(u.phone || "") + "' + (u.role === "admin" ? "Админ" : "Қызметкер") + "' + esc(u.password) + ''; html += '