Initial commit (code only without large binaries)

This commit is contained in:
robin
2026-02-15 18:58:44 +08:00
commit 35df75498f
9442 changed files with 1495866 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
{$layout "layout_popup"}
<h3>创建高防实例</h3>
<form class="ui form" data-tea-action="$" data-tea-success="success">
<csrf-token></csrf-token>
<table class="ui table definition selectable">
<tr v-if="packageId > 0">
<td>所属产品</td>
<td>{{packageSummary}}
<input type="hidden" name="packageId" :value="packageId"/>
</td>
</tr>
<tbody v-if="packageId == 0">
<tr>
<td>所属线路 *</td>
<td>
<div v-if="networks.length > 0">
<select class="ui dropdown auto-width" name="networkId" v-model="networkId">
<option value="0">[选择线路]</option>
<option v-for="network in networks" :value="network.id">{{network.name}}</option>
</select>
</div>
<span class="red" v-if="networks.length == 0">尚未创建线路和产品。</span>
</td>
</tr>
<tr>
<td>所属产品 *</td>
<td>
<div v-show="networkId > 0">
<select class="ui dropdown auto-width" name="packageId">
<option value="0">[选择产品]</option>
<option v-for="p in packages" :value="p.id" v-if="p.networkId == networkId">{{p.summary}}</option>
</select>
</div>
<span v-if="networkId == 0" class="grey">请先选择线路</span>
</td>
</tr>
</tbody>
<tr>
<td class="title">部署集群 *</td>
<td>
<node-cluster-combo-box></node-cluster-combo-box>
<p class="comment">用于防护的网站部署的集群。</p>
</td>
</tr>
<tr>
<td>高防IP *</td>
<td>
<values-box name="ipAddresses" placeholder="x.x.x.x" maxlength="64" :validator="ipValidator"></values-box>
</td>
</tr>
</table>
<submit-btn>保存</submit-btn>
</form>

View File

@@ -0,0 +1,13 @@
Tea.context(function () {
this.ipValidator = function (ip) {
if (teaweb.validateIP(ip)) {
return {
isOk: true
}
}
return {
isOk: false,
message: "请输入正确的IP"
}
}
})

View File

@@ -0,0 +1,92 @@
{$layout}
{$template "../menu"}
<second-menu>
<menu-item v-if="selectedPackage != null && selectedPackage.id > 0"><span class="ui label" style="font-weight: normal">{{selectedPackage.summary}}</span> &nbsp; <a href="/clusters/anti-ddos/instances" title="清除条件"><i class="icon remove small"></i></a></menu-item>
<span class="item disabled" v-if="selectedPackage != null && selectedPackage.id > 0" style="padding-left: 0">|</span>
<menu-item @click.prevent="createInstance()">[创建高防实例]</menu-item>
</second-menu>
<div v-show="selectedPackageId == 0">
<form class="ui form" action="/clusters/anti-ddos/instances" method="get">
<div class="ui fields inline">
<div class="ui field">
<select class="ui dropdown" name="networkId" v-model="networkId">
<option value="0">[线路]</option>
<option v-for="network in networks" :value="network.id">{{network.name}}</option>
</select>
</div>
<div class="ui field">
<input type="text" name="ip" placeholder="高防IP" v-model="ip" maxlength="64"/>
</div>
<div class="ui field">
<button type="submit" class="ui button">搜索</button>
&nbsp;
<a href="/clusters/anti-ddos/instances" v-if="networkId > 0 || ip.length > 0">[清除缓存]</a>
</div>
</div>
</form>
<div class="margin"></div>
</div>
<div v-if="instances.length == 0">
<p class="comment">暂时还没有高防实例。</p>
</div>
<div v-if="instances.length > 0">
<table class="ui table selectable celled">
<thead>
<tr>
<th>所属线路</th>
<th>防护带宽</th>
<th>业务带宽</th>
<th>部署集群</th>
<th class="three wide">高防IP</th>
<th class="three wide">租用用户</th>
<th class="width5">状态</th>
<th class="two op">操作</th>
</tr>
</thead>
<tr v-for="instance in instances">
<td>
<span v-if="instance.network != null && instance.network.id > 0">{{instance.network.name}}</span>
<span v-else class="red">已删除</span>
</td>
<td>
<div v-if="instance.package != null && instance.package.id > 0">
{{instance.package.protectionBandwidthSize}}
{{instance.package.protectionBandwidthUnit.toBitUpper()}}
</div>
</td>
<td>
<div v-if="instance.package != null && instance.package.id > 0">
{{instance.package.serverBandwidthSize}}
{{instance.package.serverBandwidthUnit.toBitUpper()}}
</div>
<span v-else class="red">已删除</span>
</td>
<td>
<span v-if="instance.cluster != null && instance.cluster.id > 0">{{instance.cluster.name}}</span>
<span v-else class="red">已删除</span>
</td>
<td>
<div v-for="ipAddr in instance.ipAddresses"><keyword :v-word="ip">{{ipAddr}}</keyword></div>
</td>
<td>
<div v-if="instance.user != null && instance.user.id > 0"><user-link :v-user="instance.user"></user-link>
<div>
<span class="small grey">到{{instance.userDayTo}}</span>
</div>
</div>
<span v-else class="disabled">暂无</span>
</td>
<td><label-on :v-is-on="instance.isOn"></label-on></td>
<td>
<a href="" @click.prevent="updateInstance(instance.id)">修改</a> &nbsp;
<a href="" @click.prevent="deleteInstance(instance.id)">删除</a>
</td>
</tr>
</table>
<page-box></page-box>
</div>

View File

@@ -0,0 +1,44 @@
Tea.context(function () {
this.createInstance = function () {
let packageId = 0
if (this.selectedPackage != null) {
packageId = this.selectedPackage.id
} else if (this.packageId > 0) {
packageId = this.packageId
}
teaweb.popup(".createPopup?networkId=" + this.networkId + "&packageId=" + packageId, {
height: "24em",
callback: function () {
teaweb.successRefresh("保存成功")
}
})
}
this.updateInstance = function (instanceId) {
teaweb.popup(".instance.updatePopup?instanceId=" + instanceId, {
height: "24em",
callback: function () {
teaweb.successRefresh("保存成功")
}
})
}
this.deleteInstance = function (instanceId) {
let that = this
teaweb.confirm("确定要删除当前实例吗?", function () {
that.$post(".instance.delete")
.params({
instanceId: instanceId
})
.success(function () {
teaweb.successRefresh("删除成功")
})
})
}
String.prototype.toBitUpper = function () {
let unit = this
return unit.replace(/bps$/, "").replace(/b$/, "").toUpperCase() + "bps"
}
})

View File

@@ -0,0 +1,42 @@
{$layout "layout_popup"}
<h3>修改高防实例</h3>
<form class="ui form" data-tea-action="$" data-tea-success="success">
<csrf-token></csrf-token>
<input type="hidden" name="instanceId" :value="instanceId"/>
<table class="ui table definition selectable">
<tr>
<td>所属产品</td>
<td>
<span v-if="instance.package != null">{{instance.package.summary}}</span>
<span v-else class="red">已被删除</span>
</td>
</tr>
<tr>
<td class="title">部署集群 *</td>
<td>
<node-cluster-combo-box :v-cluster-id="instance.clusterId"></node-cluster-combo-box>
</td>
</tr>
<tr>
<td>高防IP *</td>
<td>
<values-box name="ipAddresses" placeholder="x.x.x.x" maxlength="64" :validator="ipValidator" :v-values="instance.ipAddresses"></values-box>
</td>
</tr>
<tr>
<td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr>
<tbody v-show="moreOptionsVisible">
<tr>
<td>启用当前实例</td>
<td>
<checkbox name="isOn" v-model="instance.isOn"></checkbox>
</td>
</tr>
</tbody>
</table>
<submit-btn>保存</submit-btn>
</form>

View File

@@ -0,0 +1,13 @@
Tea.context(function () {
this.ipValidator = function (ip) {
if (teaweb.validateIP(ip)) {
return {
isOk: true
}
}
return {
isOk: false,
message: "请输入正确的IP"
}
}
})