fix: полный production-фикс fix40 (layout, sidebar, journald, логирование)

This commit is contained in:
2026-05-21 14:51:19 +05:00
parent 53711aecd3
commit 85798bebb6
19 changed files with 218 additions and 131 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ const appStore = useAppStore();
</script>
<template>
<el-config-provider :locale="appStore.locale" :size="appStore.size">
<el-config-provider :locale="appStore.locale">
<router-view />
</el-config-provider>
</template>
-1
View File
@@ -1 +0,0 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h54.796v18.286H36.531V128H18.265V73.143H0V54.857zm127.857-36.571H91.935V128H72.456V18.286H36.534V0h91.326l-.003 18.286z"/></svg>

Before

Width:  |  Height:  |  Size: 211 B

@@ -1,40 +0,0 @@
<script setup lang="ts">
import { useAppStore } from "@/store/modules/app";
import { useI18n } from "vue-i18n";
const appStore = useAppStore();
const { t } = useI18n();
const sizeOptions = ref([
{ label: t("common.sizeDefault"), value: "default" },
{ label: t("common.sizeLarge"), value: "large" },
{ label: t("common.sizeSmall"), value: "small" },
]);
function handleSizeChange(size: string) {
appStore.changeSize(size);
ElMessage.success(t("common.sizeChanged"));
}
</script>
<template>
<el-dropdown trigger="click" @command="handleSizeChange">
<div>
<svg-icon icon-class="size" />
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
v-for="item of sizeOptions"
:key="item.value"
:disabled="appStore.size == item.value"
:command="item.value"
>
{{ item.label }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
-4
View File
@@ -112,10 +112,6 @@ export default {
resetTrafficConfirm: "Are you sure to reset peer traffic?",
invalid: "Invalid value",
switchLanguageSuccess: "Language switched successfully",
sizeChanged: "Interface size changed",
sizeDefault: "Default",
sizeLarge: "Large",
sizeSmall: "Small",
logoutConfirm: "Are you sure you want to log out?",
sessionExpired: "Current session has expired, please log in again",
},
-4
View File
@@ -108,10 +108,6 @@ export default {
resetTrafficConfirm: "Сбросить трафик для пира?",
invalid: "Некорректное значение",
switchLanguageSuccess: "Язык переключён",
sizeChanged: "Размер интерфейса изменён",
sizeDefault: "Обычный",
sizeLarge: "Крупный",
sizeSmall: "Компактный",
logoutConfirm: "Выйти из системы?",
sessionExpired: "Текущая сессия истекла, войдите снова",
},
+32 -27
View File
@@ -53,7 +53,7 @@ function logout() {
<!-- Верхняя навигационная панель -->
<div class="navbar">
<!-- Хлебные крошки слева -->
<div class="flex">
<div class="navbar-left">
<hamburger
:is-active="appStore.sidebar.opened"
@toggleClick="toggleSideBar"
@@ -62,7 +62,7 @@ function logout() {
</div>
<!-- Настройки навигации справа -->
<div class="flex">
<div class="navbar-actions">
<!-- Настройки навигации, скрытые на узком экране -->
<div class="setting-container" v-if="device !== 'mobile'">
<!-- Полноэкранный режим -->
@@ -71,30 +71,28 @@ function logout() {
:icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'"
/>
</div>
<!-- Размер интерфейса -->
<el-tooltip content="Размер интерфейса" effect="dark" placement="bottom">
<size-select class="setting-item" />
</el-tooltip>
<!-- Выбор языка -->
<lang-select class="setting-item" />
</div>
<!-- Аватар пользователя -->
<el-dropdown trigger="click">
<div class="avatar-container">
<el-avatar :size="32" class="avatar-icon">
<i-ep-user-filled />
</el-avatar>
<i-ep-caret-bottom class="w-3 h-3" />
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="logout">
{{ $t("navbar.logout") }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<div class="avatar-dropdown">
<el-dropdown trigger="click">
<div class="avatar-container">
<el-avatar :size="32" class="avatar-icon">
<i-ep-user-filled />
</el-avatar>
<i-ep-caret-bottom class="w-3 h-3" />
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="logout">
{{ $t("navbar.logout") }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</div>
</template>
@@ -108,17 +106,24 @@ function logout() {
background-color: #fff;
box-shadow: 0 0 1px #0003;
.setting-container {
.navbar-left,
.navbar-actions,
.setting-container,
.avatar-dropdown {
display: flex;
align-items: center;
height: 100%;
}
.setting-container {
.setting-item {
display: inline-block;
display: flex;
align-items: center;
justify-content: center;
width: 30px;
height: 50px;
line-height: 50px;
line-height: normal;
color: #5a5e66;
text-align: center;
cursor: pointer;
&:hover {
@@ -132,8 +137,8 @@ function logout() {
align-items: center;
justify-content: center;
gap: 6px;
height: 36px;
margin: 0 8px;
height: 50px;
margin: 0;
padding: 0 8px;
border-radius: 8px;
cursor: pointer;
+1 -1
View File
@@ -110,7 +110,7 @@ function handleOutsideClick() {
}
.hideSidebar .fixed-header {
width: calc(100% - 54px);
width: calc(100% - #{$sideBarCollapsedWidth});
}
.mobile .fixed-header {
-6
View File
@@ -34,11 +34,6 @@ interface DefaultSettings {
*/
theme: string;
/**
* Размер интерфейса
*/
size: string;
/**
* Язык
*/
@@ -60,7 +55,6 @@ const defaultSettings: DefaultSettings = {
* light: Светлая тема
*/
theme: "dark",
size: "default", // default |large |small
language: "ru", // ru | en
};
-6
View File
@@ -9,7 +9,6 @@ import ru from "element-plus/es/locale/lang/ru";
export const useAppStore = defineStore("app", () => {
// state
const device = useStorage("device", "desktop");
const size = useStorage<any>("size", defaultSettings.size);
const language = useStorage("language", defaultSettings.language);
const sidebarStatus = useStorage("sidebarStatus", "closed");
@@ -52,9 +51,6 @@ export const useAppStore = defineStore("app", () => {
device.value = val;
}
function changeSize(val: string) {
size.value = val;
}
/**
* Переключение языка
*
@@ -69,9 +65,7 @@ export const useAppStore = defineStore("app", () => {
sidebar,
language,
locale,
size,
toggleDevice,
changeSize,
changeLanguage,
toggleSidebar,
closeSideBar,
+22 -4
View File
@@ -109,7 +109,7 @@
.hideSidebar {
.sidebar-container {
width: 54px !important;
width: $sideBarCollapsedWidth !important;
.svg-icon {
margin-right: 0;
@@ -117,7 +117,26 @@
}
.main-container {
margin-left: 54px;
margin-left: $sideBarCollapsedWidth;
}
.sidebar-container .el-menu--collapse {
width: $sideBarCollapsedWidth !important;
}
.sidebar-container .el-menu--collapse > .el-menu-item,
.sidebar-container .el-menu--collapse > .el-sub-menu > .el-sub-menu__title {
justify-content: center;
gap: 0;
padding: 0 !important;
}
.sidebar-container .el-menu--collapse .svg-icon {
display: block;
flex: 0 0 18px;
width: 18px;
height: 18px;
margin: 0;
}
.el-sub-menu {
@@ -146,7 +165,7 @@
}
.el-menu--collapse .el-menu .el-sub-menu {
min-width: $sideBarWidth !important;
min-width: $sideBarCollapsedWidth !important;
}
// mobile responsive
@@ -218,4 +237,3 @@
}
}
+1
View File
@@ -20,5 +20,6 @@ $subMenuActiveText: var(--subMenuActiveText);
$subMenuHover: var(--subMenuHover);
$sideBarWidth: 210px;
$sideBarCollapsedWidth: 54px;
-1
View File
@@ -60,7 +60,6 @@ declare module '@vue/runtime-core' {
RightPanel: typeof import('./../components/RightPanel/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SizeSelect: typeof import('./../components/SizeSelect/index.vue')['default']
SvgIcon: typeof import('./../components/SvgIcon/index.vue')['default']
UnitSelect: typeof import('./../components/UnitSelect/index.vue')['default']
}