| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- import env from '../config/env.js'
- // Loading 管理器
- const loadingManager = {
- loadingCount: 0,
- loadingTimer: null,
- // 显示 loading
- show(options = {}) {
- const config = {
- title: '加载中...',
- mask: true,
- delay: 300,
- ...options
- }
- // 如果已经有 loading 在显示,只增加计数
- if (this.loadingCount > 0) {
- this.loadingCount++
- return
- }
- // 延迟显示,避免快速请求造成闪烁
- this.loadingTimer = setTimeout(() => {
- if (this.loadingCount > 0) {
- uni.showLoading({
- title: config.title,
- mask: config.mask
- })
- }
- }, config.delay)
- this.loadingCount++
- },
- // 隐藏 loading
- hide() {
- this.loadingCount = Math.max(0, this.loadingCount - 1)
- if (this.loadingCount === 0) {
- // 清除延迟显示的定时器
- if (this.loadingTimer) {
- clearTimeout(this.loadingTimer)
- this.loadingTimer = null
- }
- // 隐藏 loading
- uni.hideLoading()
- }
- },
- // 强制隐藏所有 loading
- forceHide() {
- this.loadingCount = 0
- if (this.loadingTimer) {
- clearTimeout(this.loadingTimer)
- this.loadingTimer = null
- }
- uni.hideLoading()
- }
- }
- const request = {
- async get(url, params = {}, options = {}) {
- return this.request(url, 'GET', params, options)
- },
- async post(url, data = {}, options = {}) {
- return this.request(url, 'POST', data, options)
- },
- async put(url, data = {}, options = {}) {
- return this.request(url, 'PUT', data, options)
- },
- async delete(url, data = {}, options = {}) {
- return this.request(url, 'DELETE', data, options)
- },
-
- async request(url, method, data, options = {}) {
- // 解析 loading 配置
- let loadingConfig
- if (options.loading === false) {
- // 如果明确设置为 false,则不显示 loading
- loadingConfig = false
- } else {
- // 否则使用默认配置并合并用户配置
- loadingConfig = {
- show: true,
- title: '加载中...',
- mask: true,
- delay: 300,
- timeout: 10000,
- ...(typeof options.loading === 'object' ? options.loading : {})
- }
- }
- // 解析请求配置
- const requestConfig = {
- timeout: 15000, // 默认网络超时 15 秒
- ...options.request
- }
- // 如果 loading 配置为 false,则不显示 loading
- const shouldShowLoading = loadingConfig !== false && loadingConfig.show !== false
- // 显示 loading
- if (shouldShowLoading) {
- loadingManager.show(loadingConfig)
- }
- // 获取设备信息
- const deviceInfo = uni.getStorageSync("deviceInfo") || {};
- const sbbs = deviceInfo.deviceId || '';
- const sbmc = deviceInfo.model || '';
- // 处理URL,添加设备参数
- const separator = url.includes('?') ? '&' : '?';
- const finalUrl = `${url}${separator}sbbs=${sbbs}&sbmc=${sbmc}`;
- // 超时处理
- let timeoutTimer = null
- if (shouldShowLoading && loadingConfig.timeout) {
- timeoutTimer = setTimeout(() => {
- loadingManager.hide()
- uni.showToast({
- title: '请求超时',
- icon: 'none'
- })
- }, loadingConfig.timeout)
- }
- // 数据格式转换
- let requestData = data;
- if (options.formData && data && typeof data === 'object') {
- // 转换为表单格式
- requestData = Object.keys(data).map(key => {
- const value = data[key];
- if (Array.isArray(value)) {
- // 数组数据转换为多个同名参数
- return value.map(item => `${encodeURIComponent(key)}=${encodeURIComponent(item)}`).join('&');
- } else {
- return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
- }
- }).join('&');
- }
- return new Promise((resolve, reject) => {
- uni.request({
- url: `${env.baseUrl}${finalUrl}`,
- method,
- data: requestData,
- timeout: requestConfig.timeout, // 设置网络超时
- header: (() => {
- const headers = {};
- // 根据选项决定Content-Type
- if (options.formData) {
- // 使用表单格式,让浏览器自动设置Content-Type
- headers['content-type'] = 'application/x-www-form-urlencoded';
- } else {
- // 默认使用JSON格式
- headers['content-type'] = 'application/json';
- }
- const jsessionId = uni.getStorageSync('JSESSIONID');
- if (jsessionId) {
- headers['Cookie'] = `JSESSIONID=${jsessionId}`;
- }
- return headers;
- })(),
- success: (res) => {
- // 清除超时定时器
- if (timeoutTimer) {
- clearTimeout(timeoutTimer)
- }
- // 获取响应头
- const headers = res.header;
- // console.log('响应头:', headers);
- // 处理Set-Cookie,获取JSESSIONID
- const setCookie = headers['set-cookie'] || headers['Set-Cookie'];
- if (setCookie) {
- const match = setCookie.match(/JSESSIONID=([^;]+)/);
- if (match && match[1]) {
- // console.log('获取到新的JSESSIONID:', match[1]);
- uni.setStorageSync('JSESSIONID', match[1]);
- }
- }
- if (res.statusCode === 200) {
- // 将响应头信息附加到返回数据中
- const responseData = {
- data: res.data,
- };
- resolve(responseData);
- } else {
- reject(res);
- }
- },
- fail: (err) => {
- // 清除超时定时器
- if (timeoutTimer) {
- clearTimeout(timeoutTimer)
- }
- uni.showToast({
- title: '网络请求失败',
- icon: 'none'
- })
- reject(err)
- },
- complete: () => {
- // 隐藏 loading
- if (shouldShowLoading) {
- loadingManager.hide()
- }
- // console.log('请求完成');
- }
- })
- })
- }
- }
- // 添加一些便捷方法
- request.loadingManager = loadingManager
- // 静默请求(不显示 loading)
- request.silent = {
- get: (url, params = {}) => request.get(url, params, { loading: false }),
- post: (url, data = {}) => request.post(url, data, { loading: false }),
- put: (url, data = {}) => request.put(url, data, { loading: false }),
- delete: (url, data = {}) => request.delete(url, data, { loading: false })
- }
- // 带自定义 loading 文字的请求
- request.withLoading = (title) => ({
- get: (url, params = {}) => request.get(url, params, { loading: { title } }),
- post: (url, data = {}) => request.post(url, data, { loading: { title } }),
- put: (url, data = {}) => request.put(url, data, { loading: { title } }),
- delete: (url, data = {}) => request.delete(url, data, { loading: { title } })
- })
- export default request
|