/
Centermant
/
web-nodejs
Обзор
Документация
Войти
/
Centermant
/
web-nodejs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
public/lab9/task1/script.js
150 строк
5 KB
Centermant
feat(lab9:final)
25 ноя 2025, 22:02
25 ноя 2025, 22:02
6322796
Код
Авторство
О чём код?
const API = '/api/lab9/products'; const API_TASK1_STOCK = '/api/lab9/task1/stock'; const API_TASK1_PRODUCTS = '/api/lab9/lab8/task1/products'; const formatPrice = (cents) => { if (isNaN(cents)) return 'N/A'; return (cents / 100).toLocaleString('ru-RU', { style: 'currency', currency: 'RUB', maximumFractionDigits: 2 }); }; async function loadProducts(searchQuery = '') { let url = API; if (searchQuery) { url = `${API_TASK1_PRODUCTS}?q=${encodeURIComponent(searchQuery)}`; } try { const res = await fetch(url); if (!res.ok) { const errorData = await res.json(); throw new Error(errorData.error || `HTTP error! status: ${res.status}`); } const products = await res.json(); const tableBody = document.getElementById('productsTableBody'); tableBody.innerHTML = ''; if (products.length === 0) { tableBody.innerHTML = '<tr><td colspan="4">Товары не найдены.</td></tr>'; return; } products.forEach(product => { const row = document.createElement('tr'); row.setAttribute('data-id', product.id); row.innerHTML = ` <td>${product.title}</td> <td>${formatPrice(product.price)}</td> <td>${product.amount}</td> <td><button type="button" class="delete-btn" onclick="deleteProduct(${product.id})">×</button></td> `; tableBody.appendChild(row); }); } catch (error) { console.error('Ошибка загрузки товаров:', error); document.getElementById('productsTableBody').innerHTML = `<tr><td colspan="4" class="error">Ошибка загрузки товаров: ${error.message}</td></tr>`; } } async function deleteProduct(id) { if (!confirm('Удалить товар?')) return; try { const res = await fetch(`${API}/${id}`, { method: 'DELETE' }); if (!res.ok) { const errorData = await res.json(); throw new Error(errorData.error || `HTTP error! status: ${res.status}`); } const searchQuery = document.getElementById('searchInput').value.trim(); loadProducts(searchQuery); loadStockStats(); } catch (error) { console.error('Ошибка удаления товара:', error); alert(`Ошибка удаления: ${error.message}`); } } document.getElementById('addForm').addEventListener('submit', async (e) => { e.preventDefault(); const formData = new FormData(e.target); const priceRub = parseFloat(formData.get('price')); const amount = parseInt(formData.get('amount')); if (priceRub <= 0) { alert('Цена должна быть больше 0'); return; } if (amount < 0) { alert('Количество не может быть отрицательным'); return; } const priceCents = Math.round(priceRub * 100); const data = { title: formData.get('title'), price: priceCents, amount: amount }; try { const res = await fetch(API, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); const result = await res.json(); if (!res.ok) { throw new Error(result.error || `HTTP error! status: ${res.status}`); } e.target.reset(); loadProducts(); loadStockStats(); } catch (error) { console.error('Ошибка сохранения товара:', error); alert(`Ошибка при сохранении: ${error.message}`); } }); document.getElementById('searchBtn').addEventListener('click', () => { const query = document.getElementById('searchInput').value.trim(); if (query.length >= 1) { loadProducts(query); } else { document.getElementById('productsTableBody').innerHTML = '<tr><td colspan="4">Введите минимум 1 символ для поиска.</td></tr>'; } }); document.getElementById('showAllBtn').addEventListener('click', () => { document.getElementById('searchInput').value = ''; loadProducts(); }); async function loadStockStats() { try { const res = await fetch(API_TASK1_STOCK); if (!res.ok) { const errorData = await res.json(); throw new Error(errorData.error || `HTTP error! status: ${res.status}`); } const stats = await res.json(); document.getElementById('statsContainer').innerHTML = ` <p><strong>Всего наименований:</strong> ${stats.total_products}</p> <p><strong>Общее количество единиц на складе:</strong> ${stats.total_items}</p> <p><strong>Общая стоимость:</strong> ${formatPrice(stats.total_value)}</p> `; } catch (error) { console.error('Ошибка загрузки статистики:', error); document.getElementById('statsContainer').innerHTML = `<p class="error">Ошибка загрузки статистики: ${error.message}</p>`; } } document.addEventListener('DOMContentLoaded', () => { loadProducts(); loadStockStats(); });