Former-commit-id: fd5286298fcf76e2261cdff8d899b95c1d44bd22
TangShanKaiPing
wanggang 6 years ago
parent e09a8219da
commit d59bf1f9bf

@ -2,10 +2,9 @@
{
public class CallApiRequest
{
public string Gateway { get; set; }
public string ConnectionId { get; set; }
public string Number { get; set; }
public string Method { get; set; }
public string Query { get; set; }
public string ConnectionId { get; set; }
}
}

@ -203,5 +203,33 @@ namespace IoTCenter.Controllers
}
return Content(string.Empty);
}
public IActionResult AllPowerOn(string connectionId, string[] nodes)
{
this.Power(connectionId, nodes, "On");
return Json(ApiResponse.AsyncSuccess());
}
public IActionResult AllPowerOff(string connectionId, string[] nodes)
{
this.Power(connectionId, nodes, "Off");
return Json(ApiResponse.AsyncSuccess());
}
private void Power(string connectionId, string[] nodes, string command)
{
var devices = this._deviceRepo.ReadOnlyTable()
.Include(o => o.Node)
.Include(o => o.Product.Apis)
.Where(o => nodes.Contains(o.Node.Number))
.Where(o => o.Name.Contains("开关") || o.Name.Contains("插座"))
.ToList();
foreach (var device in devices)
{
var api = device.Product.Apis.FirstOrDefault(o => o.Command == command);
var message = $"{api.Path}{api.Command}?number={device.Number}";
this._pageHubContext.Clients.Group(device.Node.Number).SendAsync(Methods.ServerToClient, Methods.CallApi, message, connectionId);
}
}
}
}

@ -64,8 +64,8 @@
</style>
<title>@HtmlTitle | @cfg["name"]</title>
</head>
<body class="hold-transition skin-blue-light layout-top-nav fixed">
<div class="wrapper">
<body class="hold-transition skin-blue-light layout-top-nav">
<div class="wrapper overlay-wrapper">
<header class="main-header">
<nav class="navbar navbar-static-top">
<div class="container">
@ -114,6 +114,9 @@
</noscript>
<div class="content-wrapper">
<div class="container">
<div class="overlay" style="display:none;">
<i class="fa fa-refresh fa-spin"></i>
</div>
<section class="content" id="template">
</section>
</div>
@ -150,6 +153,7 @@
<script src="~/lib/tree-multiselect/dist/jquery.tree-multiselect.min.js"></script>
<script src="~/lib/kindeditor/kindeditor-all-min.js"></script>
<script src="~/lib/Chart.js/Chart.bundle.min.js"></script>
<script src="lib/signalr/signalr.min.js"></script>
<script>
$(function () {
var template = 'home.default.html';//get template name from server

@ -65,6 +65,7 @@
.ptz {
width: 100%;
padding-top: 1px;
}
.ptz td {
@ -170,6 +171,7 @@
<script src="~/lib/Chart.js/Chart.bundle.min.js"></script>
<script src="~/lib/linq.js/linq.min.js"></script>
<script src="~/lib/flv.js/flv.min.js"></script>
<script src="lib/signalr/signalr.min.js"></script>
<script>
$(function () {
var template = 'node.default.html';//get template name from server

@ -40,22 +40,22 @@
<div class="col-md-2">
</div>
<div class="col-md-1">
<button class="btn btn-block btn-primary">一键开</button>
<button class="btn btn-block btn-primary ajax allpoweron">一键开</button>
</div>
<div class="col-md-1">
<button class="btn btn-block btn-primary">一键关</button>
<button class="btn btn-block btn-primary ajax allpoweroff">一键关</button>
</div>
<div class="col-md-1">
<button class="btn btn-block btn-primary">开关开</button>
<button class="btn btn-block btn-primary ajax allswitchon">开关开</button>
</div>
<div class="col-md-1">
<button class="btn btn-block btn-primary">开关关</button>
<button class="btn btn-block btn-primary ajax allswitchoff">开关关</button>
</div>
<div class="col-md-1">
<button class="btn btn-block btn-primary">插座开</button>
<button class="btn btn-block btn-primary ajax allsocketon">插座开</button>
</div>
<div class="col-md-1">
<button class="btn btn-block btn-primary">插座关</button>
<button class="btn btn-block btn-primary ajax allsocketoff">插座关</button>
</div>
</div>
@ -66,7 +66,7 @@
<div class="box-header">
<h3 class="box-title">{{node.Name}}</h3>
<div class="pull-right box-tools">
<label class="switch on"><input class="switch" type="checkbox" checked /></label>
<label class="switch on"><input :data-node-number="node.Number" class="switch" type="checkbox" checked /></label>
</div>
</div>
<div class="box-body">
@ -75,17 +75,17 @@
<div class="box-footer">
<div class="row">
<div class="col-md-6">
<button class="btn btn-block btn-primary">一键开</button>
<button class="btn btn-block btn-primary ajax nodepoweron">一键开</button>
</div>
<div class="col-md-6">
<button class="btn btn-block btn-primary">一键关</button>
<button class="btn btn-block btn-primary ajax nodepoweroff">一键关</button>
</div>
</div>
<hr />
<div class="row" v-if="node.Scenes.length">
<template v-for="scene in node.Scenes">
<div class="col-md-3" v-if="scene.Tag=='home'">
<button class="btn btn-block btn-info">{{scene.Name}}</button>
<button class="btn btn-block btn-info ajax" :data-node-number="node.Number" :data-scene-name="scene.Name">{{scene.Name}}</button>
</div>
</template>
</div>
@ -93,6 +93,33 @@
</div>
</div>
</div>
<script>
var connection;
var connectionId;
$.ajaxSetup({
cache: false,
timeout: 5000
});
function connect() {
if (connection && connection.connection.connectionState === 1) {
console.log('has connected');
}
else {
console.log('start connect to server:' + Date());
connection.start().then(function () {
console.log('signalR>start');
}).catch(function (err) {
console.error(err.toString());
setTimeout(connect, 10 * 1000);
});
}
}
function onMessage() {
connection.on('Connected', function (id) {
connectionId = id;
});
}
</script>
<script>
function UpdateChart(id, title, data, labels, colors, type) {
var ctx = document.getElementById(id).getContext('2d');
@ -131,6 +158,38 @@
var color = '#' + r.toString(16) + g.toString(16) + b.toString(16);
return color;
}
function ajax(url, data, type) {
console.log(url);
type = type || 'get';
$('.overlay').show();
$.ajax({
type: type,
url: url,
data: data,
success: AjaxCallBack
}).fail(function (result) {
console.log('error');
console.log(result);
}).always(function () {
$('.overlay').hide();
});
}
function AjaxCallBack(response) {
var result = response;
if (result.code === 0) {
if (result.type === 0) {
if (result.format === 1) {
console.log('format/1/base64 jpeg image');
$('#callback .page-content').html('<img class="shot" src="' + result.data + '">');
}
else {
console.log('format/0/json object');
$('#callback .page-content').html(result.data);
}
app.popup.open('#callback');
}
}
}
$('body').on('change', 'input.switch', function (e) {
if ($(this).is(':checked')) {
$(this).parent('label').addClass('on');
@ -140,6 +199,16 @@
$(this).parent('label').removeClass('on');
}
});
$('body').on('click', 'button.ajax', function (e) {
var data = $.map($('.switch:checked').toArray(), function (o) { return $(o).attr('data-node-number'); });
if ($(this).hasClass('allpoweron')) {
ajax('/App/AllPowerOn', { nodes: data }, 'post');
} else if ($(this).hasClass('allpoweroff')) {
ajax('/App/AllPowerOff', { nodes: data }, 'post');
}
return false;
});
</script>
<script>
var vm = new Vue({
@ -156,6 +225,10 @@
UpdateChart('DeviceChart', '设备', vm.ViewModel.DeviceChart.data, vm.ViewModel.DeviceChart.labels, null, 'doughnut');
UpdateChart('EnergyChart', '用电', vm.ViewModel.EnergyChart.data, vm.ViewModel.EnergyChart.labels, null, 'bar');
});
var wsUrl = '/hub?group=page';
connection = new signalR.HubConnectionBuilder().withUrl(wsUrl).build();
onMessage();
connect();
});
}
});

@ -1,4 +1,4 @@
<div style="text-align:center;" v-if="ViewModel">{{ViewModel.Name}}</div>
<h2 class="page-header" v-if="ViewModel">{{ViewModel.Name}}</h2>
<div class="row" v-if="ViewModel">
<div class="col-md-6">
<canvas id="NodeChart" style="width:100%;height:250px;"></canvas>
@ -158,6 +158,7 @@
<div class="col-md-6"><button class="btn btn-block btn-primary">一键开</button></div>
<div class="col-md-6"><button class="btn btn-block btn-primary">一键关</button></div>
</div>
<hr style="margin: 0;" />
<div class="row">
<div class="col-md-3" v-for="scene in ViewModel.Scenes">
<button class="btn btn-block btn-info">{{scene.Name}}</button>
@ -168,10 +169,34 @@
</div>
<div class="row" v-if="ViewModel">
<div class="col-md-6">
开关
<div class="box box-solid btns">
<div class="row">
<div class="col-md-2"><span style="display:inline-block;line-height:70px;">开关:</span></div>
<div class="col-md-5"><button class="btn btn-block btn-primary">一键开</button></div>
<div class="col-md-5"><button class="btn btn-block btn-primary">一键关</button></div>
</div>
<hr style="margin: 0;" />
<div class="row">
<div class="col-md-3" v-for="scene in ViewModel.Scenes">
<button class="btn btn-block btn-info">{{scene.Name}}</button>
</div>
</div>
</div>
</div>
<div class="col-md-6">
插座
<div class="box box-solid btns">
<div class="row">
<div class="col-md-2"><span style="display:inline-block;line-height:70px;">插座:</span></div>
<div class="col-md-5"><button class="btn btn-block btn-primary">一键开</button></div>
<div class="col-md-5"><button class="btn btn-block btn-primary">一键关</button></div>
</div>
<hr style="margin: 0;" />
<div class="row">
<div class="col-md-3" v-for="scene in ViewModel.Scenes">
<button class="btn btn-block btn-info">{{scene.Name}}</button>
</div>
</div>
</div>
</div>
</div>
<script>

Loading…
Cancel
Save