user.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import api from './appOnLaunch.js';
  2. import event from './event.js';
  3. import $const from './const.js';
  4. import $store from '../store/index.js';
  5. import Vue from 'vue';
  6. const storageKey = '_USER_ACCESS_TOKEN';
  7. let userInfo = null;
  8. export default {
  9. getUserInfoResolve: null,
  10. getUserInfoReject: null,
  11. getAccessToken(options) {
  12. options = options || {};
  13. if (typeof options.cacheOnly === 'undefined') {
  14. options.cacheOnly = false;
  15. }
  16. return new Promise((resolve, reject) => {
  17. let accessToken = Vue.prototype.$storage.getStorageSync(storageKey);
  18. if (accessToken) {
  19. return resolve(accessToken);
  20. }
  21. if (options.cacheOnly) {
  22. return resolve(accessToken);
  23. }
  24. const pages = getCurrentPages();
  25. const currentPage = pages[pages.length - 1];
  26. currentPage.$vm.$store.commit('user/showLoginModal', true);
  27. this.getUserInfoResolve = (userInfoResult) => {
  28. uni.showLoading({
  29. mask: true,
  30. title: '正在登录',
  31. });
  32. uni.login({
  33. scopes: 'auth_base',
  34. success(loginResult) {
  35. const data = {
  36. encryptedData: userInfoResult.detail.encryptedData,
  37. iv: userInfoResult.detail.iv,
  38. rawData: userInfoResult.detail.rawData,
  39. signature: userInfoResult.detail.signature,
  40. code: loginResult.code,
  41. };
  42. Vue.prototype.$request({
  43. url: api.passport.login,
  44. method: 'post',
  45. data: data,
  46. }).then(response => {
  47. uni.hideLoading();
  48. if (response.code === 0) {
  49. event.trigger($const.EVENT_USER_LOGIN);
  50. Vue.prototype.$storage.setStorageSync(storageKey, response.data.access_token);
  51. return resolve(response.data.access_token);
  52. } else {
  53. return reject(response.msg);
  54. }
  55. }).catch(e => {
  56. uni.hideLoading();
  57. reject(e);
  58. });
  59. },
  60. fail(error) {
  61. reject(error);
  62. }
  63. });
  64. };
  65. this.getUserInfoReject = (e) => {
  66. reject(e);
  67. };
  68. });
  69. },
  70. getInfo(options) {
  71. options = options || {};
  72. if (typeof options.refresh === 'undefined') {
  73. options.refresh = false;
  74. }
  75. return new Promise((resolve, reject) => {
  76. if (options.refresh) {
  77. userInfo = null;
  78. }
  79. if (userInfo) {
  80. return resolve(userInfo);
  81. }
  82. this.getAccessToken().then(accessToken => {
  83. uni.showNavigationBarLoading();
  84. Vue.prototype.$request({
  85. url: api.user.user_info,
  86. }).then(response => {
  87. uni.hideNavigationBarLoading();
  88. if (response.code === 0) {
  89. let platform = response.data.platform;
  90. // #ifdef H5
  91. if (Vue.prototype.$jwx.isWechat() && platform === 'wxapp_wechat') {
  92. platform = 'wechat';
  93. }
  94. // #endif
  95. Vue.prototype.$storage.setStorageSync('platform', platform);
  96. userInfo = JSON.parse(JSON.stringify(response.data));
  97. event.trigger($const.EVENT_USER_REGISTER, userInfo);
  98. if (typeof userInfo.register !== 'undefined') {
  99. let register = userInfo.register;
  100. if (register.coupon_list) {
  101. let coupon = {
  102. list: register.coupon_list,
  103. type: 'register'
  104. };
  105. $store.dispatch('page/actionSetCoupon', coupon);
  106. }
  107. }
  108. return resolve(userInfo);
  109. } else {
  110. return reject(response.msg);
  111. }
  112. }).catch(e => {
  113. uni.hideNavigationBarLoading();
  114. return reject(e);
  115. });
  116. }).catch(e => {
  117. return reject(e);
  118. });
  119. });
  120. },
  121. isLogin() {
  122. if ($store && $store.state.user && $store.state.user.accessToken) return true;
  123. return !!Vue.prototype.$storage.getStorageSync(storageKey);
  124. },
  125. loginByToken(token) {
  126. Vue.prototype.$storage.setStorageSync(storageKey, token);
  127. },
  128. silentLogin() {
  129. // #ifdef MP-WIXIN
  130. uni.login({
  131. success: function (loginRes) {
  132. Vue.prototype.$request({
  133. url: api.passport.login,
  134. method: 'post',
  135. data: {
  136. code: loginRes.code
  137. },
  138. }).then(response => {
  139. if (response.code === 0) {
  140. Vue.prototype.$storage.setStorageSync(storageKey, response.data.access_token);
  141. }
  142. });
  143. }
  144. });
  145. // #endif
  146. // #ifdef H5
  147. let params = Vue.prototype.$utils.getUrlParam('code');
  148. if (!params) {
  149. Vue.prototype.$request({
  150. url: Vue.prototype.$api.registered.url,
  151. method: 'get',
  152. data: {
  153. scope: 'snsapi_base',
  154. response_type: 'code',
  155. url: `${window.location.href}`
  156. }
  157. }).then(res => {
  158. if (res.code === 0) {
  159. Vue.prototype.$storage.setStorageSync('_USER_SIGN', true);
  160. window.location.href = res.data.url;
  161. } else {
  162. Vue.prototype.$storage.setStorageSync('isSign', true);
  163. }
  164. });
  165. }
  166. // #endif
  167. }
  168. }