Files
EdgeAdmin/web/public/js/components/server/http-cache-ref-box.js

298 lines
9.7 KiB
JavaScript
Raw Normal View History

// 单个缓存条件设置
2020-10-04 20:38:27 +08:00
Vue.component("http-cache-ref-box", {
props: ["v-cache-ref", "v-is-reverse"],
mounted: function () {
this.$refs.variablesDescriber.update(this.ref.key)
2022-09-03 18:14:34 +08:00
if (this.ref.simpleCond != null) {
2022-09-03 19:15:30 +08:00
this.condType = this.ref.simpleCond.type
this.changeCondType(this.ref.simpleCond.type, true)
2022-09-03 18:14:34 +08:00
this.condCategory = "simple"
} else if (this.ref.conds != null && this.ref.conds.groups != null) {
this.condCategory = "complex"
}
2022-09-03 19:15:30 +08:00
this.changeCondCategory(this.condCategory)
},
2020-10-04 20:38:27 +08:00
data: function () {
let ref = this.vCacheRef
if (ref == null) {
ref = {
isOn: true,
cachePolicyId: 0,
key: "${scheme}://${host}${requestPath}${isArgs}${args}",
2020-10-04 20:38:27 +08:00
life: {count: 2, unit: "hour"},
status: [200],
maxSize: {count: 32, unit: "mb"},
minSize: {count: 0, unit: "kb"},
2020-10-04 20:38:27 +08:00
skipCacheControlValues: ["private", "no-cache", "no-store"],
skipSetCookie: true,
enableRequestCachePragma: false,
2022-09-03 18:14:34 +08:00
conds: null, // 复杂条件
simpleCond: null, // 简单条件
allowChunkedEncoding: true,
allowPartialContent: false,
enableIfNoneMatch: false,
enableIfModifiedSince: false,
2021-12-07 10:45:49 +08:00
isReverse: this.vIsReverse,
methods: [],
expiresTime: {
isPrior: false,
isOn: false,
overwrite: true,
autoCalculate: true,
duration: {count: -1, "unit": "hour"}
}
2020-10-04 20:38:27 +08:00
}
}
if (ref.key == null) {
ref.key = ""
}
2021-12-07 10:45:49 +08:00
if (ref.methods == null) {
ref.methods = []
}
2020-10-04 20:38:27 +08:00
if (ref.life == null) {
ref.life = {count: 2, unit: "hour"}
}
if (ref.maxSize == null) {
ref.maxSize = {count: 32, unit: "mb"}
}
if (ref.minSize == null) {
ref.minSize = {count: 0, unit: "kb"}
}
2022-09-03 18:14:34 +08:00
let condType = "url-extension"
let condComponent = window.REQUEST_COND_COMPONENTS.$find(function (k, v) {
return v.type == "url-extension"
})
2020-10-04 20:38:27 +08:00
return {
ref: ref,
2022-09-03 18:14:34 +08:00
moreOptionsVisible: false,
2022-09-03 19:15:30 +08:00
2022-09-03 18:14:34 +08:00
condCategory: "simple", // 条件分类simple|complex
condType: condType,
condComponent: condComponent,
2022-09-03 19:15:30 +08:00
condIsCaseInsensitive: (ref.simpleCond != null) ? ref.simpleCond.isCaseInsensitive : true,
2022-09-03 18:14:34 +08:00
components: window.REQUEST_COND_COMPONENTS
2020-10-04 20:38:27 +08:00
}
},
methods: {
changeOptionsVisible: function (v) {
this.moreOptionsVisible = v
},
changeLife: function (v) {
this.ref.life = v
},
changeMaxSize: function (v) {
this.ref.maxSize = v
},
changeMinSize: function (v) {
this.ref.minSize = v
},
2020-10-04 20:38:27 +08:00
changeConds: function (v) {
this.ref.conds = v
2022-09-03 18:14:34 +08:00
this.ref.simpleCond = null
},
changeStatusList: function (list) {
let result = []
list.forEach(function (status) {
let statusNumber = parseInt(status)
if (isNaN(statusNumber) || statusNumber < 100 || statusNumber > 999) {
return
}
result.push(statusNumber)
})
this.ref.status = result
},
2021-12-07 10:45:49 +08:00
changeMethods: function (methods) {
this.ref.methods = methods.map(function (v) {
return v.toUpperCase()
})
},
changeKey: function (key) {
this.$refs.variablesDescriber.update(key)
},
changeExpiresTime: function (expiresTime) {
this.ref.expiresTime = expiresTime
2022-09-03 18:14:34 +08:00
},
// 切换条件类型
changeCondCategory: function (condCategory) {
this.condCategory = condCategory
2022-09-03 19:15:30 +08:00
// resize window
let dialog = window.parent.document.querySelector("*[role='dialog']")
switch (condCategory) {
case "simple":
dialog.style.width = "40em"
break
case "complex":
let width = window.parent.innerWidth
if (width > 1024) {
width = 1024
}
dialog.style.width = width + "px"
break
}
2022-09-03 18:14:34 +08:00
},
2022-09-03 19:15:30 +08:00
changeCondType: function (condType, isInit) {
if (!isInit && this.ref.simpleCond != null) {
this.ref.simpleCond.value = null
}
2022-09-03 18:14:34 +08:00
let def = this.components.$find(function (k, component) {
return component.type == condType
})
if (def != null) {
this.condComponent = def
}
2020-10-04 20:38:27 +08:00
}
},
template: `<tbody>
2022-09-03 18:14:34 +08:00
<tr v-if="condCategory == 'simple'">
<td class="title color-border">条件类型 *</td>
<td>
2022-09-03 19:15:30 +08:00
<select class="ui dropdown auto-width" name="condType" v-model="condType" @change="changeCondType(condType, false)">
2022-09-03 18:14:34 +08:00
<option value="url-extension">URL扩展名</option>
<option value="url-prefix">URL前缀</option>
<option value="url-eq-index">首页</option>
2022-09-03 19:15:30 +08:00
<option value="url-eq">URL完整路径</option>
2022-09-03 18:14:34 +08:00
<option value="url-regexp">URL正则匹配</option>
</select>
<p class="comment"><a href="" @click.prevent="changeCondCategory('complex')">切换到复杂条件 &raquo;</a></p>
</td>
</tr>
<tr v-if="condCategory == 'simple'">
<td class="color-border">{{condComponent.paramsTitle}} *</td>
<td>
<component :is="condComponent.component" :v-cond="ref.simpleCond"></component>
</td>
</tr>
2022-09-03 19:15:30 +08:00
<tr v-if="condCategory == 'simple' && condComponent.caseInsensitive">
<td class="color-border">不区分大小写</td>
<td>
<div class="ui checkbox">
<input type="checkbox" name="condIsCaseInsensitive" value="1" v-model="condIsCaseInsensitive"/>
<label></label>
</div>
<p class="comment">选中后表示对比时忽略参数值的大小写</p>
</td>
</tr>
2022-09-03 18:14:34 +08:00
<tr v-if="condCategory == 'complex'">
<td class="title">匹配条件分组 *</td>
2020-10-04 20:38:27 +08:00
<td>
<http-request-conds-box :v-conds="ref.conds" @change="changeConds"></http-request-conds-box>
2022-09-03 18:14:34 +08:00
<p class="comment"><a href="" @click.prevent="changeCondCategory('simple')">&laquo; 切换到简单条件</a></p>
2020-10-04 20:38:27 +08:00
</td>
</tr>
<tr v-show="!vIsReverse">
2020-10-04 20:38:27 +08:00
<td>缓存有效期 *</td>
<td>
<time-duration-box :v-value="ref.life" @change="changeLife"></time-duration-box>
</td>
</tr>
<tr v-show="!vIsReverse">
2020-10-04 20:38:27 +08:00
<td>缓存Key *</td>
<td>
<input type="text" v-model="ref.key" @input="changeKey(ref.key)"/>
<p class="comment">用来区分不同缓存内容的唯一Key<request-variables-describer ref="variablesDescriber"></request-variables-describer></p>
2020-10-04 20:38:27 +08:00
</td>
</tr>
<tr v-show="!vIsReverse">
2020-10-04 20:38:27 +08:00
<td colspan="2"><more-options-indicator @change="changeOptionsVisible"></more-options-indicator></td>
</tr>
2021-12-07 10:45:49 +08:00
<tr v-show="moreOptionsVisible && !vIsReverse">
<td>请求方法限制</td>
2021-12-07 10:45:49 +08:00
<td>
<values-box size="5" maxlength="10" :values="ref.methods" @change="changeMethods"></values-box>
2021-12-07 10:47:46 +08:00
<p class="comment">允许请求的缓存方法默认支持所有的请求方法</p>
2021-12-07 10:45:49 +08:00
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
<td>客户端过期时间<em>Expires</em></td>
<td>
<http-expires-time-config-box :v-expires-time="ref.expiresTime" @change="changeExpiresTime"></http-expires-time-config-box>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
<td>可缓存的最大内容尺寸</td>
2020-10-04 20:38:27 +08:00
<td>
<size-capacity-box :v-value="ref.maxSize" @change="changeMaxSize"></size-capacity-box>
<p class="comment">内容尺寸如果高于此值则不缓存</p>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
<td>可缓存的最小内容尺寸</td>
<td>
<size-capacity-box :v-value="ref.minSize" @change="changeMinSize"></size-capacity-box>
<p class="comment">内容尺寸如果低于此值则不缓存</p>
2020-10-04 20:38:27 +08:00
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
<td>支持分片内容</td>
<td>
<checkbox name="allowChunkedEncoding" value="1" v-model="ref.allowChunkedEncoding"></checkbox>
<p class="comment">选中后Gzip等压缩后的Chunked内容可以直接缓存无需检查内容长度</p>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
<td>支持缓存区间内容</td>
<td>
<checkbox name="allowPartialContent" value="1" v-model="ref.allowPartialContent"></checkbox>
<p class="comment">选中后支持缓存源站返回的某个区间的内容该内容通过<code-label>206 Partial Content</code-label><code-label></code-label></p>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
2020-10-04 20:38:27 +08:00
<td>状态码列表</td>
<td>
<values-box name="statusList" size="3" maxlength="3" :values="ref.status" @change="changeStatusList"></values-box>
2020-10-04 20:38:27 +08:00
<p class="comment">允许缓存的HTTP状态码列表</p>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
2020-10-04 20:38:27 +08:00
<td>跳过的Cache-Control值</td>
<td>
<values-box name="skipResponseCacheControlValues" size="10" maxlength="100" :values="ref.skipCacheControlValues"></values-box>
<p class="comment">当响应的Cache-Control为这些值时不缓存响应内容而且不区分大小写</p>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
2020-10-04 20:38:27 +08:00
<td>跳过Set-Cookie</td>
<td>
<div class="ui checkbox">
<input type="checkbox" value="1" v-model="ref.skipSetCookie"/>
<label></label>
</div>
<p class="comment">选中后当响应的Header中有Set-Cookie时不缓存响应内容</p>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
2020-10-04 20:38:27 +08:00
<td>支持请求no-cache刷新</td>
<td>
<div class="ui checkbox">
<input type="checkbox" name="enableRequestCachePragma" value="1" v-model="ref.enableRequestCachePragma"/>
<label></label>
</div>
<p class="comment">选中后当请求的Header中含有Pragma: no-cache或Cache-Control: no-cache时会跳过缓存直接读取源内容</p>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
<td>允许If-None-Match回源</td>
<td>
<checkbox v-model="ref.enableIfNoneMatch"></checkbox>
<p class="comment">特殊情况下才需要开启可能会降低缓存命中率</p>
</td>
</tr>
<tr v-show="moreOptionsVisible && !vIsReverse">
<td>允许If-Modified-Since回源</td>
<td>
<checkbox v-model="ref.enableIfModifiedSince"></checkbox>
<p class="comment">特殊情况下才需要开启可能会降低缓存命中率</p>
</td>
</tr>
2022-09-03 18:14:34 +08:00
<tr v-show="false">
<td colspan="2"><input type="hidden" name="cacheRefJSON" :value="JSON.stringify(ref)"/></td>
</tr>
2020-10-04 20:38:27 +08:00
</tbody>`
})