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
249 lines
5.4 KiB
|
3 years ago
|
/**
|
||
|
|
* 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 }
|