Merge branch 'main' into pages

This commit is contained in:
xiaoxian521
2025-11-27 12:29:22 +08:00
14 changed files with 66 additions and 66 deletions

View File

@@ -26,7 +26,7 @@
### 🐞 Bug fixes ### 🐞 Bug fixes
- 修复`ReSegmented`分段控制器组件在浅色和深色整体风格切换时的闪烁问题 - 修复`ReSegmented`分段控制器组件在浅色和深色主题模式切换时的闪烁问题
- 修复`resetRouter`未清空全部路由数据问题 - 修复`resetRouter`未清空全部路由数据问题
- 修复标签页-关闭左侧标签页关闭异常问题 - 修复标签页-关闭左侧标签页关闭异常问题
@@ -231,8 +231,8 @@
- 修复`windwos`下点击注册页面会出现滚动条问题 - 修复`windwos`下点击注册页面会出现滚动条问题
- 修复`windows`下页面切换,内容区会出现滚动条问题 - 修复`windows`下页面切换,内容区会出现滚动条问题
- 修复`pure-table`带状态表格在深色整体风格下状态样式消失的问题 - 修复`pure-table`带状态表格在深色主题模式下状态样式消失的问题
- 修复系统配置中开启灰色模式和深色整体风格,刷新页面整体风格异常 - 修复系统配置中开启灰色模式和深色主题模式,刷新页面主题模式异常
### 🍏 Perf ### 🍏 Perf
@@ -285,7 +285,7 @@
- 内嵌`iframe`页支持设置`keepAlive`,保持页面状态 - 内嵌`iframe`页支持设置`keepAlive`,保持页面状态
- 优化导航,弹出的菜单超出内容区自适应且可滚动 - 优化导航,弹出的菜单超出内容区自适应且可滚动
- 添加文件上传示例 - 添加文件上传示例
- 添加整体风格自适应操作系统浅色、深色、自动主题功能 - 添加主题模式自适应操作系统浅色、深色、自动主题功能
- 添加页脚 - 添加页脚
- 支持多标签页打开已经登录的系统后无需再登录并添加内免登录功能(用户可选择免登录的天数) - 支持多标签页打开已经登录的系统后无需再登录并添加内免登录功能(用户可选择免登录的天数)
- 带来高级感的终端命令行 - 带来高级感的终端命令行
@@ -485,7 +485,7 @@
- 修复菜单搜索功能弹框打开后搜索框未自动聚集的问题 - 修复菜单搜索功能弹框打开后搜索框未自动聚集的问题
- 修复按 `ESC` 退出全屏后,工具栏按钮文案展示问题 - 修复按 `ESC` 退出全屏后,工具栏按钮文案展示问题
- 修复移动端通知栏 `tooltip` 点击穿透问题 - 修复移动端通知栏 `tooltip` 点击穿透问题
- 修复当左侧菜单收起后,切换到 `horizontal` 导航模式时文字不展示的问题 - 修复当左侧菜单收起后,切换到 `horizontal` 菜单布局时文字不展示的问题
- 修复导航 `tab` 关闭其他标签页无法重置状态问题 - 修复导航 `tab` 关闭其他标签页无法重置状态问题
- 修复 `getHistoryMode` 函数中环境变量未初始化带来的页面热更新报错 - 修复 `getHistoryMode` 函数中环境变量未初始化带来的页面热更新报错
- 修复导航 `tab` 过多导致关闭左侧标签页无法正常显示 - 修复导航 `tab` 过多导致关闭左侧标签页无法正常显示

View File

@@ -31,15 +31,15 @@ panel:
pureCloseSystemSet: Close System Configs pureCloseSystemSet: Close System Configs
pureClearCacheAndToLogin: Clear cache and return to login page pureClearCacheAndToLogin: Clear cache and return to login page
pureClearCache: Clear Cache pureClearCache: Clear Cache
pureOverallStyle: Overall Style pureThemeMode: Theme Mode
pureOverallStyleLight: Light pureThemeModeLight: Light
pureOverallStyleLightTip: Set sail freshly and light up the comfortable work interface pureThemeModeLightTip: Set sail freshly and light up the comfortable work interface
pureOverallStyleDark: Dark pureThemeModeDark: Dark
pureOverallStyleDarkTip: Moonlight Overture, indulge in the tranquility and elegance of the night pureThemeModeDarkTip: Moonlight Overture, indulge in the tranquility and elegance of the night
pureOverallStyleSystem: Auto pureThemeModeSystem: Auto
pureOverallStyleSystemTip: Synchronize time, the interface naturally responds to morning and dusk pureThemeModeSystemTip: Synchronize time, the interface naturally responds to morning and dusk
pureThemeColor: Theme Color pureThemeColor: Theme Color
pureLayoutModel: Layout Model pureMenuLayout: Menu Layout
pureVerticalTip: The menu on the left is familiar and friendly pureVerticalTip: The menu on the left is familiar and friendly
pureHorizontalTip: Top menu, concise overview pureHorizontalTip: Top menu, concise overview
pureMixTip: Mixed menu, flexible pureMixTip: Mixed menu, flexible

View File

@@ -31,15 +31,15 @@ panel:
pureCloseSystemSet: 关闭配置 pureCloseSystemSet: 关闭配置
pureClearCacheAndToLogin: 清空缓存并返回登录页 pureClearCacheAndToLogin: 清空缓存并返回登录页
pureClearCache: 清空缓存 pureClearCache: 清空缓存
pureOverallStyle: 整体风格 pureThemeMode: 主题模式
pureOverallStyleLight: 浅色 pureThemeModeLight: 浅色
pureOverallStyleLightTip: 清新启航,点亮舒适的工作界面 pureThemeModeLightTip: 清新启航,点亮舒适的工作界面
pureOverallStyleDark: 深色 pureThemeModeDark: 深色
pureOverallStyleDarkTip: 月光序曲,沉醉于夜的静谧雅致 pureThemeModeDarkTip: 月光序曲,沉醉于夜的静谧雅致
pureOverallStyleSystem: 自动 pureThemeModeSystem: 自动
pureOverallStyleSystemTip: 同步时光,界面随晨昏自然呼应 pureThemeModeSystemTip: 同步时光,界面随晨昏自然呼应
pureThemeColor: 主题色 pureThemeColor: 主题色
pureLayoutModel: 导航模式 pureMenuLayout: 菜单布局
pureVerticalTip: 左侧菜单,亲切熟悉 pureVerticalTip: 左侧菜单,亲切熟悉
pureHorizontalTip: 顶部菜单,简洁概览 pureHorizontalTip: 顶部菜单,简洁概览
pureMixTip: 混合菜单,灵活多变 pureMixTip: 混合菜单,灵活多变

View File

@@ -9,7 +9,7 @@
"Layout": "vertical", "Layout": "vertical",
"Theme": "light", "Theme": "light",
"DarkMode": false, "DarkMode": false,
"OverallStyle": "light", "ThemeMode": "light",
"Grey": false, "Grey": false,
"Weak": false, "Weak": false,
"HideTabs": false, "HideTabs": false,

View File

@@ -37,7 +37,7 @@ const horizontalRef = ref();
const { const {
dataTheme, dataTheme,
overallStyle, themeMode,
layoutTheme, layoutTheme,
themeColors, themeColors,
toggleClass, toggleClass,
@@ -50,7 +50,7 @@ if (unref(layoutTheme)) {
const layout = unref(layoutTheme).layout; const layout = unref(layoutTheme).layout;
const theme = unref(layoutTheme).theme; const theme = unref(layoutTheme).theme;
document.documentElement.setAttribute("data-theme", theme); document.documentElement.setAttribute("data-theme", theme);
setLayoutModel(layout); setMenuLayout(layout);
} }
/** 默认灵动模式 */ /** 默认灵动模式 */
@@ -195,24 +195,24 @@ const pClass = computed(() => {
const themeOptions = computed<Array<OptionsType>>(() => { const themeOptions = computed<Array<OptionsType>>(() => {
return [ return [
{ {
label: t("panel.pureOverallStyleLight"), label: t("panel.pureThemeModeLight"),
icon: DayIcon, icon: DayIcon,
theme: "light", theme: "light",
tip: t("panel.pureOverallStyleLightTip"), tip: t("panel.pureThemeModeLightTip"),
iconAttrs: { fill: isDark.value ? "#fff" : "#000" } iconAttrs: { fill: isDark.value ? "#fff" : "#000" }
}, },
{ {
label: t("panel.pureOverallStyleDark"), label: t("panel.pureThemeModeDark"),
icon: DarkIcon, icon: DarkIcon,
theme: "dark", theme: "dark",
tip: t("panel.pureOverallStyleDarkTip"), tip: t("panel.pureThemeModeDarkTip"),
iconAttrs: { fill: isDark.value ? "#fff" : "#000" } iconAttrs: { fill: isDark.value ? "#fff" : "#000" }
}, },
{ {
label: t("panel.pureOverallStyleSystem"), label: t("panel.pureThemeModeSystem"),
icon: SystemIcon, icon: SystemIcon,
theme: "system", theme: "system",
tip: t("panel.pureOverallStyleSystemTip"), tip: t("panel.pureThemeModeSystemTip"),
iconAttrs: { fill: isDark.value ? "#fff" : "#000" } iconAttrs: { fill: isDark.value ? "#fff" : "#000" }
} }
]; ];
@@ -238,8 +238,8 @@ const markOptions = computed<Array<OptionsType>>(() => {
]; ];
}); });
/** 设置导航模式 */ /** 设置菜单布局 */
function setLayoutModel(layout: string) { function setMenuLayout(layout: string) {
layoutTheme.value.layout = layout; layoutTheme.value.layout = layout;
window.document.body.setAttribute("layout", layout); window.document.body.setAttribute("layout", layout);
$storage.layout = { $storage.layout = {
@@ -249,7 +249,7 @@ function setLayoutModel(layout: string) {
sidebarStatus: $storage.layout?.sidebarStatus, sidebarStatus: $storage.layout?.sidebarStatus,
epThemeColor: $storage.layout?.epThemeColor, epThemeColor: $storage.layout?.epThemeColor,
themeColor: $storage.layout?.themeColor, themeColor: $storage.layout?.themeColor,
overallStyle: $storage.layout?.overallStyle themeMode: $storage.layout?.themeMode
}; };
useAppStoreHook().setLayout(layout); useAppStoreHook().setLayout(layout);
} }
@@ -276,15 +276,15 @@ watch($storage, ({ layout }) => {
const mediaQueryList = window.matchMedia("(prefers-color-scheme: dark)"); const mediaQueryList = window.matchMedia("(prefers-color-scheme: dark)");
/** 根据操作系统主题设置平台整体风格 */ /** 根据操作系统主题设置平台主题模式 */
function updateTheme() { function updateTheme() {
if (overallStyle.value !== "system") return; if (themeMode.value !== "system") return;
if (mediaQueryList.matches) { if (mediaQueryList.matches) {
dataTheme.value = true; dataTheme.value = true;
} else { } else {
dataTheme.value = false; dataTheme.value = false;
} }
dataThemeChange(overallStyle.value); dataThemeChange(themeMode.value);
} }
function removeMatchMedia() { function removeMatchMedia() {
@@ -317,18 +317,18 @@ onUnmounted(() => removeMatchMedia);
<template> <template>
<LayPanel> <LayPanel>
<div class="p-5"> <div class="p-5">
<p :class="pClass">{{ t("panel.pureOverallStyle") }}</p> <p :class="pClass">{{ t("panel.pureThemeMode") }}</p>
<Segmented <Segmented
resize resize
class="select-none" class="select-none"
:modelValue="overallStyle === 'system' ? 2 : dataTheme ? 1 : 0" :modelValue="themeMode === 'system' ? 2 : dataTheme ? 1 : 0"
:options="themeOptions" :options="themeOptions"
@change=" @change="
theme => { theme => {
theme.index === 1 && theme.index !== 2 theme.index === 1 && theme.index !== 2
? (dataTheme = true) ? (dataTheme = true)
: (dataTheme = false); : (dataTheme = false);
overallStyle = theme.option.theme; themeMode = theme.option.theme;
dataThemeChange(theme.option.theme); dataThemeChange(theme.option.theme);
theme.index === 2 && watchSystemThemeChange(); theme.index === 2 && watchSystemThemeChange();
} }
@@ -354,7 +354,7 @@ onUnmounted(() => removeMatchMedia);
</li> </li>
</ul> </ul>
<p :class="['mt-5!', pClass]">{{ t("panel.pureLayoutModel") }}</p> <p :class="['mt-5!', pClass]">{{ t("panel.pureMenuLayout") }}</p>
<ul class="pure-theme"> <ul class="pure-theme">
<li <li
ref="verticalRef" ref="verticalRef"
@@ -363,7 +363,7 @@ onUnmounted(() => removeMatchMedia);
zIndex: 41000 zIndex: 41000
}" }"
:class="layoutTheme.layout === 'vertical' ? 'is-select' : ''" :class="layoutTheme.layout === 'vertical' ? 'is-select' : ''"
@click="setLayoutModel('vertical')" @click="setMenuLayout('vertical')"
> >
<div /> <div />
<div /> <div />
@@ -376,7 +376,7 @@ onUnmounted(() => removeMatchMedia);
zIndex: 41000 zIndex: 41000
}" }"
:class="layoutTheme.layout === 'horizontal' ? 'is-select' : ''" :class="layoutTheme.layout === 'horizontal' ? 'is-select' : ''"
@click="setLayoutModel('horizontal')" @click="setMenuLayout('horizontal')"
> >
<div /> <div />
<div /> <div />
@@ -389,7 +389,7 @@ onUnmounted(() => removeMatchMedia);
zIndex: 41000 zIndex: 41000
}" }"
:class="layoutTheme.layout === 'mix' ? 'is-select' : ''" :class="layoutTheme.layout === 'mix' ? 'is-select' : ''"
@click="setLayoutModel('mix')" @click="setMenuLayout('mix')"
> >
<div /> <div />
<div /> <div />

View File

@@ -33,7 +33,7 @@ export function useDataThemeChange() {
const { $storage } = useGlobal<GlobalPropertiesApi>(); const { $storage } = useGlobal<GlobalPropertiesApi>();
const dataTheme = ref<boolean>($storage?.layout?.darkMode); const dataTheme = ref<boolean>($storage?.layout?.darkMode);
const overallStyle = ref<string>($storage?.layout?.overallStyle); const themeMode = ref<string>($storage?.layout?.themeMode);
const body = document.documentElement as HTMLElement; const body = document.documentElement as HTMLElement;
function toggleClass(flag: boolean, clsName: string, target?: HTMLElement) { function toggleClass(flag: boolean, clsName: string, target?: HTMLElement) {
@@ -59,7 +59,7 @@ export function useDataThemeChange() {
sidebarStatus: $storage.layout?.sidebarStatus, sidebarStatus: $storage.layout?.sidebarStatus,
epThemeColor: $storage.layout?.epThemeColor, epThemeColor: $storage.layout?.epThemeColor,
themeColor: isClick ? theme : storageThemeColor, themeColor: isClick ? theme : storageThemeColor,
overallStyle: overallStyle.value themeMode: themeMode.value
}; };
if (theme === "default" || theme === "light") { if (theme === "default" || theme === "light") {
@@ -89,9 +89,9 @@ export function useDataThemeChange() {
} }
}; };
/** 浅色、深色整体风格切换 */ /** 浅色、深色主题模式切换 */
function dataThemeChange(overall?: string) { function dataThemeChange(mode?: string) {
overallStyle.value = overall; themeMode.value = mode;
if (useEpThemeStoreHook().epTheme === "light" && dataTheme.value) { if (useEpThemeStoreHook().epTheme === "light" && dataTheme.value) {
setLayoutThemeColor("default", false); setLayoutThemeColor("default", false);
} else { } else {
@@ -126,7 +126,7 @@ export function useDataThemeChange() {
return { return {
body, body,
dataTheme, dataTheme,
overallStyle, themeMode,
layoutTheme, layoutTheme,
themeColors, themeColors,
onReset, onReset,

View File

@@ -29,7 +29,7 @@ export function useLayout() {
sidebarStatus: $config?.SidebarStatus ?? true, sidebarStatus: $config?.SidebarStatus ?? true,
epThemeColor: $config?.EpThemeColor ?? "#409EFF", epThemeColor: $config?.EpThemeColor ?? "#409EFF",
themeColor: $config?.Theme ?? "light", themeColor: $config?.Theme ?? "light",
overallStyle: $config?.OverallStyle ?? "light" themeMode: $config?.ThemeMode ?? "light"
}; };
} }
/** 灰色模式、色弱模式、隐藏标签页 */ /** 灰色模式、色弱模式、隐藏标签页 */

View File

@@ -67,16 +67,16 @@ const set: setType = reactive({
}) })
}); });
function setTheme(layoutModel: string) { function setTheme(menuLayout: string) {
window.document.body.setAttribute("layout", layoutModel); window.document.body.setAttribute("layout", menuLayout);
$storage.layout = { $storage.layout = {
layout: `${layoutModel}`, layout: `${menuLayout}`,
theme: $storage.layout?.theme, theme: $storage.layout?.theme,
darkMode: $storage.layout?.darkMode, darkMode: $storage.layout?.darkMode,
sidebarStatus: $storage.layout?.sidebarStatus, sidebarStatus: $storage.layout?.sidebarStatus,
epThemeColor: $storage.layout?.epThemeColor, epThemeColor: $storage.layout?.epThemeColor,
themeColor: $storage.layout?.themeColor, themeColor: $storage.layout?.themeColor,
overallStyle: $storage.layout?.overallStyle themeMode: $storage.layout?.themeMode
}; };
} }
@@ -123,7 +123,7 @@ onMounted(() => {
}); });
onBeforeMount(() => { onBeforeMount(() => {
useDataThemeChange().dataThemeChange($storage.layout?.overallStyle); useDataThemeChange().dataThemeChange($storage.layout?.themeMode);
}); });
const LayHeader = defineComponent({ const LayHeader = defineComponent({

View File

@@ -18,7 +18,7 @@ export const useAppStore = defineStore("pure-app", {
withoutAnimation: false, withoutAnimation: false,
isClickCollapse: false isClickCollapse: false
}, },
// 这里的layout用于监听容器拖拉后恢复对应的导航模式 // 这里的layout用于监听容器拖拉后恢复对应的菜单布局
layout: layout:
storageLocal().getItem<StorageConfigs>( storageLocal().getItem<StorageConfigs>(
`${responsiveStorageNameSpace()}layout` `${responsiveStorageNameSpace()}layout`

View File

@@ -21,7 +21,7 @@ export const useEpThemeStore = defineStore("pure-epTheme", {
getEpThemeColor(state) { getEpThemeColor(state) {
return state.epThemeColor; return state.epThemeColor;
}, },
/** 用于mix导航模式下hamburger-svg的fill属性 */ /** 用于mix菜单布局下hamburger-svg的fill属性 */
fill(state) { fill(state) {
if (state.epTheme === "light") { if (state.epTheme === "light") {
return "#409eff"; return "#409eff";

View File

@@ -19,8 +19,8 @@ export const injectResponsiveStorage = (app: App, config: PlatformConfigs) => {
darkMode: config.DarkMode ?? false, darkMode: config.DarkMode ?? false,
sidebarStatus: config.SidebarStatus ?? true, sidebarStatus: config.SidebarStatus ?? true,
epThemeColor: config.EpThemeColor ?? "#409EFF", epThemeColor: config.EpThemeColor ?? "#409EFF",
themeColor: config.Theme ?? "light", // 主题色对应系统配置中的主题色与theme不同的是它不会受到浅色、深色整体风格切换的影响,只会在手动点击主题色时改变) themeColor: config.Theme ?? "light", // 主题色对应系统配置中的主题色与theme不同的是它不会受到浅色、深色主题模式切换的影响,只会在手动点击主题色时改变)
overallStyle: config.OverallStyle ?? "light" // 整体风格浅色light、深色dark、自动system themeMode: config.ThemeMode ?? "light" // 主题模式浅色light、深色dark、自动system
}, },
// 系统配置-界面显示 // 系统配置-界面显示
configure: Storage.getData("configure", nameSpace) ?? { configure: Storage.getData("configure", nameSpace) ?? {

View File

@@ -25,7 +25,7 @@ const router = useRouter();
const isOpen = ref(deviceDetection() ? false : true); const isOpen = ref(deviceDetection() ? false : true);
const { $storage } = useGlobal<GlobalPropertiesApi>(); const { $storage } = useGlobal<GlobalPropertiesApi>();
onBeforeMount(() => { onBeforeMount(() => {
useDataThemeChange().dataThemeChange($storage.layout?.overallStyle); useDataThemeChange().dataThemeChange($storage.layout?.themeMode);
}); });
const userInfo = ref({ const userInfo = ref({

View File

@@ -52,8 +52,8 @@ const currentPage = computed(() => {
const { t } = useI18n(); const { t } = useI18n();
const { initStorage } = useLayout(); const { initStorage } = useLayout();
initStorage(); initStorage();
const { dataTheme, overallStyle, dataThemeChange } = useDataThemeChange(); const { dataTheme, themeMode, dataThemeChange } = useDataThemeChange();
dataThemeChange(overallStyle.value); dataThemeChange(themeMode.value);
const { title, getDropdownItemStyle, getDropdownItemClass } = useNav(); const { title, getDropdownItemStyle, getDropdownItemClass } = useNav();
const { locale, translationCh, translationEn } = useTranslationLang(); const { locale, translationCh, translationEn } = useTranslationLang();

6
types/global.d.ts vendored
View File

@@ -93,7 +93,7 @@ declare global {
Layout?: string; Layout?: string;
Theme?: string; Theme?: string;
DarkMode?: boolean; DarkMode?: boolean;
OverallStyle?: string; ThemeMode?: string;
Grey?: boolean; Grey?: boolean;
Weak?: boolean; Weak?: boolean;
HideTabs?: boolean; HideTabs?: boolean;
@@ -140,7 +140,7 @@ declare global {
sidebarStatus?: boolean; sidebarStatus?: boolean;
epThemeColor?: string; epThemeColor?: string;
themeColor?: string; themeColor?: string;
overallStyle?: string; themeMode?: string;
showLogo?: boolean; showLogo?: boolean;
showModel?: string; showModel?: string;
menuSearchHistory?: number; menuSearchHistory?: number;
@@ -169,7 +169,7 @@ declare global {
sidebarStatus?: boolean; sidebarStatus?: boolean;
epThemeColor?: string; epThemeColor?: string;
themeColor?: string; themeColor?: string;
overallStyle?: string; themeMode?: string;
}; };
configure: { configure: {
grey?: boolean; grey?: boolean;