This commit is contained in:
2026-01-26 10:01:44 +08:00
parent 3f58d013ca
commit 2a9cb82fef
9 changed files with 494 additions and 527 deletions

View File

@@ -1,4 +1,5 @@
<template><el-breadcrumb separator="/"> <template>
<el-breadcrumb separator="/">
<transition-group name="breadcrumb"> <transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item, index) in breadcrumbs" :key="item.path"> <el-breadcrumb-item v-for="(item, index) in breadcrumbs" :key="item.path">
<span v-if="index === breadcrumbs.length - 1" class="no-redirect"> <span v-if="index === breadcrumbs.length - 1" class="no-redirect">
@@ -9,7 +10,8 @@
</a> </a>
</el-breadcrumb-item> </el-breadcrumb-item>
</transition-group> </transition-group>
</el-breadcrumb></template> </el-breadcrumb>
</template>
<script setup> <script setup>
import { computed } from 'vue' import { computed } from 'vue'

View File

@@ -1,4 +1,5 @@
<template><template v-for="menu in menuList" :key="menu.path"> <template>
<template v-for="menu in menuList" :key="menu.path">
<!-- 有子菜单 --> <!-- 有子菜单 -->
<el-sub-menu v-if="hasChildren(menu) && !menu.meta?.hidden" :index="menu.path"> <el-sub-menu v-if="hasChildren(menu) && !menu.meta?.hidden" :index="menu.path">
<template #title> <template #title>
@@ -20,7 +21,8 @@
<span>{{ menu.meta?.title }}</span> <span>{{ menu.meta?.title }}</span>
</template> </template>
</el-menu-item> </el-menu-item>
</template></template> </template>
</template>
<script setup> <script setup>
defineOptions({ defineOptions({

View File

@@ -1,5 +1,5 @@
<template><el-menu :default-active="activeMenu" :mode="menuMode" :collapse="isCollapse" :unique-opened="uniqueOpened" <template>
:router="true" :collapse-transition="false" @select="handleSelect"> <el-menu :default-active="activeMenu" :mode="menuMode" :collapse="isCollapse" :unique-opened="uniqueOpened" :router="true" :collapse-transition="false" @select="handleSelect">
<template v-for="menu in menuList" :key="menu.path"> <template v-for="menu in menuList" :key="menu.path">
<!-- 有子菜单 --> <!-- 有子菜单 -->
<el-sub-menu v-if="hasChildren(menu) && !menu.meta?.hidden" :index="menu.path"> <el-sub-menu v-if="hasChildren(menu) && !menu.meta?.hidden" :index="menu.path">
@@ -23,7 +23,8 @@
</template> </template>
</el-menu-item> </el-menu-item>
</template> </template>
</el-menu></template> </el-menu>
</template>
<script setup> <script setup>
import { computed } from 'vue' import { computed } from 'vue'

View File

@@ -52,13 +52,10 @@
<div class="setting-title">主题色</div> <div class="setting-title">主题色</div>
<div class="setting-value"> <div class="setting-value">
<div class="color-picker-wrapper"> <div class="color-picker-wrapper">
<el-color-picker v-model="themeColor" show-alpha :predefine="predefineColors" <el-color-picker v-model="themeColor" show-alpha :predefine="predefineColors" @change="handleThemeColorChange" />
@change="handleThemeColorChange" />
</div> </div>
<div class="color-presets"> <div class="color-presets">
<div v-for="color in predefineColors" :key="color" class="color-preset" <div v-for="color in predefineColors" :key="color" class="color-preset" :class="{ active: themeColor === color }" :style="{ backgroundColor: color }" @click="handleColorPresetClick(color)"></div>
:class="{ active: themeColor === color }" :style="{ backgroundColor: color }"
@click="handleColorPresetClick(color)"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -137,14 +134,7 @@
<script setup> <script setup>
import { ref, computed, onMounted } from 'vue' import { ref, computed, onMounted } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { import { Setting, Sunny, Moon, QuestionFilled, Check, RefreshLeft } from '@element-plus/icons-vue'
Setting,
Sunny,
Moon,
QuestionFilled,
Check,
RefreshLeft,
} from '@element-plus/icons-vue'
import { useLayoutStore } from '@/stores/modules/layout' import { useLayoutStore } from '@/stores/modules/layout'
defineOptions({ defineOptions({
@@ -267,7 +257,6 @@ onMounted(() => {
<style lang="scss" scoped> <style lang="scss" scoped>
.setting-container { .setting-container {
// 设置按钮 // 设置按钮
.setting-btn { .setting-btn {
position: fixed; position: fixed;
@@ -321,7 +310,6 @@ onMounted(() => {
} }
.setting-value { .setting-value {
// 布局选项 // 布局选项
:deep(.el-radio-group) { :deep(.el-radio-group) {
width: 100%; width: 100%;

View File

@@ -1,9 +1,7 @@
<template> <template>
<div class="tags-view-container"> <div class="tags-view-container">
<el-scrollbar class="tags-view-wrapper"> <el-scrollbar class="tags-view-wrapper">
<router-link v-for="tag in visibleTags" :key="tag.fullPath" :class="isActive(tag) ? 'active' : ''" <router-link v-for="tag in visibleTags" :key="tag.fullPath" :class="isActive(tag) ? 'active' : ''" class="tags-view-item" :to="{ path: tag.fullPath }" @click.middle="closeTag(tag)" @contextmenu.prevent="openMenu(tag, $event)">
class="tags-view-item" :to="{ path: tag.fullPath }" @click.middle="closeTag(tag)"
@contextmenu.prevent="openMenu(tag, $event)">
{{ tag.title || tag.meta?.title }} {{ tag.title || tag.meta?.title }}
<el-icon v-if="!tag.meta?.affix" class="el-icon-close" @click.prevent.stop="closeTag(tag)"> <el-icon v-if="!tag.meta?.affix" class="el-icon-close" @click.prevent.stop="closeTag(tag)">
<Close /> <Close />

View File

@@ -21,12 +21,8 @@
</div> </div>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item :disabled="currentLanguage === 'zh-CN'" command="zh-CN"> <el-dropdown-item :disabled="currentLanguage === 'zh-CN'" command="zh-CN"> 简体中文 </el-dropdown-item>
简体中文 <el-dropdown-item :disabled="currentLanguage === 'en-US'" command="en-US"> English </el-dropdown-item>
</el-dropdown-item>
<el-dropdown-item :disabled="currentLanguage === 'en-US'" command="en-US">
English
</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@@ -113,20 +109,7 @@
import { computed, ref, onMounted, onUnmounted } from 'vue' import { computed, ref, onMounted, onUnmounted } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { ElMessageBox, ElMessage } from 'element-plus' import { ElMessageBox, ElMessage } from 'element-plus'
import { import { ArrowDown, HomeFilled, User, Setting, SwitchButton, FullScreen, Aim, Location, Sunny, Moon, Bell, UserFilled } from '@element-plus/icons-vue'
ArrowDown,
HomeFilled,
User,
Setting,
SwitchButton,
FullScreen,
Aim,
Location,
Sunny,
Moon,
Bell,
UserFilled,
} from '@element-plus/icons-vue'
import { useUserStore } from '@/stores/modules/user' import { useUserStore } from '@/stores/modules/user'
import { useI18nStore } from '@/stores/modules/i18n' import { useI18nStore } from '@/stores/modules/i18n'

View File

@@ -1,4 +1,5 @@
<template><el-container class="app-wrapper" :class="layoutClass"> <template>
<el-container class="app-wrapper" :class="layoutClass">
<!-- 默认布局左侧双栏布局 --> <!-- 默认布局左侧双栏布局 -->
<template v-if="layoutMode === 'default'"> <template v-if="layoutMode === 'default'">
<!-- 一级菜单栏 (窄侧边栏) --> <!-- 一级菜单栏 (窄侧边栏) -->
@@ -8,8 +9,7 @@
<span v-else class="logo-text-mini">{{ logoText }}</span> <span v-else class="logo-text-mini">{{ logoText }}</span>
</div> </div>
<div class="menu-list"> <div class="menu-list">
<div v-for="menu in parentMenus" :key="menu.path" class="menu-item" <div v-for="menu in parentMenus" :key="menu.path" class="menu-item" :class="{ active: selectedParentMenu?.path === menu.path }" @click="handleParentMenuClick(menu)">
:class="{ active: selectedParentMenu?.path === menu.path }" @click="handleParentMenuClick(menu)">
<el-icon v-if="menu.meta?.icon"> <el-icon v-if="menu.meta?.icon">
<component :is="menu.meta.icon" /> <component :is="menu.meta.icon" />
</el-icon> </el-icon>
@@ -165,9 +165,7 @@ const layoutClass = computed(() => {
// 缓存的视图 // 缓存的视图
const cachedViews = computed(() => { const cachedViews = computed(() => {
return viewTags.value return viewTags.value.filter((tag) => tag.meta?.keepAlive).map((tag) => tag.name)
.filter((tag) => tag.meta?.keepAlive)
.map((tag) => tag.name)
}) })
// 父级菜单(一级菜单) // 父级菜单(一级菜单)
@@ -213,10 +211,7 @@ watch(
if (layoutMode.value === 'default') { if (layoutMode.value === 'default') {
const menus = userStore.getMenu() || [] const menus = userStore.getMenu() || []
for (const parentMenu of menus) { for (const parentMenu of menus) {
if ( if (parentMenu.children && parentMenu.children.some((child) => route.path.startsWith(child.path))) {
parentMenu.children &&
parentMenu.children.some((child) => route.path.startsWith(child.path))
) {
layoutStore.setSelectedParentMenu(parentMenu) layoutStore.setSelectedParentMenu(parentMenu)
break break
} }

View File

@@ -3,6 +3,6 @@
</template> </template>
<script setup> <script setup>
defineOptions({ defineOptions({
name: 'HomeIndex' name: 'HomeIndex',
}) })
</script> </script>

View File

@@ -12,8 +12,7 @@
<p class="auth-subtitle">登录您的账户继续探索科技世界</p> <p class="auth-subtitle">登录您的账户继续探索科技世界</p>
</div> </div>
<el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" class="auth-form" <el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" class="auth-form" @submit.prevent="handleLogin">
@submit.prevent="handleLogin">
<el-form-item prop="username"> <el-form-item prop="username">
<el-input v-model="loginForm.username" placeholder="请输入用户名/邮箱" size="large" clearable> <el-input v-model="loginForm.username" placeholder="请输入用户名/邮箱" size="large" clearable>
<template #prefix> <template #prefix>
@@ -25,8 +24,7 @@
</el-form-item> </el-form-item>
<el-form-item prop="password"> <el-form-item prop="password">
<el-input v-model="loginForm.password" type="password" placeholder="请输入密码" size="large" clearable <el-input v-model="loginForm.password" type="password" placeholder="请输入密码" size="large" clearable show-password @keyup.enter="handleLogin">
show-password @keyup.enter="handleLogin">
<template #prefix> <template #prefix>
<el-icon> <el-icon>
<Lock /> <Lock />