user.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /**
  2. * @description 登录、获取用户信息、退出登录、清除token逻辑,不建议修改
  3. */
  4. import Vue from 'vue'
  5. import userApi from '@/api/system/user'
  6. import { getToken, removeToken, setToken } from '@/utils/token'
  7. import { resetRouter } from '@/router'
  8. import { isArray, isString } from '@/utils/validate'
  9. import { title, tokenName } from '@/config'
  10. const state = () => ({
  11. id: '',
  12. token: getToken(),
  13. username: '游客',
  14. avatar: 'https://i.gtimg.cn/club/item/face/img/2/15922_100.gif',
  15. })
  16. const getters = {
  17. id: (state) => state.id,
  18. token: (state) => state.token,
  19. username: (state) => state.username,
  20. avatar: (state) => state.avatar,
  21. }
  22. const mutations = {
  23. /**
  24. * @description 设置token
  25. * @param {*} state
  26. * @param {*} token
  27. */
  28. setToken(state, token) {
  29. state.token = token
  30. setToken(token)
  31. },
  32. /**
  33. * @description 设置用户名
  34. * @param {*} state
  35. * @param {*} username
  36. */
  37. setUsername(state, username) {
  38. state.username = username
  39. },
  40. setUserId(state, id) {
  41. state.id = id
  42. },
  43. /**
  44. * @description 设置头像
  45. * @param {*} state
  46. * @param {*} avatar
  47. */
  48. setAvatar(state, avatar) {
  49. state.avatar = avatar
  50. },
  51. }
  52. const actions = {
  53. /**
  54. * @description 登录拦截放行时,设置虚拟角色
  55. * @param {*} { commit, dispatch }
  56. */
  57. setVirtualRoles({ commit, dispatch }) {
  58. dispatch('acl/setFull', true, { root: true })
  59. commit('setAvatar', 'https://i.gtimg.cn/club/item/face/img/2/15922_100.gif')
  60. commit('setUsername', 'admin(未开启登录拦截)')
  61. },
  62. /**
  63. * @description 登录
  64. * @param {*} { commit }
  65. * @param {*} userInfo
  66. */
  67. async login({ commit }, userInfo) {
  68. const {
  69. data: { [tokenName]: token },
  70. } = await userApi.login(userInfo)
  71. if (token) {
  72. commit('setToken', token)
  73. const hour = new Date().getHours()
  74. const thisTime =
  75. hour < 8 ? '早上好' : hour <= 11 ? '上午好' : hour <= 13 ? '中午好' : hour < 18 ? '下午好' : '晚上好'
  76. Vue.prototype.$baseNotify(`欢迎登录${title}`, `${thisTime}!`)
  77. } else {
  78. const err = `登录接口异常,未正确返回${tokenName}...`
  79. Vue.prototype.$baseMessage(err, 'error', 'vab-hey-message-error')
  80. throw err
  81. }
  82. },
  83. /**
  84. * @description 获取用户信息接口 这个接口非常非常重要,如果没有明确底层前逻辑禁止修改此方法,错误的修改可能造成整个框架无法正常使用
  85. * @param {*} { commit, dispatch, state }
  86. * @returns
  87. */
  88. async getUserInfo({ commit, dispatch }) {
  89. // const {
  90. // data: { username, avatar, roles, permissions },
  91. // } = await userApi.getUserInfo()
  92. // console.log(username, avatar, roles, permissions)
  93. const res = await userApi.getUserInfo()
  94. const userId = res.data.entity.id
  95. const username = res.data.entity.userName
  96. const avatar = res.data.entity.avatar
  97. let roles
  98. let permissions
  99. /**
  100. * 检验返回数据是否正常,无对应参数,将使用默认用户名,头像,Roles和Permissions
  101. * username {String}
  102. * avatar {String}
  103. * roles {List}
  104. * ability {List}
  105. */
  106. if (
  107. (username && !isString(username)) ||
  108. (avatar && !isString(avatar)) ||
  109. (roles && !isArray(roles)) ||
  110. (permissions && !isArray(permissions))
  111. ) {
  112. const err = 'getUserInfo核心接口异常,请检查返回JSON格式是否正确'
  113. Vue.prototype.$baseMessage(err, 'error', 'vab-hey-message-error')
  114. throw err
  115. } else {
  116. // 如不使用username用户名,可删除以下代码
  117. if (userId) commit('setUserId', userId)
  118. // 如不使用username用户名,可删除以下代码
  119. if (username) commit('setUsername', username)
  120. // 如不使用avatar头像,可删除以下代码
  121. if (avatar) commit('setAvatar', avatar)
  122. // 如不使用roles权限控制,可删除以下代码
  123. if (roles) dispatch('acl/setRole', roles, { root: true })
  124. // 如不使用permissions权限控制,可删除以下代码
  125. if (permissions) dispatch('acl/setPermission', permissions, { root: true })
  126. }
  127. },
  128. /**
  129. * @description 退出登录
  130. * @param {*} { dispatch }
  131. */
  132. async logout({ dispatch }) {
  133. await userApi.logout()
  134. await dispatch('resetAll')
  135. },
  136. /**
  137. * @description 重置token、roles、permission、router、tabsBar等
  138. * @param {*} { commit, dispatch }
  139. */
  140. async resetAll({ commit, dispatch }) {
  141. commit('setUsername', '游客')
  142. commit('setAvatar', 'https://i.gtimg.cn/club/item/face/img/2/15922_100.gif')
  143. commit('routes/setRoutes', [], { root: true })
  144. await dispatch('setToken', '')
  145. await dispatch('acl/setFull', false, { root: true })
  146. await dispatch('acl/setRole', [], { root: true })
  147. await dispatch('acl/setPermission', [], { root: true })
  148. await dispatch('tabs/delAllVisitedRoutes', null, { root: true })
  149. await resetRouter()
  150. removeToken()
  151. },
  152. /**
  153. * @description 设置token
  154. * @param {*} { commit }
  155. * @param {*} token
  156. */
  157. setToken({ commit }, token) {
  158. commit('setToken', token)
  159. },
  160. /**
  161. * @description 设置头像
  162. * @param {*} { commit }
  163. * @param {*} avatar
  164. */
  165. setAvatar({ commit }, avatar) {
  166. commit('setAvatar', avatar)
  167. },
  168. }
  169. export default { state, getters, mutations, actions }