user.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import pinia from '~src/store/init'
  2. import website from '~src/config'
  3. import appConfig from '~src/config/app'
  4. import { useAppStore } from '~src/store'
  5. import { getRoutes } from '~api/menu'
  6. import themeData from '~src/config/theme'
  7. import tokenData from '~src/router/modules/token'
  8. import { logout, refreshToken, userLogin } from '~api/user'
  9. import { userConfigInfo, userConfigSave } from '~api/other'
  10. import { setStoreValue } from '~src/utils/storage'
  11. import { ArrToOneObj, arrIndex, getArrValue, getObjValue, isNullES } from 'js-fast-way'
  12. import { useOsTheme } from 'hc-vue3-ui'
  13. import { setAppName } from '~uti/tools'
  14. import logoIcon from '~src/assets/logo/icon.png'
  15. import logoName from '~src/assets/logo/name.png'
  16. //初始变量
  17. const store = useAppStore(pinia)
  18. //登录
  19. export const useAppLogin = async (form) => {
  20. const { error, code, res, msg } = await userLogin(form)
  21. if (!error && code === 200) {
  22. const info = await setUserAppInfo(res)
  23. return { error: info.error, msg: info.msg }
  24. } else {
  25. return { error: true, msg: msg }
  26. }
  27. }
  28. //设置用户信息
  29. export const setUserAppInfo = async (res) => {
  30. store.setTokenVal(res['access_token'])
  31. store.setRefreshTokenVal(res['refresh_token'])
  32. store.setTenantId(res['tenant_id'])
  33. store.setUserInfo(res)
  34. store.setIsLogin(true)
  35. //获取路由菜单
  36. const routerRes = await setRouterData()
  37. if (routerRes.length <= 0) {
  38. return { error: true, msg: '路由异常' }
  39. }
  40. await getHomeRouter(routerRes)
  41. //获取配置数据
  42. await initUserConfigInfo()
  43. return { error: false, msg: '成功' }
  44. }
  45. //设置租户信息
  46. export const setUserTenantInfo = async (res = {}) => {
  47. const { tenantAvatar, tenantAvatarText, tenantTitle, tenantId } = res
  48. //设置标题
  49. const title = tenantTitle ? tenantTitle : website.title
  50. store.setTitle(title)
  51. setAppName(title)
  52. //设置logo图标
  53. const icon = tenantAvatar ? tenantAvatar : logoIcon
  54. store.setLogoIcon(icon)
  55. //设置logo文字
  56. const name = tenantAvatarText ? tenantAvatarText : logoName
  57. store.setLogoName(name)
  58. //设置租户ID
  59. const id = tenantId ? tenantId : '000000'
  60. store.setTenantId(id)
  61. //返回数据
  62. return { title, icon, name, id }
  63. }
  64. //获取路由菜单的主入口路径
  65. const getHomeRouter = async () => {
  66. const routes = store.menus
  67. //没有菜单路由数据
  68. if (routes.length <= 0) {
  69. store.setHomeUrl('home')
  70. return 'home'
  71. } else {
  72. const code = await getRoutesHomeUrl(routes)
  73. store.setHomeUrl(code)
  74. return code
  75. }
  76. }
  77. //递归获取最子级的菜单
  78. const getRoutesHomeUrl = async (arr) => {
  79. const item = arr[0]
  80. if (!isNullES(item.children) && item.children.length > 0) {
  81. return await getRoutesHomeUrl(item.children)
  82. } else {
  83. return item.code
  84. }
  85. }
  86. //用户信息初始化
  87. export const initUserConfigInfo = async () => {
  88. const { error, data } = await userConfigInfo()
  89. if (error) return false
  90. const res = getObjValue(data)
  91. if (res?.theme) {
  92. const { theme, color } = res
  93. //设置主题
  94. store.setTheme(theme)
  95. //设置模式
  96. if (theme === 'auto') {
  97. store.setThemeVal(useOsTheme())
  98. } else {
  99. store.setThemeVal(theme)
  100. }
  101. //获取主色调和首页主题数据
  102. let themeColor = themeData.color
  103. let colorIndex = arrIndex(themeColor, 'name', color)
  104. //设置主色调
  105. if (colorIndex !== -1) {
  106. store.setColor(themeColor[colorIndex])
  107. }
  108. return true
  109. } else {
  110. await userConfigSave({
  111. theme: appConfig?.theme || '',
  112. color: appConfig?.color?.name || '',
  113. })
  114. return true
  115. }
  116. }
  117. //设置路由信息
  118. export const setRouterData = async () => {
  119. //请求接口,获取路由数据
  120. const { error, data } = await getRoutes()
  121. if (error) return []
  122. const resData = getArrValue(data)
  123. //数据转换
  124. let routesObj = {}, routesArr = []
  125. await ArrToOneObj(resData, 'code', routesObj, routesArr)
  126. const routes = [...tokenData, ...routesArr] //合并
  127. //数据缓存
  128. store.setMenus(resData)
  129. setStoreValue('route', routesObj)
  130. setStoreValue('routes', routes)
  131. setStoreValue('routesArr', routesArr)
  132. return resData
  133. }
  134. //刷新token
  135. export const RefreshToken = async () => {
  136. try {
  137. window.console.log('刷新 token')
  138. const { dept_id, role_id } = store.getUserInfo
  139. const refresh = store.getRefreshToken
  140. const tenantId = store.getTenantId
  141. const { error, code, res } = await refreshToken(refresh, tenantId, dept_id, role_id)
  142. if (!error && code === 200) {
  143. store.setTokenVal(res['access_token'])
  144. store.setRefreshTokenVal(res['refresh_token'])
  145. store.setTenantId(res['tenant_id'])
  146. store.setUserInfo(res)
  147. return Promise.resolve(res)
  148. } else {
  149. return Promise.reject(res)
  150. }
  151. } catch (e) {
  152. window.console.warn('token 刷新失败: ', e)
  153. return Promise.reject(e)
  154. }
  155. }
  156. //登出
  157. export const LogOut = async () => {
  158. return await logout()
  159. }