1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
import request from "./request";
const globalUrl = process.uniEnv || {}
let baseOptions = {
baseUrl: '', // 接口请求地址,用于图片上传域名配置
fileUrl: '', //服务器本地上传文件地址
defaultUploadUrl: "api/common/v1/upload_image", // 服务器上传图片默认url
qiniuUploadUrl: globalUrl.systemUrl.apiUrl + '/wxh-cloud-rest/rest/qiniu/token/2',
//设置请求头(如果使用报错跨域问题,可能是content-type请求类型和后台那边设置的不一致)
header: {
'content-type': 'application/json;charset=UTF-8'
},
// 请求超时时间(默认6000)
timeout: 10000,
// 默认配置(可不写)
config: {
// 是否自动提示错误
isPrompt: true,
// 是否显示加载动画
load: false,
// 是否使用数据工厂
isFactory: true
}
}
//可以new多个request来支持多个域名请求
let uploader = new request(baseOptions);
// 添加获取七牛云token的方法
uploader.getQnToken = function(params) {
//该地址需要开发者自行配置(每个后台的接口风格都不一样)
return new Promise((resolve, reject) => {
uploader.get(baseOptions.qiniuUploadUrl, params).then(data => {
/*
*接口返回参数:
*visitPrefix:访问文件的域名
*token:七牛云上传token
*folderPath:上传的文件夹
*region: 地区 默认为:ECN
*/
resolve({
visitPrefix: data.host,
token: data.data || '',
folderPath: data.folderPath || '',
region: "SCN"
})
}).catch(() => {
let err = {
statusCode: 0,
errMsg: "【request】token获取失败"
}
reject(err)
})
})
// uploader.post(baseOptions.qiniuUploadUrl).then(data => {
// /*
// *接口返回参数:
// *visitPrefix:访问文件的域名
// *token:七牛云上传token
// *folderPath:上传的文件夹
// *region: 地区 默认为:ECN
// */
// callback({
// visitPrefix: data.host || '',
// token: data.token || '',
// folderPath: data.folderPath || '',
// region: "ECN"
// });
// });
}
//当前接口请求数
let requestNum = 0;
//请求开始拦截器
uploader.requestStart = function(options) {
if (options.load) {
if (requestNum <= 0) {
//打开加载动画
uni.showLoading({
title: '加载中',
mask: true
});
}
requestNum += 1;
}
// 图片上传大小限制
if (options.method == "FILE" && options.maxSize) {
// 文件最大字节: options.maxSize 可以在调用方法的时候加入参数
const maxSize = options.maxSize;
for (let item of options.files) {
if (item.size > maxSize) {
setTimeout(() => {
uni.showToast({
title: "图片过大,请重新上传",
icon: "none"
});
}, 500);
return false;
}
}
}
//请求前加入token
// options.header['token'] = "RTOKENf7d46ea33a7923515abfa779e04eccba77f98604"; //项目 token
return options; // return false 表示请求拦截,不会继续请求
}
//请求结束
uploader.requestEnd = function(options) {
//判断当前接口是否需要加载动画
if (options.load) {
requestNum = requestNum - 1;
if (requestNum <= 0) {
uni.hideLoading();
}
}
}
//登录弹窗次数
let loginPopupNum = 0;
//所有接口数据处理(可在接口里设置不调用此方法)
//此方法需要开发者根据各自的接口返回类型修改,以下只是模板
uploader.dataFactory = async function(res) {
if (res.response.statusCode && res.response.statusCode == 200) {
// let httpData = res.response.data;
let httpData = res.response;
if (typeof(httpData) == "string") {
httpData = JSON.parse(httpData);
}
/*********以下只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/
//判断数据是否请求成功
if (httpData.statusCode === 200) {
// 返回正确的结果(then接受数据)
return Promise.resolve(httpData.data);
} else if (httpData.code == "1000" || httpData.code == "1001" || httpData.code == 1100) {
let content = '此时此刻需要您登录喔~';
if (loginPopupNum <= 0) {
loginPopupNum++;
uni.showModal({
title: '温馨提示',
content: content,
confirmText: "去登录",
cancelText: "再逛会",
success: function(res) {
loginPopupNum--;
if (res.confirm) {
uni.navigateTo({
url: "/pages/user/login"
});
}
}
});
}
// 返回错误的结果(catch接受数据)
return Promise.reject({
statusCode: 0,
errMsg: "【request】" + (httpData.info || httpData.msg)
});
} else { //其他错误提示
if (res.isPrompt) {
uni.showToast({
title: httpData.info || httpData.msg,
icon: "none",
duration: 3000
});
}
// 返回错误的结果(catch接受数据)
return Promise.reject({
statusCode: 0,
errMsg: "【request】" + (httpData.info || httpData.msg)
});
}
/*********以上只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/
} else {
// 返回错误的结果(catch接受数据)
return Promise.reject({
statusCode: res.response.statusCode,
errMsg: "【request】数据工厂验证不通过"
});
}
};
// 错误回调
uploader.requestError = function(e) {
// e.statusCode === 0 是参数效验错误抛出的
if (e.statusCode === 0) {
throw e;
} else {
// uni.showToast({
// title: "当前网络信号较差,请耐心等待或尝试切换网络环境",
// icon: "none"
// });
}
}
export default uploader;