user.js 6.3 KB

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