├── .gitignore ├── src ├── main │ ├── resources │ │ ├── btsql-ext.properties │ │ ├── resource │ │ │ ├── db.properties │ │ │ └── kettle.properties │ │ ├── spring │ │ │ ├── applicationContext-service.xml │ │ │ ├── spring-mvc.xml │ │ │ └── applicationContext-beetlsql.xml │ │ └── log4j.properties │ ├── webapp │ │ ├── static │ │ │ ├── lib │ │ │ │ ├── jquery-backstretch │ │ │ │ │ ├── .gitignore │ │ │ │ │ └── .bower.json │ │ │ │ ├── metronic │ │ │ │ │ ├── img │ │ │ │ │ │ ├── dash.jpg │ │ │ │ │ │ ├── bg-white.png │ │ │ │ │ │ ├── bg-opacity.png │ │ │ │ │ │ ├── bg-white-lock.png │ │ │ │ │ │ ├── syncfusion-icons.png │ │ │ │ │ │ ├── remove-icon-small.png │ │ │ │ │ │ ├── inbox-nav-arrow-blue.png │ │ │ │ │ │ └── syncfusion-icons-white.png │ │ │ │ │ ├── fonts │ │ │ │ │ │ ├── v10 │ │ │ │ │ │ │ ├── uYKcPVoh6c5R0NpdEY5A-Q.woff │ │ │ │ │ │ │ ├── DXI1ORHCpsQm3Vp6mXoaTRsxEYwM7FgeyaSgU71cLG0.woff │ │ │ │ │ │ │ ├── MTP_ySUJH_bn48VBG8sNShsxEYwM7FgeyaSgU71cLG0.woff │ │ │ │ │ │ │ └── k3k702ZOKiLJc3WVjuplzBsxEYwM7FgeyaSgU71cLG0.woff │ │ │ │ │ │ └── font.css │ │ │ │ │ └── css │ │ │ │ │ │ └── login-soft.css │ │ │ │ ├── bootstrap-fileinput │ │ │ │ │ ├── img │ │ │ │ │ │ ├── loading.gif │ │ │ │ │ │ └── loading-sm.gif │ │ │ │ │ ├── themes │ │ │ │ │ │ ├── fa │ │ │ │ │ │ │ ├── theme.min.js │ │ │ │ │ │ │ └── theme.js │ │ │ │ │ │ ├── gly │ │ │ │ │ │ │ ├── theme.min.js │ │ │ │ │ │ │ └── theme.js │ │ │ │ │ │ └── explorer │ │ │ │ │ │ │ ├── theme.min.js │ │ │ │ │ │ │ ├── theme.js │ │ │ │ │ │ │ └── theme.min.css │ │ │ │ │ └── css │ │ │ │ │ │ ├── fileinput-rtl.min.css │ │ │ │ │ │ └── fileinput-rtl.css │ │ │ │ └── jquery.uniform │ │ │ │ │ ├── themes │ │ │ │ │ ├── images │ │ │ │ │ │ ├── bg-input.png │ │ │ │ │ │ ├── sprite.png │ │ │ │ │ │ └── bg-input-focus.png │ │ │ │ │ └── css │ │ │ │ │ │ └── uniform.default.scss │ │ │ │ │ └── .bower.json │ │ │ ├── img │ │ │ │ ├── bg.png │ │ │ │ ├── bg │ │ │ │ │ ├── 1.jpg │ │ │ │ │ ├── 2.jpg │ │ │ │ │ ├── 3.jpg │ │ │ │ │ └── 4.jpg │ │ │ │ ├── logo.jpg │ │ │ │ ├── user.png │ │ │ │ ├── browser.png │ │ │ │ ├── icons.png │ │ │ │ ├── locked.png │ │ │ │ ├── success.png │ │ │ │ ├── progress.png │ │ │ │ ├── wenku_logo.png │ │ │ │ ├── loading-upload.gif │ │ │ │ ├── profile_small.jpg │ │ │ │ └── sprite-skin-flat.png │ │ │ ├── css │ │ │ │ ├── patterns │ │ │ │ │ ├── logo.jpg │ │ │ │ │ ├── shattered.png │ │ │ │ │ ├── header-logo.png │ │ │ │ │ ├── header-profile.png │ │ │ │ │ ├── header-profile-skin-1.png │ │ │ │ │ └── header-profile-skin-3.png │ │ │ │ ├── plugins │ │ │ │ │ ├── jsTree │ │ │ │ │ │ ├── 32px.png │ │ │ │ │ │ └── throbber.gif │ │ │ │ │ ├── chosen │ │ │ │ │ │ ├── chosen-sprite.png │ │ │ │ │ │ └── chosen-sprite@2x.png │ │ │ │ │ └── cron-generator │ │ │ │ │ │ └── cronGen.css │ │ │ │ └── login.css │ │ │ ├── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ ├── fontawesome-webfont.woff2 │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ │ └── glyphicons-halflings-regular.woff2 │ │ │ └── js │ │ │ │ ├── plugins │ │ │ │ ├── layer │ │ │ │ │ ├── layim │ │ │ │ │ │ ├── loading.gif │ │ │ │ │ │ └── data │ │ │ │ │ │ │ ├── chatlog.json │ │ │ │ │ │ │ ├── groups.json │ │ │ │ │ │ │ ├── group.json │ │ │ │ │ │ │ └── friend.json │ │ │ │ │ ├── skin │ │ │ │ │ │ ├── default │ │ │ │ │ │ │ ├── icon.png │ │ │ │ │ │ │ ├── textbg.png │ │ │ │ │ │ │ ├── icon-ext.png │ │ │ │ │ │ │ ├── icon_ext.png │ │ │ │ │ │ │ ├── loading-0.gif │ │ │ │ │ │ │ ├── loading-1.gif │ │ │ │ │ │ │ ├── loading-2.gif │ │ │ │ │ │ │ ├── xubox_ico0.png │ │ │ │ │ │ │ ├── xubox_title0.png │ │ │ │ │ │ │ ├── xubox_loading0.gif │ │ │ │ │ │ │ ├── xubox_loading1.gif │ │ │ │ │ │ │ ├── xubox_loading2.gif │ │ │ │ │ │ │ └── xubox_loading3.gif │ │ │ │ │ │ ├── moon │ │ │ │ │ │ │ └── default.png │ │ │ │ │ │ └── layer.ext.css │ │ │ │ │ └── laydate │ │ │ │ │ │ └── skins │ │ │ │ │ │ └── default │ │ │ │ │ │ ├── icon.png │ │ │ │ │ │ └── laydate.css │ │ │ │ ├── bootstrap-table │ │ │ │ │ ├── locale │ │ │ │ │ │ ├── bootstrap-table-zh-CN.min.js │ │ │ │ │ │ └── bootstrap-table-zh-CN.js │ │ │ │ │ └── bootstrap-table-mobile.min.js │ │ │ │ └── validate │ │ │ │ │ └── messages_zh.min.js │ │ │ │ ├── my │ │ │ │ └── login.js │ │ │ │ └── content.js │ │ ├── index.html │ │ ├── Html │ │ │ ├── images │ │ │ │ ├── bg.png │ │ │ │ ├── cn.png │ │ │ │ ├── us.png │ │ │ │ ├── error.png │ │ │ │ ├── content.gif │ │ │ │ ├── favicon.ico │ │ │ │ ├── menu-bg.gif │ │ │ │ ├── shaddow.gif │ │ │ │ ├── menu-item.gif │ │ │ │ └── shaddow-hover.gif │ │ │ ├── css │ │ │ │ └── font │ │ │ │ │ ├── awesome.eot │ │ │ │ │ ├── awesome.otf │ │ │ │ │ ├── awesome.ttf │ │ │ │ │ └── awesome.woff │ │ │ ├── js │ │ │ │ ├── libs │ │ │ │ │ ├── zTree │ │ │ │ │ │ └── img │ │ │ │ │ │ │ ├── job.png │ │ │ │ │ │ │ ├── line.gif │ │ │ │ │ │ │ ├── repo.png │ │ │ │ │ │ │ ├── trans.png │ │ │ │ │ │ │ ├── zTree.gif │ │ │ │ │ │ │ ├── zTree.png │ │ │ │ │ │ │ ├── folder.png │ │ │ │ │ │ │ └── loading.gif │ │ │ │ │ └── url │ │ │ │ │ │ ├── cmg.md5.js │ │ │ │ │ │ ├── cmg.open.url.builder.paipai.js │ │ │ │ │ │ ├── cmg.open.url.builder.tianpin.js │ │ │ │ │ │ ├── cmg.open.url.builder.yihaodian.js │ │ │ │ │ │ ├── cmg.open.url.builder.jd.js │ │ │ │ │ │ ├── cmg.open.url.builder.coo8.js │ │ │ │ │ │ ├── cmg.open.url.builder.ehub.js │ │ │ │ │ │ ├── cmg.open.url.builder.dangdang.js │ │ │ │ │ │ ├── cmg.open.url.builder.amazon.js │ │ │ │ │ │ └── cmg.open.url.builder.taobao.js │ │ │ │ ├── ui.plugin.js │ │ │ │ ├── ui.user.js │ │ │ │ └── messages │ │ │ │ │ ├── message_en_US.properties │ │ │ │ │ └── message_zh_CN.properties │ │ │ └── error.html │ │ └── WEB-INF │ │ │ ├── web.xml │ │ │ └── views │ │ │ └── login.jsp │ └── java │ │ └── com │ │ └── leadingsoft │ │ ├── common │ │ ├── exception │ │ │ ├── SeviceException.java │ │ │ └── KettleMasterException.java │ │ ├── kettle │ │ │ └── environment │ │ │ │ └── StartInit.java │ │ └── toolkit │ │ │ └── MD5Utils.java │ │ ├── core │ │ ├── mapper │ │ │ ├── KJobDao.java │ │ │ ├── KUserDao.java │ │ │ ├── KQuartzDao.java │ │ │ ├── KTransDao.java │ │ │ ├── KJobRecordDao.java │ │ │ ├── KJobMonitorDao.java │ │ │ ├── KRepositoryDao.java │ │ │ ├── KTransRecordDao.java │ │ │ ├── KTransMonitorDao.java │ │ │ └── KRepositoryTypeDao.java │ │ ├── dto │ │ │ ├── BootTablePage.java │ │ │ ├── kettle │ │ │ │ └── RepositoryTree.java │ │ │ └── web │ │ │ │ └── KRepositoryDto.java │ │ ├── model │ │ │ ├── KRepositoryType.java │ │ │ ├── KQuartz.java │ │ │ ├── KJobRecord.java │ │ │ ├── KTransRecord.java │ │ │ ├── KTransMonitor.java │ │ │ ├── KJobMonitor.java │ │ │ └── KUser.java │ │ └── conf │ │ │ ├── LoginInterceptor.java │ │ │ └── UTF8StringHttpMessageConverter.java │ │ └── web │ │ ├── controller │ │ ├── QuartzController.java │ │ ├── UserController.java │ │ ├── JobRecordController.java │ │ ├── TransRecordController.java │ │ ├── JobMonitorController.java │ │ ├── TransMonitorController.java │ │ ├── IndexController.java │ │ ├── DownLoadRecordController.java │ │ ├── TransController.java │ │ ├── JobController.java │ │ └── MainController.java │ │ ├── quartz │ │ ├── QuartzListener.java │ │ └── model │ │ │ └── DBConnectionModel.java │ │ ├── utils │ │ ├── DataValidate.java │ │ ├── CommonUtils.java │ │ ├── JsonUtils.java │ │ └── DateField.java │ │ └── service │ │ ├── QuartzService.java │ │ ├── JobRecordService.java │ │ ├── TransRecordService.java │ │ └── UserService.java └── test │ └── java │ └── com │ └── leadingsoft │ └── test │ ├── quartz │ └── QuartzTest.java │ └── string │ └── StringTest.java ├── .settings ├── org.eclipse.wst.validation.prefs ├── org.eclipse.m2e.core.prefs ├── org.eclipse.core.resources.prefs ├── org.eclipse.wst.common.project.facet.core.prefs.xml ├── org.eclipse.wst.common.project.facet.core.xml ├── org.eclipse.jdt.core.prefs └── org.eclipse.wst.common.component ├── LICENSE ├── .project ├── .classpath └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /src/main/resources/btsql-ext.properties: -------------------------------------------------------------------------------- 1 | PRODUCT_MODE=true 2 | OFFSET_START_ZERO=true -------------------------------------------------------------------------------- /src/main/webapp/static/lib/jquery-backstretch/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules -------------------------------------------------------------------------------- /src/main/webapp/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.validation.prefs: -------------------------------------------------------------------------------- 1 | disabled=06target 2 | eclipse.preferences.version=1 3 | -------------------------------------------------------------------------------- /src/main/webapp/static/img/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/bg.png -------------------------------------------------------------------------------- /src/main/webapp/Html/images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/bg.png -------------------------------------------------------------------------------- /src/main/webapp/Html/images/cn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/cn.png -------------------------------------------------------------------------------- /src/main/webapp/Html/images/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/us.png -------------------------------------------------------------------------------- /src/main/webapp/static/img/bg/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/bg/1.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/img/bg/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/bg/2.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/img/bg/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/bg/3.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/img/bg/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/bg/4.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/img/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/logo.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/user.png -------------------------------------------------------------------------------- /.settings/org.eclipse.m2e.core.prefs: -------------------------------------------------------------------------------- 1 | activeProfiles= 2 | eclipse.preferences.version=1 3 | resolveWorkspaceProjects=true 4 | version=1 5 | -------------------------------------------------------------------------------- /src/main/webapp/Html/images/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/error.png -------------------------------------------------------------------------------- /src/main/webapp/static/img/browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/browser.png -------------------------------------------------------------------------------- /src/main/webapp/static/img/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/icons.png -------------------------------------------------------------------------------- /src/main/webapp/static/img/locked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/locked.png -------------------------------------------------------------------------------- /src/main/webapp/static/img/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/success.png -------------------------------------------------------------------------------- /src/main/webapp/Html/images/content.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/content.gif -------------------------------------------------------------------------------- /src/main/webapp/Html/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/favicon.ico -------------------------------------------------------------------------------- /src/main/webapp/Html/images/menu-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/menu-bg.gif -------------------------------------------------------------------------------- /src/main/webapp/Html/images/shaddow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/shaddow.gif -------------------------------------------------------------------------------- /src/main/webapp/static/img/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/progress.png -------------------------------------------------------------------------------- /src/main/webapp/Html/css/font/awesome.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/css/font/awesome.eot -------------------------------------------------------------------------------- /src/main/webapp/Html/css/font/awesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/css/font/awesome.otf -------------------------------------------------------------------------------- /src/main/webapp/Html/css/font/awesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/css/font/awesome.ttf -------------------------------------------------------------------------------- /src/main/webapp/Html/css/font/awesome.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/css/font/awesome.woff -------------------------------------------------------------------------------- /src/main/webapp/Html/images/menu-item.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/menu-item.gif -------------------------------------------------------------------------------- /src/main/webapp/static/img/wenku_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/wenku_logo.png -------------------------------------------------------------------------------- /src/main/webapp/Html/images/shaddow-hover.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/images/shaddow-hover.gif -------------------------------------------------------------------------------- /src/main/webapp/static/css/patterns/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/patterns/logo.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/webapp/static/img/loading-upload.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/loading-upload.gif -------------------------------------------------------------------------------- /src/main/webapp/static/img/profile_small.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/profile_small.jpg -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/zTree/img/job.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/js/libs/zTree/img/job.png -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/zTree/img/line.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/js/libs/zTree/img/line.gif -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/zTree/img/repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/js/libs/zTree/img/repo.png -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/zTree/img/trans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/js/libs/zTree/img/trans.png -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/zTree/img/zTree.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/js/libs/zTree/img/zTree.gif -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/zTree/img/zTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/js/libs/zTree/img/zTree.png -------------------------------------------------------------------------------- /src/main/webapp/static/img/sprite-skin-flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/img/sprite-skin-flat.png -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/img/dash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/img/dash.jpg -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/zTree/img/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/js/libs/zTree/img/folder.png -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/zTree/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/Html/js/libs/zTree/img/loading.gif -------------------------------------------------------------------------------- /src/main/webapp/static/css/patterns/shattered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/patterns/shattered.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/plugins/jsTree/32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/plugins/jsTree/32px.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/patterns/header-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/patterns/header-logo.png -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/img/bg-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/img/bg-white.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/patterns/header-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/patterns/header-profile.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/plugins/jsTree/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/plugins/jsTree/throbber.gif -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/img/bg-opacity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/img/bg-opacity.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/layim/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/layim/loading.gif -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/img/bg-white-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/img/bg-white-lock.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/plugins/chosen/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/plugins/chosen/chosen-sprite.png -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/img/syncfusion-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/img/syncfusion-icons.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/patterns/header-profile-skin-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/patterns/header-profile-skin-1.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/patterns/header-profile-skin-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/patterns/header-profile-skin-3.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/plugins/chosen/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/css/plugins/chosen/chosen-sprite@2x.png -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/webapp/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/icon.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/textbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/textbg.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/moon/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/moon/default.png -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/bootstrap-fileinput/img/loading.gif -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/img/remove-icon-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/img/remove-icon-small.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/icon-ext.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/icon_ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/icon_ext.png -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/img/loading-sm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/bootstrap-fileinput/img/loading-sm.gif -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/img/inbox-nav-arrow-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/img/inbox-nav-arrow-blue.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/loading-0.gif -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/loading-1.gif -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/loading-2.gif -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/xubox_ico0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/xubox_ico0.png -------------------------------------------------------------------------------- /src/main/webapp/static/lib/jquery.uniform/themes/images/bg-input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/jquery.uniform/themes/images/bg-input.png -------------------------------------------------------------------------------- /src/main/webapp/static/lib/jquery.uniform/themes/images/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/jquery.uniform/themes/images/sprite.png -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/img/syncfusion-icons-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/img/syncfusion-icons-white.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/laydate/skins/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/laydate/skins/default/icon.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/xubox_title0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/xubox_title0.png -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading0.gif -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading1.gif -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading2.gif -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading3.gif -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/fonts/v10/uYKcPVoh6c5R0NpdEY5A-Q.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/fonts/v10/uYKcPVoh6c5R0NpdEY5A-Q.woff -------------------------------------------------------------------------------- /.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//src/main/java=UTF-8 3 | encoding//src/main/resources=UTF-8 4 | encoding//src/test/java=UTF-8 5 | encoding/=UTF-8 6 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/jquery.uniform/themes/images/bg-input-focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/jquery.uniform/themes/images/bg-input-focus.png -------------------------------------------------------------------------------- /src/main/webapp/static/css/plugins/cron-generator/cronGen.css: -------------------------------------------------------------------------------- 1 | .line { 2 | height: 25px; 3 | line-height: 20px; 4 | margin: 3px; 5 | } 6 | .imp { 7 | padding-left: 25px; 8 | } 9 | #CronGenTabs li a{ 10 | padding: 10px 15px; 11 | } -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.common.project.facet.core.prefs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/fonts/v10/DXI1ORHCpsQm3Vp6mXoaTRsxEYwM7FgeyaSgU71cLG0.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/fonts/v10/DXI1ORHCpsQm3Vp6mXoaTRsxEYwM7FgeyaSgU71cLG0.woff -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/fonts/v10/MTP_ySUJH_bn48VBG8sNShsxEYwM7FgeyaSgU71cLG0.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/fonts/v10/MTP_ySUJH_bn48VBG8sNShsxEYwM7FgeyaSgU71cLG0.woff -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/fonts/v10/k3k702ZOKiLJc3WVjuplzBsxEYwM7FgeyaSgU71cLG0.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiangzongyao/kettle-master/HEAD/src/main/webapp/static/lib/metronic/fonts/v10/k3k702ZOKiLJc3WVjuplzBsxEYwM7FgeyaSgU71cLG0.woff -------------------------------------------------------------------------------- /src/main/resources/resource/db.properties: -------------------------------------------------------------------------------- 1 | jdbc.driver=com.mysql.jdbc.Driver 2 | jdbc.url=jdbc:mysql://192.168.1.200:3306/kettle_master_test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false 3 | jdbc.username=root 4 | jdbc.password=root -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/common/exception/SeviceException.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.common.exception; 2 | 3 | public class SeviceException extends Exception{ 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KJobDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KJobDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KUserDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KUserDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KQuartzDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KQuartzDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KTransDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KTransDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KJobRecordDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KJobRecordDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KJobMonitorDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KJobMonitorDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KRepositoryDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KRepositoryDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KTransRecordDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KTransRecordDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KTransMonitorDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KTransMonitorDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/mapper/KRepositoryTypeDao.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.mapper; 2 | 3 | import org.beetl.sql.core.mapper.BaseMapper; 4 | 5 | import com.leadingsoft.core.model.*; 6 | 7 | 8 | public interface KRepositoryTypeDao extends BaseMapper { 9 | 10 | } -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.common.project.facet.core.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/resources/resource/kettle.properties: -------------------------------------------------------------------------------- 1 | #********************************************************************** 2 | # Kettle Properties 3 | #********************************************************************** 4 | kettle.home=src/main/webapp/WEB-INF/lib 5 | kettle.plugin=plugins 6 | kettle.script=src/main/webapp/Html/js/libs/url 7 | kettle.loglevel=detail 8 | kettle.log.file.path=/tmp/kettle-master/ 9 | kettle.file.repository=/tmp/kettle-repository -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 4 | org.eclipse.jdt.core.compiler.compliance=1.8 5 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 6 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 7 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning 8 | org.eclipse.jdt.core.compiler.source=1.8 9 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/common/kettle/environment/StartInit.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.common.kettle.environment; 2 | 3 | import org.springframework.beans.factory.InitializingBean; 4 | 5 | public class StartInit implements InitializingBean{ 6 | 7 | @Override 8 | public void afterPropertiesSet() throws Exception { 9 | //初始化环境*** 10 | com.leadingsoft.common.kettle.environment.KettleInit.init(); 11 | org.pentaho.di.core.KettleEnvironment.init(); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/webapp/Html/error.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 22 | 23 | 24 |
25 |
26 |
27 | 28 | -------------------------------------------------------------------------------- /src/main/webapp/Html/js/ui.plugin.js: -------------------------------------------------------------------------------- 1 | var plugin = {}; 2 | 3 | plugin.locale = function(language){ 4 | $.i18n.init({ 5 | name:'message', 6 | path:ctx+'/Html/js/messages/', 7 | language: language, 8 | mode:'map', 9 | encoding: 'UTF-8', 10 | callback: function() { 11 | } 12 | }); 13 | }; 14 | plugin.isWidthChar = function(val) { 15 | var pattern = /^[a-zA-Z]([a-zA-Z0-9]|[_]){6,64}$/; 16 | return pattern.exec(val); 17 | }; 18 | plugin.language = function(val) { 19 | $.post(ctx+"/Locale?language="+val+"&url="+location.href, function(data) {}); 20 | window.location.reload(); 21 | }; 22 | $(function(){ 23 | plugin.locale(language); 24 | }); -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/dto/BootTablePage.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.dto; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * BootstrapTable表格规定 7 | * 返回数据格式 8 | */ 9 | public class BootTablePage { 10 | 11 | //总数量 12 | private long total; 13 | //每一页的数据 14 | private List rows; 15 | 16 | public BootTablePage() { 17 | } 18 | public BootTablePage(long total, List rows) { 19 | super(); 20 | this.total = total; 21 | this.rows = rows; 22 | } 23 | 24 | public long getTotal() { 25 | return total; 26 | } 27 | public void setTotal(long total) { 28 | this.total = total; 29 | } 30 | public List getRows() { 31 | return rows; 32 | } 33 | public void setRows(List rows) { 34 | this.rows = rows; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/resources/spring/applicationContext-service.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.common.component: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/main/webapp/Html/js/ui.user.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | $("#iUser").click(function() { 3 | var name = $.trim($("#name").val()); 4 | if (!name) { 5 | alert($.i18n.get('org.ukettle.iQuartz.Verify.User.Name')); 6 | return false; 7 | } 8 | var reg = /^(?:[a-z\d]+[_\-\+\.]?)*[a-z\d]+@(?:([a-z\d]+\-?)*[a-z\d]+\.)+([a-z]{2,})+$/i; 9 | var email = $.trim($("#email").val()); 10 | if(!reg.test(email)){ 11 | alert($.i18n.get('org.ukettle.iQuartz.Verify.User.Email')); 12 | return false; 13 | } 14 | var password = $.trim($("#password").val()); 15 | var password1 = $.trim($("#password1").val()); 16 | if (!password || !password1 || password != password1) { 17 | alert($.i18n.get('org.ukettle.iQuartz.Verify.User.Password')); 18 | return false; 19 | } 20 | $('#formId').submit(); 21 | }); 22 | }); -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/layim/data/chatlog.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": 1, 3 | "msg": "ok", 4 | "data": [ 5 | { 6 | "id": "100001", 7 | "name": "Beaut-zihan", 8 | "time": "10:23", 9 | "face": "img/a1.jpg" 10 | }, 11 | { 12 | "id": "100002", 13 | "name": "慕容晓晓", 14 | "time": "昨天", 15 | "face": "img/a2.jpg" 16 | }, 17 | { 18 | "id": "1000033", 19 | "name": "乔峰", 20 | "time": "2014-4.22", 21 | "face": "img/a3.jpg" 22 | }, 23 | { 24 | "id": "10000333", 25 | "name": "高圆圆", 26 | "time": "2014-4.21", 27 | "face": "img/a4.jpg" 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * bootstrap-table - v1.9.0 - 2015-09-30 3 | * https://github.com/wenzhixin/bootstrap-table 4 | * Copyright (c) 2015 zhixin wen 5 | * Licensed MIT License 6 | */ 7 | !function(a){"use strict";a.fn.bootstrapTable.locales["zh-CN"]={formatLoadingMessage:function(){return"正在努力地加载数据中,请稍候……"},formatRecordsPerPage:function(a){return"每页显示 "+a+" 条记录"},formatShowingRows:function(a,b,c){return"显示第 "+a+" 到第 "+b+" 条记录,总共 "+c+" 条记录"},formatSearch:function(){return"搜索"},formatNoMatches:function(){return"没有找到匹配的记录"},formatPaginationSwitch:function(){return"隐藏/显示分页"},formatRefresh:function(){return"刷新"},formatToggle:function(){return"切换"},formatColumns:function(){return"列"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["zh-CN"])}(jQuery); 8 | -------------------------------------------------------------------------------- /src/test/java/com/leadingsoft/test/quartz/QuartzTest.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.test.quartz; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import org.junit.Test; 7 | 8 | import com.leadingsoft.web.quartz.QuartzManager; 9 | import com.leadingsoft.web.quartz.TransQuartz; 10 | 11 | public class QuartzTest { 12 | 13 | @Test 14 | public void AddJobTest(){ 15 | 16 | 17 | 18 | 19 | String cron = "*/5 * * * * ?"; 20 | Map parameter = new HashMap(); 21 | QuartzManager.addJob("aaa", "aaaaaaaaaa", "qqq1111", "aaa", TransQuartz.class, cron, parameter); 22 | } 23 | 24 | 25 | 26 | public static void main(String[] args){ 27 | Map parameter = new HashMap(); 28 | QuartzManager.addOnceJob("aaa", "aaaaaaaaaa", "qqq1111", "aaa", TransQuartz.class, parameter); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/model/KRepositoryType.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.model; 2 | 3 | public class KRepositoryType { 4 | private Integer repositoryTypeId ; 5 | private String repositoryTypeCode ; 6 | private String repositoryTypeDes ; 7 | 8 | public KRepositoryType() { 9 | } 10 | 11 | public Integer getRepositoryTypeId(){ 12 | return repositoryTypeId; 13 | } 14 | public void setRepositoryTypeId(Integer repositoryTypeId ){ 15 | this.repositoryTypeId = repositoryTypeId; 16 | } 17 | 18 | public String getRepositoryTypeCode(){ 19 | return repositoryTypeCode; 20 | } 21 | public void setRepositoryTypeCode(String repositoryTypeCode ){ 22 | this.repositoryTypeCode = repositoryTypeCode; 23 | } 24 | 25 | public String getRepositoryTypeDes(){ 26 | return repositoryTypeDes; 27 | } 28 | public void setRepositoryTypeDes(String repositoryTypeDes ){ 29 | this.repositoryTypeDes = repositoryTypeDes; 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.md5.js: -------------------------------------------------------------------------------- 1 | var MessageDigest = java.security.MessageDigest; 2 | var StringBuffer = java.lang.StringBuffer; 3 | var Integer = java.lang.Integer; 4 | 5 | 6 | function CMGMD5(){} 7 | 8 | CMGMD5.prototype.encrypt = function (strSource) { 9 | var algorithm = MessageDigest.getInstance("MD5"); 10 | 11 | // get the input as bytes 12 | var bytes = new java.lang.String(strSource).getBytes("UTF-8"); 13 | 14 | // calculate the digest 15 | algorithm.reset(); 16 | algorithm.update(bytes); 17 | var md5Digest = algorithm.digest(); 18 | 19 | // turn the digest into a hex-string representation 20 | var hexString = new StringBuffer(); 21 | 22 | for (var i = 0; i < md5Digest.length; i++){ 23 | var hex = Integer.toHexString(md5Digest[i] & 0XFF); 24 | if (hex.length() == 1){ 25 | hexString.append('0').append(""); 26 | } 27 | hexString.append(hex); 28 | } 29 | 30 | // write output value 31 | return hexString.toString(); 32 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/fonts/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Open Sans'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: local('Open Sans Light'), local('OpenSans-Light'), url(v10/DXI1ORHCpsQm3Vp6mXoaTRsxEYwM7FgeyaSgU71cLG0.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Open Sans'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: local('Open Sans'), local('OpenSans'), url(v10/uYKcPVoh6c5R0NpdEY5A-Q.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Open Sans'; 15 | font-style: normal; 16 | font-weight: 600; 17 | src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(v10/MTP_ySUJH_bn48VBG8sNShsxEYwM7FgeyaSgU71cLG0.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Open Sans'; 21 | font-style: normal; 22 | font-weight: 700; 23 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(v10/k3k702ZOKiLJc3WVjuplzBsxEYwM7FgeyaSgU71cLG0.woff) format('woff'); 24 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/jquery-backstretch/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-backstretch", 3 | "description": "A simple jQuery plugin that allows you to add a dynamically-resized, slideshow-capable background image to any page or element.", 4 | "version": "2.0.4", 5 | "homepage": "http://srobbin.com/jquery-plugins/backstretch/", 6 | "author": { 7 | "name": "Scott Robbin", 8 | "email": "scott@robbin.co", 9 | "url": "http://srobbin.com" 10 | }, 11 | "main": [ 12 | "jquery.backstretch.js" 13 | ], 14 | "dependencies": { 15 | "jquery": "~1.9.1" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git://github.com/srobbin/jquery-backstretch.git" 20 | }, 21 | "_release": "2.0.4", 22 | "_resolution": { 23 | "type": "version", 24 | "tag": "2.0.4", 25 | "commit": "b9a96f872e535f1e31fa7868be14940d0e00271f" 26 | }, 27 | "_source": "https://github.com/srobbin/jquery-backstretch.git", 28 | "_target": "^2.0.4", 29 | "_originalSource": "jquery-backstretch" 30 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/QuartzController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | import com.leadingsoft.common.toolkit.Constant; 10 | import com.leadingsoft.core.model.KUser; 11 | import com.leadingsoft.web.service.QuartzService; 12 | import com.leadingsoft.web.utils.JsonUtils; 13 | 14 | @RestController 15 | @RequestMapping("/quartz/") 16 | public class QuartzController { 17 | 18 | @Autowired 19 | private QuartzService quartzService; 20 | 21 | @RequestMapping("getSimpleList.shtml") 22 | public String simpleList(HttpServletRequest request){ 23 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 24 | return JsonUtils.objectToJson(quartzService.getList(kUser.getuId())); 25 | } 26 | 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RestController; 6 | 7 | import com.leadingsoft.core.dto.ResultDto; 8 | import com.leadingsoft.web.service.UserService; 9 | import com.leadingsoft.web.utils.JsonUtils; 10 | 11 | @RestController 12 | @RequestMapping("/user/") 13 | public class UserController { 14 | 15 | @Autowired 16 | private UserService userService; 17 | 18 | @RequestMapping("getList.shtml") 19 | public String getList(Integer offset, Integer limit){ 20 | return JsonUtils.objectToJson(userService.getList(offset, limit)); 21 | } 22 | 23 | @RequestMapping("delete.shtml") 24 | public String delete(Integer uId){ 25 | userService.delete(uId); 26 | return ResultDto.success(); 27 | } 28 | 29 | @RequestMapping("resetPassword.shtml") 30 | public String resetPassword(){ 31 | 32 | return ResultDto.success(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/quartz/QuartzListener.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.quartz; 2 | 3 | import java.util.Date; 4 | 5 | import org.quartz.JobExecutionContext; 6 | import org.quartz.JobExecutionException; 7 | import org.quartz.JobListener; 8 | 9 | public class QuartzListener implements JobListener{ 10 | 11 | @Override 12 | public String getName() { 13 | return new Date().getTime() + "QuartzListener"; 14 | } 15 | @Override 16 | public void jobToBeExecuted(JobExecutionContext context) { 17 | } 18 | @Override 19 | public void jobExecutionVetoed(JobExecutionContext context) { 20 | } 21 | @Override 22 | public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) { 23 | String jobName = context.getJobDetail().getKey().getName(); 24 | String jobGroupName = context.getJobDetail().getKey().getGroup(); 25 | String triggerName = context.getTrigger().getKey().getName(); 26 | String triggerGroupName = context.getTrigger().getKey().getGroup(); 27 | //一次性任务,执行完之后需要移除 28 | QuartzManager.removeJob(jobName, jobGroupName, triggerName, triggerGroupName); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 潇洒的吸血鬼 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | ***********************log4j.properties*********************** 2 | log4j.rootLogger=info, stdout, root, error 3 | 4 | log4j.appender.stdout=org.apache.log4j.ConsoleAppender 5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 6 | log4j.appender.stdout.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r(%C:%M) - %m%n 7 | 8 | log4j.appender.root=org.apache.log4j.RollingFileAppender 9 | log4j.appender.root.File=${webapp.root}/log/gcr_log.log 10 | log4j.appender.root.MaxFileSize=512KB 11 | log4j.appender.root.MaxBackupIndex=5 12 | log4j.appender.root.encoding=UTF-8 13 | log4j.appender.root.layout=org.apache.log4j.PatternLayout 14 | log4j.appender.root.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r(%C:%M) - %m%n 15 | 16 | log4j.appender.error=org.apache.log4j.RollingFileAppender 17 | log4j.appender.error.File=${webapp.root}/log/knowledge_log.log 18 | log4j.appender.error.MaxFileSize=512KB 19 | log4j.appender.error.MaxBackupIndex=5 20 | log4j.appender.error.encoding=UTF-8 21 | log4j.appender.error.Threshold = ERROR 22 | log4j.appender.error.append=true 23 | log4j.appender.error.layout=org.apache.log4j.PatternLayout 24 | log4j.appender.error.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r(%C:%M) - %m%n -------------------------------------------------------------------------------- /src/main/webapp/static/lib/jquery.uniform/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery.uniform", 3 | "description": "A jQuery plugin to make your form controls look how you want them to. Now with HTML-5 attributes!", 4 | "homepage": "http://opensource.audith.org/uniform", 5 | "main": [ 6 | "lib/jquery.uniform.js" 7 | ], 8 | "dependencies": { 9 | "jquery": "^1.6" 10 | }, 11 | "moduleType": [ 12 | "globals" 13 | ], 14 | "keywords": [ 15 | "motion", 16 | "physics", 17 | "particles" 18 | ], 19 | "authors": [ 20 | "Shahriyar Imanov ", 21 | "Josh Pyles ", 22 | "Tyler Akins " 23 | ], 24 | "license": "MIT", 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/AudithSoftworks/Uniform" 28 | }, 29 | "ignore": [ 30 | "**/.*", 31 | "node_modules", 32 | "bower_components", 33 | "www", 34 | "www-fragments" 35 | ], 36 | "version": "2.2.2", 37 | "_release": "2.2.2", 38 | "_resolution": { 39 | "type": "version", 40 | "tag": "v2.2.2", 41 | "commit": "a613cbb325d067296e14a9eaee2e409b7f20b8e3" 42 | }, 43 | "_source": "https://github.com/AudithSoftworks/Uniform.git", 44 | "_target": "^2.2.2", 45 | "_originalSource": "jquery.uniform" 46 | } -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/validate/messages_zh.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.13.1 - 10/14/2014 2 | * http://jqueryvalidation.org/ 3 | * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */ 4 | ! function (a) { 5 | "function" == typeof define && define.amd ? define(["jquery", "jquery.validate.min"], a) : a(jQuery) 6 | }(function (a) { 7 | var icon = " "; 8 | a.extend(a.validator.messages, { 9 | required: icon + "必填", 10 | remote: icon + "请修正此栏位", 11 | email: icon + "请输入有效的电子邮件", 12 | url: icon + "请输入有效的网址", 13 | date: icon + "请输入有效的日期", 14 | dateISO: icon + "请输入有效的日期 (YYYY-MM-DD)", 15 | number: icon + "请输入正确的数字", 16 | digits: icon + "只能输入数字", 17 | creditcard: icon + "请输入有效的信用卡号码", 18 | equalTo: icon + "你的输入不相同", 19 | extension: icon + "请输入有效的后缀", 20 | maxlength: a.validator.format(icon + "最多 {0} 个字"), 21 | minlength: a.validator.format(icon + "最少 {0} 个字"), 22 | rangelength: a.validator.format(icon + "请输入长度为 {0} 至 {1} 之间的字串"), 23 | range: a.validator.format(icon + "请输入 {0} 至 {1} 之间的数值"), 24 | max: a.validator.format(icon + "请输入不大于 {0} 的数值"), 25 | min: a.validator.format(icon + "请输入不小于 {0} 的数值") 26 | }) 27 | }); 28 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/utils/DataValidate.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.utils; 2 | 3 | import java.lang.reflect.InvocationTargetException; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | import org.apache.commons.beanutils.BeanUtils; 9 | import org.apache.commons.collections.CollectionUtils; 10 | import org.springframework.util.ObjectUtils; 11 | 12 | import com.leadingsoft.core.dto.web.KRepositoryDto; 13 | 14 | public class DataValidate { 15 | 16 | /** 17 | * @Title AllNotEmpty 18 | * @Description 实体类参数校验(写这个方法的时候我的内心是崩溃的) 19 | * @param object 实体类 20 | * @return 21 | * @return boolean 22 | */ 23 | public static boolean AllNotEmpty(Object object){ 24 | List returnList = new ArrayList<>(); 25 | try { 26 | Map describe = BeanUtils.describe(object); 27 | describe.forEach((k, v) -> { 28 | if (ObjectUtils.isEmpty(v)){ 29 | returnList.add(v); 30 | } 31 | }); 32 | } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 33 | e.printStackTrace(); 34 | } 35 | return CollectionUtils.isEmpty(returnList); 36 | } 37 | 38 | public static void main(String[] args){ 39 | KRepositoryDto kRepositoryDto = new KRepositoryDto(); 40 | System.out.println(DataValidate.AllNotEmpty(kRepositoryDto)); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bootstrap Table Chinese translation 3 | * Author: Zhixin Wen 4 | */ 5 | (function ($) { 6 | 'use strict'; 7 | 8 | $.fn.bootstrapTable.locales['zh-CN'] = { 9 | formatLoadingMessage: function () { 10 | return '正在努力地加载数据中,请稍候……'; 11 | }, 12 | formatRecordsPerPage: function (pageNumber) { 13 | return '每页显示 ' + pageNumber + ' 条记录'; 14 | }, 15 | formatShowingRows: function (pageFrom, pageTo, totalRows) { 16 | return '显示第 ' + pageFrom + ' 到第 ' + pageTo + ' 条记录,总共 ' + totalRows + ' 条记录'; 17 | }, 18 | formatSearch: function () { 19 | return '搜索'; 20 | }, 21 | formatNoMatches: function () { 22 | return '没有找到匹配的记录'; 23 | }, 24 | formatPaginationSwitch: function () { 25 | return '隐藏/显示分页'; 26 | }, 27 | formatRefresh: function () { 28 | return '刷新'; 29 | }, 30 | formatToggle: function () { 31 | return '切换'; 32 | }, 33 | formatColumns: function () { 34 | return '列'; 35 | } 36 | }; 37 | 38 | $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN']); 39 | 40 | })(jQuery); 41 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/conf/LoginInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.conf; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import org.springframework.web.servlet.HandlerInterceptor; 7 | import org.springframework.web.servlet.ModelAndView; 8 | 9 | import com.leadingsoft.common.toolkit.Constant; 10 | 11 | public class LoginInterceptor implements HandlerInterceptor{ 12 | 13 | @Override 14 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 15 | throws Exception { 16 | Object attribute = request.getSession().getAttribute(Constant.SESSION_ID); 17 | String uri = request.getRequestURI(); 18 | //登陆请求不能被拦截 19 | if(!uri.contains("view/loginUI.shtml") && !uri.contains("index/login.shtml")){ 20 | //判断session中是否有值? 21 | if(attribute == null){ 22 | response.sendRedirect(request.getContextPath() + "/view/loginUI.shtml"); 23 | return false; 24 | } 25 | } 26 | return true; 27 | } 28 | 29 | @Override 30 | public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 31 | ModelAndView modelAndView) throws Exception { 32 | } 33 | 34 | @Override 35 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 36 | throws Exception { 37 | } 38 | } -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | master 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.wst.common.project.facet.core.builder 15 | 16 | 17 | 18 | 19 | org.eclipse.wst.validation.validationbuilder 20 | 21 | 22 | 23 | 24 | org.springframework.ide.eclipse.core.springbuilder 25 | 26 | 27 | 28 | 29 | org.eclipse.m2e.core.maven2Builder 30 | 31 | 32 | 33 | 34 | 35 | org.springframework.ide.eclipse.core.springnature 36 | org.eclipse.jem.workbench.JavaEMFNature 37 | org.eclipse.wst.common.modulecore.ModuleCoreNature 38 | org.eclipse.jdt.core.javanature 39 | org.eclipse.m2e.core.maven2Nature 40 | org.eclipse.wst.common.project.facet.core.nature 41 | org.eclipse.wst.jsdt.core.jsNature 42 | 43 | 44 | -------------------------------------------------------------------------------- /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/layim/data/groups.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": 1, 3 | "msg": "ok", 4 | "data": [ 5 | { 6 | "id": "100001", 7 | "name": "無言的蒁説", 8 | "face": "img/a1.jpg" 9 | }, 10 | { 11 | "id": "100002", 12 | "name": "婷宝奢侈品", 13 | "face": "img/a2.jpg" 14 | }, 15 | { 16 | "id": "100003", 17 | "name": "忆恨思爱", 18 | "face": "img/a3.jpg" 19 | }, 20 | { 21 | "id": "100004", 22 | "name": "天涯奥拓慢", 23 | "face": "img/a4.jpg" 24 | }, 25 | { 26 | "id": "100005", 27 | "name": "雨落无声的天空", 28 | "face": "img/a5.jpg" 29 | }, 30 | { 31 | "id": "100006", 32 | "name": "李越LycorisRadiate", 33 | "face": "img/a6.jpg" 34 | }, 35 | { 36 | "id": "100007", 37 | "name": "冯胖妞张直丑", 38 | "face": "img/a7.jpg" 39 | }, 40 | { 41 | "id": "100008", 42 | "name": "陈龙hmmm", 43 | "face": "img/a8.jpg" 44 | }, 45 | { 46 | "id": "100009", 47 | "name": "别闹哥胆儿小", 48 | "face": "img/a9.jpg" 49 | }, 50 | { 51 | "id": "100010", 52 | "name": "锅锅锅锅萌哒哒 ", 53 | "face": "img/a10.jpg" 54 | } 55 | ] 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/quartz/model/DBConnectionModel.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.quartz.model; 2 | 3 | public class DBConnectionModel { 4 | 5 | private String connectionDriveClassName; 6 | private String connectionUrl; 7 | private String connectionUser; 8 | private String connectionPassword; 9 | public String getConnectionDriveClassName() { 10 | return connectionDriveClassName; 11 | } 12 | public void setConnectionDriveClassName(String connectionDriveClassName) { 13 | this.connectionDriveClassName = connectionDriveClassName; 14 | } 15 | public String getConnectionUrl() { 16 | return connectionUrl; 17 | } 18 | public void setConnectionUrl(String connectionUrl) { 19 | this.connectionUrl = connectionUrl; 20 | } 21 | public String getConnectionUser() { 22 | return connectionUser; 23 | } 24 | public void setConnectionUser(String connectionUser) { 25 | this.connectionUser = connectionUser; 26 | } 27 | public String getConnectionPassword() { 28 | return connectionPassword; 29 | } 30 | public void setConnectionPassword(String connectionPassword) { 31 | this.connectionPassword = connectionPassword; 32 | } 33 | public DBConnectionModel(String connectionDriveClassName, String connectionUrl, String connectionUser, 34 | String connectionPassword) { 35 | this.connectionDriveClassName = connectionDriveClassName; 36 | this.connectionUrl = connectionUrl; 37 | this.connectionUser = connectionUser; 38 | this.connectionPassword = connectionPassword; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/common/toolkit/MD5Utils.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.common.toolkit; 2 | 3 | import org.apache.commons.codec.digest.DigestUtils; 4 | import org.apache.commons.lang.ArrayUtils; 5 | import org.apache.commons.lang.StringUtils; 6 | 7 | public class MD5Utils { 8 | 9 | private static String salt = "leadingsoft"; 10 | 11 | /** 12 | * 加密字符串 13 | * @param password 要加密的明文 14 | * @param isAddSalt 是否加默认盐 15 | * @return 加密之后的结果 16 | */ 17 | public static String Encrypt(String password, boolean isAddSalt){ 18 | if (StringUtils.isNotEmpty(password)){ 19 | if (isAddSalt){ 20 | return DigestUtils.md5Hex(DigestUtils.md5(password + salt)); 21 | } else { 22 | return DigestUtils.md5Hex(DigestUtils.md5(password)); 23 | } 24 | } 25 | return null; 26 | } 27 | 28 | /** 29 | * 30 | * @param bytes 31 | * @return 32 | */ 33 | public static String Encrypt(byte[] bytes){ 34 | if (ArrayUtils.isNotEmpty(bytes)){ 35 | return DigestUtils.md5Hex(DigestUtils.md5(bytes)); 36 | } 37 | return null; 38 | } 39 | 40 | /** 41 | * MD5加盐加密 42 | * @param password 要加密的明文 43 | * @param salt 盐 44 | * @return 加密之后的结果 45 | */ 46 | public static String Encrypt(String password, String salt){ 47 | if (StringUtils.isNotEmpty(password)){ 48 | return DigestUtils.md5Hex(DigestUtils.md5(password + salt)); 49 | } 50 | return null; 51 | } 52 | 53 | public static void main(String[] args){ 54 | System.out.println(MD5Utils.Encrypt("admin", true)); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #kettle-master 2 | #####这是一个对客户端版的kettle创建的job和transformation进行统一管理的工具(支持kettle8.0版本) 3 | 4 | ---------- 5 | 6 | ####简单说明 7 | 8 | > * 目前已经支持文件类型转换和任务的保存和添加,保存位置在配置文件中进行配置。 9 | * 因为kettle支持的转换类型非常的多。目前我只是测试了MySQL数据的导入和导出以及MySQL-Excel数据之间的转换,如果添加的转换比较复杂是一定会出问题的。这个目前来说也没有什么优雅的解决办法,正在逐步完善。 10 | * 现在本系统,作为kettle的简单调度平台。还缺少很多的模型模板作为提供,这也是在未来要进行完善的模块。 11 | 12 | ---------- 13 | 14 | ####使用工具(这里我觉得直接看pom文件比较好) 15 | 16 | ####主要是spring+mvc+beetlsql的整合使用,这里必须多说一句,beetlsql的确是非常的好用 17 | 18 | ---------- 19 | 20 | ####项目启动 21 | 22 | > 1. 下载项目 23 | 2. 导入eclipse 24 | 3. 等待maven下载完包 25 | 4. 等 26 | 5. 等 27 | 6. 一直等到项目不报错了 28 | 7. 导入数据库文件 29 | 8. 配置数据库连接(resource目录下面) 30 | 9. 扔到Tomcat里面进行启动 31 | 32 | ---------- 33 | 34 | ####项目二次开发 35 | 36 | > 项目模块划分挺清楚的,想开发那个模块就直接写吧。如果有看不懂的加我QQ详聊2029403224 37 | 38 | ---------- 39 | 40 | ####截图 41 | ![资源库添加](https://git.oschina.net/uploads/images/2017/0604/092444_b758f1fd_673473.png "在这里输入图片标题") 42 | 43 | ![转换管理](https://git.oschina.net/uploads/images/2017/0604/092537_3dacaf57_673473.png "在这里输入图片标题") 44 | 45 | ![添加作业](https://git.oschina.net/uploads/images/2017/0604/092605_0ce30ec3_673473.png "在这里输入图片标题") 46 | 47 | ![运行日志列表](https://git.oschina.net/uploads/images/2017/0604/092628_642831f1_673473.png "在这里输入图片标题") 48 | 49 | ![查看运行日志](https://git.oschina.net/uploads/images/2017/0604/092645_7c09c4ed_673473.png "在这里输入图片标题") 50 | 51 | ![作业和转换的监控](https://git.oschina.net/uploads/images/2017/0609/133217_28f21aa2_673473.png "在这里输入图片标题") 52 | 53 | ---------- 54 | 55 | ####鸣谢 56 | 57 | [项目一些代码,参考了这位大神开发的管理平台。万分感谢,我只是做了个升级的工作(从7.0支持到了8.0)][1] 58 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/JobRecordController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | import com.leadingsoft.common.toolkit.Constant; 12 | import com.leadingsoft.core.dto.BootTablePage; 13 | import com.leadingsoft.core.dto.ResultDto; 14 | import com.leadingsoft.core.model.KUser; 15 | import com.leadingsoft.web.service.JobRecordService; 16 | import com.leadingsoft.web.utils.JsonUtils; 17 | 18 | @RestController 19 | @RequestMapping("/job/record/") 20 | public class JobRecordController { 21 | 22 | @Autowired 23 | private JobRecordService jobRecordService; 24 | 25 | @RequestMapping("getList.shtml") 26 | public String getList(Integer offset, Integer limit, Integer JobId, HttpServletRequest request){ 27 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 28 | BootTablePage list = jobRecordService.getList(offset, limit, kUser.getuId(), JobId); 29 | return JsonUtils.objectToJson(list); 30 | } 31 | 32 | @RequestMapping("getLogContent.shtml") 33 | public String getLogContent(Integer recordId){ 34 | try { 35 | String logContent = jobRecordService.getLogContent(recordId); 36 | return ResultDto.success(logContent.replace("\r\n", "
")); 37 | } catch (IOException e) { 38 | e.printStackTrace(); 39 | return null; 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/TransRecordController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | import com.leadingsoft.common.toolkit.Constant; 12 | import com.leadingsoft.core.dto.BootTablePage; 13 | import com.leadingsoft.core.dto.ResultDto; 14 | import com.leadingsoft.core.model.KUser; 15 | import com.leadingsoft.web.service.TransRecordService; 16 | import com.leadingsoft.web.utils.JsonUtils; 17 | 18 | @RestController 19 | @RequestMapping("/trans/record/") 20 | public class TransRecordController { 21 | 22 | @Autowired 23 | private TransRecordService transRecordService; 24 | 25 | @RequestMapping("getList.shtml") 26 | public String getList(Integer offset, Integer limit, Integer transId, HttpServletRequest request){ 27 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 28 | BootTablePage list = transRecordService.getList(offset, limit, kUser.getuId(), transId); 29 | return JsonUtils.objectToJson(list); 30 | } 31 | 32 | @RequestMapping("getLogContent.shtml") 33 | public String getLogContent(Integer recordId){ 34 | try { 35 | String logContent = transRecordService.getLogContent(recordId); 36 | return ResultDto.success(logContent.replace("\r\n", "
")); 37 | } catch (IOException e) { 38 | e.printStackTrace(); 39 | return null; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/webapp/static/js/my/login.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | Metronic.init(); 3 | var $errorMsg = $("#errorMsg"); 4 | var $alert = $("#alert"); 5 | if ($errorMsg.text() === "" || $errorMsg.text() === "null"){ 6 | $alert.css("display","none"); 7 | } 8 | $.backstretch([ 9 | "static/img/bg/1.jpg", 10 | "static/img/bg/2.jpg", 11 | "static/img/bg/3.jpg", 12 | "static/img/bg/4.jpg" 13 | ],{ 14 | fade: 1000, 15 | duration: 8000 16 | } 17 | ); 18 | }); 19 | $(function () { 20 | var localStorage = window.localStorage; 21 | if (localStorage.getItem("uAccount") != null){ 22 | $("#uAccount").val(localStorage.getItem("uAccount")); 23 | $("#uPassword").val(localStorage.getItem("uPassword")); 24 | $("#remember").attr("checked", true); 25 | } 26 | }); 27 | //回车事件 28 | document.onkeydown = keydown; 29 | function keydown(e) { 30 | var currKey = 0, e = e || event; 31 | currKey = e.keyCode || e.which || e.charCode;//支持IE、FF 32 | if (currKey == 13) { 33 | submitFrom(); 34 | } 35 | } 36 | 37 | var submitFrom = function() { 38 | var localStorage = window.localStorage; 39 | var $uAccount = $("#uAccount").val(); 40 | var $uPassword = $("#uPassword").val(); 41 | if ($('#remember').is(':checked')) { 42 | localStorage.setItem("uAccount", $uAccount); 43 | localStorage.setItem("uPassword", $uPassword); 44 | }else{ 45 | if(localStorage.getItem("uAccount") != null){ 46 | localStorage.removeItem("uAccount"); 47 | localStorage.removeItem("uPassword"); 48 | } 49 | } 50 | $("#loginForm").submit(); 51 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/themes/fa/theme.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Font Awesome icon theme configuration for bootstrap-fileinput. Requires font awesome assets to be loaded. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */!function(a){"use strict";a.fn.fileinputThemes.fa={fileActionSettings:{removeIcon:'',uploadIcon:'',zoomIcon:'',dragIcon:'',indicatorNew:'',indicatorSuccess:'',indicatorError:'',indicatorLoading:''},layoutTemplates:{fileIcon:' '},previewZoomButtonIcons:{prev:'',next:'',toggleheader:'',fullscreen:'',borderless:'',close:''},previewFileIcon:'',browseIcon:'',removeIcon:'',cancelIcon:'',uploadIcon:'',msgValidationErrorIcon:' '}}(window.jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table-mobile.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * bootstrap-table - v1.9.0 - 2015-09-30 3 | * https://github.com/wenzhixin/bootstrap-table 4 | * Copyright (c) 2015 zhixin wen 5 | * Licensed MIT License 6 | */ 7 | !function(a){"use strict";var b=function(b,c){b.options.columnsHidden.length>0&&a.each(b.columns,function(d,e){-1!==b.options.columnsHidden.indexOf(e.field)&&e.visible!==c&&b.toggleColumn(a.fn.bootstrapTable.utils.getFieldIndex(b.columns,e.field),c,!0)})},c=function(a){(a.options.height||a.options.showFooter)&&setTimeout(a.resetView,1)},d=function(a,b,d){a.options.minHeight?b<=a.options.minWidth&&d<=a.options.minHeight?e(a):b>a.options.minWidth&&d>a.options.minHeight&&f(a):b<=a.options.minWidth?e(a):b>a.options.minWidth&&f(a),c(a)},e=function(a){g(a,!1),b(a,!1)},f=function(a){g(a,!0),b(a,!0)},g=function(a,b){a.options.cardView=b,a.toggleView()},h=function(a,b){var c;return function(){var d=this,e=arguments,f=function(){c=null,a.apply(d,e)};clearTimeout(c),c=setTimeout(f,b)}};a.extend(a.fn.bootstrapTable.defaults,{mobileResponsive:!1,minWidth:562,minHeight:void 0,heightThreshold:100,checkOnInit:!0,columnsHidden:[]});var i=a.fn.bootstrapTable.Constructor,j=i.prototype.init;i.prototype.init=function(){if(j.apply(this,Array.prototype.slice.apply(arguments)),this.options.mobileResponsive&&this.options.minWidth){var b=this,c={width:a(window).width(),height:a(window).height()};if(a(window).on("resize orientationchange",h(function(){var e=a(this).height(),f=a(this).width();(Math.abs(c.height-e)>b.options.heightThreshold||c.width!=f)&&(d(b,f,e),c={width:f,height:e})},200)),this.options.checkOnInit){var e=a(window).height(),f=a(window).width();d(this,f,e),c={width:f,height:e}}}}}(jQuery); 8 | -------------------------------------------------------------------------------- /src/main/webapp/Html/js/messages/message_en_US.properties: -------------------------------------------------------------------------------- 1 | #************User Properties****************************************** 2 | org.ukettle.iQuartz.Verify.User.Name = Please check the name ! 3 | org.ukettle.iQuartz.Verify.User.Email = Please check the email ! 4 | org.ukettle.iQuartz.Verify.User.Password = Please check the password ! 5 | #************Kettle Properties**************************************** 6 | org.ukettle.iQuartz.Verify.Kettle.Repository = Repository 7 | org.ukettle.iQuartz.Verify.Kettle.Repository.Choose = Please Choose Repository ! 8 | org.ukettle.iQuartz.Verify.Kettle.Repository.Parameters.A = Please check the 9 | org.ukettle.iQuartz.Verify.Kettle.Repository.Parameters.B = Parameter value ! 10 | org.ukettle.iQuartz.Verify.Kettle.Monitor.Log = Log Info 11 | org.ukettle.iQuartz.Verify.Kettle.Monitor.Out = Monitor Info 12 | #************Pbulic Properties**************************************** 13 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Executor = Executor 14 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Executor.Choose = Please check the executor ! 15 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Group.Choose = Please Choose Group ! 16 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Title.Exist = Title already exists ! 17 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Title = Please check the title ! 18 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Parameters.A = Please check the 19 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Parameters.B = Parameter value. 20 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Search = Please choose the query conditions ! 21 | #************Pbulic Properties**************************************** 22 | org.ukettle.iQuartz.Verify.Success = Success 23 | org.ukettle.iQuartz.Verify.Error = Error -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/common/exception/KettleMasterException.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.common.exception; 2 | 3 | import java.io.PrintWriter; 4 | import java.io.StringWriter; 5 | 6 | public class KettleMasterException extends RuntimeException { 7 | 8 | static final long serialVersionUID = 1662900257135756746L; 9 | 10 | public KettleMasterException() { 11 | super(); 12 | } 13 | 14 | public KettleMasterException(String message) { 15 | super(message); 16 | } 17 | 18 | public KettleMasterException(String message, Throwable cause) { 19 | super(message, cause); 20 | } 21 | 22 | public KettleMasterException(Throwable cause) { 23 | super(cause); 24 | } 25 | 26 | /** 27 | * 将CheckedException转换为UncheckedException. 28 | */ 29 | public static RuntimeException unchecked(Exception e) { 30 | if (e instanceof RuntimeException) { 31 | return (RuntimeException) e; 32 | } else { 33 | return new RuntimeException(e); 34 | } 35 | } 36 | 37 | /** 38 | * 将ErrorStack转化为String. 39 | */ 40 | public static String getStackTraceAsString(Exception e) { 41 | StringWriter stringWriter = new StringWriter(); 42 | e.printStackTrace(new PrintWriter(stringWriter)); 43 | return stringWriter.toString(); 44 | } 45 | 46 | /** 47 | * 判断异常是否由某些底层的异常引起. 48 | */ 49 | public static boolean isCausedBy(Exception ex, 50 | @SuppressWarnings("unchecked") Class... causeExceptionClasses) { 51 | Throwable cause = ex.getCause(); 52 | while (cause != null) { 53 | for (Class causeClass : causeExceptionClasses) { 54 | if (causeClass.isInstance(cause)) { 55 | return true; 56 | } 57 | } 58 | cause = cause.getCause(); 59 | } 60 | return false; 61 | } 62 | } -------------------------------------------------------------------------------- /src/test/java/com/leadingsoft/test/string/StringTest.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.test.string; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.util.Date; 6 | 7 | import org.apache.commons.io.FileUtils; 8 | import org.apache.commons.lang.StringUtils; 9 | import org.junit.Test; 10 | 11 | import com.leadingsoft.common.toolkit.Constant; 12 | import com.leadingsoft.web.utils.DateTime; 13 | 14 | 15 | public class StringTest { 16 | 17 | @Test 18 | public void test1(){ 19 | String aaa = "/mysql-mysql"; 20 | int lastIndexOf = StringUtils.lastIndexOf(aaa, "/"); 21 | System.out.println(aaa.substring(0, lastIndexOf)); 22 | System.out.println(aaa.substring(lastIndexOf + 1, aaa.length())); 23 | } 24 | 25 | 26 | @Test 27 | public void GenerateString(){ 28 | System.out.println(new Date().getTime()); 29 | StringBuilder stringBuilder = new StringBuilder(); 30 | DateTime dateTime = new DateTime(); 31 | Integer addMinute = dateTime.second() >= 58 ? 2 : 1; 32 | stringBuilder.append("0").append(" ") 33 | .append(dateTime.minute() + addMinute).append(" ") 34 | .append(dateTime.hour(true)).append(" ") 35 | .append(dateTime.dayOfMonth()).append(" ") 36 | .append(dateTime.monthStartFromOne()).append(" ") 37 | .append("?").append(" ") 38 | .append(String.valueOf(dateTime.year())); 39 | System.out.println(stringBuilder.toString()); 40 | System.out.println(new Date().getTime()); 41 | } 42 | 43 | @Test 44 | public void testBR() throws IOException{ 45 | String readFileToString = FileUtils.readFileToString(new File("F:\\tmp\\kettle-master\\1\\trans@kettle-test-6.2-log\\1496459302270.txt"), Constant.DEFAULT_ENCODING); 46 | System.out.println(readFileToString); 47 | 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | master 8 | 9 | index.html 10 | 11 | 12 | 13 | 14 | contextConfigLocation 15 | classpath:spring/applicationContext-*.xml 16 | 17 | 18 | org.springframework.web.context.ContextLoaderListener 19 | 20 | 21 | 22 | 23 | CharacterEncodingFilter 24 | org.springframework.web.filter.CharacterEncodingFilter 25 | 26 | encoding 27 | utf-8 28 | 29 | 30 | 31 | CharacterEncodingFilter 32 | /* 33 | 34 | 35 | 36 | 37 | customer 38 | org.springframework.web.servlet.DispatcherServlet 39 | 40 | contextConfigLocation 41 | classpath:spring/spring-mvc.xml 42 | 43 | 44 | 45 | customer 46 | *.shtml 47 | 48 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/service/QuartzService.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.service; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.pentaho.di.core.exception.KettleException; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import com.leadingsoft.core.dto.BootTablePage; 11 | import com.leadingsoft.core.mapper.KQuartzDao; 12 | import com.leadingsoft.core.model.KQuartz; 13 | 14 | @Service 15 | public class QuartzService { 16 | 17 | 18 | @Autowired 19 | private KQuartzDao kQuartzDao; 20 | 21 | /** 22 | * @Title getList 23 | * @Description 获取定时策略列表 24 | * @return 25 | * @throws KettleException 26 | * @return List 27 | */ 28 | public List getList(Integer uId){ 29 | List resultList = new ArrayList(); 30 | KQuartz kQuartz = new KQuartz(); 31 | kQuartz.setDelFlag(1); 32 | kQuartz.setAddUser(uId); 33 | resultList.addAll(kQuartzDao.template(kQuartz)); 34 | return resultList; 35 | } 36 | 37 | /** 38 | * @Title getList 39 | * @Description 获取分页列表 40 | * @param start 起始行数 41 | * @param size 每页行数 42 | * @param uId 用户ID 43 | * @return 44 | * @throws KettleException 45 | * @return BootTablePage 46 | */ 47 | public BootTablePage getList(Integer start, Integer size, Integer uId){ 48 | KQuartz kQuartz = new KQuartz(); 49 | kQuartz.setDelFlag(1); 50 | kQuartz.setAddUser(uId); 51 | List kQuartzList = kQuartzDao.template(kQuartz, start, size); 52 | long allCount = kQuartzDao.templateCount(kQuartz); 53 | BootTablePage bootTablePage = new BootTablePage(); 54 | bootTablePage.setRows(kQuartzList); 55 | bootTablePage.setTotal(allCount); 56 | return bootTablePage; 57 | } 58 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/css/fileinput-rtl.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Krajee RTL (Right To Left) default styling for bootstrap-fileinput. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */.kv-rtl{direction:rtl}.kv-rtl .close{float:left}.kv-rtl .input-group-btn:last-child>.btn{border-radius:4px 0 0 4px!important}.kv-rtl .input-group .form-control:first-child{border-radius:0 4px 4px 0!important}.kv-rtl .file-loading{right:auto;left:0;text-align:left}.kv-rtl .btn-file input[type=file]{right:auto;left:0;text-align:left;background:100% 0 none}.kv-rtl .file-error-message pre,.kv-rtl .file-error-message ul,.kv-rtl .file-zoom-dialog,.kv-rtl .krajee-default .file-actions,.kv-rtl .krajee-default .file-other-error{text-align:right}.kv-rtl .krajee-default.file-preview-frame{box-shadow:-1px 1px 5px 0 #a2958a;float:right}.kv-rtl .krajee-default.file-preview-frame:not(.file-preview-error):hover{box-shadow:-3px 3px 5px 0 #333}.kv-rtl .krajee-default .file-footer-buttons{float:left}.kv-rtl .krajee-default .file-drag-handle,.kv-rtl .krajee-default .file-upload-indicator{left:auto;right:-6px;padding:8px 3px 1px 8px;border-top-left-radius:24px;border-top-right-radius:0}.kv-rtl .file-drop-zone{margin:12px 12px 12px 15px}.kv-rtl .floating-buttons{left:10px;right:auto}.kv-rtl .floating-buttons .btn,.kv-rtl .kv-zoom-actions .btn{margin-right:3px}.kv-rtl .btn-prev{right:1px;left:auto}.kv-rtl .btn-next{left:1px;right:auto}.kv-rtl .pull-right{float:left!important}.kv-rtl .pull-left{float:right!important}.kv-rtl .modal-title{float:right;direction:ltr} -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/layim/data/group.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": 1, 3 | "msg": "ok", 4 | "data": [ 5 | { 6 | "name": "H+交流群", 7 | "nums": 36, 8 | "id": 1, 9 | "item": [ 10 | { 11 | "id": "101", 12 | "name": "H+ Bug反馈", 13 | "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0" 14 | }, 15 | { 16 | "id": "102", 17 | "name": "H+ 技术交流", 18 | "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1" 19 | } 20 | ] 21 | }, 22 | { 23 | "name": "Bootstrap", 24 | "nums": 16, 25 | "id": 2, 26 | "item": [ 27 | { 28 | "id": "103", 29 | "name": "Bootstrap中文", 30 | "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0" 31 | }, 32 | { 33 | "id": "104", 34 | "name": "Bootstrap资源", 35 | "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1" 36 | } 37 | ] 38 | }, 39 | { 40 | "name": "WebApp", 41 | "nums": 106, 42 | "id": 3, 43 | "item": [ 44 | { 45 | "id": "105", 46 | "name": "移动开发", 47 | "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0" 48 | }, 49 | { 50 | "id": "106", 51 | "name": "H5前言", 52 | "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1" 53 | } 54 | ] 55 | } 56 | ] 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/model/KQuartz.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.model; 2 | 3 | import java.util.Date; 4 | 5 | public class KQuartz { 6 | //任务ID 7 | private Integer quartzId ; 8 | //添加者 9 | private Integer addUser ; 10 | //是否删除(1:存在;0:删除) 11 | private Integer delFlag ; 12 | //编辑者 13 | private Integer editUser ; 14 | //定时策略 15 | private String quartzCron ; 16 | //任务描述 17 | private String quartzDescription ; 18 | //添加时间 19 | private Date addTime ; 20 | //编辑时间 21 | private Date editTime ; 22 | 23 | public KQuartz() { 24 | } 25 | 26 | public Integer getQuartzId(){ 27 | return quartzId; 28 | } 29 | public void setQuartzId(Integer quartzId ){ 30 | this.quartzId = quartzId; 31 | } 32 | 33 | public Integer getAddUser(){ 34 | return addUser; 35 | } 36 | public void setAddUser(Integer addUser ){ 37 | this.addUser = addUser; 38 | } 39 | 40 | public Integer getDelFlag(){ 41 | return delFlag; 42 | } 43 | public void setDelFlag(Integer delFlag ){ 44 | this.delFlag = delFlag; 45 | } 46 | 47 | public Integer getEditUser(){ 48 | return editUser; 49 | } 50 | public void setEditUser(Integer editUser ){ 51 | this.editUser = editUser; 52 | } 53 | 54 | public String getQuartzCron(){ 55 | return quartzCron; 56 | } 57 | public void setQuartzCron(String quartzCron ){ 58 | this.quartzCron = quartzCron; 59 | } 60 | 61 | public String getQuartzDescription(){ 62 | return quartzDescription; 63 | } 64 | public void setQuartzDescription(String quartzDescription ){ 65 | this.quartzDescription = quartzDescription; 66 | } 67 | 68 | public Date getAddTime(){ 69 | return addTime; 70 | } 71 | public void setAddTime(Date addTime ){ 72 | this.addTime = addTime; 73 | } 74 | 75 | public Date getEditTime(){ 76 | return editTime; 77 | } 78 | public void setEditTime(Date editTime ){ 79 | this.editTime = editTime; 80 | } 81 | 82 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/themes/gly/theme.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Glyphicon (default) theme configuration for bootstrap-fileinput. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */!function(i){"use strict";i.fn.fileinputThemes.gly={fileActionSettings:{removeIcon:'',uploadIcon:'',zoomIcon:'',dragIcon:'',indicatorNew:'',indicatorSuccess:'',indicatorError:'',indicatorLoading:''},layoutTemplates:{fileIcon:''},previewZoomButtonIcons:{prev:'',next:'',toggleheader:'',fullscreen:'',borderless:'',close:''},previewFileIcon:'',browseIcon:' ',removeIcon:'',cancelIcon:'',uploadIcon:'',msgValidationErrorIcon:' '}}(window.jQuery); -------------------------------------------------------------------------------- /src/main/webapp/Html/js/messages/message_zh_CN.properties: -------------------------------------------------------------------------------- 1 | #************User Properties****************************************** 2 | org.ukettle.iQuartz.Verify.User.Name = \u8bf7\u68c0\u67e5\u7528\u6237\u540d! 3 | org.ukettle.iQuartz.Verify.User.Email = \u8bf7\u68c0\u67e5\u90ae\u4ef6\u5730\u5740! 4 | org.ukettle.iQuartz.Verify.User.Password = \u8bf7\u68c0\u67e5\u5bc6\u7801! 5 | #************Kettle Properties**************************************** 6 | org.ukettle.iQuartz.Verify.Kettle.Repository = \u8d44 \u6e90 \u5e93 7 | org.ukettle.iQuartz.Verify.Kettle.Repository.Choose = \u8bf7\u9009\u62e9\u8d44\u6e90\u5e93! 8 | org.ukettle.iQuartz.Verify.Kettle.Repository.Parameters.A = \u8bf7\u68c0\u67e5 9 | org.ukettle.iQuartz.Verify.Kettle.Repository.Parameters.B = \u53c2\u6570\u7684\u503c! 10 | org.ukettle.iQuartz.Verify.Kettle.Monitor.Log = \u65e5\u5fd7\u4fe1\u606f 11 | org.ukettle.iQuartz.Verify.Kettle.Monitor.Out = \u76d1\u63a7\u4fe1\u606f 12 | #************Pbulic Properties**************************************** 13 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Executor = \u6267\u884c\u8005 14 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Executor.Choose = \u8bf7\u68c0\u67e5\u6267\u884c\u8005! 15 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Group.Choose = \u8bf7\u9009\u62e9\u7fa4\u7ec4! 16 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Title.Exist = \u6807\u9898\u5df2\u5b58\u5728 17 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Title = \u8bf7\u68c0\u67e5\u6807\u9898! 18 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Parameters.A = \u8bf7\u68c0\u67e5 19 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Parameters.B = \u53c2\u6570\u7684\u503c! 20 | org.ukettle.iQuartz.Verify.Quartz.Schedule.Search = \u8bf7\u9009\u62e9\u67e5\u8be2\u6761\u4ef6! 21 | #************Pbulic Properties**************************************** 22 | org.ukettle.iQuartz.Verify.Success = \u64cd\u4f5c\u6210\u529f 23 | org.ukettle.iQuartz.Verify.Error = \u64cd\u4f5c\u5931\u8d25 -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/service/JobRecordService.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.service; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.util.List; 6 | 7 | import org.apache.commons.io.FileUtils; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import com.leadingsoft.common.toolkit.Constant; 12 | import com.leadingsoft.core.dto.BootTablePage; 13 | import com.leadingsoft.core.mapper.KJobRecordDao; 14 | import com.leadingsoft.core.model.KJobRecord; 15 | 16 | @Service 17 | public class JobRecordService { 18 | 19 | @Autowired 20 | private KJobRecordDao kJobRecordDao; 21 | 22 | /** 23 | * @Title getList 24 | * @Description 获取带分页的列表 25 | * @param start 起始行数 26 | * @param size 每页行数 27 | * @param uId 用户ID 28 | * @param jobId 作业ID 29 | * @return 30 | * @return BootTablePage 31 | */ 32 | public BootTablePage getList(Integer start, Integer size, Integer uId, Integer jobId){ 33 | KJobRecord template = new KJobRecord(); 34 | template.setAddUser(uId); 35 | if (jobId != null){ 36 | template.setRecordJob(jobId); 37 | } 38 | List kJobRecordList = kJobRecordDao.template(template, start, size); 39 | long totalCount = kJobRecordDao.templateCount(template); 40 | BootTablePage bootTablePage = new BootTablePage(); 41 | bootTablePage.setRows(kJobRecordList); 42 | bootTablePage.setTotal(totalCount); 43 | return bootTablePage; 44 | } 45 | 46 | /** 47 | * @Title getLogContent 48 | * @Description 转换日志内容 49 | * @param recordId 转换记录ID 50 | * @return 51 | * @throws IOException 52 | * @return String 53 | */ 54 | public String getLogContent(Integer jobId) throws IOException{ 55 | KJobRecord kJobRecord = kJobRecordDao.unique(jobId); 56 | String logFilePath = kJobRecord.getLogFilePath(); 57 | return FileUtils.readFileToString(new File(logFilePath), Constant.DEFAULT_ENCODING); 58 | } 59 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/service/TransRecordService.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.service; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.util.List; 6 | 7 | import org.apache.commons.io.FileUtils; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import com.leadingsoft.common.toolkit.Constant; 12 | import com.leadingsoft.core.dto.BootTablePage; 13 | import com.leadingsoft.core.mapper.KTransRecordDao; 14 | import com.leadingsoft.core.model.KTransRecord; 15 | 16 | @Service 17 | public class TransRecordService { 18 | 19 | @Autowired 20 | private KTransRecordDao kTransRecordDao; 21 | 22 | /** 23 | * @Title getList 24 | * @Description 获取列表 25 | * @param start 其实行数 26 | * @param size 结束行数 27 | * @param uId 用户ID 28 | * @param transId 转换ID 29 | * @return 30 | * @return BootTablePage 31 | */ 32 | public BootTablePage getList(Integer start, Integer size, Integer uId, Integer transId){ 33 | KTransRecord template = new KTransRecord(); 34 | template.setAddUser(uId); 35 | if (transId != null){ 36 | template.setRecordTrans(transId); 37 | } 38 | List kTransRecordList = kTransRecordDao.template(template, start, size); 39 | long totalCount = kTransRecordDao.templateCount(template); 40 | BootTablePage bootTablePage = new BootTablePage(); 41 | bootTablePage.setRows(kTransRecordList); 42 | bootTablePage.setTotal(totalCount); 43 | return bootTablePage; 44 | } 45 | 46 | /** 47 | * @Title getLogContent 48 | * @Description 转换日志内容 49 | * @param recordId 转换记录ID 50 | * @return 51 | * @throws IOException 52 | * @return String 53 | */ 54 | public String getLogContent(Integer recordId) throws IOException{ 55 | KTransRecord kTransRecord = kTransRecordDao.unique(recordId); 56 | String logFilePath = kTransRecord.getLogFilePath(); 57 | return FileUtils.readFileToString(new File(logFilePath), Constant.DEFAULT_ENCODING); 58 | } 59 | 60 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/themes/explorer/theme.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Krajee Explorer theme configuration for bootstrap-fileinput. Load this theme file after loading `fileinput.js`. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */!function(e){"use strict";var t='\n {close}
\n \n
\n
\n
\n
\n',footer:'
{caption}
{size}{progress}{indicator} {actions}',actions:'{drag}\n
\n \n
',zoomCache:'{zoomContent}
'},previewMarkupTags:{tagBefore1:t+">"+i,tagBefore2:t+' title="{caption}">'+i,tagAfter:"\n{footer}\n"},previewSettings:{image:{height:"60px"},html:{width:"100px",height:"60px"},text:{width:"100px",height:"60px"},video:{width:"auto",height:"60px"},audio:{width:"auto",height:"60px"},flash:{width:"100%",height:"60px"},object:{width:"100%",height:"60px"},pdf:{width:"100px",height:"60px"},other:{width:"100%",height:"60px"}},frameClass:"explorer-frame"}}(window.jQuery); -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/model/KJobRecord.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.model; 2 | 3 | import java.util.Date; 4 | 5 | public class KJobRecord { 6 | //作业记录ID 7 | private Integer recordId ; 8 | //作业ID 9 | private Integer recordJob ; 10 | //任务执行结果(1:成功;2:失败) 11 | private Integer recordStatus ; 12 | //添加人 13 | private Integer addUser; 14 | //作业日志记录文件保存位置 15 | private String logFilePath ; 16 | //启动时间 17 | private Date startTime ; 18 | //停止时间 19 | private Date stopTime ; 20 | 21 | public KJobRecord() { 22 | } 23 | 24 | public Integer getRecordId(){ 25 | return recordId; 26 | } 27 | public void setRecordId(Integer recordId ){ 28 | this.recordId = recordId; 29 | } 30 | 31 | public Integer getRecordJob(){ 32 | return recordJob; 33 | } 34 | public void setRecordJob(Integer recordJob ){ 35 | this.recordJob = recordJob; 36 | } 37 | 38 | public Integer getRecordStatus(){ 39 | return recordStatus; 40 | } 41 | public void setRecordStatus(Integer recordStatus ){ 42 | this.recordStatus = recordStatus; 43 | } 44 | 45 | public String getLogFilePath(){ 46 | return logFilePath; 47 | } 48 | public void setLogFilePath(String logFilePath ){ 49 | this.logFilePath = logFilePath; 50 | } 51 | 52 | public Date getStartTime(){ 53 | return startTime; 54 | } 55 | public void setStartTime(Date startTime ){ 56 | this.startTime = startTime; 57 | } 58 | 59 | public Date getStopTime(){ 60 | return stopTime; 61 | } 62 | public void setStopTime(Date stopTime ){ 63 | this.stopTime = stopTime; 64 | } 65 | 66 | @Override 67 | public String toString() { 68 | return "KJobRecord [recordId=" + recordId + ", recordJob=" + recordJob + ", recordStatus=" + recordStatus 69 | + ", addUser=" + addUser + ", logFilePath=" + logFilePath + ", startTime=" + startTime + ", stopTime=" 70 | + stopTime + "]"; 71 | } 72 | 73 | public Integer getAddUser() { 74 | return addUser; 75 | } 76 | 77 | public void setAddUser(Integer addUser) { 78 | this.addUser = addUser; 79 | } 80 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/JobMonitorController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | import com.leadingsoft.common.toolkit.Constant; 10 | import com.leadingsoft.core.dto.BootTablePage; 11 | import com.leadingsoft.core.model.KUser; 12 | import com.leadingsoft.web.service.JobMonitorService; 13 | import com.leadingsoft.web.utils.JsonUtils; 14 | 15 | @RestController 16 | @RequestMapping("/job/monitor/") 17 | public class JobMonitorController { 18 | 19 | @Autowired 20 | private JobMonitorService jobMonitorService; 21 | 22 | @RequestMapping("getList.shtml") 23 | public String getList(Integer offset, Integer limit, HttpServletRequest request){ 24 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 25 | BootTablePage list = jobMonitorService.getList(offset, limit, kUser.getuId()); 26 | return JsonUtils.objectToJson(list); 27 | } 28 | 29 | @RequestMapping("getAllMonitorJob.shtml") 30 | public String getAllMonitorJob(HttpServletRequest request){ 31 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 32 | return JsonUtils.objectToJson(jobMonitorService.getAllMonitorJob(kUser.getuId())); 33 | } 34 | 35 | @RequestMapping("getAllSuccess.shtml") 36 | public String getAllSuccess(HttpServletRequest request){ 37 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 38 | return JsonUtils.objectToJson(jobMonitorService.getAllSuccess(kUser.getuId())); 39 | } 40 | 41 | @RequestMapping("getAllFail.shtml") 42 | public String getAllFail(HttpServletRequest request){ 43 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 44 | return JsonUtils.objectToJson(jobMonitorService.getAllFail(kUser.getuId())); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/model/KTransRecord.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.model; 2 | 3 | import java.util.Date; 4 | 5 | public class KTransRecord { 6 | //转换记录ID 7 | private Integer recordId ; 8 | //任务执行结果(1:成功;2:失败) 9 | private Integer recordStatus ; 10 | //转换ID 11 | private Integer recordTrans ; 12 | //添加人 13 | private Integer addUser; 14 | //转换日志记录文件保存位置 15 | private String logFilePath ; 16 | //启动时间 17 | private Date startTime ; 18 | //停止时间 19 | private Date stopTime ; 20 | 21 | public KTransRecord() { 22 | } 23 | 24 | public Integer getRecordId(){ 25 | return recordId; 26 | } 27 | public void setRecordId(Integer recordId ){ 28 | this.recordId = recordId; 29 | } 30 | 31 | public Integer getRecordStatus(){ 32 | return recordStatus; 33 | } 34 | public void setRecordStatus(Integer recordStatus ){ 35 | this.recordStatus = recordStatus; 36 | } 37 | 38 | public Integer getRecordTrans(){ 39 | return recordTrans; 40 | } 41 | public void setRecordTrans(Integer recordTrans ){ 42 | this.recordTrans = recordTrans; 43 | } 44 | 45 | public String getLogFilePath(){ 46 | return logFilePath; 47 | } 48 | public void setLogFilePath(String logFilePath ){ 49 | this.logFilePath = logFilePath; 50 | } 51 | 52 | public Date getStartTime(){ 53 | return startTime; 54 | } 55 | public void setStartTime(Date startTime ){ 56 | this.startTime = startTime; 57 | } 58 | 59 | public Date getStopTime(){ 60 | return stopTime; 61 | } 62 | public void setStopTime(Date stopTime ){ 63 | this.stopTime = stopTime; 64 | } 65 | 66 | @Override 67 | public String toString() { 68 | return "KTransRecord [recordId=" + recordId + ", recordStatus=" + recordStatus + ", recordTrans=" + recordTrans 69 | + ", addUser=" + addUser + ", logFilePath=" + logFilePath + ", startTime=" + startTime + ", stopTime=" 70 | + stopTime + "]"; 71 | } 72 | 73 | public Integer getAddUser() { 74 | return addUser; 75 | } 76 | 77 | public void setAddUser(Integer addUser) { 78 | this.addUser = addUser; 79 | } 80 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/TransMonitorController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | import com.leadingsoft.common.toolkit.Constant; 10 | import com.leadingsoft.core.dto.BootTablePage; 11 | import com.leadingsoft.core.model.KUser; 12 | import com.leadingsoft.web.service.TransMonitorService; 13 | import com.leadingsoft.web.utils.JsonUtils; 14 | 15 | @RestController 16 | @RequestMapping("/trans/monitor/") 17 | public class TransMonitorController { 18 | 19 | @Autowired 20 | private TransMonitorService transMonitorService; 21 | 22 | @RequestMapping("getList.shtml") 23 | public String getList(Integer offset, Integer limit, HttpServletRequest request){ 24 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 25 | BootTablePage list = transMonitorService.getList(offset, limit, kUser.getuId()); 26 | return JsonUtils.objectToJson(list); 27 | } 28 | 29 | @RequestMapping("getAllMonitorTrans.shtml") 30 | public String getAllMonitorJob(HttpServletRequest request){ 31 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 32 | return JsonUtils.objectToJson(transMonitorService.getAllMonitorTrans(kUser.getuId())); 33 | } 34 | 35 | @RequestMapping("getAllSuccess.shtml") 36 | public String getAllSuccess(HttpServletRequest request){ 37 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 38 | return JsonUtils.objectToJson(transMonitorService.getAllSuccess(kUser.getuId())); 39 | } 40 | 41 | @RequestMapping("getAllFail.shtml") 42 | public String getAllFail(HttpServletRequest request){ 43 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 44 | return JsonUtils.objectToJson(transMonitorService.getAllFail(kUser.getuId())); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/dto/kettle/RepositoryTree.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.dto.kettle; 2 | 3 | public class RepositoryTree { 4 | 5 | private String id; 6 | private String parent; 7 | private String text; 8 | private String icon; 9 | private Object state; 10 | private String type; 11 | private boolean isLasted; 12 | private String path; 13 | 14 | public String getType() { 15 | return type; 16 | } 17 | public void setType(String type) { 18 | this.type = type; 19 | } 20 | public String getPath() { 21 | return path; 22 | } 23 | public void setPath(String path) { 24 | this.path = path; 25 | } 26 | public boolean isLasted() { 27 | return isLasted; 28 | } 29 | public void setLasted(boolean isLasted) { 30 | this.isLasted = isLasted; 31 | } 32 | public String getId() { 33 | return id; 34 | } 35 | public void setId(String id) { 36 | this.id = id; 37 | } 38 | public String getParent() { 39 | return parent; 40 | } 41 | public void setParent(String parent) { 42 | this.parent = parent; 43 | } 44 | public String getText() { 45 | return text; 46 | } 47 | public void setText(String text) { 48 | this.text = text; 49 | } 50 | public String getIcon() { 51 | return icon; 52 | } 53 | public void setIcon(String icon) { 54 | this.icon = icon; 55 | } 56 | public Object getState() { 57 | return state; 58 | } 59 | public void setState(Object state) { 60 | this.state = state; 61 | } 62 | public RepositoryTree(String id, String parent, String text, String icon, Object state, String type, 63 | boolean isLasted, String path) { 64 | super(); 65 | this.id = id; 66 | this.parent = parent; 67 | this.text = text; 68 | this.icon = icon; 69 | this.state = state; 70 | this.type = type; 71 | this.isLasted = isLasted; 72 | this.path = path; 73 | } 74 | public RepositoryTree() { 75 | } 76 | 77 | @Override 78 | public String toString() { 79 | return "RepositoryTree [id=" + id + ", parent=" + parent + ", text=" + text + ", icon=" + icon + ", state=" 80 | + state + ", type=" + type + ", isLasted=" + isLasted + ", path=" + path + "]"; 81 | } 82 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/themes/fa/theme.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Font Awesome icon theme configuration for bootstrap-fileinput. Requires font awesome assets to be loaded. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */ 13 | (function ($) { 14 | "use strict"; 15 | 16 | $.fn.fileinputThemes.fa = { 17 | fileActionSettings: { 18 | removeIcon: '', 19 | uploadIcon: '', 20 | zoomIcon: '', 21 | dragIcon: '', 22 | indicatorNew: '', 23 | indicatorSuccess: '', 24 | indicatorError: '', 25 | indicatorLoading: '' 26 | }, 27 | layoutTemplates: { 28 | fileIcon: ' ' 29 | }, 30 | previewZoomButtonIcons: { 31 | prev: '', 32 | next: '', 33 | toggleheader: '', 34 | fullscreen: '', 35 | borderless: '', 36 | close: '' 37 | }, 38 | previewFileIcon: '', 39 | browseIcon: '', 40 | removeIcon: '', 41 | cancelIcon: '', 42 | uploadIcon: '', 43 | msgValidationErrorIcon: ' ' 44 | }; 45 | })(window.jQuery); 46 | -------------------------------------------------------------------------------- /src/main/webapp/static/js/content.js: -------------------------------------------------------------------------------- 1 | var $parentNode = window.parent.document; 2 | 3 | function $childNode(name) { 4 | return window.frames[name] 5 | } 6 | 7 | // tooltips 8 | $('.tooltip-demo').tooltip({ 9 | selector: "[data-toggle=tooltip]", 10 | container: "body" 11 | }); 12 | 13 | // 使用animation.css修改Bootstrap Modal 14 | $('.modal').appendTo("body"); 15 | 16 | $("[data-toggle=popover]").popover(); 17 | 18 | //折叠ibox 19 | $('.collapse-link').click(function () { 20 | var ibox = $(this).closest('div.ibox'); 21 | var button = $(this).find('i'); 22 | var content = ibox.find('div.ibox-content'); 23 | content.slideToggle(200); 24 | button.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down'); 25 | ibox.toggleClass('').toggleClass('border-bottom'); 26 | setTimeout(function () { 27 | ibox.resize(); 28 | ibox.find('[id^=map-]').resize(); 29 | }, 50); 30 | }); 31 | 32 | //关闭ibox 33 | $('.close-link').click(function () { 34 | var content = $(this).closest('div.ibox'); 35 | content.remove(); 36 | }); 37 | 38 | //判断当前页面是否在iframe中 39 | if (top == this) { 40 | var gohome = '
'; 41 | $('body').append(gohome); 42 | } 43 | 44 | //animation.css 45 | function animationHover(element, animation) { 46 | element = $(element); 47 | element.hover( 48 | function () { 49 | element.addClass('animated ' + animation); 50 | }, 51 | function () { 52 | //动画完成之前移除class 53 | window.setTimeout(function () { 54 | element.removeClass('animated ' + animation); 55 | }, 2000); 56 | }); 57 | } 58 | 59 | //拖动面板 60 | function WinMove() { 61 | var element = "[class*=col]"; 62 | var handle = ".ibox-title"; 63 | var connect = "[class*=col]"; 64 | $(element).sortable({ 65 | handle: handle, 66 | connectWith: connect, 67 | tolerance: 'pointer', 68 | forcePlaceholderSize: true, 69 | opacity: 0.8, 70 | }) 71 | .disableSelection(); 72 | }; 73 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/IndexController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpSession; 5 | 6 | import org.apache.commons.lang.StringUtils; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.ResponseBody; 11 | import org.springframework.web.servlet.mvc.support.RedirectAttributes; 12 | 13 | import com.leadingsoft.common.toolkit.Constant; 14 | import com.leadingsoft.core.model.KUser; 15 | import com.leadingsoft.web.service.UserService; 16 | import com.leadingsoft.web.utils.JsonUtils; 17 | 18 | @Controller 19 | @RequestMapping("/index/") 20 | public class IndexController { 21 | 22 | @Autowired 23 | private UserService userService; 24 | 25 | @RequestMapping("isAdmin.shtml") 26 | @ResponseBody 27 | public String isAdmin(HttpServletRequest request){ 28 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 29 | if (null != kUser && userService.isAdmin(kUser.getuId())){ 30 | return JsonUtils.objectToJson(true); 31 | } 32 | return JsonUtils.objectToJson(false); 33 | } 34 | 35 | @RequestMapping("login.shtml") 36 | public String login(KUser kUser, RedirectAttributes attr, HttpServletRequest request){ 37 | if (null != kUser && StringUtils.isNotBlank(kUser.getuAccount()) && 38 | StringUtils.isNotBlank(kUser.getuPassword())){ 39 | KUser u = userService.login(kUser); 40 | if (null != u){ 41 | request.getSession().setAttribute(Constant.SESSION_ID, u); 42 | return "redirect:/view/indexUI.shtml"; 43 | } 44 | attr.addFlashAttribute("errorMsg", "账号或密码错误"); 45 | return "redirect:/view/loginUI.shtml"; 46 | } 47 | attr.addFlashAttribute("errorMsg", "账号或密码不能为空"); 48 | return "redirect:/view/loginUI.shtml"; 49 | } 50 | 51 | @RequestMapping("logout.shtml") 52 | public String logout(HttpServletRequest request){ 53 | HttpSession session = request.getSession(); 54 | session.removeAttribute(Constant.SESSION_ID); 55 | return "redirect:/view/loginUI.shtml"; 56 | } 57 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/model/KTransMonitor.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.model; 2 | 3 | public class KTransMonitor implements Comparable{ 4 | //监控转换ID 5 | private Integer monitorId ; 6 | //添加人 7 | private Integer addUser ; 8 | //失败次数 9 | private Integer monitorFail ; 10 | //监控状态(是否启动,1:启动;2:停止) 11 | private Integer monitorStatus ; 12 | //成功次数 13 | private Integer monitorSuccess ; 14 | //监控的转换的ID 15 | private Integer monitorTrans ; 16 | //运行状态(起始时间-结束时间,起始时间-结束时间……) 17 | private String runStatus ; 18 | 19 | public KTransMonitor() { 20 | } 21 | 22 | public Integer getMonitorId(){ 23 | return monitorId; 24 | } 25 | public void setMonitorId(Integer monitorId){ 26 | this.monitorId = monitorId; 27 | } 28 | public Integer getAddUser(){ 29 | return addUser; 30 | } 31 | public void setAddUser(Integer addUser){ 32 | this.addUser = addUser; 33 | } 34 | public Integer getMonitorFail(){ 35 | return monitorFail; 36 | } 37 | public void setMonitorFail(Integer monitorFail){ 38 | this.monitorFail = monitorFail; 39 | } 40 | public Integer getMonitorStatus(){ 41 | return monitorStatus; 42 | } 43 | public void setMonitorStatus(Integer monitorStatus){ 44 | this.monitorStatus = monitorStatus; 45 | } 46 | public Integer getMonitorSuccess(){ 47 | return monitorSuccess; 48 | } 49 | public void setMonitorSuccess(Integer monitorSuccess){ 50 | this.monitorSuccess = monitorSuccess; 51 | } 52 | public Integer getMonitorTrans(){ 53 | return monitorTrans; 54 | } 55 | public void setMonitorTrans(Integer monitorTrans){ 56 | this.monitorTrans = monitorTrans; 57 | } 58 | public String getRunStatus(){ 59 | return runStatus; 60 | } 61 | public void setRunStatus(String runStatus){ 62 | this.runStatus = runStatus; 63 | } 64 | 65 | @Override 66 | public int compareTo(KTransMonitor o) { 67 | return this.getMonitorSuccess() - o.getMonitorSuccess(); 68 | } 69 | 70 | @Override 71 | public String toString() { 72 | return "KTransMonitor [monitorId=" + monitorId + ", addUser=" + addUser + ", monitorFail=" + monitorFail 73 | + ", monitorStatus=" + monitorStatus + ", monitorSuccess=" + monitorSuccess + ", monitorTrans=" 74 | + monitorTrans + ", runStatus=" + runStatus + "]"; 75 | } 76 | } -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.paipai.js: -------------------------------------------------------------------------------- 1 | var String = java.lang.String; 2 | var StringBuffer = java.lang.StringBuffer; 3 | var Integer = java.lang.Integer; 4 | var Hashtable = java.util.Hashtable; 5 | var Iteractor = java.util.Iteractor; 6 | var TreeMap = java.util.TreeMap; 7 | var Date = java.util.Date; 8 | var Mac = javax.crypto.Mac; 9 | var SecretKeySpec = javax.crypto.spec.SecretKeySpec; 10 | var Base64 = org.apache.commons.codec.binary.Base64; 11 | var URLEncoder = java.net.URLEncoder; 12 | 13 | 14 | function WangGouRESTAPI(treeMap){ 15 | this.ht = treeMap; 16 | } 17 | 18 | WangGouRESTAPI.prototype.put = function (key, value) { 19 | this.ht.put(key, value); 20 | } 21 | 22 | WangGouRESTAPI.prototype.encrypt = function (key, method,queryMethod) { 23 | var orgin = new StringBuffer(); 24 | var map = new TreeMap(); 25 | map.putAll(this.ht); 26 | 27 | var iter = map.keySet().iterator(); 28 | var i = 0; 29 | while (iter.hasNext()) { 30 | var name = String.valueOf(iter.next()); 31 | if (new String(map.get(name)).length() > 0) { 32 | if (i > 0){ 33 | orgin.append("&").append(name).append("=" + map.get(name)); 34 | } else { 35 | orgin.append(name).append("=" + map.get(name)); 36 | i = i + 1; 37 | } 38 | } 39 | } 40 | var param = queryMethod + "&" + encodeURIComponent(method, "UTF-8") + "&" + encodeURIComponent(new String(orgin)); 41 | var signingKey = new SecretKeySpec(new String(key).getBytes("UTF-8"), "HmacSHA1"); 42 | var sha256_HMAC = Mac.getInstance("HmacSHA1"); 43 | sha256_HMAC.init(signingKey); 44 | var sign = sha256_HMAC.doFinal(new String(param).getBytes("UTF-8")); 45 | var signBase64 = new Base64().encodeBase64(sign); 46 | return new String(signBase64, "UTF-8"); 47 | } 48 | 49 | WangGouRESTAPI.prototype.URLEncode = function (ru, rp) { 50 | var request_url = ru; 51 | var request_params = rp; 52 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 53 | var e = it.next(); 54 | if (new String(e.getValue()).length() > 0) { 55 | request_params.append("&").append(e.getKey()).append("=").append(encodeURIComponent(e.getValue())); 56 | } 57 | } 58 | 59 | var url = request_url + "?" + new String(request_params.toString().substring(1)); 60 | return url; 61 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/model/KJobMonitor.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.model; 2 | 3 | public class KJobMonitor implements Comparable{ 4 | //监控作业ID 5 | private Integer monitorId ; 6 | //添加人 7 | private Integer addUser ; 8 | //失败次数 9 | private Integer monitorFail ; 10 | //监控的作业ID 11 | private Integer monitorJob ; 12 | //监控状态(是否启动,1:启动;2:停止) 13 | private Integer monitorStatus ; 14 | //成功次数 15 | private Integer monitorSuccess ; 16 | //运行状态(起始时间-结束时间,起始时间-结束时间……) 17 | private String runStatus ; 18 | 19 | public KJobMonitor() { 20 | } 21 | 22 | public Integer getMonitorId(){ 23 | return monitorId; 24 | } 25 | public void setMonitorId(Integer monitorId){ 26 | this.monitorId = monitorId; 27 | } 28 | public Integer getAddUser(){ 29 | return addUser; 30 | } 31 | public void setAddUser(Integer addUser){ 32 | this.addUser = addUser; 33 | } 34 | public Integer getMonitorFail(){ 35 | return monitorFail; 36 | } 37 | public void setMonitorFail(Integer monitorFail){ 38 | this.monitorFail = monitorFail; 39 | } 40 | public Integer getMonitorJob(){ 41 | return monitorJob; 42 | } 43 | public void setMonitorJob(Integer monitorJob){ 44 | this.monitorJob = monitorJob; 45 | } 46 | public Integer getMonitorStatus(){ 47 | return monitorStatus; 48 | } 49 | public void setMonitorStatus(Integer monitorStatus){ 50 | this.monitorStatus = monitorStatus; 51 | } 52 | public Integer getMonitorSuccess(){ 53 | return monitorSuccess; 54 | } 55 | public void setMonitorSuccess(Integer monitorSuccess){ 56 | this.monitorSuccess = monitorSuccess; 57 | } 58 | public String getRunStatus(){ 59 | return runStatus; 60 | } 61 | public void setRunStatus(String runStatus){ 62 | this.runStatus = runStatus; 63 | } 64 | @Override 65 | public int compareTo(KJobMonitor kJobMonitor) { 66 | return this.getMonitorSuccess() - kJobMonitor.getMonitorSuccess();//按照成功次数排序; 67 | } 68 | 69 | @Override 70 | public String toString() { 71 | return "KJobMonitor [monitorId=" + monitorId + ", addUser=" + addUser + ", monitorFail=" + monitorFail 72 | + ", monitorJob=" + monitorJob + ", monitorStatus=" + monitorStatus + ", monitorSuccess=" 73 | + monitorSuccess + ", runStatus=" + runStatus + "]"; 74 | } 75 | } -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.tianpin.js: -------------------------------------------------------------------------------- 1 | var MessageDigest = java.security.MessageDigest; 2 | var String = java.lang.String; 3 | var StringBuffer = java.lang.StringBuffer; 4 | var Integer = java.lang.Integer; 5 | var Hashtable = java.util.Hashtable; 6 | var Iteractor = java.util.Iteractor; 7 | var DecimalFormat = java.text.DecimalFormat; 8 | var URI = org.apache.commons.httpclient.URI; 9 | var TreeMap = java.util.TreeMap; 10 | var Date = java.util.Date; 11 | 12 | function TianpinRESTAPI(treeMap){ 13 | this.ht = treeMap; 14 | } 15 | 16 | TianpinRESTAPI.prototype.put = function (key, value) { 17 | this.ht.put(key, value); 18 | } 19 | 20 | TianpinRESTAPI.prototype.encrypt = function (app_secret) { 21 | var orgin = new StringBuffer(); 22 | //orgin.append(app_secret); 23 | 24 | var map = new TreeMap(); 25 | map.putAll(this.ht); 26 | 27 | var iter = map.keySet().iterator(); 28 | while (iter.hasNext()) { 29 | var name = String.valueOf(iter.next()); 30 | if (new String(map.get(name)).length() > 0) { 31 | orgin.append(name).append(map.get(name)); 32 | } 33 | } 34 | 35 | orgin.append(app_secret); 36 | 37 | // get the md5 digest algorithm 38 | var algorithm = MessageDigest.getInstance("MD5"); 39 | 40 | // get the input as bytes 41 | var bytes = new String(orgin).getBytes("UTF-8"); 42 | 43 | // calculate the digest 44 | algorithm.reset(); 45 | algorithm.update(bytes); 46 | var md5Digest = algorithm.digest(); 47 | 48 | // turn the digest into a hex-string representation 49 | var hexString = new StringBuffer(); 50 | 51 | for (var i = 0; i < md5Digest.length; i++){ 52 | var hex = Integer.toHexString(md5Digest[i] & 0xFF); 53 | if (hex.length() == 1){ 54 | hexString.append('0').append(""); 55 | } 56 | hexString.append(hex); 57 | } 58 | 59 | // write output value 60 | var sign = hexString.toString(); 61 | return sign; 62 | } 63 | 64 | TianpinRESTAPI.prototype.URLEncode = function (ru, rp) { 65 | var request_url = ru; 66 | var request_params = rp; 67 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 68 | var e = it.next(); 69 | if (new String(e.getValue()).length() > 0) { 70 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue()); 71 | } 72 | } 73 | var url = request_url + "?" + request_params.toString().substring(1); 74 | 75 | return encodeURI(url); 76 | } -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.yihaodian.js: -------------------------------------------------------------------------------- 1 | var MessageDigest = java.security.MessageDigest; 2 | var String = java.lang.String; 3 | var StringBuffer = java.lang.StringBuffer; 4 | var Integer = java.lang.Integer; 5 | var Hashtable = java.util.Hashtable; 6 | var Iteractor = java.util.Iteractor; 7 | var DecimalFormat = java.text.DecimalFormat; 8 | var URI = org.apache.commons.httpclient.URI; 9 | var TreeMap = java.util.TreeMap; 10 | var Date = java.util.Date; 11 | 12 | function YihaodianRESTAPI(baseURL, treeMap){ 13 | this.baseURL = baseURL; 14 | this.ht = treeMap; 15 | } 16 | 17 | YihaodianRESTAPI.prototype.put = function (key, value) { 18 | this.ht.put(key, value); 19 | } 20 | 21 | YihaodianRESTAPI.prototype.encrypt = function (app_secret) { 22 | var orgin = new StringBuffer(); 23 | orgin.append(app_secret); 24 | 25 | var map = new TreeMap(); 26 | map.putAll(this.ht); 27 | 28 | var iter = map.keySet().iterator(); 29 | while (iter.hasNext()) { 30 | var name = String.valueOf(iter.next()); 31 | if (new String(map.get(name)).length() > 0) { 32 | orgin.append(name).append(map.get(name)); 33 | } 34 | } 35 | 36 | orgin.append(app_secret); 37 | 38 | // get the md5 digest algorithm 39 | var algorithm = MessageDigest.getInstance("MD5"); 40 | 41 | // get the input as bytes 42 | var bytes = new String(orgin).getBytes("UTF-8"); 43 | 44 | // calculate the digest 45 | algorithm.reset(); 46 | algorithm.update(bytes); 47 | var md5Digest = algorithm.digest(); 48 | 49 | // turn the digest into a hex-string representation 50 | var hexString = new StringBuffer(); 51 | 52 | for (var i = 0; i < md5Digest.length; i++){ 53 | if (md5Digest[i] >= 0 && md5Digest[i] < 16) { 54 | hexString.append('0'); 55 | } 56 | hexString.append(Integer.toHexString(md5Digest[i] & 0XFF)); 57 | } 58 | 59 | // write output value 60 | var sign = hexString.toString(); 61 | return sign 62 | } 63 | 64 | YihaodianRESTAPI.prototype.URLEncode = function (rp) { 65 | var request_params = rp; 66 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 67 | var e = it.next(); 68 | if (new String(e.getValue()).length() > 0) { 69 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue()); 70 | } 71 | } 72 | var url = this.baseURL + "?" + request_params.toString().substring(1); 73 | 74 | return new URI(url).toString(); 75 | } -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.jd.js: -------------------------------------------------------------------------------- 1 | var MessageDigest = java.security.MessageDigest; 2 | var String = java.lang.String; 3 | var StringBuffer = java.lang.StringBuffer; 4 | var Integer = java.lang.Integer; 5 | var Hashtable = java.util.Hashtable; 6 | var Iteractor = java.util.Iteractor; 7 | var DecimalFormat = java.text.DecimalFormat; 8 | var URI = org.apache.commons.httpclient.URI; 9 | var TreeMap = java.util.TreeMap; 10 | var Date = java.util.Date; 11 | 12 | function JDRESTAPI(treeMap){ 13 | this.ht = treeMap; 14 | } 15 | 16 | JDRESTAPI.prototype.put = function (key, value) { 17 | this.ht.put(key, value); 18 | } 19 | 20 | JDRESTAPI.prototype.encrypt = function (app_secret) { 21 | var orgin = new StringBuffer(); 22 | orgin.append(app_secret); 23 | 24 | var map = new TreeMap(); 25 | map.putAll(this.ht); 26 | 27 | var iter = map.keySet().iterator(); 28 | while (iter.hasNext()) { 29 | var name = String.valueOf(iter.next()); 30 | if (new String(map.get(name)).length() > 0) { 31 | orgin.append(name).append(map.get(name)); 32 | } 33 | } 34 | 35 | orgin.append(app_secret); 36 | 37 | // get the md5 digest algorithm 38 | var algorithm = MessageDigest.getInstance("MD5"); 39 | 40 | // get the input as bytes 41 | var bytes = new String(orgin).getBytes("UTF-8"); 42 | 43 | // calculate the digest 44 | algorithm.reset(); 45 | algorithm.update(bytes); 46 | var md5Digest = algorithm.digest(); 47 | 48 | // turn the digest into a hex-string representation 49 | var hexString = new StringBuffer(); 50 | 51 | for (var i = 0; i < md5Digest.length; i++){ 52 | var hex = Integer.toHexString(md5Digest[i] & 0XFF); 53 | if (hex.length() == 1){ 54 | hexString.append('0').append(""); 55 | } 56 | hexString.append(hex); 57 | } 58 | 59 | // write output value 60 | var sign = hexString.toString().toUpperCase(); 61 | return sign 62 | } 63 | 64 | JDRESTAPI.prototype.URLEncode = function (ru, rp) { 65 | var request_url = ru; 66 | var request_params = rp; 67 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 68 | var e = it.next(); 69 | if (new String(e.getValue()).length() > 0) { 70 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue()); 71 | } 72 | } 73 | var url = request_url + "?" + request_params.toString().substring(1); 74 | 75 | return new URI(url).toString(); 76 | } -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.coo8.js: -------------------------------------------------------------------------------- 1 | var MessageDigest = java.security.MessageDigest; 2 | var String = java.lang.String; 3 | var StringBuffer = java.lang.StringBuffer; 4 | var Integer = java.lang.Integer; 5 | var Hashtable = java.util.Hashtable; 6 | var Iteractor = java.util.Iteractor; 7 | var DecimalFormat = java.text.DecimalFormat; 8 | var URI = org.apache.commons.httpclient.URI; 9 | var TreeMap = java.util.TreeMap; 10 | var Date = java.util.Date; 11 | 12 | function Coo8RESTAPI(treeMap){ 13 | this.ht = treeMap; 14 | } 15 | 16 | Coo8RESTAPI.prototype.put = function (key, value) { 17 | this.ht.put(key, value); 18 | } 19 | 20 | Coo8RESTAPI.prototype.encrypt = function (app_secret) { 21 | var orgin = new StringBuffer(); 22 | orgin.append(app_secret); 23 | 24 | var map = new TreeMap(); 25 | map.putAll(this.ht); 26 | 27 | var iter = map.keySet().iterator(); 28 | while (iter.hasNext()) { 29 | var name = String.valueOf(iter.next()); 30 | if (new String(map.get(name)).length() > 0) { 31 | orgin.append(name).append(map.get(name)); 32 | } 33 | } 34 | 35 | orgin.append(app_secret); 36 | 37 | // get the md5 digest algorithm 38 | var algorithm = MessageDigest.getInstance("MD5"); 39 | 40 | // get the input as bytes 41 | var bytes = new String(orgin).getBytes("UTF-8"); 42 | 43 | // calculate the digest 44 | algorithm.reset(); 45 | algorithm.update(bytes); 46 | var md5Digest = algorithm.digest(); 47 | 48 | // turn the digest into a hex-string representation 49 | var hexString = new StringBuffer(); 50 | 51 | for (var i = 0; i < md5Digest.length; i++){ 52 | var hex = Integer.toHexString(md5Digest[i] & 0XFF); 53 | if (hex.length() == 1){ 54 | hexString.append('0').append(""); 55 | } 56 | hexString.append(hex); 57 | } 58 | 59 | // write output value 60 | var sign = hexString.toString().toUpperCase(); 61 | return sign 62 | } 63 | 64 | Coo8RESTAPI.prototype.URLEncode = function (ru, rp) { 65 | var request_url = ru; 66 | var request_params = rp; 67 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 68 | var e = it.next(); 69 | if (new String(e.getValue()).length() > 0) { 70 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue()); 71 | } 72 | } 73 | var url = request_url + "?" + request_params.toString().substring(1); 74 | 75 | return new URI(url).toString(); 76 | } -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.ehub.js: -------------------------------------------------------------------------------- 1 | var MessageDigest = java.security.MessageDigest; 2 | var String = java.lang.String; 3 | var StringBuffer = java.lang.StringBuffer; 4 | var Integer = java.lang.Integer; 5 | var Hashtable = java.util.Hashtable; 6 | var Iteractor = java.util.Iteractor; 7 | var DecimalFormat = java.text.DecimalFormat; 8 | var URI = org.apache.commons.httpclient.URI; 9 | var TreeMap = java.util.TreeMap; 10 | var Date = java.util.Date; 11 | 12 | function EHubRESTAPI(treeMap){ 13 | this.ht = treeMap; 14 | } 15 | 16 | EHubRESTAPI.prototype.put = function (key, value) { 17 | this.ht.put(key, value); 18 | } 19 | 20 | EHubRESTAPI.prototype.encrypt = function (app_secret) { 21 | var orgin = new StringBuffer(); 22 | orgin.append(app_secret); 23 | 24 | var map = new TreeMap(); 25 | map.putAll(this.ht); 26 | 27 | var iter = map.keySet().iterator(); 28 | while (iter.hasNext()) { 29 | var name = String.valueOf(iter.next()); 30 | if (new String(map.get(name)).length() > 0) { 31 | orgin.append(name).append(map.get(name)); 32 | } 33 | } 34 | 35 | orgin.append(app_secret); 36 | 37 | // get the md5 digest algorithm 38 | var algorithm = MessageDigest.getInstance("MD5"); 39 | 40 | // get the input as bytes 41 | var bytes = new String(orgin).getBytes("UTF-8"); 42 | 43 | // calculate the digest 44 | algorithm.reset(); 45 | algorithm.update(bytes); 46 | var md5Digest = algorithm.digest(); 47 | 48 | // turn the digest into a hex-string representation 49 | var hexString = new StringBuffer(); 50 | 51 | for (var i = 0; i < md5Digest.length; i++){ 52 | var hex = Integer.toHexString(md5Digest[i] & 0XFF); 53 | if (hex.length() == 1){ 54 | hexString.append('0').append(""); 55 | } 56 | hexString.append(hex); 57 | } 58 | 59 | // write output value 60 | var sign = hexString.toString().toUpperCase(); 61 | return sign 62 | } 63 | 64 | EHubRESTAPI.prototype.URLEncode = function (ru, rp) { 65 | var request_url = ru; 66 | var request_params = rp; 67 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 68 | var e = it.next(); 69 | if (new String(e.getValue()).length() > 0) { 70 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue()); 71 | } 72 | } 73 | var url = request_url + "?" + request_params.toString().substring(1); 74 | 75 | return new URI(url).toString(); 76 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/themes/gly/theme.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Glyphicon (default) theme configuration for bootstrap-fileinput. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */ 13 | (function ($) { 14 | "use strict"; 15 | 16 | $.fn.fileinputThemes.gly = { 17 | fileActionSettings: { 18 | removeIcon: '', 19 | uploadIcon: '', 20 | zoomIcon: '', 21 | dragIcon: '', 22 | indicatorNew: '', 23 | indicatorSuccess: '', 24 | indicatorError: '', 25 | indicatorLoading: '' 26 | }, 27 | layoutTemplates: { 28 | fileIcon: '' 29 | }, 30 | previewZoomButtonIcons: { 31 | prev: '', 32 | next: '', 33 | toggleheader: '', 34 | fullscreen: '', 35 | borderless: '', 36 | close: '' 37 | }, 38 | previewFileIcon: '', 39 | browseIcon: ' ', 40 | removeIcon: '', 41 | cancelIcon: '', 42 | uploadIcon: '', 43 | msgValidationErrorIcon: ' ' 44 | }; 45 | })(window.jQuery); 46 | -------------------------------------------------------------------------------- /src/main/webapp/static/css/login.css: -------------------------------------------------------------------------------- 1 | html{height: 100%;} 2 | body.signin { 3 | background: #18c8f6; 4 | height: auto; 5 | background:url("../img/login-background.jpg") no-repeat center fixed; 6 | -webkit-background-size: cover; 7 | -moz-background-size: cover; 8 | -o-background-size: cover; 9 | background-size: cover; 10 | color: rgba(255,255,255,.95); 11 | } 12 | 13 | .signinpanel { 14 | width: 750px; 15 | margin: 10% auto 0 auto; 16 | } 17 | 18 | .signinpanel .logopanel { 19 | float: none; 20 | width: auto; 21 | padding: 0; 22 | background: none; 23 | } 24 | 25 | .signinpanel .signin-info ul { 26 | list-style: none; 27 | padding: 0; 28 | margin: 20px 0; 29 | } 30 | 31 | .signinpanel .form-control { 32 | display: block; 33 | margin-top: 15px; 34 | } 35 | 36 | .signinpanel .uname { 37 | background: #fff url(../img/user.png) no-repeat 95% center;color:#333; 38 | } 39 | 40 | .signinpanel .pword { 41 | background: #fff url(../img/locked.png) no-repeat 95% center;color:#333; 42 | } 43 | 44 | .signinpanel .btn { 45 | margin-top: 15px; 46 | } 47 | 48 | .signinpanel form { 49 | background: rgba(255, 255, 255, 0.2); 50 | border: 1px solid rgba(255,255,255,.3); 51 | -moz-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); 52 | -webkit-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); 53 | box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); 54 | -moz-border-radius: 3px; 55 | -webkit-border-radius: 3px; 56 | border-radius: 3px; 57 | padding: 30px; 58 | } 59 | 60 | .signup-footer{border-top: solid 1px rgba(255,255,255,.3);margin:20px 0;padding-top: 15px;} 61 | 62 | @media screen and (max-width: 768px) { 63 | .signinpanel, 64 | .signuppanel { 65 | margin: 0 auto; 66 | width: 420px!important; 67 | padding: 20px; 68 | } 69 | .signinpanel form { 70 | margin-top: 20px; 71 | } 72 | .signup-footer { 73 | margin-bottom: 10px; 74 | } 75 | .signuppanel .form-control { 76 | margin-bottom: 10px; 77 | } 78 | .signup-footer .pull-left, 79 | .signup-footer .pull-right { 80 | float: none !important; 81 | text-align: center; 82 | } 83 | .signinpanel .signin-info ul { 84 | display: none; 85 | } 86 | } 87 | @media screen and (max-width: 320px) { 88 | .signinpanel, 89 | .signuppanel { 90 | margin:0 20px; 91 | width:auto; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.dangdang.js: -------------------------------------------------------------------------------- 1 | var MessageDigest = java.security.MessageDigest; 2 | var String = java.lang.String; 3 | var StringBuffer = java.lang.StringBuffer; 4 | var Integer = java.lang.Integer; 5 | var Hashtable = java.util.Hashtable; 6 | var Iteractor = java.util.Iteractor; 7 | var DecimalFormat = java.text.DecimalFormat; 8 | var URI = org.apache.commons.httpclient.URI; 9 | var TreeMap = java.util.TreeMap; 10 | var Date = java.util.Date; 11 | 12 | function DangDangRESTAPI(baseURL, method, treeMap){ 13 | this.baseURL = baseURL; 14 | this.method = method; 15 | this.ht = treeMap; 16 | } 17 | 18 | DangDangRESTAPI.prototype.put = function (key, value) { 19 | this.ht.put(key, value); 20 | } 21 | 22 | DangDangRESTAPI.prototype.encrypt = function (app_secret) { 23 | var orgin = new StringBuffer(); 24 | 25 | var map = new TreeMap(); 26 | map.putAll(this.ht); 27 | 28 | //append value for each key 29 | var iter = map.keySet().iterator(); 30 | while (iter.hasNext()) { 31 | var name = String.valueOf(iter.next()); 32 | if (new String(map.get(name)).length() > 0) { 33 | orgin.append(map.get(name)); 34 | } 35 | } 36 | 37 | orgin.append(app_secret); 38 | 39 | // get the md5 digest algorithm 40 | var algorithm = MessageDigest.getInstance("MD5"); 41 | 42 | // get the input as bytes 43 | var bytes = new String(orgin).getBytes("UTF-8"); 44 | 45 | // calculate the digest 46 | algorithm.reset(); 47 | algorithm.update(bytes); 48 | var md5Digest = algorithm.digest(); 49 | 50 | // turn the digest into a hex-string representation 51 | var hexString = new StringBuffer(); 52 | 53 | for (var i = 0; i < md5Digest.length; i++){ 54 | var hex = Integer.toHexString(md5Digest[i] & 0XFF); 55 | if (hex.length() == 1){ 56 | hexString.append('0').append(""); 57 | } 58 | hexString.append(hex); 59 | } 60 | 61 | // write output value 62 | var sign = hexString.toString(); 63 | return sign 64 | } 65 | 66 | DangDangRESTAPI.prototype.URLEncode = function (rp) { 67 | var request_params = rp; 68 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 69 | var e = it.next(); 70 | if (new String(e.getValue()).length() > 0) { 71 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue()); 72 | } 73 | } 74 | var url = this.baseURL + "/" + this.method + ".php?" + request_params.toString().substring(1); 75 | 76 | return new URI(url).toString(); 77 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.service; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.leadingsoft.common.toolkit.MD5Utils; 9 | import com.leadingsoft.core.dto.BootTablePage; 10 | import com.leadingsoft.core.mapper.KUserDao; 11 | import com.leadingsoft.core.model.KUser; 12 | 13 | @Service 14 | public class UserService { 15 | 16 | @Autowired 17 | private KUserDao kUserDao; 18 | 19 | /** 20 | * @Title login 21 | * @Description 登陆 22 | * @param kUser 用户信息对象 23 | * @return 24 | * @return KUser 25 | */ 26 | public KUser login(KUser kUser){ 27 | KUser template = new KUser(); 28 | template.setDelFlag(1); 29 | template.setuAccount(kUser.getuAccount()); 30 | KUser user = kUserDao.templateOne(template); 31 | if (null != user){ 32 | if (user.getuPassword().equals(MD5Utils.Encrypt(kUser.getuPassword(), true))){ 33 | return user; 34 | } 35 | return null; 36 | } 37 | return null; 38 | } 39 | 40 | /** 41 | * @Title isAdmin 42 | * @Description 用户是否为管理员 43 | * @param uId 用户ID 44 | * @return 45 | * @return boolean 46 | */ 47 | public boolean isAdmin(Integer uId){ 48 | KUser kUser = kUserDao.unique(uId); 49 | if ("admin".equals(kUser.getuAccount())){ 50 | return true; 51 | }else { 52 | return false; 53 | } 54 | } 55 | 56 | /** 57 | * @Title getList 58 | * @Description 获取用户分页列表 59 | * @param start 其实行数 60 | * @param size 每页显示行数 61 | * @return 62 | * @return BootTablePage 63 | */ 64 | public BootTablePage getList(Integer start, Integer size){ 65 | KUser template = new KUser(); 66 | template.setDelFlag(1); 67 | List kUserList = kUserDao.template(template, start, size); 68 | long allCount = kUserDao.templateCount(template); 69 | BootTablePage bootTablePage = new BootTablePage(); 70 | bootTablePage.setRows(kUserList); 71 | bootTablePage.setTotal(allCount); 72 | return bootTablePage; 73 | } 74 | 75 | /** 76 | * @Title delete 77 | * @Description 删除用户 78 | * @param uId 用户ID 79 | * @return void 80 | */ 81 | public void delete(Integer uId){ 82 | KUser kUser = kUserDao.unique(uId); 83 | kUser.setDelFlag(0); 84 | kUserDao.updateById(kUser); 85 | } 86 | 87 | /** 88 | * @Title insert 89 | * @Description 插入一个用户 90 | * @param kUser 91 | * @return void 92 | */ 93 | public void insert(KUser kUser){ 94 | } 95 | } -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.amazon.js: -------------------------------------------------------------------------------- 1 | var String = java.lang.String; 2 | var StringBuffer = java.lang.StringBuffer; 3 | var Integer = java.lang.Integer; 4 | var Hashtable = java.util.Hashtable; 5 | var Iteractor = java.util.Iteractor; 6 | var TreeMap = java.util.TreeMap; 7 | var Date = java.util.Date; 8 | var Mac = javax.crypto.Mac; 9 | var SecretKeySpec = javax.crypto.spec.SecretKeySpec; 10 | var Base64 = org.apache.commons.codec.binary.Base64; 11 | var URLEncoder = java.net.URLEncoder; 12 | 13 | 14 | function AmazonRESTAPI(treeMap){ 15 | this.ht = treeMap; 16 | } 17 | 18 | AmazonRESTAPI.prototype.put = function (key, value) { 19 | this.ht.put(key, value); 20 | } 21 | 22 | AmazonRESTAPI.prototype.encrypt = function (url, method, version, app_secret) { 23 | var orgin = new StringBuffer(); 24 | orgin.append("POST\n"); 25 | orgin.append(url+"\n"); 26 | orgin.append("/"+method+"/"+version+"\n"); 27 | 28 | 29 | var map = new TreeMap(); 30 | map.putAll(this.ht); 31 | 32 | var iter = map.keySet().iterator(); 33 | var i = 0; 34 | while (iter.hasNext()) { 35 | var name = String.valueOf(iter.next()); 36 | if (new String(map.get(name)).length() > 0) { 37 | if (i > 0){ 38 | orgin.append("&").append(name).append("=" + URLEncoder.encode(map.get(name),"utf-8")); 39 | } else { 40 | orgin.append(name).append("=" + URLEncoder.encode(map.get(name),"utf-8")); 41 | i = i + 1; 42 | } 43 | } 44 | } 45 | //Alert(new String(orgin)); 46 | //var sign = CryptoJS.HmacSHA256("abc", "dJ9CtVeqWTKXsnqzavUf+AQTOnRqA+0EzPVWN2t1"); 47 | //Alert(new String(app_secret)); 48 | var sha256_HMAC = Mac.getInstance("HmacSHA256"); 49 | var secret_key = new SecretKeySpec(new String(app_secret).getBytes(), new String("HmacSHA256")); 50 | sha256_HMAC.init(secret_key); 51 | var sign = sha256_HMAC.doFinal(new String(orgin).getBytes()); 52 | 53 | var signBase64 = new Base64().encodeBase64(new String(sign).getBytes()); 54 | 55 | return new String(signBase64); 56 | } 57 | 58 | AmazonRESTAPI.prototype.URLEncode = function (ru, rp) { 59 | var request_url = ru; 60 | var request_params = rp; 61 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 62 | var e = it.next(); 63 | if (new String(e.getValue()).length() > 0) { 64 | request_params.append("&").append(e.getKey()).append("=").append(URLEncoder.encode(e.getValue(),"utf-8")); 65 | } 66 | } 67 | var url = request_url + "?" + request_params.toString().substring(1); 68 | return url; 69 | } -------------------------------------------------------------------------------- /src/main/resources/spring/spring-mvc.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | text/plain;charset=UTF-8 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/utils/CommonUtils.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.utils; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.text.ParseException; 6 | import java.text.SimpleDateFormat; 7 | import java.util.ArrayList; 8 | import java.util.Calendar; 9 | import java.util.Date; 10 | import java.util.List; 11 | 12 | import org.apache.commons.io.FileUtils; 13 | import org.springframework.web.multipart.MultipartFile; 14 | 15 | public class CommonUtils { 16 | 17 | /** 18 | * @Title saveFile 19 | * @Description 保存上传的作业文件 20 | * @param uId 用户ID 21 | * @param jobFile 上传的作业文件 22 | * @return 23 | * @throws IOException 24 | * @return String 25 | */ 26 | public static String saveFile(Integer uId, String kettleFileRepository, MultipartFile jobFile) throws IOException{ 27 | StringBuilder allLogFilePath = new StringBuilder(); 28 | allLogFilePath.append(kettleFileRepository).append("/") 29 | .append(uId).append("/") 30 | .append(new Date().getTime()).append("/") 31 | .append(jobFile.getOriginalFilename()); 32 | FileUtils.writeByteArrayToFile(new File(allLogFilePath.toString()), jobFile.getBytes()); 33 | return allLogFilePath.toString(); 34 | } 35 | 36 | /** 37 | * @Title getEveryDayData 38 | * @Description 确定每一次运行属于哪一天 39 | * @param startTime 起始时间 40 | * @param stopTime 结束时间 41 | * @param resultList 递归的返回值 42 | * @return 43 | * @return List 44 | */ 45 | public static List getEveryDayData(Long startTime, Long stopTime, List resultList){ 46 | List timeList = new ArrayList(); 47 | try { 48 | for (int i = -6; i <= 1; i++){ 49 | Calendar instance = Calendar.getInstance(); 50 | instance.add(Calendar.DATE, i); 51 | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); 52 | String dateFormat = simpleDateFormat.format(instance.getTime()); 53 | Long time = simpleDateFormat.parse(dateFormat).getTime(); 54 | timeList.add(time); 55 | } 56 | } catch (ParseException e) { 57 | e.printStackTrace(); 58 | } 59 | Integer startDay = 0; 60 | Integer stopDay = 0; 61 | for (int i = 0; i <= 6; i++){ 62 | if (timeList.get(i) < startTime && startTime < timeList.get(i + 1)){ 63 | startDay = i; 64 | } 65 | if (timeList.get(i) < stopTime && stopTime < timeList.get(i + 1)){ 66 | stopDay = i; 67 | } 68 | } 69 | if ((stopDay - startDay) > 0){ 70 | for (int i = startDay; i <= stopDay; i++){ 71 | resultList.set(i, resultList.get(i) + 1); 72 | } 73 | } else { 74 | resultList.set(startDay, resultList.get(startDay) + 1); 75 | } 76 | return resultList; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/dto/web/KRepositoryDto.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.dto.web; 2 | 3 | public class KRepositoryDto { 4 | 5 | //资源库数据库访问模式("Native", "ODBC", "OCI", "Plugin", "JNDI") 6 | private String databaseAccess; 7 | //资源库数据库主机名或者IP地址 8 | private String databaseHost; 9 | //资源库数据库名称 10 | private String databaseName; 11 | //数据库登录密码 12 | private String databasePassword; 13 | //资源库数据库端口号 14 | private String databasePort; 15 | //数据库登录账号 16 | private String databaseUsername; 17 | //资源库名称 18 | private String repositoryName; 19 | //登录密码 20 | private String repositoryPassword; 21 | //资源库数据库类型(MYSQL、ORACLE) 22 | private String repositoryType; 23 | //登录用户名 24 | private String repositoryUsername; 25 | 26 | public String getDatabaseAccess() { 27 | return databaseAccess; 28 | } 29 | public void setDatabaseAccess(String databaseAccess) { 30 | this.databaseAccess = databaseAccess; 31 | } 32 | public String getDatabaseHost() { 33 | return databaseHost; 34 | } 35 | public void setDatabaseHost(String databaseHost) { 36 | this.databaseHost = databaseHost; 37 | } 38 | public String getDatabaseName() { 39 | return databaseName; 40 | } 41 | public void setDatabaseName(String databaseName) { 42 | this.databaseName = databaseName; 43 | } 44 | public String getDatabasePassword() { 45 | return databasePassword; 46 | } 47 | public void setDatabasePassword(String databasePassword) { 48 | this.databasePassword = databasePassword; 49 | } 50 | public String getDatabasePort() { 51 | return databasePort; 52 | } 53 | public void setDatabasePort(String databasePort) { 54 | this.databasePort = databasePort; 55 | } 56 | public String getDatabaseUsername() { 57 | return databaseUsername; 58 | } 59 | public void setDatabaseUsername(String databaseUsername) { 60 | this.databaseUsername = databaseUsername; 61 | } 62 | public String getRepositoryName() { 63 | return repositoryName; 64 | } 65 | public void setRepositoryName(String repositoryName) { 66 | this.repositoryName = repositoryName; 67 | } 68 | public String getRepositoryPassword() { 69 | return repositoryPassword; 70 | } 71 | public void setRepositoryPassword(String repositoryPassword) { 72 | this.repositoryPassword = repositoryPassword; 73 | } 74 | public String getRepositoryType() { 75 | return repositoryType; 76 | } 77 | public void setRepositoryType(String repositoryType) { 78 | this.repositoryType = repositoryType; 79 | } 80 | public String getRepositoryUsername() { 81 | return repositoryUsername; 82 | } 83 | public void setRepositoryUsername(String repositoryUsername) { 84 | this.repositoryUsername = repositoryUsername; 85 | } 86 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/utils/JsonUtils.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.utils; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.core.JsonProcessingException; 7 | import com.fasterxml.jackson.databind.JavaType; 8 | import com.fasterxml.jackson.databind.ObjectMapper; 9 | 10 | /** 11 | * json工具类 12 | * @author gongym 13 | */ 14 | public class JsonUtils { 15 | 16 | // 定义jackson对象 17 | private static final ObjectMapper MAPPER = new ObjectMapper(); 18 | /** 19 | * 序列化中的时间格式化 20 | */ 21 | private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; 22 | 23 | /** 24 | * 将对象转换成json字符串。 25 | *

Title: pojoToJson

26 | *

Description:

27 | * @param data 28 | * @return 29 | */ 30 | public static String objectToJson(Object data) { 31 | try { 32 | MAPPER.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_FORMAT)); 33 | return MAPPER.writeValueAsString(data); 34 | } catch (JsonProcessingException e) { 35 | e.printStackTrace(); 36 | } 37 | return null; 38 | } 39 | 40 | /** 41 | * @Title: objectToJson 42 | * @Description: 自定义事件格式化的JSON转换 43 | * @param data 44 | * @param dateFormat 45 | * @return String 46 | * @throws 47 | */ 48 | public static String objectToJson(Object data, String dateFormat) { 49 | try { 50 | MAPPER.setDateFormat(new SimpleDateFormat(dateFormat)); 51 | return MAPPER.writeValueAsString(data); 52 | } catch (JsonProcessingException e) { 53 | e.printStackTrace(); 54 | } 55 | return null; 56 | } 57 | 58 | /** 59 | * 将json结果集转化为对象 60 | * 61 | * @param jsonData json数据 62 | * @param clazz 对象中的object类型 63 | * @return 64 | */ 65 | public static T jsonToPojo(String jsonData, Class beanType) { 66 | try { 67 | return MAPPER.readValue(jsonData, beanType); 68 | } catch (Exception e) { 69 | e.printStackTrace(); 70 | } 71 | return null; 72 | } 73 | 74 | /** 75 | * 将json数据转换成pojo对象list 76 | *

Title: jsonToList

77 | *

Description:

78 | * @param jsonData 79 | * @param beanType 80 | * @return 81 | */ 82 | public static List jsonToList(String jsonData, Class beanType) { 83 | JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); 84 | try { 85 | return MAPPER.readValue(jsonData, javaType); 86 | } catch (Exception e) { 87 | e.printStackTrace(); 88 | } 89 | return null; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/model/KUser.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.model; 2 | 3 | import java.util.Date; 4 | 5 | public class KUser { 6 | //用户ID 7 | private Integer uId ; 8 | //添加者 9 | private Integer addUser ; 10 | //是否删除(1:存在;0:删除) 11 | private Integer delFlag ; 12 | //编辑者 13 | private Integer editUser ; 14 | //用户账号 15 | private String uAccount ; 16 | //用户邮箱 17 | private String uEmail ; 18 | //用户昵称 19 | private String uNickname ; 20 | //用户密码 21 | private String uPassword ; 22 | //用于电话 23 | private String uPhone ; 24 | //添加时间 25 | private Date addTime ; 26 | //编辑时间 27 | private Date editTime ; 28 | 29 | public KUser() { 30 | } 31 | 32 | public Integer getuId(){ 33 | return uId; 34 | } 35 | public void setuId(Integer uId ){ 36 | this.uId = uId; 37 | } 38 | 39 | public Integer getAddUser(){ 40 | return addUser; 41 | } 42 | public void setAddUser(Integer addUser ){ 43 | this.addUser = addUser; 44 | } 45 | 46 | public Integer getDelFlag(){ 47 | return delFlag; 48 | } 49 | public void setDelFlag(Integer delFlag ){ 50 | this.delFlag = delFlag; 51 | } 52 | 53 | public Integer getEditUser(){ 54 | return editUser; 55 | } 56 | public void setEditUser(Integer editUser ){ 57 | this.editUser = editUser; 58 | } 59 | 60 | public String getuAccount(){ 61 | return uAccount; 62 | } 63 | public void setuAccount(String uAccount ){ 64 | this.uAccount = uAccount; 65 | } 66 | 67 | public String getuEmail(){ 68 | return uEmail; 69 | } 70 | public void setuEmail(String uEmail ){ 71 | this.uEmail = uEmail; 72 | } 73 | 74 | public String getuNickname(){ 75 | return uNickname; 76 | } 77 | public void setuNickname(String uNickname ){ 78 | this.uNickname = uNickname; 79 | } 80 | 81 | public String getuPassword(){ 82 | return uPassword; 83 | } 84 | public void setuPassword(String uPassword ){ 85 | this.uPassword = uPassword; 86 | } 87 | 88 | public String getuPhone(){ 89 | return uPhone; 90 | } 91 | public void setuPhone(String uPhone ){ 92 | this.uPhone = uPhone; 93 | } 94 | 95 | public Date getAddTime(){ 96 | return addTime; 97 | } 98 | public void setAddTime(Date addTime ){ 99 | this.addTime = addTime; 100 | } 101 | 102 | public Date getEditTime(){ 103 | return editTime; 104 | } 105 | public void setEditTime(Date editTime ){ 106 | this.editTime = editTime; 107 | } 108 | 109 | @Override 110 | public String toString() { 111 | return "KUser [uId=" + uId + ", addUser=" + addUser + ", delFlag=" + delFlag + ", editUser=" + editUser 112 | + ", uAccount=" + uAccount + ", uEmail=" + uEmail + ", uNickname=" + uNickname + ", uPassword=" 113 | + uPassword + ", uPhone=" + uPhone + ", addTime=" + addTime + ", editTime=" + editTime + "]"; 114 | } 115 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/themes/explorer/theme.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Krajee Explorer theme configuration for bootstrap-fileinput. Load this theme file after loading `fileinput.js`. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */ 13 | (function ($) { 14 | "use strict"; 15 | var teTagBef = '\n' + 20 | ' {close}' + 21 | '
\n' + 22 | ' \n' + 23 | '
\n' + 24 | '
' + 25 | '
\n' + 26 | '
\n' + 27 | '
\n' + 28 | '', 29 | footer: '
{caption}
' + 30 | '{size}{progress}{indicator} {actions}', 31 | actions: '{drag}\n' + 32 | '
\n' + 33 | ' \n' + 36 | '
', 37 | zoomCache: '' + 38 | '{zoomContent}
' 39 | }, 40 | previewMarkupTags: { 41 | tagBefore1: teTagBef + '>' + teContent, 42 | tagBefore2: teTagBef + ' title="{caption}">' + teContent, 43 | tagAfter: '\n{footer}\n' 44 | }, 45 | previewSettings: { 46 | image: {height: "60px"}, 47 | html: {width: "100px", height: "60px"}, 48 | text: {width: "100px", height: "60px"}, 49 | video: {width: "auto", height: "60px"}, 50 | audio: {width: "auto", height: "60px"}, 51 | flash: {width: "100%", height: "60px"}, 52 | object: {width: "100%", height: "60px"}, 53 | pdf: {width: "100px", height: "60px"}, 54 | other: {width: "100%", height: "60px"} 55 | }, 56 | frameClass: 'explorer-frame' 57 | }; 58 | })(window.jQuery); 59 | -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/skin/layer.ext.css: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | @Name: layer拓展样式 4 | @Date: 2012.12.13 5 | @Author: 贤心 6 | @blog: sentsin.com 7 | 8 | */.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span{text-overflow:ellipsis;white-space:nowrap}.layui-layer-iconext{background:url(default/icon-ext.png) no-repeat}html #layui_layer_skinlayerextcss{display:none;position:absolute;width:1989px}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:1s;animation-duration:1s;background:url(default/xubox_loading1.gif) center center no-repeat #000}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal} 9 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/DownLoadRecordController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | 6 | import org.apache.commons.io.FileUtils; 7 | import org.apache.commons.lang.StringUtils; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.http.HttpHeaders; 10 | import org.springframework.http.HttpStatus; 11 | import org.springframework.http.MediaType; 12 | import org.springframework.http.ResponseEntity; 13 | import org.springframework.stereotype.Controller; 14 | import org.springframework.web.bind.annotation.RequestMapping; 15 | 16 | import com.leadingsoft.core.mapper.KJobRecordDao; 17 | import com.leadingsoft.core.mapper.KTransRecordDao; 18 | import com.leadingsoft.core.model.KJobRecord; 19 | import com.leadingsoft.core.model.KTransRecord; 20 | 21 | @Controller 22 | @RequestMapping("/download/") 23 | public class DownLoadRecordController { 24 | 25 | @Autowired 26 | private KJobRecordDao kJobRecordDao; 27 | 28 | @Autowired 29 | private KTransRecordDao kTransRecordDao; 30 | 31 | @RequestMapping("job/record.shtml") 32 | public ResponseEntity jobRecord(Integer recordId){ 33 | KJobRecord kJobRecord = kJobRecordDao.unique(recordId); 34 | String logFilePath = kJobRecord.getLogFilePath(); 35 | HttpHeaders headers = new HttpHeaders(); 36 | String fileName = logFilePath.substring(StringUtils.lastIndexOf(logFilePath, "/") + 1, logFilePath.length()); 37 | try { 38 | byte[] logFileBytes = FileUtils.readFileToByteArray(new File(logFilePath)); 39 | String downFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1"); 40 | headers.setContentDispositionFormData("attachment", downFileName); 41 | headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 42 | return new ResponseEntity(logFileBytes, headers, HttpStatus.CREATED); 43 | } catch (IOException e) { 44 | e.printStackTrace(); 45 | return null; 46 | } 47 | } 48 | 49 | @RequestMapping("trans/record.shtml") 50 | public ResponseEntity transRecord(Integer recordId){ 51 | KTransRecord kTransRecord = kTransRecordDao.unique(recordId); 52 | String logFilePath = kTransRecord.getLogFilePath(); 53 | HttpHeaders headers = new HttpHeaders(); 54 | String fileName = logFilePath.substring(StringUtils.lastIndexOf(logFilePath, "/") + 1, logFilePath.length()); 55 | try { 56 | byte[] logFileBytes = FileUtils.readFileToByteArray(new File(logFilePath)); 57 | String downFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1"); 58 | headers.setContentDispositionFormData("attachment", downFileName); 59 | headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 60 | return new ResponseEntity(logFileBytes, headers, HttpStatus.CREATED); 61 | } catch (IOException e) { 62 | e.printStackTrace(); 63 | return null; 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/utils/DateField.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.utils; 2 | 3 | import java.util.Calendar; 4 | 5 | public enum DateField { 6 | 7 | /** 8 | * 年 9 | * @see Calendar#YEAR 10 | */ 11 | YEAR(Calendar.YEAR), 12 | /** 13 | * 月 14 | * @see Calendar#MONTH 15 | */ 16 | MONTH(Calendar.MONTH), 17 | /** 18 | * 一年中第几周 19 | * @see Calendar#WEEK_OF_YEAR 20 | */ 21 | WEEK_OF_YEAR(Calendar.WEEK_OF_YEAR), 22 | /** 23 | * 一月中第几周 24 | * @see Calendar#WEEK_OF_MONTH 25 | */ 26 | WEEK_OF_MONTH(Calendar.WEEK_OF_MONTH), 27 | /** 28 | * 一月中的第几天 29 | * @see Calendar#DAY_OF_MONTH 30 | */ 31 | DAY_OF_MONTH(Calendar.DAY_OF_MONTH), 32 | /** 33 | *一年中的第几天 34 | * @see Calendar#DAY_OF_YEAR 35 | */ 36 | DAY_OF_YEAR(Calendar.DAY_OF_YEAR), 37 | /** 38 | *周几 39 | * @see Calendar#DAY_OF_WEEK 40 | */ 41 | DAY_OF_WEEK(Calendar.DAY_OF_WEEK), 42 | /** 43 | * 天所在的周是这个月的第几周 44 | * @see Calendar#DAY_OF_WEEK_IN_MONTH 45 | */ 46 | DAY_OF_WEEK_IN_MONTH(Calendar.DAY_OF_WEEK_IN_MONTH), 47 | /** 48 | * 上午或者下午 49 | * @see Calendar#AM_PM 50 | */ 51 | AM_PM(Calendar.AM_PM), 52 | /** 53 | * 小时,用于12小时制 54 | * @see Calendar#HOUR 55 | */ 56 | HOUR(Calendar.HOUR), 57 | /** 58 | * 小时,用于24小时制 59 | * @see Calendar#HOUR 60 | */ 61 | HOUR_OF_DAY(Calendar.HOUR_OF_DAY), 62 | /** 63 | * 分钟 64 | * @see Calendar#MINUTE 65 | */ 66 | MINUTE(Calendar.MINUTE), 67 | /** 68 | * 秒 69 | * @see Calendar#SECOND 70 | */ 71 | SECOND(Calendar.SECOND), 72 | /** 73 | * 毫秒 74 | * @see Calendar#MILLISECOND 75 | */ 76 | MILLISECOND(Calendar.MILLISECOND); 77 | 78 | // --------------------------------------------------------------- 79 | private int value; 80 | 81 | private DateField(int value) { 82 | this.value = value; 83 | } 84 | 85 | public int getValue() { 86 | return this.value; 87 | } 88 | 89 | /** 90 | * 将 {@link Calendar}相关值转换为DatePart枚举对象
91 | * 92 | * @param calendarPartIntValue Calendar中关于Week的int值 93 | * @return {@link DateField} 94 | */ 95 | public static DateField of(int calendarPartIntValue) { 96 | switch (calendarPartIntValue) { 97 | case Calendar.YEAR: 98 | return YEAR; 99 | case Calendar.MONTH: 100 | return MONTH; 101 | case Calendar.WEEK_OF_YEAR: 102 | return WEEK_OF_YEAR; 103 | case Calendar.WEEK_OF_MONTH: 104 | return WEEK_OF_MONTH; 105 | case Calendar.DAY_OF_MONTH: 106 | return DAY_OF_MONTH; 107 | case Calendar.DAY_OF_YEAR: 108 | return DAY_OF_YEAR; 109 | case Calendar.DAY_OF_WEEK: 110 | return DAY_OF_WEEK; 111 | case Calendar.DAY_OF_WEEK_IN_MONTH: 112 | return DAY_OF_WEEK_IN_MONTH; 113 | case Calendar.MINUTE: 114 | return MINUTE; 115 | case Calendar.SECOND: 116 | return SECOND; 117 | case Calendar.MILLISECOND: 118 | return MILLISECOND; 119 | default: 120 | return null; 121 | } 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/css/fileinput-rtl.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Krajee RTL (Right To Left) default styling for bootstrap-fileinput. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */ 13 | .kv-rtl { 14 | direction: rtl; 15 | } 16 | 17 | .kv-rtl .close { 18 | float: left; 19 | } 20 | 21 | .kv-rtl .input-group-btn:last-child >.btn { 22 | border-top-right-radius: 0 !important; 23 | border-bottom-right-radius: 0 !important; 24 | border-top-left-radius: 4px !important; 25 | border-bottom-left-radius: 4px !important; 26 | 27 | } 28 | 29 | .kv-rtl .input-group .form-control:first-child { 30 | border-top-right-radius: 4px !important; 31 | border-bottom-right-radius: 4px !important; 32 | border-top-left-radius: 0px !important; 33 | border-bottom-left-radius: 0px !important; 34 | 35 | } 36 | 37 | .kv-rtl .file-loading { 38 | right: auto; 39 | left: 0; 40 | text-align: left; 41 | } 42 | 43 | .kv-rtl .btn-file input[type=file] { 44 | right: auto; 45 | left: 0; 46 | text-align: left; 47 | background: none repeat scroll 100% 0 transparent; 48 | } 49 | 50 | .kv-rtl .file-zoom-dialog { 51 | text-align: right; 52 | } 53 | 54 | .kv-rtl .file-error-message pre, 55 | .kv-rtl .file-error-message ul { 56 | text-align: right; 57 | } 58 | 59 | .kv-rtl .krajee-default.file-preview-frame { 60 | box-shadow: -1px 1px 5px 0 #a2958a; 61 | float: right; 62 | } 63 | 64 | .kv-rtl .krajee-default.file-preview-frame:not(.file-preview-error):hover { 65 | box-shadow: -3px 3px 5px 0 #333; 66 | } 67 | 68 | .kv-rtl .krajee-default .file-actions, 69 | .kv-rtl .krajee-default .file-other-error { 70 | text-align: right; 71 | } 72 | 73 | .kv-rtl .krajee-default .file-footer-buttons { 74 | float: left; 75 | } 76 | 77 | .kv-rtl .krajee-default .file-drag-handle, 78 | .kv-rtl .krajee-default .file-upload-indicator { 79 | left: auto; 80 | right: -6px; 81 | padding: 8px 3px 1px 8px; 82 | border-top-left-radius: 24px; 83 | border-top-right-radius: 0; 84 | } 85 | 86 | .kv-rtl .file-drop-zone { 87 | margin: 12px 12px 12px 15px; 88 | } 89 | 90 | .kv-rtl .floating-buttons { 91 | left: 10px; 92 | right: auto; 93 | } 94 | 95 | .kv-rtl .kv-zoom-actions .btn, 96 | .kv-rtl .floating-buttons .btn { 97 | margin-right: 3px; 98 | } 99 | 100 | .kv-rtl .btn-prev { 101 | right: 1px; 102 | left: auto; 103 | } 104 | 105 | .kv-rtl .btn-next { 106 | left: 1px; 107 | right: auto; 108 | } 109 | 110 | .kv-rtl .pull-right { 111 | float: left!important; 112 | } 113 | 114 | .kv-rtl .pull-left { 115 | float: right!important; 116 | } 117 | 118 | .kv-rtl .modal-title { 119 | float: right; 120 | direction: ltr; 121 | } -------------------------------------------------------------------------------- /src/main/resources/spring/applicationContext-beetlsql.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | 22 | classpath:resource/*.properties 23 | 24 | 25 | 26 | 27 | 28 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/main/webapp/Html/js/libs/url/cmg.open.url.builder.taobao.js: -------------------------------------------------------------------------------- 1 | var MessageDigest = java.security.MessageDigest; 2 | var String = java.lang.String; 3 | var StringBuffer = java.lang.StringBuffer; 4 | var Integer = java.lang.Integer; 5 | var Hashtable = java.util.Hashtable; 6 | var Iteractor = java.util.Iteractor; 7 | var DecimalFormat = java.text.DecimalFormat; 8 | var URI = org.apache.commons.httpclient.URI; 9 | var TreeMap = java.util.TreeMap; 10 | var Date = java.util.Date; 11 | 12 | var URLEncoder = java.net.URLEncoder; 13 | var Base64 = org.apache.commons.codec.binary.Base64; 14 | var RSA = org.ukettle.ehub.agent.client.RSA; 15 | 16 | function TaobaoMD5(treeMap){ 17 | this.ht = treeMap; 18 | } 19 | 20 | TaobaoMD5.prototype.put = function (key, value) { 21 | this.ht.put(key, value); 22 | } 23 | 24 | TaobaoMD5.prototype.encrypt = function (app_secret) { 25 | var orgin = new StringBuffer(); 26 | orgin.append(app_secret); 27 | 28 | var map = new TreeMap(); 29 | map.putAll(this.ht); 30 | 31 | var iter = map.keySet().iterator(); 32 | while (iter.hasNext()) { 33 | var name = String.valueOf(iter.next()); 34 | if (new String(map.get(name)).length() > 0) { 35 | orgin.append(name).append(map.get(name)); 36 | } 37 | } 38 | 39 | orgin.append(app_secret); 40 | 41 | // get the md5 digest algorithm 42 | var algorithm = MessageDigest.getInstance("MD5"); 43 | 44 | // get the input as bytes 45 | var bytes = new String(orgin).getBytes("UTF-8"); 46 | 47 | // calculate the digest 48 | algorithm.reset(); 49 | algorithm.update(bytes); 50 | var md5Digest = algorithm.digest(); 51 | 52 | // turn the digest into a hex-string representation 53 | var hexString = new StringBuffer(); 54 | 55 | for (var i = 0; i < md5Digest.length; i++){ 56 | var hex = Integer.toHexString(md5Digest[i] & 0XFF); 57 | if (hex.length() == 1){ 58 | hexString.append('0').append(""); 59 | } 60 | hexString.append(hex); 61 | } 62 | 63 | // write output value 64 | var sign = hexString.toString().toUpperCase(); 65 | return sign 66 | } 67 | 68 | TaobaoMD5.prototype.URLEncode = function (ru, rp) { 69 | var request_url = ru; 70 | var request_params = rp; 71 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 72 | var e = it.next(); 73 | if (new String(e.getValue()).length() > 0) { 74 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue()); 75 | } 76 | } 77 | var url = request_url + "?" + request_params.toString().substring(1); 78 | 79 | // return url; 80 | return new URI(url).toString(); 81 | } 82 | 83 | TaobaoMD5.prototype.EncodeURL = function (ru, rp) { 84 | var request_url = ru; 85 | var request_params = rp; 86 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) { 87 | var e = it.next(); 88 | if (new String(e.getValue()).length() > 0) { 89 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue()); 90 | } 91 | } 92 | var url = request_url + "?" + request_params.toString().substring(1); 93 | 94 | if(null != url){ 95 | var rsaEncode = RSA.getENCRYPTInstance(); 96 | var data = rsaEncode.encryptData(new String(url).getBytes("UTF-8")); 97 | url = URLEncoder.encode(new String(Base64.encodeBase64(data)),"UTF-8") 98 | } 99 | return url; 100 | } -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/core/conf/UTF8StringHttpMessageConverter.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.core.conf; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStreamReader; 5 | import java.io.OutputStreamWriter; 6 | import java.io.UnsupportedEncodingException; 7 | import java.nio.charset.Charset; 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | import org.springframework.http.HttpInputMessage; 12 | import org.springframework.http.HttpOutputMessage; 13 | import org.springframework.http.MediaType; 14 | import org.springframework.http.converter.AbstractHttpMessageConverter; 15 | import org.springframework.util.FileCopyUtils; 16 | /** 17 | * @ClassName UTF8StringHttpMessageConverter 18 | * @Description 格式化springmvc返回值对象,防止出现乱码 19 | * @author gongym 20 | * @date 2017年3月17日 上午8:08:09 21 | */ 22 | public class UTF8StringHttpMessageConverter extends AbstractHttpMessageConverter { 23 | 24 | public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 25 | 26 | private final List availableCharsets; 27 | 28 | private boolean writeAcceptCharset = true; 29 | 30 | public UTF8StringHttpMessageConverter() { 31 | super(new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.ALL); 32 | this.availableCharsets = new ArrayList(Charset.availableCharsets().values()); 33 | } 34 | 35 | /** 36 | * Indicates whether the {@code Accept-Charset} should be written to any 37 | * outgoing request. 38 | *

39 | * Default is {@code true}. 40 | */ 41 | public void setWriteAcceptCharset(boolean writeAcceptCharset) { 42 | this.writeAcceptCharset = writeAcceptCharset; 43 | } 44 | 45 | @Override 46 | public boolean supports(Class clazz) { 47 | return String.class.equals(clazz); 48 | } 49 | 50 | @Override 51 | protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException { 52 | Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType()); 53 | return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset)); 54 | } 55 | 56 | @Override 57 | protected Long getContentLength(String s, MediaType contentType) { 58 | Charset charset = getContentTypeCharset(contentType); 59 | try { 60 | return (long) s.getBytes(charset.name()).length; 61 | } catch (UnsupportedEncodingException ex) { 62 | throw new InternalError(ex.getMessage()); 63 | } 64 | } 65 | 66 | @Override 67 | protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException { 68 | if (writeAcceptCharset) { 69 | outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); 70 | } 71 | Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType()); 72 | FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), charset)); 73 | } 74 | 75 | /** 76 | * Return the list of supported {@link Charset}. 77 | * 78 | *

79 | * By default, returns {@link Charset#availableCharsets()}. Can be 80 | * overridden in subclasses. 81 | * 82 | * @return the list of accepted charsets 83 | */ 84 | protected List getAcceptedCharsets() { 85 | return this.availableCharsets; 86 | } 87 | 88 | private Charset getContentTypeCharset(MediaType contentType) { 89 | if (contentType != null && contentType.getCharset() != null) { 90 | return contentType.getCharset(); 91 | } else { 92 | return DEFAULT_CHARSET; 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/layim/data/friend.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": 1, 3 | "msg": "ok", 4 | "data": [ 5 | { 6 | "name": "销售部", 7 | "nums": 36, 8 | "id": 1, 9 | "item": [ 10 | { 11 | "id": "100001", 12 | "name": "郭敬明", 13 | "face": "img/a5.jpg" 14 | }, 15 | { 16 | "id": "100002", 17 | "name": "作家崔成浩", 18 | "face": "img/a6.jpg" 19 | }, 20 | { 21 | "id": "1000022", 22 | "name": "韩寒", 23 | "face": "img/a7.jpg" 24 | }, 25 | { 26 | "id": "10000222", 27 | "name": "范爷", 28 | "face": "img/a8.jpg" 29 | }, 30 | { 31 | "id": "100002222", 32 | "name": "小马哥", 33 | "face": "img/a9.jpg" 34 | } 35 | ] 36 | }, 37 | { 38 | "name": "大学同窗", 39 | "nums": 16, 40 | "id": 2, 41 | "item": [ 42 | { 43 | "id": "1000033", 44 | "name": "苏醒", 45 | "face": "img/a9.jpg" 46 | }, 47 | { 48 | "id": "10000333", 49 | "name": "马云", 50 | "face": "img/a8.jpg" 51 | }, 52 | { 53 | "id": "100003", 54 | "name": "鬼脚七", 55 | "face": "img/a7.jpg" 56 | }, 57 | { 58 | "id": "100004", 59 | "name": "谢楠", 60 | "face": "img/a6.jpg" 61 | }, 62 | { 63 | "id": "100005", 64 | "name": "徐峥", 65 | "face": "img/a5.jpg" 66 | } 67 | ] 68 | }, 69 | { 70 | "name": "H+后台主题", 71 | "nums": 38, 72 | "id": 3, 73 | "item": [ 74 | { 75 | "id": "100006", 76 | "name": "柏雪近在它香", 77 | "face": "img/a4.jpg" 78 | }, 79 | { 80 | "id": "100007", 81 | "name": "罗昌平", 82 | "face": "img/a3.jpg" 83 | }, 84 | { 85 | "id": "100008", 86 | "name": "Crystal影子", 87 | "face": "img/a2.jpg" 88 | }, 89 | { 90 | "id": "100009", 91 | "name": "艺小想", 92 | "face": "img/a1.jpg" 93 | }, 94 | { 95 | "id": "100010", 96 | "name": "天猫", 97 | "face": "img/a8.jpg" 98 | }, 99 | { 100 | "id": "100011", 101 | "name": "张泉灵", 102 | "face": "img/a7.jpg" 103 | } 104 | ] 105 | } 106 | ] 107 | } 108 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/views/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" 2 | pageEncoding="UTF-8"%> 3 | <%String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%> 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | kettleMaster | 登录 12 | 13 | 14 | 15 | 16 | 17 | 18 | 24 | 25 |

28 |
29 | 56 |
57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap-fileinput/themes/explorer/theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.4.2 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Krajee Explorer theme style for bootstrap-fileinput. Load this theme file after loading `fileinput.css`. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2017, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */.theme-explorer .file-preview .table{margin:0}.theme-explorer .explorer-frame td{vertical-align:middle;text-align:left}.explorer-frame .file-preview-text{display:inline-block;color:#428bca;border:1px solid #ddd;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;outline:0;padding:8px;resize:none}.explorer-frame .file-preview-html{display:inline-block;border:1px solid #ddd;padding:8px;overflow:auto}.explorer-frame .file-preview-other{text-align:center}.explorer-frame .file-other-icon{font-size:4.2em}.theme-explorer .explorer-frame .kv-file-content{width:80px;height:80px;padding:5px;text-align:center}.theme-explorer .file-actions-cell{width:100px;padding:0;position:relative}.theme-explorer .file-thumb-progress .progress{display:block;margin-top:5px}.theme-explorer .file-thumb-progress .progress,.theme-explorer .file-thumb-progress .progress-bar{height:13px;font-size:11px;line-height:13px}.theme-explorer .file-drag-handle,.theme-explorer .file-upload-indicator{position:absolute;text-align:center;top:0;right:0;padding-left:5px;padding-right:2px;border-right:none;border-top:none;border-left:1px solid #8a6d3b;border-bottom:1px solid #8a6d3b;border-bottom-left-radius:11px;font-size:12px}.theme-explorer .explorer-caption{display:block;color:#777}.theme-explorer .file-actions{text-align:center}.theme-explorer .kvsortable-ghost{opacity:.6;background:#e1edf7;border:2px solid #a1abff}.theme-explorer .file-upload-indicator{font-size:13px;padding-left:6px;background-color:#fcf8e3;border-color:#faebcc}.theme-explorer .file-drag-handle{right:-2px;background-color:#d9edf7;border-color:#bce8f1}.theme-explorer .file-preview-error .file-upload-indicator{background-color:#f2dede;border-color:#ebccd1}.theme-explorer .file-preview-success .file-upload-indicator{background-color:#dff0d8;border-color:#d6e9c6}.theme-explorer .file-preview-loading .file-upload-indicator{background-color:#e5e5e5;border-color:#777}.theme-explorer .file-error-message ul{padding-left:15px}.theme-explorer .file-error-message .close{margin-top:-5px;margin-right:-5px}@media only screen and (max-width:500px){.theme-explorer .table,.theme-explorer .table tbody,.theme-explorer .table td,.theme-explorer .table tr{display:block;width:100%!important}.theme-explorer .table{border:none}.theme-explorer .table tr{margin-top:5px}.theme-explorer .table tr:first-child{margin-top:0}.theme-explorer .table td{text-align:center}.theme-explorer .table .kv-file-content{border-bottom:none;padding:4px;margin:0}.theme-explorer .table .kv-file-content .file-preview-image{max-width:100%;font-size:20px}.theme-explorer .file-details-cell{border-top:none;border-bottom:none;padding-top:0;margin:0}.theme-explorer .file-actions-cell{border-top:none;padding-bottom:4px}.theme-explorer .explorer-frame .explorer-caption{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;left:0;right:0;margin:auto}.theme-explorer .file-drag-handle,.theme-explorer .file-upload-indicator{right:0;bottom:0;border-top-left-radius:40px;border-bottom-left-radius:0;padding:12px 3px 0 6px}.theme-explorer .file-actions-cell .btn-xs{font-size:.9em;padding:2px 7px;margin-right:3px;cursor:pointer}} -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/TransController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import java.io.IOException; 4 | import java.sql.SQLException; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | import org.springframework.web.multipart.MultipartFile; 12 | 13 | import com.leadingsoft.common.toolkit.Constant; 14 | import com.leadingsoft.core.dto.BootTablePage; 15 | import com.leadingsoft.core.dto.ResultDto; 16 | import com.leadingsoft.core.model.KTrans; 17 | import com.leadingsoft.core.model.KUser; 18 | import com.leadingsoft.web.service.TransService; 19 | import com.leadingsoft.web.utils.JsonUtils; 20 | 21 | @RestController 22 | @RequestMapping("/trans/") 23 | public class TransController { 24 | 25 | @Autowired 26 | private TransService transService; 27 | 28 | 29 | @RequestMapping("getSimpleList.shtml") 30 | public String getSimpleList(HttpServletRequest request){ 31 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 32 | return JsonUtils.objectToJson(transService.getList(kUser.getuId())); 33 | } 34 | 35 | @RequestMapping("getList.shtml") 36 | public String getList(Integer offset, Integer limit, HttpServletRequest request){ 37 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 38 | BootTablePage list = transService.getList(offset, limit, kUser.getuId()); 39 | return JsonUtils.objectToJson(list); 40 | } 41 | 42 | @RequestMapping("uploadTrans.shtml") 43 | public String uploadJob(MultipartFile transFile, HttpServletRequest request){ 44 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 45 | try { 46 | String saveFilePath = transService.saveFile(kUser.getuId(), transFile); 47 | return ResultDto.success(saveFilePath); 48 | } catch (IOException e) { 49 | e.printStackTrace(); 50 | return null; 51 | } 52 | } 53 | 54 | @RequestMapping("insert") 55 | public String insert(KTrans kTrans, String customerQuarz, HttpServletRequest request){ 56 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 57 | Integer uId = kUser.getuId(); 58 | if (transService.check(kTrans.getTransRepositoryId(), kTrans.getTransPath(), uId)){ 59 | try { 60 | transService.insert(kTrans, uId, customerQuarz); 61 | return ResultDto.success(); 62 | } catch (SQLException e) { 63 | e.printStackTrace(); 64 | return ResultDto.fail("添加作业失败"); 65 | } 66 | }else{ 67 | return ResultDto.fail("该作业已经添加过了"); 68 | } 69 | } 70 | 71 | @RequestMapping("getTrans.shtml") 72 | public String getTrans(Integer transId){ 73 | return ResultDto.success(transService.getTrans(transId)); 74 | } 75 | 76 | @RequestMapping("update.shtml") 77 | public String update(KTrans kTrans, String customerQuarz, HttpServletRequest request){ 78 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 79 | try{ 80 | transService.update(kTrans, customerQuarz, kUser.getuId()); 81 | return ResultDto.success(); 82 | }catch(Exception e){ 83 | return ResultDto.success(e.toString()); 84 | } 85 | } 86 | 87 | @RequestMapping("start.shtml") 88 | public String start(Integer transId){ 89 | transService.start(transId); 90 | return ResultDto.success(); 91 | } 92 | 93 | @RequestMapping("stop.shtml") 94 | public String stop(Integer transId){ 95 | transService.stop(transId); 96 | return ResultDto.success(); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/main/webapp/static/js/plugins/layer/laydate/skins/default/laydate.css: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name: laydate皮肤:墨绿 4 | @Author:贤心 5 | @Site:http://sentsin.com/layui/laydate 6 | 7 | **/ 8 | 9 | .laydate-icon{border:1px solid #ccc; background-image:url(icon.png)} 10 | 11 | .laydate_body .laydate_bottom #laydate_hms, 12 | .laydate_body .laydate_time{border:1px solid #ccc;} 13 | 14 | .laydate_body .laydate_box, 15 | .laydate_body .laydate_ym .laydate_yms, 16 | .laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);} 17 | 18 | .laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#00625A;} 19 | .laydate_body .laydate_box input{background:none!important; color:#fff;} 20 | .laydate_body .laydate_box .laydate_void{color:#00E8D7!important;} 21 | .laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#00625A;} 22 | .laydate_body .laydate_box a:hover{color:#666;} 23 | .laydate_body .laydate_click{background-color:#009F95!important; color:#fff!important;} 24 | .laydate_body .laydate_top{border-top:1px solid #009F95; background-color:#009F95} 25 | .laydate_body .laydate_ym{border:1px solid #009F95; background-color:#009F95;} 26 | .laydate_body .laydate_ym .laydate_yms{border:1px solid #009F95; background-color:#009F95; color:#fff;} 27 | .laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #009F95;} 28 | .laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #009F95; border-bottom:none;} 29 | .laydate_body .laydate_choose{border-left:1px solid #009F95;} 30 | .laydate_body .laydate_chprev{border-left:none; border-right:1px solid #009F95;} 31 | .laydate_body .laydate_choose:hover, 32 | .laydate_body .laydate_y .laydate_yms a:hover{background-color:#00C1B3;} 33 | .laydate_body .laydate_chtop cite{border-bottom-color:#fff;} 34 | .laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;} 35 | .laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;} 36 | .laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;} 37 | .laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;} 38 | .laydate_body .laydate_table td{border:none; height:21px!important; line-height:21px!important; background-color:#fff; color:#00625A;} 39 | .laydate_body .laydate_table .laydate_nothis{color:#999;} 40 | .laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;} 41 | .laydate_body .laydate_table thead th{} 42 | .laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;} 43 | .laydate_body .laydate_bottom #laydate_hms{background-color:#fff;} 44 | .laydate_body .laydate_time{background-color:#fff;} 45 | .laydate_body .laydate_time1{width: 226px!important; height: 152px!important;} 46 | .laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;} 47 | .laydate_body .laydate_bottom input{background-color:#fff; color:#00625A;} 48 | .laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;} 49 | .laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;} 50 | .laydate_body .laydate_bottom .laydate_v{color:#999} 51 | .laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;} 52 | .laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#00625A;} 53 | 54 | .laydate_body .laydate_m .laydate_yms span:hover, 55 | .laydate_body .laydate_time .laydate_hmsno span:hover, 56 | .laydate_body .laydate_y .laydate_yms ul li:hover, 57 | .laydate_body .laydate_table td:hover{background-color:#00C1B3; color:#fff;} 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/JobController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import java.io.IOException; 4 | import java.sql.SQLException; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | import org.springframework.web.multipart.MultipartFile; 12 | 13 | import com.leadingsoft.common.toolkit.Constant; 14 | import com.leadingsoft.core.dto.BootTablePage; 15 | import com.leadingsoft.core.dto.ResultDto; 16 | import com.leadingsoft.core.model.KJob; 17 | import com.leadingsoft.core.model.KUser; 18 | import com.leadingsoft.web.service.JobService; 19 | import com.leadingsoft.web.utils.JsonUtils; 20 | 21 | 22 | @RestController 23 | @RequestMapping("/job/") 24 | public class JobController { 25 | 26 | @Autowired 27 | private JobService jobService; 28 | 29 | 30 | @RequestMapping("getSimpleList.shtml") 31 | public String getSimpleList(HttpServletRequest request){ 32 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 33 | return JsonUtils.objectToJson(jobService.getList(kUser.getuId())); 34 | } 35 | 36 | 37 | @RequestMapping("getList.shtml") 38 | public String getList(Integer offset, Integer limit, HttpServletRequest request){ 39 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 40 | BootTablePage list = jobService.getList(offset, limit, kUser.getuId()); 41 | return JsonUtils.objectToJson(list); 42 | } 43 | 44 | @RequestMapping("delete.shtml") 45 | public String delete(Integer jobId){ 46 | jobService.delete(jobId); 47 | return ResultDto.success(); 48 | } 49 | 50 | @RequestMapping("uploadJob.shtml") 51 | public String uploadJob(MultipartFile jobFile, HttpServletRequest request){ 52 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 53 | try { 54 | String saveFilePath = jobService.saveFile(kUser.getuId(), jobFile); 55 | return ResultDto.success(saveFilePath); 56 | } catch (IOException e) { 57 | e.printStackTrace(); 58 | return null; 59 | } 60 | } 61 | 62 | 63 | @RequestMapping("insert.shtml") 64 | public String insert(KJob kJob, String customerQuarz, HttpServletRequest request){ 65 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 66 | Integer uId = kUser.getuId(); 67 | if (jobService.check(kJob.getJobRepositoryId(), kJob.getJobPath(), uId)){ 68 | try { 69 | jobService.insert(kJob, uId, customerQuarz); 70 | return ResultDto.success(); 71 | } catch (SQLException e) { 72 | e.printStackTrace(); 73 | return ResultDto.fail("添加作业失败"); 74 | } 75 | }else{ 76 | return ResultDto.fail("该作业已经添加过了"); 77 | } 78 | } 79 | 80 | 81 | @RequestMapping("getJob.shtml") 82 | public String getJob(Integer jobId){ 83 | return ResultDto.success(jobService.getJob(jobId)); 84 | } 85 | 86 | @RequestMapping("update.shtml") 87 | public String update(KJob kJob, String customerQuarz, HttpServletRequest request){ 88 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 89 | try{ 90 | jobService.update(kJob, customerQuarz, kUser.getuId()); 91 | return ResultDto.success(); 92 | }catch(Exception e){ 93 | return ResultDto.success(e.toString()); 94 | } 95 | } 96 | 97 | @RequestMapping("start.shtml") 98 | public String start(Integer jobId){ 99 | jobService.start(jobId,"2"); 100 | return ResultDto.success(); 101 | } 102 | 103 | @RequestMapping("stop.shtml") 104 | public String stop(Integer jobId){ 105 | jobService.stop(jobId); 106 | return ResultDto.success(); 107 | } 108 | 109 | } 110 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/metronic/css/login-soft.css: -------------------------------------------------------------------------------- 1 | /*-------------------------------------------------- 2 | [TRANSITION] 3 | ----------------------------------------------------*/ 4 | /* Cubic Bezier Transition */ 5 | /*** 6 | Login page 7 | ***/ 8 | /* logo page */ 9 | .login { 10 | margin-top: 100px!important; 11 | background-color: #666 !important; 12 | } 13 | 14 | .login .logo { 15 | margin: 60px auto 20px auto; 16 | padding: 15px; 17 | text-align: center; 18 | } 19 | 20 | .login .content { 21 | background: url(../img/bg-white-lock.png) repeat; 22 | width: 360px; 23 | margin: 0 auto; 24 | margin-bottom: 0px; 25 | padding: 30px; 26 | padding-top: 20px; 27 | padding-bottom: 15px; 28 | -webkit-border-radius: 7px; 29 | -moz-border-radius: 7px; 30 | -ms-border-radius: 7px; 31 | -o-border-radius: 7px; 32 | border-radius: 7px; 33 | } 34 | 35 | .login .content h3 { 36 | color: #eee; 37 | } 38 | 39 | .login .content h4 { 40 | color: #eee; 41 | } 42 | 43 | .login .content p, 44 | .login .content label { 45 | color: #fff; 46 | } 47 | 48 | .login .content .login-form, 49 | .login .content .forget-form { 50 | padding: 0px; 51 | margin: 0px; 52 | } 53 | 54 | .login .content .form-control { 55 | background-color: #fff; 56 | } 57 | 58 | .login .content .forget-form { 59 | display: none; 60 | } 61 | 62 | .login .content .register-form { 63 | display: none; 64 | } 65 | 66 | .login .content .form-title { 67 | font-weight: 300; 68 | margin-bottom: 25px; 69 | } 70 | 71 | .login .content .form-actions { 72 | background-color: transparent; 73 | clear: both; 74 | border: 0px; 75 | padding: 0px 30px 25px 30px; 76 | margin-left: -30px; 77 | margin-right: -30px; 78 | } 79 | 80 | .login .content .form-actions .checkbox { 81 | margin-left: 0; 82 | padding-left: 0; 83 | } 84 | 85 | .login .content .forget-form .form-actions { 86 | border: 0; 87 | margin-bottom: 0; 88 | padding-bottom: 20px; 89 | } 90 | 91 | .login .content .register-form .form-actions { 92 | border: 0; 93 | margin-bottom: 0; 94 | padding-bottom: 0px; 95 | } 96 | 97 | .login .content .form-actions .checkbox { 98 | margin-top: 8px; 99 | display: inline-block; 100 | } 101 | 102 | .login .content .form-actions .btn { 103 | margin-top: 1px; 104 | } 105 | 106 | .login .content .forget-password { 107 | margin-top: 25px; 108 | } 109 | 110 | .login .content .create-account { 111 | border-top: 1px dotted #eee; 112 | padding-top: 10px; 113 | margin-top: 15px; 114 | } 115 | 116 | .login .content .create-account a { 117 | display: inline-block; 118 | margin-top: 5px; 119 | } 120 | 121 | /* select2 dropdowns */ 122 | .login .content .select2-container i { 123 | display: inline-block; 124 | position: relative; 125 | color: #ccc; 126 | z-index: 1; 127 | top: 1px; 128 | margin: 4px 4px 0px -1px; 129 | width: 16px; 130 | height: 16px; 131 | font-size: 16px; 132 | text-align: center; 133 | } 134 | 135 | .login .content .has-error .select2-container i { 136 | color: #b94a48; 137 | } 138 | 139 | .login .content .select2-container a span { 140 | font-size: 13px; 141 | } 142 | 143 | .login .content .select2-container a span img { 144 | margin-left: 4px; 145 | } 146 | 147 | /* footer copyright */ 148 | .login .copyright { 149 | text-align: center; 150 | margin: 0 auto; 151 | padding: 10px; 152 | color: #eee; 153 | font-size: 13px; 154 | } 155 | 156 | @media (max-width: 480px) { 157 | /*** 158 | Login page 159 | ***/ 160 | .login .logo { 161 | margin-top: 10px; 162 | } 163 | 164 | .login .content { 165 | padding: 30px; 166 | width: 222px; 167 | } 168 | 169 | .login .content h3 { 170 | font-size: 22px; 171 | } 172 | 173 | .login .checkbox { 174 | font-size: 13px; 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/jquery.uniform/themes/css/uniform.default.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Uniform Theme: Uniform Default 3 | Version: 1.8 4 | By: Josh Pyles 5 | License: MIT License 6 | --- 7 | For use with the Uniform plugin: 8 | http://uniformjs.com/ 9 | */ 10 | 11 | $button-height: 30px; 12 | $button-margin-left: 13px; 13 | $button-padding: 8px 15px 0 2px; 14 | $button-span-height: 22px; 15 | $checkbox-height: 19px; 16 | $checkbox-width: 19px; 17 | $input-padding: 3px; 18 | $radio-height: 18px; 19 | $radio-width: 18px; 20 | $select-fixed-width: 190px; 21 | $select-height: 26px; 22 | $select-margin-left: 10px; 23 | $select-margin-right: 25px; 24 | $select-select-height: 22px; 25 | $select-select-top: 2px; 26 | $upload-action-width: 82px; 27 | $upload-filename-margin-top: 2px; 28 | $upload-filename-margin-bottom: 2px; 29 | $upload-filename-margin-left: 2px; 30 | $upload-filename-width: 85px; 31 | $upload-filename-padding: 0 10px; 32 | $upload-height: 28px; 33 | $upload-width: 190px; 34 | 35 | @import "../../_base/css/uniform._base.scss"; 36 | 37 | /* INPUT & TEXTAREA */ 38 | 39 | #{$class-wrapper-element}#{$class-wrapper} input#{$class-input}, 40 | #{$class-wrapper-element}#{$class-wrapper} select#{$class-multiselect}, 41 | #{$class-wrapper-element}#{$class-wrapper} textarea#{$class-textarea} { 42 | font-size: 12px; 43 | font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; 44 | font-weight: normal; 45 | color: #777777; 46 | border: 1px solid #aaaaaa; 47 | border-right-color: #cccccc; 48 | border-bottom-color: #cccccc; 49 | @include border-radius($input-padding); 50 | 51 | @include whenHover { 52 | @include box-shadow(0px 0px 4px rgba(0, 0, 0, 0.3)); 53 | border-color: #999999; 54 | } 55 | } 56 | 57 | /* PRESENTATION */ 58 | 59 | /* Buttons */ 60 | 61 | div#{$class-wrapper}#{$class-button} { 62 | span { 63 | font-weight: bold; 64 | font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; 65 | font-size: 12px; 66 | letter-spacing: 1px; 67 | text-transform: uppercase; 68 | } 69 | 70 | @include whenHover { 71 | span { 72 | color: #555555; 73 | } 74 | } 75 | 76 | @include whenDisabled { 77 | span { 78 | color: #bbbbbb; 79 | } 80 | } 81 | } 82 | 83 | /* Select */ 84 | 85 | div#{$class-wrapper}#{$class-select} { 86 | font-size: 12px; 87 | 88 | span { 89 | color: #666666; 90 | text-shadow: 0 1px 0 #ffffff; 91 | } 92 | 93 | select { 94 | font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; 95 | font-size: 12px; 96 | } 97 | 98 | @include whenDisabled { 99 | span { 100 | color: #bbbbbb; 101 | } 102 | } 103 | } 104 | 105 | /* Checker */ 106 | div#{$class-wrapper}#{$class-checkbox} { 107 | margin-right: 5px; 108 | } 109 | 110 | /* Radio */ 111 | div#{$class-wrapper}#{$class-radio} { 112 | margin-right: 3px; 113 | } 114 | 115 | /* Uploader */ 116 | div#{$class-wrapper}#{$class-upload} { 117 | span#{$class-action} { 118 | text-shadow: #ffffff 0 1px 0; 119 | background-color: #ffffff; 120 | font-size: 11px; 121 | font-weight: bold; 122 | } 123 | 124 | span#{$class-filename} { 125 | color: #777777; 126 | border-right: solid 1px #bbbbbb; 127 | font-size: 11px; 128 | } 129 | 130 | @include whenDisabled { 131 | span#{$class-action} { 132 | color: #aaaaaa; 133 | } 134 | 135 | span#{$class-filename} { 136 | border-color: #dddddd; 137 | color: #aaaaaa; 138 | } 139 | } 140 | } 141 | 142 | #{$class-wrapper-element}#{$class-wrapper} input#{$class-input} { 143 | &, &:focus { 144 | background-color: #ffffff; 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /src/main/java/com/leadingsoft/web/controller/MainController.java: -------------------------------------------------------------------------------- 1 | package com.leadingsoft.web.controller; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.ArrayList; 6 | import java.util.Calendar; 7 | import java.util.HashMap; 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | import javax.servlet.http.HttpServletRequest; 12 | 13 | import org.springframework.beans.factory.annotation.Autowired; 14 | import org.springframework.web.bind.annotation.RequestMapping; 15 | import org.springframework.web.bind.annotation.RestController; 16 | 17 | import com.leadingsoft.common.toolkit.Constant; 18 | import com.leadingsoft.core.dto.BootTablePage; 19 | import com.leadingsoft.core.dto.ResultDto; 20 | import com.leadingsoft.core.model.KUser; 21 | import com.leadingsoft.web.service.JobMonitorService; 22 | import com.leadingsoft.web.service.TransMonitorService; 23 | import com.leadingsoft.web.utils.JsonUtils; 24 | 25 | @RestController 26 | @RequestMapping("/main/") 27 | public class MainController { 28 | 29 | @Autowired 30 | private TransMonitorService transMonitorService; 31 | 32 | @Autowired 33 | private JobMonitorService jobMonitorService; 34 | 35 | /** 36 | * @Title allRuning 37 | * @Description 38 | * @param request 39 | * @return 40 | * @return String 41 | */ 42 | @RequestMapping("allRuning.shtml") 43 | public String allRuning(HttpServletRequest request){ 44 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 45 | Integer allMonitorTrans = transMonitorService.getAllMonitorTrans(kUser.getuId()); 46 | Integer allMonitorJob = jobMonitorService.getAllMonitorJob(kUser.getuId()); 47 | Integer allRuning = allMonitorTrans + allMonitorJob; 48 | return JsonUtils.objectToJson(allRuning); 49 | } 50 | 51 | /** 52 | * @Title getTransList 53 | * @Description 获取转换的Top5 54 | * @param request 55 | * @return 56 | * @return String 57 | */ 58 | @RequestMapping("getTransList.shtml") 59 | public String getTransList(HttpServletRequest request){ 60 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 61 | BootTablePage list = transMonitorService.getList(kUser.getuId()); 62 | return JsonUtils.objectToJson(list); 63 | } 64 | 65 | /** 66 | * @Title getJobList 67 | * @Description 获取作业的Top5 68 | * @param request 69 | * @return 70 | * @return String 71 | */ 72 | @RequestMapping("getJobList.shtml") 73 | public String getJobList(HttpServletRequest request){ 74 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 75 | BootTablePage list = jobMonitorService.getList(kUser.getuId()); 76 | return JsonUtils.objectToJson(list); 77 | } 78 | 79 | /** 80 | * 81 | * @Title getKettleLine 82 | * @Description TODO 83 | * @return 84 | * @return String 85 | * @throws ParseException 86 | */ 87 | @RequestMapping("getKettleLine.shtml") 88 | public String getKettleLine(HttpServletRequest request){ 89 | KUser kUser = (KUser) request.getSession().getAttribute(Constant.SESSION_ID); 90 | Map resultMap = new HashMap(); 91 | List dateList = new ArrayList(); 92 | for (int i = -6; i <= 0; i++){ 93 | Calendar instance = Calendar.getInstance(); 94 | instance.add(Calendar.DATE, i); 95 | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); 96 | String dateFormat = simpleDateFormat.format(instance.getTime()); 97 | dateList.add(dateFormat); 98 | } 99 | resultMap.put("legend", dateList); 100 | Map transLine = transMonitorService.getTransLine(kUser.getuId()); 101 | resultMap.put("trans", transLine); 102 | Map jobLine = jobMonitorService.getJobLine(kUser.getuId()); 103 | resultMap.put("job", jobLine); 104 | return ResultDto.success(resultMap); 105 | } 106 | } 107 | --------------------------------------------------------------------------------