图书馆小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.5 KiB

2 weeks ago
  1. import { login } from 'api/user';
  2. const STORAGE_KEY = 'user-info';
  3. const TOKEN_KEY = 'token';
  4. export default {
  5. namespaced: true,
  6. state: () => {
  7. return {
  8. // 用户 token
  9. token: uni.getStorageSync(TOKEN_KEY) || '',
  10. // 用户信息
  11. userInfo: uni.getStorageSync(STORAGE_KEY) || {}
  12. };
  13. },
  14. mutations: {
  15. /**
  16. * 保存 token vuex
  17. */
  18. setToken(state, token) {
  19. state.token = token;
  20. this.commit('user/saveToken');
  21. },
  22. /**
  23. * 保存 token 本地存储
  24. */
  25. saveToken(state) {
  26. uni.setStorage({
  27. key: TOKEN_KEY,
  28. data: state.token
  29. });
  30. },
  31. /**
  32. * 删除 token
  33. */
  34. removeToken(state) {
  35. state.token = '';
  36. this.commit('user/saveToken');
  37. },
  38. /**
  39. * 保存 用户信息 vuex
  40. */
  41. setUserInfo(state, userInfo) {
  42. state.userInfo = userInfo;
  43. this.commit('user/saveUserInfo');
  44. },
  45. /**
  46. * 保存 用户信息 本地存储
  47. */
  48. saveUserInfo(state) {
  49. uni.setStorage({
  50. key: STORAGE_KEY,
  51. data: state.userInfo
  52. });
  53. },
  54. /**
  55. * 删除用户信息
  56. */
  57. removeUserInfo(state) {
  58. state.userInfo = {};
  59. this.commit('user/saveUserInfo');
  60. }
  61. },
  62. actions: {
  63. /**
  64. * 完成登录
  65. */
  66. async login(context, userProfile) {
  67. // 用户数据
  68. const rawData = JSON.parse(userProfile.rawData);
  69. const { data: res } = await login({
  70. signature: userProfile.signature,
  71. iv: userProfile.iv,
  72. nickName: rawData.nickName,
  73. gender: rawData.gender,
  74. city: rawData.city,
  75. province: rawData.province,
  76. avatarUrl: rawData.avatarUrl
  77. });
  78. // 登录逻辑
  79. this.commit('user/setToken', res.token);
  80. this.commit('user/setUserInfo', JSON.parse(userProfile.rawData));
  81. },
  82. /**
  83. * 退出登录
  84. */
  85. logout(context) {
  86. this.commit('user/removeToken');
  87. this.commit('user/removeUserInfo');
  88. },
  89. /**
  90. * 进行登录判定
  91. */
  92. async isLogin(context) {
  93. if (context.state.token) return true;
  94. // 如果用户未登录,则引导用户进入登录页面
  95. const [error, res] = await uni.showModal({
  96. title: '登录之后才可以进行后续操作',
  97. content: '立即跳转到登录页面?(登录后回自动返回当前页面哦~~~)'
  98. });
  99. const { cancel, confirm } = res;
  100. if (confirm) {
  101. uni.navigateTo({
  102. url: '/subpkg/pages/login-page/login-page'
  103. });
  104. }
  105. return false;
  106. }
  107. }
  108. };