Files

80 lines
5.7 KiB
HTML

{extend name="layout"}
<div class="layui-container">
<div class="admin-title">转发规则(规则引擎 / 桥接到 EMQX)</div>
<div class="layui-text" style="margin-bottom:10px;color:#999;">
匹配"源主题过滤器"的消息,将被转发到外部 MQTT Broker(如 EMQX)。目标主题支持
<code>${topic}</code> 变量(沿用原主题)。规则最多 30s 后在 Broker 生效。
转发依赖 <code>workerman/mqtt</code> 客户端,未安装时自动跳过。
</div>
<button class="layui-btn layui-btn-sm" onclick="editRule()">+ 新增规则</button>
<table class="layui-table" style="margin-top:10px;">
<thead>
<tr><th>名称</th><th>源主题过滤器</th><th>目标Broker</th><th>目标主题</th><th>QoS</th><th>状态</th><th>操作</th></tr>
</thead>
<tbody>
{foreach $list as $r}
<tr>
<td>{$r.name}</td>
<td>{$r.source_filter}</td>
<td>{$r.target_broker}</td>
<td>{if !empty($r.target_topic)}{$r.target_topic}{else/}${topic}{/if}</td>
<td>{$r.target_qos}</td>
<td>{if $r.enabled}<span class="layui-badge layui-bg-green">启用</span>{else}<span class="layui-badge">停用</span>{/if}</td>
<td>
<a class="layui-btn layui-btn-xs" onclick='editRule({$r|json_encode})'>编辑</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" onclick="delRule({$r.id})">删除</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
{$list|raw}
</div>
<script>
layui.use(['layer', 'jquery'], function(){
var $ = layui.jquery, layer = layui.layer;
window.editRule = function(row){
row = row || {};
var sel = function(name, val, opts){
var s = '<select name="'+name+'">';
opts.forEach(function(o){ s += '<option value="'+o[0]+'" '+(val==o[0]?'selected':'')+'>'+o[1]+'</option>'; });
return s + '</select>';
};
var html = '<form class="layui-form" style="padding:20px;" lay-filter="ruleForm">'
+ '<input type="hidden" name="id" value="'+(row.id||'')+'">'
+ '<div class="layui-form-item"><label class="layui-form-label">规则名称</label><div class="layui-input-inline"><input name="name" class="layui-input" value="'+(row.name||'')+'"></div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">源主题过滤器</label><div class="layui-input-inline"><input name="source_filter" class="layui-input" value="'+(row.source_filter||'')+'" placeholder="如 sensor/+/temp"></div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">目标类型</label><div class="layui-input-inline">'+sel('target_type', row.target_type||'mqtt', [['mqtt','MQTT Broker']])+'</div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">目标Broker</label><div class="layui-input-inline"><input name="target_broker" class="layui-input" value="'+(row.target_broker||'')+'" placeholder="host:port,如 192.168.1.10:1883"></div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">目标主题</label><div class="layui-input-inline"><input name="target_topic" class="layui-input" value="'+(row.target_topic||'')+'" placeholder="${topic} 表示沿用原主题"></div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">目标QoS</label><div class="layui-input-inline">'+sel('target_qos', (row.target_qos===undefined?0:row.target_qos), [[0,'0'],[1,'1'],[2,'2']])+'</div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">ClientID</label><div class="layui-input-inline"><input name="target_clientid" class="layui-input" value="'+(row.target_clientid||'')+'" placeholder="可选"></div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">用户名</label><div class="layui-input-inline"><input name="target_username" class="layui-input" value="'+(row.target_username||'')+'" placeholder="可选"></div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">密码</label><div class="layui-input-inline"><input name="target_password" type="password" class="layui-input" value="'+(row.target_password||'')+'" placeholder="可选"></div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">状态</label><div class="layui-input-inline">'+sel('enabled', (row.enabled===undefined?1:row.enabled), [[1,'启用'],[0,'停用']])+'</div></div>'
+ '<div class="layui-form-item"><label class="layui-form-label">备注</label><div class="layui-input-inline"><input name="remark" class="layui-input" value="'+(row.remark||'')+'"></div></div>'
+ '</form>';
layer.open({type:1, title:(row.id?'编辑':'新增')+'转发规则', area:['560px','auto'], content:html, btn:['保存','取消'],
success:function(){ layui.form.render(); },
yes:function(idx){
var data = {};
$('[lay-filter=ruleForm]').serializeArray().forEach(function(i){ data[i.name]=i.value; });
$.post('/mqttbroker/backend/saveRule', data, function(res){
layer.msg(res.message||res.msg||'ok');
layer.close(idx); setTimeout(function(){location.reload();},600);
});
}
});
};
window.delRule = function(id){
layer.confirm('确认删除该规则?', function(idx){
$.post('/mqttbroker/backend/deleteRule', {id:id}, function(res){ layer.msg(res.message||'已删除'); setTimeout(function(){location.reload();},600); });
layer.close(idx);
});
};
});
</script>