Former-commit-id: 362825eaba3212842fcfde8271b54eb8ed7242dc
TangShanKaiPing
wanggang 5 years ago
parent 88a86cf764
commit 6a32fac057

@ -28,6 +28,11 @@ namespace Infrastructure.Web.SignalR
{
Context.Items["type"] = type;
}
var organ = Context.GetHttpContext().Request.Query["organ"].ToString();
if (!string.IsNullOrEmpty(organ))
{
Context.Items["organ"] = organ;
}
this.Clients.Group(Context.ConnectionId).SendAsync("Connected", Context.ConnectionId);
}

@ -53,8 +53,6 @@ namespace IoT.Shared.Areas.Admin.Controlls
{
var dataService = scope.ServiceProvider.GetService<DataService>();
dataService.Edit<TEntity, TEditModel>(model);
var iotNodeClient = scope.ServiceProvider.GetService<IoTNodeClient>();
iotNodeClient.ClientToServer(method, model, null);
}
return RedirectTo();
}
@ -95,8 +93,8 @@ namespace IoT.Shared.Areas.Admin.Controlls
var model = entity.To<TEditModel>();
var dataService = scope.ServiceProvider.GetService<DataService>();
dataService.Delete<TEntity, TEditModel>(model);
var iotNodeClient = scope.ServiceProvider.GetService<IoTNodeClient>();
iotNodeClient.ClientToServer(method, model, null);
//var iotNodeClient = scope.ServiceProvider.GetService<IoTNodeClient>();
//iotNodeClient.ClientToServer(method, model, null);
}
}
}

@ -1,9 +1,11 @@
using Application.Domain.Entities;
using Application.Models;
using Infrastructure.Data;
using Infrastructure.Events;
using Infrastructure.Extensions;
using Infrastructure.Web.SignalR;
using IoT.Shared.Services;
using IoT.Shared.Services.IoTCenter;
using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
@ -36,6 +38,7 @@ namespace IoTCenter.Services
private readonly IRepository<SceneTigger> _iotTiggerRepo;
private readonly DataService _dataService;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IEventPublisher _publisher;
public IoTCenterHub(IConfiguration cfg,
ILogger<IoTCenterHub> logger,
@ -51,7 +54,8 @@ namespace IoTCenter.Services
IRepository<SceneTimer> iotTimerRepo,
IRepository<SceneTigger> iotTiggerRepo,
DataService dataService,
IHttpClientFactory httpClientFactory)
IHttpClientFactory httpClientFactory,
IEventPublisher publisher)
{
this._cfg = cfg;
this._logger = logger;
@ -68,6 +72,7 @@ namespace IoTCenter.Services
this._iotTiggerRepo = iotTiggerRepo;
this._dataService = dataService;
this._httpClientFactory = httpClientFactory;
this._publisher = publisher;
}
public override Task OnConnectedAsync()
@ -97,6 +102,11 @@ namespace IoTCenter.Services
try
{
this._nodeRepo.SaveChanges();
var organ = Context.Items["organ"] as string;
if (!string.IsNullOrEmpty(organ))
{
this._publisher.Publish(new NodeClientConnectedEvent { NodeNumber=node.Number,OrganNumber=organ });
}
}
catch (Exception ex)
{

@ -0,0 +1,8 @@
namespace IoT.Shared.Services.IoTCenter
{
public class NodeClientConnectedEvent
{
public string NodeNumber { get; set; }
public string OrganNumber { get; set; }
}
}

@ -132,7 +132,8 @@ namespace IoT.Shared.Services
private void InitConnection()
{
this._notifyHost = GetSetting("notify:host");
var url = $"{this._notifyHost}/hub?type=node&group={GetSetting("sn")}";
var organ= GetSetting("organ");
var url = $"{this._notifyHost}/hub?type=node&organ={organ}&group={GetSetting("sn")}";
this._logger.LogDebug($"init connection for {url}");
if (this.Connection != null)
{

@ -9,6 +9,8 @@ namespace IoTCenter.Application.Domain
{
public string Name { get; set; }
public string Number { get; set; }
[Display(Name = "分类图标")]
public string Image { get; set; }
public List<OrganNode> OrganNodes { get; set; } = new List<OrganNode>();
}
}

@ -16,6 +16,11 @@ namespace IoTCenter.Application.Models
[Required(ErrorMessage = nameof(RequiredAttribute))]
public string Number { get; set; }
[Display(Name = "Icon")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
[DataType(DataType.ImageUrl)]
public string Image { get; set; }
[Display(Name = "节点")]
[DataType("MultiSelectList")]
public List<Guid> Nodes { get; set; } = new List<Guid>();

@ -4,13 +4,14 @@ using CSScriptLib;
using Infrastructure.Data;
using Infrastructure.Events;
using Infrastructure.Extensions;
using IoT.Shared.Services.IoTCenter;
using IoTCenter.Application.Domain;
using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
@ -42,10 +43,14 @@ namespace IoTCenter.Services
IEventHander<EntityDeletedEvent<Command>>,
IEventHander<EntityInsertedEvent<Scene>>,
IEventHander<EntityUpdatedEvent<Scene>>,
IEventHander<EntityDeletedEvent<Scene>>
IEventHander<EntityDeletedEvent<Scene>>,
IEventHander<NodeClientConnectedEvent>
{
private readonly IConfiguration _cfg;
private readonly ILogger<IoTCenterEventHandler> _logger;
private readonly IRepository<Node> _nodeRepo;
private readonly IRepository<Organ> _organRepo;
private readonly IRepository<OrganNode> _organNodeRepo;
private readonly IRepository<Scene> _sceneRepo;
private readonly IRepository<Device> _deviceRepo;
private readonly IRepository<SceneTigger> _sceneTiggerRepo;
@ -55,6 +60,9 @@ namespace IoTCenter.Services
public IoTCenterEventHandler(IConfiguration cfg,
ILogger<IoTCenterEventHandler> logger,
IRepository<Node> nodeRepo,
IRepository<Organ> organRepo,
IRepository<OrganNode> organNodeRepo,
IRepository<Scene> sceneRepo,
IRepository<Device> deviceRepo,
IRepository<SceneTigger> sceneTiggerRepo,
@ -64,6 +72,9 @@ namespace IoTCenter.Services
{
this._cfg = cfg;
this._logger = logger;
this._nodeRepo = nodeRepo;
this._organRepo = organRepo;
this._organNodeRepo = organNodeRepo;
this._sceneRepo = sceneRepo;
this._deviceRepo = deviceRepo;
this._sceneTiggerRepo = sceneTiggerRepo;
@ -377,5 +388,29 @@ namespace IoTCenter.Services
_ => model.Value,
};
}
public void Handle(NodeClientConnectedEvent message)
{
var organ = this._organRepo.Table().FirstOrDefault(o => o.Number == message.OrganNumber);
if(organ==null)
{
organ = new Organ {
Name=message.OrganNumber,
Number= message.OrganNumber,
Image = "/images/classroom.png"
};
this._organRepo.Add(organ);
this._organRepo.SaveChanges();
}
if (!this._organNodeRepo.Table().Any(o => o.Organ.Number == message.OrganNumber && o.Node.Number == message.NodeNumber))
{
var node = this._nodeRepo.Table().FirstOrDefault(o => o.Number == message.NodeNumber);
if (node != null)
{
this._organNodeRepo.Add(new OrganNode { NodeId=node.Id,OrganId=organ.Id });
this._organNodeRepo.SaveChanges();
}
}
}
}
}

@ -5,19 +5,12 @@
<div id="template">
<template v-if="node">
<!--场景-->
<div class="row" v-if="scenes.length">
<div class="col col-md-12">
<div class="card">
<div class="row" v-if="node.scenes.length">
<div class="col">
<div class="card" style="margin:10px;">
<div class="card-header">场景</div>
<div class="card-body">
<div class="row">
<div class="col" v-for="scene in scenes()" v-on:click="execScene(scene.id)">
<div class="weui-grid__icon">
<img class="weui-tabbar__icon" :src="'/IoTCenter'+scene.image" />
</div>
<p class="weui-grid__label">{{scene.name}}</p>
</div>
</div>
<button class="btn btn-success" v-for="scene in node.scenes" v-on:click="execScene(scene.id)">{{scene.name}}</button>
</div>
</div>
</div>

@ -41,7 +41,8 @@ CREATE TABLE "iot_Organ" (
"Id" TEXT NOT NULL CONSTRAINT "PK_iot_Organ" PRIMARY KEY,
"IsDeleted" TEXT NULL,
"Name" TEXT NULL,
"Number" TEXT NOT NULL
"Number" TEXT NOT NULL,
"Image" TEXT NULL
);
CREATE TABLE "iot_PermissionCategory" (

@ -1,5 +1,5 @@
<template>
<div class="card" style="box-sizing:border-box;height:150px;">
<div class="card" style="box-sizing:border-box;height:150px;margin:10px;">
<div class="card-header">
{{device.displayName}}
<span class="float-right text-success" v-if="device.isOnline"><i class="ion ion-ios-wifi"></i></span>

@ -6,12 +6,13 @@
<li class="nav-item"><a class="nav-link @GetClass("Permission")" href="@Url.Action("Index","Permission")"><i class="nav-icon fas fa-key"></i><p>权限管理</p></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Category")" href="@Url.Action("Index","Category")"><i class="nav-icon fa fa-cubes"></i><span>分类管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Product")" href="@Url.Action("Index","Product")"><i class="nav-icon fa fa-leaf"></i><span>产品管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Api")" href="@Url.Action("Index","Api")"><i class="nav-icon fa fa-plug"></i><span>接口管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Parameter")" href="@Url.Action("Index","Parameter")"><i class="nav-icon far fa-circle"></i><span>参数管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Node")" href="@Url.Action("Index","Node")"><i class="nav-icon fa fa-home"></i><span>节点管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Device")" href="@Url.Action("Index","Device")"><i class="nav-icon fa fa-tv"></i><span>设备管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Data")" href="@Url.Action("Index","Data")"><i class="nav-icon fa fa-database"></i><span>数据管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Api")" href="@Url.Action("Index","Api")"><i class="nav-icon fa fa-plug"></i><span>接口管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Parameter")" href="@Url.Action("Index","Parameter")"><i class="nav-icon far fa-circle"></i><span>参数管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Command")" href="@Url.Action("Index","Command")"><i class="nav-icon far fa-circle"></i><span>命令管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("Scene")" href="@Url.Action("Index","Scene")"><i class="nav-icon fa fa-list-ol"></i><span>场景管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("SceneCommand")" href="@Url.Action("Index","SceneCommand")"><i class="nav-icon far fa-circle"></i><span>场景命令管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("SceneTimer")" href="@Url.Action("Index","SceneTimer")"><i class="nav-icon far fa-clock"></i><span>场景定时器管理</span></a></li>
<li class="nav-item"><a class="nav-link @GetClass("SceneTigger")" href="@Url.Action("Index","SceneTigger")"><i class="nav-icon fa fa-fire"></i><span>场景触发器管理</span></a></li>

@ -1,6 +1,7 @@
using Application.Domain.Entities;
using Infrastructure.Data;
using Infrastructure.Web;
using IoT.Shared.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
@ -13,28 +14,38 @@ namespace IoTNode.Controllers
public class HomeController : BaseController
{
private readonly IRepository<Node> _nodeRepo;
private readonly IRepository<Device> _deviceRepo;
private readonly IRepository<Scene> _sceneRepo;
private readonly IoTNodeClient _ioTNodeClient;
public HomeController(IRepository<Node> nodeRepo, IRepository<Device> deviceRepo)
public HomeController(IRepository<Node> nodeRepo, IRepository<Scene> sceneRepo,IoTNodeClient ioTNodeClient)
{
this._nodeRepo = nodeRepo;
this._deviceRepo = deviceRepo;
this._sceneRepo = sceneRepo;
this._ioTNodeClient = ioTNodeClient;
}
[Authorize]
public IActionResult Index()
{
var model = this._deviceRepo.ReadOnlyTable().Include(o => o.Node).Include(o => o.Product).ToList();
var model = this._nodeRepo.ReadOnlyTable().Include(o => o.Devices).ThenInclude(o => o.Product).FirstOrDefault();
return View(model);
}
public IActionResult GetNode(Guid id)
public IActionResult Scenes()
{
var model = this._nodeRepo.ReadOnlyTable()
.Include(o => o.Scenes)
.Include(o => o.Devices).ThenInclude(o => o.Data)
.FirstOrDefault(o => o.Id == id);
return Json(model);
var model = this._sceneRepo.ReadOnlyTable()
.Include(o => o.SceneTimers)
.Include(o => o.SceneTiggers)
.Include(o => o.SceneCommands).ThenInclude(o=>o.Command).ThenInclude(o=>o.Device)
.Include(o=>o.SceneCommands).ThenInclude(o=>o.Command).ThenInclude(o=>o.Api)
.ToList();
return View(model);
}
public IActionResult Upload()
{
this._ioTNodeClient.OnConnected();
return RedirectTo();
}
}
}

@ -67,6 +67,7 @@ namespace IoTNode
set.Add(new Setting { Name = "name", Value = "物联节点", Type = SettingType.Text });
set.Add(new Setting { Name = "logo", Value = "/images/logo.png", Type = SettingType.ImageUrl });
set.Add(new Setting { Name = "copyright", Value = "Copyright © {0} Company. All rights reserved", Type = SettingType.Html });
set.Add(new Setting { Name = "organ", Value = "", Type = SettingType.Text });
//
var macAddress = Helper.Instance.GetMacAddress();
set.Add(new Setting { Name = "sn", Value = macAddress, Type = SettingType.Text });

@ -85,10 +85,7 @@ namespace IoTNode.DeviceServices
public void UpdateData(IRepository<Device> repo, Device device, Data data)
{
var data2 = device.AddorUpdateData(data);
if (repo.SaveChanges() > 0 && !data2.Hidden)
{
this.SendDataToServer(data2);
}
repo.SaveChanges();
}
public Product UpdateProduct(string productName, string productNumber, string path, string categoryNumber, string productIcon)
@ -117,7 +114,7 @@ namespace IoTNode.DeviceServices
OpenApiService.UpdateApi(product);
productRepo.Add(product);
productRepo.SaveChanges();
this.SendToServer(Methods.UpdateProductResponse, product);
//this.SendToServer(Methods.UpdateProductResponse, product);
}
return product;
}

@ -69,10 +69,7 @@ namespace IoTNode.DeviceServices.FBee
if (data != null)
{
data.Value = buttons.FromJson<List<ButtonModel>>().ToJson(true);
if (deviceRepo.SaveChanges() > 0)
{
this.SendDataToServer(data);
}
deviceRepo.SaveChanges();
}
}
}

@ -55,10 +55,7 @@ namespace IoTNode.DeviceServices.SerialPortManager
if (data != null)
{
data.Value = buttons.FromJson<List<SPCommandModel>>().ToJson(true);
if (deviceRepo.SaveChanges() > 0)
{
this.SendDataToServer(data);
}
deviceRepo.SaveChanges();
}
}
}

@ -4,6 +4,7 @@ using Hangfire;
using Infrastructure.Application.Entites.Settings;
using Infrastructure.Events;
using Infrastructure.Extensions;
using IoT.Shared.Services;
using IoTNode.DeviceServices.Onvif;
using System;
using System.Threading.Tasks;
@ -20,12 +21,14 @@ namespace IoTNode.Services
private readonly ISceneTiggerService _sceneTiggerService;
private readonly IoTNodeJob _job;
private readonly OnvifService _onvifService;
private readonly IoTNodeClient _ioTNodeClient;
public IoTNodeEventHandler(ISceneTiggerService sceneTiggerService, IoTNodeJob job, OnvifService onvifService)
public IoTNodeEventHandler(ISceneTiggerService sceneTiggerService, IoTNodeJob job, OnvifService onvifService, IoTNodeClient ioTNodeClient)
{
this._sceneTiggerService = sceneTiggerService;
this._job = job;
this._onvifService = onvifService;
this._ioTNodeClient = ioTNodeClient;
}
public void Handle(EntityInsertedEvent<SceneTimer> message)
@ -77,6 +80,11 @@ namespace IoTNode.Services
this._onvifService.StopPushToServer();
this._onvifService.StartPushToServer();
}
else if(message.Data.Name=="organ")
{
this._ioTNodeClient.Close();
this._ioTNodeClient.Connect();
}
}
}
}

@ -0,0 +1,213 @@
using Application.Domain.Entities;
using Infrastructure.Events;
using IoT.Shared.Services;
using IoTNode.DeviceServices.Onvif;
namespace IoTNode.Services
{
public class IoTNodeToServerEventHandler :
IEventHander<EntityInsertedEvent<Product>>,
IEventHander<EntityUpdatedEvent<Product>>,
IEventHander<EntityDeletedEvent<Product>>,
IEventHander<EntityInsertedEvent<Api>>,
IEventHander<EntityUpdatedEvent<Api>>,
IEventHander<EntityDeletedEvent<Api>>,
IEventHander<EntityInsertedEvent<Parameter>>,
IEventHander<EntityUpdatedEvent<Parameter>>,
IEventHander<EntityDeletedEvent<Parameter>>,
IEventHander<EntityUpdatedEvent<Node>>,
IEventHander<EntityInsertedEvent<Device>>,
IEventHander<EntityUpdatedEvent<Device>>,
IEventHander<EntityDeletedEvent<Device>>,
IEventHander<EntityInsertedEvent<Data>>,
IEventHander<EntityUpdatedEvent<Data>>,
IEventHander<EntityDeletedEvent<Data>>,
IEventHander<EntityInsertedEvent<Command>>,
IEventHander<EntityUpdatedEvent<Command>>,
IEventHander<EntityDeletedEvent<Command>>,
IEventHander<EntityInsertedEvent<Scene>>,
IEventHander<EntityUpdatedEvent<Scene>>,
IEventHander<EntityDeletedEvent<Scene>>,
IEventHander<EntityInsertedEvent<SceneTimer>>,
IEventHander<EntityUpdatedEvent<SceneTimer>>,
IEventHander<EntityDeletedEvent<SceneTimer>>,
IEventHander<EntityInsertedEvent<SceneTigger>>,
IEventHander<EntityUpdatedEvent<SceneTigger>>,
IEventHander<EntityDeletedEvent<SceneTigger>>
{
private readonly ISceneTiggerService _sceneTiggerService;
private readonly IoTNodeJob _job;
private readonly OnvifService _onvifService;
private readonly IoTNodeClient _iotNodeClient;
public IoTNodeToServerEventHandler(ISceneTiggerService sceneTiggerService, IoTNodeJob job, OnvifService onvifService, IoTNodeClient iotNodeClient)
{
this._sceneTiggerService = sceneTiggerService;
this._job = job;
this._onvifService = onvifService;
this._iotNodeClient = iotNodeClient;
}
private void ClientToServer<T>(BaseEvent<T> message)
{
if (message is EntityInsertedEvent<T> || message is EntityUpdatedEvent<T>)
{
_iotNodeClient.ClientToServer($"Edit{typeof(T).Name}", message.Data, null);
}
else if (message is EntityDeletedEvent<T>)
{
_iotNodeClient.ClientToServer($"Delete{typeof(T).Name}", message.Data, null);
}
}
public void Handle(EntityInsertedEvent<Product> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<Product> message)
{
this.ClientToServer(message);
}
public void Handle(EntityDeletedEvent<Product> message)
{
this.ClientToServer(message);
}
public void Handle(EntityInsertedEvent<Api> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<Api> message)
{
this.ClientToServer(message);
}
public void Handle(EntityDeletedEvent<Api> message)
{
this.ClientToServer(message);
}
public void Handle(EntityInsertedEvent<Parameter> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<Parameter> message)
{
this.ClientToServer(message);
}
public void Handle(EntityDeletedEvent<Parameter> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<Node> message)
{
this.ClientToServer(message);
}
public void Handle(EntityInsertedEvent<Device> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<Device> message)
{
this.ClientToServer(message);
}
public void Handle(EntityDeletedEvent<Device> message)
{
this.ClientToServer(message);
}
public void Handle(EntityInsertedEvent<Data> message)
{
if (!message.Data.Hidden)
{
this.ClientToServer(message);
}
}
public void Handle(EntityUpdatedEvent<Data> message)
{
if (!message.Data.Hidden)
{
this.ClientToServer(message);
}
}
public void Handle(EntityDeletedEvent<Data> message)
{
if (!message.Data.Hidden)
{
this.ClientToServer(message);
}
}
public void Handle(EntityInsertedEvent<Command> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<Command> message)
{
this.ClientToServer(message);
}
public void Handle(EntityDeletedEvent<Command> message)
{
this.ClientToServer(message);
}
public void Handle(EntityInsertedEvent<Scene> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<Scene> message)
{
this.ClientToServer(message);
}
public void Handle(EntityDeletedEvent<Scene> message)
{
this.ClientToServer(message);
}
public void Handle(EntityInsertedEvent<SceneTimer> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<SceneTimer> message)
{
this.ClientToServer(message);
}
public void Handle(EntityDeletedEvent<SceneTimer> message)
{
this.ClientToServer(message);
}
public void Handle(EntityInsertedEvent<SceneTigger> message)
{
this.ClientToServer(message);
}
public void Handle(EntityUpdatedEvent<SceneTigger> message)
{
this.ClientToServer(message);
}
public void Handle(EntityDeletedEvent<SceneTigger> message)
{
this.ClientToServer(message);
}
}
}

@ -1,23 +1,25 @@
@model List<Device>
@model Node
@{
HtmlTitle = "设备";
var index = 0;
}
<div class="row">
@Model.Name:@Model.Number<a class="btn btn-info btn-sm" href="@Url.Action("Upload","Home")">上传数据</a>
</div>
<div class="row">
<table class="table">
<tr>
<td>#</td>
<td>节点</td>
<td>产品</td>
<td>设备</td>
<td>显示名称</td>
<td>在线</td>
<td>操作</td>
</tr>
@foreach (var item in Model)
@foreach (var item in Model.Devices)
{
<tr>
<td>@(++index)</td>
<td>@item.Node.Number@item.Node.Name</td>
<td>@item.Product.Number@item.Product.Name</td>
<td>@item.Number@item.Name</td>
<td>@item.DisplayName</td>
@ -28,16 +30,16 @@
var values = item.Number.Split('-');
var gateway = values[0];
var number = values[1];
<a class="api ajax" href="@Url.Action("X95","Gateway",new { gateway = gateway,number=number})" data-number="@item.Number">从网关移除</a>
<a class="api ajax btn btn-info btn-sm" href="@Url.Action("X95","Gateway",new { gateway = gateway,number=number})" data-number="@item.Number">从网关移除</a>
}
else if (item.Product.Name == "摄像头")
{
<a class="api ajax" href="@Url.Action("StartPush","Onvif",new {number=item.Number})" data-number="@item.Number">开始推流</a>
<a class="api ajax" href="@Url.Action("StopPush","Onvif",new {number=item.Number})" data-number="@item.Number">停止推流</a>
<a class="api ajax btn btn-info btn-sm" href="@Url.Action("StartPush","Onvif",new {number=item.Number})" data-number="@item.Number">开始推流</a>
<a class="api ajax btn btn-info btn-sm" href="@Url.Action("StopPush","Onvif",new {number=item.Number})" data-number="@item.Number">停止推流</a>
}
else if (item.Product.Number.Contains("gateway"))
{
<a class="api ajax" href="@Url.Action("X95","Gateway",new { number=item.Number})" data-number="@item.Number">查询网关设备</a>
<a class="api ajax btn btn-info btn-sm" href="@Url.Action("X95","Gateway",new { number=item.Number})" data-number="@item.Number">查询网关设备</a>
}
</td>
</tr>

@ -0,0 +1,53 @@
@model List<Scene>
@{
HtmlTitle = "场景";
var index = 0;
}
<div class="row">
<table class="table">
<tr>
<td>#</td>
<td>场景</td>
<td>命令</td>
<td>定时器</td>
<td>触发器</td>
</tr>
@foreach (var scene in Model)
{
<tr>
<td>@(++index)</td>
<td>@scene.Name</td>
<td>
@foreach (var sceneCommand in scene.SceneCommands)
{
<div>@sceneCommand.Command.Device.Name @sceneCommand.Command.Name @sceneCommand.Command.Api.Name @sceneCommand.Command.QueryString</div>
}
</td>
<td>
@foreach (var sceneTimer in scene.SceneTimers)
{
<div>@sceneTimer.Cron</div>
}
</td>
<td>
@foreach (var sceneTigger in scene.SceneTiggers)
{
<div>@Cronos.CronExpression.Parse(sceneTigger.Condition).GetNextOccurrence(DateTime.UtcNow)</div>
}
</td>
</tr>
}
</table>
</div>
@section scripts{
<script>
$('a.ajax.api').click(function () {
if (confirm('确认操作编号为:' + $(this).attr('data-number') + '的设备吗?')) {
$.get($(this).attr('href'), function () {
window.location.href = window.location.href;
});
};
return false;
});
</script>
}

@ -1,20 +1,16 @@
<ul class="nav navbar-nav">
<li class="@GetClass("Index","Home")">
<a href="@Url.Action("Index","Home")">
首页
</a>
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link @GetClass("Index","Home")" href="@Url.Action("Index","Home")">设备</a>
</li>
<li class="@GetClass("Node","Home")">
<a href="@Url.Action("Node","Home")">
节点
</a>
<li class="nav-item">
<a class="nav-link @GetClass("Scenes","Home")" href="@Url.Action("Scenes","Home")">场景</a>
</li>
</ul>
@functions{
public string GetClass(string action,string controller)
public string GetClass(string action, string controller)
{
if (this.ViewContext.RouteData.Values["action"].ToString()==action&&
this.ViewContext.RouteData.Values["controller"].ToString()==controller)
if (this.ViewContext.RouteData.Values["action"].ToString() == action &&
this.ViewContext.RouteData.Values["controller"].ToString() == controller)
{
return "active";
}

@ -33,7 +33,7 @@ CREATE TABLE "iot_PermissionCategory" (
CREATE TABLE "iot_Role" (
"Id" TEXT NOT NULL CONSTRAINT "PK_iot_Role" PRIMARY KEY,
"IsDeleted" TEXT NULL,
"Name" TEXT NULL,
"Name" TEXT NOT NULL,
"IsReadOnly" INTEGER NOT NULL
);
@ -48,7 +48,7 @@ CREATE TABLE "iot_Setting" (
CREATE TABLE "iot_User" (
"Id" TEXT NOT NULL CONSTRAINT "PK_iot_User" PRIMARY KEY,
"IsDeleted" TEXT NULL,
"UserName" TEXT NULL,
"UserName" TEXT NOT NULL,
"NickName" TEXT NULL,
"Avatar" TEXT NULL,
"SecurityStamp" TEXT NULL,

@ -1,4 +1,4 @@
using System.Reflection;
[assembly: AssemblyVersion("1.0.0.*")]
[assembly: AssemblyInformationalVersion("1.0.0.430")]
[assembly: AssemblyInformationalVersion("1.0.0.506")]
Loading…
Cancel
Save