ваше сообщение коммита
This commit is contained in:
@@ -46,6 +46,13 @@
|
||||
Подробнее
|
||||
</button>
|
||||
</div>
|
||||
<!-- Блок Веб3 приложение -->
|
||||
<div class="crm-web3-block">
|
||||
<h2>Веб3 приложение</h2>
|
||||
<button class="details-btn" @click="goToWeb3App">
|
||||
Подробнее
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</BaseLayout>
|
||||
</template>
|
||||
@@ -217,6 +224,10 @@ function goToContent() {
|
||||
function goToManagement() {
|
||||
router.push({ name: 'management' });
|
||||
}
|
||||
|
||||
function goToWeb3App() {
|
||||
router.push({ name: 'vds-mock' });
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@@ -358,4 +369,33 @@ strong {
|
||||
.crm-management-block .details-btn {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.crm-web3-block {
|
||||
margin: 32px 0 24px 0;
|
||||
padding: 24px;
|
||||
background: #f5f5f5;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
opacity: 0.7;
|
||||
border: 2px solid #dee2e6;
|
||||
}
|
||||
.crm-web3-block h2 {
|
||||
margin: 0;
|
||||
font-size: 1.4rem;
|
||||
font-weight: 600;
|
||||
color: var(--color-dark);
|
||||
}
|
||||
.crm-web3-block .details-btn {
|
||||
margin-top: 0;
|
||||
background: #6c757d;
|
||||
opacity: 0.6;
|
||||
}
|
||||
.crm-web3-block .details-btn:hover {
|
||||
background: #5a6268;
|
||||
transform: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
</style>
|
||||
393
frontend/src/views/VdsMockView.vue
Normal file
393
frontend/src/views/VdsMockView.vue
Normal file
@@ -0,0 +1,393 @@
|
||||
<!--
|
||||
Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||||
All rights reserved.
|
||||
|
||||
This software is proprietary and confidential.
|
||||
Unauthorized copying, modification, or distribution is prohibited.
|
||||
|
||||
For licensing inquiries: info@hb3-accelerator.com
|
||||
Website: https://hb3-accelerator.com
|
||||
GitHub: https://github.com/HB3-ACCELERATOR
|
||||
-->
|
||||
|
||||
<template>
|
||||
<BaseLayout
|
||||
:is-authenticated="isAuthenticated"
|
||||
:identities="identities"
|
||||
:token-balances="tokenBalances"
|
||||
:is-loading-tokens="isLoadingTokens"
|
||||
@auth-action-completed="$emit('auth-action-completed')"
|
||||
>
|
||||
<div class="vds-mock-container">
|
||||
<div class="mock-header">
|
||||
<h1>VDS Сервер - Не настроен</h1>
|
||||
<div class="mock-status">
|
||||
<div class="status-indicator offline"></div>
|
||||
<span>Офлайн</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Мок интерфейс -->
|
||||
<div class="mock-content">
|
||||
<div class="mock-card">
|
||||
<h2>Статус сервера</h2>
|
||||
<div class="mock-metrics">
|
||||
<div class="mock-metric">
|
||||
<span class="label">CPU:</span>
|
||||
<span class="value mock">--%</span>
|
||||
</div>
|
||||
<div class="mock-metric">
|
||||
<span class="label">RAM:</span>
|
||||
<span class="value mock">--%</span>
|
||||
</div>
|
||||
<div class="mock-metric">
|
||||
<span class="label">Диск:</span>
|
||||
<span class="value mock">--%</span>
|
||||
</div>
|
||||
<div class="mock-metric">
|
||||
<span class="label">Uptime:</span>
|
||||
<span class="value mock">--</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mock-card">
|
||||
<h2>Управление сервисами</h2>
|
||||
<div class="mock-services">
|
||||
<div class="mock-service">
|
||||
<span class="service-name">DLE Application</span>
|
||||
<span class="service-status mock">Недоступно</span>
|
||||
</div>
|
||||
<div class="mock-service">
|
||||
<span class="service-name">PostgreSQL</span>
|
||||
<span class="service-status mock">Недоступно</span>
|
||||
</div>
|
||||
<div class="mock-service">
|
||||
<span class="service-name">Nginx</span>
|
||||
<span class="service-status mock">Недоступно</span>
|
||||
</div>
|
||||
<div class="mock-service">
|
||||
<span class="service-name">Docker</span>
|
||||
<span class="service-status mock">Недоступно</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mock-card">
|
||||
<h2>Логи системы</h2>
|
||||
<div class="mock-logs">
|
||||
<pre>VDS сервер не настроен
|
||||
Для активации перейдите в настройки и настройте VDS сервер</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mock-card">
|
||||
<h2>Деплой приложения</h2>
|
||||
<div class="mock-deploy">
|
||||
<p>Деплой недоступен - VDS сервер не настроен</p>
|
||||
<button class="mock-btn" disabled>Деплой недоступен</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mock-card">
|
||||
<h2>Управление бэкапами</h2>
|
||||
<div class="mock-backups">
|
||||
<p>Бэкапы недоступны - VDS сервер не настроен</p>
|
||||
<div class="mock-backup-list">
|
||||
<div class="mock-backup-item">
|
||||
<span class="backup-name">Нет бэкапов</span>
|
||||
<span class="backup-date">--</span>
|
||||
<span class="backup-size">--</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Призыв к действию -->
|
||||
<div class="call-to-action">
|
||||
<h2>Настройте VDS сервер</h2>
|
||||
<p>Для использования всех функций управления VDS сервером необходимо его настроить.</p>
|
||||
<button class="setup-btn" @click="goToSetup">
|
||||
Перейти к настройке VDS
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</BaseLayout>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps, defineEmits } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import BaseLayout from '../components/BaseLayout.vue';
|
||||
|
||||
// Props
|
||||
const props = defineProps({
|
||||
isAuthenticated: Boolean,
|
||||
identities: Array,
|
||||
tokenBalances: Object,
|
||||
isLoadingTokens: Boolean
|
||||
});
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits(['auth-action-completed']);
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
const goToSetup = () => {
|
||||
router.push({ name: 'webssh-settings' });
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.vds-mock-container {
|
||||
padding: 20px;
|
||||
background-color: var(--color-white);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.mock-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 30px;
|
||||
padding-bottom: 20px;
|
||||
border-bottom: 2px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.mock-header h1 {
|
||||
margin: 0;
|
||||
color: #6c757d;
|
||||
font-size: 2rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.mock-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 8px 16px;
|
||||
border-radius: 20px;
|
||||
font-weight: 600;
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
}
|
||||
|
||||
.status-indicator {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
background: currentColor;
|
||||
}
|
||||
|
||||
.status-indicator.offline {
|
||||
background: #dc3545;
|
||||
}
|
||||
|
||||
.mock-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.mock-card {
|
||||
background: #f5f5f5;
|
||||
border-radius: 10px;
|
||||
padding: 24px;
|
||||
border: 2px solid #dee2e6;
|
||||
}
|
||||
|
||||
.mock-card h2 {
|
||||
margin: 0 0 20px 0;
|
||||
font-size: 1.4rem;
|
||||
font-weight: 600;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.mock-metrics {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.mock-metric {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 12px;
|
||||
background: #e9ecef;
|
||||
border-radius: 8px;
|
||||
border: 1px solid #dee2e6;
|
||||
}
|
||||
|
||||
.mock-metric .label {
|
||||
font-weight: 600;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.mock-metric .value.mock {
|
||||
font-weight: 700;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.mock-services {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.mock-service {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 16px;
|
||||
background: #e9ecef;
|
||||
border-radius: 8px;
|
||||
border: 1px solid #dee2e6;
|
||||
}
|
||||
|
||||
.service-name {
|
||||
font-weight: 600;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.service-status.mock {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
padding: 2px 8px;
|
||||
border-radius: 12px;
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
}
|
||||
|
||||
.mock-logs {
|
||||
background: #2d3748;
|
||||
color: #6c757d;
|
||||
padding: 16px;
|
||||
border-radius: 8px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 0.9rem;
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
border: 1px solid #dee2e6;
|
||||
}
|
||||
|
||||
.mock-deploy {
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.mock-deploy p {
|
||||
color: #6c757d;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.mock-btn {
|
||||
padding: 12px 24px;
|
||||
background: #6c757d;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
cursor: not-allowed;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.mock-backups {
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.mock-backups p {
|
||||
color: #6c757d;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.mock-backup-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.mock-backup-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 16px;
|
||||
background: #e9ecef;
|
||||
border-radius: 8px;
|
||||
border: 1px solid #dee2e6;
|
||||
}
|
||||
|
||||
.backup-name {
|
||||
font-weight: 600;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.backup-date, .backup-size {
|
||||
font-size: 0.9rem;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.call-to-action {
|
||||
background: linear-gradient(135deg, #e3f2fd 0%, #f3e5f5 100%);
|
||||
border-radius: 10px;
|
||||
padding: 32px;
|
||||
text-align: center;
|
||||
border: 2px solid #bbdefb;
|
||||
}
|
||||
|
||||
.call-to-action h2 {
|
||||
margin: 0 0 16px 0;
|
||||
color: var(--color-primary);
|
||||
font-size: 1.6rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.call-to-action p {
|
||||
color: #6c757d;
|
||||
margin-bottom: 24px;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.setup-btn {
|
||||
padding: 16px 32px;
|
||||
background: var(--color-primary);
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
cursor: pointer;
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.setup-btn:hover {
|
||||
background: var(--color-primary-dark);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 12px rgba(0, 123, 255, 0.3);
|
||||
}
|
||||
|
||||
/* Адаптивность */
|
||||
@media (max-width: 768px) {
|
||||
.mock-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.mock-metrics {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.mock-service, .mock-backup-item {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -18,8 +18,6 @@
|
||||
:identities="identities"
|
||||
:token-balances="tokenBalances"
|
||||
:is-loading-tokens="isLoadingTokens"
|
||||
:telegram-auth="telegramAuth"
|
||||
:email-auth="emailAuth"
|
||||
/>
|
||||
<div class="webssh-settings-block">
|
||||
<button class="close-btn" @click="goBack">×</button>
|
||||
@@ -37,6 +35,18 @@ import Header from '@/components/Header.vue';
|
||||
import Sidebar from '@/components/Sidebar.vue';
|
||||
import { useAuthContext } from '@/composables/useAuth';
|
||||
|
||||
// Определяем пропсы, которые мы принимаем
|
||||
defineProps({
|
||||
isAuthenticated: Boolean,
|
||||
identities: Array,
|
||||
tokenBalances: Array,
|
||||
isLoadingTokens: Boolean,
|
||||
formattedLastUpdate: String
|
||||
});
|
||||
|
||||
// Определяем события, которые мы эмитим
|
||||
defineEmits(['authActionCompleted']);
|
||||
|
||||
const router = useRouter();
|
||||
const goBack = () => router.push('/settings/interface');
|
||||
const showSidebar = ref(false);
|
||||
@@ -49,18 +59,6 @@ const isAuthenticated = auth.isAuthenticated.value;
|
||||
const identities = auth.identities?.value || [];
|
||||
const tokenBalances = auth.tokenBalances?.value || [];
|
||||
const isLoadingTokens = false;
|
||||
|
||||
// Дефолтные объекты для Sidebar
|
||||
const telegramAuth = {
|
||||
showVerification: false,
|
||||
botLink: '',
|
||||
verificationCode: '',
|
||||
error: ''
|
||||
};
|
||||
const emailAuth = {
|
||||
showForm: false,
|
||||
showVerification: false
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
Reference in New Issue
Block a user