job.index.1.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. $(function() {
  2. // init date tables
  3. var jobTable = $("#job_list").dataTable({
  4. "deferRender": true,
  5. "processing" : true,
  6. "serverSide": true,
  7. "ajax": {
  8. url: base_url + "/job/pageList",
  9. data : function ( d ) {
  10. d.jobName = $('#jobName').val()
  11. }
  12. },
  13. //"scrollX": true, // X轴滚动条,取消自适应
  14. "columns": [
  15. { "data": 'id', "bSortable": false, "visible" : false},
  16. { "data": 'jobName', "bSortable": false},
  17. { "data": 'jobCron', "bSortable": false, "visible" : true},
  18. { "data": 'jobClass', "bSortable": false, "visible" : false},
  19. { "data": 'jobStatus', "bSortable": false, "visible" : true},
  20. { "data": 'jobData', "bSortable": false, "visible" : true},
  21. {
  22. "data": 'addTime',
  23. "bSortable": false,
  24. "render": function ( data, type, row ) {
  25. return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
  26. }
  27. },
  28. {
  29. "data": 'updateTime',
  30. "bSortable": false,
  31. "render": function ( data, type, row ) {
  32. return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
  33. }
  34. },
  35. { "data": '操作' , "bSortable": false,
  36. "render": function ( data, type, row ) {
  37. return function(){
  38. // status
  39. var pause_resume = "";
  40. if ('NORMAL' == row.jobStatus) {
  41. pause_resume = '<button class="btn btn-info btn-xs job_operate" type="job_pause" type="button">暂停</button> ';
  42. } else if ('PAUSED' == row.jobStatus){
  43. pause_resume = '<button class="btn btn-info btn-xs job_operate" type="job_resume" type="button">恢复</button> ';
  44. }
  45. // log url
  46. var logUrl = base_url +'/joblog?jobName='+ row.jobName;
  47. // job data
  48. var jobDataMap = eval('(' + row.jobData + ')');
  49. var html = '<p jobName="'+ row.jobName +'" '+
  50. ' cronExpression="'+ row.jobCron +'" '+
  51. ' job_desc="'+jobDataMap.job_desc +'" '+
  52. ' job_url="'+ jobDataMap.job_url +'" '+
  53. ' handleName="'+ jobDataMap.handleName +'" '+
  54. '>'+
  55. pause_resume +
  56. '<button class="btn btn-info btn-xs job_operate" type="job_trigger" type="button">执行</button> '+
  57. '<button class="btn btn-info btn-xs update" type="button">更新corn</button> '+
  58. '<button class="btn btn-danger btn-xs job_operate" type="job_del" type="button">删除</button> '+
  59. '<button class="btn btn-warning btn-xs" type="job_del" type="button" '+
  60. 'onclick="javascript:window.open(\'' + logUrl + '\')" >查看日志</button>'+
  61. '</p>';
  62. return html;
  63. };
  64. }
  65. }
  66. ],
  67. "searching": false,
  68. "ordering": true,
  69. "language" : {
  70. "sProcessing" : "处理中...",
  71. "sLengthMenu" : "每页 _MENU_ 条记录",
  72. "sZeroRecords" : "没有匹配结果",
  73. "sInfo" : "第 _PAGE_ 页 ( 总共 _PAGES_ 页 )",
  74. "sInfoEmpty" : "无记录",
  75. "sInfoFiltered" : "(由 _MAX_ 项结果过滤)",
  76. "sInfoPostFix" : "",
  77. "sSearch" : "搜索:",
  78. "sUrl" : "",
  79. "sEmptyTable" : "表中数据为空",
  80. "sLoadingRecords" : "载入中...",
  81. "sInfoThousands" : ",",
  82. "oPaginate" : {
  83. "sFirst" : "首页",
  84. "sPrevious" : "上页",
  85. "sNext" : "下页",
  86. "sLast" : "末页"
  87. },
  88. "oAria" : {
  89. "sSortAscending" : ": 以升序排列此列",
  90. "sSortDescending" : ": 以降序排列此列"
  91. }
  92. }
  93. });
  94. // 搜索按钮
  95. $('#searchBtn').on('click', function(){
  96. jobTable.fnDraw();
  97. });
  98. // job operate
  99. $("#job_list").on('click', '.job_operate',function() {
  100. var typeName;
  101. var url;
  102. var type = $(this).attr("type");
  103. if ("job_pause" == type) {
  104. typeName = "暂停";
  105. url = base_url + "/job/pause";
  106. } else if ("job_resume" == type) {
  107. typeName = "恢复";
  108. url = base_url + "/job/resume";
  109. } else if ("job_del" == type) {
  110. typeName = "删除";
  111. url = base_url + "/job/remove";
  112. } else if ("job_trigger" == type) {
  113. typeName = "执行一次";
  114. url = base_url + "/job/trigger";
  115. } else {
  116. return;
  117. }
  118. var name = $(this).parent('p').attr("jobName");
  119. ComConfirm.show("确认" + typeName + "?", function(){
  120. $.ajax({
  121. type : 'POST',
  122. url : url,
  123. data : {
  124. "triggerKeyName" : name
  125. },
  126. dataType : "json",
  127. success : function(data){
  128. if (data.code == 200) {
  129. ComAlert.show(1, typeName + "成功", function(){
  130. //window.location.reload();
  131. jobTable.fnDraw();
  132. });
  133. } else {
  134. ComAlert.show(1, typeName + "失败");
  135. }
  136. },
  137. });
  138. });
  139. });
  140. // jquery.validate 自定义校验 “英文字母开头,只含有英文字母、数字和下划线”
  141. jQuery.validator.addMethod("myValid01", function(value, element) {
  142. var length = value.length;
  143. var valid = /^[a-zA-Z][a-zA-Z0-9_]*$/;
  144. return this.optional(element) || valid.test(value);
  145. }, "只支持英文字母开头,只含有英文字母、数字和下划线");
  146. // 新增
  147. $(".add").click(function(){
  148. $('#addModal').modal({backdrop: false, keyboard: false}).modal('show');
  149. });
  150. var addModalValidate = $("#addModal .form").validate({
  151. errorElement : 'span',
  152. errorClass : 'help-block',
  153. focusInvalid : true,
  154. rules : {
  155. triggerKeyName : {
  156. required : true ,
  157. minlength: 4,
  158. maxlength: 100,
  159. myValid01:true
  160. },
  161. cronExpression : {
  162. required : true ,
  163. maxlength: 100
  164. },
  165. job_desc : {
  166. required : true ,
  167. maxlength: 200
  168. },
  169. job_url : {
  170. required : true ,
  171. maxlength: 200
  172. },
  173. handleName : {
  174. required : true ,
  175. maxlength: 200
  176. }
  177. },
  178. messages : {
  179. triggerKeyName : {
  180. required :"请输入“任务Key”." ,
  181. minlength:"“任务Key”长度不应低于4位",
  182. maxlength:"“任务Key”长度不应超过100位"
  183. },
  184. cronExpression : {
  185. required :"请输入“任务Corn”." ,
  186. maxlength:"“任务Corn”长度不应超过100位"
  187. },
  188. job_desc : {
  189. required :"请输入“任务描述”." ,
  190. maxlength:"“任务描述”长度不应超过200位"
  191. },
  192. job_url : {
  193. required :"请输入“任务URL”." ,
  194. maxlength:"“任务URL”长度不应超过200位"
  195. },
  196. handleName : {
  197. required : "请输入“任务handler”." ,
  198. maxlength: "“任务handler”长度不应超过200位"
  199. }
  200. },
  201. highlight : function(element) {
  202. $(element).closest('.form-group').addClass('has-error');
  203. },
  204. success : function(label) {
  205. label.closest('.form-group').removeClass('has-error');
  206. label.remove();
  207. },
  208. errorPlacement : function(error, element) {
  209. element.parent('div').append(error);
  210. },
  211. submitHandler : function(form) {
  212. var triggerKeyName = $('#addModal input[name="triggerKeyName"]').val();
  213. var cronExpression = $('#addModal input[name="cronExpression"]').val();
  214. var job_desc = $('#addModal input[name="job_desc"]').val();
  215. var job_url = $('#addModal input[name="job_url"]').val();
  216. var handleName = $('#addModal input[name="handleName"]').val();
  217. var paramStr = 'triggerKeyName=' + triggerKeyName +
  218. '&cronExpression=' + cronExpression +
  219. '&job_desc=' + job_desc +
  220. '&job_url=' + job_url +
  221. '&handleName=' + handleName;
  222. var ifFin = true;
  223. $('#addModal .newParam').each(function(){
  224. ifFin = false;
  225. var key = $(this).find('input[name="key"]').val();
  226. var value = $(this).find('input[name="value"]').val();
  227. if (!key) {
  228. ComAlert.show(2, "新增参数key不可为空");
  229. return;
  230. } else {
  231. if(!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(key)){
  232. ComAlert.show(2, "新增参数key不合法, 只支持英文字母开头,只含有英文字母、数字和下划线");
  233. return;
  234. }
  235. }
  236. paramStr += "&" + key + "=" + value;
  237. ifFin = true;
  238. });
  239. if(ifFin){
  240. $.post(base_url + "/job/add", paramStr, function(data, status) {
  241. if (data.code == "200") {
  242. ComAlert.show(1, "新增调度任务成功", function(){
  243. window.location.reload();
  244. });
  245. } else {
  246. if (data.msg) {
  247. ComAlert.show(2, data.msg);
  248. } else {
  249. ComAlert.show(2, "新增失败");
  250. }
  251. }
  252. });
  253. }
  254. }
  255. });
  256. $("#addModal").on('hide.bs.modal', function () {
  257. //$("#addModal .form")[0].reset();
  258. addModalValidate.resetForm();
  259. $("#addModal .form .form-group").removeClass("has-error");
  260. });
  261. // 新增-添加参数
  262. $("#addModal .addParam").on('click', function () {
  263. var html = '<div class="form-group newParam">'+
  264. '<label for="lastname" class="col-sm-2 control-label">参数&nbsp;<button class="btn btn-danger btn-xs removeParam" type="button">移除</button></label>'+
  265. '<div class="col-sm-4"><input type="text" class="form-control" name="key" placeholder="请输入参数key[将会强转为String]" maxlength="200" /></div>'+
  266. '<div class="col-sm-6"><input type="text" class="form-control" name="value" placeholder="请输入参数value[将会强转为String]" maxlength="200" /></div>'+
  267. '</div>';
  268. $(this).parents('.form-group').parent().append(html);
  269. $("#addModal .removeParam").on('click', function () {
  270. $(this).parents('.form-group').remove();
  271. });
  272. });
  273. // 更新
  274. $("#job_list").on('click', '.update',function() {
  275. $("#updateModal .form input[name='triggerKeyName']").val($(this).parent('p').attr("jobName"));
  276. $("#updateModal .form input[name='cronExpression']").val($(this).parent('p').attr("cronExpression"));
  277. $("#updateModal .form input[name='job_desc']").val($(this).parent('p').attr("job_desc"));
  278. $("#updateModal .form input[name='job_url']").val($(this).parent('p').attr("job_url"));
  279. $("#updateModal .form input[name='handleName']").val($(this).parent('p').attr("handleName"));
  280. $('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');
  281. });
  282. var updateModalValidate = $("#updateModal .form").validate({
  283. errorElement : 'span',
  284. errorClass : 'help-block',
  285. focusInvalid : true,
  286. rules : {
  287. triggerKeyName : {
  288. required : true ,
  289. minlength: 4,
  290. maxlength: 100
  291. },
  292. cronExpression : {
  293. required : true ,
  294. maxlength: 100
  295. },
  296. job_desc : {
  297. required : true ,
  298. maxlength: 200
  299. },
  300. job_url : {
  301. required : true ,
  302. maxlength: 200
  303. },
  304. handleName : {
  305. required : true ,
  306. maxlength: 200
  307. }
  308. },
  309. messages : {
  310. triggerKeyName : {
  311. required :"请输入“任务Key”." ,
  312. minlength:"“任务Key”不应低于4位",
  313. maxlength:"“任务Key”不应超过100位"
  314. },
  315. cronExpression : {
  316. required :"请输入“任务Corn”." ,
  317. maxlength:"“任务Corn”不应超过100位"
  318. },
  319. job_desc : {
  320. required :"请输入“任务描述”." ,
  321. maxlength:"“任务描述”长度不应超过200位"
  322. },
  323. job_url : {
  324. required :"请输入“任务URL”." ,
  325. maxlength:"“任务URL”长度不应超过200位"
  326. },
  327. handleName : {
  328. required : "请输入“任务handler”." ,
  329. maxlength: "“任务handler”长度不应超过200位"
  330. }
  331. },
  332. highlight : function(element) {
  333. $(element).closest('.form-group').addClass('has-error');
  334. },
  335. success : function(label) {
  336. label.closest('.form-group').removeClass('has-error');
  337. label.remove();
  338. },
  339. errorPlacement : function(error, element) {
  340. element.parent('div').append(error);
  341. },
  342. submitHandler : function(form) {
  343. $.post(base_url + "/job/reschedule", $("#updateModal .form").serialize(), function(data, status) {
  344. if (data.code == "200") {
  345. ComAlert.show(1, "更新成功", function(){
  346. window.location.reload();
  347. });
  348. } else {
  349. if (data.msg) {
  350. ComAlert.show(2, data.msg);
  351. } else {
  352. ComAlert.show(2, "更新失败");
  353. }
  354. }
  355. });
  356. }
  357. });
  358. $("#updateModal").on('hide.bs.modal', function () {
  359. $("#updateModal .form")[0].reset()
  360. });
  361. });