feat: 首次提交

This commit is contained in:
peerless_hero
2023-08-17 21:28:49 +08:00
parent 36f80fb971
commit ec1e5e16cd
571 changed files with 95322 additions and 0 deletions

View File

@ -0,0 +1,120 @@
// 本文件由FirstUI授权予新疆天衡创新研究院有限公司手机号1 86 1 4 07 2 549身份证尾号5A07X5专用请尊重知识产权勿私下传播违者追究法律责任。
const base = {
//所有配置项,未设置则使用默认值
config() {
return {
//接口域名https://firstui.cn如果host为空则直接使用传入的目标地址url
host: '',
// 接口地址:/order/getList如果host为空直接传入https://firstui.cn/order/getList
url: '',
//参数
data: {},
//请求头
header: {
/*
* content-type:
* application/x-www-form-urlencoded
* application/json
*/
'content-type': 'application/json'
},
//必须大写
method: 'POST',
//大于0时才生效否则使用全局配置或者默认值
timeout: 0,
dataType: 'json',
//是否阻止拦截重复的请求重复请求地址url + method + 参数data 一致)
prevent: false,
//Array<String> 参数data中的keyprevent为true时有效进行重复请求判断时移除keys中相关参数如时间戳、随机数等.
keys: [],
//是否仅返回简要数据true-仅返回接口数据datafalse-返回包含header、statusCode、errMsg、data等数据
brief: false,
//String 请求标记用于中断该请求不同请求不可重复只可包含数字、字母、下划线firstui_001
cancelToken: '',
showLoading: true,
//加载中提示文本showLoading为true时有效
loadingText: '',
errorMsg: '网络不给力,请检查网络设置!',
//跨域请求时是否携带凭证cookies仅H5支持HBuilderX 2.6.15+
withCredentials: false,
//DNS解析时优先使用ipv4,仅 App-Android 支持 (HBuilderX 2.8.0+)
firstIpv4: false,
//get请求时参数值为数组时处理方式可选值comma-值逗号拼接repeat-重复参数名brackets-带中括号参数名indices-数组下标参数名
arrayFormat: 'comma'
}
},
getOptions(config) {
let options = {
...config
};
['host', 'timeout', 'prevent', 'keys', 'brief', 'cancelToken', 'showLoading', 'loadingText', 'errorMsg',
'arrayFormat'
]
.forEach(item => {
delete options[item];
})
return options;
},
getParamsHandle(config, arrayFormat) {
const options = {
...config
}
const idx = ['indices', 'repeat', 'brackets'].indexOf(arrayFormat)
if (options.data && Object.keys(options.data).length > 0 && idx !== -1) {
let params = []
Object.entries(options.data).forEach(([key, value]) => {
if (Array.isArray(value)) {
let _key = key;
if (arrayFormat === 'brackets') {
_key = `${key}[]`
}
value.forEach((item, index) => {
if (arrayFormat === 'indices') {
_key = `${key}[${index}]`
}
const val = Object.prototype.toString.call(item) === '[object Object]' ?
JSON.stringify(item) : item;
params.push(`${_key}=${val}`)
})
} else {
params.push(`${key}=${value}`)
}
})
options.url = `${options.url}?${params.join('&')}`
options.data = {}
}
return options;
},
merge(a, b) {
return Object.assign({}, a, b);
},
mergeConfig(defaultConfig, config, init) {
let header = base.merge(defaultConfig.header, config.header || {});
let params = base.merge(defaultConfig, config)
params.header = header;
if (!init) {
let url = base.combineURLs(params.host, params.url)
params.url = url;
}
return params;
},
//如果host为空则直接使用传入的目标地址
combineURLs(host, target) {
return host ? host.replace(/\s+/g, '') + '/' + target.replace(/\s+/g, '').replace(/^\/+/, '') : target;
},
toast(text, duration, success) {
text && uni.showToast({
title: text,
icon: success ? 'success' : 'none',
duration: duration || 2000
})
},
showLoading(title, mask = true) {
uni.showLoading({
mask: mask,
title: title || '请稍候...'
})
}
}
export default base

View File

@ -0,0 +1,57 @@
// 本文件由FirstUI授权予新疆天衡创新研究院有限公司手机号1 8 6 14 07 25 49身份证尾号5A07X5专用请尊重知识产权勿私下传播违者追究法律责任。
class RequestTaskStore {
constructor(taskList = []) {
this.taskStore = taskList
}
setRequestTaskStore(taskArr, taskKey) {
taskKey && taskArr.push(taskKey)
this.taskStore = taskArr;
}
removeRequestTask(task) {
if (!task) return;
const taskKey = this.getRequestTask(task)
let taskArr = [...this.taskStore]
const index = taskArr.indexOf(taskKey)
if (~index) {
taskArr.splice(index, 1)
this.setRequestTaskStore(taskArr)
}
}
getRequestTask(task) {
let {
url,
method,
keys,
data
} = task;
keys = keys || []
data = typeof data === 'string' ? JSON.parse(data) : data;
let taskArr = [];
for (let key in data) {
if (data.hasOwnProperty(key) && !~keys.indexOf(key)) {
let value = data[key] === null ? '' : data[key];
taskArr.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
}
}
return url + method + taskArr.join('');
}
requestTaskStore(task) {
let result = false;
if (!task) return result;
const taskKey = this.getRequestTask(task)
let taskArr = [...this.taskStore]
if (taskArr.length > 0) {
if (~taskArr.indexOf(taskKey)) {
result = true;
} else {
this.setRequestTaskStore(taskArr, taskKey)
}
} else {
taskKey && this.setRequestTaskStore(taskArr, taskKey)
}
return result;
}
}
export default function createTaskStore(taskList = []) {
return new RequestTaskStore(taskList)
}

View File

@ -0,0 +1,179 @@
// 本文件由FirstUI授权予新疆天衡创新研究院有限公司手机号186 1 4 0 7 2 5 4 9身份证尾号5A07X5专用请尊重知识产权勿私下传播违者追究法律责任。
/**
* 网络请求
* 文档地址https://doc.firstui.cn/
**/
import base from './fui-common.js'
import createTaskStore from './fui-taskStore.js'
const store = createTaskStore()
class FIRSTUI_INNER {
constructor(initConfig = {}) {
this.initConfig = initConfig
this.request = []
this.response = []
this.cancelToken = {}
this.dispatchRequest = this.dispatchRequest.bind(this)
this.loading = false
}
dispatchRequest(config = {}) {
let params = base.mergeConfig(this.initConfig, config)
const task = {
url: params.url,
method: params.method,
keys: params.keys,
data: params.data
}
if (params.prevent && store.requestTaskStore(task)) {
return new Promise((resolve, reject) => {
reject({
statusCode: -9998,
errMsg: 'request:prevented'
})
});
}
const arrayFormat = params.arrayFormat;
let options = base.getOptions(params)
if (options.method.toLocaleLowerCase() === 'get' && arrayFormat !== 'comma') {
options = base.getParamsHandle(options, arrayFormat)
}
let promise = Promise.resolve(options);
promise = promise.then(config => {
if (params.showLoading && !this.loading) {
base.showLoading(params.loadingText)
this.loading = true
}
return new Promise((resolve, reject) => {
let requestTask = uni.request({
...options,
success: (res) => {
if (params.showLoading && this.loading) {
uni.hideLoading()
this.loading = false
}
resolve(params.brief ? res.data : res)
},
fail: (err) => {
if (params.showLoading && this.loading) {
uni.hideLoading()
this.loading = false
}
if (params.errorMsg) {
base.toast(params.errorMsg)
}
reject(err)
},
complete: () => {
store.removeRequestTask(task)
if (params.cancelToken && this.cancelToken[params
.cancelToken]) {
delete this.cancelToken[params.cancelToken]
}
}
})
if (params.cancelToken) {
this.cancelToken[params.cancelToken] = requestTask;
}
if (params.timeout && typeof params.timeout === 'number' && params.timeout > 3000) {
setTimeout(() => {
try {
store.removeRequestTask(task)
if (params.cancelToken) {
delete this.cancelToken[params.cancelToken]
}
requestTask.abort();
} catch (e) {}
resolve({
statusCode: -9999,
errMsg: 'request:cancelled'
});
}, params.timeout)
}
});
})
return promise
}
}
const inner = new FIRSTUI_INNER(base.config())
const http = {
interceptors: {
request: {
use: (fulfilled, rejected) => {
inner.request.push({
fulfilled,
rejected
})
},
eject: (name) => {
if (inner.request[name]) {
inner.request[name] = null;
}
}
},
response: {
use: (fulfilled, rejected) => {
inner.response.push({
fulfilled,
rejected
})
},
eject: (name) => {
if (inner.response[name]) {
inner.response[name] = null;
}
}
}
},
create(config) {
inner.initConfig = base.mergeConfig(base.config(), config, true);
},
get(url, config = {}) {
config.method = 'GET'
config.url = url || config.url || ''
return http.request(config)
},
post(url, config = {}) {
config.method = 'POST'
config.url = url || config.url || ''
return http.request(config)
},
all(requests) {
return Promise.all(requests)
},
request(config = {}) {
let chain = [inner.dispatchRequest, undefined];
let promise = Promise.resolve(config);
inner.request.forEach(interceptor => {
chain.unshift(interceptor.fulfilled, interceptor.rejected);
});
inner.response.forEach(interceptor => {
chain.push(interceptor.fulfilled, interceptor.rejected);
});
while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
}
return promise;
},
abort(cancelToken) {
if (!cancelToken) return;
try {
if (inner.cancelToken[cancelToken]) {
inner.cancelToken[cancelToken].abort()
delete inner.cancelToken[cancelToken]
// console.log('request:cancelled')
}
} catch (e) {}
}
}
export default http