diff --git a/frontend/admin/src/layout/component/columnsAside.vue b/frontend/admin/src/layout/component/columnsAside.vue index 41aa10ee9..9b0f6409f 100644 --- a/frontend/admin/src/layout/component/columnsAside.vue +++ b/frontend/admin/src/layout/component/columnsAside.vue @@ -185,8 +185,11 @@ function setColumnsMenuHighlight(path) { watch( () => themeConfigStore.themeConfig.columnsAsideStyle, (val) => { - val === 'columnsRound' ? (difference.value = 3) : (difference.value = 0); + // 圆角滑块高 44px(项高 50px),top 下移 3px 使滑块在项内垂直居中;卡片滑块顶满 50px 项高,无需偏移。 + // 设置面板 radio 下发 kebab-case(columns-round/columns-card),原驼峰比较 columnsRound 永不匹配,一并修正 + val === 'columns-round' ? (difference.value = 3) : (difference.value = 0); }, + { immediate: true }, ); // 监听路由的变化 @@ -222,6 +225,8 @@ watch( color: var(--prev-bg-columnsMenuBarColor); width: 100%; height: 50px; + /* 一级菜单图标统一 16px:iconfont 菜单图标组件默认 16px,EP 图标无 .el-menu 上下文会回落 14px */ + font-size: 16px; text-align: center; display: flex; cursor: pointer; @@ -260,11 +265,11 @@ watch( text-decoration: none; color: var(--prev-bg-columnsMenuBarColor); } + /* 悬停反馈:以菜单文字色衍生 8% 半透明底,深/浅主题自动适配;不占用选中态主题蓝 */ + &:hover { + background: color-mix(in srgb, var(--prev-bg-columnsMenuBarColor) 8%, transparent); + } } - // li:hover { - // background: var(--prev-color-primary); - // color: var(--prev-bg-columnsMenuBarColor); - // } .layout-columns { transition: 0.3s ease-in-out; } @@ -274,18 +279,19 @@ watch( transition: 0.3s ease-in-out; } + /* 圆角选中滑块:项高 50px 内上下各留 3px、左右各留 5px,圆角 6px 与全站控件圆角一致;卡片风格由 .columns-card 覆盖回全宽直角 */ .columns-round { background: var(--prev-color-primary); // color: var(--prev-color-text-white); position: absolute; left: 50%; - top: 2px; - height: 50px; - width: 65px; + top: 3px; + height: 44px; + width: calc(100% - 10px); transform: translateX(-50%); z-index: 0; transition: 0.3s ease-in-out; - border-radius: 5px; + border-radius: 6px; } .columns-card { @extend .columns-round; diff --git a/frontend/admin/src/layout/navBars/breadcrumb/search.vue b/frontend/admin/src/layout/navBars/breadcrumb/search.vue index c61df4971..06b945de2 100644 --- a/frontend/admin/src/layout/navBars/breadcrumb/search.vue +++ b/frontend/admin/src/layout/navBars/breadcrumb/search.vue @@ -12,7 +12,7 @@ v-model="menuQuery" :fetch-suggestions="menuSearch" :placeholder="$t('message.user.searchPlaceholder')" - prefix-icon="el-icon-search" + prefix-icon="Search" ref="layoutMenuAutocompleteRef" @select="onHandleSelect" @blur="onSearchBlur" diff --git a/frontend/admin/src/layout/navBars/breadcrumb/setings.vue b/frontend/admin/src/layout/navBars/breadcrumb/setings.vue index 8b809e317..a6656f462 100644 --- a/frontend/admin/src/layout/navBars/breadcrumb/setings.vue +++ b/frontend/admin/src/layout/navBars/breadcrumb/setings.vue @@ -526,7 +526,7 @@ function onSetLayout(layout) { } themeConfigStore.themeConfig.layout = layout; themeConfigStore.themeConfig.isDrawer = false; - themeConfigStore.themeConfig.columnsAsideStyle = 'columns-card'; + // 高亮风格(columnsAsideStyle)不随布局切换重置,保留用户选择;默认值唯一真源在 store/module/themeConfig.js setLocalTheme(themeConfigStore.themeConfig.themeStyle); } diff --git a/frontend/admin/src/main.js b/frontend/admin/src/main.js index 287599d08..df7ff5396 100644 --- a/frontend/admin/src/main.js +++ b/frontend/admin/src/main.js @@ -24,7 +24,7 @@ import * as tools from '@/libs/tools'; import timeOptions from '@/libs/timeOptions'; // UI 框架 -import ElementPlus from 'element-plus'; +import ElementPlus, { ElMessage } from 'element-plus'; import zhCn from 'element-plus/es/locale/lang/zh-cn'; import 'element-plus/dist/index.css'; import * as ElementPlusIconsVue from '@element-plus/icons-vue'; @@ -75,6 +75,20 @@ const app = createApp(App); window.Vue = Vue; window.ElementPlus = ElementPlus; +// ---- ElMessage 防刷屏:登录过期等场景下多个并发请求同时失败,各页面 catch 各弹一条相同提示。 +// 为类型方法统一注入 grouping,由 Element Plus 把相同内容合并为一条并显示重复计数; +// 内容为 VNode 时不支持合并,原样透传。 ---- +['success', 'warning', 'info', 'error'].forEach((type) => { + const original = ElMessage[type].bind(ElMessage); + ElMessage[type] = (options) => { + const message = typeof options === 'string' ? options : options?.message; + if (typeof message === 'string' && message) { + return original(typeof options === 'string' ? { message, grouping: true } : { ...options, grouping: true }); + } + return original(options); + }; +}); + // ---- 过渡兼容层:Vue2 时代的 this.bus($on/$off/$emit 转发到 mitt 总线) ---- app.config.globalProperties.bus = { $on: (type, fn) => bus.on(type, fn), diff --git a/frontend/admin/src/pages/index/components/userChart.vue b/frontend/admin/src/pages/index/components/userChart.vue index abe3b01ac..9a6146af3 100644 --- a/frontend/admin/src/pages/index/components/userChart.vue +++ b/frontend/admin/src/pages/index/components/userChart.vue @@ -5,7 +5,7 @@

用户

@@ -23,7 +23,7 @@

购买用户统计

diff --git a/frontend/admin/src/pages/index/components/visitChart.vue b/frontend/admin/src/pages/index/components/visitChart.vue index 124d8bd39..c93f8bd56 100644 --- a/frontend/admin/src/pages/index/components/visitChart.vue +++ b/frontend/admin/src/pages/index/components/visitChart.vue @@ -7,7 +7,7 @@

订单

diff --git a/frontend/admin/src/pages/plugin/aiagent/components/McpManage.vue b/frontend/admin/src/pages/plugin/aiagent/components/McpManage.vue index a1125f7dd..5ee52d4f4 100644 --- a/frontend/admin/src/pages/plugin/aiagent/components/McpManage.vue +++ b/frontend/admin/src/pages/plugin/aiagent/components/McpManage.vue @@ -7,11 +7,12 @@
MCP 服务管理
安装 MCP 服务,为 AI Agent 扩展更多工具能力
- 配置 MCP + + 配置 MCP
- +
@@ -75,7 +76,13 @@ 尚未同步工具,点击 拉取远端工具清单。
- + {{ tool.label || tool.name }}
@@ -609,3 +616,11 @@ function removeServer(row) { } } + + diff --git a/frontend/admin/src/pages/plugin/aiagent/components/SkillManage.vue b/frontend/admin/src/pages/plugin/aiagent/components/SkillManage.vue index 69f388319..7cc6762d3 100644 --- a/frontend/admin/src/pages/plugin/aiagent/components/SkillManage.vue +++ b/frontend/admin/src/pages/plugin/aiagent/components/SkillManage.vue @@ -130,7 +130,7 @@ 附属资料不随对话注入,Agent 判断需要更完整资料时按需加载;文件为 .md 格式(SKILL.md 与 EXAMPLES.md 为保留名)。