diff --git a/web/ui/src/App.vue b/web/ui/src/App.vue index 9969ae4..5edea4c 100644 --- a/web/ui/src/App.vue +++ b/web/ui/src/App.vue @@ -1,10 +1,11 @@ \ No newline at end of file diff --git a/web/ui/src/components/JobEditRule.vue b/web/ui/src/components/JobEditRule.vue index 6cae721..ff8dccd 100644 --- a/web/ui/src/components/JobEditRule.vue +++ b/web/ui/src/components/JobEditRule.vue @@ -1,9 +1,61 @@ \ No newline at end of file diff --git a/web/ui/src/components/JobToolbar.vue b/web/ui/src/components/JobToolbar.vue index 2607685..4fb26f5 100644 --- a/web/ui/src/components/JobToolbar.vue +++ b/web/ui/src/components/JobToolbar.vue @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/web/ui/src/libraries/rest-client.js b/web/ui/src/libraries/rest-client.js new file mode 100644 index 0000000..979eb34 --- /dev/null +++ b/web/ui/src/libraries/rest-client.js @@ -0,0 +1,115 @@ +var sendXHR = function(opt) { + var xhr = new XMLHttpRequest(); + xhr.open(opt.method, opt.url, true); + + if (typeof opt.onexception == 'function') { + var warpExceptionHandler = ()=>{ + opt.onexception(msg); + typeof opt.onend == 'function' && opt.onend(xhr); + } + xhr.onabort=()=>{warpExceptionHandler('request aborted.')}; + xhr.onerror=()=>{warpExceptionHandler('request error.')}; + xhr.ontimeout=()=>{warpExceptionHandler('request timeout.')}; + } + + xhr.onreadystatechange = function(){ + if (xhr.readyState !== XMLHttpRequest.DONE) { + return; + } + + var data; + if (typeof xhr.response != 'object') { + try { + data = JSON.parse(xhr.response) + } catch(e) { + data = xhr.response; + } + } else { + data = xhr.response; + } + + if (xhr.status != opt.successCode) { + typeof opt.onfailed == 'function' && opt.onfailed(data, xhr); + } else if (typeof opt.onsucceed == 'function') { + opt.onsucceed(data, xhr); + } + + typeof opt.onend == 'function' && opt.onend(xhr); + } + + xhr.send(opt.data); +} + +class request { + constructor(url, method, data){ + this._url = url; + this._method = method; + this._data = data; + } + + do(){ + sendXHR({ + method: this._method, + url: this._url, + data: this._data, + successCode: this._successCode, + onsucceed: this._onsucceed, + onfailed: this._onfailed, + onexception: this._onexception, + onend: this._onend, + }); + } + + onsucceed(successCode, f){ + this._successCode = successCode; + this._onsucceed = f; + return this; + } + + onfailed(f){ + this._onfailed = f; + return this; + } + + onexception(f){ + this._onexception = f; + return this; + } + + onend(f){ + this._onend = f; + return this; + } +} + +export default class Rest { + constructor(prefix, defaultFailedHandler, defaultExceptionHandler){ + this.prefix = prefix; + this.defaultFailedHandler = defaultFailedHandler; // function(url, resp){} + this.defaultExceptionHandler = defaultExceptionHandler; + }; + + GET(url){ + return new request(this.prefix+url, 'GET') + .onfailed(this.defaultFailedHandler) + .onexception(this.defaultExceptionHandler); + }; + + POST(url, formdata){ + return new request(this.prefix+url, 'POST', formdata) + .onfailed(this.defaultFailedHandler) + .onexception(this.defaultExceptionHandler); + }; + + PUT(url, formdata){ + return new request(this.prefix+url, 'PUT', formdata) + .onfailed(this.defaultFailedHandler) + .onexception(this.defaultExceptionHandler); + }; + + DELETE(url){ + return new request(this.prefix+url, 'DELETE') + .onfailed(this.defaultFailedHandler) + .onexception(this.defaultExceptionHandler); + } +} \ No newline at end of file diff --git a/web/ui/src/main.js b/web/ui/src/main.js index 63906f4..574d500 100644 --- a/web/ui/src/main.js +++ b/web/ui/src/main.js @@ -5,6 +5,18 @@ require('semantic-ui/dist/semantic.min.css'); import Vue from 'vue'; Vue.config.debug = true; +// global restful client +import Rest from './libraries/rest-client.js'; +const RestApi =(Vue, options)=>{ + Vue.prototype.$rest = new Rest('/v1/'); +}; +Vue.use(RestApi); + +// global event bus +Vue.use((Vue)=>{ + Vue.prototype.$bus = new Vue(); +}); + import VueRouter from 'vue-router'; Vue.use(VueRouter); diff --git a/web/ui/webpack.config.js b/web/ui/webpack.config.js index 3fbd2c9..a92bafb 100644 --- a/web/ui/webpack.config.js +++ b/web/ui/webpack.config.js @@ -50,6 +50,12 @@ module.exports = { } }, devServer: { + proxy: { + '/v1': { + target: 'http://127.0.0.1:7079', + secure: false + } + }, historyApiFallback: true, noInfo: true },