mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 13:10:26 +08:00 
			
		
		
		
	实现UA名单功能
This commit is contained in:
		@@ -109,6 +109,12 @@ func (this *LocationHelper) createMenus(serverIdString string, locationIdString
 | 
			
		||||
		"isActive": secondMenuItem == "referer",
 | 
			
		||||
		"isOn":     locationConfig.Web != nil && locationConfig.Web.Referers != nil && locationConfig.Web.Referers.IsPrior,
 | 
			
		||||
	})
 | 
			
		||||
	menuItems = append(menuItems, maps.Map{
 | 
			
		||||
		"name":     "UA名单",
 | 
			
		||||
		"url":      "/servers/server/settings/locations/userAgent?serverId=" + serverIdString + "&locationId=" + locationIdString,
 | 
			
		||||
		"isActive": secondMenuItem == "userAgent",
 | 
			
		||||
		"isOn":     locationConfig.Web != nil && locationConfig.Web.UserAgent != nil && locationConfig.Web.UserAgent.IsPrior,
 | 
			
		||||
	})
 | 
			
		||||
	menuItems = append(menuItems, maps.Map{
 | 
			
		||||
		"name":     "字符编码",
 | 
			
		||||
		"url":      "/servers/server/settings/locations/charset?serverId=" + serverIdString + "&locationId=" + locationIdString,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package uam
 | 
			
		||||
package referers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package uam
 | 
			
		||||
package referers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,62 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package useragent
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.Nav("", "setting", "index")
 | 
			
		||||
	this.SecondMenu("userAgent")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	LocationId int64
 | 
			
		||||
}) {
 | 
			
		||||
	webConfig, err := dao.SharedHTTPWebDAO.FindWebConfigWithLocationId(this.AdminContext(), params.LocationId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["webId"] = webConfig.Id
 | 
			
		||||
 | 
			
		||||
	var userAgentConfig = webConfig.UserAgent
 | 
			
		||||
	if userAgentConfig == nil {
 | 
			
		||||
		userAgentConfig = serverconfigs.NewUserAgentConfig()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["userAgentConfig"] = userAgentConfig
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunPost(params struct {
 | 
			
		||||
	WebId         int64
 | 
			
		||||
	UserAgentJSON []byte
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("修改Web %d User-Agent设置", params.WebId)
 | 
			
		||||
 | 
			
		||||
	_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebUserAgent(this.AdminContext(), &pb.UpdateHTTPWebUserAgentRequest{
 | 
			
		||||
		HttpWebId:     params.WebId,
 | 
			
		||||
		UserAgentJSON: params.UserAgentJSON,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,22 @@
 | 
			
		||||
package useragent
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/locationutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)).
 | 
			
		||||
			Helper(locationutils.NewLocationHelper()).
 | 
			
		||||
			Helper(serverutils.NewServerHelper()).
 | 
			
		||||
			Data("tinyMenuItem", "userAgent").
 | 
			
		||||
			Prefix("/servers/server/settings/locations/userAgent").
 | 
			
		||||
			GetPost("", new(IndexAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package uam
 | 
			
		||||
package referers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package uam
 | 
			
		||||
package referers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,64 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package useragent
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.Nav("", "setting", "index")
 | 
			
		||||
	this.SecondMenu("userAgent")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	ServerId int64
 | 
			
		||||
}) {
 | 
			
		||||
	this.Data["serverId"] = params.ServerId
 | 
			
		||||
 | 
			
		||||
	webConfig, err := dao.SharedHTTPWebDAO.FindWebConfigWithServerId(this.AdminContext(), params.ServerId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["webId"] = webConfig.Id
 | 
			
		||||
 | 
			
		||||
	var userAgentConfig = webConfig.UserAgent
 | 
			
		||||
	if userAgentConfig == nil {
 | 
			
		||||
		userAgentConfig = serverconfigs.NewUserAgentConfig()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["userAgentConfig"] = userAgentConfig
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunPost(params struct {
 | 
			
		||||
	WebId         int64
 | 
			
		||||
	UserAgentJSON []byte
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("修改Web %d User-Agent设置", params.WebId)
 | 
			
		||||
 | 
			
		||||
	_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebUserAgent(this.AdminContext(), &pb.UpdateHTTPWebUserAgentRequest{
 | 
			
		||||
		HttpWebId:     params.WebId,
 | 
			
		||||
		UserAgentJSON: params.UserAgentJSON,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
package useragent
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)).
 | 
			
		||||
			Helper(serverutils.NewServerHelper()).
 | 
			
		||||
			Prefix("/servers/server/settings/userAgent").
 | 
			
		||||
			GetPost("", new(IndexAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -315,6 +315,12 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri
 | 
			
		||||
			"isActive": secondMenuItem == "referer",
 | 
			
		||||
			"isOn":     serverConfig.Web != nil && serverConfig.Web.Referers != nil && serverConfig.Web.Referers.IsOn,
 | 
			
		||||
		})
 | 
			
		||||
		menuItems = append(menuItems, maps.Map{
 | 
			
		||||
			"name":     "UA名单",
 | 
			
		||||
			"url":      "/servers/server/settings/userAgent?serverId=" + serverIdString,
 | 
			
		||||
			"isActive": secondMenuItem == "userAgent",
 | 
			
		||||
			"isOn":     serverConfig.Web != nil && serverConfig.Web.UserAgent != nil && serverConfig.Web.UserAgent.IsOn,
 | 
			
		||||
		})
 | 
			
		||||
		menuItems = append(menuItems, maps.Map{
 | 
			
		||||
			"name":     "字符编码",
 | 
			
		||||
			"url":      "/servers/server/settings/charset?serverId=" + serverIdString,
 | 
			
		||||
 
 | 
			
		||||
@@ -84,6 +84,7 @@ import (
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/reverseProxy"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/rewrite"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/stat"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/userAgent"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/waf"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/web"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/webp"
 | 
			
		||||
@@ -102,6 +103,7 @@ import (
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/tls"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/udp"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/unix"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/useragent"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/waf"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/web"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/webp"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
Vue.component("values-box", {
 | 
			
		||||
	props: ["values", "v-values", "size", "maxlength", "name", "placeholder"],
 | 
			
		||||
	props: ["values", "v-values", "size", "maxlength", "name", "placeholder", "v-allow-empty"],
 | 
			
		||||
	data: function () {
 | 
			
		||||
		let values = this.values;
 | 
			
		||||
		if (values == null) {
 | 
			
		||||
@@ -39,7 +39,9 @@ Vue.component("values-box", {
 | 
			
		||||
		},
 | 
			
		||||
		confirm: function () {
 | 
			
		||||
			if (this.value.length == 0) {
 | 
			
		||||
				return
 | 
			
		||||
				if (typeof(this.vAllowEmpty) != "boolean" || !this.vAllowEmpty) {
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (this.isUpdating) {
 | 
			
		||||
@@ -75,12 +77,17 @@ Vue.component("values-box", {
 | 
			
		||||
	},
 | 
			
		||||
	template: `<div>
 | 
			
		||||
	<div v-show="!isEditing && realValues.length > 0">
 | 
			
		||||
		<div class="ui label tiny basic" v-for="(value, index) in realValues" style="margin-top:0.4em;margin-bottom:0.4em">{{value}}</div>
 | 
			
		||||
		<div class="ui label tiny basic" v-for="(value, index) in realValues" style="margin-top:0.4em;margin-bottom:0.4em">
 | 
			
		||||
			<span v-if="value.length > 0">{{value}}</span>
 | 
			
		||||
			<span v-if="value.length == 0" class="disabled">[空]</span>
 | 
			
		||||
		</div>
 | 
			
		||||
		<a href="" @click.prevent="startEditing" style="font-size: 0.8em; margin-left: 0.2em">[修改]</a>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div v-show="isEditing || realValues.length == 0">
 | 
			
		||||
		<div style="margin-bottom: 1em" v-if="realValues.length > 0">
 | 
			
		||||
			<div class="ui label tiny basic" v-for="(value, index) in realValues" style="margin-top:0.4em;margin-bottom:0.4em">{{value}}
 | 
			
		||||
			<div class="ui label tiny basic" v-for="(value, index) in realValues" style="margin-top:0.4em;margin-bottom:0.4em">
 | 
			
		||||
				<span v-if="value.length > 0">{{value}}</span>
 | 
			
		||||
				<span v-if="value.length == 0" class="disabled">[空]</span>
 | 
			
		||||
				<input type="hidden" :name="name" :value="value"/>
 | 
			
		||||
				  <a href="" @click.prevent="update(index)" title="修改"><i class="icon pencil small" ></i></a> 
 | 
			
		||||
				<a href="" @click.prevent="remove(index)" title="删除"><i class="icon remove"></i></a> 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										142
									
								
								web/public/js/components/server/user-agent-config-box.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								web/public/js/components/server/user-agent-config-box.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
Vue.component("user-agent-config-box", {
 | 
			
		||||
	props: ["v-is-location", "v-is-group", "value"],
 | 
			
		||||
	data: function () {
 | 
			
		||||
		let config = this.value
 | 
			
		||||
		if (config == null) {
 | 
			
		||||
			config = {
 | 
			
		||||
				isPrior: false,
 | 
			
		||||
				isOn: false,
 | 
			
		||||
				filters: []
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (config.filters == null) {
 | 
			
		||||
			config.filters = []
 | 
			
		||||
		}
 | 
			
		||||
		return {
 | 
			
		||||
			config: config,
 | 
			
		||||
			isAdding: false,
 | 
			
		||||
			addingFilter: {
 | 
			
		||||
				keywords: [],
 | 
			
		||||
				action: "deny"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		isOn: function () {
 | 
			
		||||
			return ((!this.vIsLocation && !this.vIsGroup) || this.config.isPrior) && this.config.isOn
 | 
			
		||||
		},
 | 
			
		||||
		remove: function (index) {
 | 
			
		||||
			let that = this
 | 
			
		||||
			teaweb.confirm("确定要删除此名单吗?", function () {
 | 
			
		||||
				that.config.filters.$remove(index)
 | 
			
		||||
			})
 | 
			
		||||
		},
 | 
			
		||||
		add: function () {
 | 
			
		||||
			this.isAdding = true
 | 
			
		||||
		},
 | 
			
		||||
		confirm: function () {
 | 
			
		||||
			if (this.addingFilter.action == "deny") {
 | 
			
		||||
				this.config.filters.push(this.addingFilter)
 | 
			
		||||
			} else {
 | 
			
		||||
				let index = -1
 | 
			
		||||
				this.config.filters.forEach(function (filter, filterIndex) {
 | 
			
		||||
					if (filter.action == "allow") {
 | 
			
		||||
						index = filterIndex
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
 | 
			
		||||
				if (index < 0) {
 | 
			
		||||
					this.config.filters.unshift(this.addingFilter)
 | 
			
		||||
				} else {
 | 
			
		||||
					this.config.filters.$insert(index + 1, this.addingFilter)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			this.cancel()
 | 
			
		||||
		},
 | 
			
		||||
		cancel: function () {
 | 
			
		||||
			this.isAdding = false
 | 
			
		||||
			this.addingFilter = {
 | 
			
		||||
				keywords: [],
 | 
			
		||||
				action: "deny"
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		changeKeywords: function (keywords) {
 | 
			
		||||
			this.addingFilter.keywords = keywords
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	template: `<div>
 | 
			
		||||
	<input type="hidden" name="userAgentJSON" :value="JSON.stringify(config)"/>
 | 
			
		||||
	<table class="ui table definition selectable">
 | 
			
		||||
		<prior-checkbox :v-config="config" v-if="vIsLocation || vIsGroup"></prior-checkbox>
 | 
			
		||||
		<tbody v-show="(!vIsLocation && !vIsGroup) || config.isPrior">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td class="title">启用UA名单</td>
 | 
			
		||||
				<td>
 | 
			
		||||
					<div class="ui checkbox">
 | 
			
		||||
						<input type="checkbox" value="1" v-model="config.isOn"/>
 | 
			
		||||
						<label></label>
 | 
			
		||||
					</div>
 | 
			
		||||
					<p class="comment">选中后表示开启UserAgent名单。</p>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		</tbody>
 | 
			
		||||
		<tbody v-show="isOn()">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td>UA名单</td>
 | 
			
		||||
				<td>
 | 
			
		||||
					<div v-if="config.filters.length > 0">
 | 
			
		||||
						<table class="ui table celled">
 | 
			
		||||
							<thead class="full-width">
 | 
			
		||||
								<tr>
 | 
			
		||||
									<th>UA关键词</th>
 | 
			
		||||
									<th class="two wide">动作</th>
 | 
			
		||||
									<th class="one op">操作</th>
 | 
			
		||||
								</tr>
 | 
			
		||||
							</thead>
 | 
			
		||||
							<tbody v-for="(filter, index) in config.filters">
 | 
			
		||||
								<tr>
 | 
			
		||||
									<td style="background: white">
 | 
			
		||||
										<span v-for="keyword in filter.keywords" class="ui label basic tiny">
 | 
			
		||||
											<span v-if="keyword.length > 0">{{keyword}}</span>
 | 
			
		||||
											<span v-if="keyword.length == 0" class="disabled">[空]</span>
 | 
			
		||||
										</span>
 | 
			
		||||
									</td>
 | 
			
		||||
									<td>
 | 
			
		||||
										<span v-if="filter.action == 'allow'" class="green">允许</span><span v-if="filter.action == 'deny'" class="red">不允许</span>
 | 
			
		||||
									</td>
 | 
			
		||||
									<td><a href="" @click.prevent="remove(index)">删除</a></td>
 | 
			
		||||
								</tr>
 | 
			
		||||
							</tbody>
 | 
			
		||||
						</table>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div v-if="isAdding" style="margin-top: 0.5em">
 | 
			
		||||
						<table class="ui table definition">
 | 
			
		||||
							<tr>
 | 
			
		||||
								<td class="title">UA关键词</td>
 | 
			
		||||
								<td>
 | 
			
		||||
									<values-box :v-values="addingFilter.keywords" :v-allow-empty="true" @change="changeKeywords"></values-box>
 | 
			
		||||
									<p class="comment">不区分大小写,比如<code-label>Chrome</code-label>;支持<code-label>*</code-label>通配符,比如<code-label>*Firefox*</code-label>;也支持空的关键词,表示空UserAgent。</p>
 | 
			
		||||
								</td>
 | 
			
		||||
							</tr>
 | 
			
		||||
							<tr>
 | 
			
		||||
								<td>动作</td>
 | 
			
		||||
								<td><select class="ui dropdown auto-width" v-model="addingFilter.action">
 | 
			
		||||
										<option value="deny">不允许</option>
 | 
			
		||||
										<option value="allow">允许</option>
 | 
			
		||||
									</select>
 | 
			
		||||
								</td>
 | 
			
		||||
							</tr>
 | 
			
		||||
						</table>
 | 
			
		||||
						<button type="button" class="ui button tiny" @click.prevent="confirm">保存</button>   <a href="" @click.prevent="cancel" title="取消"><i class="icon remove small"></i></a>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div v-show="!isAdding" style="margin-top: 0.5em">
 | 
			
		||||
						<button class="ui button tiny" type="button" @click.prevent="add">+</button>
 | 
			
		||||
					</div>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		</tbody>
 | 
			
		||||
	</table>
 | 
			
		||||
	<div class="margin"></div>
 | 
			
		||||
</div>`
 | 
			
		||||
})
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/left_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box">
 | 
			
		||||
    {$template "../location_menu"}
 | 
			
		||||
    {$template "../left_menu"}
 | 
			
		||||
 | 
			
		||||
    <div class="right-box tiny">
 | 
			
		||||
        <form class="ui form" data-tea-action="$" data-tea-success="success">
 | 
			
		||||
            <csrf-token></csrf-token>
 | 
			
		||||
            <input type="hidden" name="webId" :value="webId"/>
 | 
			
		||||
 | 
			
		||||
            <user-agent-config-box v-model="userAgentConfig" :v-is-location="true"></user-agent-config-box>
 | 
			
		||||
 | 
			
		||||
            <submit-btn></submit-btn>
 | 
			
		||||
        </form>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,3 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.success = NotifyReloadSuccess("保存成功")
 | 
			
		||||
})
 | 
			
		||||
@@ -0,0 +1,13 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "../settings_menu"}
 | 
			
		||||
{$template "/left_menu_with_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box with-menu">
 | 
			
		||||
    <form class="ui form" data-tea-action="$" data-tea-success="success">
 | 
			
		||||
        <csrf-token></csrf-token>
 | 
			
		||||
        <input type="hidden" name="webId" :value="webId"/>
 | 
			
		||||
 | 
			
		||||
        <user-agent-config-box v-model="userAgentConfig"></user-agent-config-box>
 | 
			
		||||
        <submit-btn></submit-btn>
 | 
			
		||||
    </form>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,3 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.success = NotifyReloadSuccess("保存成功")
 | 
			
		||||
})
 | 
			
		||||
		Reference in New Issue
	
	Block a user