|
@@ -52,6 +52,7 @@
|
|
|
<div slot="title">
|
|
|
<a-button type="primary" icon="plus" @click="openAddInbound">{{ i18n "pages.inbounds.addInbound" }}</a-button>
|
|
|
<a-button type="primary" icon="export" @click="exportAllLinks">{{ i18n "pages.inbounds.export" }}</a-button>
|
|
|
+ <a-button type="primary" icon="reload" @click="resetAllTraffic">{{ i18n "pages.inbounds.resetAllTraffic" }}</a-button>
|
|
|
</div>
|
|
|
<a-input v-model.lazy="searchKey" placeholder="{{ i18n "search" }}" autofocus style="max-width: 300px"></a-input>
|
|
|
<a-table :columns="columns" :row-key="dbInbound => dbInbound.id"
|
|
@@ -95,6 +96,9 @@
|
|
|
</template>
|
|
|
<a-menu-item key="resetTraffic">
|
|
|
<a-icon type="retweet"></a-icon> {{ i18n "pages.inbounds.resetTraffic" }}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item key="clone">
|
|
|
+ <a-icon type="block"></a-icon> {{ i18n "pages.inbounds.Clone"}}
|
|
|
</a-menu-item>
|
|
|
<a-menu-item key="delete">
|
|
|
<span style="color: #FF4D4F">
|
|
@@ -310,11 +314,47 @@
|
|
|
break;
|
|
|
case "resetTraffic":
|
|
|
this.resetTraffic(dbInbound.id);
|
|
|
+ break;
|
|
|
+ case "clone":
|
|
|
+ this.openCloneInbound(dbInbound);
|
|
|
break;
|
|
|
case "delete":
|
|
|
this.delInbound(dbInbound.id);
|
|
|
break;
|
|
|
}
|
|
|
+ },
|
|
|
+ openCloneInbound(dbInbound) {
|
|
|
+ this.$confirm({
|
|
|
+ title: '{{ i18n "pages.inbounds.cloneInbound"}} ' + dbInbound.remark,
|
|
|
+ content: '{{ i18n "pages.inbounds.cloneInboundContent"}}',
|
|
|
+ okText: '{{ i18n "pages.inbounds.cloneInboundOk"}}',
|
|
|
+ cancelText: '{{ i18n "cancel" }}',
|
|
|
+ onOk: () => {
|
|
|
+ const baseInbound = dbInbound.toInbound();
|
|
|
+ dbInbound.up = 0;
|
|
|
+ dbInbound.down = 0;
|
|
|
+ this.cloneInbound(baseInbound, dbInbound);
|
|
|
+ },
|
|
|
+ });
|
|
|
+ },
|
|
|
+ async cloneInbound(baseInbound, dbInbound) {
|
|
|
+ const inbound = new Inbound();
|
|
|
+ const data = {
|
|
|
+ up: dbInbound.up,
|
|
|
+ down: dbInbound.down,
|
|
|
+ total: dbInbound.total,
|
|
|
+ remark: dbInbound.remark + " - Cloned",
|
|
|
+ enable: dbInbound.enable,
|
|
|
+ expiryTime: dbInbound.expiryTime,
|
|
|
+
|
|
|
+ listen: inbound.listen,
|
|
|
+ port: inbound.port,
|
|
|
+ protocol: baseInbound.protocol,
|
|
|
+ settings: inbound.settings.toString(),
|
|
|
+ streamSettings: baseInbound.stream.toString(),
|
|
|
+ sniffing: baseInbound.canSniffing() ? baseInbound.sniffing.toString() : '{}',
|
|
|
+ };
|
|
|
+ await this.submit('/xui/inbound/add', data, inModal);
|
|
|
},
|
|
|
openAddInbound() {
|
|
|
inModal.show({
|
|
@@ -461,6 +501,22 @@
|
|
|
this.updateInbound(inbound, dbInbound);
|
|
|
},
|
|
|
});
|
|
|
+ },
|
|
|
+ resetAllTraffic() {
|
|
|
+ this.$confirm({
|
|
|
+ title: '{{ i18n "pages.inbounds.resetAllTrafficTitle"}}',
|
|
|
+ content: '{{ i18n "pages.inbounds.resetAllTrafficContent"}}',
|
|
|
+ okText: '{{ i18n "pages.inbounds.resetAllTrafficOkText"}}',
|
|
|
+ cancelText: '{{ i18n "pages.inbounds.resetAllTrafficCancelText"}}',
|
|
|
+ onOk: async () => {
|
|
|
+ for (const dbInbound of this.dbInbounds) {
|
|
|
+ const inbound = dbInbound.toInbound();
|
|
|
+ dbInbound.up = 0;
|
|
|
+ dbInbound.down = 0;
|
|
|
+ this.updateInbound(inbound, dbInbound);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ });
|
|
|
},
|
|
|
delInbound(dbInboundId) {
|
|
|
this.$confirm({
|