1.0.0-alpha.214

Former-commit-id: 774c30e1a4277afbb95a325367619ba5fe4ca762
TangShanKaiPing
wanggang 6 years ago
parent 443a7c65ff
commit a780f98c10

@ -43,8 +43,6 @@ namespace Application.Domain.Entities
public List<Device> Devices { get; set; } = new List<Device>();
public List<Scene> Scenes { get; set; } = new List<Scene>();
public List<SceneTimer> Timers { get; set; } = new List<SceneTimer>();
public List<SceneTigger> Tiggers { get; set; } = new List<SceneTigger>();
public List<NodeCategoryNode> CategoryNodes { get; set; } = new List<NodeCategoryNode>();
}
}

@ -18,17 +18,6 @@ namespace Application.Models
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid SceneId { get; set; }
[Display(Name = "触发器名称")]
public string Name { get; set; }
[Display(Name = "触发规则")]
[Remote("ConditionValid", "Ajax", "Admin", AdditionalFields = "DataId")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public string Condition { get; set; }
[Display(Name = "禁用")]
public bool Disabled { get; set; }
[DataType("SelectList")]
[Display(Name = "设备")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
@ -38,5 +27,16 @@ namespace Application.Models
[Display(Name = "数据")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? DataId { get; set; }
[Display(Name = "触发规则")]
[Remote("ConditionValid", "Ajax", "Admin", AdditionalFields = "DataId")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public string Condition { get; set; }
[Display(Name = "触发器名称")]
public string Name { get; set; }
[Display(Name = "禁用")]
public bool Disabled { get; set; }
}
}

@ -44,6 +44,7 @@ namespace IoT.Shared.Areas.Admin.Controlls
{
this.ToDisplayModel(entity, model);
ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId));
ViewData.SelectList(o => model.SceneId, () => this._ajax.GetSceneSelectList(model.NodeId.Value), model.NodeId.HasValue);
ViewData.SelectList(o => model.DeviceId, () => this._ajax.GetDeviceSelectList(model.NodeId.Value), model.NodeId.HasValue);
ViewData.SelectList(o => model.DataId, () => this._ajax.GetDataSelectList(model.DeviceId.Value), model.DeviceId.HasValue);
}
@ -52,7 +53,9 @@ namespace IoT.Shared.Areas.Admin.Controlls
{
if (entity != null)
{
model.NodeId = entity.Data.Device.NodeId;
model.DeviceId = entity.Data.DeviceId;
ViewData.Add(model.SceneId, entity.Scene.Name);
ViewData.Add(model.NodeId, entity.Scene.Node.Name);
ViewData.Add(model.DataId, entity.Data.Name);
ViewData.Add(model.DeviceId, entity.Data.Device.DisplayName);

@ -2,6 +2,7 @@
$(function () {
$('#NodeId').change(function () {
var id = $(this).find(':selected').val();
update('@Url.Action("GetSceneJson", "Ajax")', id, "#SceneId");
update('@Url.Action("GetDeviceJson", "Ajax")', id, "#DeviceId");
update(null, null, "#DataId");

@ -1,25 +0,0 @@
using Infrastructure.Application;
using System;
using System.ComponentModel.DataAnnotations;
namespace IoTCenter.Application.Models
{
[Display(Name = "平台触发器命令")]
public class EditGlobalIoTTiggerCommandModel : EditModel
{
[Display(Name = "平台触发")]
[DataType("SelectList")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? IoTTiggerId { get; set; }
[Display(Name = "命令节点")]
[DataType("SelectList")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? NodeId { get; set; }
[Display(Name = "命令")]
[DataType("SelectList")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? CommandId { get; set; }
}
}

@ -1,25 +0,0 @@
using Infrastructure.Application;
using System;
using System.ComponentModel.DataAnnotations;
namespace IoTCenter.Application.Models
{
[Display(Name = "平台定时器命令")]
public class EditGlobalIoTTimerCommandModel : EditModel
{
[Display(Name = "平台定时器")]
[DataType("SelectList")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? IoTTimerId { get; set; }
[Display(Name = "命令节点")]
[DataType("SelectList")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? NodeId { get; set; }
[Display(Name = "命令")]
[DataType("SelectList")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? CommandId { get; set; }
}
}

@ -6,7 +6,7 @@ using System.ComponentModel.DataAnnotations;
namespace IoTCenter.Application.Models
{
[Display(Name = "平台触发器")]
public class EditGlobalIoTTiggerModel : EditModel
public class EditGlobalSceneTiggerModel : EditModel
{
[DataType("SelectList")]
[Display(Name = "平台场景")]

@ -6,7 +6,7 @@ using System.ComponentModel.DataAnnotations;
namespace IoTCenter.Application.Models
{
[Display(Name = "平台定时器")]
public class EditGlobalIoTTimerModel : EditModel
public class EditGlobalSceneTimerModel : EditModel
{
[DataType("SelectList")]
[Display(Name = "平台场景")]

@ -17,7 +17,7 @@ namespace IoTCenter.Areas.Admin.Controllers
{
[Authorize]
[Area(nameof(Admin))]
public class GlobalSceneTiggerController : CrudController<SceneTigger, PagedListModel<EditGlobalIoTTiggerModel>, EditGlobalIoTTiggerModel, EditGlobalIoTTiggerModel>
public class GlobalSceneTiggerController : CrudController<SceneTigger, PagedListModel<EditGlobalSceneTiggerModel>, EditGlobalSceneTiggerModel, EditGlobalSceneTiggerModel>
{
private readonly AjaxController _ajax;
private readonly IServiceProvider _sp;
@ -30,29 +30,33 @@ namespace IoTCenter.Areas.Admin.Controllers
public override IQueryable<SceneTigger> Include(IQueryable<SceneTigger> query)
{
return query.Include(o => o.Data).ThenInclude(o => o.Device);
return query
.Include(o => o.Scene).ThenInclude(o => o.Node)
.Include(o => o.Data).ThenInclude(o => o.Device);
}
public override IQueryable<SceneTigger> Query(PagedListModel<EditGlobalIoTTiggerModel> model, IQueryable<SceneTigger> query)
public override IQueryable<SceneTigger> Query(PagedListModel<EditGlobalSceneTiggerModel> model, IQueryable<SceneTigger> query)
{
return query.Where(o => o.Scene.NodeId == null);
}
public override void ToEditModel(SceneTigger entity, EditGlobalIoTTiggerModel model)
public override void ToEditModel(SceneTigger entity, EditGlobalSceneTiggerModel model)
{
this.ToDisplayModel(entity, model);
ViewData.SelectList(o => model.DeviceNodeId, () => this._ajax.GetNodeSelectList(model.DeviceNodeId));
ViewData.SelectList(o => model.SceneId, () => this._ajax.GetGlobalSceneSelectList(model.SceneId));
ViewData.SelectList(o => model.DeviceId, () => this._ajax.GetDeviceSelectList(model.DeviceNodeId.Value), model.DeviceNodeId.HasValue);
ViewData.SelectList(o => model.DataId, () => this._ajax.GetDataSelectList(model.DeviceId.Value), model.DeviceId.HasValue);
}
public override void ToDisplayModel(SceneTigger entity, EditGlobalIoTTiggerModel model)
public override void ToDisplayModel(SceneTigger entity, EditGlobalSceneTiggerModel model)
{
if (entity != null)
{
model.DeviceId = entity.Data.DeviceId;
model.DeviceNodeId = entity.Data.Device.NodeId;
ViewData.Add(model.DeviceNodeId, entity.Data.Device.DisplayName);
ViewData.Add(model.SceneId, entity.Scene.Name);
ViewData.Add(model.DataId, entity.Data.Name);
ViewData.Add(model.DeviceId, entity.Data.Device.DisplayName);
}

@ -2,10 +2,13 @@ using Application.Domain.Entities;
using Infrastructure.Application;
using Infrastructure.Data;
using Infrastructure.Events;
using Infrastructure.Extensions;
using Infrastructure.Web.Mvc;
using IoT.Shared.Areas.Admin.Controlls;
using IoTCenter.Application.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
@ -14,20 +17,40 @@ namespace IoTCenter.Areas.Admin.Controllers
{
[Authorize]
[Area(nameof(Admin))]
public class GlobalSceneTimerController : CrudController<SceneTimer, PagedListModel<EditGlobalIoTTimerModel>, EditGlobalIoTTimerModel, EditGlobalIoTTimerModel>
public class GlobalSceneTimerController : CrudController<SceneTimer, PagedListModel<EditGlobalSceneTimerModel>, EditGlobalSceneTimerModel, EditGlobalSceneTimerModel>
{
private readonly AjaxController _ajax;
private readonly IServiceProvider _sp;
public GlobalSceneTimerController(IRepository<SceneTimer> repo, IServiceProvider sp) : base(repo)
public GlobalSceneTimerController(IRepository<SceneTimer> repo, IServiceProvider sp, AjaxController ajax) : base(repo)
{
this._sp = sp;
this._ajax = ajax;
}
public override IQueryable<SceneTimer> Query(PagedListModel<EditGlobalIoTTimerModel> model, IQueryable<SceneTimer> query)
public override IQueryable<SceneTimer> Query(PagedListModel<EditGlobalSceneTimerModel> model, IQueryable<SceneTimer> query)
{
return query.Where(o => o.Scene.NodeId == null);
}
public override IQueryable<SceneTimer> Include(IQueryable<SceneTimer> query)
{
return query.Include(o => o.Scene).ThenInclude(o => o.Node);
}
public override void ToEditModel(SceneTimer entity, EditGlobalSceneTimerModel model)
{
ViewData.SelectList(o => model.SceneId, () => this._ajax.GetGlobalSceneSelectList(model.SceneId));
}
public override void ToDisplayModel(SceneTimer entity, EditGlobalSceneTimerModel model)
{
if (entity != null)
{
ViewData.Add(model.SceneId, entity.Scene.Name);
}
}
public override void OnInserted(SceneTimer entity)
{
using var scope = this._sp.CreateScope();

@ -1,9 +0,0 @@
<script>
$(function () {
$('#NodeId').change(function () {
var id = $(this).find(':selected').val();
update('@Url.Action("GetCommandJson", "Ajax")', id, "#CommandId");
});
});
</script>

@ -1,9 +0,0 @@
<script>
$(function () {
$('#NodeId').change(function () {
var id = $(this).find(':selected').val();
update('@Url.Action("GetCommandJson", "Ajax")', id, "#CommandId");
});
});
</script>

@ -56,7 +56,7 @@ namespace IoTCenter.Services
public void Handle(EntityInsertedEvent<SceneTimer> message)
{
var timer = message.Data;
if (timer.Scene.NodeId == null)
//if (timer.Scene.NodeId == null)
{
RecurringJob.AddOrUpdate<IoTCenterJob>(timer.Id.ToString(), o => o.TimerHanle(timer.Id), timer.Cron, TimeZoneInfo.Local);
}
@ -65,7 +65,7 @@ namespace IoTCenter.Services
public void Handle(EntityUpdatedEvent<SceneTimer> message)
{
var timer = message.Data;
if (timer.Scene.NodeId == null)
//if (timer.Scene.NodeId == null)
{
RecurringJob.AddOrUpdate<IoTCenterJob>(timer.Id.ToString(), o => o.TimerHanle(timer.Id), timer.Cron, TimeZoneInfo.Local);
}
@ -74,7 +74,7 @@ namespace IoTCenter.Services
public void Handle(EntityDeletedEvent<SceneTimer> message)
{
var timer = message.Data;
if (timer.Scene.NodeId == null)
//if (timer.Scene.NodeId == null)
{
RecurringJob.RemoveIfExists(timer.Id.ToString());
}
@ -87,7 +87,7 @@ namespace IoTCenter.Services
public void Handle(EntityInsertedEvent<SceneTigger> message)
{
var tigger = message.Data;
if (tigger.Scene.NodeId == null)
//if (tigger.Scene.NodeId == null)
{
Tiggers.TryRemove(message.Data.Id, out SceneTigger iotTigger);
Tiggers.TryAdd(tigger.Id, tigger);
@ -97,7 +97,7 @@ namespace IoTCenter.Services
public void Handle(EntityUpdatedEvent<SceneTigger> message)
{
var tigger = message.Data;
if (tigger.Scene.NodeId == null)
//if (tigger.Scene.NodeId == null)
{
Tiggers.TryRemove(message.Data.Id, out SceneTigger iotTigger);
Tiggers.TryAdd(tigger.Id, tigger);
@ -107,7 +107,7 @@ namespace IoTCenter.Services
public void Handle(EntityDeletedEvent<SceneTigger> message)
{
var tigger = message.Data;
if (tigger.Scene.NodeId == null)
//if (tigger.Scene.NodeId == null)
{
Tiggers.TryRemove(tigger.Id, out SceneTigger iotTigger);
}

@ -24,17 +24,16 @@ namespace IoTCenter.Services
public void TimerHanle(Guid timerId)
{
Console.WriteLine($"global timer exec:{timerId}");
var timer = this._sceneTimerRepo.ReadOnlyTable()
.Include(o => o.Scene)
.ThenInclude(o => o.Node)
.Include(o => o.Scene)
.ThenInclude(o => o.SceneCommands)
.Include(o => o.Scene).ThenInclude(o => o.SceneCommands).ThenInclude(o => o.Command).ThenInclude(o => o.Device).ThenInclude(o => o.Node)
.FirstOrDefault(o => o.Id == timerId);
foreach (var sceneCommand in timer.Scene.SceneCommands)
{
try
{
this._hub.ServerToClient(Methods.ExecCommand, sceneCommand.CommandId, timer.Scene.Node.Number, null);
this._hub.ServerToClient(Methods.ExecCommand, sceneCommand.CommandId, sceneCommand.Command.Device.Node.Number, null);
}
catch (Exception ex)
{
@ -45,17 +44,15 @@ namespace IoTCenter.Services
public void TiggerHandle(Guid tiggerId)
{
Console.WriteLine($"global tigger exec:{tiggerId}");
var tigger = this._sceneTiggerRepo.ReadOnlyTable()
.Include(o => o.Scene)
.ThenInclude(o => o.Node)
.Include(o => o.Scene)
.ThenInclude(o => o.SceneCommands)
.Include(o => o.Scene).ThenInclude(o => o.SceneCommands).ThenInclude(o => o.Command).ThenInclude(o => o.Device).ThenInclude(o => o.Node)
.FirstOrDefault(o => o.Id == tiggerId);
foreach (var sceneCommand in tigger.Scene.SceneCommands)
{
try
{
this._hub.ServerToClient(Methods.ExecCommand, sceneCommand.CommandId, tigger.Scene.Node.Number, null);
this._hub.ServerToClient(Methods.ExecCommand, sceneCommand.CommandId, sceneCommand.Command.Device.Node.Number, null);
}
catch (Exception ex)
{

@ -1,5 +1,5 @@
{
"version": "1.0.0-alpha.213",
"version": "1.0.0-alpha.214",
"Logging": {
"LogLevel": {
"Default": "Warning",

@ -65,18 +65,6 @@
<Compile Include="Assets\UniWebView\Script\UniWebViewToolbarPosition.cs" />
<Compile Include="Assets\UniWebView\Script\UniWebViewTransitionEdge.cs" />
<None Include="Assets\UniWebView\README.txt" />
<Reference Include="Unity.TextMeshPro.Editor">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.CollabProxy.Editor">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.TextMeshPro">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.TextMeshPro.dll</HintPath>
</Reference>
<Reference Include="Unity.Analytics.DataPrivacy">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.Analytics.DataPrivacy.dll</HintPath>
</Reference>
<Reference Include="Unity.Timeline.Editor">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.Timeline.Editor.dll</HintPath>
</Reference>
@ -86,12 +74,18 @@
<Reference Include="Unity.VSCode.Editor">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.VSCode.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.TextMeshPro.Editor">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UI">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/UnityEngine.UI.dll</HintPath>
</Reference>
<Reference Include="Unity.Timeline">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.Timeline.dll</HintPath>
</Reference>
<Reference Include="Unity.CollabProxy.Editor">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll</HintPath>
</Reference>
<Reference Include="com.unity.multiplayer-weaver.Editor">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/com.unity.multiplayer-weaver.Editor.dll</HintPath>
</Reference>
@ -113,6 +107,12 @@
<Reference Include="UnityEngine.SpatialTracking">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/UnityEngine.SpatialTracking.dll</HintPath>
</Reference>
<Reference Include="Unity.TextMeshPro">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.TextMeshPro.dll</HintPath>
</Reference>
<Reference Include="Unity.Analytics.DataPrivacy">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/Unity.Analytics.DataPrivacy.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.XR.LegacyInputHelpers">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/ScriptAssemblies/UnityEditor.XR.LegacyInputHelpers.dll</HintPath>
</Reference>
@ -314,6 +314,12 @@
<Reference Include="Unity.Analytics.Tracker">
<HintPath>D:/1.0/ZHXY/projects/IoTClient/Library/PackageCache/com.unity.analytics@3.3.2/Unity.Analytics.Tracker.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.iOS.Extensions.Xcode">
<HintPath>D:/ProgramFiles/Unity/2019.2.21f1/Editor/Data/PlaybackEngines/iOSSupport/UnityEditor.iOS.Extensions.Xcode.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.iOS.Extensions.Common">
<HintPath>D:/ProgramFiles/Unity/2019.2.21f1/Editor/Data/PlaybackEngines/iOSSupport/UnityEditor.iOS.Extensions.Common.dll</HintPath>
</Reference>
<Reference Include="netstandard">
<HintPath>D:/ProgramFiles/Unity/2019.2.21f1/Editor/Data/NetStandard/ref/2.0.0/netstandard.dll</HintPath>
</Reference>

@ -13,6 +13,7 @@ public class WebViewController : MonoBehaviour
private void Start()
{
UniWebView.SetWebContentsDebuggingEnabled(true);
UniWebView.SetAllowAutoPlay(true);
UniWebView.SetAllowInlinePlay(true);
var webViewGameObject = new GameObject("UniWebView");

@ -170,7 +170,7 @@ PlayerSettings:
buildNumber: {}
AndroidBundleVersionCode: 1
AndroidMinSdkVersion: 22
AndroidTargetSdkVersion: 0
AndroidTargetSdkVersion: 26
AndroidPreferredInstallLocation: 1
aotOptions:
stripEngineCode: 1

Binary file not shown.

@ -22,8 +22,10 @@ namespace IoTNode.Services
public void TimerHanle(Guid timerId)
{
Console.WriteLine($"node timer exec:{timerId}");
var commands = this._sceneTimerRepo.ReadOnlyTable()
.Include(o => o.Scene).ThenInclude(o => o.SceneCommands).ThenInclude(o => o.Command)
.Include(o => o.Scene).ThenInclude(o => o.SceneCommands).ThenInclude(o => o.Command).ThenInclude(o => o.Api)
.Include(o => o.Scene).ThenInclude(o => o.SceneCommands).ThenInclude(o => o.Command).ThenInclude(o => o.Device)
.Where(o => o.Id == timerId)
.SelectMany(o => o.Scene.SceneCommands)
.Select(o => o.Command)
@ -33,8 +35,10 @@ namespace IoTNode.Services
public void TiggerHandle(Guid tiggerId)
{
Console.WriteLine($"global tigger exec:{tiggerId}");
var commands = this._sceneTiggerRepo.ReadOnlyTable()
.Include(o => o.Scene).ThenInclude(o => o.SceneCommands).ThenInclude(o => o.Command)
.Include(o => o.Scene).ThenInclude(o => o.SceneCommands).ThenInclude(o => o.Command).ThenInclude(o => o.Api)
.Include(o => o.Scene).ThenInclude(o => o.SceneCommands).ThenInclude(o => o.Command).ThenInclude(o => o.Device)
.Where(o => o.Id == tiggerId)
.SelectMany(o => o.Scene.SceneCommands)
.Select(o => o.Command)

@ -12,7 +12,7 @@
</div>
<div class="col-8 align-self-center">
<div class="row" style="line-height:28px;">
<span class="badge badge-info" style="line-height:26px;">{{electricity}} kW‧h</span>
<span class="badge badge-info" style="line-height:26px;" v-if="isSmart">{{electricity}} kW‧h</span>
<img style="height:32px;" v-if="getDeviceDataValue(device,'状态')==='开'" v-on:click="execApi(device.number,'/Socket/Off')" src="/IoTCenter/images/on.png" />
<img style="height:32px;" v-else="getDeviceDataValue(device,'状态')==='关'" v-on:click="execApi(device.number,'/Socket/On')" src="/IoTCenter/images/off.png" />
</div>
@ -25,8 +25,11 @@
({
props: ['device'],
computed: {
isSmart: function () {
return Enumerable.from(this.device.data).any(function (o) { return o.name === "电量"; });
},
electricity: function () {
return parseFloat(getDeviceDataValue(this.device, '电量')||0).toFixed(2);
return parseFloat(getDeviceDataValue(this.device, '电量') || 0).toFixed(2);
}
}
});

@ -11,11 +11,13 @@
<div class="card">
<div class="card-header">场景</div>
<div class="card-body">
<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 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>
<p class="weui-grid__label">{{scene.name}}</p>
</div>
</div>
</div>
@ -60,6 +62,11 @@
<div v-for="device in getDevices('三路开关')" class="col" style="min-width:320px;">
<iot-switch3 v-bind:device="device"></iot-switch3>
</div>
<!--插座-->
<div v-for="device in getDevices('插座')" class="col" style="min-width:320px;">
<iot-socket v-bind:device="device"></iot-socket>
</div>
<!--智能插座-->
<div v-for="device in getDevices('智能插座')" class="col" style="min-width:320px;">
<iot-socket v-bind:device="device"></iot-socket>

@ -6,11 +6,11 @@
<h1 class="weui-header-title">{{title}}</h1>
</div>
<div class="row">
<router-link v-for="scene in scenes" :to="{path:'/pages/iot/scene',query:{number:scene.id}}" class="col-md-2 col-sm-3 col-4 p-3">
<div v-for="scene in scenes" class="col-md-2 col-sm-3 col-4 p-3">
<div class="weui-grid__icon">
<img class="weui-tabbar__icon" :src="'/IoTCenter'+scene.image" v-on:click="execScene(scene.id)" />
</div>
<p class="weui-grid__label">{{scene.name}}</p>
</router-link>
</div>
</div>
</div>
Loading…
Cancel
Save