From 9d28e67388319801f321c1e9a1b516f584405098 Mon Sep 17 00:00:00 2001 From: kalugin66 Date: Thu, 26 Feb 2026 10:09:24 +0500 Subject: [PATCH] useradd --- package.json | 1 + public/admin-script.js | 103 ++++++++++++++++++++++++++++++ public/admin.html | 63 +++++++++++++++++++ public/style.css | 138 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 305 insertions(+) diff --git a/package.json b/package.json index e430874..df50187 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "dependencies": { "archiver": "^7.0.1", "axios": "^1.13.5", + "bcrypt": "^6.0.0", "bcryptjs": "~2.4.3", "dotenv": "~16.3.1", "express": "^4.21.2", diff --git a/public/admin-script.js b/public/admin-script.js index db50039..88cbb38 100644 --- a/public/admin-script.js +++ b/public/admin-script.js @@ -63,6 +63,7 @@ function showAdminInterface() { function setupEventListeners() { const loginForm = document.getElementById('login-form'); const editUserForm = document.getElementById('edit-user-form'); + const createUserForm = document.getElementById('create-user-form'); if (loginForm) { loginForm.addEventListener('submit', login); @@ -71,6 +72,10 @@ function setupEventListeners() { if (editUserForm) { editUserForm.addEventListener('submit', updateUser); } + + if (createUserForm) { + createUserForm.addEventListener('submit', createUser); + } } async function login(event) { @@ -270,6 +275,101 @@ function renderUsersTable() { `).join(''); } +// Функция для открытия модального окна создания пользователя +function openCreateUserModal() { + const modal = document.getElementById('create-user-modal'); + if (modal) { + // Сбрасываем форму + const form = document.getElementById('create-user-form'); + if (form) { + form.reset(); + } + modal.style.display = 'block'; + } +} + +// Функция для закрытия модального окна создания пользователя +function closeCreateUserModal() { + const modal = document.getElementById('create-user-modal'); + if (modal) { + modal.style.display = 'none'; + } +} + +// Функция для создания нового пользователя +async function createUser(event) { + event.preventDefault(); + + const login = document.getElementById('create-login').value; + const password = document.getElementById('create-password').value; + const name = document.getElementById('create-name').value; + const email = document.getElementById('create-email').value; + const role = document.getElementById('create-role').value; + const auth_type = document.getElementById('create-auth-type').value; + const groups = document.getElementById('create-groups').value; + const description = document.getElementById('create-description').value; + + // Валидация + if (!login || !password || !name || !email) { + alert('Заполните все обязательные поля'); + return; + } + + if (password.length < 6) { + alert('Пароль должен содержать не менее 6 символов'); + return; + } + + const userData = { + login, + password, + name, + email, + role, + auth_type, + groups: groups || '[]', + description + }; + + try { + const response = await fetch('/admin/users', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(userData) + }); + + if (response.ok) { + const result = await response.json(); + alert(`Пользователь успешно создан! ID: ${result.id}`); + closeCreateUserModal(); + loadUsers(); // Перезагружаем список пользователей + + // Обновляем статистику если она видна + if (document.getElementById('admin-dashboard')?.classList.contains('active')) { + if (typeof loadDashboardStats === 'function') { + loadDashboardStats(); + } + } + if (document.getElementById('admin-stats-section')?.classList.contains('active')) { + if (typeof loadUsersStats === 'function') { + loadUsersStats(); + } + if (typeof loadOverallStats === 'function') { + loadOverallStats(); + } + } + } else { + const error = await response.json(); + alert(error.error || 'Ошибка создания пользователя'); + } + } catch (error) { + console.error('Ошибка:', error); + alert('Ошибка создания пользователя'); + } +} + async function openEditUserModal(userId) { try { const response = await fetch(`/admin/users/${userId}`); @@ -447,5 +547,8 @@ window.searchUsers = searchUsers; window.loadUsers = loadUsers; window.openEditUserModal = openEditUserModal; window.closeEditUserModal = closeEditUserModal; +window.openCreateUserModal = openCreateUserModal; +window.closeCreateUserModal = closeCreateUserModal; +window.createUser = createUser; window.updateUser = updateUser; window.deleteUser = deleteUser; \ No newline at end of file diff --git a/public/admin.html b/public/admin.html index 2506525..fcf3f96 100644 --- a/public/admin.html +++ b/public/admin.html @@ -61,6 +61,7 @@
+
@@ -91,6 +92,7 @@ + + + + diff --git a/public/style.css b/public/style.css index 504fbe7..30a921f 100644 --- a/public/style.css +++ b/public/style.css @@ -4760,4 +4760,142 @@ button.btn-primary { transform: translateY(0); opacity: 1; } +} +/* Стили для кнопки создания пользователя */ +.create-user-btn { + background-color: #27ae60; + color: white; + border: none; + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + font-weight: bold; + margin-left: 10px; +} + +.create-user-btn:hover { + background-color: #2ecc71; +} + +/* Стили для хинта в форме */ +.form-hint { + font-size: 12px; + color: #7f8c8d; + display: block; + margin-top: 4px; +} + +/* Обновленные стили для поиска */ +.search-container { + display: flex; + gap: 10px; + margin-bottom: 20px; + align-items: center; +} + +.search-container input { + flex: 1; + padding: 8px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; +} + +.search-container button { + padding: 8px 16px; + border: none; + border-radius: 4px; + cursor: pointer; + background-color: #3498db; + color: white; +} + +.search-container button:hover { + opacity: 0.9; +} + +/* Стили для кнопок действий */ +.user-actions { + display: flex; + gap: 5px; +} + +.user-actions button { + padding: 5px 10px; + border: none; + border-radius: 3px; + cursor: pointer; + font-size: 14px; +} + +.user-actions .edit-btn { + background-color: #f39c12; + color: white; +} + +.user-actions .edit-btn:hover { + background-color: #e67e22; +} + +.user-actions .delete-btn { + background-color: #e74c3c; + color: white; +} + +.user-actions .delete-btn:hover { + background-color: #c0392b; +} + +.user-actions .delete-btn:disabled { + background-color: #bdc3c7; + cursor: not-allowed; +} + +/* Стили для бейджей */ +.ldap-badge, .admin-badge { + display: inline-block; + padding: 2px 6px; + border-radius: 3px; + font-size: 10px; + font-weight: bold; + margin-left: 5px; + text-transform: uppercase; +} + +.ldap-badge { + background-color: #9b59b6; + color: white; +} + +.admin-badge { + background-color: #e74c3c; + color: white; +} + +/* Стили для модального окна */ +.modal-lg { + max-width: 600px; +} + +.form-row { + display: flex; + gap: 15px; + margin-bottom: 15px; +} + +.form-row .form-group { + flex: 1; + margin-bottom: 0; +} + +.close { + float: right; + font-size: 28px; + font-weight: bold; + cursor: pointer; + line-height: 1; +} + +.close:hover { + color: #e74c3c; } \ No newline at end of file