main.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import store from '../../store' // 状态管理
  2. import {
  3. encodeRedirectUrl
  4. } from '../../common/util.js'
  5. import Request from './request.js'
  6. import Config from '../config.js'
  7. import {
  8. wechatAutoLogin
  9. } from '../api/user.js';
  10. export const http = new Request();
  11. // 设置全局配置
  12. http.setConfig((config) => {
  13. config.baseUrl = Config.baseUrl;
  14. config.header = {
  15. 'Content-Type': 'application/json;charset=UTF-8'
  16. };
  17. return config
  18. })
  19. // 请求之前拦截器
  20. http.interceptor.beforeRequest((config, cancel) => {
  21. // console.log('请求前拦截', config.url, config)
  22. // 登录校验
  23. let accessToken = store.getters.accessToken;
  24. let activityId = store.getters.activityId;
  25. // console.log('get.accessToken', accessToken, activityId);
  26. if (!config.muteLogin) {
  27. if (!accessToken) {
  28. console.error('needLogin request');
  29. cancel('登录过期,尝试重试'); // 取消请求
  30. console.info('needLogin request', 'silentReload');
  31. silentReload(config.curd === 'save');
  32. return;
  33. }
  34. config.header['token'] = accessToken;
  35. // config.url += '?token=' + accessToken;
  36. // config.header['Cookie'] = 'token=' + accessToken; // uploadFile时,不能传header,慎用这种方式
  37. }
  38. config.url += (config.url.indexOf('?') === -1 ? '?' : '&') + 'activity_id=' + activityId;
  39. return config;
  40. })
  41. // 请求之后拦截器
  42. http.interceptor.afterRequest((response) => {
  43. // console.log('请求后拦截', response);
  44. // 系统错误
  45. if (response.statusCode === 500) {
  46. console.error('系统错误');
  47. setTimeout(() => {
  48. uni.showToast({
  49. title: '系统错误',
  50. icon: 'none',
  51. mask: true,
  52. duration: 2000
  53. })
  54. }, 50);
  55. return [response];
  56. }
  57. let data = response.data;
  58. // 网络错误
  59. if (!data) {
  60. console.error('网络错误');
  61. setTimeout(() => {
  62. uni.showToast({
  63. title: '网络错误',
  64. icon: 'none',
  65. mask: true,
  66. duration: 2000
  67. })
  68. }, 50)
  69. return [response];
  70. }
  71. if (typeof data === 'string') {
  72. data = JSON.parse(data)
  73. }
  74. // 正常请求
  75. if (data.code === 1) {
  76. return [0, data.data || data.msg];
  77. }
  78. // 系统错误
  79. console.warn('invalid request', data.msg);
  80. switch (data.code) {
  81. case 401: // 认证失败
  82. console.error('needLogin 401');
  83. store.commit('delAccessToken'); // 删除token
  84. console.info('needLogin 401', 'silentReload');
  85. silentReload(response.config.curd === 'save');
  86. break;
  87. case 402: // 小程序自动登录失败
  88. break;
  89. default: // 错误提示
  90. setTimeout(() => {
  91. uni.showToast({
  92. title: data.msg || '网络错误',
  93. icon: 'none',
  94. mask: true,
  95. duration: 2000
  96. })
  97. }, 50)
  98. if (data.code === 403) { // 活动无效
  99. store.commit('delAccessToken'); // 删除token
  100. store.commit('delActivityId'); // 删除活动ID
  101. smartLogin('');
  102. }
  103. break;
  104. }
  105. return [response];
  106. })
  107. /**
  108. * 获取 login code
  109. */
  110. export function silentReload(warning = false, redirectUrl = null) {
  111. if (warning) {
  112. setTimeout(() => {
  113. uni.showToast({
  114. title: '鉴权失败,请重新操作',
  115. icon: 'none',
  116. mask: true,
  117. duration: 2000
  118. })
  119. }, 50)
  120. return false
  121. }
  122. if (store.getters.isLock('silentReload')) {
  123. return false
  124. }
  125. console.info('needLogin silentReload')
  126. store.commit('lock', 'silentReload')
  127. if (redirectUrl === null) {
  128. const pages = getCurrentPages()
  129. const currentPage = pages[pages.length - 1]
  130. redirectUrl = encodeRedirectUrl(currentPage.route, currentPage.options)
  131. }
  132. // #ifdef MP-WEIXIN
  133. // 微信小程序自动登录
  134. uni.reLaunch({
  135. url: '/pages/user/login?redirect=' + redirectUrl
  136. })
  137. /* #endif */
  138. // #ifdef H5
  139. // 跳到登录页面或活动列表页
  140. smartLogin(redirectUrl)
  141. /* #endif */
  142. return true
  143. }
  144. /**
  145. * 获取 login code
  146. */
  147. export function smartLogin(redirectUrl, loginCheck) {
  148. if (store.getters.activityId) { // 有缓存的活动ID
  149. if (!loginCheck) {
  150. // 直接到登录页面
  151. uni.reLaunch({
  152. url: '/pages/user/login?redirect=' + redirectUrl
  153. })
  154. }
  155. return true;
  156. }
  157. const globalConfig = store.getters.globalConfig
  158. // 配置未正确加载
  159. if (!globalConfig) {
  160. setTimeout(() => {
  161. uni.showToast({
  162. title: '数据加载失败,请点击右上角“重新进入小程序“',
  163. icon: 'none',
  164. mask: true,
  165. duration: 2000
  166. })
  167. }, 50)
  168. return true;
  169. }
  170. // 存在默认活动
  171. if (globalConfig.default_activity) {
  172. if (!loginCheck) {
  173. // 直接到登录页面
  174. uni.reLaunch({
  175. url: '/answer_pages/user/login?redirect=' + redirectUrl
  176. })
  177. }
  178. return true;
  179. }
  180. // 可以选择活动
  181. if (globalConfig.select_activity) {
  182. // 直接到活动列表
  183. uni.reLaunch({
  184. url: '/answer_pages/home/dashboard'
  185. })
  186. return true;
  187. }
  188. // 需要扫码进入
  189. setTimeout(() => {
  190. uni.reLaunch({
  191. url: '/answer_pages/user/tips'
  192. })
  193. }, 50)
  194. return true
  195. }
  196. export function getRedirectUrl() {
  197. let redirectUrl = '/pages/home/index'
  198. const pages = getCurrentPages()
  199. const currentPage = pages[pages.length - 1]
  200. if (currentPage) {
  201. if (currentPage.$page) {
  202. redirectUrl = currentPage.$page.fullPath
  203. }
  204. }
  205. return redirectUrl
  206. }