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 += 'Қосу ';
@@ -705,9 +746,10 @@ async function loadUsersList() {
if (!r.ok) return;
users = r.data;
}
- var html = 'Логин Аты-жөні Рөл Құпия сөз ';
+ var html = 'Логин Аты-жөні Телефон Рөл Құпия сөз ';
users.forEach(function (u) {
html += "" + esc(u.login) + " " + esc(u.name) + " ";
+ html += "" + esc(u.phone || "") + " ";
html += '' + (u.role === "admin" ? "Админ" : "Қызметкер") + " ";
html += '' + esc(u.password) + ' ';
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" }
]