Merge remote-tracking branch 'origin/group3-timer'

pull/65/head
fengshuonan 2021-01-09 20:38:56 +08:00
commit 2c4cbe0946
8 changed files with 431 additions and 0 deletions

View File

@ -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>

View File

@ -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";
}
}

View File

@ -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);
});
});

View File

@ -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);
});
});

View File

@ -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);
});
});

View File

@ -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">&#xe615;</i>搜索</button>
<button id="btnAdd" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</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>
@}

View File

@ -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>&emsp;提交&emsp;</button>
<button type="reset" class="layui-btn layui-btn-primary" ew-event="closeDialog">&emsp;取消&emsp;</button>
</div>
</form>
@}

View File

@ -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>&emsp;提交&emsp;</button>
<button type="reset" class="layui-btn layui-btn-primary" ew-event="closeDialog">&emsp;取消&emsp;</button>
</div>
</form>
@}