houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 import { defineStore } from 'pinia'
H 2 import { store } from '../index'
3 import { setCssVar, humpToUnderline } from '@/utils'
4 import { ElMessage } from 'element-plus'
5 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
6 import { ElementPlusSize } from '@/types/elementPlus'
7 import { LayoutType } from '@/types/layout'
8 import { ThemeTypes } from '@/types/theme'
9
10 const { wsCache } = useCache()
11
12 interface AppState {
13   breadcrumb: boolean
14   breadcrumbIcon: boolean
15   collapse: boolean
16   uniqueOpened: boolean
17   hamburger: boolean
18   screenfull: boolean
19   search: boolean
20   size: boolean
21   locale: boolean
22   message: boolean
23   tagsView: boolean
24   tagsViewIcon: boolean
25   logo: boolean
26   fixedHeader: boolean
27   greyMode: boolean
28   pageLoading: boolean
29   layout: LayoutType
30   title: string
31   userInfo: string
32   isDark: boolean
33   currentSize: ElementPlusSize
34   sizeMap: ElementPlusSize[]
35   mobile: boolean
36   footer: boolean
37   theme: ThemeTypes
38   fixedMenu: boolean
39 }
40
41 export const useAppStore = defineStore('app', {
42   state: (): AppState => {
43     return {
44       userInfo: 'userInfo', // 登录信息存储字段-建议每个项目换一个字段,避免与其他项目冲突
45       sizeMap: ['default', 'large', 'small'],
46       mobile: false, // 是否是移动端
47       title: import.meta.env.VITE_APP_TITLE, // 标题
48       pageLoading: false, // 路由跳转loading
49
50       breadcrumb: true, // 面包屑
51       breadcrumbIcon: true, // 面包屑图标
52       collapse: false, // 折叠菜单
53       uniqueOpened: true, // 是否只保持一个子菜单的展开
54       hamburger: true, // 折叠图标
55       screenfull: true, // 全屏图标
56       search: true, // 搜索图标
57       size: true, // 尺寸图标
58       locale: true, // 多语言图标
59       message: true, // 消息图标
60       tagsView: true, // 标签页
61       tagsViewIcon: true, // 是否显示标签图标
62       logo: true, // logo
63       fixedHeader: true, // 固定toolheader
64       footer: true, // 显示页脚
65       greyMode: false, // 是否开始灰色模式,用于特殊悼念日
66       fixedMenu: wsCache.get('fixedMenu') || false, // 是否固定菜单
67
68       layout: wsCache.get(CACHE_KEY.LAYOUT) || 'classic', // layout布局
69       isDark: wsCache.get(CACHE_KEY.IS_DARK) || false, // 是否是暗黑模式
70       currentSize: wsCache.get('default') || 'default', // 组件尺寸
71       theme: wsCache.get(CACHE_KEY.THEME) || {
72         // 主题色
73         elColorPrimary: '#409eff',
74         // 左侧菜单边框颜色
75         leftMenuBorderColor: 'inherit',
76         // 左侧菜单背景颜色
77         leftMenuBgColor: '#001529',
78         // 左侧菜单浅色背景颜色
79         leftMenuBgLightColor: '#0f2438',
80         // 左侧菜单选中背景颜色
81         leftMenuBgActiveColor: 'var(--el-color-primary)',
82         // 左侧菜单收起选中背景颜色
83         leftMenuCollapseBgActiveColor: 'var(--el-color-primary)',
84         // 左侧菜单字体颜色
85         leftMenuTextColor: '#bfcbd9',
86         // 左侧菜单选中字体颜色
87         leftMenuTextActiveColor: '#fff',
88         // logo字体颜色
89         logoTitleTextColor: '#fff',
90         // logo边框颜色
91         logoBorderColor: 'inherit',
92         // 头部背景颜色
93         topHeaderBgColor: '#fff',
94         // 头部字体颜色
95         topHeaderTextColor: 'inherit',
96         // 头部悬停颜色
97         topHeaderHoverColor: '#f6f6f6',
98         // 头部边框颜色
99         topToolBorderColor: '#eee'
100       }
101     }
102   },
103   getters: {
104     getBreadcrumb(): boolean {
105       return this.breadcrumb
106     },
107     getBreadcrumbIcon(): boolean {
108       return this.breadcrumbIcon
109     },
110     getCollapse(): boolean {
111       return this.collapse
112     },
113     getUniqueOpened(): boolean {
114       return this.uniqueOpened
115     },
116     getHamburger(): boolean {
117       return this.hamburger
118     },
119     getScreenfull(): boolean {
120       return this.screenfull
121     },
122     getSize(): boolean {
123       return this.size
124     },
125     getLocale(): boolean {
126       return this.locale
127     },
128     getMessage(): boolean {
129       return this.message
130     },
131     getTagsView(): boolean {
132       return this.tagsView
133     },
134     getTagsViewIcon(): boolean {
135       return this.tagsViewIcon
136     },
137     getLogo(): boolean {
138       return this.logo
139     },
140     getFixedHeader(): boolean {
141       return this.fixedHeader
142     },
143     getGreyMode(): boolean {
144       return this.greyMode
145     },
146     getFixedMenu(): boolean {
147       return this.fixedMenu
148     },
149     getPageLoading(): boolean {
150       return this.pageLoading
151     },
152     getLayout(): LayoutType {
153       return this.layout
154     },
155     getTitle(): string {
156       return this.title
157     },
158     getUserInfo(): string {
159       return this.userInfo
160     },
161     getIsDark(): boolean {
162       return this.isDark
163     },
164     getCurrentSize(): ElementPlusSize {
165       return this.currentSize
166     },
167     getSizeMap(): ElementPlusSize[] {
168       return this.sizeMap
169     },
170     getMobile(): boolean {
171       return this.mobile
172     },
173     getTheme(): ThemeTypes {
174       return this.theme
175     },
176     getFooter(): boolean {
177       return this.footer
178     }
179   },
180   actions: {
181     setBreadcrumb(breadcrumb: boolean) {
182       this.breadcrumb = breadcrumb
183     },
184     setBreadcrumbIcon(breadcrumbIcon: boolean) {
185       this.breadcrumbIcon = breadcrumbIcon
186     },
187     setCollapse(collapse: boolean) {
188       this.collapse = collapse
189     },
190     setUniqueOpened(uniqueOpened: boolean) {
191       this.uniqueOpened = uniqueOpened
192     },
193     setHamburger(hamburger: boolean) {
194       this.hamburger = hamburger
195     },
196     setScreenfull(screenfull: boolean) {
197       this.screenfull = screenfull
198     },
199     setSize(size: boolean) {
200       this.size = size
201     },
202     setLocale(locale: boolean) {
203       this.locale = locale
204     },
205     setMessage(message: boolean) {
206       this.message = message
207     },
208     setTagsView(tagsView: boolean) {
209       this.tagsView = tagsView
210     },
211     setTagsViewIcon(tagsViewIcon: boolean) {
212       this.tagsViewIcon = tagsViewIcon
213     },
214     setLogo(logo: boolean) {
215       this.logo = logo
216     },
217     setFixedHeader(fixedHeader: boolean) {
218       this.fixedHeader = fixedHeader
219     },
220     setGreyMode(greyMode: boolean) {
221       this.greyMode = greyMode
222     },
223     setFixedMenu(fixedMenu: boolean) {
224       wsCache.set('fixedMenu', fixedMenu)
225       this.fixedMenu = fixedMenu
226     },
227     setPageLoading(pageLoading: boolean) {
228       this.pageLoading = pageLoading
229     },
230     setLayout(layout: LayoutType) {
231       if (this.mobile && layout !== 'classic') {
232         ElMessage.warning('移动端模式下不支持切换其他布局')
233         return
234       }
235       this.layout = layout
236       wsCache.set(CACHE_KEY.LAYOUT, this.layout)
237     },
238     setTitle(title: string) {
239       this.title = title
240     },
241     setIsDark(isDark: boolean) {
242       this.isDark = isDark
243       if (this.isDark) {
244         document.documentElement.classList.add('dark')
245         document.documentElement.classList.remove('light')
246       } else {
247         document.documentElement.classList.add('light')
248         document.documentElement.classList.remove('dark')
249       }
250       wsCache.set(CACHE_KEY.IS_DARK, this.isDark)
251     },
252     setCurrentSize(currentSize: ElementPlusSize) {
253       this.currentSize = currentSize
254       wsCache.set('currentSize', this.currentSize)
255     },
256     setMobile(mobile: boolean) {
257       this.mobile = mobile
258     },
259     setTheme(theme: ThemeTypes) {
260       this.theme = Object.assign(this.theme, theme)
261       wsCache.set(CACHE_KEY.THEME, this.theme)
262     },
263     setCssVarTheme() {
264       for (const key in this.theme) {
265         setCssVar(`--${humpToUnderline(key)}`, this.theme[key])
266       }
267     },
268     setFooter(footer: boolean) {
269       this.footer = footer
270     }
271   },
272   persist: false
273 })
274
275 export const useAppStoreWithOut = () => {
276   return useAppStore(store)
277 }