Przeglądaj źródła

任务分组, 支持在线维护

xueli.xue 8 lat temu
rodzic
commit
204d7848fe

+ 7 - 0
db/tables_xxl_job.sql Wyświetl plik

@@ -203,5 +203,12 @@ CREATE TABLE XXL_JOB_QRTZ_TRIGGER_REGISTRY (
203 203
   PRIMARY KEY (`id`)
204 204
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
205 205
 
206
+CREATE TABLE XXL_JOB_QRTZ_TRIGGER_GROUP (
207
+  `group_name` varchar(255) NOT NULL,
208
+  `group_desc` varchar(255) NOT NULL,
209
+  `order` int(11) NOT NULL,
210
+  PRIMARY KEY (`group_name`)
211
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
212
+
206 213
 commit;
207 214
 

+ 80 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java Wyświetl plik

@@ -0,0 +1,80 @@
1
+package com.xxl.job.admin.controller;
2
+
3
+import com.xxl.job.admin.core.model.ReturnT;
4
+import com.xxl.job.admin.core.model.XxlJobGroup;
5
+import com.xxl.job.admin.dao.IXxlJobGroupDao;
6
+import com.xxl.job.admin.dao.IXxlJobInfoDao;
7
+import org.apache.commons.lang.StringUtils;
8
+import org.springframework.stereotype.Controller;
9
+import org.springframework.ui.Model;
10
+import org.springframework.web.bind.annotation.RequestMapping;
11
+import org.springframework.web.bind.annotation.ResponseBody;
12
+
13
+import javax.annotation.Resource;
14
+import java.util.List;
15
+
16
+/**
17
+ * job group controller
18
+ * @author xuxueli 2016-10-02 20:52:56
19
+ */
20
+@Controller
21
+@RequestMapping("/jobgroup")
22
+public class JobGroupController {
23
+
24
+	@Resource
25
+	public IXxlJobInfoDao xxlJobInfoDao;
26
+
27
+	@Resource
28
+	public IXxlJobGroupDao xxlJobGroupDao;
29
+
30
+	@RequestMapping
31
+	public String index(Model model) {
32
+		List<XxlJobGroup> list = xxlJobGroupDao.findAll();
33
+		model.addAttribute("list", list);
34
+		return "jobgroup/jobgroup.index";
35
+	}
36
+
37
+	@RequestMapping("/save")
38
+	@ResponseBody
39
+	public ReturnT<String> save(XxlJobGroup xxlJobGroup){
40
+
41
+		// valid
42
+		if (xxlJobGroup.getGroupName()==null || StringUtils.isBlank(xxlJobGroup.getGroupName())) {
43
+			return new ReturnT<String>(500, "请输入分组");
44
+		}
45
+		if (xxlJobGroup.getGroupDesc()==null || StringUtils.isBlank(xxlJobGroup.getGroupDesc())) {
46
+			return new ReturnT<String>(500, "请输入描述");
47
+		}
48
+
49
+		// check repeat
50
+		XxlJobGroup group = xxlJobGroupDao.load(xxlJobGroup.getGroupName());
51
+		if (group!=null) {
52
+			return new ReturnT<String>(500, "分组已存在, 请勿重复添加");
53
+		}
54
+
55
+		int ret = xxlJobGroupDao.save(xxlJobGroup);
56
+		return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
57
+	}
58
+
59
+	@RequestMapping("/update")
60
+	@ResponseBody
61
+	public ReturnT<String> update(XxlJobGroup xxlJobGroup){
62
+		int ret = xxlJobGroupDao.update(xxlJobGroup);
63
+		return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
64
+	}
65
+
66
+	@RequestMapping("/remove")
67
+	@ResponseBody
68
+	public ReturnT<String> remove(String groupName){
69
+
70
+		// valid
71
+		int count = xxlJobInfoDao.pageListCount(0, 10, groupName, null);
72
+		if (count > 0) {
73
+			return new ReturnT<String>(500, "该分组使用中, 不可删除");
74
+		}
75
+
76
+		int ret = xxlJobGroupDao.remove(groupName);
77
+		return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
78
+	}
79
+
80
+}

+ 35 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java Wyświetl plik

@@ -0,0 +1,35 @@
1
+package com.xxl.job.admin.core.model;
2
+
3
+/**
4
+ * Created by xuxueli on 16/9/30.
5
+ */
6
+public class XxlJobGroup {
7
+
8
+    private String groupName;
9
+    private String groupDesc;
10
+    private int order;
11
+
12
+    public String getGroupName() {
13
+        return groupName;
14
+    }
15
+
16
+    public void setGroupName(String groupName) {
17
+        this.groupName = groupName;
18
+    }
19
+
20
+    public String getGroupDesc() {
21
+        return groupDesc;
22
+    }
23
+
24
+    public void setGroupDesc(String groupDesc) {
25
+        this.groupDesc = groupDesc;
26
+    }
27
+
28
+    public int getOrder() {
29
+        return order;
30
+    }
31
+
32
+    public void setOrder(int order) {
33
+        this.order = order;
34
+    }
35
+}

+ 21 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobGroupDao.java Wyświetl plik

@@ -0,0 +1,21 @@
1
+package com.xxl.job.admin.dao;
2
+
3
+import com.xxl.job.admin.core.model.XxlJobGroup;
4
+
5
+import java.util.List;
6
+
7
+/**
8
+ * Created by xuxueli on 16/9/30.
9
+ */
10
+public interface IXxlJobGroupDao {
11
+
12
+    public List<XxlJobGroup> findAll();
13
+
14
+    public int save(XxlJobGroup xxlJobGroup);
15
+
16
+    public int update(XxlJobGroup xxlJobGroup);
17
+
18
+    public int remove(String groupName);
19
+
20
+    public XxlJobGroup load(String groupName);
21
+}

+ 46 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobGroupDaoImpl.java Wyświetl plik

@@ -0,0 +1,46 @@
1
+package com.xxl.job.admin.dao.impl;
2
+
3
+import com.xxl.job.admin.core.model.XxlJobGroup;
4
+import com.xxl.job.admin.dao.IXxlJobGroupDao;
5
+import org.mybatis.spring.SqlSessionTemplate;
6
+import org.springframework.stereotype.Repository;
7
+
8
+import javax.annotation.Resource;
9
+import java.util.List;
10
+
11
+/**
12
+ * Created by xuxueli on 16/9/30.
13
+ */
14
+@Repository
15
+public class XxlJobGroupDaoImpl implements IXxlJobGroupDao {
16
+
17
+    @Resource
18
+    public SqlSessionTemplate sqlSessionTemplate;
19
+
20
+    @Override
21
+    public List<XxlJobGroup> findAll() {
22
+        return sqlSessionTemplate.selectList("XxlJobGroupMapper.findAll");
23
+    }
24
+
25
+    @Override
26
+    public int save(XxlJobGroup xxlJobGroup) {
27
+        return sqlSessionTemplate.update("XxlJobGroupMapper.save", xxlJobGroup);
28
+    }
29
+
30
+    @Override
31
+    public int update(XxlJobGroup xxlJobGroup) {
32
+        return sqlSessionTemplate.update("XxlJobGroupMapper.update", xxlJobGroup);
33
+    }
34
+
35
+    @Override
36
+    public int remove(String groupName) {
37
+        return sqlSessionTemplate.delete("XxlJobGroupMapper.remove", groupName);
38
+    }
39
+
40
+    @Override
41
+    public XxlJobGroup load(String groupName) {
42
+        return sqlSessionTemplate.selectOne("XxlJobGroupMapper.load", groupName);
43
+    }
44
+
45
+
46
+}

+ 47 - 0
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml Wyświetl plik

@@ -0,0 +1,47 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
3
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4
+<mapper namespace="XxlJobGroupMapper">
5
+	
6
+	<resultMap id="XxlJobGroup" type="com.xxl.job.admin.core.model.XxlJobGroup" >
7
+	    <result column="group_name" property="groupName" />
8
+	    <result column="group_desc" property="groupDesc" />
9
+	    <result column="order" property="order" />
10
+	</resultMap>
11
+
12
+	<sql id="Base_Column_List">
13
+		t.group_name,
14
+		t.group_desc,
15
+		t.order
16
+	</sql>
17
+
18
+	<select id="findAll" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
19
+		SELECT <include refid="Base_Column_List" />
20
+		FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
21
+		ORDER BY t.order ASC
22
+	</select>
23
+
24
+	<insert id="save" parameterType="java.util.Map" >
25
+		INSERT INTO XXL_JOB_QRTZ_TRIGGER_GROUP ( `group_name`, `group_desc`, `order`)
26
+		values ( #{groupName}, #{groupDesc}, #{order});
27
+	</insert>
28
+
29
+	<update id="update" parameterType="java.util.Map" >
30
+		UPDATE XXL_JOB_QRTZ_TRIGGER_GROUP
31
+		SET `group_desc` = #{groupDesc},
32
+			`order` = #{order}
33
+		WHERE group_name = #{groupName}
34
+	</update>
35
+
36
+	<delete id="remove" parameterType="java.lang.String" >
37
+		DELETE FROM XXL_JOB_QRTZ_TRIGGER_GROUP
38
+		WHERE group_name = #{groupName}
39
+	</delete>
40
+
41
+	<select id="load" parameterType="java.lang.String" resultMap="XxlJobGroup">
42
+		SELECT <include refid="Base_Column_List" />
43
+		FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
44
+		WHERE t.group_name = #{groupName}
45
+	</select>
46
+
47
+</mapper>

+ 1 - 0
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl Wyświetl plik

@@ -85,6 +85,7 @@
85 85
 				<li class="header">常用模块</li>
86 86
 				<li class="nav-click" ><a href="${request.contextPath}/jobinfo"><i class="fa fa-circle-o text-red"></i> <span>调度管理</span></a></li>
87 87
 				<li class="nav-click" ><a href="${request.contextPath}/joblog"><i class="fa fa-circle-o text-yellow"></i><span>调度日志</span></a></li>
88
+                <li class="nav-click" ><a href="${request.contextPath}/jobgroup"><i class="fa fa-circle-o text-red"></i> <span>分组管理</span></a></li>
88 89
 				<li class="nav-click" ><a href="${request.contextPath}/help"><i class="fa fa-circle-o text-yellow"></i><span>使用教程</span></a></li>
89 90
 			</ul>
90 91
 		</section>

+ 148 - 0
xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl Wyświetl plik

@@ -0,0 +1,148 @@
1
+<!DOCTYPE html>
2
+<html>
3
+<head>
4
+  	<title>任务调度中心</title>
5
+  	<#import "/common/common.macro.ftl" as netCommon>
6
+	<@netCommon.commonStyle />
7
+	<!-- DataTables -->
8
+  	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.css">
9
+  	<!-- daterangepicker -->
10
+  	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/daterangepicker/daterangepicker-bs3.css">
11
+</head>
12
+<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["adminlte_settings"].value >sidebar-collapse</#if> ">
13
+<div class="wrapper">
14
+	<!-- header -->
15
+	<@netCommon.commonHeader />
16
+	<!-- left -->
17
+	<@netCommon.commonLeft />
18
+	
19
+	<!-- Content Wrapper. Contains page content -->
20
+	<div class="content-wrapper">
21
+		<!-- Content Header (Page header) -->
22
+		<section class="content-header">
23
+			<h1>分组管理<small>任务调度中心</small></h1>
24
+		</section>
25
+
26
+		<!-- Main content -->
27
+	    <section class="content">
28
+			
29
+			<div class="row">
30
+				<div class="col-xs-12">
31
+					<div class="box">
32
+			            <div class="box-header">
33
+							<h3 class="box-title">分组管理</h3>
34
+                            <button class="btn btn-success btn-xs pull-left2 add" >+新增分组</button>
35
+						</div>
36
+			            <div class="box-body">
37
+			              	<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >
38
+				                <thead>
39
+					            	<tr>
40
+                                        <th name="groupDesc" >名称</th>
41
+                                        <th name="groupName" >AppName</th>
42
+					                  	<th name="order" >排序</th>
43
+                                        <th name="operate" >操作</th>
44
+					                </tr>
45
+				                </thead>
46
+                                <tbody>
47
+								<#if list?exists && list?size gt 0>
48
+								<#list list as group>
49
+									<tr>
50
+                                        <td>${group.groupDesc}</td>
51
+                                        <td>${group.groupName}</td>
52
+                                        <td>${group.order}</td>
53
+										<td>
54
+                                            <button class="btn btn-warning btn-xs update" groupName="${group.groupName}" groupDesc="${group.groupDesc}" order="${group.order}" >编辑</button>
55
+                                            <button class="btn btn-danger btn-xs remove" groupName="${group.groupName}" >删除</button>
56
+										</td>
57
+									</tr>
58
+								</#list>
59
+								</#if>
60
+								</tbody>
61
+							</table>
62
+						</div>
63
+					</div>
64
+				</div>
65
+			</div>
66
+	    </section>
67
+	</div>
68
+
69
+    <!-- 新增.模态框 -->
70
+    <div class="modal fade" id="addModal" tabindex="-1" role="dialog"  aria-hidden="true">
71
+        <div class="modal-dialog ">
72
+            <div class="modal-content">
73
+                <div class="modal-header">
74
+                    <h4 class="modal-title" >新增分组</h4>
75
+                </div>
76
+                <div class="modal-body">
77
+                    <form class="form-horizontal form" role="form" >
78
+                        <div class="form-group">
79
+                            <label for="lastname" class="col-sm-2 control-label">分组<font color="red">*</font></label>
80
+                            <div class="col-sm-10"><input type="text" class="form-control" name="groupName" placeholder="请输入“分组”" maxlength="200" ></div>
81
+                        </div>
82
+                        <div class="form-group">
83
+                            <label for="lastname" class="col-sm-2 control-label">描述<font color="red">*</font></label>
84
+                            <div class="col-sm-10"><input type="text" class="form-control" name="groupDesc" placeholder="请输入“描述”" maxlength="200" ></div>
85
+                        </div>
86
+                        <div class="form-group">
87
+                            <label for="lastname" class="col-sm-2 control-label">排序<font color="red">*</font></label>
88
+                            <div class="col-sm-10"><input type="text" class="form-control" name="order" placeholder="请输入“排序”" maxlength="50" ></div>
89
+                        </div>
90
+                        <hr>
91
+                        <div class="form-group">
92
+                            <div class="col-sm-offset-3 col-sm-6">
93
+                                <button type="submit" class="btn btn-primary"  >保存</button>
94
+                                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
95
+                            </div>
96
+                        </div>
97
+                    </form>
98
+                </div>
99
+            </div>
100
+        </div>
101
+    </div>
102
+
103
+    <!-- 更新.模态框 -->
104
+    <div class="modal fade" id="updateModal" tabindex="-1" role="dialog"  aria-hidden="true">
105
+        <div class="modal-dialog ">
106
+            <div class="modal-content">
107
+                <div class="modal-header">
108
+                    <h4 class="modal-title" >编辑分组</h4>
109
+                </div>
110
+                <div class="modal-body">
111
+                    <form class="form-horizontal form" role="form" >
112
+                        <div class="form-group">
113
+                            <label for="lastname" class="col-sm-2 control-label">分组<font color="red">*</font></label>
114
+                            <div class="col-sm-10"><input type="text" class="form-control" name="groupName" placeholder="请输入“分组”" maxlength="200" readonly ></div>
115
+                        </div>
116
+                        <div class="form-group">
117
+                            <label for="lastname" class="col-sm-2 control-label">描述<font color="red">*</font></label>
118
+                            <div class="col-sm-10"><input type="text" class="form-control" name="groupDesc" placeholder="请输入“描述”" maxlength="200" ></div>
119
+                        </div>
120
+                        <div class="form-group">
121
+                            <label for="lastname" class="col-sm-2 control-label">排序<font color="red">*</font></label>
122
+                            <div class="col-sm-10"><input type="text" class="form-control" name="order" placeholder="请输入“排序”" maxlength="50" ></div>
123
+                        </div>
124
+                        <hr>
125
+                        <div class="form-group">
126
+                            <div class="col-sm-offset-3 col-sm-6">
127
+                                <button type="submit" class="btn btn-primary"  >保存</button>
128
+                                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
129
+                            </div>
130
+                        </div>
131
+                    </form>
132
+                </div>
133
+            </div>
134
+        </div>
135
+    </div>
136
+	
137
+	<!-- footer -->
138
+	<@netCommon.commonFooter />
139
+</div>
140
+
141
+<@netCommon.commonScript />
142
+<!-- DataTables -->
143
+<script src="${request.contextPath}/static/adminlte/plugins/datatables/jquery.dataTables.min.js"></script>
144
+<script src="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.min.js"></script>
145
+<script src="${request.contextPath}/static/plugins/jquery/jquery.validate.min.js"></script>
146
+<script src="${request.contextPath}/static/js/jobgroup.index.1.js"></script>
147
+</body>
148
+</html>

+ 3 - 3
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl Wyświetl plik

@@ -25,7 +25,7 @@
25 25
 	<div class="content-wrapper">
26 26
 		<!-- Content Header (Page header) -->
27 27
 		<section class="content-header">
28
-			<h1>任务调度中心<small>调度管理</small></h1>
28
+			<h1>调度管理任务调度中心<small></small></h1>
29 29
 			<!--
30 30
 			<ol class="breadcrumb">
31 31
 				<li><a><i class="fa fa-dashboard"></i>调度管理</a></li>
@@ -182,12 +182,12 @@ import com.xxl.job.core.handler.IJobHandler;
182 182
 
183 183
 public class DemoGlueJobHandler extends IJobHandler {
184 184
 	private static transient Logger logger = LoggerFactory.getLogger(DemoGlueJobHandler.class);
185
-	
185
+
186 186
 	@Override
187 187
 	public void execute(String... params) throws Exception {
188 188
 		logger.info("XXL-JOB, Hello World.");
189 189
 	}
190
-	
190
+
191 191
 }
192 192
 </textarea>
193 193
 					

+ 2 - 2
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl Wyświetl plik

@@ -20,7 +20,7 @@
20 20
 	<div class="content-wrapper">
21 21
 		<!-- Content Header (Page header) -->
22 22
 		<section class="content-header">
23
-			<h1>任务调度中心<small>调度日志</small></h1>
23
+			<h1>调度日志<small>任务调度中心</small></h1>
24 24
 			<!--
25 25
 			<ol class="breadcrumb">
26 26
 				<li><a><i class="fa fa-dashboard"></i>调度日志</a></li>
@@ -70,7 +70,7 @@
70 70
 			<div class="row">
71 71
 				<div class="col-xs-12">
72 72
 					<div class="box">
73
-			            <div class="box-header"><h3 class="box-title">调度日志</h3></div>
73
+			            <div class="box-header hide"><h3 class="box-title">调度日志</h3></div>
74 74
 			            <div class="box-body">
75 75
 			              	<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >
76 76
 				                <thead>

+ 185 - 0
xxl-job-admin/src/main/webapp/static/js/jobgroup.index.1.js Wyświetl plik

@@ -0,0 +1,185 @@
1
+$(function() {
2
+
3
+	// remove
4
+	$('.remove').on('click', function(){
5
+		var groupName = $(this).attr('groupName');
6
+
7
+		ComConfirm.show("确认删除分组?", function(){
8
+			$.ajax({
9
+				type : 'POST',
10
+				url : base_url + '/jobgroup/remove',
11
+				data : {"groupName":groupName},
12
+				dataType : "json",
13
+				success : function(data){
14
+					if (data.code == 200) {
15
+						ComAlert.show(1, '删除成功');
16
+						window.location.reload();
17
+					} else {
18
+						ComAlert.show(2, '删除失败');
19
+					}
20
+				},
21
+			});
22
+		});
23
+	});
24
+
25
+	// jquery.validate 自定义校验 “英文字母开头,只含有英文字母、数字和下划线”
26
+	jQuery.validator.addMethod("myValid01", function(value, element) {
27
+		var length = value.length;
28
+		var valid = /^[a-z][a-zA-Z0-9-]*$/;
29
+		return this.optional(element) || valid.test(value);
30
+	}, "限制以小写字母开头,由小写字母、数字和下划线组成");
31
+
32
+	$('.add').on('click', function(){
33
+		$('#addModal').modal({backdrop: false, keyboard: false}).modal('show');
34
+	});
35
+	var addModalValidate = $("#addModal .form").validate({
36
+		errorElement : 'span',
37
+		errorClass : 'help-block',
38
+		focusInvalid : true,
39
+		rules : {
40
+			groupName : {
41
+				required : true,
42
+				rangelength:[4,200],
43
+				myValid01 : true
44
+			},
45
+			groupDesc : {
46
+				required : true,
47
+				rangelength:[4, 12]
48
+			},
49
+			order : {
50
+				required : true,
51
+				digits:true,
52
+				range:[1,1000]
53
+			}
54
+		},
55
+		messages : {
56
+			groupName : {
57
+				required :"请输入“分组”",
58
+				rangelength:"长度限制为4~200",
59
+				myValid01: "限制以小写字母开头,由小写字母、数字和中划线组成"
60
+			},
61
+			groupDesc : {
62
+				required :"请输入“描述”",
63
+				rangelength:"长度限制为4~12"
64
+			},
65
+			order : {
66
+				required :"请输入“排序”",
67
+				digits: "请输入整数",
68
+				range: "取值范围为1~1000"
69
+			}
70
+		},
71
+		highlight : function(element) {
72
+			$(element).closest('.form-group').addClass('has-error');
73
+		},
74
+		success : function(label) {
75
+			label.closest('.form-group').removeClass('has-error');
76
+			label.remove();
77
+		},
78
+		errorPlacement : function(error, element) {
79
+			element.parent('div').append(error);
80
+		},
81
+		submitHandler : function(form) {
82
+			$.post(base_url + "/jobgroup/save",  $("#addModal .form").serialize(), function(data, status) {
83
+				if (data.code == "200") {
84
+					$('#addModal').modal('hide');
85
+					setTimeout(function () {
86
+						ComAlert.show(1, "新增成功", function(){
87
+							window.location.reload();
88
+						});
89
+					}, 315);
90
+				} else {
91
+					if (data.msg) {
92
+						ComAlert.show(2, data.msg);
93
+					} else {
94
+						ComAlert.show(2, "新增失败");
95
+					}
96
+				}
97
+			});
98
+		}
99
+	});
100
+	$("#addModal").on('hide.bs.modal', function () {
101
+		$("#addModal .form")[0].reset();
102
+		addModalValidate.resetForm();
103
+		$("#addModal .form .form-group").removeClass("has-error");
104
+	});
105
+
106
+	$('.update').on('click', function(){
107
+		$("#updateModal .form input[name='groupName']").val($(this).attr("groupName"));
108
+		$("#updateModal .form input[name='groupDesc']").val($(this).attr("groupDesc"));
109
+		$("#updateModal .form input[name='order']").val($(this).attr("order"));
110
+
111
+		$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');
112
+	});
113
+	var updateModalValidate = $("#updateModal .form").validate({
114
+		errorElement : 'span',
115
+		errorClass : 'help-block',
116
+		focusInvalid : true,
117
+		rules : {
118
+			groupName : {
119
+				required : true,
120
+				rangelength:[4,200],
121
+				myValid01 : true
122
+			},
123
+			groupDesc : {
124
+				required : true,
125
+				rangelength:[4, 12]
126
+			},
127
+			order : {
128
+				required : true,
129
+				digits:true,
130
+				range:[1,1000]
131
+			}
132
+		},
133
+		messages : {
134
+			groupName : {
135
+				required :"请输入“分组”",
136
+				rangelength:"长度限制为4~200",
137
+				myValid01: "限制以小写字母开头,由小写字母、数字和中划线组成"
138
+			},
139
+			groupDesc : {
140
+				required :"请输入“描述”",
141
+				rangelength:"长度限制为4~12"
142
+			},
143
+			order : {
144
+				required :"请输入“排序”",
145
+				digits: "请输入整数",
146
+				range: "取值范围为1~1000"
147
+			}
148
+		},
149
+		highlight : function(element) {
150
+			$(element).closest('.form-group').addClass('has-error');
151
+		},
152
+		success : function(label) {
153
+			label.closest('.form-group').removeClass('has-error');
154
+			label.remove();
155
+		},
156
+		errorPlacement : function(error, element) {
157
+			element.parent('div').append(error);
158
+		},
159
+		submitHandler : function(form) {
160
+			$.post(base_url + "/jobgroup/update",  $("#updateModal .form").serialize(), function(data, status) {
161
+				if (data.code == "200") {
162
+					$('#addModal').modal('hide');
163
+					setTimeout(function () {
164
+						ComAlert.show(1, "更新成功", function(){
165
+							window.location.reload();
166
+						});
167
+					}, 315);
168
+				} else {
169
+					if (data.msg) {
170
+						ComAlert.show(2, data.msg);
171
+					} else {
172
+						ComAlert.show(2, "更新失败");
173
+					}
174
+				}
175
+			});
176
+		}
177
+	});
178
+	$("#updateModal").on('hide.bs.modal', function () {
179
+		$("#updateModal .form")[0].reset();
180
+		addModalValidate.resetForm();
181
+		$("#updateModal .form .form-group").removeClass("has-error");
182
+	});
183
+
184
+	
185
+});

+ 1 - 1
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js Wyświetl plik

@@ -313,7 +313,7 @@ $(function() {
313 313
 
314 314
 		$("#addModal .form input[name='executorHandler']").removeAttr("readonly");
315 315
 
316
-		// 注册模式 reset
316
+		// 注册模式
317 317
 		$("#addModal .form .executorAddress").show();
318 318
 		$("#addModal .form .executorAppname").hide();
319 319
 	});