// api/index.js
|
|
import http from './http.js'
|
|
import utils from '../utils/utils.js'
|
|
import config from './config.js'
|
|
|
|
const limit = new Map()
|
|
const debounce = new Map()
|
|
|
|
|
|
|
|
// 动态导入 models
|
|
const modules = import.meta.glob('./model/*.js', { eager: true })
|
|
Object.entries(modules).forEach(([path, mod]) => {
|
|
const model = mod.default || mod
|
|
const key = path.match(/\/([^/]+)\.js$/)[1]
|
|
for (const k in model) {
|
|
if (config[k]) {
|
|
console.error(`重名api------model=${key},key=${k}`)
|
|
// 这里建议用全局弹窗或通知
|
|
continue
|
|
}
|
|
config[k] = model[k]
|
|
}
|
|
})
|
|
|
|
/**
|
|
* 通用API请求
|
|
* @param {string} key
|
|
* @param {object} data
|
|
* @param {function} [callback]
|
|
* @param {string} [loadingTitle]
|
|
* @returns {Promise}
|
|
*/
|
|
export function api(key, data = {}, callback, loadingTitle) {
|
|
const req = config[key]
|
|
|
|
if (!req) {
|
|
console.error('无效key: ' + key)
|
|
return Promise.reject(new Error('无效key'))
|
|
}
|
|
|
|
// 参数重载
|
|
if (typeof callback === 'string') {
|
|
loadingTitle = callback
|
|
callback = undefined
|
|
}
|
|
if (typeof data === 'function') {
|
|
callback = data
|
|
data = {}
|
|
}
|
|
|
|
// 限流
|
|
if (req.limit) {
|
|
const last = limit.get(req.url)
|
|
if (last && Date.now() - last < req.limit) {
|
|
return Promise.reject(new Error('请求过于频繁'))
|
|
}
|
|
limit.set(req.url, Date.now())
|
|
}
|
|
// console.log(!uni.getStorageSync('token'),'status');
|
|
// 必须登录
|
|
if (req.auth && !uni.getStorageSync('token')) {
|
|
// utils.toLogin()
|
|
return Promise.reject(new Error('需要登录'))
|
|
}
|
|
|
|
// 防抖
|
|
if (req.debounce) {
|
|
const prev = debounce.get(req.url)
|
|
if (prev) clearTimeout(prev)
|
|
debounce.set(
|
|
req.url,
|
|
setTimeout(() => {
|
|
debounce.delete(req.url)
|
|
http.http(
|
|
req.url,
|
|
data,
|
|
callback,
|
|
req.method,
|
|
loadingTitle || req.showLoading,
|
|
loadingTitle || req.loadingTitle
|
|
)
|
|
}, req.debounce)
|
|
)
|
|
return Promise.reject(new Error('请求防抖中'))
|
|
}
|
|
|
|
// 正常请求
|
|
|
|
return http.http(
|
|
req.url,
|
|
data,
|
|
callback,
|
|
req.method,
|
|
loadingTitle || req.showLoading,
|
|
loadingTitle || req.loadingTitle
|
|
)
|
|
}
|
|
|
|
export default api
|