mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 21:50:28 +08:00 
			
		
		
		
	浏览访问日志时自动用点符号标记有数据的分表
This commit is contained in:
		
							
								
								
									
										67
									
								
								internal/web/actions/default/servers/logs/hasLogs.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								internal/web/actions/default/servers/logs/hasLogs.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package logs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						timeutil "github.com/iwind/TeaGo/utils/time"
 | 
				
			||||||
 | 
						"regexp"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasLogsAction 检查某个分区是否有日志
 | 
				
			||||||
 | 
					type HasLogsAction struct {
 | 
				
			||||||
 | 
						actionutils.ParentAction
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *HasLogsAction) RunPost(params struct {
 | 
				
			||||||
 | 
						ClusterId int64
 | 
				
			||||||
 | 
						NodeId    int64
 | 
				
			||||||
 | 
						Day       string
 | 
				
			||||||
 | 
						Hour      string
 | 
				
			||||||
 | 
						Keyword   string
 | 
				
			||||||
 | 
						Ip        string
 | 
				
			||||||
 | 
						Domain    string
 | 
				
			||||||
 | 
						HasError  int
 | 
				
			||||||
 | 
						HasWAF    int
 | 
				
			||||||
 | 
						Partition int32 `default:"-1"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RequestId string
 | 
				
			||||||
 | 
						ServerId  int64
 | 
				
			||||||
 | 
					}) {
 | 
				
			||||||
 | 
						if len(params.Day) == 0 {
 | 
				
			||||||
 | 
							params.Day = timeutil.Format("Y-m-d")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var day = params.Day
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(day) > 0 && regexp.MustCompile(`\d{4}-\d{2}-\d{2}`).MatchString(day) {
 | 
				
			||||||
 | 
							day = strings.ReplaceAll(day, "-", "")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp, err := this.RPC().HTTPAccessLogRPC().ListHTTPAccessLogs(this.AdminContext(), &pb.ListHTTPAccessLogsRequest{
 | 
				
			||||||
 | 
							Partition:         params.Partition,
 | 
				
			||||||
 | 
							RequestId:         params.RequestId,
 | 
				
			||||||
 | 
							NodeClusterId:     params.ClusterId,
 | 
				
			||||||
 | 
							NodeId:            params.NodeId,
 | 
				
			||||||
 | 
							ServerId:          params.ServerId,
 | 
				
			||||||
 | 
							HasError:          params.HasError > 0,
 | 
				
			||||||
 | 
							HasFirewallPolicy: params.HasWAF > 0,
 | 
				
			||||||
 | 
							Day:               day,
 | 
				
			||||||
 | 
							HourFrom:          params.Hour,
 | 
				
			||||||
 | 
							HourTo:            params.Hour,
 | 
				
			||||||
 | 
							Keyword:           params.Keyword,
 | 
				
			||||||
 | 
							Ip:                params.Ip,
 | 
				
			||||||
 | 
							Domain:            params.Domain,
 | 
				
			||||||
 | 
							Size:              1,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Data["hasLogs"] = len(resp.HttpAccessLogs) > 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Success()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -18,6 +18,7 @@ func init() {
 | 
				
			|||||||
			Get("", new(IndexAction)).
 | 
								Get("", new(IndexAction)).
 | 
				
			||||||
			GetPost("/settings", new(SettingsAction)).
 | 
								GetPost("/settings", new(SettingsAction)).
 | 
				
			||||||
			Post("/partitionData", new(PartitionDataAction)).
 | 
								Post("/partitionData", new(PartitionDataAction)).
 | 
				
			||||||
 | 
								Post("/hasLogs", new(HasLogsAction)).
 | 
				
			||||||
			EndAll()
 | 
								EndAll()
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								web/public/js/components/common/dot.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								web/public/js/components/common/dot.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					Vue.component("dot", {
 | 
				
			||||||
 | 
						template: '<span style="display: inline-block; padding-bottom: 3px"><i class="icon circle tiny"></i></span>'
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
Vue.component("http-access-log-partitions-box", {
 | 
					Vue.component("http-access-log-partitions-box", {
 | 
				
			||||||
	props: ["v-partition", "v-day"],
 | 
						props: ["v-partition", "v-day", "v-query"],
 | 
				
			||||||
	mounted: function () {
 | 
						mounted: function () {
 | 
				
			||||||
		let that = this
 | 
							let that = this
 | 
				
			||||||
		Tea.action("/servers/logs/partitionData")
 | 
							Tea.action("/servers/logs/partitionData")
 | 
				
			||||||
@@ -11,13 +11,18 @@ Vue.component("http-access-log-partitions-box", {
 | 
				
			|||||||
				resp.data.partitions.reverse().forEach(function (v) {
 | 
									resp.data.partitions.reverse().forEach(function (v) {
 | 
				
			||||||
					that.partitions.push({
 | 
										that.partitions.push({
 | 
				
			||||||
						code: v,
 | 
											code: v,
 | 
				
			||||||
						isDisabled: false
 | 
											isDisabled: false,
 | 
				
			||||||
 | 
											hasLogs: false
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
				if (that.partitions.length > 0) {
 | 
									if (that.partitions.length > 0) {
 | 
				
			||||||
					if (that.vPartition == null || that.vPartition < 0) {
 | 
										if (that.vPartition == null || that.vPartition < 0) {
 | 
				
			||||||
						that.selectedPartition = that.partitions[0].code
 | 
											that.selectedPartition = that.partitions[0].code
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (that.partitions.length > 1) {
 | 
				
			||||||
 | 
											that.checkLogs()
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			.post()
 | 
								.post()
 | 
				
			||||||
@@ -25,7 +30,8 @@ Vue.component("http-access-log-partitions-box", {
 | 
				
			|||||||
	data: function () {
 | 
						data: function () {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			partitions: [],
 | 
								partitions: [],
 | 
				
			||||||
			selectedPartition: this.vPartition
 | 
								selectedPartition: this.vPartition,
 | 
				
			||||||
 | 
								checkingPartition: 0
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
@@ -48,12 +54,43 @@ Vue.component("http-access-log-partitions-box", {
 | 
				
			|||||||
					p.isDisabled = true
 | 
										p.isDisabled = true
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							checkLogs: function () {
 | 
				
			||||||
 | 
								let that = this
 | 
				
			||||||
 | 
								let index = this.checkingPartition
 | 
				
			||||||
 | 
								let params = {
 | 
				
			||||||
 | 
									partition: index
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								let query = this.vQuery
 | 
				
			||||||
 | 
								if (query == null || query.length == 0) {
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								query.split("&").forEach(function (v) {
 | 
				
			||||||
 | 
									let param = v.split("=")
 | 
				
			||||||
 | 
									params[param[0]] = decodeURIComponent(param[1])
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
								Tea.action("/servers/logs/hasLogs")
 | 
				
			||||||
 | 
									.params(params)
 | 
				
			||||||
 | 
									.post()
 | 
				
			||||||
 | 
									.success(function (response) {
 | 
				
			||||||
 | 
										if (response.data.hasLogs) {
 | 
				
			||||||
 | 
											// 因为是倒序,所以这里需要使用总长度减去index
 | 
				
			||||||
 | 
											that.partitions[that.partitions.length - 1 - index].hasLogs = true
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										index++
 | 
				
			||||||
 | 
										if (index >= that.partitions.length) {
 | 
				
			||||||
 | 
											return
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										that.checkingPartition = index
 | 
				
			||||||
 | 
										that.checkLogs()
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	template: `<div v-if="partitions.length > 1">
 | 
						template: `<div v-if="partitions.length > 1">
 | 
				
			||||||
	<div class="ui divider" style="margin-bottom: 0"></div>
 | 
						<div class="ui divider" style="margin-bottom: 0"></div>
 | 
				
			||||||
	<div class="ui menu text small blue" style="margin-bottom: 0; margin-top: 0">
 | 
						<div class="ui menu text small blue" style="margin-bottom: 0; margin-top: 0">
 | 
				
			||||||
		<a v-for="(p, index) in partitions" :href="url(p.code)" class="item" :class="{active: selectedPartition == p.code, disabled: p.isDisabled}">分表{{p.code+1}}     <span class="disabled" v-if="index != partitions.length - 1">|</span></a>
 | 
							<a v-for="(p, index) in partitions" :href="url(p.code)" class="item" :class="{active: selectedPartition == p.code, disabled: p.isDisabled}">分表{{p.code+1}} <span v-if="p.hasLogs">  <dot></dot></span>     <span class="disabled" v-if="index != partitions.length - 1">|</span></a>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	<div class="ui divider" style="margin-top: 0"></div>
 | 
						<div class="ui divider" style="margin-top: 0"></div>
 | 
				
			||||||
</div>`
 | 
					</div>`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,9 +2,9 @@
 | 
				
			|||||||
{$template "/datepicker"}
 | 
					{$template "/datepicker"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<first-menu>
 | 
					<first-menu>
 | 
				
			||||||
    <menu-item :href="path + '?clusterId=' + clusterId + '&nodeId=' + nodeId + '&serverId=' + serverId + '&day=' + day + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize" :active="hasError == 0 && hasWAF == 0">所有日志</menu-item>
 | 
					    <menu-item :href="path + '?' + query('')" :active="hasError == 0 && hasWAF == 0">所有日志</menu-item>
 | 
				
			||||||
    <menu-item :href="path + '?clusterId=' + clusterId + '&nodeId=' + nodeId + '&serverId=' + serverId + '&day=' + day + '&hasError=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize" :active="hasError > 0">错误日志</menu-item>
 | 
					    <menu-item :href="path + '?' + query('hasError=1')" :active="hasError > 0">错误日志</menu-item>
 | 
				
			||||||
    <menu-item :href="path + '?clusterId=' + clusterId + '&nodeId=' + nodeId + '&serverId=' + serverId + '&day=' + day + '&hasWAF=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize" :active="hasWAF > 0">WAF日志</menu-item>
 | 
					    <menu-item :href="path + '?' + query('hasWAF=1')" :active="hasWAF > 0">WAF日志</menu-item>
 | 
				
			||||||
    <span class="item disabled">|</span>
 | 
					    <span class="item disabled">|</span>
 | 
				
			||||||
    <menu-item :href="'/servers/logs/settings'" code="settings">设置</menu-item>
 | 
					    <menu-item :href="'/servers/logs/settings'" code="settings">设置</menu-item>
 | 
				
			||||||
</first-menu>
 | 
					</first-menu>
 | 
				
			||||||
@@ -29,7 +29,7 @@
 | 
				
			|||||||
    </http-access-log-search-box>
 | 
					    </http-access-log-search-box>
 | 
				
			||||||
</form>
 | 
					</form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<http-access-log-partitions-box :v-partition="partition" :v-day="day"></http-access-log-partitions-box>
 | 
					<http-access-log-partitions-box :v-partition="partition" :v-day="day" :v-query="currentQuery"></http-access-log-partitions-box>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<warning-message v-if="isSlowQuery">看起来你的访问日志查询非常慢({{slowQueryCost}}s),建议<span v-if="domain.length == 0"> 1)指定具体域名查询;2)</span>通过添加新的 <a href="/db">[日志节点]</a> 来分散存储访问日志。</warning-message>
 | 
					<warning-message v-if="isSlowQuery">看起来你的访问日志查询非常慢({{slowQueryCost}}s),建议<span v-if="domain.length == 0"> 1)指定具体域名查询;2)</span>通过添加新的 <a href="/db">[日志节点]</a> 来分散存储访问日志。</warning-message>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -43,10 +43,10 @@
 | 
				
			|||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div v-if="accessLogs.length > 0">
 | 
					<div v-if="accessLogs.length > 0">
 | 
				
			||||||
    <a :href="path + '?clusterId=' + clusterId + '&nodeId=' + nodeId + '&serverId=' + serverId + '&requestId=' + lastRequestId + '&day=' + day + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize + '&partition=' + partition" v-if="hasPrev">上一页</a>
 | 
					    <a :href="path + '?' + query('requestId=' + lastRequestId + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&partition=' + partition)" v-if="hasPrev">上一页</a>
 | 
				
			||||||
    <span v-else class="disabled">上一页</span>
 | 
					    <span v-else class="disabled">上一页</span>
 | 
				
			||||||
    <span class="disabled">  |  </span>
 | 
					    <span class="disabled">  |  </span>
 | 
				
			||||||
    <a :href="path + '?clusterId=' + clusterId + '&nodeId=' + nodeId + '&serverId=' + serverId + '&requestId=' + nextRequestId + '&day=' + day + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize + '&partition=' + partition" v-if="hasMore">下一页</a>
 | 
					    <a :href="path + '?' + query('requestId=' + nextRequestId + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&partition=' + partition)" v-if="hasMore">下一页</a>
 | 
				
			||||||
    <span v-else class="disabled">下一页</span>
 | 
					    <span v-else class="disabled">下一页</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <page-size-selector></page-size-selector>
 | 
					    <page-size-selector></page-size-selector>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,4 +19,60 @@ Tea.context(function () {
 | 
				
			|||||||
			accessLog.wafInfo = null
 | 
								accessLog.wafInfo = null
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.query = function (args) {
 | 
				
			||||||
 | 
							// 初始化时页面尚未设置Vue变量,所以使用全局的变量获取
 | 
				
			||||||
 | 
							let that = TEA.ACTION.data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (that.clusterId == null) {
 | 
				
			||||||
 | 
								that.clusterId = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.nodeId == null) {
 | 
				
			||||||
 | 
								that.nodeId = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.serverId == null) {
 | 
				
			||||||
 | 
								that.serverId = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.day == null) {
 | 
				
			||||||
 | 
								that.day = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.keyword == null) {
 | 
				
			||||||
 | 
								that.keyword = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.ip == null) {
 | 
				
			||||||
 | 
								that.ip = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.domain == null) {
 | 
				
			||||||
 | 
								that.domain = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.hour == null) {
 | 
				
			||||||
 | 
								that.hour = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.pageSize == null) {
 | 
				
			||||||
 | 
								that.pageSize = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							let query = 'clusterId=' + that.clusterId + '&nodeId=' + that.nodeId + '&serverId=' + that.serverId + '&day=' + that.day + '&keyword=' + encodeURIComponent(that.keyword) + '&ip=' + that.ip + '&domain=' + that.domain + '&hour=' + that.hour + '&pageSize=' + that.pageSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (args != null && args.length > 0) {
 | 
				
			||||||
 | 
								query += "&" + args
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return query
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.allQuery = function () {
 | 
				
			||||||
 | 
							if (this.query == null) {
 | 
				
			||||||
 | 
								// 尚未初始化完成
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							let query = this.query()
 | 
				
			||||||
 | 
							if (this.hasError == 1) {
 | 
				
			||||||
 | 
								query += "&hasError=1"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (this.hasWAF == 1) {
 | 
				
			||||||
 | 
								query += "&hasWAF=1"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return query
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.currentQuery = this.allQuery()
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
@@ -15,9 +15,9 @@
 | 
				
			|||||||
{$template "/left_menu_with_menu"}
 | 
					{$template "/left_menu_with_menu"}
 | 
				
			||||||
<div class="right-box with-menu">
 | 
					<div class="right-box with-menu">
 | 
				
			||||||
	<first-menu>
 | 
						<first-menu>
 | 
				
			||||||
		<menu-item :href="path + '?serverId=' + serverId + '&day=' + day + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize" :active="hasError == 0 && hasWAF == 0">所有日志</menu-item>
 | 
							<menu-item :href="path + '?' + query()" :active="hasError == 0 && hasWAF == 0">所有日志</menu-item>
 | 
				
			||||||
		<menu-item :href="path + '?serverId=' + serverId + '&day=' + day + '&hasError=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize" :active="hasError > 0">错误日志</menu-item>
 | 
							<menu-item :href="path + '?' + query('hasError=1')" :active="hasError > 0">错误日志</menu-item>
 | 
				
			||||||
        <menu-item :href="path + '?serverId=' + serverId + '&day=' + day + '&hasWAF=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize" :active="hasWAF > 0">WAF日志</menu-item>
 | 
					        <menu-item :href="path + '?' + query('hasWAF=1')" :active="hasWAF > 0">WAF日志</menu-item>
 | 
				
			||||||
	</first-menu>
 | 
						</first-menu>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <form method="get" class="ui form small" :action="path">
 | 
					    <form method="get" class="ui form small" :action="path">
 | 
				
			||||||
@@ -38,7 +38,7 @@
 | 
				
			|||||||
    </form>
 | 
					    </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <!-- 分区 -->
 | 
					    <!-- 分区 -->
 | 
				
			||||||
    <http-access-log-partitions-box :v-day="day" :v-partition="partition"></http-access-log-partitions-box>
 | 
					    <http-access-log-partitions-box :v-day="day" :v-partition="partition" :v-query="currentQuery"></http-access-log-partitions-box>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<p class="comment" v-if="accessLogs.length == 0">暂时还没有访问日志。</p>
 | 
						<p class="comment" v-if="accessLogs.length == 0">暂时还没有访问日志。</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,10 +50,10 @@
 | 
				
			|||||||
	</table>
 | 
						</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<div v-if="accessLogs.length > 0">
 | 
						<div v-if="accessLogs.length > 0">
 | 
				
			||||||
		<a :href="path + '?serverId=' + serverId + '&requestId=' + lastRequestId + '&day=' + day + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize + '&partition=' + partition" v-if="hasPrev">上一页</a>
 | 
							<a :href="path + '?' + query('requestId=' + lastRequestId + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&partition=' + partition)" v-if="hasPrev">上一页</a>
 | 
				
			||||||
		<span v-else class="disabled">上一页</span>
 | 
							<span v-else class="disabled">上一页</span>
 | 
				
			||||||
		<span class="disabled">  |  </span>
 | 
							<span class="disabled">  |  </span>
 | 
				
			||||||
		<a :href="path + '?serverId=' + serverId + '&requestId=' + nextRequestId + '&day=' + day + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&hour=' + hour + '&pageSize=' + pageSize + '&partition=' + partition" v-if="hasMore">下一页</a>
 | 
							<a :href="path + '?' + query('requestId=' + nextRequestId + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&partition=' + partition)" v-if="hasMore">下一页</a>
 | 
				
			||||||
		<span v-else class="disabled">下一页</span>
 | 
							<span v-else class="disabled">下一页</span>
 | 
				
			||||||
        <page-size-selector></page-size-selector>
 | 
					        <page-size-selector></page-size-selector>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +1,71 @@
 | 
				
			|||||||
Tea.context(function () {
 | 
					Tea.context(function () {
 | 
				
			||||||
    this.$delay(function () {
 | 
						this.$delay(function () {
 | 
				
			||||||
        let that = this
 | 
							let that = this
 | 
				
			||||||
        teaweb.datepicker("day-input", function (day) {
 | 
							teaweb.datepicker("day-input", function (day) {
 | 
				
			||||||
            that.day = day
 | 
								that.day = day
 | 
				
			||||||
        })
 | 
							})
 | 
				
			||||||
    })
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let that = this
 | 
						let that = this
 | 
				
			||||||
    this.accessLogs.forEach(function (accessLog) {
 | 
						this.accessLogs.forEach(function (accessLog) {
 | 
				
			||||||
        if (typeof (that.regions[accessLog.remoteAddr]) == "string") {
 | 
							if (typeof (that.regions[accessLog.remoteAddr]) == "string") {
 | 
				
			||||||
            accessLog.region = that.regions[accessLog.remoteAddr]
 | 
								accessLog.region = that.regions[accessLog.remoteAddr]
 | 
				
			||||||
        } else {
 | 
							} else {
 | 
				
			||||||
            accessLog.region = ""
 | 
								accessLog.region = ""
 | 
				
			||||||
        }
 | 
							}
 | 
				
			||||||
		if (accessLog.firewallRuleSetId > 0 && typeof (that.wafInfos[accessLog.firewallRuleSetId]) == "object") {
 | 
							if (accessLog.firewallRuleSetId > 0 && typeof (that.wafInfos[accessLog.firewallRuleSetId]) == "object") {
 | 
				
			||||||
			accessLog.wafInfo = that.wafInfos[accessLog.firewallRuleSetId]
 | 
								accessLog.wafInfo = that.wafInfos[accessLog.firewallRuleSetId]
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			accessLog.wafInfo = null
 | 
								accessLog.wafInfo = null
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
    })
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.query = function (args) {
 | 
				
			||||||
 | 
							// 初始化时页面尚未设置Vue变量,所以使用全局的变量获取
 | 
				
			||||||
 | 
							let that = TEA.ACTION.data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (that.serverId == null) {
 | 
				
			||||||
 | 
								that.serverId = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.keyword == null) {
 | 
				
			||||||
 | 
								that.keyword = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.ip == null) {
 | 
				
			||||||
 | 
								that.ip = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.domain == null) {
 | 
				
			||||||
 | 
								that.domain = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.pageSize == null) {
 | 
				
			||||||
 | 
								that.pageSize = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.day == null) {
 | 
				
			||||||
 | 
								that.day = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.hour == null) {
 | 
				
			||||||
 | 
								that.hour = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							let query = 'serverId=' + that.serverId + '&day=' + that.day + '&keyword=' + encodeURIComponent(that.keyword) + '&ip=' + that.ip + '&domain=' + that.domain + '&hour=' + that.hour + '&pageSize=' + that.pageSize
 | 
				
			||||||
 | 
							if (args != null && args.length > 0) {
 | 
				
			||||||
 | 
								query += "&" + args
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return query
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.allQuery = function () {
 | 
				
			||||||
 | 
							if (this.query == null) {
 | 
				
			||||||
 | 
								// 尚未初始化完成
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							let query = this.query()
 | 
				
			||||||
 | 
							if (this.hasError == 1) {
 | 
				
			||||||
 | 
								query += "&hasError=1"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (this.hasWAF == 1) {
 | 
				
			||||||
 | 
								query += "&hasWAF=1"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return query
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.currentQuery = this.allQuery()
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
@@ -13,9 +13,9 @@
 | 
				
			|||||||
{$template "/left_menu_with_menu"}
 | 
					{$template "/left_menu_with_menu"}
 | 
				
			||||||
<div class="right-box with-menu">
 | 
					<div class="right-box with-menu">
 | 
				
			||||||
	<first-menu>
 | 
						<first-menu>
 | 
				
			||||||
		<menu-item :href="path + '?serverId=' + serverId + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&pageSize=' + pageSize" :active="hasError == 0 && hasWAF == 0">所有日志</menu-item>
 | 
							<menu-item :href="path + '?' + query()" :active="hasError == 0 && hasWAF == 0">所有日志</menu-item>
 | 
				
			||||||
		<menu-item :href="path + '?serverId=' + serverId + '&hasError=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&pageSize=' + pageSize" :active="hasError > 0">错误日志</menu-item>
 | 
							<menu-item :href="path + '?' + query('hasError=1')" :active="hasError > 0">错误日志</menu-item>
 | 
				
			||||||
        <menu-item :href="path + '?serverId=' + serverId + '&hasWAF=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&pageSize=' + pageSize" :active="hasWAF > 0">WAF日志</menu-item>
 | 
					        <menu-item :href="path + '?' + query('hasWAF=1')" :active="hasWAF > 0">WAF日志</menu-item>
 | 
				
			||||||
	</first-menu>
 | 
						</first-menu>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <form method="get" class="ui form small" :action="path">
 | 
					    <form method="get" class="ui form small" :action="path">
 | 
				
			||||||
@@ -26,7 +26,7 @@
 | 
				
			|||||||
    </form>
 | 
					    </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <!-- 分区 -->
 | 
					    <!-- 分区 -->
 | 
				
			||||||
    <http-access-log-partitions-box :v-day="day" :v-partition="partition"></http-access-log-partitions-box>
 | 
					    <http-access-log-partitions-box :v-day="day" :v-partition="partition" :v-query="currentQuery"></http-access-log-partitions-box>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<p class="comment" v-if="accessLogs.length == 0">今天暂时还没有访问日志。</p>
 | 
						<p class="comment" v-if="accessLogs.length == 0">今天暂时还没有访问日志。</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -38,10 +38,10 @@
 | 
				
			|||||||
	</table>
 | 
						</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<div v-if="accessLogs.length > 0">
 | 
						<div v-if="accessLogs.length > 0">
 | 
				
			||||||
		<a :href="path + '?serverId=' + serverId + '&requestId=' + lastRequestId + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&pageSize=' + pageSize + '&partition=' + partition" v-if="hasPrev">上一页</a>
 | 
							<a :href="path + '?' + query('requestId=' + lastRequestId + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&partition=' + partition)" v-if="hasPrev">上一页</a>
 | 
				
			||||||
		<span v-else class="disabled">上一页</span>
 | 
							<span v-else class="disabled">上一页</span>
 | 
				
			||||||
		<span class="disabled">  |  </span>
 | 
							<span class="disabled">  |  </span>
 | 
				
			||||||
		<a :href="path + '?serverId=' + serverId + '&requestId=' + nextRequestId + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain + '&pageSize=' + pageSize + '&partition=' + partition" v-if="hasMore">下一页</a>
 | 
							<a :href="path + '?' + query('&requestId=' + nextRequestId + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&partition=' + partition)" v-if="hasMore">下一页</a>
 | 
				
			||||||
		<span v-else class="disabled">下一页</span>
 | 
							<span v-else class="disabled">下一页</span>
 | 
				
			||||||
        <page-size-selector></page-size-selector>
 | 
					        <page-size-selector></page-size-selector>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,4 +12,47 @@ Tea.context(function () {
 | 
				
			|||||||
			accessLog.wafInfo = null
 | 
								accessLog.wafInfo = null
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.query = function (args) {
 | 
				
			||||||
 | 
							// 初始化时页面尚未设置Vue变量,所以使用全局的变量获取
 | 
				
			||||||
 | 
							let that = TEA.ACTION.data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (that.serverId == null) {
 | 
				
			||||||
 | 
								that.serverId = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.keyword == null) {
 | 
				
			||||||
 | 
								that.keyword = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.ip == null) {
 | 
				
			||||||
 | 
								that.ip = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.domain == null) {
 | 
				
			||||||
 | 
								that.domain = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (that.pageSize == null) {
 | 
				
			||||||
 | 
								that.pageSize = ""
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							let query = 'serverId=' + that.serverId + '&keyword=' + encodeURIComponent(that.keyword) + '&ip=' + that.ip + '&domain=' + that.domain + '&pageSize=' + that.pageSize
 | 
				
			||||||
 | 
							if (args != null && args.length > 0) {
 | 
				
			||||||
 | 
								query += "&" + args
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return query
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.allQuery = function () {
 | 
				
			||||||
 | 
							if (this.query == null) {
 | 
				
			||||||
 | 
								// 尚未初始化完成
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							let query = this.query()
 | 
				
			||||||
 | 
							if (this.hasError == 1) {
 | 
				
			||||||
 | 
								query += "&hasError=1"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (this.hasWAF == 1) {
 | 
				
			||||||
 | 
								query += "&hasWAF=1"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return query
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.currentQuery = this.allQuery()
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
		Reference in New Issue
	
	Block a user