feat: новая функция

This commit is contained in:
2025-10-13 22:41:49 +03:00
parent 34666b44d8
commit 0e028bc722
83 changed files with 1595 additions and 6093 deletions

View File

@@ -99,6 +99,20 @@ const editMode = ref(false);
const auth = useAuthContext();
// Подписываемся на централизованные события очистки и обновления данных
onMounted(() => {
window.addEventListener('clear-application-data', () => {
console.log('[EmailSettingsView] Clearing Email settings data');
// Очищаем данные при выходе из системы
settings.value = { smtpHost: '', smtpPort: '', smtpUser: '', smtpPass: '', enabled: false };
});
window.addEventListener('refresh-application-data', () => {
console.log('[EmailSettingsView] Refreshing Email settings data');
loadEmailSettings(); // Обновляем данные при входе в систему
});
});
const loadEmailSettings = async () => {
// Не загружаем если не авторизован
if (!auth.isAuthenticated.value) {

View File

@@ -58,6 +58,20 @@ const editMode = ref(false);
const auth = useAuthContext();
// Подписываемся на централизованные события очистки и обновления данных
onMounted(() => {
window.addEventListener('clear-application-data', () => {
console.log('[TelegramSettingsView] Clearing Telegram settings data');
// Очищаем данные при выходе из системы
settings.value = { botToken: '', webhookUrl: '', enabled: false };
});
window.addEventListener('refresh-application-data', () => {
console.log('[TelegramSettingsView] Refreshing Telegram settings data');
loadTelegramSettings(); // Обновляем данные при входе в систему
});
});
const loadTelegramSettings = async () => {
// Не загружаем если не авторизован
if (!auth.isAuthenticated.value) {

View File

@@ -67,12 +67,26 @@
</template>
<script setup>
import { ref } from 'vue';
import { ref, onMounted } from 'vue';
import AIProviderSettings from './AIProviderSettings.vue';
import { useAuthContext } from '@/composables/useAuth';
import { usePermissions } from '@/composables/usePermissions';
import NoAccessModal from '@/components/NoAccessModal.vue';
// Подписываемся на централизованные события очистки и обновления данных
onMounted(() => {
window.addEventListener('clear-application-data', () => {
console.log('[AiSettingsView] Clearing AI settings data');
// Очищаем данные при выходе из системы
// AiSettingsView не нуждается в очистке данных
});
window.addEventListener('refresh-application-data', () => {
console.log('[AiSettingsView] Refreshing AI settings data');
// AiSettingsView не нуждается в обновлении данных
});
});
const showProvider = ref(null);
const showTelegramSettings = ref(false);
const showEmailSettings = ref(false);
@@ -80,7 +94,6 @@ const showDbSettings = ref(false);
const showAiAssistantSettings = ref(false);
const showNoAccessModal = ref(false);
const { isAdmin } = useAuthContext();
const { canManageSettings } = usePermissions();
const providerLabels = {

View File

@@ -35,9 +35,9 @@
<span><strong>Editor:</strong> {{ token.editorThreshold || 2 }} токен{{ token.editorThreshold === 1 ? '' : token.editorThreshold < 5 ? 'а' : 'ов' }}</span>
<button
class="btn btn-sm"
:class="canEdit ? 'btn-danger' : 'btn-secondary'"
@click="canEdit ? removeToken(index) : null"
:disabled="!canEdit"
:class="canManageSettings ? 'btn-danger' : 'btn-secondary'"
@click="canManageSettings ? removeToken(index) : null"
:disabled="!canManageSettings"
>
Удалить
</button>
@@ -53,7 +53,7 @@
v-model="newToken.name"
class="form-control"
placeholder="test2"
:disabled="!canEdit"
:disabled="!canManageSettings"
>
</div>
<div class="form-group">
@@ -63,12 +63,12 @@
v-model="newToken.address"
class="form-control"
placeholder="0x..."
:disabled="!canEdit"
:disabled="!canManageSettings"
>
</div>
<div class="form-group">
<label>Сеть:</label>
<select v-model="newToken.network" class="form-control" :disabled="!canEdit">
<select v-model="newToken.network" class="form-control" :disabled="!canManageSettings">
<option value="">-- Выберите сеть --</option>
<optgroup v-for="(group, groupIndex) in networkGroups" :key="groupIndex" :label="group.label">
<option v-for="option in group.options" :key="option.value" :value="option.value">
@@ -86,7 +86,7 @@
placeholder="0"
min="0"
step="0.01"
:disabled="!canEdit"
:disabled="!canManageSettings"
>
<small class="form-text">Минимальный баланс токена для получения доступа</small>
</div>
@@ -102,7 +102,7 @@
class="form-control"
placeholder="1"
min="1"
:disabled="!canEdit"
:disabled="!canManageSettings"
>
<small class="form-text">Количество токенов для получения прав только на чтение</small>
</div>
@@ -114,16 +114,16 @@
class="form-control"
placeholder="2"
min="2"
:disabled="!canEdit"
:disabled="!canManageSettings"
>
<small class="form-text">Количество токенов для получения прав на редактирование и удаление</small>
</div>
</div>
<button
class="btn"
:class="canEdit ? 'btn-primary' : 'btn-secondary'"
@click="canEdit ? addToken() : null"
:disabled="!canEdit"
:class="canManageSettings ? 'btn-primary' : 'btn-secondary'"
@click="canManageSettings ? addToken() : null"
:disabled="!canManageSettings"
>
Добавить токен
</button>
@@ -132,7 +132,7 @@
</template>
<script setup>
import { reactive, computed } from 'vue';
import { reactive, computed, onMounted } from 'vue';
import useBlockchainNetworks from '@/composables/useBlockchainNetworks';
import api from '@/api/axios';
import { useAuthContext } from '@/composables/useAuth';
@@ -152,8 +152,22 @@ const newToken = reactive({
});
const { networkGroups, networks } = useBlockchainNetworks();
const { isAdmin, checkTokenBalances, address, checkAuth, userAccessLevel, checkUserAccessLevel } = useAuthContext();
const { canEdit, getLevelClass, getLevelDescription } = usePermissions();
const { checkTokenBalances, address, checkAuth, userAccessLevel, checkUserAccessLevel } = useAuthContext();
const { canManageSettings, getLevelClass, getLevelDescription } = usePermissions();
// Подписываемся на централизованные события очистки и обновления данных
onMounted(() => {
window.addEventListener('clear-application-data', () => {
console.log('[AuthTokensSettings] Clearing tokens data');
// Очищаем данные при выходе из системы
tokens.value = [];
});
window.addEventListener('refresh-application-data', () => {
console.log('[AuthTokensSettings] Refreshing tokens data');
loadTokens(); // Обновляем данные при входе в систему
});
});
async function addToken() {
if (!newToken.name || !newToken.address || !newToken.network) {

View File

@@ -854,8 +854,8 @@
@click="deploySmartContracts"
type="button"
class="btn btn-primary btn-lg deploy-btn"
:disabled="!isFormValid || !canEdit || adminTokenCheck.isLoading"
:title="`isFormValid: ${isFormValid}, isAdmin: ${adminTokenCheck.isAdmin}, isLoading: ${adminTokenCheck.isLoading}`"
:disabled="!isFormValid || !canManageSettings || adminTokenCheck.isLoading"
:title="`isFormValid: ${isFormValid}, canManageSettings: ${canManageSettings}, isLoading: ${adminTokenCheck.isLoading}`"
>
<i class="fas fa-cogs"></i>
Поэтапный деплой DLE
@@ -921,13 +921,27 @@ function normalizePrivateKey(raw) {
// Получаем контекст авторизации для адреса кошелька
const { address, isAdmin } = useAuthContext();
const { canEdit } = usePermissions();
const { address } = useAuthContext();
const { canManageSettings } = usePermissions();
// Подписываемся на централизованные события очистки и обновления данных
onMounted(() => {
window.addEventListener('clear-application-data', () => {
console.log('[DleDeployFormView] Clearing DLE deploy data');
// Очищаем данные при выходе из системы
// DleDeployFormView не нуждается в очистке данных
});
window.addEventListener('refresh-application-data', () => {
console.log('[DleDeployFormView] Refreshing DLE deploy data');
checkAdminTokens(); // Обновляем данные при входе в систему
});
});
// Состояние для проверки админских токенов
const adminTokenCheck = ref({
isLoading: false,
isAdmin: false,
canManageSettings: false,
error: null
});
@@ -2381,7 +2395,7 @@ watch(address, (newAddress) => {
// Функция проверки админских токенов
const checkAdminTokens = async () => {
if (!address.value) {
adminTokenCheck.value = { isLoading: false, isAdmin: false, error: 'Кошелек не подключен' };
adminTokenCheck.value = { isLoading: false, canManageSettings: false, error: 'Кошелек не подключен' };
return;
}
@@ -2391,7 +2405,7 @@ const checkAdminTokens = async () => {
const response = await api.get(`/dle-v2/check-admin-tokens?address=${address.value}`);
if (response.data.success) {
adminTokenCheck.value = { ...adminTokenCheck.value, isAdmin: response.data.data.isAdmin };
adminTokenCheck.value = { ...adminTokenCheck.value, canManageSettings: response.data.data.userAccessLevel.hasAccess };
console.log('Проверка админских токенов:', response.data.data);
} else {
adminTokenCheck.value = { ...adminTokenCheck.value, error: response.data.message || 'Ошибка проверки токенов' };
@@ -2589,7 +2603,7 @@ const handleDeploymentCompleted = (result) => {
console.log('🔍 unifiedPrivateKey.value:', unifiedPrivateKey.value);
console.log('🔍 keyValidation.unified:', keyValidation.unified);
console.log('🔍 dleSettings.coordinates:', dleSettings.coordinates);
console.log('🔍 Кнопка должна быть активна:', !(!validation.jurisdiction || !validation.name || !validation.tokenSymbol || !validation.partners || !validation.partnersValid || !validation.quorum || !validation.networks || !validation.privateKey || !validation.keyValid || !validation.coordinates) && adminTokenCheck.value.isAdmin && !adminTokenCheck.value.isLoading);
console.log('🔍 Кнопка должна быть активна:', !(!validation.jurisdiction || !validation.name || !validation.tokenSymbol || !validation.partners || !validation.partnersValid || !validation.quorum || !validation.networks || !validation.privateKey || !validation.keyValid || !validation.coordinates) && adminTokenCheck.value.canManageSettings && !adminTokenCheck.value.isLoading);
return Boolean(
validation.jurisdiction &&

View File

@@ -73,7 +73,13 @@
<span class="feature"> Безопасно</span>
<span class="feature"> Для локальных и VPS</span>
</div>
<button class="btn-primary" @click="goToWebSsh">Подробнее</button>
<button
class="btn-primary"
@click="canManageSettings ? goToWebSsh() : null"
:disabled="!canManageSettings"
>
Подробнее
</button>
</div>
<!-- Модальное окно с формой WEB SSH -->
@@ -93,9 +99,23 @@ import { useRouter } from 'vue-router';
import { useAuthContext } from '@/composables/useAuth';
import { usePermissions } from '@/composables/usePermissions';
import NoAccessModal from '@/components/NoAccessModal.vue';
import { onMounted } from 'vue';
// Подписываемся на централизованные события очистки и обновления данных
onMounted(() => {
window.addEventListener('clear-application-data', () => {
console.log('[InterfaceSettingsView] Clearing interface data');
// Очищаем данные при выходе из системы
// InterfaceSettingsView не нуждается в очистке данных
});
window.addEventListener('refresh-application-data', () => {
console.log('[InterfaceSettingsView] Refreshing interface data');
// InterfaceSettingsView не нуждается в обновлении данных
});
});
import { ref } from 'vue';
const router = useRouter();
const { isAdmin } = useAuthContext();
const { canManageSettings } = usePermissions();
const goBack = () => router.push('/settings');

View File

@@ -28,7 +28,7 @@
</template>
<script setup>
import { ref } from 'vue';
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import WebSshForm from '@/components/WebSshForm.vue';
import Header from '@/components/Header.vue';
@@ -57,6 +57,20 @@ const toggleSidebar = () => {
const auth = useAuthContext();
const isAuthenticated = auth.isAuthenticated.value;
const identities = auth.identities?.value || [];
// Подписываемся на централизованные события очистки и обновления данных
onMounted(() => {
window.addEventListener('clear-application-data', () => {
console.log('[InterfaceWebSshView] Clearing WebSSH data');
// Очищаем данные при выходе из системы
// InterfaceWebSshView не нуждается в очистке данных
});
window.addEventListener('refresh-application-data', () => {
console.log('[InterfaceWebSshView] Refreshing WebSSH data');
// InterfaceWebSshView не нуждается в обновлении данных
});
});
const tokenBalances = auth.tokenBalances?.value || [];
const isLoadingTokens = false;
</script>

View File

@@ -80,6 +80,20 @@ import { usePermissions } from '@/composables/usePermissions';
import NoAccessModal from '@/components/NoAccessModal.vue';
import wsClient from '@/utils/websocket';
// Подписываемся на централизованные события очистки и обновления данных
onMounted(() => {
window.addEventListener('clear-application-data', () => {
console.log('[SecuritySettingsView] Clearing security data');
// Очищаем данные при выходе из системы
// SecuritySettingsView не нуждается в очистке данных
});
window.addEventListener('refresh-application-data', () => {
console.log('[SecuritySettingsView] Refreshing security data');
// SecuritySettingsView не нуждается в обновлении данных
});
});
// Состояние для отображения/скрытия дополнительных настроек
const showRpcSettings = ref(false);
const showAuthSettings = ref(false);
@@ -88,7 +102,6 @@ const isSaving = ref(false);
const showNoAccessModal = ref(false);
// Получаем контекст авторизации
const { isAdmin } = useAuthContext();
const { canManageSettings } = usePermissions();
// Настройки безопасности