221 lines
7.1 KiB
Vue
221 lines
7.1 KiB
Vue
<template>
|
|
<div>
|
|
<el-card class="mgb20" shadow="hover">
|
|
<template #header>
|
|
<div class="content-title">系统主题</div>
|
|
</template>
|
|
<div class="theme-list mgb20">
|
|
<div class="theme-item" @click="setSystemTheme(item)" v-for="item in system"
|
|
:style="{ backgroundColor: item.color, color: '#fff' }">{{ item.name }}
|
|
</div>
|
|
</div>
|
|
<div class="flex-center">
|
|
<el-button @click="resetSystemTheme">重置主题</el-button>
|
|
</div>
|
|
</el-card>
|
|
<el-card class="mgb20" shadow="hover">
|
|
<template #header>
|
|
<div class="content-title">Element-Plus主题</div>
|
|
</template>
|
|
<div class="theme-list mgb20">
|
|
<div class="theme-item" v-for="theme in themes">
|
|
<el-button :type="theme.name">{{ theme.name }}</el-button>
|
|
<div class="theme-color">{{ theme.color }}</div>
|
|
<el-color-picker v-model="color[theme.name]" @change="changeColor(theme.name)" />
|
|
</div>
|
|
</div>
|
|
<div class="flex-center">
|
|
<el-button @click="resetTheme">重置主题</el-button>
|
|
</div>
|
|
</el-card>
|
|
|
|
<el-row :gutter="50">
|
|
<el-col :span="12">
|
|
<el-card class="mgb20" shadow="hover">
|
|
<template #header>
|
|
<div class="content-title">头部主题</div>
|
|
</template>
|
|
<div class="theme-list mgb20">
|
|
<div class="theme-item">
|
|
<el-button :color="color.headerBgColor">背景颜色</el-button>
|
|
<div class="theme-color">{{ color.headerBgColor }}</div>
|
|
<el-color-picker v-model="color.headerBgColor"
|
|
@change="themeStore.setHeaderBgColor(color.headerBgColor)" />
|
|
</div>
|
|
<div class="theme-item">
|
|
<el-button :color="color.headerTextColor">文字颜色</el-button>
|
|
<div class="theme-color">{{ color.headerTextColor }}</div>
|
|
<el-color-picker v-model="color.headerTextColor"
|
|
@change="themeStore.setHeaderTextColor(color.headerTextColor)" />
|
|
</div>
|
|
</div>
|
|
<div class="flex-center">
|
|
<el-button @click="resetHeader">重置主题</el-button>
|
|
</div>
|
|
</el-card>
|
|
</el-col>
|
|
|
|
<el-col :span="12">
|
|
<el-card class="mgb20" shadow="hover">
|
|
<template #header>
|
|
<div class="content-title">菜单主题</div>
|
|
</template>
|
|
<div class="theme-list mgb20">
|
|
<div class="theme-item">
|
|
<el-button :color="sidebar.bgColor">背景颜色</el-button>
|
|
<div class="theme-color">{{ sidebar.bgColor }}</div>
|
|
<el-color-picker v-model="sidebarColor.bgColor"
|
|
@change="sidebar.setBgColor(sidebarColor.bgColor)" />
|
|
</div>
|
|
<div class="theme-item">
|
|
<el-button :color="sidebar.textColor">文字颜色</el-button>
|
|
<div class="theme-color">{{ sidebar.textColor }}</div>
|
|
<el-color-picker v-model="sidebarColor.textColor"
|
|
@change="sidebar.setTextColor(sidebarColor.textColor)" />
|
|
</div>
|
|
</div>
|
|
<div class="flex-center">
|
|
<el-button @click="resetSidebar">重置主题</el-button>
|
|
</div>
|
|
</el-card>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { useSidebarStore } from '@/store/sidebar';
|
|
import { useThemeStore } from '@/store/theme'
|
|
import { reactive } from 'vue';
|
|
const themeStore = useThemeStore();
|
|
const sidebar = useSidebarStore();
|
|
|
|
const color = reactive({
|
|
primary: localStorage.getItem('theme-primary') || '#409eff',
|
|
success: localStorage.getItem('theme-success') || '#67c23a',
|
|
warning: localStorage.getItem('theme-warning') || '#e6a23c',
|
|
danger: localStorage.getItem('theme-danger') || '#f56c6c',
|
|
info: localStorage.getItem('theme-info') || '#909399',
|
|
headerBgColor: themeStore.headerBgColor,
|
|
headerTextColor: themeStore.headerTextColor,
|
|
})
|
|
const sidebarColor = reactive({
|
|
bgColor: sidebar.bgColor,
|
|
textColor: sidebar.textColor
|
|
})
|
|
const themes = [
|
|
{
|
|
name: 'primary',
|
|
color: themeStore.primary || color.primary
|
|
},
|
|
{
|
|
name: 'success',
|
|
color: themeStore.success || color.success
|
|
},
|
|
{
|
|
name: 'warning',
|
|
color: themeStore.warning || color.warning
|
|
},
|
|
{
|
|
name: 'danger',
|
|
color: themeStore.danger || color.danger
|
|
},
|
|
{
|
|
name: 'info',
|
|
color: themeStore.info || color.info
|
|
}
|
|
]
|
|
|
|
const changeColor = (name: string) => {
|
|
themeStore.setPropertyColor(color[name], name)
|
|
}
|
|
|
|
const resetTheme = () => {
|
|
themeStore.resetTheme()
|
|
}
|
|
const resetHeader = () => {
|
|
localStorage.removeItem('header-bg-color')
|
|
localStorage.removeItem('header-text-color')
|
|
location.reload()
|
|
}
|
|
const resetSidebar = () => {
|
|
localStorage.removeItem('sidebar-bg-color')
|
|
localStorage.removeItem('sidebar-text-color')
|
|
location.reload()
|
|
}
|
|
const system = [
|
|
{
|
|
name: '默认',
|
|
color: '#242f42'
|
|
},
|
|
{
|
|
name: '健康',
|
|
color: '#1ABC9C'
|
|
},
|
|
{
|
|
name: '优雅',
|
|
color: '#722ed1'
|
|
},
|
|
{
|
|
name: '热情',
|
|
color: '#f44336'
|
|
},
|
|
{
|
|
name: '宁静',
|
|
color: '#00bcd4',
|
|
sidebarBgColor: '#a6d3df',
|
|
sidebarTextColor: '#5b6e88'
|
|
},
|
|
{
|
|
name: '活力',
|
|
color: '#ff9800'
|
|
},
|
|
{
|
|
name: '温馨',
|
|
color: '#55b2be'
|
|
},
|
|
]
|
|
const setSystemTheme = (data: any) => {
|
|
if (data.name === '默认') {
|
|
resetSystemTheme()
|
|
} else {
|
|
themeStore.setHeaderBgColor(data.color)
|
|
themeStore.setHeaderTextColor('#fff')
|
|
sidebar.setBgColor(data.sidebarBgColor===null? '#fff':data.sidebarBgColor)
|
|
sidebar.setTextColor(data.sidebarTextColor===null? '#5b6e88' : data.sidebarTextColor)
|
|
themeStore.setPropertyColor(data.color, 'primary')
|
|
}
|
|
}
|
|
const resetSystemTheme = () => {
|
|
resetTheme();
|
|
resetHeader();
|
|
resetSidebar();
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.theme-list {
|
|
display: flex;
|
|
justify-content: center;
|
|
}
|
|
|
|
.theme-item {
|
|
margin-right: 20px;
|
|
padding: 30px;
|
|
border: 1px solid hsl(222, 36%, 37%);
|
|
border-radius: 4px;
|
|
text-align: center;
|
|
}
|
|
|
|
.theme-color {
|
|
color: #787878;
|
|
margin: 20px 0;
|
|
}
|
|
|
|
.test-color {
|
|
color: #a6d3df;
|
|
background-color: #242f42;
|
|
}
|
|
</style>
|