mirror of https://gitee.com/stylefeng/guns
Merge remote-tracking branch 'origin/group3-timer'
commit
2c4cbe0946
7
pom.xml
7
pom.xml
|
@ -29,6 +29,7 @@
|
|||
|
||||
<dependencies>
|
||||
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.ibeetl/beetl -->
|
||||
<dependency>
|
||||
<groupId>com.ibeetl</groupId>
|
||||
|
@ -101,6 +102,12 @@
|
|||
<version>1.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>timer-spring-boot-starter</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
package cn.stylefeng.guns.modular.timer;
|
||||
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Controller;
|
||||
|
||||
/**
|
||||
* 定时控制器
|
||||
*
|
||||
* @author youyongkun
|
||||
* @date 2021/1/6 3:56 下午
|
||||
*/
|
||||
@Controller
|
||||
@Slf4j
|
||||
@ApiResource(name = "定时管理相关的界面渲染", path = "/sysTimers")
|
||||
public class TimersViewController {
|
||||
|
||||
private String PREFIX = "/modular/system/timers";
|
||||
|
||||
/**
|
||||
* 定时管理-首页-视图
|
||||
*
|
||||
* @author youyongkun
|
||||
* @date 2021/1/6 4:28 下午
|
||||
*/
|
||||
@GetResource(name = "定时管理-首页-视图", path = "", requiredPermission = false, requiredLogin = false)
|
||||
public String indexView() {
|
||||
return PREFIX + "/timers.html";
|
||||
}
|
||||
|
||||
/**
|
||||
* 定时管理-添加-视图
|
||||
*
|
||||
* @author youyongkun
|
||||
* @date 2021/1/6 4:28 下午
|
||||
*/
|
||||
@GetResource(name = "定时管理-添加-视图", path = "/addView", requiredPermission = false, requiredLogin = false)
|
||||
public String addView() {
|
||||
return PREFIX + "/timers_add.html";
|
||||
}
|
||||
|
||||
/**
|
||||
* 定时管理-修改-视图
|
||||
*
|
||||
* @author youyongkun
|
||||
* @date 2021/1/6 4:28 下午
|
||||
*/
|
||||
@GetResource(name = "定时管理-修改-视图", path = "editView", requiredPermission = false, requiredLogin = false)
|
||||
public String editView() {
|
||||
return PREFIX + "/timers_edit.html";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,133 @@
|
|||
layui.use(['table', 'admin', 'form', 'func', 'HttpRequest', 'dropdown'], function () {
|
||||
let $ = layui.$;
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let func = layui.func;
|
||||
let HttpRequest = layui.HttpRequest;
|
||||
let dropdown = layui.dropdown;
|
||||
|
||||
// 定时表管理
|
||||
let Position = {
|
||||
tableId: "timerTable"
|
||||
};
|
||||
|
||||
// 初始化表格的列
|
||||
Position.initColumn = function () {
|
||||
return [[
|
||||
{type: 'checkbox'},
|
||||
{field: 'timerId', hide: true, title: '主键id'},
|
||||
{field: 'timerName', sort: true, title: '任务名称'},
|
||||
{field: 'cron', sort: true, title: 'cron表达式'},
|
||||
{field: 'jobStatus', sort: true, templet: '#statusTpl', title: '状态'},
|
||||
{field: 'actionClass', sort: true, title: '任务class'},
|
||||
{field: 'remark', sort: true, title: '备注信息'},
|
||||
{field: 'createUser', sort: true, title: '创建人'},
|
||||
{field: 'updateUser', sort: true, title: '修改人'},
|
||||
{field: 'createTime', sort: true, title: '创建时间'},
|
||||
{field: 'updateTime', sort: true, title: '修改时间'},
|
||||
{align: 'center', toolbar: '#tableBar', title: '操作'}
|
||||
]];
|
||||
};
|
||||
|
||||
// 点击查询按钮
|
||||
Position.search = function () {
|
||||
let queryData = {};
|
||||
queryData['timerName'] = $("#timerName").val();
|
||||
queryData['jobStatus'] = $("#jobStatus").val();
|
||||
table.reload(Position.tableId, {
|
||||
where: queryData,
|
||||
page: {curr: 1}
|
||||
});
|
||||
};
|
||||
|
||||
// 弹出添加对话框
|
||||
Position.openAddDlg = function () {
|
||||
func.open({
|
||||
height: 800,
|
||||
title: '添加定时任务',
|
||||
content: Feng.ctxPath + '/sysTimers/addView',
|
||||
tableId: Position.tableId
|
||||
});
|
||||
};
|
||||
|
||||
// 点击编辑
|
||||
Position.openEditDlg = function (data) {
|
||||
func.open({
|
||||
height: 800,
|
||||
title: '修改定时任务',
|
||||
content: Feng.ctxPath + '/sysTimers/editView?timerId=' + data.timerId,
|
||||
tableId: Position.tableId
|
||||
});
|
||||
};
|
||||
|
||||
// 点击删除
|
||||
Position.delete = function (data) {
|
||||
let operation = function () {
|
||||
let httpRequest = new HttpRequest(Feng.ctxPath + "/sysTimers/delete", 'post', function (data) {
|
||||
Feng.success("删除成功!");
|
||||
table.reload(Position.tableId);
|
||||
}, function (data) {
|
||||
Feng.error("删除失败!" + data.message + "!");
|
||||
});
|
||||
httpRequest.set(data);
|
||||
httpRequest.start(true);
|
||||
};
|
||||
Feng.confirm("是否删除?", operation);
|
||||
};
|
||||
|
||||
// 修改定时任务状态
|
||||
Position.updateStatus = function (timerId, checked) {
|
||||
// 1-启动 2-停止
|
||||
let updateStatusUrl = checked == 1 ? "/sysTimers/start" : "/sysTimers/stop";
|
||||
|
||||
let httpRequest = new HttpRequest(Feng.ctxPath + updateStatusUrl, 'post', function (data) {
|
||||
Feng.success("修改成功!");
|
||||
}, function (data) {
|
||||
Feng.error("修改失败!" + data.responseJSON.message);
|
||||
table.reload(Position.tableId);
|
||||
});
|
||||
httpRequest.set({"timerId": timerId});
|
||||
httpRequest.start(true);
|
||||
};
|
||||
|
||||
// 渲染表格
|
||||
let tableResult = table.render({
|
||||
elem: '#' + Position.tableId,
|
||||
url: Feng.ctxPath + '/sysTimers/page',
|
||||
page: true,
|
||||
request: {pageName: 'pageNo', limitName: 'pageSize'},
|
||||
height: "full-158",
|
||||
cellMinWidth: 100,
|
||||
cols: Position.initColumn(),
|
||||
parseData: Feng.parseData
|
||||
});
|
||||
|
||||
// 搜索按钮点击事件
|
||||
$('#btnSearch').click(function () {
|
||||
Position.search();
|
||||
});
|
||||
|
||||
// 添加按钮点击事件
|
||||
$('#btnAdd').click(function () {
|
||||
Position.openAddDlg();
|
||||
});
|
||||
|
||||
// 工具条点击事件
|
||||
table.on('tool(' + Position.tableId + ')', function (obj) {
|
||||
let data = obj.data;
|
||||
let event = obj.event;
|
||||
if (event === 'edit') {
|
||||
Position.openEditDlg(data);
|
||||
} else if (event === 'delete') {
|
||||
Position.delete(data);
|
||||
}
|
||||
dropdown.hideAll();
|
||||
});
|
||||
|
||||
// 修改状态
|
||||
form.on('switch(status)', function (obj) {
|
||||
let timerId = obj.elem.value;
|
||||
let checked = obj.elem.checked ? 1 : 2;
|
||||
Position.updateStatus(timerId, checked);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,48 @@
|
|||
layui.use(['form', 'admin', 'HttpRequest'], function () {
|
||||
let $ = layui.$;
|
||||
let form = layui.form;
|
||||
let admin = layui.admin;
|
||||
let HttpRequest = layui.HttpRequest;
|
||||
|
||||
// 正则不全-弃用
|
||||
form.verify({
|
||||
corn: function (value, item) {
|
||||
// corn 正则验证
|
||||
let cornRegEx = '/^[^\\s]*\\s[^\\s]*\\s[^\\s]*\\s((\\*|(1[0-2]|[0-9])|(1[0-2]|[0-9])-(1[0-2]|[0-9]))(\\/(1[0-2]|[0-9]))*|(((1[0-2]|[0-9])|(1[0-2]|[0-9])-(1[0-2]|[0-9]))+(,((1[0-2]|[0-9])|(1[0-2]|[0-9])-(1[0-2]|[0-9])))*)|(((jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)|(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec))))\\s[^\\s]*$/i\n';
|
||||
if (value == "") {
|
||||
return 'corn表达式不能为空';
|
||||
}
|
||||
if (!new RegExp(cornRegEx).test(value)) {
|
||||
return 'corn表达式错误';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 渲染任务job class实现类
|
||||
$.ajax({
|
||||
url: Feng.ctxPath + '/sysTimers/getActionClasses',
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
success: function (data) {
|
||||
//使用循环遍历,给下拉列表赋值
|
||||
$.each(data.data, function (index, value) {
|
||||
$('#actionClass').append(new Option(value, value));// 下拉菜单里添加元素
|
||||
});
|
||||
layui.form.render("select");//重新渲染 固定写法
|
||||
}
|
||||
})
|
||||
|
||||
//表单提交事件
|
||||
form.on('submit(btnSubmit)', function (data) {
|
||||
let request = new HttpRequest(Feng.ctxPath + "/sysTimers/add", 'post', function (data) {
|
||||
admin.closeThisDialog();
|
||||
Feng.success("添加成功!");
|
||||
admin.putTempData('formOk', true);
|
||||
}, function (data) {
|
||||
admin.closeThisDialog();
|
||||
Feng.error("添加失败!" + data.message);
|
||||
});
|
||||
request.set(data.field);
|
||||
request.start(true);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,48 @@
|
|||
layui.use(['form', 'admin', 'HttpRequest'], function () {
|
||||
let $ = layui.$;
|
||||
let form = layui.form;
|
||||
let admin = layui.admin;
|
||||
let HttpRequest = layui.HttpRequest;
|
||||
//获取详情信息,填充表单
|
||||
|
||||
|
||||
//获取用户详情
|
||||
let request = new HttpRequest(Feng.ctxPath + "/sysTimers/detail?timerId=" + Feng.getUrlParam("timerId"), 'get');
|
||||
let result = request.start();
|
||||
// 处理下拉框回显
|
||||
let actionClass = result.data.actionClass;
|
||||
$('#actionClass').append(new Option(actionClass, actionClass));
|
||||
|
||||
// 渲染任务job class实现类下拉框
|
||||
$.ajax({
|
||||
url: Feng.ctxPath + '/sysTimers/getActionClasses',
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
success: function (data) {
|
||||
//使用循环遍历,给下拉列表赋值
|
||||
$.each(data.data, function (index, value) {
|
||||
if (actionClass != value) {
|
||||
$('#actionClass').append(new Option(value, value));
|
||||
}
|
||||
});
|
||||
layui.form.render("select");
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
form.val('positionForm', result.data);
|
||||
|
||||
//表单提交事件
|
||||
form.on('submit(btnSubmit)', function (data) {
|
||||
let request = new HttpRequest(Feng.ctxPath + "/sysTimers/edit", 'post', function (data) {
|
||||
Feng.success("修改成功!");
|
||||
admin.putTempData('formOk', true);
|
||||
admin.closeThisDialog();
|
||||
}, function (data) {
|
||||
admin.closeThisDialog();
|
||||
Feng.error("修改失败!" + data.message);
|
||||
});
|
||||
request.set(data.field);
|
||||
request.start(true);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,45 @@
|
|||
@layout("/layout/_container.html",{js:["/assets/modular/system/timers/timers.js"]}){
|
||||
|
||||
<div class="layui-body-header">
|
||||
<span class="layui-body-header-title">定时管理</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-sm12 layui-col-md12 layui-col-lg12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form toolbar">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline" aria-placeholder="任务名称">
|
||||
<input id="timerName" class="layui-input" type="text" placeholder="任务名称"/>
|
||||
</div>
|
||||
<div class="layui-inline" aria-placeholder="状态">
|
||||
<select id="jobStatus" lay-filter="type">
|
||||
<option value="">请选择</option>
|
||||
<option value="1">运行</option>
|
||||
<option value="2">停止</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button id="btnSearch" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button>
|
||||
<button id="btnAdd" class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="layui-table" id="timerTable" lay-filter="timerTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="tableBar">
|
||||
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="statusTpl">
|
||||
<input type="checkbox" lay-filter="status" value="{{d.timerId}}" lay-skin="switch" lay-text="运行|停止" {{d.jobStatus=='1'?'checked':''}}/>
|
||||
</script>
|
||||
@}
|
|
@ -0,0 +1,48 @@
|
|||
@layout("/layout/_form.html",{js:["/assets/modular/system/timers/timers_add.js"]}){
|
||||
|
||||
<form class="layui-form" id="timerForm" lay-filter="positionForm">
|
||||
<div class="layui-fluid" style="padding-bottom: 75px;">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">基本信息</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item layui-row">
|
||||
<input name="timerId" type="hidden"/>
|
||||
<div class="layui-inline layui-col-md12">
|
||||
<label class="layui-form-label">任务名称<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<input id="timerName" name="timerName" placeholder="请输入任务名称" type="text" class="layui-input" lay-verify="required" required/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline layui-col-md12">
|
||||
<label class="layui-form-label">任务job<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<select name="actionClass" id="actionClass" lay-verify="required" lay-filter="actionClass">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline layui-col-md12">
|
||||
<label class="layui-form-label" style="width: auto">cron表达式<span style="color: red;">*</span></label>
|
||||
<!-- http://89tool.com/cron -->
|
||||
<div class="layui-input-block" style="width: auto">
|
||||
<input id="cron" name="cron" placeholder="请输入cron表达式" type="text" class="layui-input" lay-verify="required" required/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline layui-col-md12">
|
||||
<label class="layui-form-label">备注</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea id="remark" name="remark" placeholder="请输入备注" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group-bottom text-center">
|
||||
<button class="layui-btn" lay-filter="btnSubmit" lay-submit> 提交 </button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary" ew-event="closeDialog"> 取消 </button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
@}
|
|
@ -0,0 +1,49 @@
|
|||
@layout("/layout/_form.html",{js:["/assets/modular/system/timers/timers_edit.js"]}){
|
||||
|
||||
<form class="layui-form" id="positionForm" lay-filter="positionForm">
|
||||
<div class="layui-fluid" style="padding-bottom: 75px;">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">基本信息</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item layui-row">
|
||||
<input name="timerId" type="hidden"/>
|
||||
<input name="jobStatus" type="hidden"/>
|
||||
<div class="layui-inline layui-col-md12">
|
||||
<label class="layui-form-label">任务名称<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<input id="timerName" name="timerName" placeholder="请输入任务名称" type="text" class="layui-input" lay-verify="required" required/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline layui-col-md12">
|
||||
<label class="layui-form-label">任务job<span style="color: red;">*</span></label>
|
||||
<!-- http://89tool.com/cron -->
|
||||
<div class="layui-input-block">
|
||||
<select name="actionClass" id="actionClass" lay-verify="required" lay-filter="actionClass">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline layui-col-md12">
|
||||
<label class="layui-form-label" style="width: auto">cron表达式<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block" style="width: auto">
|
||||
<input id="cron" name="cron" placeholder="请输入cron表达式" type="text" class="layui-input" lay-verify="required" required/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline layui-col-md12">
|
||||
<label class="layui-form-label">备注</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea id="remark" name="remark" placeholder="请输入备注" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group-bottom text-center">
|
||||
<button class="layui-btn" lay-filter="btnSubmit" lay-submit> 提交 </button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary" ew-event="closeDialog"> 取消 </button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
@}
|
Loading…
Reference in New Issue