diff --git a/README.md b/README.md index f051b223..7cabe7da 100644 --- a/README.md +++ b/README.md @@ -3,53 +3,31 @@ OhMyScheduler是一个分布式调度平台和分布式计算框架,具有以下特性: * 支持CRON、固定频率、固定延迟和API四种调度策略。 * 支持单机、广播、**MapReduce**三种执行模式。 +* 支持在线查看任务运行过程中的日志,提供分布式日志解决方案。 * 支持任意的水平扩展,性能强劲无上限。 * 具有强大的故障转移与恢复能力,只要保证集群可用节点数足够,任务就能顺利完成。 -* 仅依赖数据库,部署简单,上手容易,开发高效,仅需几行代码即可获得整个集群的分布式计算能力。 +* 最小仅依赖数据库,部署简单,上手容易,开发高效,仅需几行代码即可获得整个集群的分布式计算能力。 * 支持SpringBean、普通Java类(内置/外置)、Shell、Python等处理器。 -# 部署 -### 环境要求 -* 运行环境:JDK8+ -* 编译环境:Maven3+ -* 数据库:Spring Data JPA支持的关系型数据库理论上都可以(MySQL/Oracle/MS SQLServer...) +# 接入流程(文档不要太详细,简单强大兼得说的就是在下~) +1. [项目部署及初始化](https://github.com/KFCFans/OhMyScheduler/blob/master/others/doc/SystemInitGuide.md) +2. [处理器开发](https://github.com/KFCFans/OhMyScheduler/blob/master/others/doc/ProcessorDevGuide.md) +3. [任务配置与在线查看](https://github.com/KFCFans/OhMyScheduler/blob/master/others/doc/ConsoleGuide.md) +4. [(强大灵活的扩展——OpenAPI)](https://github.com/KFCFans/OhMyScheduler/blob/master/others/doc/OpenApiGuide.md) -### 依赖坐标 ->最新依赖版本请参考Maven中央仓库:[推荐地址](https://search.maven.org/search?q=com.github.kfcfans)&[备用地址](https://mvnrepository.com/search?q=com.github.kfcfans)。 - -Worker依赖包(需要接入分布式计算能力的应用需要依赖该jar包) -```xml - - com.github.kfcfans - oh-my-scheduler-worker - ${oms.worker.latest.version} - -``` -Client依赖包(需要接入OpenAPI的应用需要依赖该Jar包,使用代码调用控制台功能) -```xml - - com.github.kfcfans - oh-my-scheduler-client - ${oms.client.latest.version} - -``` - -### 项目部署 -1. 部署数据库:由于调度Server数据持久化层基于Spring Data Jpa实现,**开发者仅需完成数据库的创建**,即运行SQL`CREATE database if NOT EXISTS oms default character set utf8mb4 collate utf8mb4_unicode_ci;` -2. 部署调度服务器(oh-my-scheduler-server):修改配置文件(application.properties),按需修改,之后maven打包部署运行一条龙。 -3. 部署前端页面(可选,server多实例部署时需要,单Server已经继承在SpringBoot中),自行使用[源码](https://github.com/KFCFans/OhMyScheduler-Console)打包部署即可。 -4. 被调度任务集成`oh-my-scheduler-worker`依赖,并完成处理器的开发,详细教程见[开发文档](https://github.com/KFCFans/OhMyScheduler/blob/master/others/doc/DevelopmentGuide.md)。 # 开发日志 ### 已完成 * 定时调度功能:支持CRON表达式、固定时间间隔、固定频率和API四种方式。 * 任务执行功能:支持单机、广播和MapReduce三种执行方式。 * 执行处理器:支持SpringBean、普通Java对象、Shell脚本、Python脚本的执行 +* 在线日志:分布式日志解决方案 * 高可用与水平扩展:调度服务器可以部署任意数量的节点,不存在调度的性能瓶颈。 * 不怎么美观但可以用的前端界面 * OpenAPI:通过OpenAPI可以允许开发者在自己的应用上对OhMyScheduler进行二次开发,比如开发自己的定时调度策略,通过API的调度模式触发任务执行。 ### 下阶段目标 +* 日志的限流 & 本地分表提升在线日志最大吞吐量 * 工作流(任务编排):当前版本勉强可以用MapReduce代替,不过工作流挺酷的,等框架稳定后进行开发。 * [应用级别资源管理和任务优先级](https://yq.aliyun.com/articles/753141?spm=a2c4e.11153959.teamhomeleft.1.696d60c9vt9lLx):没有机器资源时,进入排队队列。不过我觉得SchedulerX的方案不太行,SchedulerX无抢占,一旦低优先级任务开始运行,那么只能等他执行完成才能开始高优先级任务,这明显不合理。可是考虑抢占的话又要多考虑很多东西...先放在TODO列表吧。 * 保护性判断(这个太繁琐了且意义不大,毕竟面向开发者,大家不会乱填参数对不对~) diff --git a/oh-my-scheduler-client/pom.xml b/oh-my-scheduler-client/pom.xml index e1fe5534..57013855 100644 --- a/oh-my-scheduler-client/pom.xml +++ b/oh-my-scheduler-client/pom.xml @@ -10,11 +10,11 @@ 4.0.0 oh-my-scheduler-client - 1.0.1 + 1.1.0 jar - 1.0.1 + 1.1.0 5.6.1 diff --git a/oh-my-scheduler-common/pom.xml b/oh-my-scheduler-common/pom.xml index 860d4edb..8e65c32a 100644 --- a/oh-my-scheduler-common/pom.xml +++ b/oh-my-scheduler-common/pom.xml @@ -10,7 +10,7 @@ 4.0.0 oh-my-scheduler-common - 1.0.1 + 1.1.0 jar diff --git a/oh-my-scheduler-common/src/main/java/com/github/kfcfans/oms/common/RemoteConstant.java b/oh-my-scheduler-common/src/main/java/com/github/kfcfans/oms/common/RemoteConstant.java index 523a14fc..9989bc5b 100644 --- a/oh-my-scheduler-common/src/main/java/com/github/kfcfans/oms/common/RemoteConstant.java +++ b/oh-my-scheduler-common/src/main/java/com/github/kfcfans/oms/common/RemoteConstant.java @@ -1,7 +1,5 @@ package com.github.kfcfans.oms.common; -import java.time.Duration; - /** * RemoteConstant * diff --git a/oh-my-scheduler-server/pom.xml b/oh-my-scheduler-server/pom.xml index dfa546b8..369455bb 100644 --- a/oh-my-scheduler-server/pom.xml +++ b/oh-my-scheduler-server/pom.xml @@ -10,13 +10,13 @@ 4.0.0 oh-my-scheduler-server - 1.0.1 + 1.1.0 jar 2.9.2 2.2.6.RELEASE - 1.0.1 + 1.1.0 8.0.19 1.4.200 diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/common/config/ThreadPoolConfig.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/common/config/ThreadPoolConfig.java index f4300d7a..e718cd2d 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/common/config/ThreadPoolConfig.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/common/config/ThreadPoolConfig.java @@ -1,5 +1,6 @@ package com.github.kfcfans.oms.server.common.config; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; @@ -14,6 +15,7 @@ import java.util.concurrent.ThreadPoolExecutor; * @author tjq * @since 2020/4/28 */ +@Slf4j @EnableAsync @Configuration public class ThreadPoolConfig { @@ -22,11 +24,16 @@ public class ThreadPoolConfig { public Executor getTimingPool() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(Runtime.getRuntime().availableProcessors()); - executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()); - executor.setQueueCapacity(1024); + executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 2); + // use SynchronousQueue + executor.setQueueCapacity(0); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("omsTimingPool-"); - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); + executor.setRejectedExecutionHandler((r, e) -> { + log.warn("[OmsTimingService] timing pool can't schedule job immediately, maybe some job using too much cpu times."); + // 定时任务优先级较高,不惜一些代价都需要继续执行,开线程继续干~ + new Thread(r).start(); + }); return executor; } diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/log/InstanceLogService.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/log/InstanceLogService.java index d812b8af..5d62f0ae 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/log/InstanceLogService.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/log/InstanceLogService.java @@ -62,7 +62,7 @@ public class InstanceLogService { // 用户路径 private static final String USER_HOME = System.getProperty("user.home", "oms"); // 每一个展示的行数 - private static final int MAX_LINE_COUNT = 500; + private static final int MAX_LINE_COUNT = 100; // 过期时间 private static final long EXPIRE_INTERVAL_MS = 60000; diff --git a/oh-my-scheduler-server/src/main/resources/static/css/chunk-7602a25e.b9e33c01.css b/oh-my-scheduler-server/src/main/resources/static/css/chunk-047e0794.abafcdac.css similarity index 53% rename from oh-my-scheduler-server/src/main/resources/static/css/chunk-7602a25e.b9e33c01.css rename to oh-my-scheduler-server/src/main/resources/static/css/chunk-047e0794.abafcdac.css index 81e572c9..3207699e 100644 --- a/oh-my-scheduler-server/src/main/resources/static/css/chunk-7602a25e.b9e33c01.css +++ b/oh-my-scheduler-server/src/main/resources/static/css/chunk-047e0794.abafcdac.css @@ -1 +1 @@ -#welcome[data-v-175a435c]{width:100%;height:100%;background-image:url(../img/welcome_background.6d979910.svg);display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center;align-items:center} \ No newline at end of file +#welcome[data-v-1e8c2f69]{width:100%;height:100%;background-image:url(../img/welcome_background.6d979910.svg);display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center;align-items:center}#entrance[data-v-1e8c2f69]{margin:20px} \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/css/chunk-4947264f.596fc436.css b/oh-my-scheduler-server/src/main/resources/static/css/chunk-375d6af8.3a612c4c.css similarity index 81% rename from oh-my-scheduler-server/src/main/resources/static/css/chunk-4947264f.596fc436.css rename to oh-my-scheduler-server/src/main/resources/static/css/chunk-375d6af8.3a612c4c.css index 59a66e1e..682a7d2e 100644 --- a/oh-my-scheduler-server/src/main/resources/static/css/chunk-4947264f.596fc436.css +++ b/oh-my-scheduler-server/src/main/resources/static/css/chunk-375d6af8.3a612c4c.css @@ -1 +1 @@ -.wrap[data-v-bbc92dba]{background:#fff;display:flex;text-align:center;justify-content:space-around;align-items:center;margin:10px;box-shadow:0 2px 12px 0 rgba(0,0,0,.2);font-size:1.5rem;font-weight:bolder;height:131px}.el-table .warning-row{background:#fdf5e6}.el-table .success-row{background:#8fbc8f}.el-table .error-row{background:#ff5831} \ No newline at end of file +.wrap[data-v-46ad8e00]{background:#fff;display:flex;text-align:center;justify-content:space-around;align-items:center;margin:10px;box-shadow:0 2px 12px 0 rgba(0,0,0,.2);font-size:1.5rem;font-weight:bolder;height:131px}.el-table .warning-row{background:#fdf5e6}.el-table .success-row{background:#8fbc8f}.el-table .error-row{background:#ff5831} \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/index.html b/oh-my-scheduler-server/src/main/resources/static/index.html index c825b412..f7210887 100644 --- a/oh-my-scheduler-server/src/main/resources/static/index.html +++ b/oh-my-scheduler-server/src/main/resources/static/index.html @@ -1 +1 @@ -oms-console
\ No newline at end of file +oms-console
\ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/app.1ed552fe.js b/oh-my-scheduler-server/src/main/resources/static/js/app.b5e3dd5d.js similarity index 68% rename from oh-my-scheduler-server/src/main/resources/static/js/app.1ed552fe.js rename to oh-my-scheduler-server/src/main/resources/static/js/app.b5e3dd5d.js index 3bfaafb3..c7f6f552 100644 --- a/oh-my-scheduler-server/src/main/resources/static/js/app.1ed552fe.js +++ b/oh-my-scheduler-server/src/main/resources/static/js/app.b5e3dd5d.js @@ -1,2 +1,2 @@ -(function(e){function t(t){for(var r,a,i=t[0],c=t[1],s=t[2],l=0,f=[];l\n
\n
\n

OhMyScheduler

\n
\n\n
\n
\n
\n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Navbar.vue?vue&type=template&id=90a84a42&scoped=true&\"\nimport script from \"./Navbar.vue?vue&type=script&lang=js&\"\nexport * from \"./Navbar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Navbar.vue?vue&type=style&index=0&id=90a84a42&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"90a84a42\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('router-view')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=c8951c4e&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport Element from 'element-ui'\nimport '../element-variables.scss'\n\nVue.use(Element)\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"console\"}},[_c('navbar'),_c('sidebar')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Console.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Console.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Console.vue?vue&type=template&id=a40f99c2&scoped=true&\"\nimport script from \"./Console.vue?vue&type=script&lang=js&\"\nexport * from \"./Console.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Console.vue?vue&type=style&index=0&id=a40f99c2&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a40f99c2\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Console from \"./components/Console\";\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n routes: [\n { path: \"/\", redirect: '/welcome' },\n { path: \"/welcome\", component: () => import('./components/Welcome') },\n {\n path: \"/oms\", component: Console, redirect: \"/oms/home\", children: [\n // 二级路由\n { path: \"/oms/home\", meta: { title: '主页' }, component: () => import('./components/views/Home') },\n { path: \"/oms/job\", meta: { title: '任务管理' }, component: () => import('./components/views/JobManager') },\n { path: \"/oms/instance\", meta: { title: '实例管理' }, component: () => import('./components/views/InstanceManager') },\n ]\n },\n // 调试用\n { path: \"/sidebar\", component: () => import('./components/bar/Sidebar') },\n { path: \"/navbar\", component: () => import('./components/bar/Navbar') },\n ]\n});\n\n// 默认导出,供 main.js 引入,作为项目的路由器\nexport default router;\n","import Vue from \"vue\"\nimport Vuex from \"vuex\"\n\nVue.use(Vuex);\n\nconst store = new Vuex.Store({\n state: {\n // 包含两个属性:id和appName\n appInfo: {}\n },\n // 推荐使用 mutations 改变 store中的值,调用方法:this.$store.commit('initAppInfo', xxx)\n mutations: {\n initAppInfo(state, appInfo) {\n state.appInfo = appInfo;\n }\n }\n});\n\nexport default store;\n","let timestamp2Str = ts => {\n if (ts < 10000) {\n return \"N/A\";\n }\n try {\n let date = new Date(ts);\n let Y = date.getFullYear() + '-';\n let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';\n let D = date.getDate() + ' ';\n let h = date.getHours() + ':';\n let m = date.getMinutes() + ':';\n let s = date.getSeconds();\n return Y+M+D+h+m+s;\n }catch (e) {\n return \"N/A\";\n }\n};\n\nexport default {\n timestamp2Str\n}\n","import Vue from 'vue'\nimport App from './App.vue'\nimport ElementUI from 'element-ui'\nimport { Message } from 'element-ui';\nimport './styles.scss'\nimport './plugins/element.js'\n\nimport axios from 'axios'\nimport router from \"./router\";\nimport store from \"./stroe\";\nimport common from \"./common\";\n// import VueCookies from 'vue-cookies';\n\nVue.use(ElementUI);\n// Vue.use(VueCookies);\n\nVue.prototype.common = common;\n/* ******* axios config ******* */\nVue.prototype.axios = axios;\naxios.defaults.baseURL = \"http://localhost:7700\";\naxios.defaults.timeout = 5000;\n\nVue.config.productionTip = false;\n\nnew Vue({\n router,\n store,\n render: h => h(App),\n}).$mount('#app');\n\n// 请求返回拦截,封装公共处理逻辑\naxios.interceptors.response.use((response) => {\n if (response.data.success === true) {\n return response.data.data;\n }\n Message.warning(\"错误信息:\" + response.data.message);\n return Promise.reject(response.data.msg);\n}, (error) => {\n Message.error(error.toString());\n return Promise.reject(error);\n});\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=style&index=0&id=90245f58&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=style&index=0&id=90245f58&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"sidebar\"}},[_c('el-container',{staticStyle:{\"width\":\"200px\"}},[_c('el-aside',{attrs:{\"width\":\"200px\"}},[_c('el-menu',{attrs:{\"router\":true,\"default-active\":_vm.default_active_index}},[_c('el-menu-item',{attrs:{\"index\":\"/oms/home\"}},[_c('template',{slot:\"title\"},[_c('i',{staticClass:\"el-icon-monitor\"}),_c('span',[_vm._v(\"系统首页\")])])],2),_c('el-menu-item',{attrs:{\"index\":\"/oms/job\"}},[_c('template',{slot:\"title\"},[_c('i',{staticClass:\"el-icon-data-analysis\"}),_c('span',[_vm._v(\"任务管理\")])])],2),_c('el-menu-item',{attrs:{\"index\":\"/oms/instance\"}},[_c('template',{slot:\"title\"},[_c('i',{staticClass:\"el-icon-s-data\"}),_c('span',[_vm._v(\"运行状态\")])])],2)],1)],1)],1),_c('div',{staticClass:\"wrap\"},[_c('router-view')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Sidebar.vue?vue&type=template&id=90245f58&scoped=true&\"\nimport script from \"./Sidebar.vue?vue&type=script&lang=js&\"\nexport * from \"./Sidebar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Sidebar.vue?vue&type=style&index=0&id=90245f58&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"90245f58\",\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?7e02","webpack:///./src/components/bar/Navbar.vue?25b9","webpack:///./src/components/Console.vue?a2d0","webpack:///./src/components/bar/Navbar.vue?b06c","webpack:///src/components/bar/Navbar.vue","webpack:///./src/components/bar/Navbar.vue?657f","webpack:///./src/components/bar/Navbar.vue?f50b","webpack:///./src/App.vue?75a2","webpack:///src/App.vue","webpack:///./src/App.vue?1160","webpack:///./src/App.vue?bff9","webpack:///./src/plugins/element.js","webpack:///./src/components/Console.vue?854e","webpack:///src/components/Console.vue","webpack:///./src/components/Console.vue?ff91","webpack:///./src/components/Console.vue?1637","webpack:///./src/router.js","webpack:///./src/stroe.js","webpack:///./src/common.js","webpack:///./src/main.js","webpack:///./src/components/bar/Sidebar.vue?957f","webpack:///./src/components/bar/Sidebar.vue?af61","webpack:///src/components/bar/Sidebar.vue","webpack:///./src/components/bar/Sidebar.vue?186a","webpack:///./src/components/bar/Sidebar.vue?6b73"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","render","_vm","this","_h","$createElement","_self","_c","_m","staticRenderFns","attrs","_v","component","Vue","use","Element","VueRouter","router","routes","path","redirect","Console","children","meta","title","Vuex","store","Store","state","appInfo","mutations","initAppInfo","timestamp2Str","ts","date","Date","Y","getFullYear","M","getMonth","D","getDate","h","getHours","getMinutes","getSeconds","ElementUI","common","axios","defaults","baseURL","config","productionTip","App","$mount","interceptors","response","success","Message","warning","msg","toString","staticStyle","default_active_index","slot","staticClass"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAG/Be,GAAqBA,EAAoBhB,GAE5C,MAAMO,EAASC,OACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAGnBC,EAAqB,CACxB,IAAO,GAMJjB,EAAkB,CACrB,IAAO,GAGJK,EAAkB,GAGtB,SAASa,EAAe7B,GACvB,OAAOyB,EAAoBK,EAAI,OAAS,GAAG9B,IAAUA,GAAW,IAAM,CAAC,iBAAiB,WAAW,iBAAiB,WAAW,iBAAiB,WAAW,iBAAiB,YAAYA,GAAW,MAIpM,SAASyB,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAUgC,QAGnC,IAAIC,EAASL,EAAiB5B,GAAY,CACzCK,EAAGL,EACHkC,GAAG,EACHF,QAAS,IAUV,OANAlB,EAAQd,GAAUW,KAAKsB,EAAOD,QAASC,EAAQA,EAAOD,QAASN,GAG/DO,EAAOC,GAAI,EAGJD,EAAOD,QAKfN,EAAoBS,EAAI,SAAuBlC,GAC9C,IAAImC,EAAW,GAIXC,EAAY,CAAC,iBAAiB,EAAE,iBAAiB,GAClDR,EAAmB5B,GAAUmC,EAASvB,KAAKgB,EAAmB5B,IACzB,IAAhC4B,EAAmB5B,IAAkBoC,EAAUpC,IACtDmC,EAASvB,KAAKgB,EAAmB5B,GAAW,IAAIqC,SAAQ,SAASC,EAASC,GAIzE,IAHA,IAAIC,EAAO,QAAU,GAAGxC,IAAUA,GAAW,IAAM,CAAC,iBAAiB,WAAW,iBAAiB,WAAW,iBAAiB,WAAW,iBAAiB,YAAYA,GAAW,OAC5KyC,EAAWhB,EAAoBK,EAAIU,EACnCE,EAAmBC,SAASC,qBAAqB,QAC7CxC,EAAI,EAAGA,EAAIsC,EAAiBpC,OAAQF,IAAK,CAChD,IAAIyC,EAAMH,EAAiBtC,GACvB0C,EAAWD,EAAIE,aAAa,cAAgBF,EAAIE,aAAa,QACjE,GAAe,eAAZF,EAAIG,MAAyBF,IAAaN,GAAQM,IAAaL,GAAW,OAAOH,IAErF,IAAIW,EAAoBN,SAASC,qBAAqB,SACtD,IAAQxC,EAAI,EAAGA,EAAI6C,EAAkB3C,OAAQF,IAAK,CAC7CyC,EAAMI,EAAkB7C,GACxB0C,EAAWD,EAAIE,aAAa,aAChC,GAAGD,IAAaN,GAAQM,IAAaL,EAAU,OAAOH,IAEvD,IAAIY,EAAUP,SAASQ,cAAc,QACrCD,EAAQF,IAAM,aACdE,EAAQE,KAAO,WACfF,EAAQG,OAASf,EACjBY,EAAQI,QAAU,SAASC,GAC1B,IAAIC,EAAUD,GAASA,EAAME,QAAUF,EAAME,OAAOC,KAAOjB,EACvDkB,EAAM,IAAIC,MAAM,qBAAuB5D,EAAU,cAAgBwD,EAAU,KAC/EG,EAAIE,KAAO,wBACXF,EAAIH,QAAUA,SACP5B,EAAmB5B,GAC1BkD,EAAQY,WAAWC,YAAYb,GAC/BX,EAAOoB,IAERT,EAAQV,KAAOC,EAEf,IAAIuB,EAAOrB,SAASC,qBAAqB,QAAQ,GACjDoB,EAAKC,YAAYf,MACfgB,MAAK,WACPtC,EAAmB5B,GAAW,MAMhC,IAAImE,EAAqBxD,EAAgBX,GACzC,GAA0B,IAAvBmE,EAGF,GAAGA,EACFhC,EAASvB,KAAKuD,EAAmB,QAC3B,CAEN,IAAIC,EAAU,IAAI/B,SAAQ,SAASC,EAASC,GAC3C4B,EAAqBxD,EAAgBX,GAAW,CAACsC,EAASC,MAE3DJ,EAASvB,KAAKuD,EAAmB,GAAKC,GAGtC,IACIC,EADAC,EAAS3B,SAASQ,cAAc,UAGpCmB,EAAOC,QAAU,QACjBD,EAAOE,QAAU,IACb/C,EAAoBgD,IACvBH,EAAOI,aAAa,QAASjD,EAAoBgD,IAElDH,EAAOZ,IAAM7B,EAAe7B,GAG5B,IAAI2E,EAAQ,IAAIf,MAChBS,EAAmB,SAAUd,GAE5Be,EAAOhB,QAAUgB,EAAOjB,OAAS,KACjCuB,aAAaJ,GACb,IAAIK,EAAQlE,EAAgBX,GAC5B,GAAa,IAAV6E,EAAa,CACf,GAAGA,EAAO,CACT,IAAIC,EAAYvB,IAAyB,SAAfA,EAAMH,KAAkB,UAAYG,EAAMH,MAChE2B,EAAUxB,GAASA,EAAME,QAAUF,EAAME,OAAOC,IACpDiB,EAAMK,QAAU,iBAAmBhF,EAAU,cAAgB8E,EAAY,KAAOC,EAAU,IAC1FJ,EAAMM,KAAO,iBACbN,EAAMvB,KAAO0B,EACbH,EAAMnB,QAAUuB,EAChBF,EAAM,GAAGF,GAEVhE,EAAgBX,QAAWkF,IAG7B,IAAIV,EAAUW,YAAW,WACxBd,EAAiB,CAAEjB,KAAM,UAAWK,OAAQa,MAC1C,MACHA,EAAOhB,QAAUgB,EAAOjB,OAASgB,EACjC1B,SAASqB,KAAKC,YAAYK,GAG5B,OAAOjC,QAAQ+C,IAAIjD,IAIpBV,EAAoB4D,EAAIxE,EAGxBY,EAAoB6D,EAAI3D,EAGxBF,EAAoB8D,EAAI,SAASxD,EAASkD,EAAMO,GAC3C/D,EAAoBgE,EAAE1D,EAASkD,IAClC1E,OAAOmF,eAAe3D,EAASkD,EAAM,CAAEU,YAAY,EAAMC,IAAKJ,KAKhE/D,EAAoBoE,EAAI,SAAS9D,GACX,qBAAX+D,QAA0BA,OAAOC,aAC1CxF,OAAOmF,eAAe3D,EAAS+D,OAAOC,YAAa,CAAEC,MAAO,WAE7DzF,OAAOmF,eAAe3D,EAAS,aAAc,CAAEiE,OAAO,KAQvDvE,EAAoBwE,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQvE,EAAoBuE,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAK7F,OAAO8F,OAAO,MAGvB,GAFA5E,EAAoBoE,EAAEO,GACtB7F,OAAOmF,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOvE,EAAoB8D,EAAEa,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIR3E,EAAoB+E,EAAI,SAASxE,GAChC,IAAIwD,EAASxD,GAAUA,EAAOmE,WAC7B,WAAwB,OAAOnE,EAAO,YACtC,WAA8B,OAAOA,GAEtC,OADAP,EAAoB8D,EAAEC,EAAQ,IAAKA,GAC5BA,GAIR/D,EAAoBgE,EAAI,SAASgB,EAAQC,GAAY,OAAOnG,OAAOC,UAAUC,eAAeC,KAAK+F,EAAQC,IAGzGjF,EAAoBK,EAAI,IAGxBL,EAAoBkF,GAAK,SAAShD,GAA2B,MAApBiD,QAAQjC,MAAMhB,GAAYA,GAEnE,IAAIkD,EAAaC,OAAO,gBAAkBA,OAAO,iBAAmB,GAChEC,EAAmBF,EAAWjG,KAAK2F,KAAKM,GAC5CA,EAAWjG,KAAOf,EAClBgH,EAAaA,EAAWG,QACxB,IAAI,IAAI5G,EAAI,EAAGA,EAAIyG,EAAWvG,OAAQF,IAAKP,EAAqBgH,EAAWzG,IAC3E,IAAIU,EAAsBiG,EAI1B/F,EAAgBJ,KAAK,CAAC,EAAE,kBAEjBM,K,6EC1QT,yBAAwb,EAAG,G,oCCA3b,yBAAuf,EAAG,G,6DCA1f,yBAAse,EAAG,G,2CCAze,IAAI+F,EAAS,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAsBH,EAAII,MAAMC,GAAO,OAAOL,EAAIM,GAAG,IACnGC,EAAkB,CAAC,WAAa,IAAIP,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACG,MAAM,CAAC,GAAK,WAAW,CAACH,EAAG,MAAM,CAACG,MAAM,CAAC,GAAK,iBAAiB,CAACH,EAAG,IAAI,CAACL,EAAIS,GAAG,qBAAqBJ,EAAG,MAAM,CAACG,MAAM,CAAC,GAAK,uBCW9O,GACE,KAAF,SACE,KAFF,WAGI,MAAJ,KCf+V,I,wBCQ3VE,EAAY,eACd,EACAX,EACAQ,GACA,EACA,KACA,WACA,MAIa,aAAAG,E,gICnBX,EAAS,WAAa,IAAIV,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACG,MAAM,CAAC,GAAK,QAAQ,CAACH,EAAG,gBAAgB,IAC9IE,EAAkB,GCOtB,GACE,KAAF,OCT8T,I,wBCQ1TG,EAAY,eACd,EACA,EACAH,GACA,EACA,KACA,KACA,MAIa,EAAAG,E,iDCffC,aAAIC,IAAIC,K,qCCJJ,EAAS,WAAa,IAAIb,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACG,MAAM,CAAC,GAAK,YAAY,CAACH,EAAG,UAAUA,EAAG,YAAY,IAC3J,EAAkB,G,wBCYtB,GACE,KAAF,UACE,WAAF,CAAI,OAAJ,aAAI,QAAJ,eCfiV,ICQ7U,G,UAAY,eACd,EACA,EACA,GACA,EACA,KACA,WACA,OAIa,I,QCffM,aAAIC,IAAIE,QAER,IAAMC,EAAS,IAAID,OAAU,CACzBE,OAAQ,CACJ,CAAEC,KAAM,IAAKC,SAAU,YACvB,CAAED,KAAM,WAAYP,UAAW,kBAAM,kDACrC,CACIO,KAAM,OAAQP,UAAWS,EAASD,SAAU,YAAaE,SAAU,CAE/D,CAAEH,KAAM,YAAaI,KAAM,CAAEC,MAAO,MAAQZ,UAAW,kBAAM,kDAC7D,CAAEO,KAAM,WAAYI,KAAM,CAAEC,MAAO,QAAUZ,UAAW,kBAAM,kDAC9D,CAAEO,KAAM,gBAAiBI,KAAM,CAAEC,MAAO,QAAUZ,UAAW,kBAAM,oDAI3E,CAAEO,KAAM,WAAYP,UAAW,kBAAM,8CACrC,CAAEO,KAAM,UAAWP,UAAW,kBAAM,iDAK7BK,I,YCtBfJ,aAAIC,IAAIW,QAER,IAAMC,EAAQ,IAAID,OAAKE,MAAM,CACzBC,MAAO,CAEHC,QAAS,IAGbC,UAAW,CACPC,YADO,SACKH,EAAOC,GACfD,EAAMC,QAAUA,MAKbH,IClBXM,EAAgB,SAAAC,GAChB,GAAIA,EAAK,IACL,MAAO,MAEX,IACI,IAAIC,EAAO,IAAIC,KAAKF,GAChBG,EAAIF,EAAKG,cAAgB,IACzBC,GAAKJ,EAAKK,WAAW,EAAI,GAAK,KAAKL,EAAKK,WAAW,GAAKL,EAAKK,WAAW,GAAK,IAC7EC,EAAIN,EAAKO,UAAY,IACrBC,EAAIR,EAAKS,WAAa,IACtBtE,EAAI6D,EAAKU,aAAe,IACxBlI,EAAIwH,EAAKW,aACb,OAAQT,EAAEE,EAAEE,EAAEE,EAAErE,EAAE3D,EACrB,MAAOQ,GACJ,MAAO,QAIA,GACX8G,iBCNJnB,aAAIC,IAAIgC,KAGRjC,aAAIrH,UAAUuJ,OAASA,EAEvBlC,aAAIrH,UAAUwJ,MAAQA,IACtBA,IAAMC,SAASC,QAAU,wBACzBF,IAAMC,SAASzF,QAAU,IAEzBqD,aAAIsC,OAAOC,eAAgB,EAE3B,IAAIvC,aAAI,CACNI,SACAS,QACAzB,OAAQ,SAAAyC,GAAC,OAAIA,EAAEW,MACdC,OAAO,QAGVN,IAAMO,aAAaC,SAAS1C,KAAI,SAAC0C,GAC/B,OAA8B,IAA1BA,EAAS1K,KAAK2K,QACTD,EAAS1K,KAAKA,MAEvB4K,aAAQC,QAAQ,QAAUH,EAAS1K,KAAKkF,SACjC3C,QAAQE,OAAOiI,EAAS1K,KAAK8K,SACnC,SAACjG,GAEF,OADA+F,aAAQ/F,MAAMA,EAAMkG,YACbxI,QAAQE,OAAOoC,O,yGCvCxB,yBAAwf,EAAG,G,yCCA3f,IAAIsC,EAAS,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACG,MAAM,CAAC,GAAK,YAAY,CAACH,EAAG,eAAe,CAACuD,YAAY,CAAC,MAAQ,UAAU,CAACvD,EAAG,WAAW,CAACG,MAAM,CAAC,MAAQ,UAAU,CAACH,EAAG,UAAU,CAACG,MAAM,CAAC,QAAS,EAAK,iBAAiBR,EAAI6D,uBAAuB,CAACxD,EAAG,eAAe,CAACG,MAAM,CAAC,MAAQ,cAAc,CAACH,EAAG,WAAW,CAACyD,KAAK,SAAS,CAACzD,EAAG,IAAI,CAAC0D,YAAY,oBAAoB1D,EAAG,OAAO,CAACL,EAAIS,GAAG,aAAa,GAAGJ,EAAG,eAAe,CAACG,MAAM,CAAC,MAAQ,aAAa,CAACH,EAAG,WAAW,CAACyD,KAAK,SAAS,CAACzD,EAAG,IAAI,CAAC0D,YAAY,0BAA0B1D,EAAG,OAAO,CAACL,EAAIS,GAAG,aAAa,GAAGJ,EAAG,eAAe,CAACG,MAAM,CAAC,MAAQ,kBAAkB,CAACH,EAAG,WAAW,CAACyD,KAAK,SAAS,CAACzD,EAAG,IAAI,CAAC0D,YAAY,mBAAmB1D,EAAG,OAAO,CAACL,EAAIS,GAAG,aAAa,IAAI,IAAI,IAAI,GAAGJ,EAAG,MAAM,CAAC0D,YAAY,QAAQ,CAAC1D,EAAG,gBAAgB,IAAI,IACh0BE,EAAkB,GC+CtB,GACE,KAAF,UACE,KAFF,WAGI,MAAJ,CACM,qBAAN,WCpDgW,I,wBCQ5VG,EAAY,eACd,EACAX,EACAQ,GACA,EACA,KACA,WACA,MAIa,aAAAG,E","file":"js/app.b5e3dd5d.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-047e0794\":\"f401f9cb\",\"chunk-2d0c76e2\":\"d0248019\",\"chunk-2d21772a\":\"415195dc\",\"chunk-375d6af8\":\"231ec40c\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-047e0794\":1,\"chunk-375d6af8\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-047e0794\":\"abafcdac\",\"chunk-2d0c76e2\":\"31d6cfe0\",\"chunk-2d21772a\":\"31d6cfe0\",\"chunk-375d6af8\":\"3a612c4c\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=style&index=0&id=90a84a42&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=style&index=0&id=90a84a42&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Console.vue?vue&type=style&index=0&id=a40f99c2&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Console.vue?vue&type=style&index=0&id=a40f99c2&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"navbar\"}},[_c('div',{attrs:{\"id\":\"logo_content\"}},[_c('p',[_vm._v(\"OhMyScheduler\")])]),_c('div',{attrs:{\"id\":\"right_content\"}})])}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Navbar.vue?vue&type=template&id=90a84a42&scoped=true&\"\nimport script from \"./Navbar.vue?vue&type=script&lang=js&\"\nexport * from \"./Navbar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Navbar.vue?vue&type=style&index=0&id=90a84a42&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"90a84a42\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('router-view')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=c8951c4e&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport Element from 'element-ui'\nimport '../element-variables.scss'\n\nVue.use(Element)\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"console\"}},[_c('navbar'),_c('sidebar')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Console.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Console.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Console.vue?vue&type=template&id=a40f99c2&scoped=true&\"\nimport script from \"./Console.vue?vue&type=script&lang=js&\"\nexport * from \"./Console.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Console.vue?vue&type=style&index=0&id=a40f99c2&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a40f99c2\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Console from \"./components/Console\";\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n routes: [\n { path: \"/\", redirect: '/welcome' },\n { path: \"/welcome\", component: () => import('./components/Welcome') },\n {\n path: \"/oms\", component: Console, redirect: \"/oms/home\", children: [\n // 二级路由\n { path: \"/oms/home\", meta: { title: '主页' }, component: () => import('./components/views/Home') },\n { path: \"/oms/job\", meta: { title: '任务管理' }, component: () => import('./components/views/JobManager') },\n { path: \"/oms/instance\", meta: { title: '实例管理' }, component: () => import('./components/views/InstanceManager') },\n ]\n },\n // 调试用\n { path: \"/sidebar\", component: () => import('./components/bar/Sidebar') },\n { path: \"/navbar\", component: () => import('./components/bar/Navbar') },\n ]\n});\n\n// 默认导出,供 main.js 引入,作为项目的路由器\nexport default router;\n","import Vue from \"vue\"\nimport Vuex from \"vuex\"\n\nVue.use(Vuex);\n\nconst store = new Vuex.Store({\n state: {\n // 包含两个属性:id和appName\n appInfo: {}\n },\n // 推荐使用 mutations 改变 store中的值,调用方法:this.$store.commit('initAppInfo', xxx)\n mutations: {\n initAppInfo(state, appInfo) {\n state.appInfo = appInfo;\n }\n }\n});\n\nexport default store;\n","let timestamp2Str = ts => {\n if (ts < 10000) {\n return \"N/A\";\n }\n try {\n let date = new Date(ts);\n let Y = date.getFullYear() + '-';\n let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';\n let D = date.getDate() + ' ';\n let h = date.getHours() + ':';\n let m = date.getMinutes() + ':';\n let s = date.getSeconds();\n return Y+M+D+h+m+s;\n }catch (e) {\n return \"N/A\";\n }\n};\n\nexport default {\n timestamp2Str\n}\n","import Vue from 'vue'\nimport App from './App.vue'\nimport ElementUI from 'element-ui'\nimport { Message } from 'element-ui';\nimport './styles.scss'\nimport './plugins/element.js'\n\nimport axios from 'axios'\nimport router from \"./router\";\nimport store from \"./stroe\";\nimport common from \"./common\";\n// import VueCookies from 'vue-cookies';\n\nVue.use(ElementUI);\n// Vue.use(VueCookies);\n\nVue.prototype.common = common;\n/* ******* axios config ******* */\nVue.prototype.axios = axios;\naxios.defaults.baseURL = \"http://localhost:7700\";\naxios.defaults.timeout = 5000;\n\nVue.config.productionTip = false;\n\nnew Vue({\n router,\n store,\n render: h => h(App),\n}).$mount('#app');\n\n// 请求返回拦截,封装公共处理逻辑\naxios.interceptors.response.use((response) => {\n if (response.data.success === true) {\n return response.data.data;\n }\n Message.warning(\"错误信息:\" + response.data.message);\n return Promise.reject(response.data.msg);\n}, (error) => {\n Message.error(error.toString());\n return Promise.reject(error);\n});\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=style&index=0&id=90245f58&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=style&index=0&id=90245f58&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"sidebar\"}},[_c('el-container',{staticStyle:{\"width\":\"200px\"}},[_c('el-aside',{attrs:{\"width\":\"200px\"}},[_c('el-menu',{attrs:{\"router\":true,\"default-active\":_vm.default_active_index}},[_c('el-menu-item',{attrs:{\"index\":\"/oms/home\"}},[_c('template',{slot:\"title\"},[_c('i',{staticClass:\"el-icon-monitor\"}),_c('span',[_vm._v(\"系统首页\")])])],2),_c('el-menu-item',{attrs:{\"index\":\"/oms/job\"}},[_c('template',{slot:\"title\"},[_c('i',{staticClass:\"el-icon-data-analysis\"}),_c('span',[_vm._v(\"任务管理\")])])],2),_c('el-menu-item',{attrs:{\"index\":\"/oms/instance\"}},[_c('template',{slot:\"title\"},[_c('i',{staticClass:\"el-icon-s-data\"}),_c('span',[_vm._v(\"运行状态\")])])],2)],1)],1)],1),_c('div',{staticClass:\"wrap\"},[_c('router-view')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Sidebar.vue?vue&type=template&id=90245f58&scoped=true&\"\nimport script from \"./Sidebar.vue?vue&type=script&lang=js&\"\nexport * from \"./Sidebar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Sidebar.vue?vue&type=style&index=0&id=90245f58&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"90245f58\",\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/chunk-047e0794.f401f9cb.js b/oh-my-scheduler-server/src/main/resources/static/js/chunk-047e0794.f401f9cb.js new file mode 100644 index 00000000..8c0f6d10 --- /dev/null +++ b/oh-my-scheduler-server/src/main/resources/static/js/chunk-047e0794.f401f9cb.js @@ -0,0 +1,2 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-047e0794"],{"1ddd":function(e,t,i){"use strict";i.r(t);var s=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{attrs:{id:"welcome"}},[i("el-button",{attrs:{type:"primary",plain:""},on:{click:function(t){e.appRegisterFormVisible=!0}}},[e._v("应用注册")]),i("div",{attrs:{id:"entrance"}},[i("el-select",{attrs:{id:"appSelect",filterable:"",remote:"","reserve-keyword":"",placeholder:"请输入应用名称","remote-method":e.fetchAppNames,loading:e.loading},on:{change:e.selectedApp},model:{value:e.selectedAppInfo,callback:function(t){e.selectedAppInfo=t},expression:"selectedAppInfo"}},e._l(e.appInfoList,(function(e){return i("el-option",{key:e.id,attrs:{label:e.appName,value:e}})})),1)],1),i("el-button",{attrs:{type:"success",plain:""},on:{click:function(t){e.userRegisterFormVisible=!0}}},[e._v("用户注册")]),i("el-dialog",{attrs:{title:"应用注册",visible:e.appRegisterFormVisible},on:{"update:visible":function(t){e.appRegisterFormVisible=t}}},[i("el-form",{attrs:{model:e.appRegisterForm}},[i("el-form-item",{attrs:{label:"应用名称"}},[i("el-input",{model:{value:e.appRegisterForm.appName,callback:function(t){e.$set(e.appRegisterForm,"appName",t)},expression:"appRegisterForm.appName"}})],1),i("el-form-item",{attrs:{label:"应用描述"}},[i("el-input",{model:{value:e.appRegisterForm.description,callback:function(t){e.$set(e.appRegisterForm,"description",t)},expression:"appRegisterForm.description"}})],1),i("el-form-item",[i("el-button",{attrs:{type:"primary"},on:{click:e.registerApp}},[e._v("注册")]),i("el-button",{on:{click:function(t){e.appRegisterFormVisible=!1}}},[e._v("取消")])],1)],1)],1),i("el-dialog",{attrs:{title:"用户注册",visible:e.userRegisterFormVisible},on:{"update:visible":function(t){e.userRegisterFormVisible=t}}},[i("el-form",{attrs:{model:e.userRegisterForm}},[i("el-form-item",{attrs:{label:"姓名"}},[i("el-input",{model:{value:e.userRegisterForm.username,callback:function(t){e.$set(e.userRegisterForm,"username",t)},expression:"userRegisterForm.username"}})],1),i("el-form-item",{attrs:{label:"手机号"}},[i("el-input",{model:{value:e.userRegisterForm.phone,callback:function(t){e.$set(e.userRegisterForm,"phone",t)},expression:"userRegisterForm.phone"}})],1),i("el-form-item",{attrs:{label:"邮箱地址"}},[i("el-input",{model:{value:e.userRegisterForm.email,callback:function(t){e.$set(e.userRegisterForm,"email",t)},expression:"userRegisterForm.email"}})],1),i("el-form-item",[i("el-button",{attrs:{type:"primary"},on:{click:e.registerUser}},[e._v("注册")]),i("el-button",{on:{click:function(t){e.userRegisterFormVisible=!1}}},[e._v("取消")])],1)],1)],1)],1)},r=[],o={name:"Welcome",data:function(){return{selectedAppInfo:{},appInfoList:[],appRegisterFormVisible:!1,userRegisterFormVisible:!1,appRegisterForm:{appName:"",description:""},userRegisterForm:{username:"",phone:"",email:""}}},methods:{fetchAppNames:function(e){var t=this,i="/appInfo/list?condition="+e;this.axios.get(i).then((function(e){t.appInfoList=e}),(function(e){return t.$message.error(e)}))},selectedApp:function(){this.$store.commit("initAppInfo",this.selectedAppInfo),this.$router.push("/oms/home")},registerApp:function(){var e=this;this.axios.post("/appInfo/save",this.appRegisterForm).then((function(){e.$message.success("应用注册成功!"),e.appRegisterFormVisible=!1}),e.appRegisterFormVisible=!1)},registerUser:function(){var e=this;this.axios.post("/user/save",this.userRegisterForm).then((function(){e.$message.success("用户注册成功!"),e.userRegisterFormVisible=!1}),e.userRegisterFormVisible=!1)}}},n=o,l=(i("5676"),i("2877")),a=Object(l["a"])(n,s,r,!1,null,"1e8c2f69",null);t["default"]=a.exports},4705:function(e,t,i){},5676:function(e,t,i){"use strict";var s=i("4705"),r=i.n(s);r.a}}]); +//# sourceMappingURL=chunk-047e0794.f401f9cb.js.map \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/chunk-047e0794.f401f9cb.js.map b/oh-my-scheduler-server/src/main/resources/static/js/chunk-047e0794.f401f9cb.js.map new file mode 100644 index 00000000..814da283 --- /dev/null +++ b/oh-my-scheduler-server/src/main/resources/static/js/chunk-047e0794.f401f9cb.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/Welcome.vue?2ac7","webpack:///src/components/Welcome.vue","webpack:///./src/components/Welcome.vue?ec3a","webpack:///./src/components/Welcome.vue?6fac","webpack:///./src/components/Welcome.vue?1127"],"names":["render","_vm","this","_h","$createElement","_c","_self","attrs","on","$event","appRegisterFormVisible","_v","fetchAppNames","loading","selectedApp","model","value","callback","$$v","selectedAppInfo","expression","_l","appInfo","key","id","appName","userRegisterFormVisible","appRegisterForm","$set","registerApp","userRegisterForm","registerUser","staticRenderFns","component"],"mappings":"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","file":"js/chunk-047e0794.f401f9cb.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"welcome\"}},[_c('el-button',{attrs:{\"type\":\"primary\",\"plain\":\"\"},on:{\"click\":function($event){_vm.appRegisterFormVisible = true}}},[_vm._v(\"应用注册\")]),_c('div',{attrs:{\"id\":\"entrance\"}},[_c('el-select',{attrs:{\"id\":\"appSelect\",\"filterable\":\"\",\"remote\":\"\",\"reserve-keyword\":\"\",\"placeholder\":\"请输入应用名称\",\"remote-method\":_vm.fetchAppNames,\"loading\":_vm.loading},on:{\"change\":_vm.selectedApp},model:{value:(_vm.selectedAppInfo),callback:function ($$v) {_vm.selectedAppInfo=$$v},expression:\"selectedAppInfo\"}},_vm._l((_vm.appInfoList),function(appInfo){return _c('el-option',{key:appInfo.id,attrs:{\"label\":appInfo.appName,\"value\":appInfo}})}),1)],1),_c('el-button',{attrs:{\"type\":\"success\",\"plain\":\"\"},on:{\"click\":function($event){_vm.userRegisterFormVisible = true}}},[_vm._v(\"用户注册\")]),_c('el-dialog',{attrs:{\"title\":\"应用注册\",\"visible\":_vm.appRegisterFormVisible},on:{\"update:visible\":function($event){_vm.appRegisterFormVisible=$event}}},[_c('el-form',{attrs:{\"model\":_vm.appRegisterForm}},[_c('el-form-item',{attrs:{\"label\":\"应用名称\"}},[_c('el-input',{model:{value:(_vm.appRegisterForm.appName),callback:function ($$v) {_vm.$set(_vm.appRegisterForm, \"appName\", $$v)},expression:\"appRegisterForm.appName\"}})],1),_c('el-form-item',{attrs:{\"label\":\"应用描述\"}},[_c('el-input',{model:{value:(_vm.appRegisterForm.description),callback:function ($$v) {_vm.$set(_vm.appRegisterForm, \"description\", $$v)},expression:\"appRegisterForm.description\"}})],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.registerApp}},[_vm._v(\"注册\")]),_c('el-button',{on:{\"click\":function($event){_vm.appRegisterFormVisible = false}}},[_vm._v(\"取消\")])],1)],1)],1),_c('el-dialog',{attrs:{\"title\":\"用户注册\",\"visible\":_vm.userRegisterFormVisible},on:{\"update:visible\":function($event){_vm.userRegisterFormVisible=$event}}},[_c('el-form',{attrs:{\"model\":_vm.userRegisterForm}},[_c('el-form-item',{attrs:{\"label\":\"姓名\"}},[_c('el-input',{model:{value:(_vm.userRegisterForm.username),callback:function ($$v) {_vm.$set(_vm.userRegisterForm, \"username\", $$v)},expression:\"userRegisterForm.username\"}})],1),_c('el-form-item',{attrs:{\"label\":\"手机号\"}},[_c('el-input',{model:{value:(_vm.userRegisterForm.phone),callback:function ($$v) {_vm.$set(_vm.userRegisterForm, \"phone\", $$v)},expression:\"userRegisterForm.phone\"}})],1),_c('el-form-item',{attrs:{\"label\":\"邮箱地址\"}},[_c('el-input',{model:{value:(_vm.userRegisterForm.email),callback:function ($$v) {_vm.$set(_vm.userRegisterForm, \"email\", $$v)},expression:\"userRegisterForm.email\"}})],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.registerUser}},[_vm._v(\"注册\")]),_c('el-button',{on:{\"click\":function($event){_vm.userRegisterFormVisible = false}}},[_vm._v(\"取消\")])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Welcome.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Welcome.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Welcome.vue?vue&type=template&id=1e8c2f69&scoped=true&\"\nimport script from \"./Welcome.vue?vue&type=script&lang=js&\"\nexport * from \"./Welcome.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Welcome.vue?vue&type=style&index=0&id=1e8c2f69&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1e8c2f69\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Welcome.vue?vue&type=style&index=0&id=1e8c2f69&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Welcome.vue?vue&type=style&index=0&id=1e8c2f69&scoped=true&lang=css&\""],"sourceRoot":""} \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/chunk-375d6af8.231ec40c.js b/oh-my-scheduler-server/src/main/resources/static/js/chunk-375d6af8.231ec40c.js new file mode 100644 index 00000000..369f449b --- /dev/null +++ b/oh-my-scheduler-server/src/main/resources/static/js/chunk-375d6af8.231ec40c.js @@ -0,0 +1,2 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-375d6af8"],{1579:function(t,s,a){},6337:function(t,s,a){"use strict";var e=a("ffdc"),n=a.n(e);n.a},"7d8a":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{attrs:{id:"home"}},[a("el-row",{attrs:{gutter:24}},[a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("任务总数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.jobCount))])]),a("i",{staticClass:"el-icon-orange"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("当前运行实例数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.runningInstanceCount))])]),a("i",{staticClass:"el-icon-loading"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("近期失败任务数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.failedInstanceCount))])]),a("i",{staticClass:"el-icon-bell"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("集群机器数")]),a("div",{staticClass:"text"},[t._v(t._s(t.activeWorkerCount))])]),a("i",{staticClass:"el-icon-cpu"})])])],1),a("el-row",[a("el-col",{attrs:{span:24}},[a("el-table",{staticStyle:{width:"100%"},attrs:{data:t.workerList,height:"400px","row-class-name":t.workerTableRowClassName}},[a("el-table-column",{attrs:{prop:"address",label:"机器地址"}}),a("el-table-column",{attrs:{prop:"cpuLoad",label:"CPU占用"}}),a("el-table-column",{attrs:{prop:"memoryLoad",label:"内存占用"}}),a("el-table-column",{attrs:{prop:"diskLoad",label:"磁盘占用"}})],1)],1)],1)],1)},n=[],i={name:"Home",data:function(){return{systemInfo:{jobCount:"N/A",runningInstanceCount:"N/A",failedInstanceCount:"N/A"},activeWorkerCount:"N/A",workerList:[]}},methods:{workerTableRowClassName:function(t){var s=t.row;switch(s.status){case 1:return"success-row";case 2:return"warning-row";case 3:return"error-row"}}},mounted:function(){var t=this,s=t.$store.state.appInfo.id;t.axios.get("/system/overview?appId="+s).then((function(s){return t.systemInfo=s})),t.axios.get("/system/listWorker?appId="+s).then((function(s){t.workerList=s,t.activeWorkerCount=t.workerList.length}))}},r=i,o=(a("a735"),a("6337"),a("2877")),l=Object(o["a"])(r,e,n,!1,null,"46ad8e00",null);s["default"]=l.exports},a735:function(t,s,a){"use strict";var e=a("1579"),n=a.n(e);n.a},ffdc:function(t,s,a){}}]); +//# sourceMappingURL=chunk-375d6af8.231ec40c.js.map \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/chunk-375d6af8.231ec40c.js.map b/oh-my-scheduler-server/src/main/resources/static/js/chunk-375d6af8.231ec40c.js.map new file mode 100644 index 00000000..284906df --- /dev/null +++ b/oh-my-scheduler-server/src/main/resources/static/js/chunk-375d6af8.231ec40c.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/views/Home.vue?a265","webpack:///./src/components/views/Home.vue?d2d0","webpack:///src/components/views/Home.vue","webpack:///./src/components/views/Home.vue?65e5","webpack:///./src/components/views/Home.vue?577d","webpack:///./src/components/views/Home.vue?fe24"],"names":["render","_vm","this","_h","$createElement","_c","_self","attrs","staticClass","_v","_s","systemInfo","jobCount","runningInstanceCount","failedInstanceCount","activeWorkerCount","staticStyle","workerList","workerTableRowClassName","staticRenderFns","component"],"mappings":"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","file":"js/chunk-375d6af8.231ec40c.js","sourcesContent":["import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=1&lang=css&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=1&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"home\"}},[_c('el-row',{attrs:{\"gutter\":24}},[_c('el-col',{attrs:{\"span\":6}},[_c('div',{staticClass:\"wrap\"},[_c('div',{staticClass:\"grid-content bg-purple\"},[_c('div',{staticClass:\"text\"},[_vm._v(\"任务总数\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.systemInfo.jobCount))])]),_c('i',{staticClass:\"el-icon-orange\"})])]),_c('el-col',{attrs:{\"span\":6}},[_c('div',{staticClass:\"wrap\"},[_c('div',{staticClass:\"grid-content bg-purple\"},[_c('div',{staticClass:\"text\"},[_vm._v(\"当前运行实例数\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.systemInfo.runningInstanceCount))])]),_c('i',{staticClass:\"el-icon-loading\"})])]),_c('el-col',{attrs:{\"span\":6}},[_c('div',{staticClass:\"wrap\"},[_c('div',{staticClass:\"grid-content bg-purple\"},[_c('div',{staticClass:\"text\"},[_vm._v(\"近期失败任务数\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.systemInfo.failedInstanceCount))])]),_c('i',{staticClass:\"el-icon-bell\"})])]),_c('el-col',{attrs:{\"span\":6}},[_c('div',{staticClass:\"wrap\"},[_c('div',{staticClass:\"grid-content bg-purple\"},[_c('div',{staticClass:\"text\"},[_vm._v(\"集群机器数\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.activeWorkerCount))])]),_c('i',{staticClass:\"el-icon-cpu\"})])])],1),_c('el-row',[_c('el-col',{attrs:{\"span\":24}},[_c('el-table',{staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.workerList,\"height\":\"400px\",\"row-class-name\":_vm.workerTableRowClassName}},[_c('el-table-column',{attrs:{\"prop\":\"address\",\"label\":\"机器地址\"}}),_c('el-table-column',{attrs:{\"prop\":\"cpuLoad\",\"label\":\"CPU占用\"}}),_c('el-table-column',{attrs:{\"prop\":\"memoryLoad\",\"label\":\"内存占用\"}}),_c('el-table-column',{attrs:{\"prop\":\"diskLoad\",\"label\":\"磁盘占用\"}})],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=46ad8e00&scoped=true&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Home.vue?vue&type=style&index=0&id=46ad8e00&scoped=true&lang=css&\"\nimport style1 from \"./Home.vue?vue&type=style&index=1&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"46ad8e00\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=0&id=46ad8e00&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=0&id=46ad8e00&scoped=true&lang=css&\""],"sourceRoot":""} \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/chunk-4947264f.10340ff7.js b/oh-my-scheduler-server/src/main/resources/static/js/chunk-4947264f.10340ff7.js deleted file mode 100644 index d7a35680..00000000 --- a/oh-my-scheduler-server/src/main/resources/static/js/chunk-4947264f.10340ff7.js +++ /dev/null @@ -1,2 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-4947264f"],{"05fd":function(t,s,a){"use strict";var e=a("ac51"),n=a.n(e);n.a},6337:function(t,s,a){"use strict";var e=a("ffdc"),n=a.n(e);n.a},"7d8a":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{attrs:{id:"home"}},[a("el-row",{attrs:{gutter:24}},[a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("任务总数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.jobCount))])]),a("i",{staticClass:"el-icon-orange"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("当前运行实例数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.runningInstanceCount))])]),a("i",{staticClass:"el-icon-loading"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("近期失败任务数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.failedInstanceCount))])]),a("i",{staticClass:"el-icon-bell"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("集群机器数")]),a("div",{staticClass:"text"},[t._v(t._s(t.activeWorkerCount))])]),a("i",{staticClass:"el-icon-grape"})])])],1),a("el-row",[a("el-col",{attrs:{span:24}},[a("el-table",{staticStyle:{width:"100%"},attrs:{data:t.workerList,height:"400px","row-class-name":t.workerTableRowClassName}},[a("el-table-column",{attrs:{prop:"address",label:"机器地址"}}),a("el-table-column",{attrs:{prop:"cpuLoad",label:"CPU占用"}}),a("el-table-column",{attrs:{prop:"memoryLoad",label:"内存占用"}}),a("el-table-column",{attrs:{prop:"diskLoad",label:"磁盘占用"}})],1)],1)],1)],1)},n=[],r={name:"Home",data:function(){return{systemInfo:{jobCount:"N/A",runningInstanceCount:"N/A",failedInstanceCount:"N/A"},activeWorkerCount:"N/A",workerList:[]}},methods:{workerTableRowClassName:function(t){var s=t.row;switch(s.status){case 1:return"success-row";case 2:return"warning-row";case 3:return"error-row"}}},mounted:function(){var t=this,s=t.$store.state.appInfo.id;t.axios.get("/system/overview?appId="+s).then((function(s){return t.systemInfo=s})),t.axios.get("/system/listWorker?appId="+s).then((function(s){t.workerList=s,t.activeWorkerCount=t.workerList.length}))}},i=r,o=(a("05fd"),a("6337"),a("2877")),l=Object(o["a"])(i,e,n,!1,null,"bbc92dba",null);s["default"]=l.exports},ac51:function(t,s,a){},ffdc:function(t,s,a){}}]); -//# sourceMappingURL=chunk-4947264f.10340ff7.js.map \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/chunk-4947264f.10340ff7.js.map b/oh-my-scheduler-server/src/main/resources/static/js/chunk-4947264f.10340ff7.js.map deleted file mode 100644 index 5037d649..00000000 --- a/oh-my-scheduler-server/src/main/resources/static/js/chunk-4947264f.10340ff7.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/views/Home.vue?52c4","webpack:///./src/components/views/Home.vue?a265","webpack:///./src/components/views/Home.vue?3177","webpack:///src/components/views/Home.vue","webpack:///./src/components/views/Home.vue?65e5","webpack:///./src/components/views/Home.vue?577d"],"names":["render","_vm","this","_h","$createElement","_c","_self","attrs","staticClass","_v","_s","systemInfo","jobCount","runningInstanceCount","failedInstanceCount","activeWorkerCount","staticStyle","workerList","workerTableRowClassName","staticRenderFns","component"],"mappings":"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","file":"js/chunk-4947264f.10340ff7.js","sourcesContent":["import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=0&id=bbc92dba&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=0&id=bbc92dba&scoped=true&lang=css&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=1&lang=css&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=1&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"home\"}},[_c('el-row',{attrs:{\"gutter\":24}},[_c('el-col',{attrs:{\"span\":6}},[_c('div',{staticClass:\"wrap\"},[_c('div',{staticClass:\"grid-content bg-purple\"},[_c('div',{staticClass:\"text\"},[_vm._v(\"任务总数\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.systemInfo.jobCount))])]),_c('i',{staticClass:\"el-icon-orange\"})])]),_c('el-col',{attrs:{\"span\":6}},[_c('div',{staticClass:\"wrap\"},[_c('div',{staticClass:\"grid-content bg-purple\"},[_c('div',{staticClass:\"text\"},[_vm._v(\"当前运行实例数\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.systemInfo.runningInstanceCount))])]),_c('i',{staticClass:\"el-icon-loading\"})])]),_c('el-col',{attrs:{\"span\":6}},[_c('div',{staticClass:\"wrap\"},[_c('div',{staticClass:\"grid-content bg-purple\"},[_c('div',{staticClass:\"text\"},[_vm._v(\"近期失败任务数\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.systemInfo.failedInstanceCount))])]),_c('i',{staticClass:\"el-icon-bell\"})])]),_c('el-col',{attrs:{\"span\":6}},[_c('div',{staticClass:\"wrap\"},[_c('div',{staticClass:\"grid-content bg-purple\"},[_c('div',{staticClass:\"text\"},[_vm._v(\"集群机器数\")]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.activeWorkerCount))])]),_c('i',{staticClass:\"el-icon-grape\"})])])],1),_c('el-row',[_c('el-col',{attrs:{\"span\":24}},[_c('el-table',{staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.workerList,\"height\":\"400px\",\"row-class-name\":_vm.workerTableRowClassName}},[_c('el-table-column',{attrs:{\"prop\":\"address\",\"label\":\"机器地址\"}}),_c('el-table-column',{attrs:{\"prop\":\"cpuLoad\",\"label\":\"CPU占用\"}}),_c('el-table-column',{attrs:{\"prop\":\"memoryLoad\",\"label\":\"内存占用\"}}),_c('el-table-column',{attrs:{\"prop\":\"diskLoad\",\"label\":\"磁盘占用\"}})],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=bbc92dba&scoped=true&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Home.vue?vue&type=style&index=0&id=bbc92dba&scoped=true&lang=css&\"\nimport style1 from \"./Home.vue?vue&type=style&index=1&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"bbc92dba\",\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/chunk-7602a25e.165fb79d.js b/oh-my-scheduler-server/src/main/resources/static/js/chunk-7602a25e.165fb79d.js deleted file mode 100644 index 34569e4f..00000000 --- a/oh-my-scheduler-server/src/main/resources/static/js/chunk-7602a25e.165fb79d.js +++ /dev/null @@ -1,2 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-7602a25e"],{"1ddd":function(e,t,i){"use strict";i.r(t);var s=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{attrs:{id:"welcome"}},[i("div",{attrs:{id:"entrance"}},[i("el-select",{attrs:{filterable:"",remote:"","reserve-keyword":"",placeholder:"请输入应用名称","remote-method":e.fetchAppNames,loading:e.loading},on:{change:e.selectedApp},model:{value:e.selectedAppInfo,callback:function(t){e.selectedAppInfo=t},expression:"selectedAppInfo"}},e._l(e.appInfoList,(function(e){return i("el-option",{key:e.id,attrs:{label:e.appName,value:e}})})),1)],1),i("div",{attrs:{id:"register"}},[i("el-button",{attrs:{type:"primary",plain:""},on:{click:function(t){e.appRegisterFormVisible=!0}}},[e._v("应用注册")]),i("el-button",{attrs:{type:"success",plain:""},on:{click:function(t){e.userRegisterFormVisible=!0}}},[e._v("用户注册")])],1),i("el-dialog",{attrs:{title:"应用注册",visible:e.appRegisterFormVisible},on:{"update:visible":function(t){e.appRegisterFormVisible=t}}},[i("el-form",{attrs:{model:e.appRegisterForm}},[i("el-form-item",{attrs:{label:"应用名称"}},[i("el-input",{model:{value:e.appRegisterForm.appName,callback:function(t){e.$set(e.appRegisterForm,"appName",t)},expression:"appRegisterForm.appName"}})],1),i("el-form-item",{attrs:{label:"应用描述"}},[i("el-input",{model:{value:e.appRegisterForm.description,callback:function(t){e.$set(e.appRegisterForm,"description",t)},expression:"appRegisterForm.description"}})],1),i("el-form-item",[i("el-button",{attrs:{type:"primary"},on:{click:e.registerApp}},[e._v("注册")]),i("el-button",{on:{click:function(t){e.appRegisterFormVisible=!1}}},[e._v("取消")])],1)],1)],1),i("el-dialog",{attrs:{title:"用户注册",visible:e.userRegisterFormVisible},on:{"update:visible":function(t){e.userRegisterFormVisible=t}}},[i("el-form",{attrs:{model:e.userRegisterForm}},[i("el-form-item",{attrs:{label:"姓名"}},[i("el-input",{model:{value:e.userRegisterForm.username,callback:function(t){e.$set(e.userRegisterForm,"username",t)},expression:"userRegisterForm.username"}})],1),i("el-form-item",{attrs:{label:"手机号"}},[i("el-input",{model:{value:e.userRegisterForm.phone,callback:function(t){e.$set(e.userRegisterForm,"phone",t)},expression:"userRegisterForm.phone"}})],1),i("el-form-item",{attrs:{label:"邮箱地址"}},[i("el-input",{model:{value:e.userRegisterForm.email,callback:function(t){e.$set(e.userRegisterForm,"email",t)},expression:"userRegisterForm.email"}})],1),i("el-form-item",[i("el-button",{attrs:{type:"primary"},on:{click:e.registerUser}},[e._v("注册")]),i("el-button",{on:{click:function(t){e.userRegisterFormVisible=!1}}},[e._v("取消")])],1)],1)],1)],1)},r=[],o={name:"Welcome",data:function(){return{selectedAppInfo:{},appInfoList:[],appRegisterFormVisible:!1,userRegisterFormVisible:!1,appRegisterForm:{appName:"",description:""},userRegisterForm:{username:"",phone:"",email:""}}},methods:{fetchAppNames:function(e){var t=this,i="/appInfo/list?condition="+e;this.axios.get(i).then((function(e){t.appInfoList=e}),(function(e){return t.$message.error(e)}))},selectedApp:function(){this.$store.commit("initAppInfo",this.selectedAppInfo),this.$router.push("/oms/home")},registerApp:function(){var e=this;this.axios.post("/appInfo/save",this.appRegisterForm).then((function(){e.$message.success("应用注册成功!"),e.appRegisterFormVisible=!1}),e.appRegisterFormVisible=!1)},registerUser:function(){var e=this;this.axios.post("/user/save",this.userRegisterForm).then((function(){e.$message.success("用户注册成功!"),e.userRegisterFormVisible=!1}),e.userRegisterFormVisible=!1)}}},n=o,a=(i("570a"),i("2877")),l=Object(a["a"])(n,s,r,!1,null,"175a435c",null);t["default"]=l.exports},4112:function(e,t,i){},"570a":function(e,t,i){"use strict";var s=i("4112"),r=i.n(s);r.a}}]); -//# sourceMappingURL=chunk-7602a25e.165fb79d.js.map \ No newline at end of file diff --git a/oh-my-scheduler-server/src/main/resources/static/js/chunk-7602a25e.165fb79d.js.map b/oh-my-scheduler-server/src/main/resources/static/js/chunk-7602a25e.165fb79d.js.map deleted file mode 100644 index 2343735e..00000000 --- a/oh-my-scheduler-server/src/main/resources/static/js/chunk-7602a25e.165fb79d.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/Welcome.vue?8540","webpack:///src/components/Welcome.vue","webpack:///./src/components/Welcome.vue?ec3a","webpack:///./src/components/Welcome.vue?6fac","webpack:///./src/components/Welcome.vue?b234"],"names":["render","_vm","this","_h","$createElement","_c","_self","attrs","fetchAppNames","loading","on","selectedApp","model","value","callback","$$v","selectedAppInfo","expression","_l","appInfo","key","id","appName","$event","appRegisterFormVisible","_v","userRegisterFormVisible","appRegisterForm","$set","registerApp","userRegisterForm","registerUser","staticRenderFns","component"],"mappings":"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","file":"js/chunk-7602a25e.165fb79d.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"welcome\"}},[_c('div',{attrs:{\"id\":\"entrance\"}},[_c('el-select',{attrs:{\"filterable\":\"\",\"remote\":\"\",\"reserve-keyword\":\"\",\"placeholder\":\"请输入应用名称\",\"remote-method\":_vm.fetchAppNames,\"loading\":_vm.loading},on:{\"change\":_vm.selectedApp},model:{value:(_vm.selectedAppInfo),callback:function ($$v) {_vm.selectedAppInfo=$$v},expression:\"selectedAppInfo\"}},_vm._l((_vm.appInfoList),function(appInfo){return _c('el-option',{key:appInfo.id,attrs:{\"label\":appInfo.appName,\"value\":appInfo}})}),1)],1),_c('div',{attrs:{\"id\":\"register\"}},[_c('el-button',{attrs:{\"type\":\"primary\",\"plain\":\"\"},on:{\"click\":function($event){_vm.appRegisterFormVisible = true}}},[_vm._v(\"应用注册\")]),_c('el-button',{attrs:{\"type\":\"success\",\"plain\":\"\"},on:{\"click\":function($event){_vm.userRegisterFormVisible = true}}},[_vm._v(\"用户注册\")])],1),_c('el-dialog',{attrs:{\"title\":\"应用注册\",\"visible\":_vm.appRegisterFormVisible},on:{\"update:visible\":function($event){_vm.appRegisterFormVisible=$event}}},[_c('el-form',{attrs:{\"model\":_vm.appRegisterForm}},[_c('el-form-item',{attrs:{\"label\":\"应用名称\"}},[_c('el-input',{model:{value:(_vm.appRegisterForm.appName),callback:function ($$v) {_vm.$set(_vm.appRegisterForm, \"appName\", $$v)},expression:\"appRegisterForm.appName\"}})],1),_c('el-form-item',{attrs:{\"label\":\"应用描述\"}},[_c('el-input',{model:{value:(_vm.appRegisterForm.description),callback:function ($$v) {_vm.$set(_vm.appRegisterForm, \"description\", $$v)},expression:\"appRegisterForm.description\"}})],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.registerApp}},[_vm._v(\"注册\")]),_c('el-button',{on:{\"click\":function($event){_vm.appRegisterFormVisible = false}}},[_vm._v(\"取消\")])],1)],1)],1),_c('el-dialog',{attrs:{\"title\":\"用户注册\",\"visible\":_vm.userRegisterFormVisible},on:{\"update:visible\":function($event){_vm.userRegisterFormVisible=$event}}},[_c('el-form',{attrs:{\"model\":_vm.userRegisterForm}},[_c('el-form-item',{attrs:{\"label\":\"姓名\"}},[_c('el-input',{model:{value:(_vm.userRegisterForm.username),callback:function ($$v) {_vm.$set(_vm.userRegisterForm, \"username\", $$v)},expression:\"userRegisterForm.username\"}})],1),_c('el-form-item',{attrs:{\"label\":\"手机号\"}},[_c('el-input',{model:{value:(_vm.userRegisterForm.phone),callback:function ($$v) {_vm.$set(_vm.userRegisterForm, \"phone\", $$v)},expression:\"userRegisterForm.phone\"}})],1),_c('el-form-item',{attrs:{\"label\":\"邮箱地址\"}},[_c('el-input',{model:{value:(_vm.userRegisterForm.email),callback:function ($$v) {_vm.$set(_vm.userRegisterForm, \"email\", $$v)},expression:\"userRegisterForm.email\"}})],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.registerUser}},[_vm._v(\"注册\")]),_c('el-button',{on:{\"click\":function($event){_vm.userRegisterFormVisible = false}}},[_vm._v(\"取消\")])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Welcome.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Welcome.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Welcome.vue?vue&type=template&id=175a435c&scoped=true&\"\nimport script from \"./Welcome.vue?vue&type=script&lang=js&\"\nexport * from \"./Welcome.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Welcome.vue?vue&type=style&index=0&id=175a435c&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"175a435c\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Welcome.vue?vue&type=style&index=0&id=175a435c&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Welcome.vue?vue&type=style&index=0&id=175a435c&scoped=true&lang=css&\""],"sourceRoot":""} \ No newline at end of file diff --git a/oh-my-scheduler-worker-samples/pom.xml b/oh-my-scheduler-worker-samples/pom.xml index dc985e6a..14887df1 100644 --- a/oh-my-scheduler-worker-samples/pom.xml +++ b/oh-my-scheduler-worker-samples/pom.xml @@ -14,7 +14,7 @@ 2.2.6.RELEASE - 1.0.1 + 1.1.0 1.2.68 diff --git a/oh-my-scheduler-worker-samples/src/main/java/com/github/kfcfans/oms/server/tester/OmsLogPerformanceTester.java b/oh-my-scheduler-worker-samples/src/main/java/com/github/kfcfans/oms/server/tester/OmsLogPerformanceTester.java index 0f5fefa3..9c4f7928 100644 --- a/oh-my-scheduler-worker-samples/src/main/java/com/github/kfcfans/oms/server/tester/OmsLogPerformanceTester.java +++ b/oh-my-scheduler-worker-samples/src/main/java/com/github/kfcfans/oms/server/tester/OmsLogPerformanceTester.java @@ -5,6 +5,7 @@ import com.github.kfcfans.oms.worker.core.processor.ProcessResult; import com.github.kfcfans.oms.worker.core.processor.TaskContext; import com.github.kfcfans.oms.worker.core.processor.sdk.BasicProcessor; import com.github.kfcfans.oms.worker.log.OmsLogger; +import org.springframework.stereotype.Component; /** * 测试 Oms 在线日志的性能 @@ -12,6 +13,7 @@ import com.github.kfcfans.oms.worker.log.OmsLogger; * @author tjq * @since 2020/5/3 */ +@Component public class OmsLogPerformanceTester implements BasicProcessor { private static final int BATCH = 1000; @@ -19,29 +21,32 @@ public class OmsLogPerformanceTester implements BasicProcessor { @Override public ProcessResult process(TaskContext context) throws Exception { - OmsLogger logger = context.getOmsLogger(); + OmsLogger omsLogger = context.getOmsLogger(); // 控制台参数,格式为 {"num":10000, "interval": 200} JSONObject jobParams = JSONObject.parseObject(context.getJobParams()); Long num = jobParams.getLong("num"); Long interval = jobParams.getLong("interval"); + omsLogger.info("ready to start to process, current JobParams is {}.", jobParams); + RuntimeException re = new RuntimeException("This is a exception~~~"); - long times = num / BATCH; + long times = (long) Math.ceil(1.0 * num / BATCH); for (long i = 0; i < times; i++) { for (long j = 0; j < BATCH; j++) { long index = i * BATCH + j; System.out.println("send index: " + index); - logger.info("[OmsLogPerformanceTester] testing omsLogger performance, current index is {}.", index); + + omsLogger.info("testing omsLogger's performance, current index is {}.", index); } - logger.error("[OmsLogPerformanceTester] Oh, we have an exception to log~", re); + omsLogger.error("Oh, it seems that we have got an exception.", re); try { Thread.sleep(interval); }catch (Exception ignore) { } } - logger.info("[OmsLogPerformanceTester] success!"); + omsLogger.info("anyway, we finished the job~configuration~"); return new ProcessResult(true, "good job"); } } diff --git a/oh-my-scheduler-worker/pom.xml b/oh-my-scheduler-worker/pom.xml index 08e42707..23788aa3 100644 --- a/oh-my-scheduler-worker/pom.xml +++ b/oh-my-scheduler-worker/pom.xml @@ -10,12 +10,12 @@ 4.0.0 oh-my-scheduler-worker - 1.0.1 + 1.1.0 jar 5.2.4.RELEASE - 1.0.1 + 1.1.0 1.4.200 3.4.2 5.6.1 diff --git a/oh-my-scheduler-worker/src/test/java/com/github/kfcfans/oms/processors/demo/BasicProcessorDemo.java b/oh-my-scheduler-worker/src/test/java/com/github/kfcfans/oms/processors/demo/BasicProcessorDemo.java index e3c614a9..ba334844 100644 --- a/oh-my-scheduler-worker/src/test/java/com/github/kfcfans/oms/processors/demo/BasicProcessorDemo.java +++ b/oh-my-scheduler-worker/src/test/java/com/github/kfcfans/oms/processors/demo/BasicProcessorDemo.java @@ -3,6 +3,8 @@ package com.github.kfcfans.oms.processors.demo; import com.github.kfcfans.oms.worker.core.processor.ProcessResult; import com.github.kfcfans.oms.worker.core.processor.TaskContext; import com.github.kfcfans.oms.worker.core.processor.sdk.BasicProcessor; +import com.github.kfcfans.oms.worker.log.OmsLogger; +import org.springframework.stereotype.Component; /** * 示例-单机任务处理器 @@ -10,11 +12,16 @@ import com.github.kfcfans.oms.worker.core.processor.sdk.BasicProcessor; * @author tjq * @since 2020/4/15 */ +@Component public class BasicProcessorDemo implements BasicProcessor { @Override public ProcessResult process(TaskContext context) throws Exception { + // 在线日志功能,可以直接在控制台查看任务日志,非常便捷 + OmsLogger omsLogger = context.getOmsLogger(); + omsLogger.info("BasicProcessorDemo start to process, current JobParams is {}.", context.getJobParams()); + // TaskContext为任务的上下文信息,包含了在控制台录入的任务元数据,常用字段为 // jobParams(任务参数,在控制台录入),instanceParams(任务实例参数,通过 OpenAPI 触发的任务实例才可能存在该参数) @@ -23,12 +30,4 @@ public class BasicProcessorDemo implements BasicProcessor { // 返回结果,该结果会被持久化到数据库,在前端页面直接查看,极为方便 return new ProcessResult(true, "result is xxx"); } - @Override - public void init() throws Exception { - // 初始化处理器 - } - @Override - public void destroy() throws Exception { - // 释放资源,销毁处理器 - } } diff --git a/others/doc/ConsoleGuide.md b/others/doc/ConsoleGuide.md new file mode 100644 index 00000000..d0d218c7 --- /dev/null +++ b/others/doc/ConsoleGuide.md @@ -0,0 +1,59 @@ +# STEP3: 任务管理 & 运行状态查看 +>通过前端控制台管理调度任务,查看运行情况和结果等。 + +### 系统首页 +> 展示了系统整体的概览和集群Worker列表。 + +![首页](../img/oms-console-main.png) + +### 任务创建 +> 创建需要被调度执行的任务,入口为**主页 -> 任务管理 -> 新建任务**。 + +![任务创建](../img/oms-console-jobCreator.png) +* 任务名称:名称,便于记忆与搜索,无特殊用途,请尽量简短(占用数据库字段空间) +* 任务描述:描述,无特殊作用,请尽量简短(占用数据库字段空间) +* 任务参数:任务处理时能够获取到的参数(即各个Processor的process方法入参`TaskContext`对象的jobParams字段)(进行一次处理器开发就能理解了) +* 定时信息:由下拉框和输入框组成 + * API -> 不需要填写任何参数(填了也不起作用) + * CRON -> 填写 CRON 表达式(可以找个[在线生成网站生成](https://www.bejson.com/othertools/cron/)) + * 固定频率 -> 填写整数,单位毫秒 + * 固定延迟 -> 填写整数,单位毫秒 +* 执行配置:由执行类型(单机、广播和MapReduce)、处理器类型和处理器参数组成,后两项相互关联。 + * 内置Java处理器 -> 填写该处理器的全限定类名(eg, `com.github.kfcfans.oms.processors.demo.MapReduceProcessorDemo`) + * SHELL -> 填写需要处理的脚本(直接复制文件内容)或脚本下载连接(http://xxx) + * PYTHON -> 填写完整的python脚本或下载连接(http://xxx) + +* 运行配置 + * 最大实例数:该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例) + * 单机线程并发数:该实例执行过程中每个Worker使用的线程数量(MapReduce任务生效,其余无论填什么,都只会使用1个线程或3个线程...) + * 运行时间限制:限定任务的最大运行时间,超时则视为失败,单位**毫秒**,0代表不限制超时时间。 + +* 重试配置: + * 任务重试次数:实例级别,失败了整个任务实例重试,会更换TaskTracker(本次任务实例的Master节点),代价较大,大型Map/MapReduce慎用。 + * 子任务重试次数:Task级别,每个子Task失败后单独重试,会更换ProcessorTracker(本次任务实际执行的Worker节点),代价较小,推荐使用。 + * 注:对于单机任务来说,假如任务重试次数和子任务重试次数都配置了1且都执行失败,实际执行次数会变成4次!推荐任务实例重试配置为0,子任务重试次数根据实际情况配置。 + +* 机器配置:用来标明允许执行任务的机器状态,避开那些摇摇欲坠的机器,0代表无任何限制。 + * 最低CPU核心数:填写浮点数,CPU可用核心数小于该值的Worker将不会执行该任务。 + * 最低内存(GB):填写浮点数,可用内存小于该值的Worker将不会执行该任务。 + * 最低磁盘(GB):填写浮点数,可用磁盘空间小于该值的Worker将不会执行该任务。 +* 集群配置 + * 执行机器地址:指定集群中的某几台机器执行任务(debug的好帮手),多值英文逗号分割,如`192.168.1.1:27777,192.168.1.2:27777` + * 最大执行机器数量:限定调动执行的机器数量 + +* 报警配置:选择任务执行失败后报警通知的对象,需要事先录入。 + +### 任务管理 +>可以方便地查看和管理系统当前录入的任务信息。 + +![任务管理](../img/oms-console-jobManager.png) + +### 运行状态 +>可以方便地查看当前运行的任务实例,点击详情即可获取详细的信息,点击日志可以查看通过`omsLogger`上报的日志,点击停止则可以强制终止该任务。 + +![运行状态](../img/oms-console-runningStatus.png) + +#### 在线日志 + + +![在线日志](../img/oms-console-onlineLog.png) \ No newline at end of file diff --git a/others/doc/DevelopmentGuide.md b/others/doc/DevelopmentGuide.md deleted file mode 100644 index 160a3af6..00000000 --- a/others/doc/DevelopmentGuide.md +++ /dev/null @@ -1,209 +0,0 @@ -[toc] -# 任务配置 ->前端界面目前可能有那么一点点丑...不过问题不是很大 (>▽<) - -### 系统首页 -> 展示了系统整体的概览和集群Worker列表。 - -![首页](../img/oms-console-main.png) - - -### 任务录入 ->一切的起点。 - -![任务创建](../img/oms-console-jobCreator.png) -* 任务名称:名称,无特殊作用 -* 任务描述:描述,无特殊作用,请尽量简短(占用数据库字段空间) -* 任务参数:任务处理时能够获取到的参数(即各个Processor的process方法的TaskContext对象的jobParams字段)(进行一次处理器开发就能理解了) -* 定时信息:由下拉框和输入框组成 - * API -> 不需要填写任何参数(填了也不起作用) - * CRON -> 填写 CRON 表达式(可以找个在线生成网站生成) - * 固定频率 -> 填写整数,单位毫秒 - * 固定延迟 -> 填写整数,单位毫秒 -* 执行配置:由执行类型(单机、广播和MapReduce)、处理器类型和处理器参数组成,后两项相互关联。 - * 内置Java处理器 -> 填写该处理器的全限定类名(eg, `com.github.kfcfans.oms.processors.demo.MapReduceProcessorDemo`) - * SHELL -> 填写需要处理的脚本(直接复制文件内容)或脚本下载连接(http://xxx) - * PYTHON -> 填写完整的python脚本或下载连接(http://xxx) - -* 运行配置 - * 最大实例数:该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例) - * 单机线程并发数:该实例执行过程中每个Worker使用的线程数量(MapReduce任务生效,其余无论填什么,都只会使用1个线程或3个线程...) - * 运行时间限制:限定任务的最大运行时间,超时则视为失败,单位**毫秒**,0代表不限制超时时间。 - -* 重试配置: - * 任务重试次数:实例级别,失败了整个重试,会更换TaskTracker(本次任务实例的Master节点)。 - * 子任务重试次数:Task级别,每个子Task失败后单独重试,会更换ProcessorTracker(本次任务实际执行的Worker节点)。 - * 注:对于单机任务来说,假如任务重试次数和子任务重试次数都配置了1且都执行失败,实际执行次数会变成4次!推荐任务实例重试配置为0,子任务重试次数根据实际情况配置。 - -* 机器配置:用来标明允许执行任务的机器状态,避开那些摇摇欲坠的机器,0代表无任何限制。 - * 最低CPU核心数:填写浮点数,CPU可用核心数小于该值的Worker将不会执行该任务。 - * 最低内存(GB):填写浮点数,可用内存小于该值的Worker将不会执行该任务。 - * 最低磁盘(GB):填写浮点数,可用磁盘空间小于该值的Worker将不会执行该任务。 -* 集群配置 - * 执行机器地址:指定集群中的某几台机器执行任务(debug的好帮手),多值英文逗号分割,如`192.168.1.1:27777,192.168.1.2:27777` - * 最大执行机器数量:限定调动执行的机器数量 - -* 报警配置:选择任务执行失败后报警通知的对象。 - -### 任务管理 ->可以方便地查看和管理系统当前录入的任务信息。 - -![任务管理](../img/oms-console-jobManager.png) - -### 运行状态 ->可以方便地查看当前运行的任务实例,点击详情即可获取详细的信息,点击停止则可以强制终止该任务。 - -![运行状态](../img/oms-console-runningStatus.png) - - -# 处理器开发 ->搭载处理器的宿主应用需要添加`oh-my-scheduler-worker`依赖,然后编写实现指定接口或抽象类的Java类即可。 - -```xml - - com.github.kfcfans - oh-my-scheduler-worker - ${oms.worker.latest.version} - -``` - -### 单机处理器 ->单机执行的策略下,server会在所有可用worker中选取健康度最佳的机器进行执行。单机执行任务需要实现接口:`com.github.kfcfans.oms.worker.core.processor.sdk.BasicProcessor`,代码示例如下: - -```java -@Componet -public class BasicProcessorDemo implements BasicProcessor { - - // 支持 Spring Bean - @Resource - private MysteryService mysteryService; - - @Override - public ProcessResult process(TaskContext context) throws Exception { - - // TaskContext为任务的上下文信息,包含了在控制台录入的任务元数据,常用字段为 - // jobParams(任务参数,在控制台录入),instanceParams(任务实例参数,通过 OpenAPI 触发的任务实例才可能存在该参数) - - // 可以根据控制台传递的参数进行实际处理... - mysteryService.hasaki(context.getJobParams()); - - // 返回结果,该结果会被持久化到数据库,在前端页面直接查看,极为方便 - return new ProcessResult(true, "result is xxx"); - } - @Override - public void init() throws Exception { - // 初始化处理器 - } - @Override - public void destroy() throws Exception { - // 释放资源,销毁处理器 - } -} -``` - -### 广播执行处理器 ->广播执行的策略下,所有机器都会被调度执行该任务。为了便于资源的准备和释放,广播处理器在`BasicProcessor`的基础上额外增加了`preProcess`和`postProcess`方法,分别在整个集群开始之前/结束之后**选一台机器**执行相关方法。代码示例如下: - -```java -public class BroadcastProcessorDemo extends BroadcastProcessor { - - @Override - public ProcessResult preProcess(TaskContext taskContext) throws Exception { - // 预执行,会在所有 worker 执行 process 方法前调用 - return new ProcessResult(true, "init success"); - } - - @Override - public ProcessResult process(TaskContext context) throws Exception { - // 撰写整个worker集群都会执行的代码逻辑 - return new ProcessResult(true, "release resource success"); - } - - @Override - public ProcessResult postProcess(TaskContext taskContext, List taskResults) throws Exception { - - // taskResults 存储了所有worker执行的结果(包括preProcess) - - // 收尾,会在所有 worker 执行完毕 process 方法后调用,该结果将作为最终的执行结果在 - return new ProcessResult(true, "process success"); - } - -} -``` - -### MapReduce处理器 ->MapReduce是最复杂也是最强大的一种执行器,它允许开发者完成任务的拆分,将子任务派发到集群中其他Worker执行,是执行大批量处理任务的不二之选!实现MapReduce处理器需要继承`MapReduceProcessor`类,具体用法如下示例代码所示。 - -```java -public class MapReduceProcessorDemo extends MapReduceProcessor { - - @Override - public ProcessResult process(TaskContext context) throws Exception { - // 判断是否为根任务 - if (isRootTask()) { - - // 构造子任务 - List subTaskList = Lists.newLinkedList(); - - /* - * 子任务的构造由开发者自己定义 - * eg. 现在需要从文件中读取100W个ID,并处理数据库中这些ID对应的数据,那么步骤如下: - * 1. 根任务(RootTask)读取文件,流式拉取100W个ID,并按1000个一批的大小组装成子任务进行派发 - * 2. 非根任务获取子任务,完成业务逻辑的处理 - */ - - // 调用 map 方法,派发子任务 - return map(subTaskList, "DATA_PROCESS_TASK"); - } - - // 非子任务,可根据 subTask 的类型 或 TaskName 来判断分支 - if (context.getSubTask() instanceof SubTask) { - // 执行子任务,注:子任务人可以 map 产生新的子任务,可以构建任意级的 MapReduce 处理器 - return new ProcessResult(true, "PROCESS_SUB_TASK_SUCCESS"); - } - - return new ProcessResult(false, "UNKNOWN_BUG"); - } - - @Override - public ProcessResult reduce(TaskContext taskContext, List taskResults) { - - // 所有 Task 执行结束后,reduce 将会被执行 - // taskResults 保存了所有子任务的执行结果 - - // 用法举例,统计执行结果 - AtomicLong successCnt = new AtomicLong(0); - taskResults.forEach(tr -> { - if (tr.isSuccess()) { - successCnt.incrementAndGet(); - } - }); - return new ProcessResult(true, "success task num:" + successCnt.get()); - } - - // 自定义的子任务 - private static class SubTask { - private Long siteId; - private List idList; - } -} -``` - -# OpenAPI ->OpenAPI允许开发者通过接口来完成手工的操作,让系统整体变得更加灵活,启用OpenAPI需要依赖`oh-my-scheduler-client`库。 - -```xml - - com.github.kfcfans - oh-my-scheduler-client - ${oms.client.latest.version} - -``` - -### 简单示例 -```java -// 初始化 client,需要server地址和应用名称作为参数 -OhMyClient ohMyClient = new OhMyClient("127.0.0.1:7700", "oms-test"); -// 调用相关的API -ohMyClient.stopInstance(1586855173043L) -``` diff --git a/others/doc/OpenApiGuide.md b/others/doc/OpenApiGuide.md new file mode 100644 index 00000000..52ddffe8 --- /dev/null +++ b/others/doc/OpenApiGuide.md @@ -0,0 +1,19 @@ +# STEP4: OpenAPI +>OpenAPI允许开发者通过接口来完成手工的操作,让系统整体变得更加灵活,启用OpenAPI需要依赖`oh-my-scheduler-client`库。 + +* 最新依赖版本请参考Maven中央仓库:[推荐地址](https://search.maven.org/search?q=com.github.kfcfans)&[备用地址](https://mvnrepository.com/search?q=com.github.kfcfans)。 +```xml + + com.github.kfcfans + oh-my-scheduler-client + ${oms.client.latest.version} + +``` + +### 简单示例 +```java +// 初始化 client,需要server地址和应用名称作为参数 +OhMyClient ohMyClient = new OhMyClient("127.0.0.1:7700", "oms-test"); +// 调用相关的API +ohMyClient.stopInstance(1586855173043L) +``` \ No newline at end of file diff --git a/others/doc/ProcessorDevGuide.md b/others/doc/ProcessorDevGuide.md new file mode 100644 index 00000000..b3435aae --- /dev/null +++ b/others/doc/ProcessorDevGuide.md @@ -0,0 +1,143 @@ +# STEP2: 处理器开发 +>OhMyScheduler支持Python、Shell和Java处理器,前两种处理器为脚本处理器,功能简单,在控制台直接配置即可,本章不再赘述。开发项目内置的Java处理器,宿主应用需要添加`oh-my-scheduler-worker`依赖,并实现指定接口或抽象类的Java类。 + +* 最新依赖版本请参考Maven中央仓库:[推荐地址](https://search.maven.org/search?q=com.github.kfcfans)&[备用地址](https://mvnrepository.com/search?q=com.github.kfcfans)。 + +```xml + + com.github.kfcfans + oh-my-scheduler-worker + ${oms.worker.latest.version} + +``` + +## 处理器开发示例 +>更多示例代码请见项目:oh-my-scheduler-worker-samples + +#### 单机处理器 +>单机执行的策略下,server会在所有可用worker中选取健康度最佳的机器进行执行。单机执行任务需要实现接口:`com.github.kfcfans.oms.worker.core.processor.sdk.BasicProcessor`,代码示例如下: + +```java +// 支持 SpringBean 的形式 +@Component +public class BasicProcessorDemo implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + // 在线日志功能,可以直接在控制台查看任务日志,非常便捷 + OmsLogger omsLogger = context.getOmsLogger(); + omsLogger.info("BasicProcessorDemo start to process, current JobParams is {}.", context.getJobParams()); + + // TaskContext为任务的上下文信息,包含了在控制台录入的任务元数据,常用字段为 + // jobParams(任务参数,在控制台录入),instanceParams(任务实例参数,通过 OpenAPI 触发的任务实例才可能存在该参数) + + // 进行实际处理... + + // 返回结果,该结果会被持久化到数据库,在前端页面直接查看,极为方便 + return new ProcessResult(true, "result is xxx"); + } +} +``` + +#### 广播执行处理器 +>广播执行的策略下,所有机器都会被调度执行该任务。为了便于资源的准备和释放,广播处理器在`BasicProcessor`的基础上额外增加了`preProcess`和`postProcess`方法,分别在整个集群开始之前/结束之后**选一台机器**执行相关方法。代码示例如下: + +```java +public class BroadcastProcessorDemo extends BroadcastProcessor { + + @Override + public ProcessResult preProcess(TaskContext taskContext) throws Exception { + // 预执行,会在所有 worker 执行 process 方法前调用 + return new ProcessResult(true, "init success"); + } + + @Override + public ProcessResult process(TaskContext context) throws Exception { + // 撰写整个worker集群都会执行的代码逻辑 + return new ProcessResult(true, "release resource success"); + } + + @Override + public ProcessResult postProcess(TaskContext taskContext, List taskResults) throws Exception { + + // taskResults 存储了所有worker执行的结果(包括preProcess) + + // 收尾,会在所有 worker 执行完毕 process 方法后调用,该结果将作为最终的执行结果在 + return new ProcessResult(true, "process success"); + } + +} +``` + +#### MapReduce处理器 +>MapReduce是最复杂也是最强大的一种执行器,它允许开发者完成任务的拆分,将子任务派发到集群中其他Worker执行,是执行大批量处理任务的不二之选!实现MapReduce处理器需要继承`MapReduceProcessor`类,具体用法如下示例代码所示。 + +```java +public class MapReduceProcessorDemo extends MapReduceProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + // 判断是否为根任务 + if (isRootTask()) { + + // 构造子任务 + List subTaskList = Lists.newLinkedList(); + + /* + * 子任务的构造由开发者自己定义 + * eg. 现在需要从文件中读取100W个ID,并处理数据库中这些ID对应的数据,那么步骤如下: + * 1. 根任务(RootTask)读取文件,流式拉取100W个ID,并按1000个一批的大小组装成子任务进行派发 + * 2. 非根任务获取子任务,完成业务逻辑的处理 + */ + + // 调用 map 方法,派发子任务 + return map(subTaskList, "DATA_PROCESS_TASK"); + } + + // 非子任务,可根据 subTask 的类型 或 TaskName 来判断分支 + if (context.getSubTask() instanceof SubTask) { + // 执行子任务,注:子任务人可以 map 产生新的子任务,可以构建任意级的 MapReduce 处理器 + return new ProcessResult(true, "PROCESS_SUB_TASK_SUCCESS"); + } + + return new ProcessResult(false, "UNKNOWN_BUG"); + } + + @Override + public ProcessResult reduce(TaskContext taskContext, List taskResults) { + + // 所有 Task 执行结束后,reduce 将会被执行 + // taskResults 保存了所有子任务的执行结果 + + // 用法举例,统计执行结果 + AtomicLong successCnt = new AtomicLong(0); + taskResults.forEach(tr -> { + if (tr.isSuccess()) { + successCnt.incrementAndGet(); + } + }); + return new ProcessResult(true, "success task num:" + successCnt.get()); + } + + // 自定义的子任务 + private static class SubTask { + private Long siteId; + private List idList; + } +} +``` + +## 处理器上下文(TaskContext)属性说明 +|属性名称|意义/用法| +|----|----| +|instanceId|任务实例ID,全局唯一,开发者一般无需关心此参数| +|subInstanceId|子任务实例ID,秒级任务使用,开发者一般无需关心此参数| +|taskId|采用链式命名法的ID,在某个任务实例内唯一,开发者一般无需关心此参数| +|taskName|task名称,Map/MapReduce任务的子任务的值为开发者指定,否则为系统默认值,开发者一般无需关心此参数| +|jobParams|任务参数,其值等同于控制台录入的**任务参数**,常用!| +|instanceParams|任务实例参数,其值等同于使用OpenAPI运行任务实例时传递的参数,常用!| +|maxRetryTimes|Task的最大重试次数| +|currentRetryTimes|Task的当前重试次数,和maxRetryTimes联合起来可以判断当前是否为该Task的最后一次运行机会| +|subTask|子Task,Map/MapReduce处理器专属,开发者调用map方法时传递的子任务列表中的某一个| +|omsLogger|在线日志,用法同Slf4J,记录的日志可以直接通过控制台查看,非常便捷和强大!不过使用过程中需要注意频率,可能对Server造成巨大的压力| diff --git a/others/doc/SystemInitGuide.md b/others/doc/SystemInitGuide.md new file mode 100644 index 00000000..9255788c --- /dev/null +++ b/others/doc/SystemInitGuide.md @@ -0,0 +1,35 @@ +# STEP1: 系统部署 & 初始化 +## 部署 +#### 要求 +* 运行环境:JDK8+ +* 编译环境:Maven3+ +* 关系数据库:任意Spring Data JPA支持的关系型数据库(MySQL/Oracle/MS SQLServer...) +* mongoDB:任意支持GridFS的mongoDB版本(4.2.6测试通过,其余未经测试,仅从理论角度分析可用) + +#### 流程 +1. 部署数据库:由于任务调度中心的数据持久层基于`Spring Data Jpa`实现,**开发者仅需要完成数据库的创建**,即运行SQL`CREATE database if NOT EXISTS oms-product default character set utf8mb4 collate utf8mb4_unicode_ci;`。 + * 注1:任务调度中心支持多环境部署(日常、预发、线上),其分别对应三个数据库:oms-daily、oms-pre和oms-product。 + * 注2:手动建表SQL文件:[oms-sql.sql](../oms-sql.sql) + +2. 部署调度服务器(OhMyScheduler-Server),需要先修改配置文件(同样为了支持多环境部署,采用了daily、pre和product3套配置文件),之后自行编译部署运行。 + * 注:OhMyScheduler-Server支持集群部署,具备完全的水平扩展能力。建议部署多个实例以实现高可用&高性能。 + * application-xxx.properties文件配置说明如下表所示: + * |配置项|含义|可选| + |----|----|----| + |spring.datasource.core.xxx|关系型数据库连接配置|否| + |spring.mail.xxx|邮件配置|是,未配置情况下将无法使用邮件报警功能| + |spring.data.mongodb.xxx|MongoDB连接配置|是,未配置情况下将无法使用在线日志功能| + |oms.log.retention.local|本地日志保留天数,负数代表永久保留|否| + |oms.log.retention.remote|远程日志保留天数,负数代表永久保留|否| + |oms.alarm.bean.names|扩展的报警服务Bean,多值逗号分割,默认为邮件报警|否| + +3. 部署前端页面(可选):每一个OhMyScheduler-Server内部自带了前端页面,不过Tomcat做Web服务器的性能就呵呵了~有需求(追求)的用户自行使用[源码](https://github.com/KFCFans/OhMyScheduler-Console)打包部署即可。 + * 需要修改`main.js`中的`axios.defaults.baseURL`为实际的OhMyScheduler-Server地址 + +## 初始化 +> 每一个需要接入OhMyScheduler的系统,都需要先在控制台完成初始化,即应用注册与用户录入。初始化操作在首页完成。 + +![Welcome Page](../img/oms-console-welcome.png) +* 每一个系统初次接入OhMyScheduler时,都需要通过**应用注册**功能录入`appName`(接入应用的名称,需要保证唯一)和`appDescription`(描述信息,无实际用处),至此,应用初始化完成,准备开发处理器(Processor)享受分布式调度和计算的便利之处吧~ +* 注册完成后,输入`appName`即可进入控制台。 +* **用户注册**可录入用户信息,用于之后任务的报警配置。 diff --git a/others/img/oms-console-onlineLog.png b/others/img/oms-console-onlineLog.png new file mode 100644 index 00000000..9cbf7c84 Binary files /dev/null and b/others/img/oms-console-onlineLog.png differ diff --git a/others/img/oms-console-runningStatus.png b/others/img/oms-console-runningStatus.png index 2dbaec09..eb0d8350 100644 Binary files a/others/img/oms-console-runningStatus.png and b/others/img/oms-console-runningStatus.png differ diff --git a/others/img/oms-console-welcome.png b/others/img/oms-console-welcome.png new file mode 100644 index 00000000..fde4396c Binary files /dev/null and b/others/img/oms-console-welcome.png differ diff --git a/others/oms-sql.sql b/others/oms-sql.sql new file mode 100644 index 00000000..f9abcf45 --- /dev/null +++ b/others/oms-sql.sql @@ -0,0 +1,119 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for app_info +-- ---------------------------- +DROP TABLE IF EXISTS `app_info`; +CREATE TABLE `app_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `app_name` varchar(255) DEFAULT NULL, + `current_server` varchar(255) DEFAULT NULL, + `description` varchar(255) DEFAULT NULL, + `gmt_create` datetime(6) DEFAULT NULL, + `gmt_modified` datetime(6) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `appNameUK` (`app_name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Table structure for instance_log +-- ---------------------------- +DROP TABLE IF EXISTS `instance_log`; +CREATE TABLE `instance_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `actual_trigger_time` bigint(20) DEFAULT NULL, + `app_id` bigint(20) DEFAULT NULL, + `expected_trigger_time` bigint(20) DEFAULT NULL, + `finished_time` bigint(20) DEFAULT NULL, + `gmt_create` datetime(6) DEFAULT NULL, + `gmt_modified` datetime(6) DEFAULT NULL, + `instance_id` bigint(20) DEFAULT NULL, + `instance_params` varchar(255) DEFAULT NULL, + `job_id` bigint(20) DEFAULT NULL, + `result` varchar(255) DEFAULT NULL, + `running_times` bigint(20) DEFAULT NULL, + `status` int(11) NOT NULL, + `task_tracker_address` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `IDX1ha9qjdw952k1c22gkht50unp` (`job_id`), + KEY `IDXckliwovavlr2s0uh14n94yfmc` (`app_id`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Table structure for job_info +-- ---------------------------- +DROP TABLE IF EXISTS `job_info`; +CREATE TABLE `job_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `app_id` bigint(20) DEFAULT NULL, + `concurrency` int(11) DEFAULT NULL, + `designated_workers` varchar(255) DEFAULT NULL, + `execute_type` int(11) DEFAULT NULL, + `gmt_create` datetime(6) DEFAULT NULL, + `gmt_modified` datetime(6) DEFAULT NULL, + `instance_retry_num` int(11) DEFAULT NULL, + `instance_time_limit` bigint(20) DEFAULT NULL, + `job_description` varchar(255) DEFAULT NULL, + `job_name` varchar(255) DEFAULT NULL, + `job_params` varchar(255) DEFAULT NULL, + `max_instance_num` int(11) DEFAULT NULL, + `max_worker_count` int(11) DEFAULT NULL, + `min_cpu_cores` double NOT NULL, + `min_disk_space` double NOT NULL, + `min_memory_space` double NOT NULL, + `next_trigger_time` bigint(20) DEFAULT NULL, + `notify_user_ids` varchar(255) DEFAULT NULL, + `processor_info` varchar(255) DEFAULT NULL, + `processor_type` int(11) DEFAULT NULL, + `status` int(11) DEFAULT NULL, + `task_retry_num` int(11) DEFAULT NULL, + `time_expression` varchar(255) DEFAULT NULL, + `time_expression_type` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `IDXk2xprmn3lldmlcb52i36udll1` (`app_id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Table structure for oms_lock +-- ---------------------------- +DROP TABLE IF EXISTS `oms_lock`; +CREATE TABLE `oms_lock` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `gmt_create` datetime(6) DEFAULT NULL, + `gmt_modified` datetime(6) DEFAULT NULL, + `lock_name` varchar(255) DEFAULT NULL, + `ownerip` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `lockNameUK` (`lock_name`) +) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Table structure for server_info +-- ---------------------------- +DROP TABLE IF EXISTS `server_info`; +CREATE TABLE `server_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `gmt_create` datetime(6) DEFAULT NULL, + `gmt_modified` datetime(6) DEFAULT NULL, + `ip` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UKtk8ytgpl7mpukhnvhbl82kgvy` (`ip`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Table structure for user_info +-- ---------------------------- +DROP TABLE IF EXISTS `user_info`; +CREATE TABLE `user_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `email` varchar(255) DEFAULT NULL, + `gmt_create` datetime(6) DEFAULT NULL, + `gmt_modified` datetime(6) DEFAULT NULL, + `password` varchar(255) DEFAULT NULL, + `phone` varchar(255) DEFAULT NULL, + `username` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +SET FOREIGN_KEY_CHECKS = 1;