Bläddra i källkod

调度日志-前后端,重构

xueli.xue 9 år sedan
förälder
incheckning
e26f94e4fa

+ 1 - 0
README.md Visa fil

@@ -29,4 +29,5 @@ git.osc地址:http://git.oschina.net/xuxueli0323/xxl-job
29 29
 	
30 30
 # 其他说明
31 31
 	清楚僵尸任务:qrtz_cron_triggers、qrtz_triggers、qrtz_job_details顺序删除
32
+	V1.2新增任务日志,记得执行“qrtz_trigger_log”生成表结构
32 33
 	

+ 35 - 0
doc/db/tables_trigger_log.sql Visa fil

@@ -0,0 +1,35 @@
1
+/*
2
+Navicat MySQL Data Transfer
3
+
4
+Source Server         : meme-127.0.0.1
5
+Source Server Version : 50544
6
+Source Host           : 127.0.0.1:3306
7
+Source Database       : test
8
+
9
+Target Server Type    : MYSQL
10
+Target Server Version : 50544
11
+File Encoding         : 65001
12
+
13
+Date: 2015-12-30 23:27:14
14
+*/
15
+
16
+SET FOREIGN_KEY_CHECKS=0;
17
+
18
+-- ----------------------------
19
+-- Table structure for qrtz_trigger_log
20
+-- ----------------------------
21
+DROP TABLE IF EXISTS `qrtz_trigger_log`;
22
+CREATE TABLE `qrtz_trigger_log` (
23
+  `id` int(11) NOT NULL AUTO_INCREMENT,
24
+  `job_name` varchar(255) NOT NULL,
25
+  `job_cron` varchar(128) DEFAULT NULL,
26
+  `job_class` varchar(255) DEFAULT NULL,
27
+  `job_data` varchar(2048) DEFAULT NULL,
28
+  `trigger_time` datetime DEFAULT NULL,
29
+  `trigger_status` varchar(255) DEFAULT NULL,
30
+  `trigger_msg` varchar(255) DEFAULT NULL,
31
+  `handle_time` datetime DEFAULT NULL,
32
+  `handle_status` varchar(255) DEFAULT NULL,
33
+  `handle_msg` varchar(255) DEFAULT NULL,
34
+  PRIMARY KEY (`id`)
35
+) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8;

+ 28 - 12
xxl-job-admin/src/main/java/com/xxl/job/controller/JobLogController.java Visa fil

@@ -1,5 +1,6 @@
1 1
 package com.xxl.job.controller;
2 2
 
3
+import java.text.ParseException;
3 4
 import java.util.Date;
4 5
 import java.util.HashMap;
5 6
 import java.util.List;
@@ -7,6 +8,8 @@ import java.util.Map;
7 8
 
8 9
 import javax.annotation.Resource;
9 10
 
11
+import org.apache.commons.lang.StringUtils;
12
+import org.apache.commons.lang.time.DateUtils;
10 13
 import org.springframework.stereotype.Controller;
11 14
 import org.springframework.ui.Model;
12 15
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -42,26 +45,39 @@ public class JobLogController {
42 45
 		return ReturnT.FAIL;
43 46
 	}
44 47
 	
45
-	@RequestMapping("/")
46
-	public String index(Model model) {
48
+	@RequestMapping
49
+	public String index(Model model, String jobName, String filterTime) {
50
+		model.addAttribute("jobName", jobName);
51
+		model.addAttribute("filterTime", filterTime);
47 52
 		return "joblog/index";
48 53
 	}
49 54
 	
50 55
 	@RequestMapping("/pageList")
51 56
 	@ResponseBody
52
-	public Map<String, Object> pageList(@RequestParam(required = false) String jobName,  
53
-		      @RequestParam(required = false, defaultValue = "0") int start,  
54
-		      @RequestParam(required = false, defaultValue = "10") int length) {
55
-		
56
-		System.out.println(start);
57
-		System.out.println(length);
58
-		System.out.println(jobName);
57
+	public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,  
58
+			@RequestParam(required = false, defaultValue = "10") int length,
59
+			String jobName, String filterTime) {
60
+		// parse param
61
+		Date triggerTimeStart = null;
62
+		Date triggerTimeEnd = null;
63
+		if (StringUtils.isNotBlank(filterTime)) {
64
+			String[] temp = filterTime.split(" - ");
65
+			if (temp!=null && temp.length == 2) {
66
+				try {
67
+					triggerTimeEnd = DateUtils.parseDate(temp[0], new String[]{"yyyy-MM-dd HH:mm:ss"});
68
+					triggerTimeEnd = DateUtils.parseDate(temp[1], new String[]{"yyyy-MM-dd HH:mm:ss"});
69
+				} catch (ParseException e) {
70
+					e.printStackTrace();
71
+				}
72
+			}
73
+		}
59 74
 		
60
-		List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobName);
61
-		int list_count = xxlJobLogDao.pageListCount(start, length, jobName);
75
+		// page query
76
+		List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobName, triggerTimeStart, triggerTimeEnd);
77
+		int list_count = xxlJobLogDao.pageListCount(start, length, jobName, triggerTimeStart, triggerTimeEnd);
62 78
 		
79
+		// package result
63 80
 		Map<String, Object> maps = new HashMap<String, Object>();
64
-		maps.put("draw", list_count);			// 请求次数
65 81
 	    maps.put("recordsTotal", list_count);	// 总记录数
66 82
 	    maps.put("recordsFiltered", list_count);// 过滤后的总记录数
67 83
 	    maps.put("data", list);  				// 分页列表

+ 22 - 6
xxl-job-admin/src/main/java/com/xxl/job/core/model/mapper/XxlJobLogMapper.xml Visa fil

@@ -78,9 +78,17 @@
78 78
 	<select id="pageList" parameterType="java.util.HashMap" resultMap="XxlJobLog">
79 79
 		SELECT <include refid="Base_Column_List" />
80 80
 		FROM qrtz_trigger_log AS t
81
-		<if test="jobName != null and jobName!=''">
82
-			WHERE t.job_name = #{jobName}
83
-		</if>
81
+		<trim prefix="WHERE" prefixOverrides="AND | OR" >
82
+			<if test="jobName != null and jobName!=''">
83
+				AND t.job_name = #{jobName}
84
+			</if>
85
+			<if test="triggerTimeStart != null">
86
+				AND t.trigger_time <![CDATA[ > ]]> #{triggerTimeStart}
87
+			</if>
88
+			<if test="triggerTimeEnd != null">
89
+				AND t.trigger_time <![CDATA[ < ]]> #{triggerTimeEnd}
90
+			</if>
91
+		</trim>
84 92
 		ORDER BY id DESC
85 93
 		LIMIT #{offset}, #{pagesize}
86 94
 	</select>
@@ -88,9 +96,17 @@
88 96
 	<select id="pageListCount" parameterType="java.util.HashMap" resultType="int">
89 97
 		SELECT count(1)
90 98
 		FROM qrtz_trigger_log AS t
91
-		<if test="jobName != null and jobName!=''">
92
-			WHERE t.job_name = #{jobName}
93
-		</if>
99
+		<trim prefix="WHERE" prefixOverrides="AND | OR" >
100
+			<if test="jobName != null and jobName!=''">
101
+				AND t.job_name = #{jobName}
102
+			</if>
103
+			<if test="triggerTimeStart != null">
104
+				AND t.trigger_time <![CDATA[ > ]]> #{triggerTimeStart}
105
+			</if>
106
+			<if test="triggerTimeEnd != null">
107
+				AND t.trigger_time <![CDATA[ < ]]> #{triggerTimeEnd}
108
+			</if>
109
+		</trim>
94 110
 	</select>
95 111
 	
96 112
 </mapper>

+ 3 - 2
xxl-job-admin/src/main/java/com/xxl/job/dao/IXxlJobLogDao.java Visa fil

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.dao;
2 2
 
3 3
 
4
+import java.util.Date;
4 5
 import java.util.List;
5 6
 
6 7
 import com.xxl.job.core.model.XxlJobLog;
@@ -15,8 +16,8 @@ public interface IXxlJobLogDao {
15 16
 	
16 17
 	public int updateHandleInfo(XxlJobLog xxlJobLog);
17 18
 	
18
-	public List<XxlJobLog> pageList(int offset, int pagesize,String jobName);
19
+	public List<XxlJobLog> pageList(int offset, int pagesize,String jobName, Date triggerTimeStart, Date triggerTimeEnd);
19 20
 	
20
-	public int pageListCount(int offset, int pagesize,String jobName);
21
+	public int pageListCount(int offset, int pagesize,String jobName, Date triggerTimeStart, Date triggerTimeEnd);
21 22
 	
22 23
 }

+ 7 - 2
xxl-job-admin/src/main/java/com/xxl/job/dao/impl/XxlJobLogDaoImpl.java Visa fil

@@ -1,5 +1,6 @@
1 1
 package com.xxl.job.dao.impl;
2 2
 
3
+import java.util.Date;
3 4
 import java.util.HashMap;
4 5
 import java.util.List;
5 6
 
@@ -38,20 +39,24 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
38 39
 	}
39 40
 
40 41
 	@Override
41
-	public List<XxlJobLog> pageList(int offset, int pagesize, String jobName) {
42
+	public List<XxlJobLog> pageList(int offset, int pagesize,String jobName, Date triggerTimeStart, Date triggerTimeEnd) {
42 43
 		HashMap<String, Object> params = new HashMap<String, Object>();
43 44
 		params.put("offset", offset);
44 45
 		params.put("pagesize", pagesize);
45 46
 		params.put("jobName", jobName);
47
+		params.put("triggerTimeStart", triggerTimeStart);
48
+		params.put("triggerTimeEnd", triggerTimeEnd);
46 49
 		return sqlSessionTemplate.selectList("XxlJobLogMapper.pageList", params);
47 50
 	}
48 51
 
49 52
 	@Override
50
-	public int pageListCount(int offset, int pagesize, String jobName) {
53
+	public int pageListCount(int offset, int pagesize,String jobName, Date triggerTimeStart, Date triggerTimeEnd) {
51 54
 		HashMap<String, Object> params = new HashMap<String, Object>();
52 55
 		params.put("offset", offset);
53 56
 		params.put("pagesize", pagesize);
54 57
 		params.put("jobName", jobName);
58
+		params.put("triggerTimeStart", triggerTimeStart);
59
+		params.put("triggerTimeEnd", triggerTimeEnd);
55 60
 		return sqlSessionTemplate.selectOne("XxlJobLogMapper.pageListCount", params);
56 61
 	}
57 62
 	

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl Visa fil

@@ -65,7 +65,7 @@
65 65
 			<ul class="sidebar-menu">
66 66
 				<li class="header">常用模块</li>
67 67
 				<li class="nav-click" ><a href="${request.contextPath}/job/"><i class="fa fa-circle-o text-red"></i> <span>调度管理</span></a></li>
68
-				<li class="nav-click" ><a href="${request.contextPath}/joblog/"><i class="fa fa-circle-o text-yellow"></i><span>调度日志</span></a></li>
68
+				<li class="nav-click" ><a href="${request.contextPath}/joblog"><i class="fa fa-circle-o text-yellow"></i><span>调度日志</span></a></li>
69 69
 				<li class="nav-click" ><a href="${request.contextPath}/help"><i class="fa fa-circle-o text-yellow"></i><span>使用教程</span></a></li>
70 70
 			</ul>
71 71
 		</section>

+ 3 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/job/index.ftl Visa fil

@@ -80,8 +80,10 @@
80 80
 													<button class="btn btn-info btn-xs job_operate" type="job_resume" type="button">恢复</button>
81 81
 												</#if>
82 82
 												<button class="btn btn-info btn-xs job_operate" type="job_trigger" type="button">执行一次</button>
83
-											  	<button class="btn btn-danger btn-xs job_operate" type="job_del" type="button">删除</button>
84 83
 												<button class="btn btn-info btn-xs update" type="button">更新corn</button>
84
+											  	<button class="btn btn-danger btn-xs job_operate" type="job_del" type="button">删除</button>
85
+											  	<button class="btn btn-warning btn-xs" type="job_del" type="button" 
86
+											  		onclick="javascript:window.open('${request.contextPath}/joblog?jobName=${item['TriggerKey'].name}')" >查看日志</button>
85 87
 											</p>
86 88
 					                  	</td>
87 89
 					                </tr>

+ 35 - 22
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/index.ftl Visa fil

@@ -6,14 +6,8 @@
6 6
 	<@netCommon.commonStyle />
7 7
 	<!-- DataTables -->
8 8
   	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.css">
9
-  
10
-	<!-- DataTables CSS -->
11
-	<link rel="stylesheet" type="text/css" href="http://cdn.datatables.net/1.10.7/css/jquery.dataTables.css">
12
-	<!-- jQuery -->
13
-	<script type="text/javascript" charset="utf8" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
14
-	<!-- DataTables -->
15
-	<script type="text/javascript" charset="utf8" src="http://cdn.datatables.net/1.10.7/js/jquery.dataTables.js"></script>
16
-  
9
+  	<!-- daterangepicker -->
10
+  	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/daterangepicker/daterangepicker-bs3.css">
17 11
 </head>
18 12
 <body class="hold-transition skin-blue sidebar-mini">
19 13
 <div class="wrapper">
@@ -35,35 +29,51 @@
35 29
 		
36 30
 		<!-- Main content -->
37 31
 	    <section class="content">
32
+	    	<div class="row">
33
+	            <div class="col-xs-5">
34
+              		<div class="input-group">
35
+                		<span class="input-group-addon">
36
+	                  		调度时间
37
+	                	</span>
38
+	                	<input type="text" class="form-control" id="filterTime" readonly 
39
+	                		value="<#if triggerTimeStart?exists && triggerTimeEnd?exists >${triggerTimeStart?if_exists?string('yyyy-MM-dd HH:mm:ss')} - ${triggerTimeEnd?if_exists?string('yyyy-MM-dd HH:mm:ss')}</#if>"  >
40
+	              	</div>
41
+	            </div>
42
+	            <div class="col-xs-5">
43
+	              	<div class="input-group">
44
+	                	<span class="input-group-addon">
45
+	                  		jobName
46
+	                	</span>
47
+	                	<input type="text" class="form-control" id="jobName" value="${jobName}" autocomplete="on" >
48
+	              	</div>
49
+	            </div>
50
+	            <div class="col-xs-2">
51
+	            	<button class="btn btn-block btn-info" id="searchBtn">搜索</button>
52
+	            </div>
53
+          	</div>
54
+			
38 55
 			<div class="row">
39 56
 				<div class="col-xs-12">
40 57
 					<div class="box">
41
-			            <div class="box-header">
42
-			            	<h3 class="box-title">调度列表</h3>
43
-			            </div>
58
+			            <div class="box-header"><h3 class="box-title">调度日志</h3></div>
44 59
 			            <div class="box-body">
45
-			              	<table id="joblog_list" class="table table-bordered table-striped display">
60
+			              	<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >
46 61
 				                <thead>
47 62
 					            	<tr>
48 63
 					                	<th>id</th>
49 64
 					                  	<th>jobName</th>
50 65
 					                  	<th>jobCron</th>
51 66
 					                  	<th>jobClass</th>
67
+					                  	<th>jobData</th>
68
+					                  	<th>triggerTime</th>
69
+					                  	<th>triggerStatus</th>
70
+					                  	<th>triggerMsg</th>
52 71
 					                  	<th>handleTime</th>
53 72
 					                  	<th>handleStatus</th>
73
+					                  	<th>handleMsg</th>
54 74
 					                </tr>
55 75
 				                </thead>
56 76
 				                <tbody></tbody>
57
-				                <tfoot>
58
-					            	<tr>
59
-					                  	<th>id</th>
60
-					                  	<th>jobName</th>
61
-					                  	<th>jobCron</th>
62
-					                  	<th>jobClass</th>
63
-					                  	<th>handleTime</th>
64
-					                  	<th>handleStatus</th>
65
-					                </tr>
66
-				                </tfoot>
67 77
 							</table>
68 78
 						</div>
69 79
 					</div>
@@ -83,6 +93,9 @@
83 93
 <!-- DataTables -->
84 94
 <script src="${request.contextPath}/static/adminlte/plugins/datatables/jquery.dataTables.min.js"></script>
85 95
 <script src="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.min.js"></script>
96
+<!-- daterangepicker -->
97
+<script src="${request.contextPath}/static/adminlte/plugins/daterangepicker/moment.min.js"></script>
98
+<script src="${request.contextPath}/static/adminlte/plugins/daterangepicker/daterangepicker.js"></script>
86 99
 <script>var base_url = '${request.contextPath}';</script>
87 100
 <script src="${request.contextPath}/static/js/joblog.index.1.js"></script>
88 101
 </body>

+ 335 - 0
xxl-job-admin/src/main/webapp/static/adminlte/plugins/daterangepicker/daterangepicker-bs3.css Visa fil

@@ -0,0 +1,335 @@
1
+/*!
2
+ * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x
3
+ *
4
+ * Copyright 2013-2015 Dan Grossman ( http://www.dangrossman.info )
5
+ * Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php
6
+ *
7
+ * Built for http://www.improvely.com
8
+ */
9
+
10
+ .daterangepicker.dropdown-menu {
11
+  max-width: none;
12
+  z-index: 3000;
13
+}
14
+
15
+.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar {
16
+  float: left;
17
+  margin: 4px;
18
+}
19
+
20
+.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar,
21
+.daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar {
22
+  float: right;
23
+  margin: 4px;
24
+}
25
+
26
+.daterangepicker.single .ranges, .daterangepicker.single .calendar {
27
+  float: none;
28
+}
29
+
30
+.daterangepicker .ranges {
31
+  width: 160px;
32
+  text-align: left;
33
+}
34
+
35
+.daterangepicker .ranges .range_inputs>div {
36
+  float: left;
37
+}
38
+
39
+.daterangepicker .ranges .range_inputs>div:nth-child(2) {
40
+  padding-left: 11px;
41
+}
42
+
43
+.daterangepicker .calendar {
44
+  display: none;
45
+  max-width: 270px;
46
+}
47
+
48
+.daterangepicker.show-calendar .calendar {
49
+    display: block;
50
+}
51
+
52
+.daterangepicker .calendar.single .calendar-date {
53
+  border: none;
54
+}
55
+
56
+.daterangepicker .calendar th, .daterangepicker .calendar td {
57
+  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
58
+  white-space: nowrap;
59
+  text-align: center;
60
+  min-width: 32px;
61
+}
62
+
63
+.daterangepicker .daterangepicker_start_input label,
64
+.daterangepicker .daterangepicker_end_input label {
65
+  color: #333;
66
+  display: block;
67
+  font-size: 11px;
68
+  font-weight: normal;
69
+  height: 20px;
70
+  line-height: 20px;
71
+  margin-bottom: 2px;
72
+  text-shadow: #fff 1px 1px 0px;
73
+  text-transform: uppercase;
74
+  width: 74px;
75
+}
76
+
77
+.daterangepicker .ranges input {
78
+  font-size: 11px;
79
+}
80
+
81
+.daterangepicker .ranges .input-mini {
82
+  border: 1px solid #ccc;
83
+  border-radius: 4px;
84
+  color: #555;
85
+  display: block;
86
+  font-size: 11px;
87
+  height: 30px;
88
+  line-height: 30px;
89
+  vertical-align: middle;
90
+  margin: 0 0 10px 0;
91
+  padding: 0 6px;
92
+  width: 74px;
93
+}
94
+
95
+.daterangepicker .ranges ul {
96
+  list-style: none;
97
+  margin: 0;
98
+  padding: 0;
99
+}
100
+
101
+.daterangepicker .ranges li {
102
+  font-size: 13px;
103
+  background: #f5f5f5;
104
+  border: 1px solid #f5f5f5;
105
+  color: #08c;
106
+  padding: 3px 12px;
107
+  margin-bottom: 8px;
108
+  -webkit-border-radius: 5px;
109
+  -moz-border-radius: 5px;
110
+  border-radius: 5px;
111
+  cursor: pointer;
112
+}
113
+
114
+.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover {
115
+  background: #08c;
116
+  border: 1px solid #08c;
117
+  color: #fff;
118
+}
119
+
120
+.daterangepicker .calendar-date {
121
+  border: 1px solid #ddd;
122
+  padding: 4px;
123
+  border-radius: 4px;
124
+  background: #fff;
125
+}
126
+
127
+.daterangepicker .calendar-time {
128
+  text-align: center;
129
+  margin: 8px auto 0 auto;
130
+  line-height: 30px;
131
+}
132
+
133
+.daterangepicker {
134
+  position: absolute;
135
+  background: #fff;
136
+  top: 100px;
137
+  left: 20px;
138
+  padding: 4px;
139
+  margin-top: 1px;
140
+  -webkit-border-radius: 4px;
141
+  -moz-border-radius: 4px;
142
+  border-radius: 4px;
143
+}
144
+
145
+.daterangepicker.opensleft:before {
146
+  position: absolute;
147
+  top: -7px;
148
+  right: 9px;
149
+  display: inline-block;
150
+  border-right: 7px solid transparent;
151
+  border-bottom: 7px solid #ccc;
152
+  border-left: 7px solid transparent;
153
+  border-bottom-color: rgba(0, 0, 0, 0.2);
154
+  content: '';
155
+}
156
+
157
+.daterangepicker.opensleft:after {
158
+  position: absolute;
159
+  top: -6px;
160
+  right: 10px;
161
+  display: inline-block;
162
+  border-right: 6px solid transparent;
163
+  border-bottom: 6px solid #fff;
164
+  border-left: 6px solid transparent;
165
+  content: '';
166
+}
167
+
168
+.daterangepicker.openscenter:before {
169
+  position: absolute;
170
+  top: -7px;
171
+  left: 0;  
172
+  right: 0;
173
+  width: 0;
174
+  margin-left: auto;
175
+  margin-right: auto;
176
+  display: inline-block;
177
+  border-right: 7px solid transparent;
178
+  border-bottom: 7px solid #ccc;
179
+  border-left: 7px solid transparent;
180
+  border-bottom-color: rgba(0, 0, 0, 0.2);
181
+  content: '';
182
+}
183
+
184
+.daterangepicker.openscenter:after {
185
+  position: absolute;
186
+  top: -6px;
187
+  left: 0;  
188
+  right: 0;  
189
+  width: 0;
190
+  margin-left: auto;
191
+  margin-right: auto;
192
+  display: inline-block;
193
+  border-right: 6px solid transparent;
194
+  border-bottom: 6px solid #fff;
195
+  border-left: 6px solid transparent;
196
+  content: '';
197
+}
198
+
199
+.daterangepicker.opensright:before {
200
+  position: absolute;
201
+  top: -7px;
202
+  left: 9px;
203
+  display: inline-block;
204
+  border-right: 7px solid transparent;
205
+  border-bottom: 7px solid #ccc;
206
+  border-left: 7px solid transparent;
207
+  border-bottom-color: rgba(0, 0, 0, 0.2);
208
+  content: '';
209
+}
210
+
211
+.daterangepicker.opensright:after {
212
+  position: absolute;
213
+  top: -6px;
214
+  left: 10px;
215
+  display: inline-block;
216
+  border-right: 6px solid transparent;
217
+  border-bottom: 6px solid #fff;
218
+  border-left: 6px solid transparent;
219
+  content: '';
220
+}
221
+
222
+.daterangepicker.dropup{
223
+  margin-top: -5px;
224
+}
225
+.daterangepicker.dropup:before{
226
+  top: initial;
227
+  bottom:-7px;
228
+  border-bottom: initial;
229
+  border-top: 7px solid #ccc;
230
+}
231
+.daterangepicker.dropup:after{
232
+  top: initial;
233
+  bottom:-6px;
234
+  border-bottom: initial;
235
+  border-top: 6px solid #fff;
236
+}
237
+
238
+.daterangepicker table {
239
+  width: 100%;
240
+  margin: 0;
241
+}
242
+
243
+.daterangepicker td, .daterangepicker th {
244
+  text-align: center;
245
+  width: 20px;
246
+  height: 20px;
247
+  -webkit-border-radius: 4px;
248
+  -moz-border-radius: 4px;
249
+  border-radius: 4px;
250
+  cursor: pointer;
251
+  white-space: nowrap;
252
+}
253
+
254
+.daterangepicker td.off {
255
+  color: #999;
256
+}
257
+
258
+.daterangepicker td.disabled, .daterangepicker option.disabled {
259
+  color: #999;
260
+}
261
+
262
+.daterangepicker td.available:hover, .daterangepicker th.available:hover {
263
+  background: #eee;
264
+}
265
+
266
+.daterangepicker td.in-range {
267
+  background: #ebf4f8;
268
+  -webkit-border-radius: 0;
269
+  -moz-border-radius: 0;
270
+  border-radius: 0;
271
+}
272
+
273
+.daterangepicker td.start-date {
274
+  -webkit-border-radius: 4px 0 0 4px;
275
+  -moz-border-radius: 4px 0 0 4px;
276
+  border-radius: 4px 0 0 4px;
277
+}
278
+
279
+.daterangepicker td.end-date {
280
+  -webkit-border-radius: 0 4px 4px 0;
281
+  -moz-border-radius: 0 4px 4px 0;
282
+  border-radius: 0 4px 4px 0;
283
+}
284
+
285
+.daterangepicker td.start-date.end-date {
286
+  -webkit-border-radius: 4px;
287
+  -moz-border-radius: 4px;
288
+  border-radius: 4px;
289
+}
290
+
291
+.daterangepicker td.active, .daterangepicker td.active:hover {
292
+  background-color: #357ebd;
293
+  border-color: #3071a9;
294
+  color: #fff;
295
+}
296
+
297
+.daterangepicker td.week, .daterangepicker th.week {
298
+  font-size: 80%;
299
+  color: #ccc;
300
+}
301
+
302
+.daterangepicker select.monthselect, .daterangepicker select.yearselect {
303
+  font-size: 12px;
304
+  padding: 1px;
305
+  height: auto;
306
+  margin: 0;
307
+  cursor: default;
308
+}
309
+
310
+.daterangepicker select.monthselect {
311
+  margin-right: 2%;
312
+  width: 56%;
313
+}
314
+
315
+.daterangepicker select.yearselect {
316
+  width: 40%;
317
+}
318
+
319
+.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect {
320
+  width: 50px;
321
+  margin-bottom: 0;
322
+}
323
+
324
+.daterangepicker_start_input {
325
+  float: left;
326
+}
327
+
328
+.daterangepicker_end_input {
329
+  float: left; 
330
+  padding-left: 11px
331
+}
332
+
333
+.daterangepicker th.month {
334
+  width: auto;
335
+}

Filskillnaden har hållits tillbaka eftersom den är för stor
+ 1304 - 0
xxl-job-admin/src/main/webapp/static/adminlte/plugins/daterangepicker/daterangepicker.js


Filskillnaden har hållits tillbaka eftersom den är för stor
+ 7 - 0
xxl-job-admin/src/main/webapp/static/adminlte/plugins/daterangepicker/moment.min.js


+ 58 - 7
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js Visa fil

@@ -1,20 +1,39 @@
1 1
 $(function() {
2
+
2 3
 	// init date tables
3
-	$("#joblog_list").dataTable({
4
-		"serverSide": true,
4
+	var logTable = $("#joblog_list").dataTable({
5
+		"deferRender": true,
6
+		"processing" : true, 
7
+	    "serverSide": true,
5 8
 		"ajax": {
6
-	        url: base_url + "/joblog/pageList"
9
+	        url: base_url + "/joblog/pageList" ,
10
+	        data : function ( d ) {
11
+                d.filterTime = $('#filterTime').val();
12
+                d.jobName = $('#jobName').val()
13
+            }
7 14
 	    },
8
-	    "processing" : true, 
9
-	    "deferRender": true,
15
+	    "scrollX": true,
10 16
 	    "columns": [
11
-	                { "data": 'id', "bSortable": false, "visible" : true},
17
+	                { "data": 'id', "bSortable": false, "visible" : false},
12 18
 	                { "data": 'jobName', "bSortable": false},
13 19
 	                { "data": 'jobCron', "bSortable": false},
14 20
 	                { "data": 'jobClass', "bSortable": false},
21
+	                { "data": 'jobData', "bSortable": false},
22
+	                { 
23
+	                	"data": 'triggerTime', 
24
+	                	"bSortable": false, 
25
+	                	"render": function ( data, type, row ) {
26
+	                		return moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss");
27
+	                	}
28
+	                },
29
+	                { "data": 'triggerStatus', "bSortable": false},
30
+	                { "data": 'triggerMsg',"bSortable": false},
15 31
 	                { "data": 'handleTime',"bSortable": false},
16
-	                { "data": 'handleStatus' , "bSortable": false}
32
+	                { "data": 'handleStatus',"bSortable": false},
33
+	                { "data": 'handleMsg' , "bSortable": false}
17 34
 	            ],
35
+	    "searching": false,
36
+	    "ordering": true,
18 37
 		"language" : {
19 38
 			"sProcessing" : "处理中...",
20 39
 			"sLengthMenu" : "每页 _MENU_ 条记录",
@@ -41,4 +60,36 @@ $(function() {
41 60
 		}
42 61
 	});
43 62
 	
63
+	// 过滤时间
64
+	$('#filterTime').daterangepicker({
65
+		timePicker: true, 			//是否显示小时和分钟
66
+		timePickerIncrement: 10, 	//时间的增量,单位为分钟
67
+		timePicker12Hour : false,	//是否使用12小时制来显示时间
68
+		format: 'YYYY-MM-DD HH:mm:ss',
69
+		separator : ' - ',
70
+		ranges : {
71
+            '最近1小时': [moment().subtract('hours',1), moment()],
72
+            '今日': [moment().startOf('day'), moment()],
73
+            '昨日': [moment().subtract('days', 1).startOf('day'), moment().subtract('days', 1).endOf('day')],
74
+            '最近7日': [moment().subtract('days', 6), moment()],
75
+            '最近30日': [moment().subtract('days', 29), moment()]
76
+        },
77
+        opens : 'right', //日期选择框的弹出位置
78
+        locale : {
79
+        	customRangeLabel : '自定义',
80
+            applyLabel : '确定',
81
+            cancelLabel : '取消',
82
+            fromLabel : '起始时间',
83
+            toLabel : '结束时间',
84
+            daysOfWeek : [ '日', '一', '二', '三', '四', '五', '六' ],
85
+            monthNames : [ '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月' ],
86
+            firstDay : 1
87
+        }
88
+	});
89
+	
90
+	// 搜索按钮
91
+	$('#searchBtn').on('click', function(){
92
+		logTable.fnDraw();
93
+	});
94
+	
44 95
 });

+ 2 - 2
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogTest.java Visa fil

@@ -57,8 +57,8 @@ public class XxlJobLogTest {
57 57
 	
58 58
 	@Test
59 59
 	public void pageList(){
60
-		List<XxlJobLog> list = xxlJobLogDao.pageList(0, 20, null);
61
-		int list_count = xxlJobLogDao.pageListCount(0, 20, null);
60
+		List<XxlJobLog> list = xxlJobLogDao.pageList(0, 20, null, null, null);
61
+		int list_count = xxlJobLogDao.pageListCount(0, 20, null, null, null);
62 62
 		
63 63
 		System.out.println(list);
64 64
 		System.out.println(list_count);

+ 1 - 1
xxl-job-client/src/main/java/com/xxl/job/client/handler/HandlerRepository.java Visa fil

@@ -94,7 +94,7 @@ public class HandlerRepository {
94 94
 							new Object[]{handlerData, _status, _msg, callback_response, this});
95 95
 				} else {
96 96
 					try {
97
-						TimeUnit.SECONDS.sleep(3);
97
+						TimeUnit.SECONDS.sleep(1);
98 98
 					} catch (InterruptedException e) {
99 99
 						e.printStackTrace();
100 100
 					}