app.ts 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. import { defineStore } from 'pinia'
  2. import { store } from '../index'
  3. import { humpToUnderline, setCssVar } 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. const { wsCache } = useCache()
  10. interface AppState {
  11. breadcrumb: boolean
  12. breadcrumbIcon: boolean
  13. collapse: boolean
  14. uniqueOpened: boolean
  15. hamburger: boolean
  16. screenfull: boolean
  17. search: boolean
  18. size: boolean
  19. locale: boolean
  20. message: boolean
  21. tagsView: boolean
  22. tagsViewImmerse: boolean
  23. tagsViewIcon: boolean
  24. logo: boolean
  25. fixedHeader: boolean
  26. greyMode: boolean
  27. pageLoading: boolean
  28. layout: LayoutType
  29. title: string
  30. userInfo: string
  31. isDark: boolean
  32. currentSize: ElementPlusSize
  33. sizeMap: ElementPlusSize[]
  34. mobile: boolean
  35. footer: boolean
  36. theme: ThemeTypes
  37. fixedMenu: boolean
  38. }
  39. export const useAppStore = defineStore('app', {
  40. state: (): AppState => {
  41. return {
  42. userInfo: 'userInfo', // 登录信息存储字段-建议每个项目换一个字段,避免与其他项目冲突
  43. sizeMap: ['default', 'large', 'small'],
  44. mobile: false, // 是否是移动端
  45. title: import.meta.env.VITE_APP_TITLE, // 标题
  46. pageLoading: false, // 路由跳转loading
  47. breadcrumb: true, // 面包屑
  48. breadcrumbIcon: true, // 面包屑图标
  49. collapse: false, // 折叠菜单
  50. uniqueOpened: true, // 是否只保持一个子菜单的展开
  51. hamburger: true, // 折叠图标
  52. screenfull: true, // 全屏图标
  53. search: true, // 搜索图标
  54. size: true, // 尺寸图标
  55. locale: true, // 多语言图标
  56. message: true, // 消息图标
  57. tagsView: true, // 标签页
  58. tagsViewImmerse: false, // 标签页沉浸
  59. tagsViewIcon: true, // 是否显示标签图标
  60. logo: false, // logo
  61. fixedHeader: true, // 固定toolheader
  62. footer: true, // 显示页脚
  63. greyMode: false, // 是否开始灰色模式,用于特殊悼念日
  64. fixedMenu: wsCache.get('fixedMenu') || false, // 是否固定菜单
  65. layout: wsCache.get(CACHE_KEY.LAYOUT) || 'classic', // layout布局
  66. isDark: wsCache.get(CACHE_KEY.IS_DARK) || false, // 是否是暗黑模式
  67. currentSize: wsCache.get('default') || 'default', // 组件尺寸
  68. theme: wsCache.get(CACHE_KEY.THEME) || {
  69. // 主题色
  70. elColorPrimary: '#409eff',
  71. // 左侧菜单边框颜色
  72. leftMenuBorderColor: 'inherit',
  73. // 左侧菜单背景颜色
  74. leftMenuBgColor: '#001529',
  75. // 左侧菜单浅色背景颜色
  76. leftMenuBgLightColor: '#0f2438',
  77. // 左侧菜单选中背景颜色
  78. leftMenuBgActiveColor: 'var(--el-color-primary)',
  79. // 左侧菜单收起选中背景颜色
  80. leftMenuCollapseBgActiveColor: 'var(--el-color-primary)',
  81. // 左侧菜单字体颜色
  82. leftMenuTextColor: '#bfcbd9',
  83. // 左侧菜单选中字体颜色
  84. leftMenuTextActiveColor: '#fff',
  85. // logo字体颜色
  86. logoTitleTextColor: '#fff',
  87. // logo边框颜色
  88. logoBorderColor: 'inherit',
  89. // 头部背景颜色
  90. topHeaderBgColor: '#fff',
  91. // 头部字体颜色
  92. topHeaderTextColor: 'inherit',
  93. // 头部悬停颜色
  94. topHeaderHoverColor: '#f6f6f6',
  95. // 头部边框颜色
  96. topToolBorderColor: '#eee'
  97. }
  98. }
  99. },
  100. getters: {
  101. getBreadcrumb(): boolean {
  102. return this.breadcrumb
  103. },
  104. getBreadcrumbIcon(): boolean {
  105. return this.breadcrumbIcon
  106. },
  107. getCollapse(): boolean {
  108. return this.collapse
  109. },
  110. getUniqueOpened(): boolean {
  111. return this.uniqueOpened
  112. },
  113. getHamburger(): boolean {
  114. return this.hamburger
  115. },
  116. getScreenfull(): boolean {
  117. return this.screenfull
  118. },
  119. getSize(): boolean {
  120. return this.size
  121. },
  122. getLocale(): boolean {
  123. return this.locale
  124. },
  125. getMessage(): boolean {
  126. return this.message
  127. },
  128. getTagsView(): boolean {
  129. return this.tagsView
  130. },
  131. getTagsViewImmerse(): boolean {
  132. return this.tagsViewImmerse
  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. setTagsViewImmerse(tagsViewImmerse: boolean) {
  212. this.tagsViewImmerse = tagsViewImmerse
  213. },
  214. setTagsViewIcon(tagsViewIcon: boolean) {
  215. this.tagsViewIcon = tagsViewIcon
  216. },
  217. setLogo(logo: boolean) {
  218. this.logo = logo
  219. },
  220. setFixedHeader(fixedHeader: boolean) {
  221. this.fixedHeader = fixedHeader
  222. },
  223. setGreyMode(greyMode: boolean) {
  224. this.greyMode = greyMode
  225. },
  226. setFixedMenu(fixedMenu: boolean) {
  227. wsCache.set('fixedMenu', fixedMenu)
  228. this.fixedMenu = fixedMenu
  229. },
  230. setPageLoading(pageLoading: boolean) {
  231. this.pageLoading = pageLoading
  232. },
  233. setLayout(layout: LayoutType) {
  234. if (this.mobile && layout !== 'classic') {
  235. ElMessage.warning('移动端模式下不支持切换其他布局')
  236. return
  237. }
  238. this.layout = layout
  239. wsCache.set(CACHE_KEY.LAYOUT, this.layout)
  240. },
  241. setTitle(title: string) {
  242. this.title = title
  243. },
  244. setIsDark(isDark: boolean) {
  245. this.isDark = isDark
  246. if (this.isDark) {
  247. document.documentElement.classList.add('dark')
  248. document.documentElement.classList.remove('light')
  249. } else {
  250. document.documentElement.classList.add('light')
  251. document.documentElement.classList.remove('dark')
  252. }
  253. wsCache.set(CACHE_KEY.IS_DARK, this.isDark)
  254. },
  255. setCurrentSize(currentSize: ElementPlusSize) {
  256. this.currentSize = currentSize
  257. wsCache.set('currentSize', this.currentSize)
  258. },
  259. setMobile(mobile: boolean) {
  260. this.mobile = mobile
  261. },
  262. setTheme(theme: ThemeTypes) {
  263. this.theme = Object.assign(this.theme, theme)
  264. wsCache.set(CACHE_KEY.THEME, this.theme)
  265. },
  266. setCssVarTheme() {
  267. for (const key in this.theme) {
  268. setCssVar(`--${humpToUnderline(key)}`, this.theme[key])
  269. }
  270. },
  271. setFooter(footer: boolean) {
  272. this.footer = footer
  273. }
  274. },
  275. persist: false
  276. })
  277. export const useAppStoreWithOut = () => {
  278. return useAppStore(store)
  279. }