app.ts 7.5 KB

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