1、命令行增加常用指令

2、部分界面做了优化
This commit is contained in:
weidong 2024-01-14 15:47:19 +08:00
parent e87818248a
commit 2004255275
13 changed files with 294 additions and 32 deletions

View File

@ -0,0 +1,29 @@
package com.imdroid.secapi.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* GNSS收发统计消息每个工作周期结束的时候统计一次
*
* @author LiGang
*/
@Data
@TableName(value = "devicecmd")
public class DeviceCmd {
// device type definition
public static final short TYPE_GNSS = 0;
public static final short TYPE_DTU = 1;
public static final short TYPE_MPU = 2;
public static final short TYPE_DEBUG = 3;
public static final short MAX_CMD_LEN = 800;
@TableId(value = "id", type = IdType.AUTO)
Long id;
String name;
Short type;
String content;
}

View File

@ -0,0 +1,10 @@
package com.imdroid.secapi.dto;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface DeviceCmdMapper extends BaseMapper<DeviceCmd> {
}

View File

@ -1,18 +1,17 @@
package com.imdroid.beidou.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.imdroid.beidou.common.HttpResult;
import com.imdroid.secapi.client.HttpResp;
import com.imdroid.secapi.client.RtcmClient;
import com.imdroid.secapi.dto.GnssMsg;
import com.imdroid.secapi.dto.GnssMsgMapper;
import com.imdroid.secapi.dto.*;
import com.imdroid.secapi.utils.HexUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
@ -26,6 +25,8 @@ public class CmdLineController extends BasicController{
RtcmClient rtcmClient;
@Autowired
GnssMsgMapper msgMapper;
@Autowired
DeviceCmdMapper deviceCmdMapper;
/**** 推送页面 *****/
@RequestMapping("/page/cmd_line")
@ -35,6 +36,13 @@ public class CmdLineController extends BasicController{
return "/page/cmd_line";
}
@RequestMapping("/page/table/frequent_cmd")
public String frequentCmd(Model m, HttpSession session) {
initModel(m, session);
return "/page/table/frequent_cmd";
}
/****** 发送指令 *******/
@PostMapping(value = "/gnss/config_cmd")
@ResponseBody
@ -83,4 +91,40 @@ public class CmdLineController extends BasicController{
return HttpResult.success(txInfo);
}
@RequestMapping("/gnss/cmd/list")
@ResponseBody
public JSONObject list(int page, int limit) {
Page<DeviceCmd> pageable = new Page<>(page, limit);
IPage<DeviceCmd> cs = deviceCmdMapper.selectPage(pageable, null);
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", 0);
jsonObject.put("msg", "");
jsonObject.put("count", cs.getTotal());
jsonObject.put("data", cs.getRecords());
return jsonObject;
}
@PostMapping("/gnss/cmd/add")
@ResponseBody
public String add(@RequestBody JSONObject object) throws Exception {
DeviceCmd deviceCmd = JSONObject.toJavaObject(object,DeviceCmd.class);
int num = deviceCmdMapper.insert(deviceCmd);
if (num == 0) {
return HttpResult.failed();
} else{
return HttpResult.ok();
}
}
@PostMapping("/gnss/cmd/delete")
@ResponseBody
public String delete(@RequestParam int del_id) throws Exception {
int num = deviceCmdMapper.deleteById(del_id);
if (num == 0) {
return HttpResult.failed();
} else return HttpResult.ok();
}
}

View File

@ -57,4 +57,16 @@ public class WebSocketServer {
}
}
public static void sendMessage(HttpSession httpSession, String msg) {
Session session = webSocketSet.get(httpSession.getId());
if(session != null){
try {
session.getBasicRemote().sendText(msg);
}
catch (Exception e){
log.error("websocket send msg error:", e);
}
}
}
}

View File

@ -246,3 +246,14 @@ CREATE TABLE IF NOT EXISTS `fwdrecords` (
`fwd_group_id` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/***
*/
CREATE TABLE IF NOT EXISTS `devicecmd` (
`id` bigint AUTO_INCREMENT,
`name` varchar(80) NOT NULL,
`type` smallint NOT NULL,
`content` varchar(800) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@ -43,7 +43,7 @@
<div class="layui-inline">
<label class="layui-form-label">指令类型</label>
<div class="layui-input-inline">
<select name="cmd_type" lay-filter="cmd_type">
<select name="cmd_type" id="cmd_type" lay-filter="cmd_type">
<option value="0">GNSS</option>
<option value="1">DTU</option>
<option value="2">MPU</option>
@ -56,6 +56,7 @@
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="send_btn">发送</button>
<button class="layui-btn" lay-submit="" lay-filter="clear_btn">清屏</button>
<button class="layui-btn" lay-submit="" lay-filter="frequent_btn">常用指令</button>
</div>
</div>
</div>
@ -63,7 +64,6 @@
</form>
</div>
</div>
</div>
<script src="../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
@ -111,7 +111,31 @@
rxWin.val("");
return false;
});
form.on('submit(frequent_btn)', function (data) {
var index = layer.open({
title: '常用指令',
type: 2,
shade: 0.2,
maxmin:true,
shadeClose: true,
offset: 'rb',
anim: 2,
area: ['70%', '100%'],
content: '../page/table/frequent_cmd',
});
return false;
});
});
function setCmd(type, content){
var form = layui.form
, $ = layui.$;
console.log(type);
$('#cmd_type').val(type);
$('#tx_win').val(content);
form.render();
}
</script>
<!-- Web socket operations-->
@ -160,12 +184,13 @@
layui.layer.alert("Open web socket failed!");
}
websocket.onclose = function (){
console.log("Socket close");
rxWin.val(rxWin.val()+"websocket closed!");
clearInterval(intervalId);
}
//接收信息
websocket.onmessage = function (event) {
console.log(event.data);
//console.log(event.data);
rxWin.val(rxWin.val()+event.data + "\r\n");
rxWin.scrollTop = rxWin.scrollHeight;
}

View File

@ -12,13 +12,8 @@
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-card top-panel">
<div class="layui-card-header">代理信息</div>
<div class="layui-card-body">
<table class="layui-hide" id="forwardParaTableId" lay-filter="forwardParaTableFilter"></table>
</div>
</div>
</div>
</div>
<script src="../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
@ -34,7 +29,6 @@
table.render({
elem: '#forwardParaTableId',
url: '/fwd/agents',
toolbar: '#toolbarTable',
cols: [[
{field: 'name', title: '名称'},
{field: 'description', title: '描述'},

View File

@ -12,13 +12,8 @@
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-card top-panel">
<div class="layui-card-header">推送记录</div>
<div class="layui-card-body">
<table class="layui-hide" id="forwardParaTableId" lay-filter="forwardParaTableFilter"></table>
</div>
</div>
</div>
</div>
<script src="../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>

View File

@ -82,11 +82,6 @@
table.render({
elem: '#currentTableId',
url: '/gnss/data/list_calc',
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
cols: [[
{field: 'deviceid', title: '设备号'},
{field: 'createtime', title: '上报时间', width:'18%', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},

View File

@ -39,7 +39,6 @@
<div class="layui-inline">
<label class="layui-form-label">所属部门</label>
<div class="layui-input-inline">
</select>
<select name="tenantname" id="tenantname" lay-search="">
<option value="">全部</option>
<option th:each="item : ${tenant_list}" th:text="${item.name}" th:value="${item.name}"></option>

View File

@ -0,0 +1,152 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>常用指令</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="../../lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
background-color: #ffffff;
}
</style>
</head>
<body>
<div class="layui-form layuimini-form">
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
<div class="layui-card top-panel">
<div class="layui-card-body">
<input type="hidden" name="id" id="id">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label required">指令名称</label>
<div class="layui-input-block">
<input type="text" name="name" id="name" lay-verify="required" lay-reqtext="不能为空" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">指令类型</label>
<div class="layui-input-inline">
<select name="type" lay-filter="type">
<option value="0">GNSS</option>
<option value="1">DTU</option>
<option value="2">MPU</option>
<option value="3">DEBUG</option>
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">指令</label>
<div class="layui-input-block">
<textarea name="content" id="content" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
</div>
</div>
</div>
</div>
</div>
<script src="../../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal layui-btn-xs " lay-event="use">使用</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
</script>
<script th:inline="none">
layui.use(['form', 'table'], function () {
var $ = layui.$,
form = layui.form,
table = layui.table;
var iframeIndex = parent.layer.getFrameIndex(window.name);
/**
* 初始化表单,要加上,不然刷新部分组件可能会不加载
*/
form.render();
table.render({
elem: '#currentTableId',
url: '/gnss/cmd/list',
cols: [[
{field: 'name', title: '指令名称'},
{field: 'type', title: '类型',templet: '#typeTrans'},
{field: 'content', title: '指令',width:'50%'},
{title: '操作', toolbar: '#currentTableBar', align: "center", minWidth: 120}
]],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line'
});
table.on('tool(currentTableFilter)', function (obj) {
var data = obj.data;
if (obj.event === 'use') {
parent.setCmd(data.type, data.content);
parent.layer.close(iframeIndex);
}
else if (obj.event === 'delete') {
layer.confirm('确定删除'+data.name+"?", function(index){
$.ajax({
type:"POST",
url:"/gnss/cmd/delete",
data:{
'del_id':data.id
},
success: function (data) {
//data是cotroller相应处理函数的返回值
table.reload('currentTableId');
},
error: function () {
console.log("ajax error");
}
});
layer.close(index);
});
}
});
form.on('submit(saveBtn)', function (data) {
$.ajax({
type:"POST",
url:"/gnss/cmd/add",
contentType: "application/json;charset=UTF-8",
data: JSON.stringify(data.field),
success: function (result) {
table.reload('currentTableId');
},
error: function () {
console.log("ajax error");
}
});
return false;
});
});
</script>
<script type="text/html" id="typeTrans">
{{# if(d.type == 0){ }}
<span>GNSS</span>
{{# } else if(d.type == 1){ }}
<span >DTU</span>
{{# } else if(d.type == 2){ }}
<span >MPU</span>
{{# } else { }}
<span >DEBUG</span>
{{# } }}
</script>
</body>
</html>

View File

@ -47,7 +47,6 @@
<div class="layui-form-item">
<label class="layui-form-label required">所属部门</label>
<div class="layui-input-inline">
</select>
<select name="tenantname" id="tenantname" lay-verify="required" lay-search="">
<option th:each="item : ${tenant_list}" th:text="${item.name}" th:value="${item.name}"></option>
</select>
@ -62,7 +61,6 @@
<div class="layui-form-item">
<label class="layui-form-label required">基本参数组</label>
<div class="layui-input-inline">
</select>
<select name="group_id" id="group_id" lay-verify="required" lay-search="">
<option th:each="item : ${gnss_group_list}" th:text="${item.id}" th:value="${item.id}"></option>
</select>

View File

@ -30,7 +30,6 @@
<div class="layui-form-item">
<label class="layui-form-label required">告警类型</label>
<div class="layui-input-inline">
</select>
<select name="type" id="type" lay-verify="required" lay-search="">
<option th:each="item : ${warn_map}" th:text="${item.value}" th:value="${item.key}"></option>
</select>
@ -59,7 +58,6 @@
</div>
</div>
</div>
</div>
<script src="../../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(['form'], function () {