Request.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. import {
  2. requestEncode,
  3. responseDecode
  4. } from "./ProtoMap";
  5. import { NoTokenServants } from './../API/ProtoConfig';
  6. import { BASEURL } from "../API/Constant";
  7. /**
  8. * 超过N天就直接重新登录吧
  9. */
  10. const TOKEN_TIMEOUT = 1000*60*60*24*15
  11. //这个path需要token
  12. const PATH = 'Ohplay/Web/HttpToTcp';
  13. //这个path不需要token
  14. const PATH1 = 'ohplay/Web/HttpToTcp';
  15. let token = "";
  16. /**
  17. * 保存token和uid
  18. * @param {string} Token
  19. * @param {number} uid
  20. */
  21. function saveToken(Token, uid) {
  22. token = Token
  23. getApp().globalData.uid = uid
  24. // 缓存token
  25. uni.setStorage({
  26. key: 'token',
  27. data: {
  28. token,
  29. time:new Date().getTime(),
  30. },
  31. });
  32. uni.setStorage({
  33. key: 'uid',
  34. data: uid
  35. })
  36. uni.$emit('user_getUid',{uid,token})
  37. }
  38. // 登录
  39. function login() {
  40. uni.login({
  41. provider: 'weixin',
  42. success: function (loginRes) {
  43. console.log(`uni.login errMsg = ${loginRes.errMsg}`)
  44. if (loginRes.code) {
  45. const data = {
  46. server: 2,
  47. servant: 10005,
  48. data: {
  49. code: loginRes.code,
  50. }
  51. }
  52. request(data).then((res) => {
  53. // console.log(res)
  54. if (res.code === 0) {
  55. if (res.data.token && res.data.id) {
  56. //保存token
  57. saveToken(res.data.token,res.data.id)
  58. } else {
  59. //进入登录页面
  60. gotoLoginPage()
  61. }
  62. return;
  63. };
  64. uni.showToast({
  65. title: res.msg,
  66. duration: 2000,
  67. icon: "none"
  68. });
  69. }).catch((res) => {
  70. console.log("catch")
  71. console.log(res);
  72. });
  73. } else {
  74. uni.showToast({
  75. title: loginRes.errMsg,
  76. duration: 2000,
  77. icon: "none"
  78. });
  79. }
  80. }
  81. });
  82. // return res
  83. };
  84. // 获取token
  85. function getToken() {
  86. try {
  87. const value = uni.getStorageSync('token');
  88. const uid = uni.getStorageInfoSync('uid');
  89. if (value && uid) {
  90. const nowTime = new Date().getTime();
  91. //token超时则重新登录
  92. if(nowTime - value.time > TOKEN_TIMEOUT){
  93. //清除token和uid
  94. cleanUserInfo();
  95. login()
  96. }else{
  97. token = value;
  98. getApp().globalData.uid = uid
  99. }
  100. } else {
  101. login();
  102. }
  103. } catch (e) {
  104. login();
  105. }
  106. }
  107. function cleanUserInfo(){
  108. try{
  109. uni.removeStorageSync('token')
  110. uni.removeStorageSync('uid')
  111. getApp().globalData.uid = null
  112. token = ''
  113. }catch(e){
  114. }
  115. }
  116. function gotoLoginPage(){
  117. uni.navigateTo({
  118. url: '../../pages/login/login',
  119. complete(res){
  120. console.log(res);
  121. }
  122. })
  123. }
  124. // 获取token
  125. //getToken();
  126. // login();
  127. const defaultHeader = {
  128. "X-Requested-With": "XMLHttpRequest",
  129. "Content-Type": "application/x-protobuf",
  130. }
  131. // 拦截器
  132. uni.addInterceptor('request', {
  133. invoke(args) {
  134. // request 触发前拼接 url
  135. //args.url = BASEURL;
  136. if (token) {
  137. args.header.token = token;
  138. };
  139. },
  140. success(args) {
  141. // 请求成功后
  142. },
  143. fail(err) {
  144. console.log('interceptor-fail', err)
  145. },
  146. complete(res) {
  147. console.log('interceptor-complete', res)
  148. }
  149. })
  150. /**
  151. * POST请求
  152. * @param {*} request
  153. * @returns
  154. */
  155. function request(data, type = "POST", header = defaultHeader) {
  156. let url = BASEURL + PATH
  157. if (NoTokenServants.indexOf(data.servant) >= 0) {
  158. url = BASEURL + PATH1
  159. }
  160. return new Promise((resolve, reject) => {
  161. uni.request({
  162. url,
  163. header: header,
  164. method: type,
  165. timeout: 15000,
  166. dataType: 'protobuf',
  167. responseType: 'TEXT',
  168. data: requestEncode(data)
  169. }).then((res) => {
  170. res.map((response) => {
  171. if (response && response.statusCode === 200) {
  172. try {
  173. let resJson = JSON.parse(response.data);
  174. if (resJson.code === 0) {
  175. let arrayBuffer = Buffer.from(resJson.data, 'base64');
  176. let data = responseDecode(arrayBuffer);
  177. let code = 0;
  178. let msg = "success";
  179. if (typeof data.errInfo !== 'undefined') {
  180. code = data.errInfo.errorCode;
  181. if (typeof data.errInfo.errorMessage === 'string') {
  182. msg = data.errInfo.errorMessage;
  183. } else {
  184. msg = Buffer.from(data.errInfo.errorMessage).toString();
  185. };
  186. };
  187. resolve({
  188. data,
  189. code,
  190. msg
  191. });
  192. } else {
  193. if (resJson.code === 10004) {
  194. uni.showModal({
  195. title: '温馨提示',
  196. content: 'token已失效,请重新登录',
  197. showCancel: false,
  198. success() {
  199. //进入登录界面
  200. gotoLoginPage()
  201. }
  202. })
  203. }
  204. resolve({
  205. code: resJson.code,
  206. msg: resJson.info
  207. });
  208. }
  209. } catch (e) {
  210. resolve({
  211. code: -1,
  212. msg: e.toString(),
  213. });
  214. }
  215. return;
  216. };
  217. // 没有数据或者返回错误
  218. // resolve({
  219. // code: 1006,
  220. // msg: "数据错误",
  221. // });
  222. })
  223. }).catch((error) => {
  224. let [err, res] = error;
  225. reject(err);
  226. })
  227. })
  228. }
  229. module.exports = { request, saveToken,getToken };