user.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import pinia from '~src/store/init'
  2. import appConfig from '~src/config/app'
  3. import { useAppStore } from '~src/store'
  4. import { getRoutes } from '~api/menu'
  5. import themeData from '~src/config/theme'
  6. import tokenData from '~src/router/modules/token'
  7. import { logout, refreshToken, userLogin } from '~api/user'
  8. import { userConfigInfo, userConfigSave } from '~api/other'
  9. import { setStoreValue } from '~src/utils/storage'
  10. import { ArrToOneObj, arrIndex, getArrValue, getObjValue, isNullES } from 'js-fast-way'
  11. import { useOsTheme } from 'hc-vue3-ui'
  12. //初始变量
  13. const store = useAppStore(pinia)
  14. //登录
  15. export const useAppLogin = async (form) => {
  16. const { error, code, res } = await userLogin(form)
  17. console.log(error, code, res)
  18. if (!error && code === 200) {
  19. store.setTokenVal(res['access_token'])
  20. store.setRefreshTokenVal(res['refresh_token'])
  21. store.setTenantId(res['tenant_id'])
  22. store.setUserInfo(res)
  23. //获取路由菜单
  24. const routerRes = await setRouterData()
  25. if (routerRes.length <= 0) {
  26. return { error: true, msg: '路由异常' }
  27. }
  28. //获取路由首页
  29. const isHomeUrl = await getHomeRouter(routerRes)
  30. if (isNullES(isHomeUrl)) {
  31. return { error: true, msg: '菜单权限异常' }
  32. }
  33. //获取配置数据
  34. await initUserConfigInfo()
  35. return { error, code, res }
  36. } else {
  37. return { error, code, res }
  38. }
  39. }
  40. //获取路由菜单的主入口路径
  41. const getHomeRouter = async (arr) => {
  42. //判断 arr 数组中的 children 中是否有数据,没数据的话,取下一个元素
  43. const menus = arr.filter((item) => {
  44. if (item?.children.length > 0) {
  45. const menua = item.children.filter((items) => {
  46. const children = getArrValue(items?.children)
  47. return children.length > 0
  48. })
  49. return menua.length > 0
  50. } else {
  51. return false
  52. }
  53. })
  54. //处理数据
  55. if (menus.length <= 0) return false
  56. const code = menus[0]?.children[0]?.children[0]?.code
  57. if (isNullES(code)) return false
  58. store.setHomeUrl(code)
  59. return true
  60. }
  61. //用户信息初始化
  62. export const initUserConfigInfo = async () => {
  63. const { error, data } = await userConfigInfo()
  64. if (error) return false
  65. const res = getObjValue(data)
  66. if (res?.theme) {
  67. const { theme, color } = res
  68. //设置主题
  69. store.setTheme(theme)
  70. //设置模式
  71. if (theme === 'auto') {
  72. store.setThemeVal(useOsTheme())
  73. } else {
  74. store.setThemeVal(theme)
  75. }
  76. //获取主色调和首页主题数据
  77. let themeColor = themeData.color
  78. let colorIndex = arrIndex(themeColor, 'name', color)
  79. //设置主色调
  80. if (colorIndex !== -1) {
  81. store.setColor(themeColor[colorIndex])
  82. }
  83. return true
  84. } else {
  85. await userConfigSave({
  86. theme: appConfig?.theme || '',
  87. color: appConfig?.color?.name || '',
  88. })
  89. return true
  90. }
  91. }
  92. //设置路由信息
  93. export const setRouterData = async () => {
  94. //请求接口,获取路由数据
  95. const { error, data } = await getRoutes()
  96. if (error) {
  97. return Promise.reject(false)
  98. }
  99. const resData = getArrValue(data)
  100. //数据转换
  101. let routesObj = {}, routesArr = []
  102. await ArrToOneObj(resData, 'code', routesObj, routesArr)
  103. const routes = [...tokenData, ...routesArr] //合并
  104. //数据缓存
  105. store.setMenus(resData)
  106. setStoreValue('route', routesObj)
  107. setStoreValue('routes', routes)
  108. return resData
  109. }
  110. //刷新token
  111. export const RefreshToken = async () => {
  112. try {
  113. window.console.log('刷新 token')
  114. const { dept_id, role_id } = store.getUserInfo
  115. const refresh = store.getRefreshToken
  116. const tenantId = store.getTenantId
  117. const { error, code, res } = await refreshToken(refresh, tenantId, dept_id, role_id)
  118. if (!error && code === 200) {
  119. store.setTokenVal(res['access_token'])
  120. store.setRefreshTokenVal(res['refresh_token'])
  121. store.setTenantId(res['tenant_id'])
  122. store.setUserInfo(res)
  123. return Promise.resolve(res)
  124. } else {
  125. return Promise.reject(res)
  126. }
  127. } catch (e) {
  128. window.console.warn('token 刷新失败: ', e)
  129. return Promise.reject(e)
  130. }
  131. }
  132. //登出
  133. export const LogOut = async () => {
  134. return await logout()
  135. }