user.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { getInfo, login, logout } from '@/api/login'
  2. import auth from '@/utils/auth'
  3. import Vue from 'vue'
  4. import cacheMixin from '@/components/Cache/mx-cache-mixin'
  5. import { MessageBox } from 'element-ui'
  6. import router from '@/router'
  7. const user = {
  8. state: auth.getUserInfo(),
  9. mutations: {
  10. RELOAD: (state, newInfo) => {
  11. console.log('RELOAD - build user reactive features', state, newInfo)
  12. Object.keys(newInfo).forEach(key => {
  13. if (!state.hasOwnProperty(key)) {
  14. // NOTE:使用Vue.set动态添加监控属性
  15. Vue.set(state, key, newInfo[key])
  16. }
  17. state[key] = newInfo[key]
  18. })
  19. }
  20. },
  21. actions: {
  22. // 登录
  23. Login({ dispatch, commit, state }, userInfo) {
  24. const username = userInfo.username.trim()
  25. const password = userInfo.password
  26. return new Promise((resolve, reject) => {
  27. login(username, password).then(res => {
  28. auth.setToken(res.token)
  29. // 登陆后强制更新Info
  30. return dispatch('GetInfo')
  31. }).then(res => {
  32. // 登陆后强制更新routes
  33. return dispatch('CheckRoutes', true)
  34. }).then(_ => {
  35. resolve(state.user)
  36. }).catch(error => {
  37. reject(error)
  38. })
  39. })
  40. },
  41. // 获取用户信息
  42. GetInfo({ commit, state }) {
  43. return new Promise((resolve, reject) => {
  44. getInfo().then(res => {
  45. const user = res.data
  46. user.avatar = user.avatar || require('@/assets/images/profile.png')
  47. user.token = auth.getToken() // 这样就可以让token具有响应性(reactive)
  48. commit('RELOAD', user)
  49. auth.setUserInfo(user)
  50. cacheMixin.methods.clearUserCache() // NOTE:纯作为静态方法在调用,有更优雅的方式?
  51. resolve(res)
  52. }).catch(error => {
  53. reject(error)
  54. })
  55. })
  56. },
  57. // 退出系统
  58. LogOut({ dispatch, commit, state }) {
  59. return MessageBox.confirm('确定注销并退出系统吗?', '提示', {
  60. confirmButtonText: '确定',
  61. cancelButtonText: '取消',
  62. type: 'warning'
  63. }).then(_ => {
  64. return logout()
  65. }).then(_ => {
  66. // 清除token,清除真正的登陆状态判定数据
  67. auth.removeToken()
  68. state.token = ''
  69. // 清除routers缓存,则路由劫持事件会根据状态,重新加载路由
  70. dispatch('CheckRoutes', true)
  71. return router.push('/')
  72. })
  73. }
  74. }
  75. }
  76. export default user