From 2926328bd7d6ab61a65d248085cddede138a9983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=9F=B3=E5=A4=B4?= Date: Sun, 30 Jun 2024 10:44:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ZeroServer=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E7=AE=A1=E7=90=86=EF=BC=8C=E5=AE=8C=E5=96=84=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IoT/Views/NodeOnline/_List_Search.cshtml | 13 ++++ .../NodeOnline/_List_Toolbar_Batch.cshtml | 27 +++++++++ .../Areas/Nodes/Controllers/NodeController.cs | 56 ++++++++--------- .../Controllers/NodeHistoryController.cs | 22 ++++--- .../Nodes/Controllers/NodeOnlineController.cs | 20 +++---- Samples/ZeroServer/Areas/Nodes/NodesArea.cs | 34 +++++++++++ .../Nodes/Views/Node/_List_Search.cshtml | 22 +++++++ .../Views/NodeHistory/_List_Search.cshtml | 18 ++++++ .../Views/NodeOnline/_List_Search.cshtml | 12 ++++ .../NodeOnline/_List_Toolbar_Batch.cshtml | 21 +++++++ .../Areas/Nodes/Views/_ViewImports.cshtml | 9 +++ Samples/ZeroServer/Models/SelectNodeModel.cs | 12 ++++ Samples/ZeroServer/Services/NodeService.cs | 3 +- .../ZeroServer/Views/Shared/_Node_Nav.cshtml | 58 ++++++++++++++++++ .../Views/Shared/_SelectNode.cshtml | 60 +++++++++++++++++++ Samples/ZeroServer/Views/_ViewImports.cshtml | 12 ++++ Samples/ZeroServer/ZeroServer.csproj | 4 -- 17 files changed, 347 insertions(+), 56 deletions(-) create mode 100644 Samples/IoTZero/Areas/IoT/Views/NodeOnline/_List_Search.cshtml create mode 100644 Samples/IoTZero/Areas/IoT/Views/NodeOnline/_List_Toolbar_Batch.cshtml create mode 100644 Samples/ZeroServer/Areas/Nodes/Views/Node/_List_Search.cshtml create mode 100644 Samples/ZeroServer/Areas/Nodes/Views/NodeHistory/_List_Search.cshtml create mode 100644 Samples/ZeroServer/Areas/Nodes/Views/NodeOnline/_List_Search.cshtml create mode 100644 Samples/ZeroServer/Areas/Nodes/Views/NodeOnline/_List_Toolbar_Batch.cshtml create mode 100644 Samples/ZeroServer/Areas/Nodes/Views/_ViewImports.cshtml create mode 100644 Samples/ZeroServer/Models/SelectNodeModel.cs create mode 100644 Samples/ZeroServer/Views/Shared/_Node_Nav.cshtml create mode 100644 Samples/ZeroServer/Views/Shared/_SelectNode.cshtml create mode 100644 Samples/ZeroServer/Views/_ViewImports.cshtml diff --git a/Samples/IoTZero/Areas/IoT/Views/NodeOnline/_List_Search.cshtml b/Samples/IoTZero/Areas/IoT/Views/NodeOnline/_List_Search.cshtml new file mode 100644 index 0000000..a82123a --- /dev/null +++ b/Samples/IoTZero/Areas/IoT/Views/NodeOnline/_List_Search.cshtml @@ -0,0 +1,13 @@ +@using Stardust.Data.Nodes; +@using NewLife; +@using NewLife.Web; +@using XCode; +@{ + var fact = ViewBag.Factory as IEntityFactory; + var page = ViewBag.Page as Pager; +} +
+ + @Html.ForDropDownList("category", Node.FindAllCategory(), page["category"], "全部", true) +
+@await Html.PartialAsync("_Area2", "") diff --git a/Samples/IoTZero/Areas/IoT/Views/NodeOnline/_List_Toolbar_Batch.cshtml b/Samples/IoTZero/Areas/IoT/Views/NodeOnline/_List_Toolbar_Batch.cshtml new file mode 100644 index 0000000..91bbf2c --- /dev/null +++ b/Samples/IoTZero/Areas/IoT/Views/NodeOnline/_List_Toolbar_Batch.cshtml @@ -0,0 +1,27 @@ +@using NewLife.Common; +@using System.Collections.Generic; +@{ + var set = ViewBag.PageSetting as PageSetting; + var page = ViewBag.Page as Pager; +} +@if (set.EnableSelect) +{ + + + +
+ + @Html.TextBox("command", page["command"]) + + @Html.TextBox("argument", page["argument"]) +
+ +} \ No newline at end of file diff --git a/Samples/ZeroServer/Areas/Nodes/Controllers/NodeController.cs b/Samples/ZeroServer/Areas/Nodes/Controllers/NodeController.cs index f2c23b0..7b8d47e 100644 --- a/Samples/ZeroServer/Areas/Nodes/Controllers/NodeController.cs +++ b/Samples/ZeroServer/Areas/Nodes/Controllers/NodeController.cs @@ -14,50 +14,52 @@ namespace ZeroServer.Areas.Nodes.Controllers; /// 节点 [Menu(30, true, Icon = "fa-table")] [NodesArea] -public class NodeController : EntityController +public class NodeController : NodeEntityController { static NodeController() { - //LogOnChange = true; + LogOnChange = true; //ListFields.RemoveField("Id", "Creator"); ListFields.RemoveCreateField().RemoveRemarkField(); - //{ - // var df = ListFields.GetField("Code") as ListField; - // df.Url = "?code={Code}"; - //} - //{ - // var df = ListFields.AddListField("devices", null, "Onlines"); - // df.DisplayName = "查看设备"; - // df.Url = "Device?groupId={Id}"; - // df.DataVisible = e => (e as Node).Devices > 0; - //} - //{ - // var df = ListFields.GetField("Kind") as ListField; - // df.GetValue = e => ((Int32)(e as Node).Kind).ToString("X4"); - //} - //ListFields.TraceUrl("TraceId"); + { + var df = ListFields.GetField("Name") as ListField; + df.Url = "/Nodes/Node/Detail?id={Id}"; + df.Target = "_blank"; + } + { + var df = ListFields.AddListField("Log", "UpdateTime"); + df.DisplayName = "日志"; + df.Url = "/Admin/Log?category=节点&linkId={Id}"; + df.Target = "_frame"; + } } - //private readonly ITracer _tracer; - - //public NodeController(ITracer tracer) - //{ - // _tracer = tracer; - //} - /// 高级搜索。列表页查询、导出Excel、导出Json、分享页等使用 /// 分页器。包含分页排序参数,以及Http请求参数 /// protected override IEnumerable Search(Pager p) { - //var deviceId = p["deviceId"].ToInt(-1); - //var enable = p["enable"]?.Boolean(); + var nodeId = p["Id"].ToInt(-1); + if (nodeId > 0) + { + var node = Node.FindByKey(nodeId); + if (node != null) return [node]; + } + + var rids = p["areaId"].SplitAsInt("/"); + var provinceId = rids.Length > 0 ? rids[0] : -1; + var cityId = rids.Length > 1 ? rids[1] : -1; + + var category = p["category"]; + var product = p["product"]; + var version = p["version"]; + var enable = p["enable"]?.ToBoolean(); var start = p["dtStart"].ToDateTime(); var end = p["dtEnd"].ToDateTime(); - return Node.Search(start, end, p["Q"], p); + return Node.Search(provinceId, cityId, category, product, version, enable, start, end, p["Q"], p); } } \ No newline at end of file diff --git a/Samples/ZeroServer/Areas/Nodes/Controllers/NodeHistoryController.cs b/Samples/ZeroServer/Areas/Nodes/Controllers/NodeHistoryController.cs index af41563..a3d4316 100644 --- a/Samples/ZeroServer/Areas/Nodes/Controllers/NodeHistoryController.cs +++ b/Samples/ZeroServer/Areas/Nodes/Controllers/NodeHistoryController.cs @@ -14,13 +14,13 @@ namespace ZeroServer.Areas.Nodes.Controllers; /// 节点历史 [Menu(10, true, Icon = "fa-table")] [NodesArea] -public class NodeHistoryController : EntityController +public class NodeHistoryController : NodeEntityController { static NodeHistoryController() { //LogOnChange = true; - //ListFields.RemoveField("Id", "Creator"); + ListFields.RemoveField("ProvinceName"); ListFields.RemoveCreateField().RemoveRemarkField(); //{ @@ -40,24 +40,22 @@ static NodeHistoryController() ListFields.TraceUrl("TraceId"); } - //private readonly ITracer _tracer; - - //public NodeHistoryController(ITracer tracer) - //{ - // _tracer = tracer; - //} - /// 高级搜索。列表页查询、导出Excel、导出Json、分享页等使用 /// 分页器。包含分页排序参数,以及Http请求参数 /// protected override IEnumerable Search(Pager p) { - //var deviceId = p["deviceId"].ToInt(-1); - //var enable = p["enable"]?.Boolean(); + var rids = p["areaId"].SplitAsInt("/"); + var provinceId = rids.Length > 0 ? rids[0] : -1; + var cityId = rids.Length > 1 ? rids[1] : -1; + + var nodeId = p["nodeId"].ToInt(-1); + var action = p["action"]; + var success = p["success"]?.ToBoolean(); var start = p["dtStart"].ToDateTime(); var end = p["dtEnd"].ToDateTime(); - return NodeHistory.Search(start, end, p["Q"], p); + return NodeHistory.Search(nodeId, provinceId, cityId, action, success, start, end, p["Q"], p); } } \ No newline at end of file diff --git a/Samples/ZeroServer/Areas/Nodes/Controllers/NodeOnlineController.cs b/Samples/ZeroServer/Areas/Nodes/Controllers/NodeOnlineController.cs index 6196cbe..ce41276 100644 --- a/Samples/ZeroServer/Areas/Nodes/Controllers/NodeOnlineController.cs +++ b/Samples/ZeroServer/Areas/Nodes/Controllers/NodeOnlineController.cs @@ -14,13 +14,13 @@ namespace ZeroServer.Areas.Nodes.Controllers; /// 节点在线 [Menu(20, true, Icon = "fa-table")] [NodesArea] -public class NodeOnlineController : EntityController +public class NodeOnlineController : NodeEntityController { static NodeOnlineController() { //LogOnChange = true; - //ListFields.RemoveField("Id", "Creator"); + ListFields.RemoveField("ProvinceName", "Token"); ListFields.RemoveCreateField().RemoveRemarkField(); //{ @@ -40,24 +40,20 @@ static NodeOnlineController() //ListFields.TraceUrl("TraceId"); } - //private readonly ITracer _tracer; - - //public NodeOnlineController(ITracer tracer) - //{ - // _tracer = tracer; - //} - /// 高级搜索。列表页查询、导出Excel、导出Json、分享页等使用 /// 分页器。包含分页排序参数,以及Http请求参数 /// protected override IEnumerable Search(Pager p) { - //var deviceId = p["deviceId"].ToInt(-1); - //var enable = p["enable"]?.Boolean(); + var nodeId = p["nodeId"].ToInt(-1); + var rids = p["areaId"].SplitAsInt("/"); + var provinceId = rids.Length > 0 ? rids[0] : -1; + var cityId = rids.Length > 1 ? rids[1] : -1; + var category = p["category"]; var start = p["dtStart"].ToDateTime(); var end = p["dtEnd"].ToDateTime(); - return NodeOnline.Search(start, end, p["Q"], p); + return NodeOnline.Search(nodeId, provinceId, cityId, category, start, end, p["Q"], p); } } \ No newline at end of file diff --git a/Samples/ZeroServer/Areas/Nodes/NodesArea.cs b/Samples/ZeroServer/Areas/Nodes/NodesArea.cs index 8b9a063..496011e 100644 --- a/Samples/ZeroServer/Areas/Nodes/NodesArea.cs +++ b/Samples/ZeroServer/Areas/Nodes/NodesArea.cs @@ -1,6 +1,9 @@ using System.ComponentModel; +using Microsoft.AspNetCore.Mvc.Filters; using NewLife; using NewLife.Cube; +using NewLife.Cube.ViewModels; +using XCode; namespace ZeroServer.Areas.Nodes; @@ -8,4 +11,35 @@ namespace ZeroServer.Areas.Nodes; public class NodesArea : AreaBase { public NodesArea() : base(nameof(NodesArea).TrimEnd("Area")) { } +} + +/// 节点管理控制器基类。抽象共性能力 +/// +public abstract class NodeEntityController : EntityController where TEntity : Entity, new() +{ + public override void OnActionExecuting(ActionExecutingContext filterContext) + { + base.OnActionExecuting(filterContext); + + var nodeId = GetRequest("Id").ToInt(-1); + if (nodeId <= 0) nodeId = GetRequest("nodeId").ToInt(-1); + if (nodeId > 0) + { + PageSetting.NavView = "_Node_Nav"; + PageSetting.EnableNavbar = false; + } + } + + protected override FieldCollection OnGetFields(ViewKinds kind, Object model) + { + var fields = base.OnGetFields(kind, model); + + if (kind == ViewKinds.List) + { + var nodeId = GetRequest("nodeId").ToInt(-1); + if (nodeId > 0) fields.RemoveField("NodeName"); + } + + return fields; + } } \ No newline at end of file diff --git a/Samples/ZeroServer/Areas/Nodes/Views/Node/_List_Search.cshtml b/Samples/ZeroServer/Areas/Nodes/Views/Node/_List_Search.cshtml new file mode 100644 index 0000000..cb3fbc7 --- /dev/null +++ b/Samples/ZeroServer/Areas/Nodes/Views/Node/_List_Search.cshtml @@ -0,0 +1,22 @@ +@using NewLife; +@using NewLife.Web; +@using NewLife.Cube; +@using XCode; +@{ + var fact = ViewBag.Factory as IEntityFactory; + var page = ViewBag.Page as Pager; +} +
+ + @Html.ForDropDownList("category", Node.FindAllCategory(), page["category"], "全部", true) +
+
+ + @Html.ForDropDownList("product", Node.FindAllProduct(), page["product"], "全部", true) +
+
+ + @Html.ForDropDownList("version", Node.FindAllVersion(), page["version"], "全部", true) +
+@await Html.PartialAsync("_Area2", "") +@await Html.PartialAsync("_DateRange") \ No newline at end of file diff --git a/Samples/ZeroServer/Areas/Nodes/Views/NodeHistory/_List_Search.cshtml b/Samples/ZeroServer/Areas/Nodes/Views/NodeHistory/_List_Search.cshtml new file mode 100644 index 0000000..c3a8249 --- /dev/null +++ b/Samples/ZeroServer/Areas/Nodes/Views/NodeHistory/_List_Search.cshtml @@ -0,0 +1,18 @@ +@using NewLife; +@using NewLife.Web; +@using NewLife.Cube; +@using XCode; +@{ + var fact = ViewBag.Factory as IEntityFactory; + var page = ViewBag.Page as Pager; + + var dic = new Dictionary(); + dic.Add(1, "成功"); + dic.Add(0, "失败"); +} +
+ + @Html.ForDropDownList("success", dic, page["success"], "全部", true) +
+@await Html.PartialAsync("_SelectNode", new SelectNodeModel { Id = "nodeId" }) +@await Html.PartialAsync("_DateRange") \ No newline at end of file diff --git a/Samples/ZeroServer/Areas/Nodes/Views/NodeOnline/_List_Search.cshtml b/Samples/ZeroServer/Areas/Nodes/Views/NodeOnline/_List_Search.cshtml new file mode 100644 index 0000000..02f156a --- /dev/null +++ b/Samples/ZeroServer/Areas/Nodes/Views/NodeOnline/_List_Search.cshtml @@ -0,0 +1,12 @@ +@using NewLife; +@using NewLife.Web; +@using XCode; +@{ + var fact = ViewBag.Factory as IEntityFactory; + var page = ViewBag.Page as Pager; +} +
+ + @Html.ForDropDownList("category", Node.FindAllCategory(), page["category"], "全部", true) +
+@await Html.PartialAsync("_Area2", "") diff --git a/Samples/ZeroServer/Areas/Nodes/Views/NodeOnline/_List_Toolbar_Batch.cshtml b/Samples/ZeroServer/Areas/Nodes/Views/NodeOnline/_List_Toolbar_Batch.cshtml new file mode 100644 index 0000000..efd35df --- /dev/null +++ b/Samples/ZeroServer/Areas/Nodes/Views/NodeOnline/_List_Toolbar_Batch.cshtml @@ -0,0 +1,21 @@ +@using NewLife.Common; +@using System.Collections.Generic; +@{ + var set = ViewBag.PageSetting as PageSetting; + var page = ViewBag.Page as Pager; +} +@if (set.EnableSelect) +{ + +
+ + @Html.TextBox("command", page["command"]) + + @Html.TextBox("argument", page["argument"]) +
+ +} \ No newline at end of file diff --git a/Samples/ZeroServer/Areas/Nodes/Views/_ViewImports.cshtml b/Samples/ZeroServer/Areas/Nodes/Views/_ViewImports.cshtml new file mode 100644 index 0000000..8278207 --- /dev/null +++ b/Samples/ZeroServer/Areas/Nodes/Views/_ViewImports.cshtml @@ -0,0 +1,9 @@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@using NewLife +@using NewLife.Cube +@using NewLife.Reflection +@using NewLife.Web +@using XCode +@using XCode.Membership +@using Zero.Data.Nodes +@using ZeroServer.Models diff --git a/Samples/ZeroServer/Models/SelectNodeModel.cs b/Samples/ZeroServer/Models/SelectNodeModel.cs new file mode 100644 index 0000000..8a44d8a --- /dev/null +++ b/Samples/ZeroServer/Models/SelectNodeModel.cs @@ -0,0 +1,12 @@ +namespace ZeroServer.Models; + +public class SelectNodeModel +{ + public String Id { get; set; } + + public String Category { get; set; } + + public String Product { get; set; } + + public Int32 NodeId { get; set; } +} diff --git a/Samples/ZeroServer/Services/NodeService.cs b/Samples/ZeroServer/Services/NodeService.cs index 3ad2ab4..71cc5e1 100644 --- a/Samples/ZeroServer/Services/NodeService.cs +++ b/Samples/ZeroServer/Services/NodeService.cs @@ -343,7 +343,8 @@ public IProducerConsumer GetQueue(String deviceCode) /// public void WriteHistory(IDeviceModel model, String action, Boolean success, String remark, String ip) { - NodeHistory.Create(model as Node, action, success, remark, Environment.MachineName, ip); + var history = NodeHistory.Create(model as Node, action, success, remark, Environment.MachineName, ip); + history.SaveAsync(); } #endregion } \ No newline at end of file diff --git a/Samples/ZeroServer/Views/Shared/_Node_Nav.cshtml b/Samples/ZeroServer/Views/Shared/_Node_Nav.cshtml new file mode 100644 index 0000000..a22df27 --- /dev/null +++ b/Samples/ZeroServer/Views/Shared/_Node_Nav.cshtml @@ -0,0 +1,58 @@ +@{ + var obj = Model as Object; + var path = Context.Request.Path + ""; + var nodeId = Context.Request.Query["nodeId"].ToInt(0); + if (nodeId == 0 && path.EqualIgnoreCase("/Nodes/Node", "/Nodes/Node/Detail", "/Nodes/Node/Edit")) + { + nodeId = Context.Request.Query["Id"].ToInt(0); + } + + var start = Context.Request.Query["dtStart"].ToDateTime(); + var end = Context.Request.Query["dtEnd"].ToDateTime(); + if (end.Year < 2000) end = Context.Request.Query["dtEnd2"].ToDateTime().AddSeconds(1); + + var node = Node.FindByID(nodeId) ?? new Node(); + + var dic = new Dictionary(); + dic[node.Name + ""] = "/Nodes/Node/Edit?Id=" + nodeId; + dic["在线"] = "/Nodes/NodeOnline?nodeId=" + nodeId; + dic["历史"] = "/Nodes/NodeHistory?nodeId=" + nodeId; +} +@if (nodeId > 0) +{ + +} \ No newline at end of file diff --git a/Samples/ZeroServer/Views/Shared/_SelectNode.cshtml b/Samples/ZeroServer/Views/Shared/_SelectNode.cshtml new file mode 100644 index 0000000..f6b73b4 --- /dev/null +++ b/Samples/ZeroServer/Views/Shared/_SelectNode.cshtml @@ -0,0 +1,60 @@ +@model SelectNodeModel +@using NewLife +@using NewLife.Web +@using XCode +@using System.Linq +@using ZeroServer.Models +@{ + var id = Model.Id; + var page = ViewBag.Page as Pager; + + if (id.IsNullOrEmpty()) { id = "nodeId"; } + var nodeId = Model.NodeId; + if (nodeId <= 0) nodeId = page[id].ToInt(); + var showValue = Node.FindByID(nodeId)?.Name; +} + +
+
+
+ + +
+ +
+
+
+
+ + + \ No newline at end of file diff --git a/Samples/ZeroServer/Views/_ViewImports.cshtml b/Samples/ZeroServer/Views/_ViewImports.cshtml new file mode 100644 index 0000000..615a51e --- /dev/null +++ b/Samples/ZeroServer/Views/_ViewImports.cshtml @@ -0,0 +1,12 @@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@using NewLife +@using NewLife.Cube +@using NewLife.Reflection +@using NewLife.Web +@using XCode +@using XCode.Membership +@using NewLife.Cube.Areas.Admin.Models +@using NewLife.Cube.Extensions +@using NewLife.Cube.ViewModels +@using Zero.Data.Nodes +@using ZeroServer.Models diff --git a/Samples/ZeroServer/ZeroServer.csproj b/Samples/ZeroServer/ZeroServer.csproj index 52af78d..8fc599f 100644 --- a/Samples/ZeroServer/ZeroServer.csproj +++ b/Samples/ZeroServer/ZeroServer.csproj @@ -28,8 +28,4 @@ - - - -