mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-29 16:10:26 +08:00
URL跳转支持正则匹配
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"github.com/iwind/TeaGo/actions"
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
"net/url"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
type CreatePopupAction struct {
|
||||
@@ -27,6 +28,7 @@ func (this *CreatePopupAction) RunPost(params struct {
|
||||
BeforeURL string
|
||||
AfterURL string
|
||||
MatchPrefix bool
|
||||
MatchRegexp bool
|
||||
KeepRequestURI bool
|
||||
|
||||
Status int
|
||||
@@ -39,7 +41,12 @@ func (this *CreatePopupAction) RunPost(params struct {
|
||||
Require("请填写跳转前的URL")
|
||||
|
||||
// 校验格式
|
||||
{
|
||||
if params.MatchRegexp {
|
||||
_, err := regexp.Compile(params.BeforeURL)
|
||||
if err != nil {
|
||||
this.Fail("跳转前URL正则表达式错误:" + err.Error())
|
||||
}
|
||||
} else {
|
||||
u, err := url.Parse(params.BeforeURL)
|
||||
if err != nil {
|
||||
this.FailField("beforeURL", "请输入正确的跳转前URL")
|
||||
@@ -56,7 +63,9 @@ func (this *CreatePopupAction) RunPost(params struct {
|
||||
Require("请填写跳转后URL")
|
||||
|
||||
// 校验格式
|
||||
{
|
||||
if params.MatchRegexp {
|
||||
// 正则表达式情况下不做校验
|
||||
} else {
|
||||
u, err := url.Parse(params.AfterURL)
|
||||
if err != nil {
|
||||
this.FailField("afterURL", "请输入正确的跳转后URL")
|
||||
@@ -76,6 +85,7 @@ func (this *CreatePopupAction) RunPost(params struct {
|
||||
"beforeURL": params.BeforeURL,
|
||||
"afterURL": params.AfterURL,
|
||||
"matchPrefix": params.MatchPrefix,
|
||||
"matchRegexp": params.MatchRegexp,
|
||||
"keepRequestURI": params.KeepRequestURI,
|
||||
"isOn": true,
|
||||
}
|
||||
|
||||
@@ -50,7 +50,10 @@ Vue.component("http-host-redirect-box", {
|
||||
<!-- TODO 将来支持排序,并支持isOn切换 -->
|
||||
<div v-if="redirects.length > 0">
|
||||
<div v-for="(redirect, index) in redirects" class="ui label basic small" style="margin-bottom: 0.5em;margin-top: 0.5em">
|
||||
<span v-if="redirect.status > 0">[{{redirect.status}}]</span><span v-if="redirect.matchPrefix">[prefix]</span> {{redirect.beforeURL}} -> {{redirect.afterURL}} <a href="" @click.prevent="update(index, redirect)" title="修改"><i class="icon pencil small"></i></a> <a href="" @click.prevent="remove(index)" title="删除"><i class="icon remove"></i></a>
|
||||
<span v-if="redirect.status > 0" class="small grey">[{{redirect.status}}]</span>
|
||||
<span v-if="redirect.matchPrefix" class="small grey">[匹配前缀]</span>
|
||||
<span v-if="redirect.matchRegexp" class="small grey">[正则匹配]</span>
|
||||
{{redirect.beforeURL}} -> {{redirect.afterURL}} <a href="" @click.prevent="update(index, redirect)" title="修改"><i class="icon pencil small"></i></a> <a href="" @click.prevent="remove(index)" title="删除"><i class="icon remove"></i></a>
|
||||
</div>
|
||||
<div class="ui divider"></div>
|
||||
</div>
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
<form class="ui form" data-tea-success="success" data-tea-action="$">
|
||||
<csrf-token></csrf-token>
|
||||
<input type="hidden" name="matchPrefix" :value="redirect.matchPrefix ? 1 : 0"/>
|
||||
<input type="hidden" name="matchRegexp" :value="redirect.matchRegexp ? 1 : 0"/>
|
||||
|
||||
<table class="ui table definition selectable">
|
||||
<tr>
|
||||
@@ -17,15 +19,17 @@
|
||||
<tr>
|
||||
<td>匹配模式</td>
|
||||
<td>
|
||||
<select class="ui dropdown auto-width" name="matchPrefix" v-model="matchPrefix">
|
||||
<option value="0">精准匹配</option>
|
||||
<option value="1">匹配前缀</option>
|
||||
<select class="ui dropdown auto-width" name="mode" v-model="mode">
|
||||
<option value="equal">精准匹配</option>
|
||||
<option value="matchPrefix">匹配前缀</option>
|
||||
<option value="matchRegexp">正则匹配</option>
|
||||
</select>
|
||||
<p class="comment" v-if="matchPrefix == 0">精准匹配跳转前的URL。</p>
|
||||
<p class="comment" v-if="matchPrefix == 1">只要URL头部部分包含跳转前URL,即可跳转。</p>
|
||||
<p class="comment" v-if="mode == 'equal'">精准匹配跳转前的URL,即只有访问完全一样的URL才会跳转。</p>
|
||||
<p class="comment" v-if="mode == 'matchPrefix'">只要访问的URL头部部分包含跳转前URL,即可跳转。</p>
|
||||
<p class="comment" v-if="mode == 'matchRegexp'">可以在跳转前URL中使用正则表达式,然后可以在跳转后URL中使用正则表达式中括号的变量,比如<code-label>${1}</code-label>、<code-label>${2}</code-label>等。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="matchPrefix == 1">
|
||||
<tr v-if="mode == 'matchPrefix'">
|
||||
<td>是否保留URL路径参数</td>
|
||||
<td>
|
||||
<checkbox name="keepRequestURI" value="1" v-model="redirect.keepRequestURI"></checkbox>
|
||||
|
||||
@@ -9,9 +9,33 @@ Tea.context(function () {
|
||||
beforeURL: "",
|
||||
afterURL: "",
|
||||
matchPrefix: false,
|
||||
matchRegexp: false,
|
||||
keepRequestURI: false
|
||||
}
|
||||
}
|
||||
|
||||
this.matchPrefix = (this.redirect.matchPrefix ? 1 : 0)
|
||||
this.mode = ""
|
||||
if (this.redirect.matchPrefix) {
|
||||
this.mode = "matchPrefix"
|
||||
} else if (this.redirect.matchRegexp) {
|
||||
this.mode = "matchRegexp"
|
||||
} else {
|
||||
this.mode = "equal"
|
||||
}
|
||||
|
||||
this.$delay(function () {
|
||||
let that = this
|
||||
this.$watch("mode", function (v) {
|
||||
if (v == "matchPrefix") {
|
||||
that.redirect.matchPrefix = true
|
||||
that.redirect.matchRegexp = false
|
||||
} else if (v == "matchRegexp") {
|
||||
that.redirect.matchPrefix = false
|
||||
that.redirect.matchRegexp = true
|
||||
} else {
|
||||
that.redirect.matchPrefix = false
|
||||
that.redirect.matchRegexp = false
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user