interceptors.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /**
  2. * 功能:http拦截
  3. * 作者:小莫唐尼
  4. * 邮箱:studio@925i.cn
  5. * 时间:2022年07月21日 19:02:14
  6. * 版本:v0.1.0
  7. * 修改记录:
  8. * 修改内容:
  9. * 修改人员:
  10. * 修改时间:
  11. */
  12. import {
  13. getAdminAccessToken
  14. } from "@/utils/auth.js";
  15. import {
  16. delCache,
  17. setCache
  18. } from "@/utils/storage";
  19. const getCategoryNameByUrl = (url) => {
  20. const reg = '(?<=/api/content/categories/).+(?=/posts)'
  21. return url.match(reg)[0] || '无分类名'
  22. }
  23. const showCategoryInputPasswordModal = (response, category) => {
  24. uni.showModal({
  25. title: `[ ${category} ] 分类已加密`, // TODO 这里应该获取分类的名字,可以在弹窗之前请求后台拿到所有分类根据分类code拿到名称,但是不会在这之前发送请求
  26. content: '',
  27. editable: true,
  28. placeholderText: '请输入分类密码后访问',
  29. confirmText: '验证密码',
  30. cancelText: '暂不访问',
  31. showCancel: true,
  32. cancelColor: '#999999',
  33. confirmColor: '#03a9f4',
  34. success: (res) => {
  35. if (res.confirm) {
  36. // TODO 这里如果没有输入密码点击确认应该阻止窗口关闭,但是没找到方法
  37. if (!res.content) {
  38. uni.showToast({
  39. title: '提示:请输入密码',
  40. icon: 'none',
  41. success: () => {
  42. setTimeout(() => {
  43. showCategoryInputPasswordModal(response, category);
  44. }, 800)
  45. }
  46. })
  47. return;
  48. }
  49. // 根据请求URL正则匹配分类code,然后把输入的密码根据分类code放入缓存,然后在category.getCategoryPostList中获取,解决多个分类加密输入密码后点错的问题
  50. // 目前存在一个问题,比如前两个都需要密码,如果先输入第二个的密码之后,重新进来默认打开第一个还会弹窗,所以想在弹窗标题上增加分类名字
  51. // 另外有以下两种方式科技解决
  52. // TODO 1.其实这里获取到密码之后可以直接发送一个请求追加上password参数,因为后台会缓存权限,后续不输入密码也可以访问,可惜不会
  53. // TODO 2.另外也可以拿到密码之后,直接选中该分类追加password参数,重新请求,可惜也不会
  54. setCache('APP_CATEGORY_PWD_' + category, res.content)
  55. uni.reLaunch({
  56. url: '/pages/tabbar/category/category'
  57. });
  58. } else if (res.cancel) {}
  59. },
  60. })
  61. }
  62. export const setInterceptors = (http) => {
  63. http.interceptors.request.use(
  64. (config) => {
  65. console.log("config", config)
  66. // 可使用async await 做异步操作
  67. config.header = {
  68. ...config.header
  69. // ... 可以直接加参数
  70. };
  71. if (config.custom.systemToken) {
  72. config.header['Authorization'] = `Bearer ${config.custom.systemToken}`
  73. }
  74. return config;
  75. },
  76. (config) => {
  77. // 可使用async await 做异步操作
  78. return Promise.reject(config);
  79. }
  80. );
  81. http.interceptors.response.use(
  82. (response) => {
  83. /* 对响应成功做点什么 可使用async await 做异步操作*/
  84. // if (response.data.code !== 200) { // 服务端返回的状态码不等于200,则reject()
  85. // return Promise.reject(response) // return Promise.reject 可使promise状态进入catch
  86. // if (response.config.custom.verification) { // 演示自定义参数的作用
  87. // return response.data
  88. // }
  89. if (response.statusCode == 200) {
  90. return response.data;
  91. } else {
  92. return Promise.reject(response);
  93. }
  94. },
  95. (response) => {
  96. /* 对响应错误做点什么 (statusCode !== 200)*/
  97. if (!response.data) {
  98. return Promise.reject({
  99. status: 500,
  100. message: 'API接口服务异常!'
  101. })
  102. } else if (response.data.status == 401) {
  103. uni.$tm.toast(response.data.message);
  104. // 如果是请求分类之后报401说明密码错误,那么清除该密码,下次点击会报403弹窗再次输入密码
  105. if (response.config.url.indexOf('/api/content/categories') >= 0) {
  106. const category = getCategoryNameByUrl(response.config.url)
  107. delCache('APP_CATEGORY_PWD_' + category);
  108. uni.showToast({
  109. title: '提示:密码不正确',
  110. icon: 'none',
  111. success: () => {
  112. setTimeout(() => {
  113. showCategoryInputPasswordModal(response, category);
  114. }, 800)
  115. }
  116. })
  117. } else {
  118. // 其他情况维持原来的逻辑
  119. delCache('APP_ADMIN_LOGIN_TOKEN');
  120. uni.$eShowModal({
  121. title: '提示',
  122. content: '您未登录超管账号或登录已过期,是否重新登录?',
  123. showCancel: true,
  124. cancelText: '否',
  125. cancelColor: '#999999',
  126. confirmText: '是',
  127. confirmColor: '#03a9f4'
  128. }).then(res => {
  129. uni.navigateTo({
  130. url: '/pagesB/login/login'
  131. })
  132. }).catch(err => {
  133. uni.switchTab({
  134. url: '/pages/tabbar/about/about'
  135. })
  136. })
  137. }
  138. return Promise.reject(response.data);
  139. } else if (response.data.status == 403) {
  140. // 如果报403是请求分类文章接口(您没有该分类的访问权限)的话说明是私密分类,需要输入密码请求
  141. if (response.config.url.indexOf('/api/content/categories') >= 0) {
  142. const category = getCategoryNameByUrl(response.config.url);
  143. showCategoryInputPasswordModal(response, category);
  144. }
  145. return Promise.reject(response.data);
  146. } else {
  147. return Promise.reject(response.data);
  148. }
  149. }
  150. );
  151. };