Skip to content

Commit 9b9d1e2

Browse files
committed
新增缺少mock回调及url自动填充参数
1 parent ac1f67e commit 9b9d1e2

File tree

10 files changed

+12160
-24
lines changed

10 files changed

+12160
-24
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ Vue.ajax.config.baseUrl="http://localhost:8080"
3838
Vue.ajax.config.mockMode=false
3939
#成功的status码
4040
Vue.ajax.config.successStatus=function(status){return status==200;}
41+
#mock缺失时的自定义处理
42+
Vue.ajax.config.missingMockCallback=(opt)=>{
43+
//false: 缺失mock配置时,不使用mock,使用真实url请求
44+
//true: 缺失mock配置时,会error终止
45+
    return false; 
46+
}
4147
#修改默认配置
4248
Vue.ajax.config.default={type:"get",headers:{"Content-type":"application/json;charset=UTF-8"}}
4349
Vue.ajax.config.default=()=>{return {type:"get",headers:{"Content-type":"application/json;charset=UTF-8","Lang":localStorage.getItem("language")}}}
@@ -49,7 +55,7 @@ Vue.ajax.addMock(`String` mockUrl,{url:"/api/newurl",data:{},type:"get",success:
4955
#@get: @post: @delete: @put: 用于相同url但是不同请求类型的拦截
5056
Vue.ajax.addMock(
5157
{
52-
"/url1":function(param){return {code:0};},
58+
"/url1":function(param){return {code:0,data:param};},
5359
"/url2":"../static/file.json",
5460
"/url3":{url:"/api/newurl",data:{},type:"get",success:function(d){},error:function(err){},complete:function(){}},
5561
//{url:"/user/3",type:"get"}的请求会匹配到

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "vue-http-rexsheng",
33
"description": "A Vue.js plugin for providing http request",
4-
"version": "1.1.9",
4+
"version": "1.1.11",
55
"author": "Rex Sheng <shengxupeng@126.com>",
66
"license": "MIT",
77
"private": false,

src/App.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,10 @@ export default {
200200
getData() {
201201
this.$ajax
202202
.send({
203-
url:
204-
"datacenter/userxw/getCenterData?dateFlag={dateFlag}&size={size}",
205-
// type: "get" ,
206-
data:{dateFlag:"2018-08-11",size:null},
203+
// url:"datacenter/userxw/getCenterData",
204+
url:"datacenter/userxw/getCenterData?",
205+
type: "get" ,
206+
data:{dateFlag:"2018-08-11姓名",size:null},
207207
cancel:function(cb){
208208
console.log(new Date())
209209
setTimeout(()=>{
@@ -367,7 +367,7 @@ export default {
367367
mockGlobal:function(){
368368
Vue.ajax
369369
.send({
370-
url: "/test/mock001",
370+
url: "/test/mock0012",
371371
data: { keyword: "管理",arr:["",'12f'] },
372372
type:"post",
373373
success:function(d){

src/config.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,18 @@ Vue.ajax.addMock({
3333
"/test/mockfile":"../src/assets/data/01.json",
3434
"@get:/test/aaa":()=>{return {"dd":1};},
3535
"@post:/test/aaa":()=>{return {"dd":"post"};},
36-
"@post:/test/mock001":()=>{return {"001":"post"};}
36+
"@post:/test/mock001":()=>{return {"001":"post"};},
37+
"@get:datacenter/userxw/getCenterData":(d)=>{return{"ol":"ok","param":d}},
3738
});
3839
// Vue.ajax.config.successStatus=function(d){return d>300};
39-
Vue.ajax.config.default=()=>{return{type:"get",headers:{"Content-type":"application/json;charset=UTF-8","Authorization":new Date().getTime()}}}
40+
Vue.ajax.config.default=()=>{
41+
return{
42+
type:"get",
43+
headers:{"Content-type":"application/json;charset=UTF-8","Authorization":new Date().getTime()}
44+
}
45+
}
46+
Vue.ajax.config.missingMockCallback=(opt)=>{
47+
return true;
48+
}
4049
Vue.socket.config.reconnectTimeout=30
4150
Vue.socket.config.baseUrl="ws://47.104.154.110:8701"

src/lib/ajax.js

Lines changed: 83 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ let AJAXCONF={
2020
requestInterceptor:function(opt,req){return opt;},
2121
responseInterceptor:function(res,req){return res;},
2222
successStatus:function(status){return status===200;},
23+
missingMockCallback(option){
24+
        //false: 缺失mock配置时,不使用mock,使用真实url请求
25+
        return false; 
26+
        //true: 缺失mock配置时,会error终止
27+
        //return true;
28+
    },
2329
baseUrl:"",
2430
mockCache:{},
2531
mockMode:false,
@@ -94,7 +100,7 @@ let ajax = {
94100
if(this.isNull(this.mockInstance)){
95101
this.mockInstance=AJAXCONF.mockCache[option.url];
96102
if(this.isNull(this.mockInstance)){
97-
useMock=false;
103+
useMock=AJAXCONF.missingMockCallback(option);
98104
}
99105
}
100106
}
@@ -130,21 +136,82 @@ let ajax = {
130136
* @param {Object} data,如{userId:3}
131137
* @return {String} 如 /user/3
132138
*/
133-
this.formatUrl = function(url, data) {
139+
this.formatUrl = function(url, data,opt) {
134140
if (!url) return null;
135141
var keys = url.match(/\{\w+\}/g);
136142
keys = (keys === null) ? [] : keys;
137143
if (keys) {
138-
keys.forEach(function(key) {
139-
var rawKey = key.substr(1, key.length - 2);
140-
var replace;
141-
if (data===undefined || data===null || data[rawKey]===undefined || data[rawKey]===null) {
142-
replace = '';
143-
} else {
144-
replace = data[rawKey];
144+
if(keys.length>0){
145+
keys.forEach(function(key) {
146+
var rawKey = key.substr(1, key.length - 2);
147+
var replace;
148+
if (data===undefined || data===null || data[rawKey]===undefined || data[rawKey]===null) {
149+
replace = '';
150+
} else {
151+
replace = data[rawKey];
152+
}
153+
url = url.replace(new RegExp(key, 'g'), replace);
154+
});
155+
}
156+
else{
157+
//url中不包含{}
158+
if(opt.type.toLowerCase()==="get" || opt.type.toLowerCase()==="delete"){
159+
if (data===undefined || data===null) {
160+
return url;
161+
} else {
162+
var newData=null;
163+
if(Object.prototype.toString.call(data) ==='[object Array]'){
164+
newData={};
165+
for(var i=0;i<data.length;i++){
166+
newData[i]=data[i];
167+
}
168+
}
169+
else if(Object.prototype.toString.call(data) ==='[object Object]'){
170+
newData=data;
171+
}
172+
if(newData!==null){
173+
var firstUrl=url.indexOf("?")>-1?url.substr(0,url.indexOf("?")):url;
174+
//有旧数据则合并
175+
if(url.indexOf("?")>-1){
176+
var lastUrl=url.substr(url.indexOf("?")+1);
177+
var strs = lastUrl.trim()==""?[]:lastUrl.split("&");
178+
var oldData={}
179+
url=firstUrl+"?"
180+
var oldKeys=[];
181+
for(var i = 0; i < strs.length; i ++) {
182+
var key=strs[i].split("=")[0];
183+
oldKeys.push(key)
184+
if(Object.keys(newData).indexOf(key)<0){
185+
//将新数据合并到旧数据上
186+
url+=key+"="+(strs[i].split("=").length>1?strs[i].split("=")[1]:"")+"&";
187+
}
188+
else{
189+
//将新数据合并到旧数据上
190+
url+=key+"="+encodeURIComponent(newData[key]==null?"":newData[key])+"&";
191+
}
192+
}
193+
Object.keys(newData).forEach(key=>{
194+
if(oldKeys.indexOf(key)<0){
195+
url+=key+"="+encodeURIComponent(newData[key]==null?"":newData[key])+"&";
196+
}
197+
});
198+
}
199+
else{
200+
url=firstUrl+"?"
201+
Object.keys(newData).forEach(key=>{
202+
url+=key+"="+encodeURIComponent(newData[key]==null?"":newData[key])+"&";
203+
});
204+
}
205+
206+
if(url.endsWith("&")){
207+
url=url.substr(0,url.length-1);
208+
}
209+
}
210+
}
211+
145212
}
146-
url = url.replace(new RegExp(key, 'g'), replace);
147-
});
213+
}
214+
148215
}
149216
return url;
150217
};
@@ -183,7 +250,10 @@ let ajax = {
183250
return new Promise(function(resolve, reject) {
184251
try {
185252
if(instance==null){
186-
reject("mock未定义")
253+
if(option.error){
254+
option.error.call(scope,"mock未定义:"+option.url);
255+
}
256+
reject("mock未定义:"+option.url)
187257
return;
188258
}
189259
new Promise(function(res,rej){
@@ -242,7 +312,7 @@ let ajax = {
242312
return this.mock(opt,scope);
243313
}
244314
var request = this.createInstance();
245-
opt.url = this.formatUrl(opt.url, opt.data);
315+
opt.url = this.formatUrl(opt.url, opt.data,opt);
246316
if(opt.baseUrl!==undefined && opt.baseUrl===false){
247317
request.open(opt.type, opt.url, opt.async);
248318
}

src/lib/index.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ var ajaxBody={
4848
set successStatus(fn){
4949
AJAXCONF.successStatus=fn;
5050
},
51+
set missingMockCallback(fn){
52+
AJAXCONF.missingMockCallback=fn;
53+
},
5154
get timeout(){
5255
return AJAXCONF.timeout;
5356
},
@@ -141,7 +144,10 @@ rexShengPlugin.install = function(Vue, options={}) {
141144
AJAXCONF.successFormatCallback=options.successFormat || options.resultFormat || AJAXCONF.successFormatCallback;//返回数据的格式化
142145
AJAXCONF.errorFormatCallback=options.errorFormat || options.resultFormat || AJAXCONF.errorFormatCallback;
143146
AJAXCONF.userDefaultConfig=function(){return Object.assign({},options.defaultConfig || {},AJAXCONF.userDefaultConfig());}
144-
147+
// if (!Vue) {
148+
// //
149+
// window.Vue=Vue=_vue_;
150+
// }
145151
Vue[AJAXCONF.VueGlobalInstanceName]=Vue.prototype[AJAXCONF.instanceName]=ajaxBody
146152

147153
Vue[AJAXCONF.VueGlobalInstanceName+"Success"] = function(data, message) {
@@ -152,10 +158,16 @@ rexShengPlugin.install = function(Vue, options={}) {
152158
}
153159

154160
Vue[AJAXCONF.WSGlobalInstanceName]= Vue.prototype[AJAXCONF.wsInstanceName]=wsBody
161+
162+
155163
}
156164
rexShengPlugin[AJAXCONF.VueGlobalInstanceName]=ajaxBody;
157165
rexShengPlugin[AJAXCONF.WSGlobalInstanceName]=wsBody;
158166

167+
if (typeof window !== 'undefined' && window.Vue) {
168+
Vue[AJAXCONF.VueGlobalInstanceName]=Vue.prototype[AJAXCONF.instanceName]=ajaxBody;
169+
Vue[AJAXCONF.WSGlobalInstanceName]=Vue.prototype[AJAXCONF.wsInstanceName]=wsBody;
170+
}
159171
// _vue_[AJAXCONF.VueGlobalInstanceName]=_vue_.prototype[AJAXCONF.instanceName]=ajaxBody;
160172
// _vue_[AJAXCONF.WSGlobalInstanceName]=_vue_.prototype[AJAXCONF.wsInstanceName]=wsBody;
161173
export default rexShengPlugin;

src/lib/random.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ let getType= function(obj) {
1010
'[object RegExp]': 'regExp',
1111
'[object Undefined]': 'undefined',
1212
'[object Null]': 'null',
13-
'[object Object]': 'object'
13+
'[object Object]': 'object',
14+
'[object File]': 'file'
1415
};
1516
return map[toString.call(obj)];
1617
}

test/http.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)