|  | @@ -1,299 +1,287 @@
 | 
	
		
			
				|  |  | -<script lang="ts" setup>
 | 
	
		
			
				|  |  | -import { ElMessage } from 'element-plus'
 | 
	
		
			
				|  |  | -import { useClipboard, useCssVar } from '@vueuse/core'
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 | 
	
		
			
				|  |  | -import { useDesign } from '@/hooks/web/useDesign'
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import { setCssVar, trim } from '@/utils'
 | 
	
		
			
				|  |  | -import { colorIsDark, hexToRGB, lighten } from '@/utils/color'
 | 
	
		
			
				|  |  | -import { useAppStore } from '@/store/modules/app'
 | 
	
		
			
				|  |  | -import { ThemeSwitch } from '@/layout/components/ThemeSwitch'
 | 
	
		
			
				|  |  | -import ColorRadioPicker from './components/ColorRadioPicker.vue'
 | 
	
		
			
				|  |  | -import InterfaceDisplay from './components/InterfaceDisplay.vue'
 | 
	
		
			
				|  |  | -import LayoutRadioPicker from './components/LayoutRadioPicker.vue'
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -defineOptions({ name: 'Setting' })
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -const { t } = useI18n()
 | 
	
		
			
				|  |  | -const appStore = useAppStore()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -const { getPrefixCls } = useDesign()
 | 
	
		
			
				|  |  | -const prefixCls = getPrefixCls('setting')
 | 
	
		
			
				|  |  | -const layout = computed(() => appStore.getLayout)
 | 
	
		
			
				|  |  | -const drawer = ref(false)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 主题色相关
 | 
	
		
			
				|  |  | -const systemTheme = ref(appStore.getTheme.elColorPrimary)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -const setSystemTheme = (color: string) => {
 | 
	
		
			
				|  |  | -  setCssVar('--el-color-primary', color)
 | 
	
		
			
				|  |  | -  appStore.setTheme({ elColorPrimary: color })
 | 
	
		
			
				|  |  | -  const leftMenuBgColor = useCssVar('--left-menu-bg-color', document.documentElement)
 | 
	
		
			
				|  |  | -  setMenuTheme(trim(unref(leftMenuBgColor)))
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 头部主题相关
 | 
	
		
			
				|  |  | -const headerTheme = ref(appStore.getTheme.topHeaderBgColor || '')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -const setHeaderTheme = (color: string) => {
 | 
	
		
			
				|  |  | -  const isDarkColor = colorIsDark(color)
 | 
	
		
			
				|  |  | -  const textColor = isDarkColor ? '#fff' : 'inherit'
 | 
	
		
			
				|  |  | -  const textHoverColor = isDarkColor ? lighten(color!, 6) : '#f6f6f6'
 | 
	
		
			
				|  |  | -  const topToolBorderColor = isDarkColor ? color : '#eee'
 | 
	
		
			
				|  |  | -  setCssVar('--top-header-bg-color', color)
 | 
	
		
			
				|  |  | -  setCssVar('--top-header-text-color', textColor)
 | 
	
		
			
				|  |  | -  setCssVar('--top-header-hover-color', textHoverColor)
 | 
	
		
			
				|  |  | -  appStore.setTheme({
 | 
	
		
			
				|  |  | -    topHeaderBgColor: color,
 | 
	
		
			
				|  |  | -    topHeaderTextColor: textColor,
 | 
	
		
			
				|  |  | -    topHeaderHoverColor: textHoverColor,
 | 
	
		
			
				|  |  | -    topToolBorderColor
 | 
	
		
			
				|  |  | -  })
 | 
	
		
			
				|  |  | -  if (unref(layout) === 'top') {
 | 
	
		
			
				|  |  | -    setMenuTheme(color)
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 菜单主题相关
 | 
	
		
			
				|  |  | -const menuTheme = ref(appStore.getTheme.leftMenuBgColor || '')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -const setMenuTheme = (color: string) => {
 | 
	
		
			
				|  |  | -  const primaryColor = useCssVar('--el-color-primary', document.documentElement)
 | 
	
		
			
				|  |  | -  const isDarkColor = colorIsDark(color)
 | 
	
		
			
				|  |  | -  const theme: Recordable = {
 | 
	
		
			
				|  |  | -    // 左侧菜单边框颜色
 | 
	
		
			
				|  |  | -    leftMenuBorderColor: isDarkColor ? 'inherit' : '#eee',
 | 
	
		
			
				|  |  | -    // 左侧菜单背景颜色
 | 
	
		
			
				|  |  | -    leftMenuBgColor: color,
 | 
	
		
			
				|  |  | -    // 左侧菜单浅色背景颜色
 | 
	
		
			
				|  |  | -    leftMenuBgLightColor: isDarkColor ? lighten(color!, 6) : color,
 | 
	
		
			
				|  |  | -    // 左侧菜单选中背景颜色
 | 
	
		
			
				|  |  | -    leftMenuBgActiveColor: isDarkColor
 | 
	
		
			
				|  |  | -      ? 'var(--el-color-primary)'
 | 
	
		
			
				|  |  | -      : hexToRGB(unref(primaryColor), 0.1),
 | 
	
		
			
				|  |  | -    // 左侧菜单收起选中背景颜色
 | 
	
		
			
				|  |  | -    leftMenuCollapseBgActiveColor: isDarkColor
 | 
	
		
			
				|  |  | -      ? 'var(--el-color-primary)'
 | 
	
		
			
				|  |  | -      : hexToRGB(unref(primaryColor), 0.1),
 | 
	
		
			
				|  |  | -    // 左侧菜单字体颜色
 | 
	
		
			
				|  |  | -    leftMenuTextColor: isDarkColor ? '#bfcbd9' : '#333',
 | 
	
		
			
				|  |  | -    // 左侧菜单选中字体颜色
 | 
	
		
			
				|  |  | -    leftMenuTextActiveColor: isDarkColor ? '#fff' : 'var(--el-color-primary)',
 | 
	
		
			
				|  |  | -    // logo字体颜色
 | 
	
		
			
				|  |  | -    logoTitleTextColor: isDarkColor ? '#fff' : 'inherit',
 | 
	
		
			
				|  |  | -    // logo边框颜色
 | 
	
		
			
				|  |  | -    logoBorderColor: isDarkColor ? color : '#eee'
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  appStore.setTheme(theme)
 | 
	
		
			
				|  |  | -  appStore.setCssVarTheme()
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -if (layout.value === 'top' && !appStore.getIsDark) {
 | 
	
		
			
				|  |  | -  headerTheme.value = '#fff'
 | 
	
		
			
				|  |  | -  setHeaderTheme('#fff')
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 监听layout变化,重置一些主题色
 | 
	
		
			
				|  |  | -watch(
 | 
	
		
			
				|  |  | -  () => layout.value,
 | 
	
		
			
				|  |  | -  (n) => {
 | 
	
		
			
				|  |  | -    if (n === 'top' && !appStore.getIsDark) {
 | 
	
		
			
				|  |  | -      headerTheme.value = '#fff'
 | 
	
		
			
				|  |  | -      setHeaderTheme('#fff')
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      setMenuTheme(unref(menuTheme))
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 拷贝
 | 
	
		
			
				|  |  | -const copyConfig = async () => {
 | 
	
		
			
				|  |  | -  const { copy, copied, isSupported } = useClipboard({
 | 
	
		
			
				|  |  | -    source: `
 | 
	
		
			
				|  |  | -      // 面包屑
 | 
	
		
			
				|  |  | -      breadcrumb: ${appStore.getBreadcrumb},
 | 
	
		
			
				|  |  | -      // 面包屑图标
 | 
	
		
			
				|  |  | -      breadcrumbIcon: ${appStore.getBreadcrumbIcon},
 | 
	
		
			
				|  |  | -      // 折叠图标
 | 
	
		
			
				|  |  | -      hamburger: ${appStore.getHamburger},
 | 
	
		
			
				|  |  | -      // 全屏图标
 | 
	
		
			
				|  |  | -      screenfull: ${appStore.getScreenfull},
 | 
	
		
			
				|  |  | -      // 尺寸图标
 | 
	
		
			
				|  |  | -      size: ${appStore.getSize},
 | 
	
		
			
				|  |  | -      // 多语言图标
 | 
	
		
			
				|  |  | -      locale: ${appStore.getLocale},
 | 
	
		
			
				|  |  | -      // 消息图标
 | 
	
		
			
				|  |  | -      message: ${appStore.getMessage},
 | 
	
		
			
				|  |  | -      // 标签页
 | 
	
		
			
				|  |  | -      tagsView: ${appStore.getTagsView},
 | 
	
		
			
				|  |  | -      // 标签页图标
 | 
	
		
			
				|  |  | -      getTagsViewIcon: ${appStore.getTagsViewIcon},
 | 
	
		
			
				|  |  | -      // logo
 | 
	
		
			
				|  |  | -      logo: ${appStore.getLogo},
 | 
	
		
			
				|  |  | -      // 菜单手风琴
 | 
	
		
			
				|  |  | -      uniqueOpened: ${appStore.getUniqueOpened},
 | 
	
		
			
				|  |  | -      // 固定header
 | 
	
		
			
				|  |  | -      fixedHeader: ${appStore.getFixedHeader},
 | 
	
		
			
				|  |  | -      // 页脚
 | 
	
		
			
				|  |  | -      footer: ${appStore.getFooter},
 | 
	
		
			
				|  |  | -      // 灰色模式
 | 
	
		
			
				|  |  | -      greyMode: ${appStore.getGreyMode},
 | 
	
		
			
				|  |  | -      // layout布局
 | 
	
		
			
				|  |  | -      layout: '${appStore.getLayout}',
 | 
	
		
			
				|  |  | -      // 暗黑模式
 | 
	
		
			
				|  |  | -      isDark: ${appStore.getIsDark},
 | 
	
		
			
				|  |  | -      // 组件尺寸
 | 
	
		
			
				|  |  | -      currentSize: '${appStore.getCurrentSize}',
 | 
	
		
			
				|  |  | -      // 主题相关
 | 
	
		
			
				|  |  | -      theme: {
 | 
	
		
			
				|  |  | -        // 主题色
 | 
	
		
			
				|  |  | -        elColorPrimary: '${appStore.getTheme.elColorPrimary}',
 | 
	
		
			
				|  |  | -        // 左侧菜单边框颜色
 | 
	
		
			
				|  |  | -        leftMenuBorderColor: '${appStore.getTheme.leftMenuBorderColor}',
 | 
	
		
			
				|  |  | -        // 左侧菜单背景颜色
 | 
	
		
			
				|  |  | -        leftMenuBgColor: '${appStore.getTheme.leftMenuBgColor}',
 | 
	
		
			
				|  |  | -        // 左侧菜单浅色背景颜色
 | 
	
		
			
				|  |  | -        leftMenuBgLightColor: '${appStore.getTheme.leftMenuBgLightColor}',
 | 
	
		
			
				|  |  | -        // 左侧菜单选中背景颜色
 | 
	
		
			
				|  |  | -        leftMenuBgActiveColor: '${appStore.getTheme.leftMenuBgActiveColor}',
 | 
	
		
			
				|  |  | -        // 左侧菜单收起选中背景颜色
 | 
	
		
			
				|  |  | -        leftMenuCollapseBgActiveColor: '${appStore.getTheme.leftMenuCollapseBgActiveColor}',
 | 
	
		
			
				|  |  | -        // 左侧菜单字体颜色
 | 
	
		
			
				|  |  | -        leftMenuTextColor: '${appStore.getTheme.leftMenuTextColor}',
 | 
	
		
			
				|  |  | -        // 左侧菜单选中字体颜色
 | 
	
		
			
				|  |  | -        leftMenuTextActiveColor: '${appStore.getTheme.leftMenuTextActiveColor}',
 | 
	
		
			
				|  |  | -        // logo字体颜色
 | 
	
		
			
				|  |  | -        logoTitleTextColor: '${appStore.getTheme.logoTitleTextColor}',
 | 
	
		
			
				|  |  | -        // logo边框颜色
 | 
	
		
			
				|  |  | -        logoBorderColor: '${appStore.getTheme.logoBorderColor}',
 | 
	
		
			
				|  |  | -        // 头部背景颜色
 | 
	
		
			
				|  |  | -        topHeaderBgColor: '${appStore.getTheme.topHeaderBgColor}',
 | 
	
		
			
				|  |  | -        // 头部字体颜色
 | 
	
		
			
				|  |  | -        topHeaderTextColor: '${appStore.getTheme.topHeaderTextColor}',
 | 
	
		
			
				|  |  | -        // 头部悬停颜色
 | 
	
		
			
				|  |  | -        topHeaderHoverColor: '${appStore.getTheme.topHeaderHoverColor}',
 | 
	
		
			
				|  |  | -        // 头部边框颜色
 | 
	
		
			
				|  |  | -        topToolBorderColor: '${appStore.getTheme.topToolBorderColor}'
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    `
 | 
	
		
			
				|  |  | -  })
 | 
	
		
			
				|  |  | -  if (!isSupported) {
 | 
	
		
			
				|  |  | -    ElMessage.error(t('setting.copyFailed'))
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    await copy()
 | 
	
		
			
				|  |  | -    if (unref(copied)) {
 | 
	
		
			
				|  |  | -      ElMessage.success(t('setting.copySuccess'))
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 清空缓存
 | 
	
		
			
				|  |  | -const clear = () => {
 | 
	
		
			
				|  |  | -  const { wsCache } = useCache()
 | 
	
		
			
				|  |  | -  wsCache.delete(CACHE_KEY.LAYOUT)
 | 
	
		
			
				|  |  | -  wsCache.delete(CACHE_KEY.THEME)
 | 
	
		
			
				|  |  | -  wsCache.delete(CACHE_KEY.IS_DARK)
 | 
	
		
			
				|  |  | -  window.location.reload()
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -</script>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -<template>
 | 
	
		
			
				|  |  | -  <div
 | 
	
		
			
				|  |  | -    :class="prefixCls"
 | 
	
		
			
				|  |  | -    class="fixed right-0 top-[45%] h-40px w-40px cursor-pointer bg-[var(--el-color-primary)] text-center leading-40px"
 | 
	
		
			
				|  |  | -    @click="drawer = true"
 | 
	
		
			
				|  |  | -  >
 | 
	
		
			
				|  |  | -    <Icon color="#fff" icon="ep:setting" />
 | 
	
		
			
				|  |  | -  </div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  <ElDrawer v-model="drawer" :z-index="4000" direction="rtl" size="350px">
 | 
	
		
			
				|  |  | -    <template #header>
 | 
	
		
			
				|  |  | -      <span class="text-16px font-700">{{ t('setting.projectSetting') }}</span>
 | 
	
		
			
				|  |  | -    </template>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    <div class="text-center">
 | 
	
		
			
				|  |  | -      <!-- 主题 -->
 | 
	
		
			
				|  |  | -      <ElDivider>{{ t('setting.theme') }}</ElDivider>
 | 
	
		
			
				|  |  | -      <ThemeSwitch />
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      <!-- 布局 -->
 | 
	
		
			
				|  |  | -      <ElDivider>{{ t('setting.layout') }}</ElDivider>
 | 
	
		
			
				|  |  | -      <LayoutRadioPicker />
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      <!-- 系统主题 -->
 | 
	
		
			
				|  |  | -      <ElDivider>{{ t('setting.systemTheme') }}</ElDivider>
 | 
	
		
			
				|  |  | -      <ColorRadioPicker
 | 
	
		
			
				|  |  | -        v-model="systemTheme"
 | 
	
		
			
				|  |  | -        :schema="[
 | 
	
		
			
				|  |  | -          '#409eff',
 | 
	
		
			
				|  |  | -          '#009688',
 | 
	
		
			
				|  |  | -          '#536dfe',
 | 
	
		
			
				|  |  | -          '#ff5c93',
 | 
	
		
			
				|  |  | -          '#ee4f12',
 | 
	
		
			
				|  |  | -          '#0096c7',
 | 
	
		
			
				|  |  | -          '#9c27b0',
 | 
	
		
			
				|  |  | -          '#ff9800'
 | 
	
		
			
				|  |  | -        ]"
 | 
	
		
			
				|  |  | -        @change="setSystemTheme"
 | 
	
		
			
				|  |  | -      />
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      <!-- 头部主题 -->
 | 
	
		
			
				|  |  | -      <ElDivider>{{ t('setting.headerTheme') }}</ElDivider>
 | 
	
		
			
				|  |  | -      <ColorRadioPicker
 | 
	
		
			
				|  |  | -        v-model="headerTheme"
 | 
	
		
			
				|  |  | -        :schema="[
 | 
	
		
			
				|  |  | -          '#fff',
 | 
	
		
			
				|  |  | -          '#151515',
 | 
	
		
			
				|  |  | -          '#5172dc',
 | 
	
		
			
				|  |  | -          '#e74c3c',
 | 
	
		
			
				|  |  | -          '#24292e',
 | 
	
		
			
				|  |  | -          '#394664',
 | 
	
		
			
				|  |  | -          '#009688',
 | 
	
		
			
				|  |  | -          '#383f45'
 | 
	
		
			
				|  |  | -        ]"
 | 
	
		
			
				|  |  | -        @change="setHeaderTheme"
 | 
	
		
			
				|  |  | -      />
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      <!-- 菜单主题 -->
 | 
	
		
			
				|  |  | -      <template v-if="layout !== 'top'">
 | 
	
		
			
				|  |  | -        <ElDivider>{{ t('setting.menuTheme') }}</ElDivider>
 | 
	
		
			
				|  |  | -        <ColorRadioPicker
 | 
	
		
			
				|  |  | -          v-model="menuTheme"
 | 
	
		
			
				|  |  | -          :schema="[
 | 
	
		
			
				|  |  | -            '#fff',
 | 
	
		
			
				|  |  | -            '#001529',
 | 
	
		
			
				|  |  | -            '#212121',
 | 
	
		
			
				|  |  | -            '#273352',
 | 
	
		
			
				|  |  | -            '#191b24',
 | 
	
		
			
				|  |  | -            '#383f45',
 | 
	
		
			
				|  |  | -            '#001628',
 | 
	
		
			
				|  |  | -            '#344058'
 | 
	
		
			
				|  |  | -          ]"
 | 
	
		
			
				|  |  | -          @change="setMenuTheme"
 | 
	
		
			
				|  |  | -        />
 | 
	
		
			
				|  |  | -      </template>
 | 
	
		
			
				|  |  | -    </div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    <!-- 界面显示 -->
 | 
	
		
			
				|  |  | -    <ElDivider>{{ t('setting.interfaceDisplay') }}</ElDivider>
 | 
	
		
			
				|  |  | -    <InterfaceDisplay />
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    <ElDivider />
 | 
	
		
			
				|  |  | -    <div>
 | 
	
		
			
				|  |  | -      <ElButton class="w-full" type="primary" @click="copyConfig">{{ t('setting.copy') }}</ElButton>
 | 
	
		
			
				|  |  | -    </div>
 | 
	
		
			
				|  |  | -    <div class="mt-5px">
 | 
	
		
			
				|  |  | -      <ElButton class="w-full" type="danger" @click="clear">
 | 
	
		
			
				|  |  | -        {{ t('setting.clearAndReset') }}
 | 
	
		
			
				|  |  | -      </ElButton>
 | 
	
		
			
				|  |  | -    </div>
 | 
	
		
			
				|  |  | -  </ElDrawer>
 | 
	
		
			
				|  |  | -</template>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -<style lang="scss" scoped>
 | 
	
		
			
				|  |  | -$prefix-cls: #{$namespace}-setting;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.#{$prefix-cls} {
 | 
	
		
			
				|  |  | -  border-radius: 6px 0 0 6px;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -</style>
 | 
	
		
			
				|  |  | +<script lang="ts" setup>
 | 
	
		
			
				|  |  | +	import { ElMessage } from 'element-plus'
 | 
	
		
			
				|  |  | +	import { useClipboard, useCssVar } from '@vueuse/core'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 | 
	
		
			
				|  |  | +	import { useDesign } from '@/hooks/web/useDesign'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	import { setCssVar, trim } from '@/utils'
 | 
	
		
			
				|  |  | +	import { colorIsDark, hexToRGB, lighten } from '@/utils/color'
 | 
	
		
			
				|  |  | +	import { useAppStore } from '@/store/modules/app'
 | 
	
		
			
				|  |  | +	import { ThemeSwitch } from '@/layout/components/ThemeSwitch'
 | 
	
		
			
				|  |  | +	import ColorRadioPicker from './components/ColorRadioPicker.vue'
 | 
	
		
			
				|  |  | +	import InterfaceDisplay from './components/InterfaceDisplay.vue'
 | 
	
		
			
				|  |  | +	import LayoutRadioPicker from './components/LayoutRadioPicker.vue'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	defineOptions({ name: 'Setting' })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	const { t } = useI18n()
 | 
	
		
			
				|  |  | +	const appStore = useAppStore()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	const { getPrefixCls } = useDesign()
 | 
	
		
			
				|  |  | +	const prefixCls = getPrefixCls('setting')
 | 
	
		
			
				|  |  | +	const layout = computed(() => appStore.getLayout)
 | 
	
		
			
				|  |  | +	const drawer = ref(false)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 主题色相关
 | 
	
		
			
				|  |  | +	const systemTheme = ref(appStore.getTheme.elColorPrimary)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	const setSystemTheme = (color : string) => {
 | 
	
		
			
				|  |  | +		setCssVar('--el-color-primary', color)
 | 
	
		
			
				|  |  | +		appStore.setTheme({ elColorPrimary: color })
 | 
	
		
			
				|  |  | +		const leftMenuBgColor = useCssVar('--left-menu-bg-color', document.documentElement)
 | 
	
		
			
				|  |  | +		setMenuTheme(trim(unref(leftMenuBgColor)))
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 头部主题相关
 | 
	
		
			
				|  |  | +	const headerTheme = ref(appStore.getTheme.topHeaderBgColor || '')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	const setHeaderTheme = (color : string) => {
 | 
	
		
			
				|  |  | +		const isDarkColor = colorIsDark(color)
 | 
	
		
			
				|  |  | +		const textColor = isDarkColor ? '#fff' : 'inherit'
 | 
	
		
			
				|  |  | +		const textHoverColor = isDarkColor ? lighten(color!, 6) : '#f6f6f6'
 | 
	
		
			
				|  |  | +		const topToolBorderColor = isDarkColor ? color : '#eee'
 | 
	
		
			
				|  |  | +		setCssVar('--top-header-bg-color', color)
 | 
	
		
			
				|  |  | +		setCssVar('--top-header-text-color', textColor)
 | 
	
		
			
				|  |  | +		setCssVar('--top-header-hover-color', textHoverColor)
 | 
	
		
			
				|  |  | +		appStore.setTheme({
 | 
	
		
			
				|  |  | +			topHeaderBgColor: color,
 | 
	
		
			
				|  |  | +			topHeaderTextColor: textColor,
 | 
	
		
			
				|  |  | +			topHeaderHoverColor: textHoverColor,
 | 
	
		
			
				|  |  | +			topToolBorderColor
 | 
	
		
			
				|  |  | +		})
 | 
	
		
			
				|  |  | +		if (unref(layout) === 'top') {
 | 
	
		
			
				|  |  | +			setMenuTheme(color)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 菜单主题相关
 | 
	
		
			
				|  |  | +	const menuTheme = ref(appStore.getTheme.leftMenuBgColor || '')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	const setMenuTheme = (color : string) => {
 | 
	
		
			
				|  |  | +		const primaryColor = useCssVar('--el-color-primary', document.documentElement)
 | 
	
		
			
				|  |  | +		const isDarkColor = colorIsDark(color)
 | 
	
		
			
				|  |  | +		const theme : Recordable = {
 | 
	
		
			
				|  |  | +			// 左侧菜单边框颜色
 | 
	
		
			
				|  |  | +			leftMenuBorderColor: isDarkColor ? 'inherit' : '#eee',
 | 
	
		
			
				|  |  | +			// 左侧菜单背景颜色
 | 
	
		
			
				|  |  | +			leftMenuBgColor: color,
 | 
	
		
			
				|  |  | +			// 左侧菜单浅色背景颜色
 | 
	
		
			
				|  |  | +			leftMenuBgLightColor: isDarkColor ? lighten(color!, 6) : color,
 | 
	
		
			
				|  |  | +			// 左侧菜单选中背景颜色
 | 
	
		
			
				|  |  | +			leftMenuBgActiveColor: isDarkColor
 | 
	
		
			
				|  |  | +				? 'var(--el-color-primary)'
 | 
	
		
			
				|  |  | +				: hexToRGB(unref(primaryColor), 0.1),
 | 
	
		
			
				|  |  | +			// 左侧菜单收起选中背景颜色
 | 
	
		
			
				|  |  | +			leftMenuCollapseBgActiveColor: isDarkColor
 | 
	
		
			
				|  |  | +				? 'var(--el-color-primary)'
 | 
	
		
			
				|  |  | +				: hexToRGB(unref(primaryColor), 0.1),
 | 
	
		
			
				|  |  | +			// 左侧菜单字体颜色
 | 
	
		
			
				|  |  | +			leftMenuTextColor: isDarkColor ? '#bfcbd9' : '#333',
 | 
	
		
			
				|  |  | +			// 左侧菜单选中字体颜色
 | 
	
		
			
				|  |  | +			leftMenuTextActiveColor: isDarkColor ? '#fff' : 'var(--el-color-primary)',
 | 
	
		
			
				|  |  | +			// logo字体颜色
 | 
	
		
			
				|  |  | +			logoTitleTextColor: isDarkColor ? '#fff' : 'inherit',
 | 
	
		
			
				|  |  | +			// logo边框颜色
 | 
	
		
			
				|  |  | +			logoBorderColor: isDarkColor ? color : '#eee'
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		appStore.setTheme(theme)
 | 
	
		
			
				|  |  | +		appStore.setCssVarTheme()
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if (layout.value === 'top' && !appStore.getIsDark) {
 | 
	
		
			
				|  |  | +		headerTheme.value = '#fff'
 | 
	
		
			
				|  |  | +		setHeaderTheme('#fff')
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 监听layout变化,重置一些主题色
 | 
	
		
			
				|  |  | +	watch(
 | 
	
		
			
				|  |  | +		() => layout.value,
 | 
	
		
			
				|  |  | +		(n) => {
 | 
	
		
			
				|  |  | +			if (n === 'top' && !appStore.getIsDark) {
 | 
	
		
			
				|  |  | +				headerTheme.value = '#fff'
 | 
	
		
			
				|  |  | +				setHeaderTheme('#fff')
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				setMenuTheme(unref(menuTheme))
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 拷贝
 | 
	
		
			
				|  |  | +	const copyConfig = async () => {
 | 
	
		
			
				|  |  | +		const { copy, copied, isSupported } = useClipboard({
 | 
	
		
			
				|  |  | +			source: `
 | 
	
		
			
				|  |  | +      // 面包屑
 | 
	
		
			
				|  |  | +      breadcrumb: ${appStore.getBreadcrumb},
 | 
	
		
			
				|  |  | +      // 面包屑图标
 | 
	
		
			
				|  |  | +      breadcrumbIcon: ${appStore.getBreadcrumbIcon},
 | 
	
		
			
				|  |  | +      // 折叠图标
 | 
	
		
			
				|  |  | +      hamburger: ${appStore.getHamburger},
 | 
	
		
			
				|  |  | +      // 全屏图标
 | 
	
		
			
				|  |  | +      screenfull: ${appStore.getScreenfull},
 | 
	
		
			
				|  |  | +      // 尺寸图标
 | 
	
		
			
				|  |  | +      size: ${appStore.getSize},
 | 
	
		
			
				|  |  | +      // 多语言图标
 | 
	
		
			
				|  |  | +      locale: ${appStore.getLocale},
 | 
	
		
			
				|  |  | +      // 消息图标
 | 
	
		
			
				|  |  | +      message: ${appStore.getMessage},
 | 
	
		
			
				|  |  | +      // 标签页
 | 
	
		
			
				|  |  | +      tagsView: ${appStore.getTagsView},
 | 
	
		
			
				|  |  | +      // 标签页图标
 | 
	
		
			
				|  |  | +      getTagsViewIcon: ${appStore.getTagsViewIcon},
 | 
	
		
			
				|  |  | +      // logo
 | 
	
		
			
				|  |  | +      logo: ${appStore.getLogo},
 | 
	
		
			
				|  |  | +      // 菜单手风琴
 | 
	
		
			
				|  |  | +      uniqueOpened: ${appStore.getUniqueOpened},
 | 
	
		
			
				|  |  | +      // 固定header
 | 
	
		
			
				|  |  | +      fixedHeader: ${appStore.getFixedHeader},
 | 
	
		
			
				|  |  | +      // 页脚
 | 
	
		
			
				|  |  | +      footer: ${appStore.getFooter},
 | 
	
		
			
				|  |  | +      // 灰色模式
 | 
	
		
			
				|  |  | +      greyMode: ${appStore.getGreyMode},
 | 
	
		
			
				|  |  | +      // layout布局
 | 
	
		
			
				|  |  | +      layout: '${appStore.getLayout}',
 | 
	
		
			
				|  |  | +      // 暗黑模式
 | 
	
		
			
				|  |  | +      isDark: ${appStore.getIsDark},
 | 
	
		
			
				|  |  | +      // 组件尺寸
 | 
	
		
			
				|  |  | +      currentSize: '${appStore.getCurrentSize}',
 | 
	
		
			
				|  |  | +      // 主题相关
 | 
	
		
			
				|  |  | +      theme: {
 | 
	
		
			
				|  |  | +        // 主题色
 | 
	
		
			
				|  |  | +        elColorPrimary: '${appStore.getTheme.elColorPrimary}',
 | 
	
		
			
				|  |  | +        // 左侧菜单边框颜色
 | 
	
		
			
				|  |  | +        leftMenuBorderColor: '${appStore.getTheme.leftMenuBorderColor}',
 | 
	
		
			
				|  |  | +        // 左侧菜单背景颜色
 | 
	
		
			
				|  |  | +        leftMenuBgColor: '${appStore.getTheme.leftMenuBgColor}',
 | 
	
		
			
				|  |  | +        // 左侧菜单浅色背景颜色
 | 
	
		
			
				|  |  | +        leftMenuBgLightColor: '${appStore.getTheme.leftMenuBgLightColor}',
 | 
	
		
			
				|  |  | +        // 左侧菜单选中背景颜色
 | 
	
		
			
				|  |  | +        leftMenuBgActiveColor: '${appStore.getTheme.leftMenuBgActiveColor}',
 | 
	
		
			
				|  |  | +        // 左侧菜单收起选中背景颜色
 | 
	
		
			
				|  |  | +        leftMenuCollapseBgActiveColor: '${appStore.getTheme.leftMenuCollapseBgActiveColor}',
 | 
	
		
			
				|  |  | +        // 左侧菜单字体颜色
 | 
	
		
			
				|  |  | +        leftMenuTextColor: '${appStore.getTheme.leftMenuTextColor}',
 | 
	
		
			
				|  |  | +        // 左侧菜单选中字体颜色
 | 
	
		
			
				|  |  | +        leftMenuTextActiveColor: '${appStore.getTheme.leftMenuTextActiveColor}',
 | 
	
		
			
				|  |  | +        // logo字体颜色
 | 
	
		
			
				|  |  | +        logoTitleTextColor: '${appStore.getTheme.logoTitleTextColor}',
 | 
	
		
			
				|  |  | +        // logo边框颜色
 | 
	
		
			
				|  |  | +        logoBorderColor: '${appStore.getTheme.logoBorderColor}',
 | 
	
		
			
				|  |  | +        // 头部背景颜色
 | 
	
		
			
				|  |  | +        topHeaderBgColor: '${appStore.getTheme.topHeaderBgColor}',
 | 
	
		
			
				|  |  | +        // 头部字体颜色
 | 
	
		
			
				|  |  | +        topHeaderTextColor: '${appStore.getTheme.topHeaderTextColor}',
 | 
	
		
			
				|  |  | +        // 头部悬停颜色
 | 
	
		
			
				|  |  | +        topHeaderHoverColor: '${appStore.getTheme.topHeaderHoverColor}',
 | 
	
		
			
				|  |  | +        // 头部边框颜色
 | 
	
		
			
				|  |  | +        topToolBorderColor: '${appStore.getTheme.topToolBorderColor}'
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    `
 | 
	
		
			
				|  |  | +		})
 | 
	
		
			
				|  |  | +		if (!isSupported) {
 | 
	
		
			
				|  |  | +			ElMessage.error(t('setting.copyFailed'))
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			await copy()
 | 
	
		
			
				|  |  | +			if (unref(copied)) {
 | 
	
		
			
				|  |  | +				ElMessage.success(t('setting.copySuccess'))
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 清空缓存
 | 
	
		
			
				|  |  | +	const clear = () => {
 | 
	
		
			
				|  |  | +		const { wsCache } = useCache()
 | 
	
		
			
				|  |  | +		wsCache.delete(CACHE_KEY.LAYOUT)
 | 
	
		
			
				|  |  | +		wsCache.delete(CACHE_KEY.THEME)
 | 
	
		
			
				|  |  | +		wsCache.delete(CACHE_KEY.IS_DARK)
 | 
	
		
			
				|  |  | +		window.location.reload()
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +	<!-- <div
 | 
	
		
			
				|  |  | +    :class="prefixCls"
 | 
	
		
			
				|  |  | +    class="fixed right-0 top-[45%] h-40px w-40px cursor-pointer bg-[var(--el-color-primary)] text-center leading-40px"
 | 
	
		
			
				|  |  | +    @click="drawer = true"
 | 
	
		
			
				|  |  | +  >
 | 
	
		
			
				|  |  | +    <Icon color="#fff" icon="ep:setting" />
 | 
	
		
			
				|  |  | +  </div> -->
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	<ElDrawer v-model="drawer" :z-index="4000" direction="rtl" size="350px">
 | 
	
		
			
				|  |  | +		<template #header>
 | 
	
		
			
				|  |  | +			<span class="text-16px font-700">{{ t('setting.projectSetting') }}</span>
 | 
	
		
			
				|  |  | +		</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		<div class="text-center">
 | 
	
		
			
				|  |  | +			<!-- 主题 -->
 | 
	
		
			
				|  |  | +			<ElDivider>{{ t('setting.theme') }}</ElDivider>
 | 
	
		
			
				|  |  | +			<ThemeSwitch />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			<!-- 布局 -->
 | 
	
		
			
				|  |  | +			<ElDivider>{{ t('setting.layout') }}</ElDivider>
 | 
	
		
			
				|  |  | +			<LayoutRadioPicker />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			<!-- 系统主题 -->
 | 
	
		
			
				|  |  | +			<ElDivider>{{ t('setting.systemTheme') }}</ElDivider>
 | 
	
		
			
				|  |  | +			<ColorRadioPicker v-model="systemTheme" :schema="[
 | 
	
		
			
				|  |  | +          '#409eff',
 | 
	
		
			
				|  |  | +          '#009688',
 | 
	
		
			
				|  |  | +          '#536dfe',
 | 
	
		
			
				|  |  | +          '#ff5c93',
 | 
	
		
			
				|  |  | +          '#ee4f12',
 | 
	
		
			
				|  |  | +          '#0096c7',
 | 
	
		
			
				|  |  | +          '#9c27b0',
 | 
	
		
			
				|  |  | +          '#ff9800'
 | 
	
		
			
				|  |  | +        ]" @change="setSystemTheme" />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			<!-- 头部主题 -->
 | 
	
		
			
				|  |  | +			<ElDivider>{{ t('setting.headerTheme') }}</ElDivider>
 | 
	
		
			
				|  |  | +			<ColorRadioPicker v-model="headerTheme" :schema="[
 | 
	
		
			
				|  |  | +          '#fff',
 | 
	
		
			
				|  |  | +          '#151515',
 | 
	
		
			
				|  |  | +          '#5172dc',
 | 
	
		
			
				|  |  | +          '#e74c3c',
 | 
	
		
			
				|  |  | +          '#24292e',
 | 
	
		
			
				|  |  | +          '#394664',
 | 
	
		
			
				|  |  | +          '#009688',
 | 
	
		
			
				|  |  | +          '#383f45'
 | 
	
		
			
				|  |  | +        ]" @change="setHeaderTheme" />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			<!-- 菜单主题 -->
 | 
	
		
			
				|  |  | +			<template v-if="layout !== 'top'">
 | 
	
		
			
				|  |  | +				<ElDivider>{{ t('setting.menuTheme') }}</ElDivider>
 | 
	
		
			
				|  |  | +				<ColorRadioPicker v-model="menuTheme" :schema="[
 | 
	
		
			
				|  |  | +            '#fff',
 | 
	
		
			
				|  |  | +            '#001529',
 | 
	
		
			
				|  |  | +            '#212121',
 | 
	
		
			
				|  |  | +            '#273352',
 | 
	
		
			
				|  |  | +            '#191b24',
 | 
	
		
			
				|  |  | +            '#383f45',
 | 
	
		
			
				|  |  | +            '#001628',
 | 
	
		
			
				|  |  | +            '#344058'
 | 
	
		
			
				|  |  | +          ]" @change="setMenuTheme" />
 | 
	
		
			
				|  |  | +			</template>
 | 
	
		
			
				|  |  | +		</div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		<!-- 界面显示 -->
 | 
	
		
			
				|  |  | +		<ElDivider>{{ t('setting.interfaceDisplay') }}</ElDivider>
 | 
	
		
			
				|  |  | +		<InterfaceDisplay />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		<ElDivider />
 | 
	
		
			
				|  |  | +		<div>
 | 
	
		
			
				|  |  | +			<ElButton class="w-full" type="primary" @click="copyConfig">{{ t('setting.copy') }}</ElButton>
 | 
	
		
			
				|  |  | +		</div>
 | 
	
		
			
				|  |  | +		<div class="mt-5px">
 | 
	
		
			
				|  |  | +			<ElButton class="w-full" type="danger" @click="clear">
 | 
	
		
			
				|  |  | +				{{ t('setting.clearAndReset') }}
 | 
	
		
			
				|  |  | +			</ElButton>
 | 
	
		
			
				|  |  | +		</div>
 | 
	
		
			
				|  |  | +	</ElDrawer>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<style lang="scss" scoped>
 | 
	
		
			
				|  |  | +	$prefix-cls: #{$namespace}-setting;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	.#{$prefix-cls} {
 | 
	
		
			
				|  |  | +		border-radius: 6px 0 0 6px;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +</style>
 |