You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
5.4 KiB

/**
* API 请求
*
*/
import md5 from 'md5'
import store from '@/store'
import config from '@/config'
import cache from '@/plugins/cache'
import { toast } from '@/plugins/util'
import { stringify } from 'qs'
function sortParams(params) {
return Object.keys(params)
.filter(k => params[k] !== '') // 过滤空参数
.sort() // 排序
.reduce((obj, key) => {
obj[key] = params[key]
return obj
}, {})
}
function sort_ASCII(obj) {
var arr = new Array()
var num = 0
for (let i in obj) {
arr[num] = i
num++
}
var sortArr = arr.sort()
var sortObj = {}
for (let i in sortArr) {
sortObj[sortArr[i]] = obj[sortArr[i]]
}
return sortObj
}
/**
* 排序参数并生成签名
*/
function generateSign(params = {}) {
// 随机字符串
const nonce_str = Math.random().toString(36).substr(2)
// 排序参数并转 URL 键值对
const strTemp = sortParams(Object.assign(params, { nonce_str }))
console.log(strTemp)
let arr = sort_ASCII(strTemp)
let str = ''
for (let key in arr) {
if (arr[key] || arr[key] === 0) {
str = str + key + '=' + arr[key] + '&'
}
}
// 生成 MD5 签名
let sign = md5(str + 'appKey=1f26fe1a6a36daf7651d6437bb6a5fa6').toUpperCase()
// const sign = md5(
// `${strTemp}&appKey=1f26fe1a6a36daf7651d6437bb6a5fa6`
// ).toUpperCase();
return {
...params,
nonce_str,
sign,
}
}
/**
* 判断 response 状态
*/
function checkRes(res) {
if (!res) {
return {
code: 500,
data: '',
msg: '请求失败,接口异常',
}
}
if (res.statusCode === 404) {
return {
code: 404,
data: '',
msg: '请求失败,接口不存在',
}
}
if (![200, 304].includes(res.statusCode)) {
return {
code: res.statusCode || 400,
data: '',
msg: res.statusText || '解析失败,数据异常',
}
}
return res.data
}
/**
* 判断 data 状态
* 状态码详情: http://doc.cq1080.com/shares/YPAtNiPWaJGhMmUL#code
*/
function checkCode(res) {
switch (res.code) {
case 200:
case 204:
return res.data
case 401:
toast('登录信息已过期,请重新登录', () => {
store.commit('removeUserInfo')
uni.reLaunch({ url: '/pages/index/index' })
})
break
case 403:
toast('请求失败,暂无权限')
break
case 426:
toast('当前接口需要升级')
break
default:
toast(res.msg || '发生了一个未知错误')
break
}
}
/**
* 接口请求
*
* url 地址
* data 参数
* method 类型
* loading 是否显示加载
*/
export function request(url, data, method, loading) {
const header = {
'ssdmn-token': cache.get('token'),
}
if (method === 'POST') {
header['Content-Type'] = 'application/json; charset=UTF-8'
}
// if (url == '/user/login/smsCodeLogin') {
// header['Content-Type'] = 'multipart/form-data'
// }
if (loading) {
// 显示 loading
uni.showLoading({
title: method === 'UPLOAD' ? '上传中...' : '加载中...',
mask: true,
})
}
return new Promise((resolve, reject) => {
if (method === 'UPLOAD') {
header['Content-Type'] = 'application/x-www-form-urlencoded'
uni.uploadFile({
header,
url: `${config.server}${url}`,
name: 'file',
files: Array.isArray(data) ? data : null,
filePath: Array.isArray(data) ? null : data,
success(res) {
store.commit('setApiError', '')
resolve(checkCode(JSON.parse(checkRes(res))))
},
fail(err) {
store.commit('setApiError', err?.errMsg)
reject(err)
},
complete(res) {
console.log({
PATH: url,
DATA: res.data?.data,
REQ: {
server: `${config.server}${url}`,
params: data,
STRING: JSON.stringify(data),
},
RES: res,
})
uni.stopPullDownRefresh() // 停止下拉刷新
uni.hideLoading() // 关闭 loading
},
})
} else {
uni.request({
method,
header,
url: `${config.server}${url}`,
data: data,
timeout: 30000, // 30秒超时
success(res) {
store.commit('setApiError', '')
resolve(checkCode(checkRes(res)))
},
fail(err) {
store.commit('setApiError', err?.errMsg)
reject(err)
},
complete(res) {
console.log({
PATH: url,
DATA: res.data?.data,
REQ: {
server: `${config.server}${url}`,
params: data,
STRING: JSON.stringify(data),
},
RES: res,
})
uni.stopPullDownRefresh() // 停止下拉刷新
uni.hideLoading() // 关闭 loading
},
})
}
})
}
/**
* get
*
* url 地址
* data 参数
* loading 是否显示加载
*/
export function get(url, data, loading = false) {
return request(url, data, 'GET', loading)
}
/**
* post
*
* url 地址
* data 参数
* loading 是否显示加载
*/
export function post(url, data, loading = false) {
return request(url, data, 'POST', loading)
}
/**
* upload
*
* url 地址
* data 资源路径
* loading 是否显示加载
*/
export function upload(url, files, loading = true) {
return request(url, files, 'UPLOAD', loading)
}
// Request
export default { request, get, post, upload }