, 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)
+{
+
+
+ @foreach (var item in dic)
+ {
+ if (item.Value is IDictionary childs)
+ {
+
+ @item.Key
+
+
+ }
+ else
+ {
+ var url = item.Value + "";
+ var v = url.Substring(null, "?");
+ if (start.Year > 2000) url += "&dtStart=" + start.ToFullString();
+ if (end.Year > 2000) url += "&dtEnd=" + end.ToFullString();
+
+ @item.Key
+
+ }
+ }
+
+
+}
\ 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 @@
-
-
-
-