app.ts 7.5 KB

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