diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index ec514a61..8cbc742b 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1730,7 +1730,7 @@ data: post-data - 15、执行器注册逻辑优化:新增配置项 ”注册地址 / xxl.job.executor.address“,优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 - 16、执行器初始化逻辑优化:修复懒加载的Bean被提前初始化问题; - 17、任务复制功能:点击复制是弹出新建任务弹框,并初始化被复制任务信息; -- 18、[迭代中]新增执行器描述、任务描述属性; +- 18、执行器UI交互优化;(新增执行器描述属性) - 19、[迭代中]任务执行一次的时候指定IP; - 20、[迭代中]自定义失败重试时间间隔; - 21、[迭代中]任务结果丢失处理:针对长期处于运行中的任务(设置过期时间时,运行超过"过期时间+1min";未设置超时时间时,运行超过"30min"),主动检测该执行器是否在线,如果不在线主动标记失败; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index 9376eb75..d5c0b7a0 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -11,9 +11,11 @@ import com.xxl.job.core.enums.RegistryConfig; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.util.*; /** @@ -33,14 +35,28 @@ public class JobGroupController { @RequestMapping public String index(Model model) { - - // job group (executor) - List list = xxlJobGroupDao.findAll(); - - model.addAttribute("list", list); return "jobgroup/jobgroup.index"; } + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(HttpServletRequest request, + @RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + String appName, String title) { + + // page query + List list = xxlJobGroupDao.pageList(start, length, appName, title); + int list_count = xxlJobGroupDao.pageListCount(start, length, appName, title); + + // package result + Map maps = new HashMap(); + maps.put("recordsTotal", list_count); // 总记录数 + maps.put("recordsFiltered", list_count); // 过滤后的总记录数 + maps.put("data", list); // 分页列表 + return maps; + } + @RequestMapping("/save") @ResponseBody public ReturnT save(XxlJobGroup xxlJobGroup){ diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java index 8af1a637..4a37dd7f 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java @@ -12,7 +12,6 @@ public class XxlJobGroup { private int id; private String appName; private String title; - private int order; private int addressType; // 执行器地址类型:0=自动注册、1=手动录入 private String addressList; // 执行器地址列表,多地址逗号分隔(手动录入) @@ -49,14 +48,6 @@ public class XxlJobGroup { this.title = title; } - public int getOrder() { - return order; - } - - public void setOrder(int order) { - this.order = order; - } - public int getAddressType() { return addressType; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java index 35f3cd3c..a0910249 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java @@ -23,4 +23,15 @@ public interface XxlJobGroupDao { public int remove(@Param("id") int id); public XxlJobGroup load(@Param("id") int id); + + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("appName") String appName, + @Param("title") String title); + + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("appName") String appName, + @Param("title") String title); + } diff --git a/xxl-job-admin/src/main/resources/i18n/message_en.properties b/xxl-job-admin/src/main/resources/i18n/message_en.properties index 1eb911b1..74afcc6a 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -189,7 +189,6 @@ jobgroup_list=Executor List jobgroup_add=Add Executor jobgroup_edit=Edit Executor jobgroup_del=Delete Executor -jobgroup_field_order=Order jobgroup_field_title=Title jobgroup_field_addressType=Registry Type jobgroup_field_addressType_0=Automatic registration diff --git a/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties index 619044ba..386fbf62 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -189,7 +189,6 @@ jobgroup_list=执行器列表 jobgroup_add=新增执行器 jobgroup_edit=编辑执行器 jobgroup_del=删除执行器 -jobgroup_field_order=排序 jobgroup_field_title=名称 jobgroup_field_addressType=注册方式 jobgroup_field_addressType_0=自动注册 diff --git a/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties index 5297c505..fc9293dc 100755 --- a/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -189,7 +189,6 @@ jobgroup_list=執行器列表 jobgroup_add=新增執行器 jobgroup_edit=編輯執行器 jobgroup_del=刪除執行器 -jobgroup_field_order=排序 jobgroup_field_title=名稱 jobgroup_field_addressType=注冊方式 jobgroup_field_addressType_0=自動注冊 diff --git a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml index 561c6618..bd893cc5 100644 --- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml +++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml @@ -7,7 +7,6 @@ - @@ -16,7 +15,6 @@ t.id, t.app_name, t.title, - t.`order`, t.address_type, t.address_list @@ -24,26 +22,25 @@ - INSERT INTO xxl_job_group ( `app_name`, `title`, `order`, `address_type`, `address_list`) - values ( #{appName}, #{title}, #{order}, #{addressType}, #{addressList}); + INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`) + values ( #{appName}, #{title}, #{addressType}, #{addressList}); UPDATE xxl_job_group SET `app_name` = #{appName}, `title` = #{title}, - `order` = #{order}, `address_type` = #{addressType}, `address_list` = #{addressList} WHERE id = #{id} @@ -60,4 +57,32 @@ WHERE t.id = #{id} + + + + \ No newline at end of file diff --git a/xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js b/xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js index 9f741993..3f54d334 100644 --- a/xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js +++ b/xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js @@ -1,13 +1,153 @@ $(function() { - // remove - $('.remove').on('click', function(){ - var id = $(this).attr('id'); + // init date tables + var jobGroupTable = $("#jobgroup_list").dataTable({ + "deferRender": true, + "processing" : true, + "serverSide": true, + "ajax": { + url: base_url + "/jobgroup/pageList", + type:"post", + data : function ( d ) { + var obj = {}; + obj.appName = $('#appName').val(); + obj.title = $('#title').val(); + obj.start = d.start; + obj.length = d.length; + return obj; + } + }, + "searching": false, + "ordering": false, + //"scrollX": true, // scroll x,close self-adaption + "columns": [ + { + "data": 'id', + "visible" : false + }, + { + "data": 'appName', + "visible" : true, + "width":'30%' + }, + { + "data": 'title', + "visible" : true, + "width":'30%' + }, + { + "data": 'addressType', + "width":'10%', + "visible" : true, + "render": function ( data, type, row ) { + if (row.addressType == 0) { + return I18n.jobgroup_field_addressType_0; + } else { + return I18n.jobgroup_field_addressType_1; + } + } + }, + { + "data": 'registryList', + "width":'15%', + "visible" : true, + "render": function ( data, type, row ) { + return row.registryList + ?'' + + I18n.system_show +' ( ' + row.registryList.length+ ' )' + :I18n.system_empty; + } + }, + { + "data": I18n.system_opt , + "width":'15%', + "render": function ( data, type, row ) { + return function(){ + // data + tableData['key'+row.id] = row; + + // opt + var html = '
\n' + + ' \n' + + ' \n' + + ' \n' + + '
'; + + return html; + }; + } + } + ], + "language" : { + "sProcessing" : I18n.dataTable_sProcessing , + "sLengthMenu" : I18n.dataTable_sLengthMenu , + "sZeroRecords" : I18n.dataTable_sZeroRecords , + "sInfo" : I18n.dataTable_sInfo , + "sInfoEmpty" : I18n.dataTable_sInfoEmpty , + "sInfoFiltered" : I18n.dataTable_sInfoFiltered , + "sInfoPostFix" : "", + "sSearch" : I18n.dataTable_sSearch , + "sUrl" : "", + "sEmptyTable" : I18n.dataTable_sEmptyTable , + "sLoadingRecords" : I18n.dataTable_sLoadingRecords , + "sInfoThousands" : ",", + "oPaginate" : { + "sFirst" : I18n.dataTable_sFirst , + "sPrevious" : I18n.dataTable_sPrevious , + "sNext" : I18n.dataTable_sNext , + "sLast" : I18n.dataTable_sLast + }, + "oAria" : { + "sSortAscending" : I18n.dataTable_sSortAscending , + "sSortDescending" : I18n.dataTable_sSortDescending + } + } + }); + + // table data + var tableData = {}; + + // search btn + $('#searchBtn').on('click', function(){ + jobGroupTable.fnDraw(); + }); + + // job registryinfo + $("#jobgroup_list").on('click', '.show_registryList',function() { + var id = $(this).attr("_id"); + var row = tableData['key'+id]; + + var html = '
'; + if (row.registryList) { + for (var index in row.registryList) { + html += '' + row.registryList[index] + '
'; + } + } + html += '
'; + + layer.open({ + title: I18n.jobinfo_opt_registryinfo , + btn: [ I18n.system_ok ], + content: html + }); + + }); + + + // opt_del + $("#jobgroup_list").on('click', '.opt_del',function() { + var id = $(this).parents('ul').attr("_id"); layer.confirm( (I18n.system_ok + I18n.jobgroup_del + '?') , { icon: 3, title: I18n.system_tips , - btn: [ I18n.system_ok, I18n.system_cancel ] + btn: [ I18n.system_ok, I18n.system_cancel ] }, function(index){ layer.close(index); @@ -20,17 +160,17 @@ $(function() { if (data.code == 200) { layer.open({ title: I18n.system_tips , - btn: [ I18n.system_ok ], + btn: [ I18n.system_ok ], content: (I18n.jobgroup_del + I18n.system_success), icon: '1', end: function(layero, index){ - window.location.reload(); + jobGroupTable.fnDraw(); } }); } else { layer.open({ title: I18n.system_tips, - btn: [ I18n.system_ok ], + btn: [ I18n.system_ok ], content: (data.msg || (I18n.jobgroup_del + I18n.system_fail)), icon: '2' }); @@ -38,9 +178,9 @@ $(function() { }, }); }); - }); + // jquery.validate “low letters start, limit contants、 letters、numbers and line-through.” jQuery.validator.addMethod("myValid01", function(value, element) { var length = value.length; @@ -64,11 +204,6 @@ $(function() { title : { required : true, rangelength:[4, 12] - }, - order : { - required : true, - digits:true, - range:[1,1000] } }, messages : { @@ -80,11 +215,6 @@ $(function() { title : { required : I18n.system_please_input + I18n.jobgroup_field_title , rangelength: I18n.jobgroup_field_title_length - }, - order : { - required : I18n.system_please_input + I18n.jobgroup_field_order , - digits: I18n.jobgroup_field_order_digits , - range: I18n.jobgroup_field_orderrange } }, highlight : function(element) { @@ -107,7 +237,7 @@ $(function() { content: I18n.system_add_suc , icon: '1', end: function(layero, index){ - window.location.reload(); + jobGroupTable.fnDraw(); } }); } else { @@ -141,20 +271,20 @@ $(function() { } }); - // update - $('.update').on('click', function(){ - $("#updateModal .form input[name='id']").val($(this).attr("id")); - $("#updateModal .form input[name='appName']").val($(this).attr("appName")); - $("#updateModal .form input[name='title']").val($(this).attr("title")); - $("#updateModal .form input[name='order']").val($(this).attr("order")); + // opt_edit + $("#jobgroup_list").on('click', '.opt_edit',function() { + var id = $(this).parents('ul').attr("_id"); + var row = tableData['key'+id]; + + $("#updateModal .form input[name='id']").val( row.id ); + $("#updateModal .form input[name='appName']").val( row.appName ); + $("#updateModal .form input[name='title']").val( row.title ); // 注册方式 - var addressType = $(this).attr("addressType"); $("#updateModal .form input[name='addressType']").removeAttr('checked'); - //$("#updateModal .form input[name='addressType'][value='"+ addressType +"']").attr('checked', 'true'); - $("#updateModal .form input[name='addressType'][value='"+ addressType +"']").click(); + $("#updateModal .form input[name='addressType'][value='"+ row.addressType +"']").click(); // 机器地址 - $("#updateModal .form textarea[name='addressList']").val($(this).attr("addressList")); + $("#updateModal .form textarea[name='addressList']").val( row.addressList ); $('#updateModal').modal({backdrop: false, keyboard: false}).modal('show'); }); @@ -171,11 +301,6 @@ $(function() { title : { required : true, rangelength:[4, 12] - }, - order : { - required : true, - digits:true, - range:[1,1000] } }, messages : { @@ -187,11 +312,6 @@ $(function() { title : { required : I18n.system_please_input + I18n.jobgroup_field_title , rangelength: I18n.jobgroup_field_title_length - }, - order : { - required : I18n.system_please_input + I18n.jobgroup_field_order , - digits: I18n.jobgroup_field_order_digits , - range: I18n.jobgroup_field_orderrange } }, highlight : function(element) { @@ -207,7 +327,7 @@ $(function() { submitHandler : function(form) { $.post(base_url + "/jobgroup/update", $("#updateModal .form").serialize(), function(data, status) { if (data.code == "200") { - $('#addModal').modal('hide'); + $('#updateModal').modal('hide'); layer.open({ title: I18n.system_tips , @@ -215,7 +335,7 @@ $(function() { content: I18n.system_update_suc , icon: '1', end: function(layero, index){ - window.location.reload(); + jobGroupTable.fnDraw(); } }); } else { diff --git a/xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl b/xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl index a9b78a78..a6e584bc 100644 --- a/xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl +++ b/xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl @@ -23,63 +23,44 @@
+ +
+
+
+ AppName + +
+
+
+
+ ${I18n.jobgroup_field_title} + +
+
+
+ +
+
+ +
+
-
-

${I18n.jobgroup_list}

   - -
- +
- <#----> - + - + - <#if list?exists && list?size gt 0> - <#list list as group> - - <#----> - - - - - - - - -
ID${I18n.jobgroup_field_order}ID AppName ${I18n.jobgroup_field_title} ${I18n.jobgroup_field_addressType} OnLine ${I18n.jobgroup_field_registryList}${I18n.system_opt}${I18n.system_opt}
${group.id}${group.order}${group.appName}${group.title}<#if group.addressType==0>${I18n.jobgroup_field_addressType_0}<#else>${I18n.jobgroup_field_addressType_1} - <#if group.registryList?exists> - <#list group.registryList as item> - - <#if item?length gt 35> - ${item?substring(0, 35)}... - <#else> - ${item} - - -
- - -
- - -
@@ -106,10 +87,6 @@
-
- -
-
@@ -154,10 +131,6 @@
-
- -
-
diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobGroupDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobGroupDaoTest.java index a9387ac4..44c916a3 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobGroupDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobGroupDaoTest.java @@ -1,12 +1,9 @@ package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobGroup; -import com.xxl.job.admin.dao.XxlJobGroupDao; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; @@ -28,7 +25,6 @@ public class XxlJobGroupDaoTest { XxlJobGroup group = new XxlJobGroup(); group.setAppName("setAppName"); group.setTitle("setTitle"); - group.setOrder(1); group.setAddressType(0); group.setAddressList("setAddressList"); @@ -37,7 +33,6 @@ public class XxlJobGroupDaoTest { XxlJobGroup group2 = xxlJobGroupDao.load(group.getId()); group2.setAppName("setAppName2"); group2.setTitle("setTitle2"); - group2.setOrder(2); group2.setAddressType(2); group2.setAddressList("setAddressList2");