ваше сообщение коммита

This commit is contained in:
2025-08-29 19:19:26 +03:00
parent 4e4cb611a1
commit c007c0b296
10 changed files with 756 additions and 39 deletions

View File

@@ -0,0 +1,3 @@
# Это placeholder для логотипа DLE
# В реальном проекте здесь должен быть PNG файл с логотипом
# Размер рекомендуется: 200x200 пикселей

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -0,0 +1,20 @@
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0066cc;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0056b3;stop-opacity:1" />
</linearGradient>
</defs>
<!-- Фон -->
<rect width="200" height="200" rx="20" fill="url(#grad1)"/>
<!-- Текст DLE -->
<text x="100" y="120" font-family="Arial, sans-serif" font-size="48" font-weight="bold" text-anchor="middle" fill="white">DLE</text>
<!-- Дополнительные элементы -->
<circle cx="50" cy="50" r="8" fill="rgba(255,255,255,0.3)"/>
<circle cx="150" cy="50" r="8" fill="rgba(255,255,255,0.3)"/>
<circle cx="50" cy="150" r="8" fill="rgba(255,255,255,0.3)"/>
<circle cx="150" cy="150" r="8" fill="rgba(255,255,255,0.3)"/>
</svg>

After

Width:  |  Height:  |  Size: 907 B

View File

@@ -58,8 +58,20 @@
@click="selectDle(dle)"
>
<div class="dle-header">
<h3>{{ dle.name }} ({{ dle.symbol }})</h3>
<span class="dle-version">{{ dle.version || 'v2' }}</span>
<div class="dle-title-section">
<img
v-if="dle.logoURI"
:src="dle.logoURI"
:alt="dle.name"
class="dle-logo"
@error="handleLogoError"
/>
<div class="default-logo" v-else>DLE</div>
<div class="dle-title">
<h3>{{ dle.name }} ({{ dle.symbol }})</h3>
<span class="dle-version">{{ dle.version || 'v2' }}</span>
</div>
</div>
</div>
<div class="dle-details">
@@ -106,7 +118,22 @@
<strong>Коды ОКВЭД:</strong> {{ dle.okvedCodes?.join(', ') || 'Не указаны' }}
</div>
<div class="detail-item">
<strong>Партнеры:</strong> {{ dle.participantCount || 0 }} участников
<strong>Партнеры:</strong>
<span v-if="dle.partnerBalances && dle.partnerBalances.length > 0">
{{ dle.participantCount || dle.partnerBalances.length }} участников
<div class="partners-details">
<div v-for="(partner, index) in dle.partnerBalances.slice(0, 3)" :key="index" class="partner-info">
<span class="partner-address">{{ shortenAddress(partner.address) }}</span>
<span class="partner-balance">{{ partner.balance }} токенов ({{ partner.percentage.toFixed(1) }}%)</span>
</div>
<div v-if="dle.partnerBalances.length > 3" class="more-partners">
+{{ dle.partnerBalances.length - 3 }} еще
</div>
</div>
</span>
<span v-else>
{{ dle.participantCount || 0 }} участников
</span>
</div>
<div class="detail-item">
<strong>Статус:</strong>
@@ -229,6 +256,16 @@ const openProposals = () => {
router.push('/management/proposals');
};
// Обработка ошибки загрузки логотипа
const handleLogoError = (event) => {
console.log('Ошибка загрузки логотипа:', event.target.src);
event.target.style.display = 'none';
const defaultLogo = event.target.parentElement.querySelector('.default-logo');
if (defaultLogo) {
defaultLogo.style.display = 'flex';
}
};
const openTokens = () => {
router.push('/management/tokens');
};
@@ -309,7 +346,8 @@ async function loadDeployedDles() {
kpp: blockchainData.kpp || dle.kpp,
// Информация о токенах из блокчейна
totalSupply: blockchainData.totalSupply,
deployerBalance: blockchainData.deployerBalance,
partnerBalances: blockchainData.partnerBalances || [], // Информация о партнерах
logoURI: blockchainData.logoURI || '', // URL логотипа
// Количество участников (держателей токенов)
participantCount: blockchainData.participantCount || 0
};
@@ -867,6 +905,97 @@ onBeforeUnmount(() => {
transform: translateY(-1px);
}
/* Стили для отображения логотипа */
.dle-title-section {
display: flex;
align-items: center;
gap: 12px;
}
.dle-logo {
width: 48px;
height: 48px;
border-radius: 8px;
object-fit: contain;
border: 2px solid #e9ecef;
background: white;
}
.default-logo {
width: 48px;
height: 48px;
border-radius: 8px;
background: linear-gradient(135deg, var(--color-primary), #0056b3);
color: white;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 14px;
border: 2px solid #e9ecef;
}
.dle-title {
display: flex;
flex-direction: column;
gap: 2px;
}
.dle-title h3 {
margin: 0;
font-size: 1.2rem;
color: var(--color-primary);
}
.dle-version {
font-size: 0.8rem;
color: #6c757d;
background: #f8f9fa;
padding: 2px 6px;
border-radius: 4px;
align-self: flex-start;
}
/* Стили для отображения партнеров */
.partners-details {
margin-top: 0.5rem;
padding: 0.5rem;
background: #f8f9fa;
border-radius: 6px;
border-left: 3px solid var(--color-primary);
}
.partner-info {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.25rem 0;
font-size: 0.875rem;
}
.partner-info:not(:last-child) {
border-bottom: 1px solid #e9ecef;
}
.partner-address {
font-family: 'Courier New', monospace;
color: #495057;
font-weight: 600;
}
.partner-balance {
color: var(--color-primary);
font-weight: 600;
}
.more-partners {
text-align: center;
color: #6c757d;
font-style: italic;
font-size: 0.8rem;
padding: 0.25rem 0;
}
/* Адаптивность */
@media (max-width: 768px) {
.blocks-row {
@@ -880,6 +1009,25 @@ onBeforeUnmount(() => {
.management-block h3 {
font-size: 1.3rem;
}
.partner-info {
flex-direction: column;
align-items: flex-start;
gap: 0.25rem;
}
.dle-title-section {
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
.dle-logo,
.default-logo {
width: 40px;
height: 40px;
font-size: 12px;
}
}

View File

@@ -2475,6 +2475,28 @@ const deploySmartContracts = async () => {
autoVerifyAfterDeploy: autoVerifyAfterDeploy.value
};
// Обработка логотипа
try {
if (logoFile.value) {
const form = new FormData();
form.append('logo', logoFile.value);
const uploadResp = await axios.post('/uploads/logo', form, { headers: { 'Content-Type': 'multipart/form-data' } });
const uploaded = uploadResp.data?.data?.url || uploadResp.data?.data?.path;
if (uploaded) {
deployData.logoURI = uploaded;
}
} else if (ensResolvedUrl.value) {
deployData.logoURI = ensResolvedUrl.value;
} else {
// фолбэк на дефолт
deployData.logoURI = '/uploads/logos/default-token.svg';
}
} catch (error) {
console.warn('Ошибка при обработке логотипа:', error.message);
// Используем fallback логотип
deployData.logoURI = '/uploads/logos/default-token.svg';
}
console.log('Данные для деплоя DLE:', deployData);
// Предварительная проверка балансов во всех сетях