Files
zkxw/web-admin/src/store/modules/setting.ts
T
2026-06-17 10:00:54 +08:00

467 lines
12 KiB
TypeScript
Executable File

/**
* 系统设置状态管理模块
*
* 提供完整的系统设置状态管理
*
* ## 主要功能
*
* - 菜单布局配置(左侧、顶部、混合、双栏)
* - 主题管理(亮色、暗色、自动)
* - 菜单主题样式配置
* - 界面显示开关(面包屑、标签页、语言切换等)
* - 功能开关(手风琴模式、色弱模式、水印等)
* - 样式配置(边框、圆角、容器宽度、页面过渡)
* - 节日功能配置
* - Element Plus 主题色动态设置
*
* ## 使用场景
*
* - 设置面板配置管理
* - 主题切换和样式定制
* - 界面功能开关控制
* - 用户偏好设置持久化
*
* ## 持久化
*
* - 使用 localStorage 存储
* - 存储键:sys-v{version}-setting
* - 支持跨版本数据迁移
*
* @module store/modules/setting
* @author Art Design Pro Team
*/
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { MenuThemeType } from '@/types/store'
import AppConfig from '@/config'
import { SystemThemeEnum, MenuThemeEnum, MenuTypeEnum, ContainerWidthEnum } from '@/enums/appEnum'
import { setElementThemeColor } from '@/utils/ui'
import { useCeremony } from '@/hooks/core/useCeremony'
import { StorageConfig } from '@/utils'
import { SETTING_DEFAULT_CONFIG } from '@/config/setting'
/**
* 系统设置状态管理
* 管理应用的菜单、主题、界面显示等各项设置
*/
export const useSettingStore = defineStore(
'settingStore',
() => {
// 菜单相关设置
/** 菜单类型 */
const menuType = ref(SETTING_DEFAULT_CONFIG.menuType)
/** 菜单展开宽度 */
const menuOpenWidth = ref(SETTING_DEFAULT_CONFIG.menuOpenWidth)
/** 菜单是否展开 */
const menuOpen = ref(SETTING_DEFAULT_CONFIG.menuOpen)
/** 双菜单是否显示文本 */
const dualMenuShowText = ref(SETTING_DEFAULT_CONFIG.dualMenuShowText)
// 主题相关设置
/** 系统主题类型 */
const systemThemeType = ref(SETTING_DEFAULT_CONFIG.systemThemeType)
/** 系统主题模式 */
const systemThemeMode = ref(SETTING_DEFAULT_CONFIG.systemThemeMode)
/** 菜单主题类型 */
const menuThemeType = ref(SETTING_DEFAULT_CONFIG.menuThemeType)
/** 系统主题颜色 */
const systemThemeColor = ref(SETTING_DEFAULT_CONFIG.systemThemeColor)
// 界面显示设置
/** 是否显示菜单按钮 */
const showMenuButton = ref(SETTING_DEFAULT_CONFIG.showMenuButton)
/** 是否显示快速入口 */
const showFastEnter = ref(SETTING_DEFAULT_CONFIG.showFastEnter)
/** 是否显示刷新按钮 */
const showRefreshButton = ref(SETTING_DEFAULT_CONFIG.showRefreshButton)
/** 是否显示面包屑 */
const showCrumbs = ref(SETTING_DEFAULT_CONFIG.showCrumbs)
/** 是否显示工作台标签 */
const showWorkTab = ref(SETTING_DEFAULT_CONFIG.showWorkTab)
/** 是否显示语言切换 */
const showLanguage = ref(SETTING_DEFAULT_CONFIG.showLanguage)
/** 是否显示进度条 */
const showNprogress = ref(SETTING_DEFAULT_CONFIG.showNprogress)
/** 是否显示设置引导 */
const showSettingGuide = ref(SETTING_DEFAULT_CONFIG.showSettingGuide)
/** 是否显示节日文本 */
const showFestivalText = ref(SETTING_DEFAULT_CONFIG.showFestivalText)
/** 是否显示水印 */
const watermarkVisible = ref(SETTING_DEFAULT_CONFIG.watermarkVisible)
// 功能设置
/** 是否自动关闭 */
const autoClose = ref(SETTING_DEFAULT_CONFIG.autoClose)
/** 是否唯一展开 */
const uniqueOpened = ref(SETTING_DEFAULT_CONFIG.uniqueOpened)
/** 是否色弱模式 */
const colorWeak = ref(SETTING_DEFAULT_CONFIG.colorWeak)
/** 是否刷新 */
const refresh = ref(SETTING_DEFAULT_CONFIG.refresh)
/** 是否加载节日烟花 */
const holidayFireworksLoaded = ref(SETTING_DEFAULT_CONFIG.holidayFireworksLoaded)
// 样式设置
/** 边框模式 */
const boxBorderMode = ref(SETTING_DEFAULT_CONFIG.boxBorderMode)
/** 页面过渡效果 */
const pageTransition = ref(SETTING_DEFAULT_CONFIG.pageTransition)
/** 标签页样式 */
const tabStyle = ref(SETTING_DEFAULT_CONFIG.tabStyle)
/** 自定义圆角 */
const customRadius = ref(SETTING_DEFAULT_CONFIG.customRadius)
/** 容器宽度 */
const containerWidth = ref(SETTING_DEFAULT_CONFIG.containerWidth)
// 节日相关
/** 节日日期 */
const festivalDate = ref('')
/**
* 获取菜单主题
* 根据当前主题类型和暗色模式返回对应的主题配置
*/
const getMenuTheme = computed((): MenuThemeType => {
const list = AppConfig.themeList.filter((item) => item.theme === menuThemeType.value)
if (isDark.value) {
return AppConfig.darkMenuStyles[0]
} else {
return list[0]
}
})
/**
* 判断是否为暗色模式
*/
const isDark = computed((): boolean => {
return systemThemeType.value === SystemThemeEnum.DARK
})
/**
* 获取菜单展开宽度
*/
const getMenuOpenWidth = computed((): string => {
return menuOpenWidth.value + 'px' || SETTING_DEFAULT_CONFIG.menuOpenWidth + 'px'
})
/**
* 获取自定义圆角
*/
const getCustomRadius = computed((): string => {
return customRadius.value + 'rem' || SETTING_DEFAULT_CONFIG.customRadius + 'rem'
})
/**
* 是否显示烟花
* 根据当前日期和节日日期判断是否显示烟花效果
*/
const isShowFireworks = computed((): boolean => {
return festivalDate.value === useCeremony().currentFestivalData.value?.date ? false : true
})
/**
* 切换菜单布局(Web 管理端固定混合菜单:一级顶栏 + 二级侧栏)
*/
const switchMenuLayouts = (type: MenuTypeEnum) => {
void type
menuType.value = MenuTypeEnum.TOP_LEFT
}
/** 持久化恢复后强制混合菜单,避免历史 localStorage 覆盖布局 */
const enforceWebMenuLayout = () => {
menuType.value = MenuTypeEnum.TOP_LEFT
try {
localStorage.removeItem(StorageConfig.RESPONSIVE_MENU_TYPE_KEY)
} catch {
// ignore
}
}
/**
* 设置菜单展开宽度
* @param width 宽度值
*/
const setMenuOpenWidth = (width: number) => {
menuOpenWidth.value = width
}
/**
* 设置全局主题
* @param theme 主题类型
* @param themeMode 主题模式
*/
const setGlopTheme = (theme: SystemThemeEnum, themeMode: SystemThemeEnum) => {
systemThemeType.value = theme
systemThemeMode.value = themeMode
localStorage.setItem(StorageConfig.THEME_KEY, theme)
}
/**
* 切换菜单样式
* @param theme 菜单主题
*/
const switchMenuStyles = (theme: MenuThemeEnum) => {
menuThemeType.value = theme
}
/**
* 设置Element Plus主题颜色
* @param theme 主题颜色
*/
const setElementTheme = (theme: string) => {
systemThemeColor.value = theme
setElementThemeColor(theme)
}
/**
* 切换边框模式
*/
const setBorderMode = () => {
boxBorderMode.value = !boxBorderMode.value
}
/**
* 设置容器宽度
* @param width 容器宽度枚举值
*/
const setContainerWidth = (width: ContainerWidthEnum) => {
containerWidth.value = width
}
/**
* 切换唯一展开模式
*/
const setUniqueOpened = () => {
uniqueOpened.value = !uniqueOpened.value
}
/**
* 切换菜单按钮显示
*/
const setButton = () => {
showMenuButton.value = !showMenuButton.value
}
/**
* 切换快速入口显示
*/
const setFastEnter = () => {
showFastEnter.value = !showFastEnter.value
}
/**
* 切换自动关闭
*/
const setAutoClose = () => {
autoClose.value = !autoClose.value
}
/**
* 切换刷新按钮显示
*/
const setShowRefreshButton = () => {
showRefreshButton.value = !showRefreshButton.value
}
/**
* 切换面包屑显示
*/
const setCrumbs = () => {
showCrumbs.value = !showCrumbs.value
}
/**
* 设置工作台标签显示
* @param show 是否显示
*/
const setWorkTab = (show: boolean) => {
showWorkTab.value = show
}
/**
* 切换语言切换显示
*/
const setLanguage = () => {
showLanguage.value = !showLanguage.value
}
/**
* 切换进度条显示
*/
const setNprogress = () => {
showNprogress.value = !showNprogress.value
}
/**
* 切换色弱模式
*/
const setColorWeak = () => {
colorWeak.value = !colorWeak.value
}
/**
* 隐藏设置引导
*/
const hideSettingGuide = () => {
showSettingGuide.value = false
}
/**
* 显示设置引导
*/
const openSettingGuide = () => {
showSettingGuide.value = true
}
/**
* 设置页面过渡效果
* @param transition 过渡效果名称
*/
const setPageTransition = (transition: string) => {
pageTransition.value = transition
}
/**
* 设置标签页样式
* @param style 样式名称
*/
const setTabStyle = (style: string) => {
tabStyle.value = style
}
/**
* 设置菜单展开状态
* @param open 是否展开
*/
const setMenuOpen = (open: boolean) => {
menuOpen.value = open
}
/**
* 刷新页面
*/
const reload = () => {
refresh.value = !refresh.value
}
/**
* 设置水印显示
* @param visible 是否显示
*/
const setWatermarkVisible = (visible: boolean) => {
watermarkVisible.value = visible
}
/**
* 设置自定义圆角
* @param radius 圆角值
*/
const setCustomRadius = (radius: string) => {
customRadius.value = radius
document.documentElement.style.setProperty('--custom-radius', `${radius}rem`)
}
/**
* 设置节日烟花加载状态
* @param isLoad 是否已加载
*/
const setholidayFireworksLoaded = (isLoad: boolean) => {
holidayFireworksLoaded.value = isLoad
}
/**
* 设置节日文本显示
* @param show 是否显示
*/
const setShowFestivalText = (show: boolean) => {
showFestivalText.value = show
}
const setFestivalDate = (date: string) => {
festivalDate.value = date
}
const setDualMenuShowText = (show: boolean) => {
dualMenuShowText.value = show
}
return {
menuType,
menuOpenWidth,
systemThemeType,
systemThemeMode,
menuThemeType,
systemThemeColor,
boxBorderMode,
uniqueOpened,
showMenuButton,
showFastEnter,
showRefreshButton,
showCrumbs,
autoClose,
showWorkTab,
showLanguage,
showNprogress,
colorWeak,
showSettingGuide,
pageTransition,
tabStyle,
menuOpen,
refresh,
watermarkVisible,
customRadius,
holidayFireworksLoaded,
showFestivalText,
festivalDate,
dualMenuShowText,
containerWidth,
getMenuTheme,
isDark,
getMenuOpenWidth,
getCustomRadius,
isShowFireworks,
switchMenuLayouts,
enforceWebMenuLayout,
setMenuOpenWidth,
setGlopTheme,
switchMenuStyles,
setElementTheme,
setBorderMode,
setContainerWidth,
setUniqueOpened,
setButton,
setFastEnter,
setAutoClose,
setShowRefreshButton,
setCrumbs,
setWorkTab,
setLanguage,
setNprogress,
setColorWeak,
hideSettingGuide,
openSettingGuide,
setPageTransition,
setTabStyle,
setMenuOpen,
reload,
setWatermarkVisible,
setCustomRadius,
setholidayFireworksLoaded,
setShowFestivalText,
setFestivalDate,
setDualMenuShowText
}
},
{
persist: {
key: 'setting',
storage: localStorage,
// 菜单布局由产品固定,不持久化用户切换记录
omit: ['menuType'],
afterRestore: (ctx) => {
;(ctx.store as ReturnType<typeof useSettingStore>).enforceWebMenuLayout()
}
}
}
)