Http.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. class HTTP {
  2. constructor() {
  3. this.urls = [{
  4. name: '正式',
  5. url: "https://crm.meida.com:16691"
  6. }, {
  7. name: '8300',
  8. url: "http://61.164.207.46:8300"
  9. }];
  10. this.updateList = (content, getList) => {
  11. content.copyContent = JSON.parse(JSON.stringify(content));
  12. content.pageSize = (content.pageNumber - 1) * (content.pageSize || 20); // 确保pageSize存在
  13. content.pageNumber = 1;
  14. getList()
  15. }
  16. this.formatNumber = (num, decimalPlaces = 2) => {
  17. if (!num && num !== 0) return '';
  18. let [integer, decimal] = String(num.toFixed(decimalPlaces)).split('.');
  19. integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  20. return decimal ? `${integer}.${decimal}` : integer;
  21. }
  22. //得到缩略图或者压缩图 getType默认得到缩略图传true得到压缩图
  23. this.getSpecifiedImage = (obj, getType = false) => {
  24. obj.url = this.getImageUrl(obj.url)
  25. try {
  26. let type = getType ? 'compressed' : 'thumbnail';
  27. let imgObj = obj.subfiles.find(v => v.type == type);
  28. return this.getImageUrl(imgObj.url || obj.url);
  29. } catch (error) {
  30. return this.getImageUrl(obj.url);
  31. }
  32. }
  33. // 判断图片是本地还是云存储
  34. this.getImageUrl = (url) => {
  35. if (!url) return '';
  36. //判断url中是否存在http,没有的话要拼接 this.baseUrl
  37. if (!/^https?:\/\//.test(url)) {
  38. url = this.baseUrl + url
  39. }
  40. return url;
  41. }
  42. if (process.env.NODE_ENV === 'development') {
  43. this.baseUrl = this.urls[0].url;
  44. } else {
  45. this.baseUrl = this.urls[0].url;
  46. }
  47. // 从本地存储加载JSESSIONID
  48. this.jsessionid = uni.getStorageSync('JSESSIONID') || '';
  49. console.log("接口地址", this.baseUrl);
  50. }
  51. request({
  52. url = "",
  53. data = {},
  54. method = "POST",
  55. header = {
  56. 'content-type': 'application/json',
  57. "accesstoken": data.accesstoken || uni.getStorageSync('userMsg')?.token || '',
  58. // 添加Cookie字段
  59. "Cookie": `JSESSIONID=${this.jsessionid}`
  60. },
  61. suffix = '/yos/rest'
  62. }) {
  63. // 如果data.content.pageNumber存在但pageTotal不存在,则设置pageTotal为1
  64. // 如果pageNumber大于pageTotal,则直接返回空结果
  65. // 在接口中拿到的pageNumber自动加1,目的是在这里直接处理分页逻辑
  66. try {
  67. if (data.content.pageNumber) {
  68. if (data.content.pageNumber > data.content.pageTotal) return new Promise((resolve) => resolve({ code: 0 }));;
  69. }
  70. } catch (error) { }
  71. return new Promise((resolve, reject) => {
  72. this._request((suffix == '/yos/rest' ? this.baseUrl : "") + suffix + url, resolve, reject, data, method, header);
  73. })
  74. }
  75. getRequest({
  76. url,
  77. method = "GET",
  78. header = {
  79. "Cookie": `JSESSIONID=${this.jsessionid}`
  80. }
  81. }) {
  82. return new Promise((resolve, reject) => {
  83. this._request(url, resolve, reject, {}, method, header);
  84. })
  85. }
  86. _request(url, resolve, reject, data, method, header, showLoading) {
  87. if (showLoading) uni.showLoading({
  88. title: showLoading,
  89. mask: true
  90. });
  91. uni.request({
  92. url,
  93. data: data,
  94. method: method,
  95. header: header,
  96. timeout: 60000,
  97. success: (res) => {
  98. // 提取并保存JSESSIONID
  99. this._handleSessionCookies(res);
  100. try {
  101. if (res.data.pageNumber) {
  102. res.data.firstPage = res.data.pageNumber === 1; // 判断是否为第一页
  103. if (data.content.copyContent) {
  104. res.data.pageNumber = data.content.copyContent.pageNumber;
  105. res.data.pageTotal = data.content.copyContent.pageTotal;
  106. data.content.pageSize = data.content.copyContent.pageSize;
  107. delete data.content.copyContent
  108. } else {
  109. res.data.pageNumber++
  110. }
  111. }
  112. } catch (error) {
  113. }
  114. resolve(res.data);
  115. },
  116. fail: (err) => {
  117. reject(err);
  118. },
  119. complete: (res) => {
  120. if (showLoading) uni.hideLoading();
  121. // 网络错误处理
  122. if (res.errMsg !== 'request:ok') {
  123. uni.showToast({
  124. title: '网络异常,请稍后再试',
  125. icon: "none"
  126. });
  127. return;
  128. }
  129. // 会话过期处理
  130. if (res.data.msg === '登录凭证已过期,请重新登录!' || res.data.msg == '身份令牌无效,请重新登陆!') {
  131. // 清除过期会话ID
  132. this.jsessionid = '';
  133. uni.removeStorageSync('JSESSIONID');
  134. let currentPages = getCurrentPages()[getCurrentPages().length - 1];
  135. // 如果当前页面不是登录页面,则跳转到登录页面
  136. if (currentPages.route !== 'pages/login/login') {
  137. uni.showModal({
  138. title: '提示',
  139. content: '您的登录状态已过期,请重新登录。',
  140. showCancel: false,
  141. success: () => {
  142. uni.redirectTo({
  143. url: '/pages/login/login',
  144. })
  145. }
  146. });
  147. }
  148. }
  149. }
  150. });
  151. }
  152. // 处理会话Cookie
  153. _handleSessionCookies(res) {
  154. try {
  155. const cookies = res.cookies || [];
  156. const headers = res.header || {};
  157. // 检查响应头中的Set-Cookie
  158. const setCookie = headers['Set-Cookie'] || headers['set-cookie'];
  159. if (setCookie) {
  160. // 将字符串转换为数组
  161. const cookieArray = Array.isArray(setCookie)
  162. ? setCookie
  163. : [setCookie];
  164. cookies.push(...cookieArray);
  165. }
  166. // 查找JSESSIONID
  167. for (const cookie of cookies) {
  168. const match = cookie.match(/JSESSIONID=([^;]+)/i);
  169. if (match && match[1]) {
  170. const newSessionId = match[1];
  171. // 更新JSESSIONID
  172. if (newSessionId !== this.jsessionid) {
  173. this.jsessionid = newSessionId;
  174. uni.removeStorageSync('JSESSIONID');
  175. uni.setStorageSync('JSESSIONID', newSessionId);
  176. }
  177. break;
  178. }
  179. }
  180. } catch (error) {
  181. console.error('处理会话Cookie时出错:', error);
  182. }
  183. }
  184. }
  185. export { HTTP };