parent
caf817124e
commit
204d7848fe
@ -0,0 +1,80 @@
|
||||
package com.xxl.job.admin.controller;
|
||||
|
||||
import com.xxl.job.admin.core.model.ReturnT;
|
||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||
import com.xxl.job.admin.dao.IXxlJobGroupDao;
|
||||
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* job group controller
|
||||
* @author xuxueli 2016-10-02 20:52:56
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping("/jobgroup")
|
||||
public class JobGroupController {
|
||||
|
||||
@Resource
|
||||
public IXxlJobInfoDao xxlJobInfoDao;
|
||||
|
||||
@Resource
|
||||
public IXxlJobGroupDao xxlJobGroupDao;
|
||||
|
||||
@RequestMapping
|
||||
public String index(Model model) {
|
||||
List<XxlJobGroup> list = xxlJobGroupDao.findAll();
|
||||
model.addAttribute("list", list);
|
||||
return "jobgroup/jobgroup.index";
|
||||
}
|
||||
|
||||
@RequestMapping("/save")
|
||||
@ResponseBody
|
||||
public ReturnT<String> save(XxlJobGroup xxlJobGroup){
|
||||
|
||||
// valid
|
||||
if (xxlJobGroup.getGroupName()==null || StringUtils.isBlank(xxlJobGroup.getGroupName())) {
|
||||
return new ReturnT<String>(500, "请输入分组");
|
||||
}
|
||||
if (xxlJobGroup.getGroupDesc()==null || StringUtils.isBlank(xxlJobGroup.getGroupDesc())) {
|
||||
return new ReturnT<String>(500, "请输入描述");
|
||||
}
|
||||
|
||||
// check repeat
|
||||
XxlJobGroup group = xxlJobGroupDao.load(xxlJobGroup.getGroupName());
|
||||
if (group!=null) {
|
||||
return new ReturnT<String>(500, "分组已存在, 请勿重复添加");
|
||||
}
|
||||
|
||||
int ret = xxlJobGroupDao.save(xxlJobGroup);
|
||||
return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
|
||||
}
|
||||
|
||||
@RequestMapping("/update")
|
||||
@ResponseBody
|
||||
public ReturnT<String> update(XxlJobGroup xxlJobGroup){
|
||||
int ret = xxlJobGroupDao.update(xxlJobGroup);
|
||||
return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
|
||||
}
|
||||
|
||||
@RequestMapping("/remove")
|
||||
@ResponseBody
|
||||
public ReturnT<String> remove(String groupName){
|
||||
|
||||
// valid
|
||||
int count = xxlJobInfoDao.pageListCount(0, 10, groupName, null);
|
||||
if (count > 0) {
|
||||
return new ReturnT<String>(500, "该分组使用中, 不可删除");
|
||||
}
|
||||
|
||||
int ret = xxlJobGroupDao.remove(groupName);
|
||||
return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package com.xxl.job.admin.core.model;
|
||||
|
||||
/**
|
||||
* Created by xuxueli on 16/9/30.
|
||||
*/
|
||||
public class XxlJobGroup {
|
||||
|
||||
private String groupName;
|
||||
private String groupDesc;
|
||||
private int order;
|
||||
|
||||
public String getGroupName() {
|
||||
return groupName;
|
||||
}
|
||||
|
||||
public void setGroupName(String groupName) {
|
||||
this.groupName = groupName;
|
||||
}
|
||||
|
||||
public String getGroupDesc() {
|
||||
return groupDesc;
|
||||
}
|
||||
|
||||
public void setGroupDesc(String groupDesc) {
|
||||
this.groupDesc = groupDesc;
|
||||
}
|
||||
|
||||
public int getOrder() {
|
||||
return order;
|
||||
}
|
||||
|
||||
public void setOrder(int order) {
|
||||
this.order = order;
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.xxl.job.admin.dao;
|
||||
|
||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by xuxueli on 16/9/30.
|
||||
*/
|
||||
public interface IXxlJobGroupDao {
|
||||
|
||||
public List<XxlJobGroup> findAll();
|
||||
|
||||
public int save(XxlJobGroup xxlJobGroup);
|
||||
|
||||
public int update(XxlJobGroup xxlJobGroup);
|
||||
|
||||
public int remove(String groupName);
|
||||
|
||||
public XxlJobGroup load(String groupName);
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.xxl.job.admin.dao.impl;
|
||||
|
||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||
import com.xxl.job.admin.dao.IXxlJobGroupDao;
|
||||
import org.mybatis.spring.SqlSessionTemplate;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by xuxueli on 16/9/30.
|
||||
*/
|
||||
@Repository
|
||||
public class XxlJobGroupDaoImpl implements IXxlJobGroupDao {
|
||||
|
||||
@Resource
|
||||
public SqlSessionTemplate sqlSessionTemplate;
|
||||
|
||||
@Override
|
||||
public List<XxlJobGroup> findAll() {
|
||||
return sqlSessionTemplate.selectList("XxlJobGroupMapper.findAll");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int save(XxlJobGroup xxlJobGroup) {
|
||||
return sqlSessionTemplate.update("XxlJobGroupMapper.save", xxlJobGroup);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int update(XxlJobGroup xxlJobGroup) {
|
||||
return sqlSessionTemplate.update("XxlJobGroupMapper.update", xxlJobGroup);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int remove(String groupName) {
|
||||
return sqlSessionTemplate.delete("XxlJobGroupMapper.remove", groupName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public XxlJobGroup load(String groupName) {
|
||||
return sqlSessionTemplate.selectOne("XxlJobGroupMapper.load", groupName);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="XxlJobGroupMapper">
|
||||
|
||||
<resultMap id="XxlJobGroup" type="com.xxl.job.admin.core.model.XxlJobGroup" >
|
||||
<result column="group_name" property="groupName" />
|
||||
<result column="group_desc" property="groupDesc" />
|
||||
<result column="order" property="order" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
t.group_name,
|
||||
t.group_desc,
|
||||
t.order
|
||||
</sql>
|
||||
|
||||
<select id="findAll" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
|
||||
SELECT <include refid="Base_Column_List" />
|
||||
FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
|
||||
ORDER BY t.order ASC
|
||||
</select>
|
||||
|
||||
<insert id="save" parameterType="java.util.Map" >
|
||||
INSERT INTO XXL_JOB_QRTZ_TRIGGER_GROUP ( `group_name`, `group_desc`, `order`)
|
||||
values ( #{groupName}, #{groupDesc}, #{order});
|
||||
</insert>
|
||||
|
||||
<update id="update" parameterType="java.util.Map" >
|
||||
UPDATE XXL_JOB_QRTZ_TRIGGER_GROUP
|
||||
SET `group_desc` = #{groupDesc},
|
||||
`order` = #{order}
|
||||
WHERE group_name = #{groupName}
|
||||
</update>
|
||||
|
||||
<delete id="remove" parameterType="java.lang.String" >
|
||||
DELETE FROM XXL_JOB_QRTZ_TRIGGER_GROUP
|
||||
WHERE group_name = #{groupName}
|
||||
</delete>
|
||||
|
||||
<select id="load" parameterType="java.lang.String" resultMap="XxlJobGroup">
|
||||
SELECT <include refid="Base_Column_List" />
|
||||
FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
|
||||
WHERE t.group_name = #{groupName}
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,148 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>任务调度中心</title>
|
||||
<#import "/common/common.macro.ftl" as netCommon>
|
||||
<@netCommon.commonStyle />
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.css">
|
||||
<!-- daterangepicker -->
|
||||
<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/daterangepicker/daterangepicker-bs3.css">
|
||||
</head>
|
||||
<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["adminlte_settings"].value >sidebar-collapse</#if> ">
|
||||
<div class="wrapper">
|
||||
<!-- header -->
|
||||
<@netCommon.commonHeader />
|
||||
<!-- left -->
|
||||
<@netCommon.commonLeft />
|
||||
|
||||
<!-- Content Wrapper. Contains page content -->
|
||||
<div class="content-wrapper">
|
||||
<!-- Content Header (Page header) -->
|
||||
<section class="content-header">
|
||||
<h1>分组管理<small>任务调度中心</small></h1>
|
||||
</section>
|
||||
|
||||
<!-- Main content -->
|
||||
<section class="content">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">分组管理</h3>
|
||||
<button class="btn btn-success btn-xs pull-left2 add" >+新增分组</button>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >
|
||||
<thead>
|
||||
<tr>
|
||||
<th name="groupDesc" >名称</th>
|
||||
<th name="groupName" >AppName</th>
|
||||
<th name="order" >排序</th>
|
||||
<th name="operate" >操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<#if list?exists && list?size gt 0>
|
||||
<#list list as group>
|
||||
<tr>
|
||||
<td>${group.groupDesc}</td>
|
||||
<td>${group.groupName}</td>
|
||||
<td>${group.order}</td>
|
||||
<td>
|
||||
<button class="btn btn-warning btn-xs update" groupName="${group.groupName}" groupDesc="${group.groupDesc}" order="${group.order}" >编辑</button>
|
||||
<button class="btn btn-danger btn-xs remove" groupName="${group.groupName}" >删除</button>
|
||||
</td>
|
||||
</tr>
|
||||
</#list>
|
||||
</#if>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- 新增.模态框 -->
|
||||
<div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<div class="modal-dialog ">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h4 class="modal-title" >新增分组</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal form" role="form" >
|
||||
<div class="form-group">
|
||||
<label for="lastname" class="col-sm-2 control-label">分组<font color="red">*</font></label>
|
||||
<div class="col-sm-10"><input type="text" class="form-control" name="groupName" placeholder="请输入“分组”" maxlength="200" ></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lastname" class="col-sm-2 control-label">描述<font color="red">*</font></label>
|
||||
<div class="col-sm-10"><input type="text" class="form-control" name="groupDesc" placeholder="请输入“描述”" maxlength="200" ></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lastname" class="col-sm-2 control-label">排序<font color="red">*</font></label>
|
||||
<div class="col-sm-10"><input type="text" class="form-control" name="order" placeholder="请输入“排序”" maxlength="50" ></div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-6">
|
||||
<button type="submit" class="btn btn-primary" >保存</button>
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 更新.模态框 -->
|
||||
<div class="modal fade" id="updateModal" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<div class="modal-dialog ">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h4 class="modal-title" >编辑分组</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal form" role="form" >
|
||||
<div class="form-group">
|
||||
<label for="lastname" class="col-sm-2 control-label">分组<font color="red">*</font></label>
|
||||
<div class="col-sm-10"><input type="text" class="form-control" name="groupName" placeholder="请输入“分组”" maxlength="200" readonly ></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lastname" class="col-sm-2 control-label">描述<font color="red">*</font></label>
|
||||
<div class="col-sm-10"><input type="text" class="form-control" name="groupDesc" placeholder="请输入“描述”" maxlength="200" ></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lastname" class="col-sm-2 control-label">排序<font color="red">*</font></label>
|
||||
<div class="col-sm-10"><input type="text" class="form-control" name="order" placeholder="请输入“排序”" maxlength="50" ></div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-6">
|
||||
<button type="submit" class="btn btn-primary" >保存</button>
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- footer -->
|
||||
<@netCommon.commonFooter />
|
||||
</div>
|
||||
|
||||
<@netCommon.commonScript />
|
||||
<!-- DataTables -->
|
||||
<script src="${request.contextPath}/static/adminlte/plugins/datatables/jquery.dataTables.min.js"></script>
|
||||
<script src="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.min.js"></script>
|
||||
<script src="${request.contextPath}/static/plugins/jquery/jquery.validate.min.js"></script>
|
||||
<script src="${request.contextPath}/static/js/jobgroup.index.1.js"></script>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,185 @@
|
||||
$(function() {
|
||||
|
||||
// remove
|
||||
$('.remove').on('click', function(){
|
||||
var groupName = $(this).attr('groupName');
|
||||
|
||||
ComConfirm.show("确认删除分组?", function(){
|
||||
$.ajax({
|
||||
type : 'POST',
|
||||
url : base_url + '/jobgroup/remove',
|
||||
data : {"groupName":groupName},
|
||||
dataType : "json",
|
||||
success : function(data){
|
||||
if (data.code == 200) {
|
||||
ComAlert.show(1, '删除成功');
|
||||
window.location.reload();
|
||||
} else {
|
||||
ComAlert.show(2, '删除失败');
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// jquery.validate 自定义校验 “英文字母开头,只含有英文字母、数字和下划线”
|
||||
jQuery.validator.addMethod("myValid01", function(value, element) {
|
||||
var length = value.length;
|
||||
var valid = /^[a-z][a-zA-Z0-9-]*$/;
|
||||
return this.optional(element) || valid.test(value);
|
||||
}, "限制以小写字母开头,由小写字母、数字和下划线组成");
|
||||
|
||||
$('.add').on('click', function(){
|
||||
$('#addModal').modal({backdrop: false, keyboard: false}).modal('show');
|
||||
});
|
||||
var addModalValidate = $("#addModal .form").validate({
|
||||
errorElement : 'span',
|
||||
errorClass : 'help-block',
|
||||
focusInvalid : true,
|
||||
rules : {
|
||||
groupName : {
|
||||
required : true,
|
||||
rangelength:[4,200],
|
||||
myValid01 : true
|
||||
},
|
||||
groupDesc : {
|
||||
required : true,
|
||||
rangelength:[4, 12]
|
||||
},
|
||||
order : {
|
||||
required : true,
|
||||
digits:true,
|
||||
range:[1,1000]
|
||||
}
|
||||
},
|
||||
messages : {
|
||||
groupName : {
|
||||
required :"请输入“分组”",
|
||||
rangelength:"长度限制为4~200",
|
||||
myValid01: "限制以小写字母开头,由小写字母、数字和中划线组成"
|
||||
},
|
||||
groupDesc : {
|
||||
required :"请输入“描述”",
|
||||
rangelength:"长度限制为4~12"
|
||||
},
|
||||
order : {
|
||||
required :"请输入“排序”",
|
||||
digits: "请输入整数",
|
||||
range: "取值范围为1~1000"
|
||||
}
|
||||
},
|
||||
highlight : function(element) {
|
||||
$(element).closest('.form-group').addClass('has-error');
|
||||
},
|
||||
success : function(label) {
|
||||
label.closest('.form-group').removeClass('has-error');
|
||||
label.remove();
|
||||
},
|
||||
errorPlacement : function(error, element) {
|
||||
element.parent('div').append(error);
|
||||
},
|
||||
submitHandler : function(form) {
|
||||
$.post(base_url + "/jobgroup/save", $("#addModal .form").serialize(), function(data, status) {
|
||||
if (data.code == "200") {
|
||||
$('#addModal').modal('hide');
|
||||
setTimeout(function () {
|
||||
ComAlert.show(1, "新增成功", function(){
|
||||
window.location.reload();
|
||||
});
|
||||
}, 315);
|
||||
} else {
|
||||
if (data.msg) {
|
||||
ComAlert.show(2, data.msg);
|
||||
} else {
|
||||
ComAlert.show(2, "新增失败");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
$("#addModal").on('hide.bs.modal', function () {
|
||||
$("#addModal .form")[0].reset();
|
||||
addModalValidate.resetForm();
|
||||
$("#addModal .form .form-group").removeClass("has-error");
|
||||
});
|
||||
|
||||
$('.update').on('click', function(){
|
||||
$("#updateModal .form input[name='groupName']").val($(this).attr("groupName"));
|
||||
$("#updateModal .form input[name='groupDesc']").val($(this).attr("groupDesc"));
|
||||
$("#updateModal .form input[name='order']").val($(this).attr("order"));
|
||||
|
||||
$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');
|
||||
});
|
||||
var updateModalValidate = $("#updateModal .form").validate({
|
||||
errorElement : 'span',
|
||||
errorClass : 'help-block',
|
||||
focusInvalid : true,
|
||||
rules : {
|
||||
groupName : {
|
||||
required : true,
|
||||
rangelength:[4,200],
|
||||
myValid01 : true
|
||||
},
|
||||
groupDesc : {
|
||||
required : true,
|
||||
rangelength:[4, 12]
|
||||
},
|
||||
order : {
|
||||
required : true,
|
||||
digits:true,
|
||||
range:[1,1000]
|
||||
}
|
||||
},
|
||||
messages : {
|
||||
groupName : {
|
||||
required :"请输入“分组”",
|
||||
rangelength:"长度限制为4~200",
|
||||
myValid01: "限制以小写字母开头,由小写字母、数字和中划线组成"
|
||||
},
|
||||
groupDesc : {
|
||||
required :"请输入“描述”",
|
||||
rangelength:"长度限制为4~12"
|
||||
},
|
||||
order : {
|
||||
required :"请输入“排序”",
|
||||
digits: "请输入整数",
|
||||
range: "取值范围为1~1000"
|
||||
}
|
||||
},
|
||||
highlight : function(element) {
|
||||
$(element).closest('.form-group').addClass('has-error');
|
||||
},
|
||||
success : function(label) {
|
||||
label.closest('.form-group').removeClass('has-error');
|
||||
label.remove();
|
||||
},
|
||||
errorPlacement : function(error, element) {
|
||||
element.parent('div').append(error);
|
||||
},
|
||||
submitHandler : function(form) {
|
||||
$.post(base_url + "/jobgroup/update", $("#updateModal .form").serialize(), function(data, status) {
|
||||
if (data.code == "200") {
|
||||
$('#addModal').modal('hide');
|
||||
setTimeout(function () {
|
||||
ComAlert.show(1, "更新成功", function(){
|
||||
window.location.reload();
|
||||
});
|
||||
}, 315);
|
||||
} else {
|
||||
if (data.msg) {
|
||||
ComAlert.show(2, data.msg);
|
||||
} else {
|
||||
ComAlert.show(2, "更新失败");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
$("#updateModal").on('hide.bs.modal', function () {
|
||||
$("#updateModal .form")[0].reset();
|
||||
addModalValidate.resetForm();
|
||||
$("#updateModal .form .form-group").removeClass("has-error");
|
||||
});
|
||||
|
||||
|
||||
});
|
Loading…
Reference in new issue