主题切换

This commit is contained in:
sjl
2025-03-19 10:26:41 +08:00
parent c215f51554
commit 962c286fd5
10 changed files with 86 additions and 17 deletions

View File

@@ -41,8 +41,12 @@ export const useTheme = () => {
for (let i = 1; i <= 9; i++) { for (let i = 1; i <= 9; i++) {
const primaryColor = isDark.value ? `${getDarkColor(val, i / 10)}` : `${getLightColor(val, i / 10)}`; const primaryColor = isDark.value ? `${getDarkColor(val, i / 10)}` : `${getLightColor(val, i / 10)}`;
document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, primaryColor); document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, primaryColor);
// const colorValue = document.documentElement.style.getPropertyValue(`--el-color-primary-light-${i}`).trim();
// console.log(`--el-color-primary-light-${i}: ${colorValue}`);
} }
globalStore.setGlobalState("primary", val); globalStore.setGlobalState("primary", val);
} }
// 灰色和弱色切换 // 灰色和弱色切换
const changeGreyOrWeak = (type: Theme.GreyOrWeakType, value: boolean) => { const changeGreyOrWeak = (type: Theme.GreyOrWeakType, value: boolean) => {

View File

@@ -26,6 +26,7 @@ export default {
changePassword: "Change Password", changePassword: "Change Password",
changeMode:"Change Mode", changeMode:"Change Mode",
versionRegister:"Version Register", versionRegister:"Version Register",
changeTheme: "Change Theme",
logout: "Logout" logout: "Logout"
} }
}; };

View File

@@ -26,6 +26,7 @@ export default {
changePassword: "修改密码", changePassword: "修改密码",
changeMode:"模式切换", changeMode:"模式切换",
versionRegister:"版本注册", versionRegister:"版本注册",
changeTheme:"主题切换",
logout: "退出登录" logout: "退出登录"
} }
}; };

View File

@@ -40,7 +40,7 @@
.el-menu-item:hover { .el-menu-item:hover {
color: #fff; //一级导航划过颜色 color: #fff; //一级导航划过颜色
//background-color: #5274a5 !important; //一级导航划过背景色 //background-color: #5274a5 !important; //一级导航划过背景色
background-color: #7588e5 !important; background-color:var(--el-color-primary-light-3) !important;
} }
.el-sub-menu__hide-arrow { .el-sub-menu__hide-arrow {
@@ -50,7 +50,7 @@
.el-menu-item.is-active { .el-menu-item.is-active {
color: #fff !important; //一级导航文字选中颜色 color: #fff !important; //一级导航文字选中颜色
//background-color: #5274a5 !important; //一级导航选中背景色 //background-color: #5274a5 !important; //一级导航选中背景色
background-color: #7588e5 !important; background-color: var(--el-color-primary-light-3) !important;
border-bottom: 0 !important; border-bottom: 0 !important;
} }
@@ -72,8 +72,8 @@
// background-color: var(--el-color-primary) !important; // background-color: var(--el-color-primary) !important;
// background-color: #5274a5 !important;//二级导航选中背景色 // background-color: #5274a5 !important;//二级导航选中背景色
background-color: #7588e5 !important; //background-color: #7588e5 !important;
background-color: var(--el-color-primary-light-3) !important;
border-bottom-color: var(--el-color-primary) !important; border-bottom-color: var(--el-color-primary) !important;
} }
} }

View File

@@ -18,17 +18,20 @@
</div> </div>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="openDialog('themeRef')">
<el-icon><Sunny /></el-icon>{{ t("header.changeTheme") }}
</el-dropdown-item>
<el-dropdown-item @click="openDialog('infoRef')"> <el-dropdown-item @click="openDialog('infoRef')">
<el-icon><User /></el-icon>{{ $t("header.personalData") }} <el-icon><User /></el-icon>{{ t("header.personalData") }}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click="openDialog('passwordRef')"> <el-dropdown-item @click="openDialog('passwordRef')">
<el-icon><Edit /></el-icon>{{ $t("header.changePassword") }} <el-icon><Edit /></el-icon>{{ t("header.changePassword") }}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click="changeMode"> <el-dropdown-item @click="changeMode">
<el-icon><Edit /></el-icon>{{ $t("header.changeMode") }} <el-icon><Switch /></el-icon>{{ t("header.changeMode") }}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click="openDialog('versionRegisterRef')"> <el-dropdown-item @click="openDialog('versionRegisterRef')">
<el-icon><SetUp /></el-icon>{{ $t("header.versionRegister") }} <el-icon><SetUp /></el-icon>{{ t("header.versionRegister") }}
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
@@ -42,6 +45,9 @@
<PasswordDialog ref="passwordRef"></PasswordDialog> <PasswordDialog ref="passwordRef"></PasswordDialog>
<!-- versionRegisterDialog --> <!-- versionRegisterDialog -->
<VersionDialog ref="versionRegisterRef"></VersionDialog> <VersionDialog ref="versionRegisterRef"></VersionDialog>
<!-- ThemeDialog -->
<ThemeDialog ref="themeRef"></ThemeDialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@@ -50,12 +56,13 @@ import { LOGIN_URL } from "@/config";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { logoutApi } from "@/api/user/login"; import { logoutApi } from "@/api/user/login";
import { useUserStore } from "@/stores/modules/user"; import { useUserStore } from "@/stores/modules/user";
import { ElMessageBox, ElMessage } from "element-plus"; import { ElMessageBox, ElMessage, CHANGE_EVENT } from "element-plus";
import InfoDialog from "./InfoDialog.vue"; import InfoDialog from "./InfoDialog.vue";
import PasswordDialog from "./PasswordDialog.vue"; import PasswordDialog from "./PasswordDialog.vue";
import ThemeDialog from "./ThemeDialog.vue";
import VersionDialog from "@/views/system/versionRegister/index.vue"; import VersionDialog from "@/views/system/versionRegister/index.vue";
import { computed } from "vue"; import { computed } from "vue";
import { Avatar } from "@element-plus/icons-vue"; import { Avatar, Delete, Document, Sunny, Switch } from "@element-plus/icons-vue";
import AssemblySize from "./components/AssemblySize.vue"; import AssemblySize from "./components/AssemblySize.vue";
import Language from "./components/Language.vue"; import Language from "./components/Language.vue";
import SearchMenu from "./components/SearchMenu.vue"; import SearchMenu from "./components/SearchMenu.vue";
@@ -72,6 +79,13 @@ const router = useRouter();
const authStore = useAuthStore(); const authStore = useAuthStore();
const modeStore = useModeStore(); const modeStore = useModeStore();
const AppSceneStore = useAppSceneStore(); const AppSceneStore = useAppSceneStore();
import { useTheme } from "@/hooks/useTheme";
import { useI18n } from "vue-i18n"; // 引入 vue-i18n 钩子
const { changePrimary} = useTheme();
// 初始化 i18n
const { t } = useI18n(); // 使用 t 方法替代 $t
// 退出登录 // 退出登录
const logout = () => { const logout = () => {
ElMessageBox.confirm("您是否确认退出登录?", "温馨提示", { ElMessageBox.confirm("您是否确认退出登录?", "温馨提示", {
@@ -101,12 +115,19 @@ const logout = () => {
const infoRef = ref<InstanceType<typeof InfoDialog> | null>(null); const infoRef = ref<InstanceType<typeof InfoDialog> | null>(null);
const passwordRef = ref<InstanceType<typeof PasswordDialog> | null>(null); const passwordRef = ref<InstanceType<typeof PasswordDialog> | null>(null);
const versionRegisterRef = ref<InstanceType<typeof VersionDialog> | null>(null); const versionRegisterRef = ref<InstanceType<typeof VersionDialog> | null>(null);
const themeRef = ref<InstanceType<typeof ThemeDialog> | null>(null);
const openDialog = (ref: string) => { const openDialog = (ref: string) => {
if (ref == "infoRef") infoRef.value?.openDialog(); if (ref == "infoRef") infoRef.value?.openDialog();
if (ref == "passwordRef") passwordRef.value?.openDialog(); if (ref == "passwordRef") passwordRef.value?.openDialog();
if (ref == "versionRegisterRef") versionRegisterRef.value?.openDialog(); if (ref == "versionRegisterRef") versionRegisterRef.value?.openDialog();
if (ref == "themeRef") themeRef.value?.openDialog();
}; };
//模式切换 //模式切换
const changeMode = () => { const changeMode = () => {
authStore.changeModel(); authStore.changeModel();

View File

@@ -0,0 +1,41 @@
<template>
<el-dialog v-model="dialogVisible" title="主题切换" width="500px" draggable>
<el-divider content-position="center">主题颜色</el-divider>
<div style="display: flex; justify-content: center;">
<el-color-picker v-model="color" />
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="sure">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { onMounted, ref } from "vue";
import { useTheme } from "@/hooks/useTheme";
import { on } from "events";
const color = ref('')
const { changePrimary} = useTheme();
const dialogVisible = ref(false);
const openDialog = () => {
dialogVisible.value = true;
};
const sure = () => {
changePrimary(color.value); // 切换主题
dialogVisible.value = false;
};
onMounted(() => {
// 修复:使用可选链和空值合并运算符确保不会出现 null 或 undefined
const storedColor = JSON.parse(localStorage.getItem('cn-global') ?? '{}').primary;
color.value = storedColor ?? '#526ADE'; // 默认值为 '#526ADE'
})
defineExpose({ openDialog });
</script>

View File

@@ -35,7 +35,7 @@ const handleClickMenu = (subItem: Menu.MenuOptions) => {
color: #fff !important;//一级导航文字选中颜色 color: #fff !important;//一级导航文字选中颜色
//background-color: #5274a5 !important; //一级导航选中背景色 //background-color: #5274a5 !important; //一级导航选中背景色
background-color: #7588e5 !important; background-color: var(--el-color-primary-light-3) !important;
} }
.el-menu--collapse { .el-menu--collapse {
@@ -44,7 +44,7 @@ const handleClickMenu = (subItem: Menu.MenuOptions) => {
color: #ffffff !important; color: #ffffff !important;
// background-color: var(--el-color-primary) !important; // background-color: var(--el-color-primary) !important;
//background-color: #5274a5 !important; //background-color: #5274a5 !important;
background-color: #7588e5 !important; background-color: var(--el-color-primary-light-3) !important;
border-bottom: 0 !important; border-bottom: 0 !important;
} }
@@ -59,7 +59,7 @@ const handleClickMenu = (subItem: Menu.MenuOptions) => {
// background-color: var(--el-menu-active-bg-color) !important; // background-color: var(--el-menu-active-bg-color) !important;
color: #fff !important;//一级导航文字选中颜色 color: #fff !important;//一级导航文字选中颜色
//background-color: #5274a5 !important; //一级导航选中背景色 //background-color: #5274a5 !important; //一级导航选中背景色
background-color: #7588e5 !important; background-color: var(--el-color-primary-light-3) !important;
&::before { &::before {
position: absolute; position: absolute;

View File

@@ -46,7 +46,7 @@
border-radius: 3px; border-radius: 3px;
} }
.layout-light { .layout-light {
background-color: var(--el-color-primary-light-5); background-color: var(--el-color-primary-light-3);
border-radius: 3px; border-radius: 3px;
} }
.layout-content { .layout-content {

View File

@@ -31,7 +31,7 @@ export const useGlobalStore = defineStore({
// 折叠菜单 // 折叠菜单
isCollapse: false, isCollapse: false,
// 菜单手风琴 // 菜单手风琴
accordion: true, accordion: false,
// 面包屑导航 // 面包屑导航
breadcrumb: true, breadcrumb: true,
// 面包屑导航图标 // 面包屑导航图标
@@ -49,6 +49,7 @@ export const useGlobalStore = defineStore({
// Set GlobalState // Set GlobalState
setGlobalState(...args: ObjToKeyValArray<GlobalState>) { setGlobalState(...args: ObjToKeyValArray<GlobalState>) {
this.$patch({ [args[0]]: args[1] }); this.$patch({ [args[0]]: args[1] });
console.log(DEFAULT_PRIMARY);
} }
}, },
persist: piniaPersistConfig(GLOBAL_STORE_KEY) persist: piniaPersistConfig(GLOBAL_STORE_KEY)

View File

@@ -168,7 +168,7 @@ const handleTabsChange = (val: any) => {
form.value.activeChildTabs = Number(val) form.value.activeChildTabs = Number(val)
} }
localStorage.setItem('color', 'red') localStorage.setItem('color', '#91cc75')
//功能选择数据 //功能选择数据
const tabsList = ref([ const tabsList = ref([
{ {