mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-07 23:30:26 +08:00
改进界面
This commit is contained in:
@@ -2,6 +2,7 @@ package node
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
@@ -18,7 +19,18 @@ func (this *LogsAction) Init() {
|
|||||||
|
|
||||||
func (this *LogsAction) RunGet(params struct {
|
func (this *LogsAction) RunGet(params struct {
|
||||||
NodeId int64
|
NodeId int64
|
||||||
|
|
||||||
|
DayFrom string
|
||||||
|
DayTo string
|
||||||
|
Keyword string
|
||||||
|
Level string
|
||||||
}) {
|
}) {
|
||||||
|
this.Data["nodeId"] = params.NodeId
|
||||||
|
this.Data["dayFrom"] = params.DayFrom
|
||||||
|
this.Data["dayTo"] = params.DayTo
|
||||||
|
this.Data["keyword"] = params.Keyword
|
||||||
|
this.Data["level"] = params.Level
|
||||||
|
|
||||||
apiNodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId})
|
apiNodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -36,8 +48,12 @@ func (this *LogsAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
countResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{
|
countResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{
|
||||||
Role: "api",
|
Role: nodeconfigs.NodeRoleAPI,
|
||||||
NodeId: params.NodeId,
|
NodeId: params.NodeId,
|
||||||
|
DayFrom: params.DayFrom,
|
||||||
|
DayTo: params.DayTo,
|
||||||
|
Keyword: params.Keyword,
|
||||||
|
Level: params.Level,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -48,7 +64,12 @@ func (this *LogsAction) RunGet(params struct {
|
|||||||
|
|
||||||
logsResp, err := this.RPC().NodeLogRPC().ListNodeLogs(this.AdminContext(), &pb.ListNodeLogsRequest{
|
logsResp, err := this.RPC().NodeLogRPC().ListNodeLogs(this.AdminContext(), &pb.ListNodeLogsRequest{
|
||||||
NodeId: params.NodeId,
|
NodeId: params.NodeId,
|
||||||
Role: "api",
|
Role: nodeconfigs.NodeRoleAPI,
|
||||||
|
DayFrom: params.DayFrom,
|
||||||
|
DayTo: params.DayTo,
|
||||||
|
Keyword: params.Keyword,
|
||||||
|
Level: params.Level,
|
||||||
|
|
||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -29,13 +29,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
this.Data["searchType"] = params.SearchType
|
this.Data["searchType"] = params.SearchType
|
||||||
this.Data["isSearching"] = isSearching
|
this.Data["isSearching"] = isSearching
|
||||||
|
|
||||||
// 搜索节点
|
// 常用的集群
|
||||||
if params.SearchType == "node" && len(params.Keyword) > 0 {
|
|
||||||
this.searchNodes(params.Keyword)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 常用的节点
|
|
||||||
latestClusterMaps := []maps.Map{}
|
latestClusterMaps := []maps.Map{}
|
||||||
if !isSearching {
|
if !isSearching {
|
||||||
clustersResp, err := this.RPC().NodeClusterRPC().FindLatestNodeClusters(this.AdminContext(), &pb.FindLatestNodeClustersRequest{Size: 6})
|
clustersResp, err := this.RPC().NodeClusterRPC().FindLatestNodeClusters(this.AdminContext(), &pb.FindLatestNodeClustersRequest{Size: 6})
|
||||||
@@ -52,6 +46,12 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["latestClusters"] = latestClusterMaps
|
this.Data["latestClusters"] = latestClusterMaps
|
||||||
|
|
||||||
|
// 搜索节点
|
||||||
|
if params.SearchType == "node" && len(params.Keyword) > 0 {
|
||||||
|
this.searchNodes(params.Keyword)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 搜索集群
|
// 搜索集群
|
||||||
countResp, err := this.RPC().NodeClusterRPC().CountAllEnabledNodeClusters(this.AdminContext(), &pb.CountAllEnabledNodeClustersRequest{
|
countResp, err := this.RPC().NodeClusterRPC().CountAllEnabledNodeClusters(this.AdminContext(), &pb.CountAllEnabledNodeClustersRequest{
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ func init() {
|
|||||||
// 节点相关
|
// 节点相关
|
||||||
Helper(NewHelper()).
|
Helper(NewHelper()).
|
||||||
Get("", new(IndexAction)).
|
Get("", new(IndexAction)).
|
||||||
|
Get("/logs", new(LogsAction)).
|
||||||
GetPost("/update", new(UpdateAction)).
|
GetPost("/update", new(UpdateAction)).
|
||||||
Get("/install", new(InstallAction)).
|
Get("/install", new(InstallAction)).
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package node
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LogsAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LogsAction) Init() {
|
||||||
|
this.Nav("", "node", "log")
|
||||||
|
this.SecondMenu("nodes")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LogsAction) RunGet(params struct {
|
||||||
|
NodeId int64
|
||||||
|
|
||||||
|
DayFrom string
|
||||||
|
DayTo string
|
||||||
|
Keyword string
|
||||||
|
Level string
|
||||||
|
}) {
|
||||||
|
this.Data["nodeId"] = params.NodeId
|
||||||
|
this.Data["dayFrom"] = params.DayFrom
|
||||||
|
this.Data["dayTo"] = params.DayTo
|
||||||
|
this.Data["keyword"] = params.Keyword
|
||||||
|
this.Data["level"] = params.Level
|
||||||
|
|
||||||
|
apiNodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
apiNode := apiNodeResp.Node
|
||||||
|
if apiNode == nil {
|
||||||
|
this.NotFound("apiNode", params.NodeId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Data["node"] = maps.Map{
|
||||||
|
"id": apiNode.Id,
|
||||||
|
"name": apiNode.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
countResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{
|
||||||
|
Role: nodeconfigs.NodeRoleAuthority,
|
||||||
|
NodeId: params.NodeId,
|
||||||
|
DayFrom: params.DayFrom,
|
||||||
|
DayTo: params.DayTo,
|
||||||
|
Keyword: params.Keyword,
|
||||||
|
Level: params.Level,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
count := countResp.Count
|
||||||
|
page := this.NewPage(count, 20)
|
||||||
|
|
||||||
|
logsResp, err := this.RPC().NodeLogRPC().ListNodeLogs(this.AdminContext(), &pb.ListNodeLogsRequest{
|
||||||
|
NodeId: params.NodeId,
|
||||||
|
Role: nodeconfigs.NodeRoleAuthority,
|
||||||
|
DayFrom: params.DayFrom,
|
||||||
|
DayTo: params.DayTo,
|
||||||
|
Keyword: params.Keyword,
|
||||||
|
Level: params.Level,
|
||||||
|
|
||||||
|
Offset: page.Offset,
|
||||||
|
Size: page.Size,
|
||||||
|
})
|
||||||
|
|
||||||
|
logs := []maps.Map{}
|
||||||
|
for _, log := range logsResp.NodeLogs {
|
||||||
|
logs = append(logs, maps.Map{
|
||||||
|
"tag": log.Tag,
|
||||||
|
"description": log.Description,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d H:i:s", log.CreatedAt),
|
||||||
|
"level": log.Level,
|
||||||
|
"isToday": timeutil.FormatTime("Y-m-d", log.CreatedAt) == timeutil.Format("Y-m-d"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.Data["logs"] = logs
|
||||||
|
|
||||||
|
this.Data["page"] = page.AsHTML()
|
||||||
|
|
||||||
|
this.Show()
|
||||||
|
}
|
||||||
@@ -17,6 +17,7 @@ func init() {
|
|||||||
// 节点相关
|
// 节点相关
|
||||||
Helper(NewHelper()).
|
Helper(NewHelper()).
|
||||||
Get("", new(IndexAction)).
|
Get("", new(IndexAction)).
|
||||||
|
Get("/logs", new(LogsAction)).
|
||||||
GetPost("/update", new(UpdateAction)).
|
GetPost("/update", new(UpdateAction)).
|
||||||
Get("/install", new(InstallAction)).
|
Get("/install", new(InstallAction)).
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package node
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LogsAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LogsAction) Init() {
|
||||||
|
this.Nav("", "node", "log")
|
||||||
|
this.SecondMenu("nodes")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LogsAction) RunGet(params struct {
|
||||||
|
NodeId int64
|
||||||
|
|
||||||
|
DayFrom string
|
||||||
|
DayTo string
|
||||||
|
Keyword string
|
||||||
|
Level string
|
||||||
|
}) {
|
||||||
|
this.Data["nodeId"] = params.NodeId
|
||||||
|
this.Data["dayFrom"] = params.DayFrom
|
||||||
|
this.Data["dayTo"] = params.DayTo
|
||||||
|
this.Data["keyword"] = params.Keyword
|
||||||
|
this.Data["level"] = params.Level
|
||||||
|
|
||||||
|
apiNodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
apiNode := apiNodeResp.Node
|
||||||
|
if apiNode == nil {
|
||||||
|
this.NotFound("apiNode", params.NodeId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Data["node"] = maps.Map{
|
||||||
|
"id": apiNode.Id,
|
||||||
|
"name": apiNode.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
countResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{
|
||||||
|
Role: nodeconfigs.NodeRoleMonitor,
|
||||||
|
NodeId: params.NodeId,
|
||||||
|
DayFrom: params.DayFrom,
|
||||||
|
DayTo: params.DayTo,
|
||||||
|
Keyword: params.Keyword,
|
||||||
|
Level: params.Level,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
count := countResp.Count
|
||||||
|
page := this.NewPage(count, 20)
|
||||||
|
|
||||||
|
logsResp, err := this.RPC().NodeLogRPC().ListNodeLogs(this.AdminContext(), &pb.ListNodeLogsRequest{
|
||||||
|
NodeId: params.NodeId,
|
||||||
|
Role: nodeconfigs.NodeRoleMonitor,
|
||||||
|
DayFrom: params.DayFrom,
|
||||||
|
DayTo: params.DayTo,
|
||||||
|
Keyword: params.Keyword,
|
||||||
|
Level: params.Level,
|
||||||
|
|
||||||
|
Offset: page.Offset,
|
||||||
|
Size: page.Size,
|
||||||
|
})
|
||||||
|
|
||||||
|
logs := []maps.Map{}
|
||||||
|
for _, log := range logsResp.NodeLogs {
|
||||||
|
logs = append(logs, maps.Map{
|
||||||
|
"tag": log.Tag,
|
||||||
|
"description": log.Description,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d H:i:s", log.CreatedAt),
|
||||||
|
"level": log.Level,
|
||||||
|
"isToday": timeutil.FormatTime("Y-m-d", log.CreatedAt) == timeutil.Format("Y-m-d"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.Data["logs"] = logs
|
||||||
|
|
||||||
|
this.Data["page"] = page.AsHTML()
|
||||||
|
|
||||||
|
this.Show()
|
||||||
|
}
|
||||||
@@ -21,6 +21,7 @@ func init() {
|
|||||||
// 节点相关
|
// 节点相关
|
||||||
Helper(NewHelper()).
|
Helper(NewHelper()).
|
||||||
Get("", new(IndexAction)).
|
Get("", new(IndexAction)).
|
||||||
|
Get("/logs", new(LogsAction)).
|
||||||
GetPost("/update", new(UpdateAction)).
|
GetPost("/update", new(UpdateAction)).
|
||||||
Get("/install", new(InstallAction)).
|
Get("/install", new(InstallAction)).
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package node
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LogsAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LogsAction) Init() {
|
||||||
|
this.Nav("", "node", "log")
|
||||||
|
this.SecondMenu("nodes")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LogsAction) RunGet(params struct {
|
||||||
|
NodeId int64
|
||||||
|
|
||||||
|
DayFrom string
|
||||||
|
DayTo string
|
||||||
|
Keyword string
|
||||||
|
Level string
|
||||||
|
}) {
|
||||||
|
this.Data["nodeId"] = params.NodeId
|
||||||
|
this.Data["dayFrom"] = params.DayFrom
|
||||||
|
this.Data["dayTo"] = params.DayTo
|
||||||
|
this.Data["keyword"] = params.Keyword
|
||||||
|
this.Data["level"] = params.Level
|
||||||
|
|
||||||
|
apiNodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
apiNode := apiNodeResp.Node
|
||||||
|
if apiNode == nil {
|
||||||
|
this.NotFound("apiNode", params.NodeId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Data["node"] = maps.Map{
|
||||||
|
"id": apiNode.Id,
|
||||||
|
"name": apiNode.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
countResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{
|
||||||
|
Role: nodeconfigs.NodeRoleUser,
|
||||||
|
NodeId: params.NodeId,
|
||||||
|
DayFrom: params.DayFrom,
|
||||||
|
DayTo: params.DayTo,
|
||||||
|
Keyword: params.Keyword,
|
||||||
|
Level: params.Level,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
count := countResp.Count
|
||||||
|
page := this.NewPage(count, 20)
|
||||||
|
|
||||||
|
logsResp, err := this.RPC().NodeLogRPC().ListNodeLogs(this.AdminContext(), &pb.ListNodeLogsRequest{
|
||||||
|
NodeId: params.NodeId,
|
||||||
|
Role: nodeconfigs.NodeRoleUser,
|
||||||
|
DayFrom: params.DayFrom,
|
||||||
|
DayTo: params.DayTo,
|
||||||
|
Keyword: params.Keyword,
|
||||||
|
Level: params.Level,
|
||||||
|
|
||||||
|
Offset: page.Offset,
|
||||||
|
Size: page.Size,
|
||||||
|
})
|
||||||
|
|
||||||
|
logs := []maps.Map{}
|
||||||
|
for _, log := range logsResp.NodeLogs {
|
||||||
|
logs = append(logs, maps.Map{
|
||||||
|
"tag": log.Tag,
|
||||||
|
"description": log.Description,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d H:i:s", log.CreatedAt),
|
||||||
|
"level": log.Level,
|
||||||
|
"isToday": timeutil.FormatTime("Y-m-d", log.CreatedAt) == timeutil.Format("Y-m-d"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.Data["logs"] = logs
|
||||||
|
|
||||||
|
this.Data["page"] = page.AsHTML()
|
||||||
|
|
||||||
|
this.Show()
|
||||||
|
}
|
||||||
12
web/public/js/components/common/node-log-row.js
Normal file
12
web/public/js/components/common/node-log-row.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
Vue.component("node-log-row", {
|
||||||
|
props: ["v-log", "v-keyword"],
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
log: this.vLog,
|
||||||
|
keyword: this.vKeyword
|
||||||
|
}
|
||||||
|
},
|
||||||
|
template: `<div>
|
||||||
|
<pre class="log-box" style="margin: 0; padding: 0"><span :class="{red:log.level == 'error', orange:log.level == 'warning'}"><span v-if="!log.isToday">[{{log.createdTime}}]</span><strong v-if="log.isToday">[{{log.createdTime}}]</strong><keyword :v-word="keyword">[{{log.tag}}]{{log.description}}</keyword></span> <span v-if="log.count > 0" class="ui label tiny" :class="{red:log.level == 'error', orange:log.level == 'warning'}">共{{log.count}}条</span></pre>
|
||||||
|
</div>`
|
||||||
|
})
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
{$var "header"}
|
{$var "header"}
|
||||||
<!-- code editor -->
|
<!-- code editor -->
|
||||||
<script src="/codemirror/lib/codemirror.js" type="text/javascript"></script>
|
<script src="/codemirror/lib/codemirror.js" type="text/javascript"></script>
|
||||||
|
|||||||
8
web/views/@default/@datepicker.html
Normal file
8
web/views/@default/@datepicker.html
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{$var "header"}
|
||||||
|
<!-- datepicker -->
|
||||||
|
<script type="text/javascript" src="/js/moment.min.js"></script>
|
||||||
|
<script type="text/javascript" src="/js/pikaday.js"></script>
|
||||||
|
<link rel="stylesheet" href="/js/pikaday.css"/>
|
||||||
|
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
||||||
|
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
||||||
|
{$end}
|
||||||
@@ -1,6 +1,36 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
|
|
||||||
{$template "menu"}
|
{$template "menu"}
|
||||||
|
{$template "/datepicker"}
|
||||||
|
|
||||||
|
<div class="margin"></div>
|
||||||
|
<form method="get" action="/api/node/logs" class="ui form" autocomplete="off">
|
||||||
|
<input type="hidden" name="nodeId" :value="nodeId"/>
|
||||||
|
<div class="ui fields inline">
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="dayFrom" placeholder="开始日期" v-model="dayFrom" value="" style="width:8em" id="day-from-picker"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="dayTo" placeholder="结束日期" v-model="dayTo" value="" style="width:8em" id="day-to-picker"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<select class="ui dropdown" name="level" v-model="level">
|
||||||
|
<option value="">[级别]</option>
|
||||||
|
<option value="error">错误</option>
|
||||||
|
<option value="warning">警告</option>
|
||||||
|
<option value="info">信息</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="keyword" style="width:10em" v-model="keyword" placeholder="关键词"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<button type="submit" class="ui button">查询</button>
|
||||||
|
</div>
|
||||||
|
<div class="ui field" v-if="dayFrom.length > 0 || dayTo.length > 0 || keyword.length > 0 || level.length > 0">
|
||||||
|
<a :href="'/api/node/logs?nodeId=' + nodeId">[清除条件]</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
<p class="comment" v-if="logs.length == 0">暂时还没有日志。</p>
|
<p class="comment" v-if="logs.length == 0">暂时还没有日志。</p>
|
||||||
|
|
||||||
@@ -12,7 +42,7 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tr v-for="log in logs">
|
<tr v-for="log in logs">
|
||||||
<td>
|
<td>
|
||||||
<pre class="log-box"><span :class="{red:log.level == 'error', orange:log.level == 'warning'}"><span v-if="!log.isToday">[{{log.createdTime}}]</span><strong v-if="log.isToday">[{{log.createdTime}}]</strong>[{{log.tag}}]{{log.description}}</span></pre>
|
<node-log-row :v-log="log" :v-keyword="keyword"></node-log-row>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
6
web/views/@default/api/node/logs.js
Normal file
6
web/views/@default/api/node/logs.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Tea.context(function () {
|
||||||
|
this.$delay(function () {
|
||||||
|
teaweb.datepicker("day-from-picker")
|
||||||
|
teaweb.datepicker("day-to-picker")
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -1,14 +1,6 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
{$template "node_menu"}
|
{$template "node_menu"}
|
||||||
|
{$template "/datepicker"}
|
||||||
{$var "header"}
|
|
||||||
<!-- datepicker -->
|
|
||||||
<script type="text/javascript" src="/js/moment.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/js/pikaday.js"></script>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
|
||||||
{$end}
|
|
||||||
|
|
||||||
<form method="get" action="/clusters/cluster/node/logs" class="ui form" autocomplete="off">
|
<form method="get" action="/clusters/cluster/node/logs" class="ui form" autocomplete="off">
|
||||||
<input type="hidden" name="clusterId" :value="clusterId"/>
|
<input type="hidden" name="clusterId" :value="clusterId"/>
|
||||||
@@ -50,7 +42,7 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tr v-for="log in logs">
|
<tr v-for="log in logs">
|
||||||
<td>
|
<td>
|
||||||
<pre class="log-box"><span :class="{red:log.level == 'error', orange:log.level == 'warning'}"><span v-if="!log.isToday">[{{log.createdTime}}]</span><strong v-if="log.isToday">[{{log.createdTime}}]</strong>[{{log.tag}}]{{log.description}}</span> <span v-if="log.count > 0" class="ui label tiny" :class="{red:log.level == 'error', orange:log.level == 'warning'}">共{{log.count}}条</span></pre>
|
<node-log-row :v-log="log" :v-keyword="keyword"></node-log-row>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tr v-for="cluster in clusters">
|
<tr v-for="cluster in clusters">
|
||||||
<td>{{cluster.name}}</td>
|
<td><keyword :v-word="keyword">{{cluster.name}}</keyword></td>
|
||||||
<td class="center">
|
<td class="center">
|
||||||
<a :href="'/clusters/cluster?clusterId=' + cluster.id" v-if="cluster.countAllNodes > 0"><span :class="{red:cluster.countAllNodes > cluster.countActiveNodes}">{{cluster.countAllNodes}}</span></a>
|
<a :href="'/clusters/cluster?clusterId=' + cluster.id" v-if="cluster.countAllNodes > 0"><span :class="{red:cluster.countAllNodes > cluster.countActiveNodes}">{{cluster.countAllNodes}}</span></a>
|
||||||
<span class="disabled" v-else="">-</span>
|
<span class="disabled" v-else="">-</span>
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span v-if="cluster.dnsName.length > 0">
|
<span v-if="cluster.dnsName.length > 0">
|
||||||
<var>{{cluster.dnsName}}</var>.<span v-if="cluster.dnsDomainName.length > 0">{{cluster.dnsDomainName}}</span><span v-else class="disabled">主域名</span>
|
<var><keyword :v-word="keyword">{{cluster.dnsName}}</keyword></var>.<span v-if="cluster.dnsDomainName.length > 0">{{cluster.dnsDomainName}}</span><span v-else class="disabled">主域名</span>
|
||||||
<span v-if="cluster.dnsDomainId > 0"><link-icon :href="'/dns/clusters/cluster?clusterId=' + cluster.id"></link-icon></span>
|
<span v-if="cluster.dnsDomainId > 0"><link-icon :href="'/dns/clusters/cluster?clusterId=' + cluster.id"></link-icon></span>
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="disabled">-</span>
|
<span v-else class="disabled">-</span>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tr v-for="node in nodes">
|
<tr v-for="node in nodes">
|
||||||
<td>{{node.name}}
|
<td><keyword :v-word="keyword">{{node.name}}</keyword>
|
||||||
<div style="margin-top: 0.5em">
|
<div style="margin-top: 0.5em">
|
||||||
<span class="ui label tiny">集群:{{node.cluster.name}}</span>
|
<span class="ui label tiny">集群:{{node.cluster.name}}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
<span v-if="node.ipAddresses.length == 0" class="disabled">-</span>
|
<span v-if="node.ipAddresses.length == 0" class="disabled">-</span>
|
||||||
<div v-else class="address-box">
|
<div v-else class="address-box">
|
||||||
<div v-for="addr in node.ipAddresses" style="margin-bottom:0.3em">
|
<div v-for="addr in node.ipAddresses" style="margin-bottom:0.3em">
|
||||||
<div class="ui label tiny basic">{{addr.ip}}
|
<div class="ui label tiny basic"><keyword :v-word="keyword">{{addr.ip}}</keyword>
|
||||||
<span class="small" v-if="addr.name.length > 0">({{addr.name}}<span v-if="!addr.canAccess">,不可访问</span>)</span>
|
<span class="small" v-if="addr.name.length > 0">({{addr.name}}<span v-if="!addr.canAccess">,不可访问</span>)</span>
|
||||||
<span class="small" v-if="addr.name.length == 0 && !addr.canAccess">(不可访问)</span>
|
<span class="small" v-if="addr.name.length == 0 && !addr.canAccess">(不可访问)</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,14 +1,5 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
|
{$template "/datepicker"}
|
||||||
{$var "header"}
|
|
||||||
<!-- datepicker -->
|
|
||||||
<script type="text/javascript" src="/js/moment.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/js/pikaday.js"></script>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
|
||||||
{$end}
|
|
||||||
|
|
||||||
|
|
||||||
<div class="margin"></div>
|
<div class="margin"></div>
|
||||||
|
|
||||||
@@ -54,7 +45,7 @@
|
|||||||
<td nowrap=""><link-icon :href="'/clusters/cluster?clusterId=' + log.node.cluster.id">{{log.node.cluster.name}}</link-icon></td>
|
<td nowrap=""><link-icon :href="'/clusters/cluster?clusterId=' + log.node.cluster.id">{{log.node.cluster.name}}</link-icon></td>
|
||||||
<td nowrap=""><link-icon :href="'/clusters/cluster/node?clusterId=' + log.node.cluster.id + '&nodeId=' + log.node.id">{{log.node.name}}</link-icon></td>
|
<td nowrap=""><link-icon :href="'/clusters/cluster/node?clusterId=' + log.node.cluster.id + '&nodeId=' + log.node.id">{{log.node.name}}</link-icon></td>
|
||||||
<td>
|
<td>
|
||||||
<pre class="log-box"><span :class="{red:log.level == 'error', orange:log.level == 'warning'}"><span v-if="!log.isToday">[{{log.createdTime}}]</span><strong v-if="log.isToday">[{{log.createdTime}}]</strong>[{{log.tag}}]{{log.description}}</span> <span v-if="log.count > 0" class="ui label tiny" :class="{red:log.level == 'error', orange:log.level == 'warning'}">共{{log.count}}条</span></pre>
|
<node-log-row :v-log="log" :v-keyword="keyword"></node-log-row>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -1,14 +1,6 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
{$template "menu"}
|
{$template "menu"}
|
||||||
|
{$template "/datepicker"}
|
||||||
{$var "header"}
|
|
||||||
<!-- datepicker -->
|
|
||||||
<script type="text/javascript" src="/js/moment.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/js/pikaday.js"></script>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
|
||||||
{$end}
|
|
||||||
|
|
||||||
<div class="margin"></div>
|
<div class="margin"></div>
|
||||||
|
|
||||||
@@ -50,13 +42,13 @@
|
|||||||
<table class="ui table selectable" v-for="log in logs">
|
<table class="ui table selectable" v-for="log in logs">
|
||||||
<tr :class="{error: log.level == 'error', warning: log.level == 'warn'}">
|
<tr :class="{error: log.level == 'error', warning: log.level == 'warn'}">
|
||||||
<td class="log-row">{{log.createdTime}} <span class="grey"> <span
|
<td class="log-row">{{log.createdTime}} <span class="grey"> <span
|
||||||
v-if="log.userName.length > 0">| <span v-if="log.userId>0">用户 | </span> {{log.userName}}</span> | {{log.ip}}<span
|
v-if="log.userName.length > 0">| <span v-if="log.userId>0">用户 | </span> {{log.userName}}</span> | <keyword :v-word="keyword">{{log.ip}}</keyword><span
|
||||||
v-if="log.region.length > 0"> | {{log.region}}</span> <a href="" @click.prevent="showMore(log)" title="显示更多">...</a> <span v-if="log.moreVisible">{{log.action}}</span></span>
|
v-if="log.region.length > 0"> | {{log.region}}</span> <a href="" @click.prevent="showMore(log)" title="显示更多">...</a> <span v-if="log.moreVisible">{{log.action}}</span></span>
|
||||||
<span class="buttons"><a v-if="logConfig.canDelete" href="" title="删除" @click.prevent="deleteLog(log.id)"><i class="icon remove small"></i></a> </span>
|
<span class="buttons"><a v-if="logConfig.canDelete" href="" title="删除" @click.prevent="deleteLog(log.id)"><i class="icon remove small"></i></a> </span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr :class="{error: log.level == 'error', warning: log.level == 'warn'}">
|
<tr :class="{error: log.level == 'error', warning: log.level == 'warn'}">
|
||||||
<td>{{log.description}}</td>
|
<td><keyword :v-word="keyword">{{log.description}}</keyword></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,5 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
|
{$template "/datepicker"}
|
||||||
{$var "header"}
|
|
||||||
<!-- datepicker -->
|
|
||||||
<script type="text/javascript" src="/js/moment.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/js/pikaday.js"></script>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
|
||||||
{$end}
|
|
||||||
|
|
||||||
<first-menu>
|
<first-menu>
|
||||||
<div class="item right">
|
<div class="item right">
|
||||||
|
|||||||
@@ -1,14 +1,6 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
{$template "node_menu"}
|
{$template "node_menu"}
|
||||||
|
{$template "/datepicker"}
|
||||||
{$var "header"}
|
|
||||||
<!-- datepicker -->
|
|
||||||
<script type="text/javascript" src="/js/moment.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/js/pikaday.js"></script>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
|
||||||
{$end}
|
|
||||||
|
|
||||||
<form method="get" action="/ns/clusters/cluster/node/logs" class="ui form" autocomplete="off">
|
<form method="get" action="/ns/clusters/cluster/node/logs" class="ui form" autocomplete="off">
|
||||||
<input type="hidden" name="clusterId" :value="clusterId"/>
|
<input type="hidden" name="clusterId" :value="clusterId"/>
|
||||||
@@ -50,7 +42,7 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tr v-for="log in logs">
|
<tr v-for="log in logs">
|
||||||
<td>
|
<td>
|
||||||
<pre class="log-box"><span :class="{red:log.level == 'error', orange:log.level == 'warning'}"><span v-if="!log.isToday">[{{log.createdTime}}]</span><strong v-if="log.isToday">[{{log.createdTime}}]</strong>[{{log.tag}}]{{log.description}}</span> <span v-if="log.count > 0" class="ui label tiny" :class="{red:log.level == 'error', orange:log.level == 'warning'}">共{{log.count}}条</span></pre>
|
<node-log-row :v-log="log" :v-keyword="keyword"></node-log-row>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -1,13 +1,5 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
|
{$template "/datepicker"}
|
||||||
{$var "header"}
|
|
||||||
<!-- datepicker -->
|
|
||||||
<script type="text/javascript" src="/js/moment.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/js/pikaday.js"></script>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
|
||||||
{$end}
|
|
||||||
|
|
||||||
|
|
||||||
<div class="margin"></div>
|
<div class="margin"></div>
|
||||||
@@ -54,7 +46,7 @@
|
|||||||
<td nowrap=""><link-icon :href="'/ns/clusters/cluster?clusterId=' + log.node.cluster.id">{{log.node.cluster.name}}</link-icon></td>
|
<td nowrap=""><link-icon :href="'/ns/clusters/cluster?clusterId=' + log.node.cluster.id">{{log.node.cluster.name}}</link-icon></td>
|
||||||
<td nowrap=""><link-icon :href="'/ns/clusters/cluster/node?clusterId=' + log.node.cluster.id + '&nodeId=' + log.node.id">{{log.node.name}}</link-icon></td>
|
<td nowrap=""><link-icon :href="'/ns/clusters/cluster/node?clusterId=' + log.node.cluster.id + '&nodeId=' + log.node.id">{{log.node.name}}</link-icon></td>
|
||||||
<td>
|
<td>
|
||||||
<pre class="log-box"><span :class="{red:log.level == 'error', orange:log.level == 'warning'}"><span v-if="!log.isToday">[{{log.createdTime}}]</span><strong v-if="log.isToday">[{{log.createdTime}}]</strong>[{{log.tag}}]{{log.description}}</span> <span v-if="log.count > 0" class="ui label tiny" :class="{red:log.level == 'error', orange:log.level == 'warning'}">共{{log.count}}条</span></pre>
|
<node-log-row :v-log="log" :v-keyword="keyword"></node-log-row>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<ns-user-selector :v-user-id="userId"></ns-user-selector>
|
<ns-user-selector :v-user-id="userId"></ns-user-selector>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui field">
|
<div class="ui field">
|
||||||
<input type="text" name="keyword" v-model="keyword" placeholder="域名、备注..."/>
|
<input type="text" name="keyword" v-model="keyword" placeholder="域名..."/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui field">
|
<div class="ui field">
|
||||||
<button class="ui button" type="submit">搜索</button>
|
<button class="ui button" type="submit">搜索</button>
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tr v-for="domain in domains">
|
<tr v-for="domain in domains">
|
||||||
<td>{{domain.name}}</td>
|
<td><keyword :v-word="keyword">{{domain.name}}</keyword></td>
|
||||||
<td>
|
<td>
|
||||||
{{domain.cluster.name}}<link-icon :href="'/ns/clusters/cluster?clusterId=' + domain.cluster.id"></link-icon>
|
{{domain.cluster.name}}<link-icon :href="'/ns/clusters/cluster?clusterId=' + domain.cluster.id"></link-icon>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -1,14 +1,5 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
|
{$template "/datepicker"}
|
||||||
{$var "header"}
|
|
||||||
<!-- datepicker -->
|
|
||||||
<script type="text/javascript" src="/js/moment.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/js/pikaday.js"></script>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
|
||||||
{$end}
|
|
||||||
|
|
||||||
|
|
||||||
{$template "waf_menu"}
|
{$template "waf_menu"}
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tr v-for="server in servers">
|
<tr v-for="server in servers">
|
||||||
<td>{{server.name}}
|
<td><keyword :v-word="keyword">{{server.name}}</keyword>
|
||||||
<div style="margin-top:0.4em">
|
<div style="margin-top:0.4em">
|
||||||
<tiny-basic-label>{{server.serverTypeName}}</tiny-basic-label>
|
<tiny-basic-label>{{server.serverTypeName}}</tiny-basic-label>
|
||||||
</div>
|
</div>
|
||||||
@@ -85,8 +85,8 @@
|
|||||||
<td>{{server.cluster.name}}</td>
|
<td>{{server.cluster.name}}</td>
|
||||||
<td>
|
<td>
|
||||||
<span v-if="server.serverNames.length > 0">
|
<span v-if="server.serverNames.length > 0">
|
||||||
<span v-if="server.serverNames[0].subNames == null || server.serverNames[0].subNames.length == 0">{{server.serverNames[0].name}}</span>
|
<span v-if="server.serverNames[0].subNames == null || server.serverNames[0].subNames.length == 0"><keyword :v-word="keyword">{{server.serverNames[0].name}}</keyword></span>
|
||||||
<span v-else>{{server.serverNames[0].subNames[0]}}</span>
|
<span v-else><keyword :v-word="keyword">{{server.serverNames[0].subNames[0]}}</keyword></span>
|
||||||
<span v-if="server.countServerNames > 1">等{{server.countServerNames}}个域名 <popup-icon :href="'/servers/serverNamesPopup?serverId=' + server.id" height="20em"></popup-icon></span>
|
<span v-if="server.countServerNames > 1">等{{server.countServerNames}}个域名 <popup-icon :href="'/servers/serverNamesPopup?serverId=' + server.id" height="20em"></popup-icon></span>
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="disabled">-</span>
|
<span v-else class="disabled">-</span>
|
||||||
|
|||||||
@@ -1,13 +1,5 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
|
{$template "/datepicker"}
|
||||||
{$var "header"}
|
|
||||||
<!-- datepicker -->
|
|
||||||
<script type="text/javascript" src="/js/moment.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/js/pikaday.js"></script>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.theme.css"/>
|
|
||||||
<link rel="stylesheet" href="/js/pikaday.triangle.css"/>
|
|
||||||
{$end}
|
|
||||||
|
|
||||||
{$template "/left_menu"}
|
{$template "/left_menu"}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
<menu-item href="/settings/authority/nodes">节点列表</menu-item>
|
<menu-item href="/settings/authority/nodes">节点列表</menu-item>
|
||||||
<span class="item">|</span>
|
<span class="item">|</span>
|
||||||
<menu-item :href="'/settings/authority/nodes/node?nodeId=' + node.id" code="index">"{{node.name}}"详情</menu-item>
|
<menu-item :href="'/settings/authority/nodes/node?nodeId=' + node.id" code="index">"{{node.name}}"详情</menu-item>
|
||||||
|
<menu-item :href="'/settings/authority/nodes/node/logs?nodeId=' + node.id" code="log">运行日志</menu-item>
|
||||||
<menu-item :href="'/settings/authority/nodes/node/install?nodeId=' + node.id" code="install">安装节点</menu-item>
|
<menu-item :href="'/settings/authority/nodes/node/install?nodeId=' + node.id" code="install">安装节点</menu-item>
|
||||||
<menu-item :href="'/settings/authority/nodes/node/update?nodeId=' + node.id" code="update">修改节点</menu-item>
|
<menu-item :href="'/settings/authority/nodes/node/update?nodeId=' + node.id" code="update">修改节点</menu-item>
|
||||||
</first-menu>
|
</first-menu>
|
||||||
|
|||||||
50
web/views/@default/settings/authority/nodes/node/logs.html
Normal file
50
web/views/@default/settings/authority/nodes/node/logs.html
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{$layout}
|
||||||
|
{$template "menu"}
|
||||||
|
{$template "/datepicker"}
|
||||||
|
|
||||||
|
<div class="margin"></div>
|
||||||
|
<form method="get" action="/settings/authority/nodes/node/logs" class="ui form" autocomplete="off">
|
||||||
|
<input type="hidden" name="nodeId" :value="nodeId"/>
|
||||||
|
<div class="ui fields inline">
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="dayFrom" placeholder="开始日期" v-model="dayFrom" value="" style="width:8em" id="day-from-picker"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="dayTo" placeholder="结束日期" v-model="dayTo" value="" style="width:8em" id="day-to-picker"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<select class="ui dropdown" name="level" v-model="level">
|
||||||
|
<option value="">[级别]</option>
|
||||||
|
<option value="error">错误</option>
|
||||||
|
<option value="warning">警告</option>
|
||||||
|
<option value="info">信息</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="keyword" style="width:10em" v-model="keyword" placeholder="关键词"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<button type="submit" class="ui button">查询</button>
|
||||||
|
</div>
|
||||||
|
<div class="ui field" v-if="dayFrom.length > 0 || dayTo.length > 0 || keyword.length > 0 || level.length > 0">
|
||||||
|
<a :href="'/settings/authority/nodes/node/logs?nodeId=' + nodeId">[清除条件]</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<p class="comment" v-if="logs.length == 0">暂时还没有日志。</p>
|
||||||
|
|
||||||
|
<table class="ui table selectable" v-if="logs.length > 0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tr v-for="log in logs">
|
||||||
|
<td>
|
||||||
|
<node-log-row :v-log="log" :v-keyword="keyword"></node-log-row>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="page" v-html="page"></div>
|
||||||
6
web/views/@default/settings/authority/nodes/node/logs.js
Normal file
6
web/views/@default/settings/authority/nodes/node/logs.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Tea.context(function () {
|
||||||
|
this.$delay(function () {
|
||||||
|
teaweb.datepicker("day-from-picker")
|
||||||
|
teaweb.datepicker("day-to-picker")
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
<menu-item href="/settings/monitorNodes">节点列表</menu-item>
|
<menu-item href="/settings/monitorNodes">节点列表</menu-item>
|
||||||
<span class="item">|</span>
|
<span class="item">|</span>
|
||||||
<menu-item :href="'/settings/monitorNodes/node?nodeId=' + node.id" code="index">"{{node.name}}"详情</menu-item>
|
<menu-item :href="'/settings/monitorNodes/node?nodeId=' + node.id" code="index">"{{node.name}}"详情</menu-item>
|
||||||
|
<menu-item :href="'/settings/monitorNodes/node/logs?nodeId=' + node.id" code="log">运行日志</menu-item>
|
||||||
<menu-item :href="'/settings/monitorNodes/node/install?nodeId=' + node.id" code="install">安装节点</menu-item>
|
<menu-item :href="'/settings/monitorNodes/node/install?nodeId=' + node.id" code="install">安装节点</menu-item>
|
||||||
<menu-item :href="'/settings/monitorNodes/node/update?nodeId=' + node.id" code="update">修改节点</menu-item>
|
<menu-item :href="'/settings/monitorNodes/node/update?nodeId=' + node.id" code="update">修改节点</menu-item>
|
||||||
</first-menu>
|
</first-menu>
|
||||||
|
|||||||
50
web/views/@default/settings/monitor-nodes/node/logs.html
Normal file
50
web/views/@default/settings/monitor-nodes/node/logs.html
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{$layout}
|
||||||
|
{$template "menu"}
|
||||||
|
{$template "/datepicker"}
|
||||||
|
|
||||||
|
<div class="margin"></div>
|
||||||
|
<form method="get" action="/settings/monitorNodes/node/logs" class="ui form" autocomplete="off">
|
||||||
|
<input type="hidden" name="nodeId" :value="nodeId"/>
|
||||||
|
<div class="ui fields inline">
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="dayFrom" placeholder="开始日期" v-model="dayFrom" value="" style="width:8em" id="day-from-picker"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="dayTo" placeholder="结束日期" v-model="dayTo" value="" style="width:8em" id="day-to-picker"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<select class="ui dropdown" name="level" v-model="level">
|
||||||
|
<option value="">[级别]</option>
|
||||||
|
<option value="error">错误</option>
|
||||||
|
<option value="warning">警告</option>
|
||||||
|
<option value="info">信息</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="keyword" style="width:10em" v-model="keyword" placeholder="关键词"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<button type="submit" class="ui button">查询</button>
|
||||||
|
</div>
|
||||||
|
<div class="ui field" v-if="dayFrom.length > 0 || dayTo.length > 0 || keyword.length > 0 || level.length > 0">
|
||||||
|
<a :href="'/settings/monitorNodes/node/logs?nodeId=' + nodeId">[清除条件]</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<p class="comment" v-if="logs.length == 0">暂时还没有日志。</p>
|
||||||
|
|
||||||
|
<table class="ui table selectable" v-if="logs.length > 0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tr v-for="log in logs">
|
||||||
|
<td>
|
||||||
|
<node-log-row :v-log="log" :v-keyword="keyword"></node-log-row>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="page" v-html="page"></div>
|
||||||
6
web/views/@default/settings/monitor-nodes/node/logs.js
Normal file
6
web/views/@default/settings/monitor-nodes/node/logs.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Tea.context(function () {
|
||||||
|
this.$delay(function () {
|
||||||
|
teaweb.datepicker("day-from-picker")
|
||||||
|
teaweb.datepicker("day-to-picker")
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
<menu-item href="/settings/userNodes">节点列表</menu-item>
|
<menu-item href="/settings/userNodes">节点列表</menu-item>
|
||||||
<span class="item">|</span>
|
<span class="item">|</span>
|
||||||
<menu-item :href="'/settings/userNodes/node?nodeId=' + node.id" code="index">"{{node.name}}"详情</menu-item>
|
<menu-item :href="'/settings/userNodes/node?nodeId=' + node.id" code="index">"{{node.name}}"详情</menu-item>
|
||||||
|
<menu-item :href="'/settings/userNodes/node/logs?nodeId=' + node.id" code="log">运行日志</menu-item>
|
||||||
<menu-item :href="'/settings/userNodes/node/install?nodeId=' + node.id" code="install">安装节点</menu-item>
|
<menu-item :href="'/settings/userNodes/node/install?nodeId=' + node.id" code="install">安装节点</menu-item>
|
||||||
<menu-item :href="'/settings/userNodes/node/update?nodeId=' + node.id" code="update">修改节点</menu-item>
|
<menu-item :href="'/settings/userNodes/node/update?nodeId=' + node.id" code="update">修改节点</menu-item>
|
||||||
</first-menu>
|
</first-menu>
|
||||||
|
|||||||
50
web/views/@default/settings/user-nodes/node/logs.html
Normal file
50
web/views/@default/settings/user-nodes/node/logs.html
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{$layout}
|
||||||
|
{$template "menu"}
|
||||||
|
{$template "/datepicker"}
|
||||||
|
|
||||||
|
<div class="margin"></div>
|
||||||
|
<form method="get" action="/settings/userNodes/node/logs" class="ui form" autocomplete="off">
|
||||||
|
<input type="hidden" name="nodeId" :value="nodeId"/>
|
||||||
|
<div class="ui fields inline">
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="dayFrom" placeholder="开始日期" v-model="dayFrom" value="" style="width:8em" id="day-from-picker"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="dayTo" placeholder="结束日期" v-model="dayTo" value="" style="width:8em" id="day-to-picker"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<select class="ui dropdown" name="level" v-model="level">
|
||||||
|
<option value="">[级别]</option>
|
||||||
|
<option value="error">错误</option>
|
||||||
|
<option value="warning">警告</option>
|
||||||
|
<option value="info">信息</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<input type="text" name="keyword" style="width:10em" v-model="keyword" placeholder="关键词"/>
|
||||||
|
</div>
|
||||||
|
<div class="ui field">
|
||||||
|
<button type="submit" class="ui button">查询</button>
|
||||||
|
</div>
|
||||||
|
<div class="ui field" v-if="dayFrom.length > 0 || dayTo.length > 0 || keyword.length > 0 || level.length > 0">
|
||||||
|
<a :href="'/settings/userNodes/node/logs?nodeId=' + nodeId">[清除条件]</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<p class="comment" v-if="logs.length == 0">暂时还没有日志。</p>
|
||||||
|
|
||||||
|
<table class="ui table selectable" v-if="logs.length > 0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tr v-for="log in logs">
|
||||||
|
<td>
|
||||||
|
<node-log-row :v-log="log" :v-keyword="keyword"></node-log-row>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="page" v-html="page"></div>
|
||||||
6
web/views/@default/settings/user-nodes/node/logs.js
Normal file
6
web/views/@default/settings/user-nodes/node/logs.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Tea.context(function () {
|
||||||
|
this.$delay(function () {
|
||||||
|
teaweb.datepicker("day-from-picker")
|
||||||
|
teaweb.datepicker("day-to-picker")
|
||||||
|
})
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user