| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- import env from '../config/env.js'
- /**
- * 设备端专用请求工具
- * 特点:
- * 1. 不添加用户端的 deviceInfo 参数
- * 2. 不处理登录过期逻辑
- * 3. 保留 JSESSIONID 管理
- * 4. 简化 loading 逻辑(无延迟)
- */
- // Loading 管理器 - 简化版
- const loadingManager = {
- loadingCount: 0,
- isShowing: false,
- show(options = {}) {
- const config = {
- title: '加载中...',
- mask: true,
- ...options
- }
- // 如果已经有 loading 在显示,只增加计数
- if (this.loadingCount > 0) {
- this.loadingCount++
- return
- }
- // 设备端无需延迟,直接显示
- if (!this.isShowing) {
- try {
- uni.showLoading({
- title: config.title,
- mask: config.mask
- })
- this.isShowing = true
- } catch (error) {
- console.warn('showLoading failed:', error)
- }
- }
- this.loadingCount++
- },
- hide() {
- this.loadingCount = Math.max(0, this.loadingCount - 1)
- if (this.loadingCount === 0 && this.isShowing) {
- try {
- uni.hideLoading()
- } catch (error) {
- console.warn('hideLoading failed:', error)
- } finally {
- this.isShowing = false
- }
- }
- },
- forceHide() {
- this.loadingCount = 0
- if (this.isShowing) {
- try {
- uni.hideLoading()
- } catch (error) {
- console.warn('forceHide failed:', error)
- } finally {
- this.isShowing = false
- }
- }
- },
- safeShowToast(options) {
- if (this.isShowing) {
- this.forceHide()
- setTimeout(() => {
- uni.showToast(options)
- }, 100)
- } else {
- uni.showToast(options)
- }
- }
- }
- const deviceRequest = {
- 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 request(url, method, data, options = {}) {
- // 解析 loading 配置
- let loadingConfig
- if (options.loading === false) {
- loadingConfig = false
- } else {
- loadingConfig = {
- show: true,
- title: '加载中...',
- mask: true,
- ...(typeof options.loading === 'object' ? options.loading : {})
- }
- }
- // 解析请求配置
- const requestConfig = {
- timeout: 15000,
- ...options.request
- }
- const shouldShowLoading = loadingConfig !== false && loadingConfig.show !== false
- // 显示 loading
- if (shouldShowLoading) {
- loadingManager.show(loadingConfig)
- }
- // 🎯 参考 request.js (161-168行),自动添加 devId 和 sbmc
- // 设备端从 userInfo 获取,而不是从 deviceInfo
- let finalUrl = url
- // 检查 URL 是否已包含 devId 参数(login 接口已手动添加)
- if (!url.includes('devId=')) {
- const userInfo = uni.getStorageSync('userInfo') || {}
- const devId = userInfo.devId || ''
- const sbmc = userInfo.sbmc || ''
- // 只有在有 devId 时才添加参数
- if (devId) {
- const separator = url.includes('?') ? '&' : '?'
- finalUrl = `${url}${separator}devId=${devId}&sbmc=${sbmc}`
- }
- }
- // 数据格式转换
- 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 = {}
- if (options.formData) {
- headers['content-type'] = 'application/x-www-form-urlencoded'
- } else {
- headers['content-type'] = 'application/json'
- }
- // 携带 JSESSIONID
- const jsessionId = uni.getStorageSync('JSESSIONID')
- if (jsessionId) {
- headers['Cookie'] = `JSESSIONID=${jsessionId}`
- }
- return headers
- })(),
- success: (res) => {
- // 获取响应头
- const headers = res.header
- // 处理 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) {
- // 检查服务器错误
- if (res && typeof res.data === 'string' && res.data.includes('页面执行时错误')) {
- reject({
- message: '服务器处理错误' + res.data,
- })
- loadingManager.safeShowToast({
- title: '服务器处理错误',
- icon: 'none'
- })
- return
- }
- // 设备端不处理登录过期,直接返回数据
- const responseData = {
- data: res.data,
- }
- resolve(responseData)
- } else {
- reject(res)
- }
- },
- fail: (err) => {
- loadingManager.safeShowToast({
- title: '网络请求失败',
- icon: 'none'
- })
- reject(err)
- },
- complete: () => {
- if (shouldShowLoading) {
- loadingManager.hide()
- }
- }
- })
- })
- }
- }
- // 添加便捷方法
- deviceRequest.loadingManager = loadingManager
- // 静默请求
- deviceRequest.silent = {
- get: (url, params = {}) => deviceRequest.get(url, params, { loading: false }),
- post: (url, data = {}) => deviceRequest.post(url, data, { loading: false }),
- }
- // 带自定义 loading 文字的请求
- deviceRequest.withLoading = (title) => ({
- get: (url, params = {}) => deviceRequest.get(url, params, { loading: { title } }),
- post: (url, data = {}) => deviceRequest.post(url, data, { loading: { title } }),
- })
- export default deviceRequest
|