admin without rights

This commit is contained in:
Владимир
2026-01-09 14:08:08 +00:00
parent f5c68bf0c7
commit 36084ba590
9 changed files with 353 additions and 433 deletions

View File

@@ -180,176 +180,45 @@
</div>
<script>
let token = localStorage.getItem('token');
let services = [];
let selectedServiceId = null;
// Получаем токен из localStorage
const token = localStorage.getItem('auth_token');
// Проверка авторизации и роли
if (!token) {
window.location.href = 'register-login.html';
// Если нет токена — перенаправляем на вход
if (!token) {
alert('Доступ только для администраторов!');
window.location.href = '/register-login.html';
}
// Загружаем услуги
fetch('/api/admin/services', {
headers: {
'Authorization': 'Bearer ' + token,
'Accept': 'application/json'
}
// Загрузка услуг при загрузке страницы
window.onload = loadServices;
// Загрузить услуги из API
async function loadServices() {
try {
const response = await fetch('/api/admin/services', {
headers: { 'Authorization': `Bearer ${token}` }
});
if (response.ok) {
services = await response.json();
renderServices();
} else {
alert('Ошибка доступа или загрузки услуг');
window.location.href = 'register-login.html';
}
} catch (error) {
alert('Ошибка сети');
}
}
// Отобразить услуги в таблице
function renderServices() {
const tbody = document.getElementById('servicesTable');
if (services.length === 0) {
tbody.innerHTML = '<tr><td colspan="7" style="text-align: center; padding: 40px; color: #666;">Нет услуг</td></tr>';
return;
}
tbody.innerHTML = '';
// Простой цикл для каждой услуги
for (let service of services) {
const row = document.createElement('tr');
const statusClass = service.isactive ? 'active' : 'inactive';
row.innerHTML = `
<td>${service.id}</td>
<td><strong>${service.name}</strong></td>
<td>${service.description || '—'}</td>
<td>${service.durationminutes} мин</td>
<td>${service.price}₽</td>
<td><span class="status-badge status-${statusClass}">${service.isactive ? 'Активна' : 'Неактивна'}</span></td>
<td>
<div class="action-buttons">
<button class="btn-small btn-edit" onclick="editService(${service.id})">
✏️ Редактировать
</button>
<button class="btn-small btn-toggle" onclick="toggleService(${service.id}, ${service.isactive})">
${service.isactive ? '❌ Деактивировать' : '✅ Активировать'}
</button>
<button class="btn-small btn-delete" onclick="showDeleteModal(${service.id}, '${service.name}')">
🗑️ Удалить
</button>
</div>
</td>
`;
tbody.appendChild(row);
}
}
// Добавить новую услугу
async function addService(event) {
event.preventDefault();
const formData = {
name: document.getElementById('serviceName').value,
description: document.getElementById('serviceDescription').value,
durationminutes: parseInt(document.getElementById('serviceDuration').value),
price: parseInt(document.getElementById('servicePrice').value),
isactive: true
};
try {
const response = await fetch('/api/admin/services', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(formData)
});
if (response.ok) {
alert('✅ Услуга создана!');
document.getElementById('addServiceForm').reset();
loadServices(); // Перезагрузить таблицу
} else {
const error = await response.json();
alert('Ошибка: ' + error.error || error.message);
}
} catch (error) {
alert('Ошибка сети');
}
}
// Переключить статус (активна/неактивна)
async function toggleService(id, isActive) {
try {
const response = await fetch(`/api/admin/services/${id}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ isactive: !isActive })
});
if (response.ok) {
alert(`✅ Услуга ${!isActive ? 'активирована' : 'деактивирована'}`);
loadServices();
}
} catch (error) {
alert('Ошибка сети');
}
}
// Показать модальное окно удаления
function showDeleteModal(id, name) {
selectedServiceId = id;
document.getElementById('deleteServiceName').textContent = name;
document.getElementById('deleteModal').style.display = 'block';
}
// Удалить услугу
async function confirmDelete() {
try {
const response = await fetch(`/api/admin/services/${selectedServiceId}`, {
method: 'DELETE',
headers: { 'Authorization': `Bearer ${token}` }
});
if (response.ok) {
alert('✅ Услуга удалена');
closeModal();
loadServices();
}
} catch (error) {
alert('Ошибка сети');
}
}
// Закрыть модальное окно
function closeModal() {
document.getElementById('deleteModal').style.display = 'none';
}
// Выход
function logout() {
localStorage.removeItem('token');
window.location.href = 'index.html';
}
// Закрытие модального окна по клику вне области
window.onclick = function(event) {
const modal = document.getElementById('deleteModal');
if (event.target === modal) closeModal();
})
.then(response => {
if (!response.ok) {
throw new Error('Ошибка сервера: ' + response.status);
}
return response.json();
})
.then(data => {
const servicesList = document.getElementById('services-list');
data.forEach(service => {
const item = document.createElement('div');
item.innerHTML = `
<h3>${service.name}</h3>
<p>Цена: ${service.price} ₽</p>
<p>Описание: ${service.description || 'Нет описания'}</p>
<hr>
`;
servicesList.appendChild(item);
});
})
.catch(error => {
console.error('Ошибка:', error);
document.body.innerHTML = `<h2 style="color: red;">Ошибка загрузки данных: ${error.message}</h2>`;
});
</script>
</body>
</html>