Former-commit-id: 6f13b462eb3bff9605441e91a536aafced4570b6
TangShanKaiPing
wanggang 6 years ago
parent 5f9ef2bb86
commit bba1c0bc95

Binary file not shown.

@ -1,23 +1,17 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Infrastructure.Domain;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace Infrastructure.Data
{
public class EfDbContext : DbContext
{
public static readonly LoggerFactory MyLoggerFactory = new LoggerFactory(
//new[]
//{
// //new ConsoleLoggerProvider((_, __) => true, true)
//}
);
public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); });
public EfDbContext(DbContextOptions options) : base(options)
{

@ -13,7 +13,7 @@ namespace Application.Domain.Entities
public string Number { get; set; }
[Display(Name = "分类图标")]
public string Icon { get; set; }
public string Image { get; set; }
public List<Product> Products { get; set; } = new List<Product>();
}

@ -14,12 +14,6 @@ namespace Application.Domain.Entities
[Required]
public string Number { get; set; }
[Display(Name = "是否在线")]
public bool IsOnline { get; set; }
[Display(Name = "图标")]
public string Icon { get; set; }
[Display(Name = "图片")]
public string Image { get; set; }

@ -16,7 +16,7 @@ namespace Application.Domain.Entities
public string Number { get; set; }
[Display(Name = "图标")]
public string Icon { get; set; }
public string Image { get; set; }
[Display(Name = "ApiJson")]
public string ApiJson { get; set; }

@ -10,6 +10,14 @@ namespace Application.Models
[Display(Name = "节点")]
public Guid? NodeId { get; set; }
[DataType("SelectList")]
[Display(Name = "分类")]
public Guid? CategoryId { get; set; }
[DataType("SelectList")]
[Display(Name = "产品")]
public Guid? ProductId { get; set; }
[Display(Name = "关键词")]
public string Keyword { get; set; }
}

@ -18,6 +18,7 @@ namespace Application.Models
[Display(Name = "Icon")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public string Icon { get; set; }
[DataType(DataType.ImageUrl)]
public string Image { get; set; }
}
}

@ -16,16 +16,10 @@ namespace Application.Models
[Required(ErrorMessage = nameof(RequiredAttribute))]
public string Number { get; set; }
[Display(Name = "Icon")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public string Icon { get; set; }
[Display(Name = "图片")]
[DataType(DataType.ImageUrl)]
public string Image { get; set; }
[Display(Name = "是否在线")]
public bool IsOnline { get; set; }
[Display(Name = "经度")]
public decimal Longitude { get; set; }

@ -17,8 +17,9 @@ namespace Application.Models
[Display(Name = "产品型号")]
public string Number { get; set; }
[Display(Name = "图标")]
public string Icon { get; set; }
[Display(Name = "图片")]
[DataType(DataType.ImageUrl)]
public string Image { get; set; }
[Display(Name = "ApiJson")]
[DataType(DataType.MultilineText)]

@ -1,12 +0,0 @@
using Application.Domain.Entities;
using System.Collections.Generic;
namespace Application.Models
{
public class HomeViewModel
{
public Node Node { get; set; } = new Node();
public List<Device> Devices { get; set; } = new List<Device>();
public List<Scene> Scenes { get; set; } = new List<Scene>();
}
}

@ -32,8 +32,13 @@ namespace IoT.Shared.Areas.Admin.Controlls
{
throw new ArgumentNullException(nameof(model));
}
ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId));
ViewData.SelectList(o => model.CategoryId, () => this._ajax.GetCategorySelectList(model.CategoryId));
ViewData.SelectList(o => model.ProductId, () => this._ajax.GetProductSelectList(model.ProductId));
return query
.WhereIf(model.NodeId.HasValue, o => o.NodeId == model.NodeId.Value)
.WhereIf(model.CategoryId.HasValue, o => o.Product.CategoryId == model.CategoryId.Value)
.WhereIf(model.ProductId.HasValue, o => o.ProductId == model.ProductId.Value)
.WhereIf(!string.IsNullOrEmpty(model.Keyword), o => o.Name.Contains(model.Keyword));
}

@ -26,7 +26,9 @@
</ItemGroup>
 <ItemGroup>
<EmbeddedResource Include="wwwroot\**\*" />
</ItemGroup>
</ItemGroup><ItemGroup>
<Content Remove="wwwroot\images\classroom.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Infrastructure\Infrastructure.csproj" />
</ItemGroup>

@ -176,11 +176,11 @@ namespace IoT.UI.Shard
});
dbContext.SaveChanges();
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("BA92B82B-1E92-428B-92ED-28AD93FB7514"), Number = "00", Name = "网关", Icon = "gateway" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("8E271914-622C-4B4D-BD33-78993F99BE43"), Number = "10", Name = "安防", Icon = "safe" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("F510E634-5D1E-4398-A121-6945D43B5A5C"), Number = "20", Name = "电器", Icon = "electric" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("AC2A427C-173C-4277-B9C5-3B73FFE841C9"), Number = "30", Name = "照明", Icon = "lighting" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("67FC5B9D-6479-4714-8D07-E24EF0AEB502"), Number = "40", Name = "监测", Icon = "monitor" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("BA92B82B-1E92-428B-92ED-28AD93FB7514"), Number = "00", Name = "网关", Image = "/images/gateway.png" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("8E271914-622C-4B4D-BD33-78993F99BE43"), Number = "10", Name = "安防", Image = "/images/safe.png" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("F510E634-5D1E-4398-A121-6945D43B5A5C"), Number = "20", Name = "电器", Image = "/images/socket.png" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("AC2A427C-173C-4277-B9C5-3B73FFE841C9"), Number = "30", Name = "照明", Image = "/images/light.png" });
dbContext.Set<Category>().Add(new Category { Id = Guid.Parse("67FC5B9D-6479-4714-8D07-E24EF0AEB502"), Number = "40", Name = "监测", Image = "/images/monitor.png" });
dbContext.SaveChanges();
}
}

@ -47,7 +47,7 @@
<div class="card">
<div class="card-header">
<div class="left">
<img style="display:inline;height:1em;" :src="'/iot/'+model.Icon+'.png'" />{{model.DisplayName}}
<img style="display:inline;height:1em;" :src="'/images/'+model.Icon+'.png'" />{{model.DisplayName}}
<i :class="model.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="model.IsOnline?'color:green;':'color:red;'"></i>
</div>
<div class="right">
@ -160,7 +160,7 @@
</div>
</div>
</div>
<audio id="alarm" muted style="display:none;" src="~/iot/warning.wav"></audio>
<audio id="alarm" muted style="display:none;" src="~/images/warning.wav"></audio>
<script src="~/lib/isMobile/isMobile.js"></script>
<script src="~/lib/jquery/jquery.min.js"></script>
<script src="~/lib/lodash/lodash.min.js"></script>

@ -37,7 +37,7 @@
<div class="card" v-for="device in _.orderBy(model.Devices,['CategoryName','DisplayOrder','Name'])">
<div class="card-header">
<div class="left">
<img style="display:inline;height:1em;" :src="'/iot/'+device.Icon+'.png'" />{{device.DisplayName}}
<img style="display:inline;height:1em;" :src="'/images/'+device.Icon+'.png'" />{{device.DisplayName}}
<i :class="device.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="device.IsOnline?'color:green;':'color:red;'"></i>
</div>
<div class="right">
@ -126,7 +126,7 @@
</div>
</div>
</div>
<audio id="alarm" muted style="display:none;" src="~/iot/warning.wav"></audio>
<audio id="alarm" muted style="display:none;" src="~/images/warning.wav"></audio>
<script src="~/lib/isMobile/isMobile.js"></script>
<script src="~/lib/jquery/jquery.min.js"></script>
<script src="~/lib/lodash/lodash.min.js"></script>

@ -40,7 +40,7 @@
<div class="card-content">
<div class="row">
<div class="col" v-for="scene in _.orderBy(model.Sences,['DisplayOrder','Name'])">
<div><a href="javascript: ;" v-on:click="sendSence(scene.Id)" v-if="isAdmin"><img class="btn" src="~/iot/button.png" /></a></div>
<div><a href="javascript: ;" v-on:click="sendSence(scene.Id)" v-if="isAdmin"><img class="btn" src="~/images/button.png" /></a></div>
<div class="btn">{{scene.Name}} </div>
</div>
</div>
@ -59,32 +59,32 @@
<div class="card-content">
<div class="row">
<div class="col" v-for="d in getDevices('温湿度检测器')">
<div><img class="icon" src="~/iot/temperature.png" /></div>
<div><img class="icon" src="~/images/temperature.png" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{getDeviceDataValue(d,"温度")}} {{getDeviceDataValue(d,"湿度")}}</div>
</div>
<div class="col" v-for="d in getDevices('二氧化碳监测器')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{getDeviceDataValue(d,"二氧化碳")}}</div>
</div>
<div class="col" v-for="d in getDevices('光强检测器')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{getDeviceDataValue(d,"光照强度")}}</div>
</div>
<div class="col" v-for="d in getDevices('粉尘检测器')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{getDeviceDataValue(d,"粉尘")}}</div>
</div>
<div class="col" v-for="d in getDevices('烟雾感应器')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{getDeviceDataValue(d,"状态")}} </div>
</div>
<div class="col" v-for="d in getDevices('红外感应器')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{getDeviceDataValue(d,"状态")}}</div>
</div>
@ -97,14 +97,14 @@
主机
</div>
<div class="right" v-if="isAdmin">
<a href="javascript: ;" v-on:click="sendAll('主机','21boot')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('主机','22shutdown')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('主机','21boot')"><img class="btn" src="~/images/on.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('主机','22shutdown')"><img class="btn" src="~/images/off.png" /></a>
</div>
</div>
<div class="card-content">
<div class="row">
<div class="col" v-for="d in getDevices('主机')">
<div><img class="icon" src="~/iot/pc.png" /></div>
<div><img class="icon" src="~/images/pc.png" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>
<div>{{getDeviceDataValue(d,"计算机名")}}</div>
@ -114,9 +114,9 @@
<div>发送:{{getDeviceDataValue(d,"发送")}} 接收{{getDeviceDataValue(d,"接收")}}</div>
</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-on:click="send(d.Id,'21boot')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'23shot')"><img class="btn" src="~/iot/shot.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'22shutdown')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'21boot')"><img class="btn" src="~/images/on.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'23shot')"><img class="btn" src="~/images/shot.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'22shutdown')"><img class="btn" src="~/images/off.png" /></a>
</div>
</div>
</div>
@ -131,7 +131,7 @@
<div class="card-content">
<div class="row">
<div class="col" v-for="d in getDevices('AP')">
<div><img class="icon" src="~/iot/ap.png" /></div>
<div><img class="icon" src="~/images/ap.png" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{getDeviceDataValue(d,"名称")}}</div>
<div>
@ -152,20 +152,20 @@
窗帘
</div>
<div class="right" v-if="isAdmin">
<a href="javascript: ;" v-on:click="sendAll('一路可调窗帘','21on')"><img class="btn" src="~/iot/left.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('一路可调窗帘','23stop')"><img class="btn" src="~/iot/stop.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('一路可调窗帘','22off')"><img class="btn" src="~/iot/right.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('一路可调窗帘','21on')"><img class="btn" src="~/images/left.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('一路可调窗帘','23stop')"><img class="btn" src="~/images/stop.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('一路可调窗帘','22off')"><img class="btn" src="~/images/right.png" /></a>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('一路可调窗帘')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}} {{getDeviceDataValue(d,"状态")}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/iot/left.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'23stop')"><img class="btn" src="~/iot/stop.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'22off')"><img class="btn" src="~/iot/right.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/images/left.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'23stop')"><img class="btn" src="~/images/stop.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'22off')"><img class="btn" src="~/images/right.png" /></a>
</div>
</div>
</div>
@ -176,65 +176,65 @@
开关
</div>
<div class="right" v-if="isAdmin">
<a href="javascript: ;" v-on:click="sendGroup('开关','21on')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-on:click="sendGroup('开关','22off')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-on:click="sendGroup('开关','21on')"><img class="btn" src="~/images/on.png" /></a>
<a href="javascript: ;" v-on:click="sendGroup('开关','22off')"><img class="btn" src="~/images/off.png" /></a>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('计量开关')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}} {{getDeviceDataValue(d,"状态")}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/images/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/images/on.png" /></a>
</div>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('一路照明开关')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}} {{getDeviceDataValue(d,"状态")}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/images/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/images/on.png" /></a>
</div>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('二路灯开关')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'22off')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/images/on.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'22off')"><img class="btn" src="~/images/off.png" /></a>
</div>
<div v-if="isAdmin">
<a v-if="getDeviceDataValue(d,'L1状态')==='关'" v-on:click="send(d.Id,'23l1on')"><img class="btn" src="~/iot/off.png" /></a>
<a v-else v-on:click="send(d.Id,'24l1off')"><img class="btn" src="~/iot/on.png" /></a>
<a v-if="getDeviceDataValue(d,'L2状态')==='关'" v-on:click="send(d.Id,'25l2on')"><img class="btn" src="~/iot/off.png" /></a>
<a v-else v-on:click="send(d.Id,'26l2off')"><img class="btn" src="~/iot/on.png" /></a>
<a v-if="getDeviceDataValue(d,'L1状态')==='关'" v-on:click="send(d.Id,'23l1on')"><img class="btn" src="~/images/off.png" /></a>
<a v-else v-on:click="send(d.Id,'24l1off')"><img class="btn" src="~/images/on.png" /></a>
<a v-if="getDeviceDataValue(d,'L2状态')==='关'" v-on:click="send(d.Id,'25l2on')"><img class="btn" src="~/images/off.png" /></a>
<a v-else v-on:click="send(d.Id,'26l2off')"><img class="btn" src="~/images/on.png" /></a>
</div>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('三路照明开关')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'22off')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/images/on.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'22off')"><img class="btn" src="~/images/off.png" /></a>
</div>
<div v-if="isAdmin">
<a v-if="getDeviceDataValue(d,'状态4')==='关'" v-on:click="send(d.Id,'23on')"><img class="btn" src="~/iot/off.png" /></a>
<a v-else v-on:click="send(d.Id,'24off')"><img class="btn" src="~/iot/on.png" /></a>
<a v-if="getDeviceDataValue(d,'状态5')==='关'" v-on:click="send(d.Id,'25on')"><img class="btn" src="~/iot/off.png" /></a>
<a v-else v-on:click="send(d.Id,'26off')"><img class="btn" src="~/iot/on.png" /></a>
<a v-if="getDeviceDataValue(d,'状态6')==='关'" v-on:click="send(d.Id,'27on')"><img class="btn" src="~/iot/off.png" /></a>
<a v-else v-on:click="send(d.Id,'28off')"><img class="btn" src="~/iot/on.png" /></a>
<a v-if="getDeviceDataValue(d,'状态4')==='关'" v-on:click="send(d.Id,'23on')"><img class="btn" src="~/images/off.png" /></a>
<a v-else v-on:click="send(d.Id,'24off')"><img class="btn" src="~/images/on.png" /></a>
<a v-if="getDeviceDataValue(d,'状态5')==='关'" v-on:click="send(d.Id,'25on')"><img class="btn" src="~/images/off.png" /></a>
<a v-else v-on:click="send(d.Id,'26off')"><img class="btn" src="~/images/on.png" /></a>
<a v-if="getDeviceDataValue(d,'状态6')==='关'" v-on:click="send(d.Id,'27on')"><img class="btn" src="~/images/off.png" /></a>
<a v-else v-on:click="send(d.Id,'28off')"><img class="btn" src="~/images/on.png" /></a>
</div>
</div>
</div>
@ -245,18 +245,18 @@
插座
</div>
<div class="right" v-if="isAdmin">
<a href="javascript: ;" v-on:click="sendAll('墙面插座','21on')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('墙面插座','22off')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('墙面插座','21on')"><img class="btn" src="~/images/on.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('墙面插座','22off')"><img class="btn" src="~/images/off.png" /></a>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('墙面插座')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}} {{getDeviceDataValue(d,"状态")}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/images/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/images/on.png" /></a>
</div>
</div>
</div>
@ -267,18 +267,18 @@
插座
</div>
<div class="right" v-if="isAdmin">
<a href="javascript: ;" v-on:click="sendAll('一路插座','21on')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('一路插座','22off')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('一路插座','21on')"><img class="btn" src="~/images/on.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('一路插座','22off')"><img class="btn" src="~/images/off.png" /></a>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('一路插座')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}} {{getDeviceDataValue(d,"状态")}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/images/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/images/on.png" /></a>
</div>
</div>
</div>
@ -289,18 +289,18 @@
插座
</div>
<div class="right" v-if="isAdmin">
<a href="javascript: ;" v-on:click="sendAll('二路插座','21on')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('二路插座','22off')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('二路插座','21on')"><img class="btn" src="~/images/on.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('二路插座','22off')"><img class="btn" src="~/images/off.png" /></a>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('二路插座')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}} {{getDeviceDataValue(d,"状态")}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/iot/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/iot/on.png" /></a>
<a href="javascript: ;" v-if="getDeviceDataValue(d,'状态')==='关'" v-on:click="send(d.Id,'21on')"><img class="btn" src="~/images/off.png" /></a>
<a href="javascript: ;" v-else v-on:click="send(d.Id,'22off')"><img class="btn" src="~/images/on.png" /></a>
</div>
</div>
</div>
@ -311,16 +311,16 @@
门锁
</div>
<div class="right" v-if="isAdmin">
<a href="javascript: ;" v-on:click="sendAll('密码门锁','21open')"><img class="btn" src="~/iot/open.png" /></a>
<a href="javascript: ;" v-on:click="sendAll('密码门锁','21open')"><img class="btn" src="~/images/open.png" /></a>
</div>
</div>
<div class="row">
<div class="col" v-for="d in getDevices('密码门锁')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}} {{getDeviceDataValue(d,"状态")}}</div>
<div v-if="isAdmin">
<a href="javascript: ;" v-on:click="send(d.Id,'21open')"><img class="btn" src="~/iot/open.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'21open')"><img class="btn" src="~/images/open.png" /></a>
</div>
</div>
</div>
@ -333,14 +333,14 @@
</div>
<div class="row">
<div class="col" v-for="d in getDevices('红外转发器')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}}</div>
<div class="row" v-if="isAdmin">
<template v-for="data in _.orderBy(d.Data,['DisplayOrder','Name'])">
<template v-if="data.Key==='code[]'">
<div class="col" v-for="key in JSON.parse(data.Value)">
<div><a href="javascript: ;" v-on:click="send(d.Id,'22call','code='+key.value)"><img class="btn" src="~/iot/button.png" /></a></div>
<div><a href="javascript: ;" v-on:click="send(d.Id,'22call','code='+key.value)"><img class="btn" src="~/images/button.png" /></a></div>
<div class="btn">
{{key.text}}
</div>
@ -359,7 +359,7 @@
</div>
<div class="row">
<div class="col" v-for="d in getDevices('串口控制器')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div><i :class="d.IsOnline?'fa fa-toggle-on':'fa fa-toggle-off'" :style="d.IsOnline?'color:green;':'color:red;'"></i></div>
<div>{{d.DisplayName}}</div>
<div class="row" v-if="isAdmin">
@ -369,7 +369,7 @@
<div>{{key}}</div>
<div class="row">
<div class="col" v-for="btn in value">
<div><a href="javascript: ;" v-on:click="send(d.Id,'send','code='+btn.value)"><img class="btn" src="~/iot/button.png" /></a></div>
<div><a href="javascript: ;" v-on:click="send(d.Id,'send','code='+btn.value)"><img class="btn" src="~/images/button.png" /></a></div>
<div class="btn">
{{btn.text.indexOf('-')>0?btn.text.split('-')[1]:btn.text}}
</div>
@ -393,14 +393,14 @@
</div>
<div class="row">
<div class="col" v-for="d in getDevices('摄像头')">
<div><img class="icon" :src="'/iot/'+d.Icon+'.png'" /></div>
<div><img class="icon" :src="'/images/'+d.Icon+'.png'" /></div>
<div>{{d.DisplayName}}</div>
<div class="row" v-if="isAdmin">
<div class="col">
<a href="javascript: ;" v-on:click="play(d.Id)"><img class="btn" src="~/iot/play.png" /></a>
<a href="javascript: ;" v-on:click="play(d.Id)"><img class="btn" src="~/images/play.png" /></a>
</div>
<div class="col">
<a href="javascript: ;" v-on:click="send(d.Id,'20shot')"><img class="btn" src="~/iot/shot.png" /></a>
<a href="javascript: ;" v-on:click="send(d.Id,'20shot')"><img class="btn" src="~/images/shot.png" /></a>
</div>
</div>
</div>
@ -426,7 +426,7 @@
</div>
</div>
</div>
<audio id="alarm" muted style="display:none;" src="~/iot/warning.wav"></audio>
<audio id="alarm" muted style="display:none;" src="~/images/warning.wav"></audio>
<script src="~/lib/isMobile/isMobile.js"></script>
<script src="~/lib/jquery/jquery.min.js"></script>
<script src="~/lib/lodash/lodash.min.js"></script>

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before

Width:  |  Height:  |  Size: 669 B

After

Width:  |  Height:  |  Size: 669 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

@ -1,5 +1,9 @@
using Application.Domain.Entities;
using Infrastructure.Data;
using IoTCenter.Areas.Admin.ViewModels;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace IoTCenter.Areas.Admin.Controllers
{
@ -7,13 +11,45 @@ namespace IoTCenter.Areas.Admin.Controllers
[Area(nameof(Admin))]
public class HomeController : Controller
{
public HomeController()
private readonly IRepository<Node> _nodeRepo;
private readonly IRepository<Product> _productRepo;
private readonly IRepository<Category> _categoryRepo;
public HomeController(IRepository<Node> nodeRepo, IRepository<Category> categoryRepo, IRepository<Product> productRepo)
{
this._nodeRepo = nodeRepo;
this._categoryRepo = categoryRepo;
this._productRepo = productRepo;
}
public IActionResult Index()
{
return View();
var model = new HomeIndexViewModel
{
Nodes = this._nodeRepo.ReadOnlyTable().Select(o => new NodeViewModel
{
Id = o.Id,
Name = o.Name,
Image = o.Image,
DeviceCount = o.Devices.Count()
}).ToList(),
Categories = this._categoryRepo.ReadOnlyTable().Select(o => new CategoryViewModel
{
Id = o.Id,
Name = o.Name,
Image = o.Image,
Number = o.Number,
DeviceCount = o.Products.SelectMany(o => o.Devices).Count()
}).ToList(),
Products = this._productRepo.ReadOnlyTable().Select(o => new ProductViewModel
{
Id = o.Id,
Name = o.Name,
Image = o.Image,
DeviceCount = o.Devices.Count()
}).ToList()
};
return View(model);
}
}
}

@ -0,0 +1,13 @@
using System;
namespace IoTCenter.Areas.Admin.ViewModels
{
public class CategoryViewModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Number { get; set; }
public string Image { get; set; }
public int DeviceCount { get; set; }
}
}

@ -0,0 +1,12 @@
using Application.Domain.Entities;
using System.Collections.Generic;
namespace IoTCenter.Areas.Admin.ViewModels
{
public class HomeIndexViewModel
{
public List<NodeViewModel> Nodes { get; set; } = new List<NodeViewModel>();
public List<CategoryViewModel> Categories { get; set; } = new List<CategoryViewModel>();
public List<ProductViewModel> Products { get; set; } = new List<ProductViewModel>();
}
}

@ -0,0 +1,13 @@
using Application.Domain.Entities;
using System;
namespace IoTCenter.Areas.Admin.ViewModels
{
public class NodeViewModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Image { get; set; }
public int DeviceCount { get; set; }
}
}

@ -0,0 +1,12 @@
using System;
namespace IoTCenter.Areas.Admin.ViewModels
{
public class ProductViewModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Image { get; set; }
public int DeviceCount { get; set; }
}
}

@ -1,4 +1,60 @@
@model IoTCenter.Areas.Admin.ViewModels.HomeIndexViewModel
@inject IHostEnvironment env
@{
ViewData["IsHomePage"] = true;
var max = env.IsDevelopment() ? 10 : 1;
}
<h1>首页</h1>
<div class="row">
<div class="col-md-12"><div class="callout callout-success"><h4>节点</h4></div></div>
@for (int i = 0; i < max; i++)
{
foreach (var item in Model.Nodes)
{
<div class="col-md-2 col-xs-4">
<div class="box box-solid">
<div class="box-header with-border">
<h3 class="box-title">@item.Name</h3>
<div class="pull-right box-tools">设备:@item.DeviceCount </div>
</div>
<a class="box-body" href="@Url.Action("Index","Device",new { nodeId=item.Id})" style="display:block;text-align:center;">
<img alt="@item.Name" src="@(item.Image??"/images/empty.png")" style="margin:0 auto;" />
</a>
</div>
</div>
}
}
</div>
<div class="row">
<div class="col-md-12"><div class="callout callout-success"><h4>分类</h4></div></div>
@foreach (var item in Model.Categories)
{
<div class="col-md-2 col-xs-4">
<div class="box box-solid">
<div class="box-header with-border">
<h3 class="box-title">@item.Name</h3>
<div class="pull-right box-tools">设备:@item.DeviceCount </div>
</div>
<a class="box-body" href="@Url.Action("Index","Device",new { categoryId=item.Id})" style="display:block;text-align:center;">
<img alt="@item.Name" src="@(item.Image??"/images/empty.png")" style="margin:0 auto;" />
</a>
</div>
</div>
}
</div>
<div class="row">
<div class="col-md-12"><div class="callout callout-success"><h4>产品</h4></div></div>
@foreach (var item in Model.Products)
{
<div class="col-md-2 col-xs-4">
<div class="box box-solid">
<div class="box-header with-border">
<h3 class="box-title">@item.Name</h3>
<div class="pull-right box-tools">设备:@item.DeviceCount </div>
</div>
<a class="box-body" href="@Url.Action("Index","Device",new { productId=item.Id})" style="display:block;text-align:center;">
<img alt="@item.Name" src="@(item.Image??"/images/empty.png")" style="margin:0 auto;" />
</a>
</div>
</div>
}
</div>

@ -1,4 +1,5 @@
@inherits Infrastructure.Web.Mvc.Razor.MyRazorPage<TModel>
@using Microsoft.Extensions.Hosting
@using Infrastructure.Application
@using Infrastructure.Extensions
@using Infrastructure.Data

@ -71,7 +71,6 @@ namespace IoTCenter.Controllers
o.Number,
o.Name,
o.DisplayOrder,
o.Icon,
o.Image,
o.Scenes,
o.Devices.Count

@ -101,8 +101,6 @@ namespace IoTCenter.Controllers
NodeChart = new
{
total = this._nodeRepo.ReadOnlyTable().Count(),
online = this._nodeRepo.ReadOnlyTable().Count(o => o.IsOnline),
offline = this._nodeRepo.ReadOnlyTable().Count(o => !o.IsOnline),
data = nodes.Select(o => o.Count),
labels = nodes.Select(o => o.Key)
},

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css" />
<link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="/lib/admin-lte/css/AdminLTE.min.css" />
<link rel="stylesheet" href="/lib/admin-lte/css/skins/_all-skins.min.css" />
<link rel="stylesheet" href="/lib/fancybox/jquery.fancybox.min.css" />
<link rel="stylesheet" href="/lib/jquery-datetimepicker/jquery.datetimepicker.min.css" />
<link rel="stylesheet" href="/lib/layer/skin/layer.css" />
<link rel="stylesheet" href="/lib/select2/css/select2.min.css" />
<link rel="stylesheet" href="/lib/tree-multiselect/dist/jquery.tree-multiselect.min.css" />
<link rel="stylesheet" href="/lib/kindeditor/themes/default/default.css" />
<link rel="stylesheet" href="/css/site.css">
<title></title>
</head>
<body>
</body>
</html>

@ -82,7 +82,7 @@ namespace IoTNode.DeviceServices
{
Number = productNumber,
Name = productName,
Icon = productIcon,
Image = $"/images/{productIcon}.png",
CategoryId = categoryRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == categoryNumber).Id
};
if (!string.IsNullOrEmpty(path))

@ -16,7 +16,7 @@ namespace IoTNode.DeviceServices.FBee
List.Add(new DeviceId { RawDeviceId = 0x0202, Name = "窗帘", CategoryName = "电器", CategoryNumber = "20", Icon = "curtain" });
List.Add(new DeviceId { RawDeviceId = 0x0220, Name = "调色灯", CategoryName = "照明", CategoryNumber = "30", Icon = "curtain" });
List.Add(new DeviceId { RawDeviceId = 0x0309, Name = "粉尘检测器", CategoryName = "监测", CategoryNumber = "40", Icon = "pm25" });
List.Add(new DeviceId { RawDeviceId = 0x0302, Name = "温湿度传感器", CategoryName = "监测", CategoryNumber = "40", Icon = "temperature" });
List.Add(new DeviceId { RawDeviceId = 0x0302, Name = "温湿度传感器", CategoryName = "监测", CategoryNumber = "40", Icon = "humiture" });
List.Add(new DeviceId { RawDeviceId = 0x0402, Name = "报警器", CategoryName = "安防", CategoryNumber = "10", Icon = "alarm" });
}

@ -362,7 +362,7 @@ namespace IoTNode.DeviceServices.FBee
Console.WriteLine($"write:{BitConverter.ToString(bytes).Replace("-", " ")}");
try
{
client.Client.GetStream().Write(bytes);
client?.Client.GetStream().Write(bytes);
}
catch (Exception ex)
{
@ -424,6 +424,7 @@ namespace IoTNode.DeviceServices.FBee
}
var zoneType = ms.ReadInt();
var deviceType = DeviceId.List.FirstOrDefault(o => o.RawDeviceId == deviceId);
var deviceIcon = deviceType.Icon;
if (deviceType != null)
{
var deviceName = deviceType.Name;
@ -432,10 +433,12 @@ namespace IoTNode.DeviceServices.FBee
if (zoneType == 0x0028)
{
deviceName = "烟雾传感器";
deviceIcon = "smoke";
}
else if (zoneType == 0x000d || zoneType == 0x00ff)
{
deviceName = "红外感应器";
deviceIcon = "infrared";
}
}
else if (deviceId == 0x002)
@ -443,14 +446,17 @@ namespace IoTNode.DeviceServices.FBee
if (zoneType == 0x0001)
{
deviceName = "一路开关";
deviceIcon = "switch1";
}
else if (zoneType == 0x0002)
{
deviceName = "二路开关";
deviceIcon = "switch2";
}
else if (zoneType == 0x0003)
{
deviceName = "三路开关";
deviceIcon = "switch3";
}
}
var productNumber = $"fbee:{deviceType.RawDeviceId.ToString("x4")}:{zoneType.ToString("x2")}";
@ -459,7 +465,7 @@ namespace IoTNode.DeviceServices.FBee
var category = categoryRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == deviceType.CategoryNumber);
var productRepo = scope.ServiceProvider.GetService<IRepository<Product>>();
var product = this.UpdateProduct(deviceName, productNumber, this.GetPathByDeviceName(deviceName), deviceType.CategoryNumber, deviceType.Icon);
var product = this.UpdateProduct(deviceName, productNumber, this.GetPathByDeviceName(deviceName), deviceType.CategoryNumber, deviceIcon);
var deviceNodeRepo = scope.ServiceProvider.GetService<IRepository<Node>>();
var node = deviceNodeRepo.ReadOnlyTable().FirstOrDefault();
@ -473,7 +479,7 @@ namespace IoTNode.DeviceServices.FBee
Number = $"{sn}-{ieee}",
Name = deviceName,
DisplayName = deviceName,
Icon = deviceType.Icon,
Icon = deviceIcon,
Gateway = sn,
ProductId = product.Id,
NodeId = node.Id

@ -68,11 +68,9 @@ namespace IoTNode
var cpuid = Helper.Instance.GetCPUNumber();
dbContext.Set<Node>().Add(new Node
{
Name = $"节点{cpuid}",
Name = "节点",
Number = cpuid,
Icon = "classroom",
Image = "/iot/classroom.jpg",
IsOnline = true,
Image = "/images/classroom.png",
Type = "智慧教室",
Template = "node.html"
});

@ -1,4 +1,5 @@
@inherits Infrastructure.Web.Mvc.Razor.MyRazorPage<TModel>
@using Microsoft.AspNetCore.Hosting
@using Microsoft.Extensions.Configuration
@using System.ComponentModel.DataAnnotations
@using Infrastructure.Application

Loading…
Cancel
Save