From 13767d7b3f63e75c0c09dfb14f81c94ff1ee7a16 Mon Sep 17 00:00:00 2001 From: Denis Shatskiy Date: Wed, 30 Jul 2025 04:47:17 +0700 Subject: [PATCH] feat: Update BillingManager to replace 'nodeName' with 'purpose', add purpose formatting function, and enhance UI elements with consistent icon sizes --- example-servers-billing.json | 10 +- frontend/src/BillingManager.jsx | 286 ++++++++++++++++++-------------- 2 files changed, 164 insertions(+), 132 deletions(-) diff --git a/example-servers-billing.json b/example-servers-billing.json index fa84e66..90887e2 100644 --- a/example-servers-billing.json +++ b/example-servers-billing.json @@ -2,7 +2,7 @@ { "id": "1", "hostName": "VDSINA", - "nodeName": "VDSINA", + "purpose": "relay", "country": "RU", "provider": "VDSINA", "loginUrl": "cp.vdsina.com", @@ -16,7 +16,7 @@ { "id": "2", "hostName": "Macloud", - "nodeName": "Macloud", + "purpose": "bgp", "country": "RU", "provider": "Macloud", "loginUrl": "cp.macloud.ru", @@ -30,7 +30,7 @@ { "id": "3", "hostName": "Hosting VDS", - "nodeName": "Steal", + "purpose": "monitoring", "country": "RU", "provider": "Hosting VDS", "loginUrl": "my.hosting-vds.com/", @@ -44,7 +44,7 @@ { "id": "4", "hostName": "Waicore", - "nodeName": "Waicore", + "purpose": "dns", "country": "DE", "provider": "Waicore", "loginUrl": "my.waicore.com/billmgr", @@ -58,7 +58,7 @@ { "id": "5", "hostName": "IHOR", - "nodeName": "Ihore", + "purpose": "proxy", "country": "RU", "provider": "IHOR", "loginUrl": "billing.ihor-hosting.ru/billmgr", diff --git a/frontend/src/BillingManager.jsx b/frontend/src/BillingManager.jsx index 43a9af2..9df2168 100644 --- a/frontend/src/BillingManager.jsx +++ b/frontend/src/BillingManager.jsx @@ -40,7 +40,7 @@ function BillingManager() { // Новый элемент для добавления const [newItem, setNewItem] = useState({ hostName: '', - nodeName: '', + purpose: '', country: '', provider: '', loginUrl: '', @@ -66,78 +66,78 @@ function BillingManager() { console.error('Ошибка при загрузке данных биллинга:', err); setError('Ошибка при загрузке данных'); // Загружаем тестовые данные если API недоступен - setBillingData([ - { - "id": "1", - "hostName": "VDSINA", - "nodeName": "VDSINA", - "country": "RU", - "provider": "VDSINA", - "loginUrl": "cp.vdsina.com", - "monthlyCost": 12.00, - "nextPaymentDate": "2026-04-25", - "lastPaymentDate": "2025-05-05", - "lastPaymentAmount": 12.00, - "status": "active", - "notes": "" - }, - { - "id": "2", - "hostName": "Macloud", - "nodeName": "Macloud", - "country": "RU", - "provider": "Macloud", - "loginUrl": "cp.macloud.ru", - "monthlyCost": 7.00, - "nextPaymentDate": "2025-09-02", - "lastPaymentDate": "2025-02-03", - "lastPaymentAmount": 7.00, - "status": "active", - "notes": "" - }, - { - "id": "3", - "hostName": "Hosting VDS", - "nodeName": "Steal", - "country": "RU", - "provider": "Hosting VDS", - "loginUrl": "my.hosting-vds.com/", - "monthlyCost": 11.95, - "nextPaymentDate": "2025-12-21", - "lastPaymentDate": "2025-06-13", - "lastPaymentAmount": 10.00, - "status": "active", - "notes": "" - }, - { - "id": "4", - "hostName": "Waicore", - "nodeName": "Waicore", - "country": "DE", - "provider": "Waicore", - "loginUrl": "my.waicore.com/billmgr", - "monthlyCost": 9.60, - "nextPaymentDate": "2026-04-25", - "lastPaymentDate": "2025-04-25", - "lastPaymentAmount": 9.60, - "status": "active", - "notes": "" - }, - { - "id": "5", - "hostName": "IHOR", - "nodeName": "Ihore", - "country": "RU", - "provider": "IHOR", - "loginUrl": "billing.ihor-hosting.ru/billmgr", - "monthlyCost": 10.00, - "nextPaymentDate": "2025-09-10", - "lastPaymentDate": "2025-06-25", - "lastPaymentAmount": 10.00, - "status": "active", - "notes": "" - } - ]); + setBillingData([ + { + "id": "1", + "hostName": "VDSINA", + "purpose": "relay", + "country": "RU", + "provider": "VDSINA", + "loginUrl": "cp.vdsina.com", + "monthlyCost": 12.00, + "nextPaymentDate": "2026-04-25", + "lastPaymentDate": "2025-05-05", + "lastPaymentAmount": 12.00, + "status": "active", + "notes": "" + }, + { + "id": "2", + "hostName": "Macloud", + "purpose": "bgp", + "country": "RU", + "provider": "Macloud", + "loginUrl": "cp.macloud.ru", + "monthlyCost": 7.00, + "nextPaymentDate": "2025-09-02", + "lastPaymentDate": "2025-02-03", + "lastPaymentAmount": 7.00, + "status": "active", + "notes": "" + }, + { + "id": "3", + "hostName": "Hosting VDS", + "purpose": "monitoring", + "country": "RU", + "provider": "Hosting VDS", + "loginUrl": "my.hosting-vds.com/", + "monthlyCost": 11.95, + "nextPaymentDate": "2025-12-21", + "lastPaymentDate": "2025-06-13", + "lastPaymentAmount": 10.00, + "status": "active", + "notes": "" + }, + { + "id": "4", + "hostName": "Waicore", + "purpose": "dns", + "country": "DE", + "provider": "Waicore", + "loginUrl": "my.waicore.com/billmgr", + "monthlyCost": 9.60, + "nextPaymentDate": "2026-04-25", + "lastPaymentDate": "2025-04-25", + "lastPaymentAmount": 9.60, + "status": "active", + "notes": "" + }, + { + "id": "5", + "hostName": "IHOR", + "purpose": "proxy", + "country": "RU", + "provider": "IHOR", + "loginUrl": "billing.ihor-hosting.ru/billmgr", + "monthlyCost": 10.00, + "nextPaymentDate": "2025-09-10", + "lastPaymentDate": "2025-06-25", + "lastPaymentAmount": 10.00, + "status": "active", + "notes": "" + } + ]); } finally { setLoading(false); } @@ -281,6 +281,19 @@ function BillingManager() { }).format(amount); } + function formatPurpose(purpose) { + const purposeMap = { + 'relay': 'Relay VPS', + 'bgp': 'BGP сервер', + 'monitoring': 'Мониторинг', + 'dns': 'DNS сервер', + 'proxy': 'Прокси сервер', + 'backup': 'Backup сервер', + 'other': 'Другое' + }; + return purposeMap[purpose] || purpose || 'Не указано'; + } + return (
{/* Заголовок страницы */} @@ -291,23 +304,23 @@ function BillingManager() {
Панель управления / Ноды / Инфра-биллинг
-
- - -
+
+ + +
@@ -414,7 +427,7 @@ function BillingManager() { onClick={handleSaveChanges} disabled={loading} > - + Сохранить @@ -425,7 +438,7 @@ function BillingManager() { Имя хостера - Нода + Назначение @@ -441,10 +454,10 @@ function BillingManager() {
- - {countryToFlag(item.country)} + + {formatPurpose(item.purpose)} - {item.nodeName} + {formatPurpose(item.purpose)}
@@ -480,7 +493,7 @@ function BillingManager() { {providers.map(provider => { const providerItems = billingData.filter(item => item.provider === provider); const totalCost = providerItems.reduce((sum, item) => sum + item.monthlyCost, 0); - const servers = providerItems.map(item => item.nodeName).join(', '); + const servers = providerItems.map(item => formatPurpose(item.purpose)).join(', '); return ( @@ -533,7 +546,7 @@ function BillingManager() { className="btn btn-outline-primary btn-sm" onClick={handleAddItem} > - + @@ -560,18 +573,18 @@ function BillingManager() {
@@ -609,18 +622,18 @@ function BillingManager() {
@@ -698,14 +711,22 @@ function AddBillingModal({ show, item, onItemChange, onSubmit, onClose }) { />
- - handleChange('nodeName', e.target.value)} + +
@@ -812,6 +833,7 @@ function AddBillingModal({ show, item, onItemChange, onSubmit, onClose }) { Отмена
@@ -857,14 +879,22 @@ function EditBillingModal({ show, item, onItemChange, onSubmit, onClose }) { />
- - handleChange('nodeName', e.target.value)} + +
@@ -971,6 +1001,7 @@ function EditBillingModal({ show, item, onItemChange, onSubmit, onClose }) { Отмена
@@ -997,14 +1028,15 @@ function DeleteBillingModal({ show, item, onDelete, onClose }) {

Вы уверены, что хотите удалить ноду {item?.hostName}?

Это действие нельзя отменить.

-
- - -
+
+ + +