|
@@ -24,7 +24,6 @@
|
|
|
margin: 24px 16px;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
@media (max-width: 768px) {
|
|
|
.ant-tabs-nav .ant-tabs-tab {
|
|
|
margin: 0;
|
|
@@ -35,15 +34,12 @@
|
|
|
padding: 10px 0px;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
.ant-tabs-bar {
|
|
|
margin: 0;
|
|
|
}
|
|
|
-
|
|
|
.ant-list-item {
|
|
|
display: block;
|
|
|
}
|
|
|
-
|
|
|
.collapse-title {
|
|
|
color: inherit;
|
|
|
font-weight: bold;
|
|
@@ -51,606 +47,625 @@
|
|
|
padding: 10px 20px;
|
|
|
border-bottom: 2px solid;
|
|
|
}
|
|
|
-
|
|
|
.collapse-title > i {
|
|
|
color: inherit;
|
|
|
font-size: 24px;
|
|
|
}
|
|
|
+ .ant-collapse-content-box > li {
|
|
|
+ padding: 12px 0 0 0 !important;
|
|
|
+ }
|
|
|
+ .ant-list-item > li {
|
|
|
+ padding: 10px 20px !important;
|
|
|
+ }
|
|
|
</style>
|
|
|
<body>
|
|
|
-<a-layout id="app" v-cloak :class="themeSwitcher.currentTheme">
|
|
|
+ <a-layout id="app" v-cloak :class="themeSwitcher.currentTheme">
|
|
|
{{ template "commonSider" . }}
|
|
|
<a-layout id="content-layout">
|
|
|
- <a-layout-content>
|
|
|
- <a-spin :spinning="spinning" :delay="500" tip='{{ i18n "loading"}}'>
|
|
|
- <transition name="list" appear>
|
|
|
- <a-alert type="error" v-if="showAlert" style="margin-bottom: 10px"
|
|
|
- message='{{ i18n "secAlertTitle" }}'
|
|
|
- color="red"
|
|
|
- description='{{ i18n "secAlertSsl" }}'
|
|
|
- show-icon closable
|
|
|
- >
|
|
|
- </a-alert>
|
|
|
- </transition>
|
|
|
- <a-space direction="vertical">
|
|
|
- <a-card hoverable style="margin-bottom: .5rem;">
|
|
|
- <a-row style="display: flex; flex-wrap: wrap; align-items: center;">
|
|
|
- <a-col :xs="24" :sm="10" style="padding: 4px;">
|
|
|
- <a-space direction="horizontal">
|
|
|
- <a-button type="primary" :disabled="saveBtnDisable" @click="updateXraySetting">{{ i18n "pages.xray.save" }}</a-button>
|
|
|
- <a-button type="danger" :disabled="!saveBtnDisable" @click="restartXray">{{ i18n "pages.xray.restart" }}</a-button>
|
|
|
- <a-popover v-if="restartResult"
|
|
|
- :overlay-class-name="themeSwitcher.currentTheme">
|
|
|
- <span slot="title" style="font-size: 12pt">Error in running xray-core</span>
|
|
|
- <template slot="content">
|
|
|
- <p style="max-width: 400px" v-for="line in restartResult.split('\n')">[[ line ]]</p>
|
|
|
- </template>
|
|
|
- <a-icon type="question-circle"></a-icon>
|
|
|
- </a-popover>
|
|
|
- </a-space>
|
|
|
- </a-col>
|
|
|
- <a-col :xs="24" :sm="14">
|
|
|
- <template>
|
|
|
- <div>
|
|
|
- <a-back-top :target="() => document.getElementById('content-layout')" visibility-height="200">
|
|
|
- </a-back-top>
|
|
|
- <a-alert type="warning" style="float: right; width: fit-content"
|
|
|
- message='{{ i18n "pages.settings.infoDesc" }}'
|
|
|
- show-icon
|
|
|
- >
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-card>
|
|
|
- <a-tabs class="ant-card-dark-box-nohover" default-active-key="1"
|
|
|
- @change="(activeKey) => { this.changePage(activeKey); }"
|
|
|
- :class="themeSwitcher.currentTheme">
|
|
|
- <a-tab-pane key="tpl-basic" tab='{{ i18n "pages.xray.basicTemplate"}}' style="padding-top: 20px;">
|
|
|
- <a-collapse>
|
|
|
- <a-collapse-panel header='{{ i18n "pages.xray.generalConfigs"}}'>
|
|
|
- <a-row :xs="24" :sm="24" :lg="12">
|
|
|
- <a-alert type="warning" style="text-align: center;">
|
|
|
- <template slot="message">
|
|
|
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
- {{ i18n "pages.xray.generalConfigsDesc" }}
|
|
|
- </template>
|
|
|
- </a-alert>
|
|
|
- </a-row>
|
|
|
- <a-list-item>
|
|
|
- <a-row style="padding: 20px">
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <a-list-item-meta title='{{ i18n "pages.xray.FreedomStrategy" }}'
|
|
|
- description='{{ i18n "pages.xray.FreedomStrategyDesc" }}' />
|
|
|
- </a-col>
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <template>
|
|
|
- <a-select v-model="freedomStrategy" :dropdown-class-name="themeSwitcher.currentTheme"
|
|
|
- style="width: 100%">
|
|
|
- <a-select-option v-for="s in OutboundDomainStrategies" :value="s">[[ s ]]</a-select-option>
|
|
|
- </a-select>
|
|
|
- </template>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-list-item>
|
|
|
- <a-row style="padding: 20px">
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <a-list-item-meta title='{{ i18n "pages.xray.RoutingStrategy" }}'
|
|
|
- description='{{ i18n "pages.xray.RoutingStrategyDesc" }}' />
|
|
|
- </a-col>
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <a-select v-model="routingStrategy" :dropdown-class-name="themeSwitcher.currentTheme"
|
|
|
- style="width: 100%">
|
|
|
- <a-select-option v-for="s in routingDomainStrategies" :value="s">[[ s ]]</a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-list-item>
|
|
|
- </a-collapse-panel>
|
|
|
- <a-collapse-panel header='{{ i18n "pages.xray.logConfigs" }}'>
|
|
|
- <a-row :xs="24" :sm="24" :lg="12">
|
|
|
- <a-alert type="warning" style="text-align: center;">
|
|
|
- <template slot="message">
|
|
|
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
- {{ i18n "pages.xray.logConfigsDesc" }}
|
|
|
- </template>
|
|
|
- </a-alert>
|
|
|
- </a-row>
|
|
|
- <a-row style="padding: 20px">
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <a-list-item-meta title='{{ i18n "pages.xray.logLevel" }}'
|
|
|
- description='{{ i18n "pages.xray.logLevelDesc" }}' />
|
|
|
- </a-col>
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <template>
|
|
|
- <a-select v-model="setLogLevel" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
|
|
|
- <a-select-option v-for="s in logLevel" :value="s">[[ s ]]</a-select-option>
|
|
|
- </a-select>
|
|
|
- </template>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row style="padding: 20px">
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <a-list-item-meta title='{{ i18n "pages.xray.accessLog" }}'
|
|
|
- description='{{ i18n "pages.xray.accessLogDesc" }}' />
|
|
|
- </a-col>
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <template>
|
|
|
- <a-select v-model="accessLog" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
|
|
|
- <a-select-option v-for="s in access" :key="s" :value="s">[[ s ]]</a-select-option>
|
|
|
- </a-select>
|
|
|
- </template>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row style="padding: 20px">
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <a-list-item-meta title='{{ i18n "pages.xray.errorLog" }}'
|
|
|
- description='{{ i18n "pages.xray.errorLogDesc" }}' />
|
|
|
- </a-col>
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <template>
|
|
|
- <a-select v-model="errorLog" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
|
|
|
- <a-select-option v-for="s in error" :key="s" :value="s">[[ s ]]</a-select-option>
|
|
|
- </a-select>
|
|
|
- </template>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-list-item>
|
|
|
- </a-collapse-panel>
|
|
|
- <a-collapse-panel header='{{ i18n "pages.xray.blockConfigs"}}'>
|
|
|
- <a-row :xs="24" :sm="24" :lg="12">
|
|
|
- <a-alert type="warning" style="text-align: center;">
|
|
|
- <template slot="message">
|
|
|
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
- {{ i18n "pages.xray.blockConfigsDesc" }}
|
|
|
- </template>
|
|
|
- </a-alert>
|
|
|
- </a-row>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Torrent"}}' desc='{{ i18n "pages.xray.TorrentDesc"}}' v-model="torrentSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.PrivateIp"}}' desc='{{ i18n "pages.xray.PrivateIpDesc"}}' v-model="privateIpSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Ads"}}' desc='{{ i18n "pages.xray.AdsDesc"}}' v-model="AdsSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Family"}}' desc='{{ i18n "pages.xray.FamilyDesc"}}' v-model="familyProtectSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Security"}}' desc='{{ i18n "pages.xray.SecurityDesc"}}' v-model="SecuritySettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Speedtest"}}' desc='{{ i18n "pages.xray.SpeedtestDesc"}}' v-model="SpeedTestSettings"></setting-list-item>
|
|
|
- </a-collapse-panel>
|
|
|
- <a-collapse-panel header='{{ i18n "pages.xray.blockCountryConfigs"}}'>
|
|
|
- <a-row :xs="24" :sm="24" :lg="12">
|
|
|
- <a-alert type="warning" style="text-align: center;">
|
|
|
- <template slot="message">
|
|
|
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
- {{ i18n "pages.xray.blockCountryConfigsDesc" }}
|
|
|
- </template>
|
|
|
- </a-alert>
|
|
|
- </a-row>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.IRIp"}}' desc='{{ i18n "pages.xray.IRIpDesc"}}' v-model="IRIpSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.IRDomain"}}' desc='{{ i18n "pages.xray.IRDomainDesc"}}' v-model="IRDomainSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.ChinaIp"}}' desc='{{ i18n "pages.xray.ChinaIpDesc"}}' v-model="ChinaIpSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.ChinaDomain"}}' desc='{{ i18n "pages.xray.ChinaDomainDesc"}}' v-model="ChinaDomainSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.RussiaIp"}}' desc='{{ i18n "pages.xray.RussiaIpDesc"}}' v-model="RussiaIpSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.RussiaDomain"}}' desc='{{ i18n "pages.xray.RussiaDomainDesc"}}' v-model="RussiaDomainSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.VNIp"}}' desc='{{ i18n "pages.xray.VNIpDesc"}}' v-model="VNIpSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.VNDomain"}}' desc='{{ i18n "pages.xray.VNDomainDesc"}}' v-model="VNDomainSettings"></setting-list-item>
|
|
|
- </a-collapse-panel>
|
|
|
- <a-collapse-panel header='{{ i18n "pages.xray.directCountryConfigs"}}'>
|
|
|
- <a-row :xs="24" :sm="24" :lg="12">
|
|
|
- <a-alert type="warning" style="text-align: center;">
|
|
|
- <template slot="message">
|
|
|
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
- {{ i18n "pages.xray.directCountryConfigsDesc" }}
|
|
|
- </template>
|
|
|
- </a-alert>
|
|
|
- </a-row>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectIRIp"}}' desc='{{ i18n "pages.xray.DirectIRIpDesc"}}' v-model="IRIpDirectSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectIRDomain"}}' desc='{{ i18n "pages.xray.DirectIRDomainDesc"}}' v-model="IRDomainDirectSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectChinaIp"}}' desc='{{ i18n "pages.xray.DirectChinaIpDesc"}}' v-model="ChinaIpDirectSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectChinaDomain"}}' desc='{{ i18n "pages.xray.DirectChinaDomainDesc"}}' v-model="ChinaDomainDirectSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectRussiaIp"}}' desc='{{ i18n "pages.xray.DirectRussiaIpDesc"}}' v-model="RussiaIpDirectSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectRussiaDomain"}}' desc='{{ i18n "pages.xray.DirectRussiaDomainDesc"}}' v-model="RussiaDomainDirectSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectVNIp"}}' desc='{{ i18n "pages.xray.DirectVNIpDesc"}}' v-model="VNIpDirectSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectVNDomain"}}' desc='{{ i18n "pages.xray.DirectVNDomainDesc"}}' v-model="VNDomainDirectSettings"></setting-list-item>
|
|
|
- </a-collapse-panel>
|
|
|
- <a-collapse-panel header='{{ i18n "pages.xray.ipv4Configs"}}'>
|
|
|
- <a-row :xs="24" :sm="24" :lg="12">
|
|
|
- <a-alert type="warning" style="text-align: center;">
|
|
|
- <template slot="message">
|
|
|
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
- {{ i18n "pages.xray.ipv4ConfigsDesc" }}
|
|
|
- </template>
|
|
|
- </a-alert>
|
|
|
- </a-row>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.GoogleIPv4"}}' desc='{{ i18n "pages.xray.GoogleIPv4Desc"}}' v-model="GoogleIPv4Settings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.NetflixIPv4"}}' desc='{{ i18n "pages.xray.NetflixIPv4Desc"}}' v-model="NetflixIPv4Settings"></setting-list-item>
|
|
|
- </a-collapse-panel>
|
|
|
- <a-collapse-panel header='{{ i18n "pages.xray.warpConfigs"}}'>
|
|
|
- <a-row :xs="24" :sm="24" :lg="12">
|
|
|
- <a-alert type="warning" style="text-align: center;">
|
|
|
- <template slot="message">
|
|
|
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
- {{ i18n "pages.xray.warpConfigsDesc" }}
|
|
|
- </template>
|
|
|
- </a-alert>
|
|
|
- </a-row>
|
|
|
- <template v-if="WarpExist">
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.GoogleWARP"}}' desc='{{ i18n "pages.xray.GoogleWARPDesc"}}' v-model="GoogleWARPSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.OpenAIWARP"}}' desc='{{ i18n "pages.xray.OpenAIWARPDesc"}}' v-model="OpenAIWARPSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.NetflixWARP"}}' desc='{{ i18n "pages.xray.NetflixWARPDesc"}}' v-model="NetflixWARPSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.SpotifyWARP"}}' desc='{{ i18n "pages.xray.SpotifyWARPDesc"}}' v-model="SpotifyWARPSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.MetaWARP"}}' desc='{{ i18n "pages.xray.MetaWARPDesc"}}' v-model="MetaWARPSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.AppleWARP"}}' desc='{{ i18n "pages.xray.AppleWARPDesc"}}' v-model="AppleWARPSettings"></setting-list-item>
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.RedditWARP"}}' desc='{{ i18n "pages.xray.RedditWARPDesc"}}' v-model="RedditWARPSettings"></setting-list-item>
|
|
|
- </template>
|
|
|
- <a-button v-else type="primary" icon="cloud" style="margin: 15px 20px;" @click="showWarp()">WARP</a-button>
|
|
|
- </a-collapse-panel>
|
|
|
- <a-collapse-panel header='{{ i18n "pages.settings.resetDefaultConfig"}}'>
|
|
|
- <a-space direction="horizontal" style="padding: 0 20px">
|
|
|
- <a-button type="danger" @click="resetXrayConfigToDefault">{{ i18n "pages.settings.resetDefaultConfig" }}</a-button>
|
|
|
- </a-space>
|
|
|
- </a-collapse-panel>
|
|
|
- </a-collapse>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="tpl-routing" tab='{{ i18n "pages.xray.Routings"}}' style="padding-top: 20px;">
|
|
|
- <a-button type="primary" icon="plus" @click="addRule">{{ i18n "pages.xray.rules.add" }}</a-button>
|
|
|
- <a-table-sortable :columns="isMobile ? rulesMobileColumns : rulesColumns" bordered
|
|
|
- :row-key="r => r.key"
|
|
|
- :data-source="routingRuleData"
|
|
|
- :scroll="isMobile ? {} : { x: 1000 }"
|
|
|
- :pagination="false"
|
|
|
- :indent-size="0"
|
|
|
- :style="isMobile ? 'padding: 5px 0' : 'margin-top: 10px;'"
|
|
|
- v-on:onSort="replaceRule">
|
|
|
- <template slot="action" slot-scope="text, rule, index">
|
|
|
- <table-sort-trigger :item-index="index"></table-sort-trigger>
|
|
|
- <span class="ant-table-row-index">
|
|
|
- [[ index+1 ]]
|
|
|
- </span>
|
|
|
- <a-dropdown :trigger="['click']">
|
|
|
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
- <a-menu-item v-if="index>0" @click="replaceRule(index,0)">
|
|
|
- <a-icon type="vertical-align-top"></a-icon>
|
|
|
- {{ i18n "pages.xray.rules.first"}}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item v-if="index>0" @click="replaceRule(index,index-1)">
|
|
|
- <a-icon type="arrow-up"></a-icon>
|
|
|
- {{ i18n "pages.xray.rules.up"}}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item v-if="index<routingRuleData.length-1" @click="replaceRule(index,index+1)">
|
|
|
- <a-icon type="arrow-down"></a-icon>
|
|
|
- {{ i18n "pages.xray.rules.down"}}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item v-if="index<routingRuleData.length-1" @click="replaceRule(index,routingRuleData.length-1)">
|
|
|
- <a-icon type="vertical-align-bottom"></a-icon>
|
|
|
- {{ i18n "pages.xray.rules.last"}}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="editRule(index)">
|
|
|
- <a-icon type="edit"></a-icon>
|
|
|
- {{ i18n "edit" }}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="deleteRule(index)">
|
|
|
- <span style="color: #FF4D4F">
|
|
|
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
- </span>
|
|
|
- </a-menu-item>
|
|
|
- </a-menu>
|
|
|
- </a-dropdown>
|
|
|
- </template>
|
|
|
- <template slot="inbound" slot-scope="text, rule, index">
|
|
|
- <a-popover :overlay-class-name="themeSwitcher.currentTheme">
|
|
|
- <template slot="content">
|
|
|
- <p v-if="rule.inboundTag">Inbound Tag: [[ rule.inboundTag ]]</p>
|
|
|
- <p v-if="rule.user">User email: [[ rule.user ]]</p>
|
|
|
- </template>
|
|
|
- [[ [rule.inboundTag,rule.user].join('\n') ]]
|
|
|
- </a-popover>
|
|
|
- </template>
|
|
|
- <template slot="outbound" slot-scope="text, rule, index">
|
|
|
- <a-popover :overlay-class-name="themeSwitcher.currentTheme">
|
|
|
- <template slot="content">
|
|
|
- <p v-if="rule.outboundTag">Outbound Tag: [[ rule.outboundTag ]]</p>
|
|
|
- </template>
|
|
|
- [[ rule.outboundTag ]]
|
|
|
- </a-popover>
|
|
|
- </template>
|
|
|
- <template slot="balancer" slot-scope="text, rule, index">
|
|
|
- <a-popover :overlay-class-name="themeSwitcher.currentTheme">
|
|
|
- <template slot="content">
|
|
|
- <p v-if="rule.balancerTag">Balancer Tag: [[ rule.balancerTag ]]</p>
|
|
|
- </template>
|
|
|
- [[ rule.balancerTag ]]
|
|
|
- </a-popover>
|
|
|
- </template>
|
|
|
- <template slot="info" slot-scope="text, rule, index">
|
|
|
- <a-popover placement="bottomRight"
|
|
|
- v-if="(rule.source+rule.sourcePort+rule.network+rule.protocol+rule.attrs+rule.ip+rule.domain+rule.port).length>0"
|
|
|
- :overlay-class-name="themeSwitcher.currentTheme" trigger="click">
|
|
|
- <template slot="content">
|
|
|
- <table cellpadding="2" style="max-width: 300px;">
|
|
|
- <tr v-if="rule.source">
|
|
|
- <td>Source</td>
|
|
|
- <td><a-tag color="blue" v-for="r in rule.source.split(',')">[[ r ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- <tr v-if="rule.sourcePort">
|
|
|
- <td>Source Port</td>
|
|
|
- <td><a-tag color="green" v-for="r in rule.sourcePort.split(',')">[[ r ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- <tr v-if="rule.network">
|
|
|
- <td>Network</td>
|
|
|
- <td><a-tag color="blue" v-for="r in rule.network.split(',')">[[ r ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- <tr v-if="rule.protocol">
|
|
|
- <td>Protocol</td>
|
|
|
- <td><a-tag color="green" v-for="r in rule.protocol.split(',')">[[ r ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- <tr v-if="rule.attrs">
|
|
|
- <td>Attrs</td>
|
|
|
- <td><a-tag color="blue" v-for="r in rule.attrs.split(',')">[[ r ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- <tr v-if="rule.ip">
|
|
|
- <td>IP</td>
|
|
|
- <td><a-tag color="green" v-for="r in rule.ip.split(',')">[[ r ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- <tr v-if="rule.domain">
|
|
|
- <td>Domain</td>
|
|
|
- <td><a-tag color="blue" v-for="r in rule.domain.split(',')">[[ r ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- <tr v-if="rule.port">
|
|
|
- <td>Port</td>
|
|
|
- <td><a-tag color="green" v-for="r in rule.port.split(',')">[[ r ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- <tr v-if="rule.balancerTag">
|
|
|
- <td>Balancer Tag</td>
|
|
|
- <td><a-tag color="blue">[[ rule.balancerTag ]]</a-tag></td>
|
|
|
- </tr>
|
|
|
- </table>
|
|
|
- </template>
|
|
|
- <a-button shape="round" size="small" style="font-size: 14px; padding: 0 10px;">
|
|
|
- <a-icon type="info"></a-icon>
|
|
|
- </a-button>
|
|
|
- </a-popover>
|
|
|
- </template>
|
|
|
- </a-table-sortable>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="tpl-outbound" tab='{{ i18n "pages.xray.Outbounds"}}' style="padding-top: 20px;" force-render="true">
|
|
|
- <a-row>
|
|
|
- <a-col :xs="12" :sm="12" :lg="12">
|
|
|
- <a-button type="primary" icon="plus" @click="addOutbound()" style="margin-bottom: 10px;">{{ i18n
|
|
|
- "pages.xray.outbound.addOutbound" }}</a-button>
|
|
|
- <a-button type="primary" icon="cloud" @click="showWarp()" style="margin-bottom: 10px;">WARP</a-button>
|
|
|
- </a-col>
|
|
|
- <a-col :xs="12" :sm="12" :lg="12" style="text-align: right;">
|
|
|
- <a-icon type="sync" :spin="refreshing" @click="refreshOutboundTraffic()" style="margin: 0 5px;"></a-icon>
|
|
|
- <a-popconfirm placement="topRight" @confirm="resetOutboundTraffic(-1)"
|
|
|
- title='{{ i18n "pages.inbounds.resetTrafficContent"}}'
|
|
|
- :overlay-class-name="themeSwitcher.currentTheme"
|
|
|
- ok-text='{{ i18n "reset"}}'
|
|
|
- cancel-text='{{ i18n "cancel"}}'>
|
|
|
- <a-icon slot="icon" type="question-circle-o" :style="themeSwitcher.isDarkTheme ? 'color: #008771' : 'color: #008771'"></a-icon>
|
|
|
- <a-icon type="retweet" style="cursor: pointer;"></a-icon>
|
|
|
- </a-popconfirm>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-table :columns="outboundColumns" bordered
|
|
|
- :row-key="r => r.key"
|
|
|
- :data-source="outboundData"
|
|
|
- :scroll="isMobile ? {} : { x: 200 }"
|
|
|
- :pagination="false"
|
|
|
- :indent-size="0"
|
|
|
- :style="isMobile ? 'padding: 5px 5px' : 'margin-right: 1px;'">
|
|
|
- <template slot="action" slot-scope="text, outbound, index">
|
|
|
- [[ index+1 ]]
|
|
|
- <a-dropdown :trigger="['click']">
|
|
|
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
- <a-menu-item v-if="index>0" @click="setFirstOutbound(index)">
|
|
|
- <a-icon type="vertical-align-top"></a-icon>
|
|
|
- {{ i18n "pages.xray.rules.first"}}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="editOutbound(index)">
|
|
|
- <a-icon type="edit"></a-icon>
|
|
|
- {{ i18n "edit" }}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="resetOutboundTraffic(index)">
|
|
|
- <span>
|
|
|
- <a-icon type="retweet"></a-icon> {{ i18n "pages.inbounds.resetTraffic"}}
|
|
|
- </span>
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="deleteOutbound(index)">
|
|
|
- <span style="color: #FF4D4F">
|
|
|
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
- </span>
|
|
|
- </a-menu-item>
|
|
|
- </a-menu>
|
|
|
- </a-dropdown>
|
|
|
- </template>
|
|
|
- <template slot="address" slot-scope="text, outbound, index">
|
|
|
- <p style="margin: 0 5px;" v-for="addr in findOutboundAddress(outbound)">[[ addr ]]</p>
|
|
|
- </template>
|
|
|
- <template slot="protocol" slot-scope="text, outbound, index">
|
|
|
- <a-tag style="margin:0;" color="purple">[[ outbound.protocol ]]</a-tag>
|
|
|
- <template v-if="[Protocols.VMess, Protocols.VLESS, Protocols.Trojan, Protocols.Shadowsocks].includes(outbound.protocol)">
|
|
|
- <a-tag style="margin:0;" color="blue">[[ outbound.streamSettings.network ]]</a-tag>
|
|
|
- <a-tag style="margin:0;" v-if="outbound.streamSettings.security=='tls'" color="green">tls</a-tag>
|
|
|
- <a-tag style="margin:0;" v-if="outbound.streamSettings.security=='reality'" color="green">reality</a-tag>
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- <template slot="traffic" slot-scope="text, outbound, index">
|
|
|
- <a-tag color="green">[[ findOutboundTraffic(outbound) ]]</a-tag>
|
|
|
- </template>
|
|
|
- </a-table>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="tpl-reverse" tab='{{ i18n "pages.xray.outbound.reverse"}}' style="padding-top: 20px;" force-render="true">
|
|
|
- <a-button type="primary" icon="plus" @click="addReverse()" style="margin-bottom: 10px;">{{ i18n "pages.xray.outbound.addReverse" }}</a-button>
|
|
|
- <a-table :columns="reverseColumns" bordered v-if="reverseData.length>0"
|
|
|
- :row-key="r => r.key"
|
|
|
- :data-source="reverseData"
|
|
|
- :scroll="isMobile ? {} : { x: 200 }"
|
|
|
- :pagination="false"
|
|
|
- :indent-size="0"
|
|
|
- :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
|
|
|
- <template slot="action" slot-scope="text, reverse, index">
|
|
|
- [[ index+1 ]]
|
|
|
- <a-dropdown :trigger="['click']">
|
|
|
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
- <a-menu-item @click="editReverse(index)">
|
|
|
- <a-icon type="edit"></a-icon>
|
|
|
- {{ i18n "edit" }}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="deleteReverse(index)">
|
|
|
- <span style="color: #FF4D4F">
|
|
|
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
- </span>
|
|
|
- </a-menu-item>
|
|
|
- </a-menu>
|
|
|
- </a-dropdown>
|
|
|
- </template>
|
|
|
- </a-table>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="tpl-balancer" tab='{{ i18n "pages.xray.Balancers"}}' style="padding-top: 20px;" force-render="true">
|
|
|
- <a-button type="primary" icon="plus" @click="addBalancer()" style="margin-bottom: 10px;">{{ i18n "pages.xray.balancer.addBalancer"}}</a-button>
|
|
|
- <a-table :columns="balancerColumns" bordered v-if="balancersData.length>0"
|
|
|
- :row-key="r => r.key"
|
|
|
- :data-source="balancersData"
|
|
|
- :scroll="isMobile ? {} : { x: 200 }"
|
|
|
- :pagination="false"
|
|
|
- :indent-size="0"
|
|
|
- :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
|
|
|
- <template slot="action" slot-scope="text, balancer, index">
|
|
|
- [[ index+1 ]]
|
|
|
- <a-dropdown :trigger="['click']">
|
|
|
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
- <a-menu-item @click="editBalancer(index)">
|
|
|
- <a-icon type="edit"></a-icon>
|
|
|
- {{ i18n "edit" }}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="deleteBalancer(index)">
|
|
|
- <span style="color: #FF4D4F">
|
|
|
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
- </span>
|
|
|
- </a-menu-item>
|
|
|
- </a-menu>
|
|
|
- </a-dropdown>
|
|
|
- </template>
|
|
|
- <template slot="strategy" slot-scope="text, balancer, index">
|
|
|
- <a-tag style="margin:0;" v-if="balancer.strategy=='random'" color="purple">Random</a-tag>
|
|
|
- <a-tag style="margin:0;" v-if="balancer.strategy=='roundRobin'" color="green">Round Robin</a-tag>
|
|
|
- <a-tag style="margin:0;" v-if="balancer.strategy=='leastload'" color="green">Least Load</a-tag>
|
|
|
- <a-tag style="margin:0;" v-if="balancer.strategy=='leastping'" color="green">Least Ping</a-tag>
|
|
|
- </template>
|
|
|
- <template slot="selector" slot-scope="text, balancer, index">
|
|
|
- <a-tag class="info-large-tag" style="margin:1;" v-for="sel in balancer.selector">[[ sel ]]</a-tag>
|
|
|
- </template>
|
|
|
- </a-table>
|
|
|
- <a-radio-group
|
|
|
- v-model="obsSettings"
|
|
|
- v-if="observatoryEnable || burstObservatoryEnable"
|
|
|
- @change="changeObsCode"
|
|
|
- button-style="solid"
|
|
|
- style="margin: 10px 0;"
|
|
|
- :size="isMobile ? 'small' : ''">
|
|
|
- <a-radio-button value="observatory" v-if="observatoryEnable">Observatory</a-radio-button>
|
|
|
- <a-radio-button value="burstObservatory" v-if="burstObservatoryEnable">Burst Observatory</a-radio-button>
|
|
|
- </a-radio-group>
|
|
|
- <textarea style="position:absolute; left: -800px;" id="obsSetting"></textarea>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="tpl-dns" tab='DNS' style="padding-top: 20px;" force-render="true">
|
|
|
- <setting-list-item type="switch" title='{{ i18n "pages.xray.dns.enable" }}' desc='{{ i18n "pages.xray.dns.enableDesc" }}' v-model="enableDNS"></setting-list-item>
|
|
|
- <template v-if="enableDNS">
|
|
|
- <setting-list-item type="text" title='{{ i18n "pages.xray.dns.tag" }}' desc='{{ i18n "pages.xray.dns.tagDesc" }}' v-model="dnsTag"></setting-list-item>
|
|
|
- <a-list-item>
|
|
|
- <a-row style="padding: 20px">
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <a-list-item-meta title='{{ i18n "pages.xray.dns.strategy" }}' description='{{ i18n "pages.xray.dns.strategyDesc" }}' />
|
|
|
- </a-col>
|
|
|
- <a-col :lg="24" :xl="12">
|
|
|
- <a-select
|
|
|
- v-model="dnsStrategy"
|
|
|
- style="width: 100%"
|
|
|
- :dropdown-class-name="themeSwitcher.currentTheme">
|
|
|
- <a-select-option :value="l" :label="l" v-for="l in ['UseIP', 'UseIPv4', 'UseIPv6']">
|
|
|
- [[ l ]]
|
|
|
- </a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-list-item>
|
|
|
- <a-divider>DNS</a-divider>
|
|
|
- <a-button type="primary" icon="plus" @click="addDNSServer()" style="margin-bottom: 10px;">{{ i18n "pages.xray.dns.add" }}</a-button>
|
|
|
- <a-table :columns="dnsColumns" bordered v-if="dnsServers.length>0"
|
|
|
- :row-key="r => r.key"
|
|
|
- :data-source="dnsServers"
|
|
|
- :scroll="isMobile ? {} : { x: 200 }"
|
|
|
- :pagination="false"
|
|
|
- :indent-size="0"
|
|
|
- :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
|
|
|
- <template slot="action" slot-scope="text,dns,index">
|
|
|
- [[ index+1 ]]
|
|
|
- <a-dropdown :trigger="['click']">
|
|
|
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
- <a-menu-item @click="editDNSServer(index)">
|
|
|
- <a-icon type="edit"></a-icon>
|
|
|
- {{ i18n "edit" }}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="deleteDNSServer(index)">
|
|
|
- <span style="color: #FF4D4F">
|
|
|
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
- </span>
|
|
|
- </a-menu-item>
|
|
|
- </a-menu>
|
|
|
- </a-dropdown>
|
|
|
- </template>
|
|
|
- <template slot="address" slot-scope="dns,index">
|
|
|
- <span v-if="typeof dns == 'object'">[[ dns.address ]]</span>
|
|
|
- <span v-else>[[ dns ]]</span>
|
|
|
- </template>
|
|
|
- <template slot="domain" slot-scope="dns,index">
|
|
|
- <span v-if="typeof dns == 'object'">[[ dns.domains.join(",") ]]</span>
|
|
|
- </template>
|
|
|
- </a-table>
|
|
|
- <a-divider>Fake DNS</a-divider>
|
|
|
- <a-button type="primary" icon="plus" @click="addFakedns()" style="margin-bottom: 10px;">{{ i18n "pages.xray.fakedns.add" }}</a-button>
|
|
|
- <a-table :columns="fakednsColumns" bordered v-if="fakeDns && fakeDns.length>0" :row-key="r => r.key"
|
|
|
- :data-source="fakeDns" :scroll="isMobile ? {} : { x: 200 }" :pagination="false" :indent-size="0"
|
|
|
- :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
|
|
|
- <template slot="action" slot-scope="text,fakedns,index">
|
|
|
- [[ index+1 ]]
|
|
|
- <a-dropdown :trigger="['click']">
|
|
|
- <a-icon @click="e => e.preventDefault()" type="more"
|
|
|
- style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
- <a-menu-item @click="editFakedns(index)">
|
|
|
- <a-icon type="edit"></a-icon>
|
|
|
- {{ i18n "edit" }}
|
|
|
- </a-menu-item>
|
|
|
- <a-menu-item @click="deleteFakedns(index)">
|
|
|
- <span style="color: #FF4D4F">
|
|
|
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
- </span>
|
|
|
- </a-menu-item>
|
|
|
- </a-menu>
|
|
|
- </a-dropdown>
|
|
|
- </template>
|
|
|
- </a-table>
|
|
|
- </template>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="tpl-advanced" tab='{{ i18n "pages.xray.advancedTemplate"}}' style="padding-top: 20px;" force-render="true">
|
|
|
- <a-list-item-meta title='{{ i18n "pages.xray.Template"}}' description='{{ i18n "pages.xray.TemplateDesc"}}'></a-list-item-meta>
|
|
|
- <a-radio-group v-model="advSettings" @change="changeCode" button-style="solid" style="margin: 10px 0;" :size="isMobile ? 'small' : ''">
|
|
|
- <a-radio-button value="xraySetting">{{ i18n "pages.xray.completeTemplate"}}</a-radio-button>
|
|
|
- <a-radio-button value="inboundSettings">{{ i18n "pages.xray.Inbounds" }}</a-radio-button>
|
|
|
- <a-radio-button value="outboundSettings">{{ i18n "pages.xray.Outbounds" }}</a-radio-button>
|
|
|
- <a-radio-button value="routingRuleSettings">{{ i18n "pages.xray.Routings" }}</a-radio-button>
|
|
|
- </a-radio-group>
|
|
|
- <textarea style="position:absolute; left: -800px;" id="xraySetting"></textarea>
|
|
|
- </a-tab-pane>
|
|
|
- </a-tabs>
|
|
|
- </a-space>
|
|
|
- </a-spin>
|
|
|
- </a-layout-content>
|
|
|
+ <a-layout-content>
|
|
|
+ <a-spin :spinning="spinning" :delay="500" tip='{{ i18n "loading"}}'>
|
|
|
+ <transition name="list" appear>
|
|
|
+ <a-alert type="error" v-if="showAlert" style="margin-bottom: 10px"
|
|
|
+ message='{{ i18n "secAlertTitle" }}'
|
|
|
+ color="red"
|
|
|
+ description='{{ i18n "secAlertSsl" }}'
|
|
|
+ show-icon closable>
|
|
|
+ </a-alert>
|
|
|
+ </transition>
|
|
|
+ <a-space direction="vertical">
|
|
|
+ <a-card hoverable style="margin-bottom: .5rem;">
|
|
|
+ <a-row style="display: flex; flex-wrap: wrap; align-items: center;">
|
|
|
+ <a-col :xs="24" :sm="10" style="padding: 4px;">
|
|
|
+ <a-space direction="horizontal">
|
|
|
+ <a-button type="primary" :disabled="saveBtnDisable" @click="updateXraySetting">{{ i18n "pages.xray.save" }}</a-button>
|
|
|
+ <a-button type="danger" :disabled="!saveBtnDisable" @click="restartXray">{{ i18n "pages.xray.restart" }}</a-button>
|
|
|
+ <a-popover v-if="restartResult"
|
|
|
+ :overlay-class-name="themeSwitcher.currentTheme">
|
|
|
+ <span slot="title" style="font-size: 12pt">Error in running xray-core</span>
|
|
|
+ <template slot="content">
|
|
|
+ <p style="max-width: 400px" v-for="line in restartResult.split('\n')">[[ line ]]</p>
|
|
|
+ </template>
|
|
|
+ <a-icon type="question-circle"></a-icon>
|
|
|
+ </a-popover>
|
|
|
+ </a-space>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="14">
|
|
|
+ <template>
|
|
|
+ <div>
|
|
|
+ <a-back-top :target="() => document.getElementById('content-layout')" visibility-height="200"></a-back-top>
|
|
|
+ <a-alert type="warning" style="float: right; width: fit-content" message='{{ i18n "pages.settings.infoDesc" }}' show-icon>
|
|
|
+ </a-alert>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-card>
|
|
|
+ <a-tabs class="ant-card-dark-box-nohover" default-active-key="1"
|
|
|
+ @change="(activeKey) => { this.changePage(activeKey); }"
|
|
|
+ :class="themeSwitcher.currentTheme">
|
|
|
+ <a-tab-pane key="tpl-basic" tab='{{ i18n "pages.xray.basicTemplate"}}' style="padding-top: 20px;">
|
|
|
+ <a-collapse>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.xray.generalConfigs"}}'>
|
|
|
+ <a-row :xs="24" :sm="24" :lg="12">
|
|
|
+ <a-alert type="warning" style="text-align: center;">
|
|
|
+ <template slot="message">
|
|
|
+ <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
+ {{ i18n "pages.xray.generalConfigsDesc" }}
|
|
|
+ </template>
|
|
|
+ </a-alert>
|
|
|
+ </a-row>
|
|
|
+ <a-list-item>
|
|
|
+ <a-row style="padding: 10px 20px">
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-list-item-meta title='{{ i18n "pages.xray.FreedomStrategy" }}'
|
|
|
+ description='{{ i18n "pages.xray.FreedomStrategyDesc" }}'>
|
|
|
+ </a-list-item-meta>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <template>
|
|
|
+ <a-select v-model="freedomStrategy" :dropdown-class-name="themeSwitcher.currentTheme"
|
|
|
+ style="width: 100%">
|
|
|
+ <a-select-option v-for="s in OutboundDomainStrategies" :value="s">[[ s ]]</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </template>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row style="padding: 10px 20px">
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-list-item-meta title='{{ i18n "pages.xray.RoutingStrategy" }}'
|
|
|
+ description='{{ i18n "pages.xray.RoutingStrategyDesc" }}'>
|
|
|
+ </a-list-item-meta>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-select v-model="routingStrategy" :dropdown-class-name="themeSwitcher.currentTheme"
|
|
|
+ style="width: 100%">
|
|
|
+ <a-select-option v-for="s in routingDomainStrategies" :value="s">[[ s ]]</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.xray.logConfigs" }}'>
|
|
|
+ <a-row :xs="24" :sm="24" :lg="12">
|
|
|
+ <a-alert type="warning" style="text-align: center;">
|
|
|
+ <template slot="message">
|
|
|
+ <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
+ {{ i18n "pages.xray.logConfigsDesc" }}
|
|
|
+ </template>
|
|
|
+ </a-alert>
|
|
|
+ </a-row>
|
|
|
+ <a-list-item>
|
|
|
+ <a-row style="padding: 10px 20px">
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-list-item-meta title='{{ i18n "pages.xray.logLevel" }}'
|
|
|
+ description='{{ i18n "pages.xray.logLevelDesc" }}'>
|
|
|
+ </a-list-item-meta>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <template>
|
|
|
+ <a-select v-model="setLogLevel" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
|
|
|
+ <a-select-option v-for="s in logLevel" :value="s">[[ s ]]</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </template>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row style="padding: 10px 20px">
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-list-item-meta title='{{ i18n "pages.xray.accessLog" }}'
|
|
|
+ description='{{ i18n "pages.xray.accessLogDesc" }}'>
|
|
|
+ </a-list-item-meta>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <template>
|
|
|
+ <a-select v-model="accessLog" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
|
|
|
+ <a-select-option v-for="s in access" :key="s" :value="s">[[ s ]]</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </template>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row style="padding: 10px 20px">
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-list-item-meta title='{{ i18n "pages.xray.errorLog" }}'
|
|
|
+ description='{{ i18n "pages.xray.errorLogDesc" }}'>
|
|
|
+ </a-list-item-meta>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <template>
|
|
|
+ <a-select v-model="errorLog" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
|
|
|
+ <a-select-option v-for="s in error" :key="s" :value="s">[[ s ]]</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </template>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.xray.blockConfigs"}}'>
|
|
|
+ <a-row :xs="24" :sm="24" :lg="12">
|
|
|
+ <a-alert type="warning" style="text-align: center;">
|
|
|
+ <template slot="message">
|
|
|
+ <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
+ {{ i18n "pages.xray.blockConfigsDesc" }}
|
|
|
+ </template>
|
|
|
+ </a-alert>
|
|
|
+ </a-row>
|
|
|
+ <a-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.Torrent"}}' desc='{{ i18n "pages.xray.TorrentDesc"}}' v-model="torrentSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.PrivateIp"}}' desc='{{ i18n "pages.xray.PrivateIpDesc"}}' v-model="privateIpSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.Ads"}}' desc='{{ i18n "pages.xray.AdsDesc"}}' v-model="AdsSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.Family"}}' desc='{{ i18n "pages.xray.FamilyDesc"}}' v-model="familyProtectSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.Security"}}' desc='{{ i18n "pages.xray.SecurityDesc"}}' v-model="SecuritySettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.Speedtest"}}' desc='{{ i18n "pages.xray.SpeedtestDesc"}}' v-model="SpeedTestSettings"></setting-list-item>
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.xray.blockCountryConfigs"}}'>
|
|
|
+ <a-row :xs="24" :sm="24" :lg="12">
|
|
|
+ <a-alert type="warning" style="text-align: center;">
|
|
|
+ <template slot="message">
|
|
|
+ <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
+ {{ i18n "pages.xray.blockCountryConfigsDesc" }}
|
|
|
+ </template>
|
|
|
+ </a-alert>
|
|
|
+ </a-row>
|
|
|
+ <a-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.IRIp"}}' desc='{{ i18n "pages.xray.IRIpDesc"}}' v-model="IRIpSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.IRDomain"}}' desc='{{ i18n "pages.xray.IRDomainDesc"}}' v-model="IRDomainSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.ChinaIp"}}' desc='{{ i18n "pages.xray.ChinaIpDesc"}}' v-model="ChinaIpSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.ChinaDomain"}}' desc='{{ i18n "pages.xray.ChinaDomainDesc"}}' v-model="ChinaDomainSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.RussiaIp"}}' desc='{{ i18n "pages.xray.RussiaIpDesc"}}' v-model="RussiaIpSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.RussiaDomain"}}' desc='{{ i18n "pages.xray.RussiaDomainDesc"}}' v-model="RussiaDomainSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.VNIp"}}' desc='{{ i18n "pages.xray.VNIpDesc"}}' v-model="VNIpSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.VNDomain"}}' desc='{{ i18n "pages.xray.VNDomainDesc"}}' v-model="VNDomainSettings"></setting-list-item>
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.xray.directCountryConfigs"}}'>
|
|
|
+ <a-row :xs="24" :sm="24" :lg="12">
|
|
|
+ <a-alert type="warning" style="text-align: center;">
|
|
|
+ <template slot="message">
|
|
|
+ <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
+ {{ i18n "pages.xray.directCountryConfigsDesc" }}
|
|
|
+ </template>
|
|
|
+ </a-alert>
|
|
|
+ </a-row>
|
|
|
+ <a-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectIRIp"}}' desc='{{ i18n "pages.xray.DirectIRIpDesc"}}' v-model="IRIpDirectSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectIRDomain"}}' desc='{{ i18n "pages.xray.DirectIRDomainDesc"}}' v-model="IRDomainDirectSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectChinaIp"}}' desc='{{ i18n "pages.xray.DirectChinaIpDesc"}}' v-model="ChinaIpDirectSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectChinaDomain"}}' desc='{{ i18n "pages.xray.DirectChinaDomainDesc"}}' v-model="ChinaDomainDirectSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectRussiaIp"}}' desc='{{ i18n "pages.xray.DirectRussiaIpDesc"}}' v-model="RussiaIpDirectSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectRussiaDomain"}}' desc='{{ i18n "pages.xray.DirectRussiaDomainDesc"}}' v-model="RussiaDomainDirectSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectVNIp"}}' desc='{{ i18n "pages.xray.DirectVNIpDesc"}}' v-model="VNIpDirectSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectVNDomain"}}' desc='{{ i18n "pages.xray.DirectVNDomainDesc"}}' v-model="VNDomainDirectSettings"></setting-list-item>
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.xray.ipv4Configs"}}'>
|
|
|
+ <a-row :xs="24" :sm="24" :lg="12">
|
|
|
+ <a-alert type="warning" style="text-align: center;">
|
|
|
+ <template slot="message">
|
|
|
+ <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
+ {{ i18n "pages.xray.ipv4ConfigsDesc" }}
|
|
|
+ </template>
|
|
|
+ </a-alert>
|
|
|
+ </a-row>
|
|
|
+ <a-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.GoogleIPv4"}}' desc='{{ i18n "pages.xray.GoogleIPv4Desc"}}' v-model="GoogleIPv4Settings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.NetflixIPv4"}}' desc='{{ i18n "pages.xray.NetflixIPv4Desc"}}' v-model="NetflixIPv4Settings"></setting-list-item>
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.xray.warpConfigs"}}'>
|
|
|
+ <a-row :xs="24" :sm="24" :lg="12">
|
|
|
+ <a-alert type="warning" style="text-align: center;">
|
|
|
+ <template slot="message">
|
|
|
+ <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
|
|
+ {{ i18n "pages.xray.warpConfigsDesc" }}
|
|
|
+ </template>
|
|
|
+ </a-alert>
|
|
|
+ </a-row>
|
|
|
+ <a-list-item>
|
|
|
+ <template v-if="WarpExist">
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.GoogleWARP"}}' desc='{{ i18n "pages.xray.GoogleWARPDesc"}}' v-model="GoogleWARPSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.OpenAIWARP"}}' desc='{{ i18n "pages.xray.OpenAIWARPDesc"}}' v-model="OpenAIWARPSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.NetflixWARP"}}' desc='{{ i18n "pages.xray.NetflixWARPDesc"}}' v-model="NetflixWARPSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.SpotifyWARP"}}' desc='{{ i18n "pages.xray.SpotifyWARPDesc"}}' v-model="SpotifyWARPSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.MetaWARP"}}' desc='{{ i18n "pages.xray.MetaWARPDesc"}}' v-model="MetaWARPSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.AppleWARP"}}' desc='{{ i18n "pages.xray.AppleWARPDesc"}}' v-model="AppleWARPSettings"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.RedditWARP"}}' desc='{{ i18n "pages.xray.RedditWARPDesc"}}' v-model="RedditWARPSettings"></setting-list-item>
|
|
|
+ </template>
|
|
|
+ <a-button style="margin-left: 20px;" v-else type="primary" icon="cloud" @click="showWarp()">WARP</a-button>
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.settings.resetDefaultConfig"}}'>
|
|
|
+ <a-space direction="horizontal" style="padding: 0 20px">
|
|
|
+ <a-button type="danger" @click="resetXrayConfigToDefault">{{ i18n "pages.settings.resetDefaultConfig" }}</a-button>
|
|
|
+ </a-space>
|
|
|
+ </a-collapse-panel>
|
|
|
+ </a-collapse>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="tpl-routing" tab='{{ i18n "pages.xray.Routings"}}' style="padding-top: 20px;">
|
|
|
+ <a-button type="primary" icon="plus" @click="addRule">{{ i18n "pages.xray.rules.add" }}</a-button>
|
|
|
+ <a-table-sortable :columns="isMobile ? rulesMobileColumns : rulesColumns" bordered
|
|
|
+ :row-key="r => r.key"
|
|
|
+ :data-source="routingRuleData"
|
|
|
+ :scroll="isMobile ? {} : { x: 1000 }"
|
|
|
+ :pagination="false"
|
|
|
+ :indent-size="0"
|
|
|
+ :style="isMobile ? 'padding: 5px 0' : 'margin-top: 10px;'"
|
|
|
+ v-on:onSort="replaceRule">
|
|
|
+ <template slot="action" slot-scope="text, rule, index">
|
|
|
+ <table-sort-trigger :item-index="index"></table-sort-trigger>
|
|
|
+ <span class="ant-table-row-index"> [[ index+1 ]] </span>
|
|
|
+ <a-dropdown :trigger="['click']">
|
|
|
+ <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
+ <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
+ <a-menu-item v-if="index>0" @click="replaceRule(index,0)">
|
|
|
+ <a-icon type="vertical-align-top"></a-icon>
|
|
|
+ {{ i18n "pages.xray.rules.first"}}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item v-if="index>0" @click="replaceRule(index,index-1)">
|
|
|
+ <a-icon type="arrow-up"></a-icon>
|
|
|
+ {{ i18n "pages.xray.rules.up"}}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item v-if="index<routingRuleData.length-1" @click="replaceRule(index,index+1)">
|
|
|
+ <a-icon type="arrow-down"></a-icon>
|
|
|
+ {{ i18n "pages.xray.rules.down"}}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item v-if="index<routingRuleData.length-1" @click="replaceRule(index,routingRuleData.length-1)">
|
|
|
+ <a-icon type="vertical-align-bottom"></a-icon>
|
|
|
+ {{ i18n "pages.xray.rules.last"}}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="editRule(index)">
|
|
|
+ <a-icon type="edit"></a-icon>
|
|
|
+ {{ i18n "edit" }}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="deleteRule(index)">
|
|
|
+ <span style="color: #FF4D4F">
|
|
|
+ <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
+ </span>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+ <template slot="inbound" slot-scope="text, rule, index">
|
|
|
+ <a-popover :overlay-class-name="themeSwitcher.currentTheme">
|
|
|
+ <template slot="content">
|
|
|
+ <p v-if="rule.inboundTag">Inbound Tag: [[ rule.inboundTag ]]</p>
|
|
|
+ <p v-if="rule.user">User email: [[ rule.user ]]</p>
|
|
|
+ </template>
|
|
|
+ [[ [rule.inboundTag,rule.user].join('\n') ]]
|
|
|
+ </a-popover>
|
|
|
+ </template>
|
|
|
+ <template slot="outbound" slot-scope="text, rule, index">
|
|
|
+ <a-popover :overlay-class-name="themeSwitcher.currentTheme">
|
|
|
+ <template slot="content">
|
|
|
+ <p v-if="rule.outboundTag">Outbound Tag: [[ rule.outboundTag ]]</p>
|
|
|
+ </template>
|
|
|
+ [[ rule.outboundTag ]]
|
|
|
+ </a-popover>
|
|
|
+ </template>
|
|
|
+ <template slot="balancer" slot-scope="text, rule, index">
|
|
|
+ <a-popover :overlay-class-name="themeSwitcher.currentTheme">
|
|
|
+ <template slot="content">
|
|
|
+ <p v-if="rule.balancerTag">Balancer Tag: [[ rule.balancerTag ]]</p>
|
|
|
+ </template>
|
|
|
+ [[ rule.balancerTag ]]
|
|
|
+ </a-popover>
|
|
|
+ </template>
|
|
|
+ <template slot="info" slot-scope="text, rule, index">
|
|
|
+ <a-popover placement="bottomRight"
|
|
|
+ v-if="(rule.source+rule.sourcePort+rule.network+rule.protocol+rule.attrs+rule.ip+rule.domain+rule.port).length>0"
|
|
|
+ :overlay-class-name="themeSwitcher.currentTheme" trigger="click">
|
|
|
+ <template slot="content">
|
|
|
+ <table cellpadding="2" style="max-width: 300px;">
|
|
|
+ <tr v-if="rule.source">
|
|
|
+ <td>Source</td>
|
|
|
+ <td><a-tag color="blue" v-for="r in rule.source.split(',')">[[ r ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="rule.sourcePort">
|
|
|
+ <td>Source Port</td>
|
|
|
+ <td><a-tag color="green" v-for="r in rule.sourcePort.split(',')">[[ r ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="rule.network">
|
|
|
+ <td>Network</td>
|
|
|
+ <td><a-tag color="blue" v-for="r in rule.network.split(',')">[[ r ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="rule.protocol">
|
|
|
+ <td>Protocol</td>
|
|
|
+ <td><a-tag color="green" v-for="r in rule.protocol.split(',')">[[ r ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="rule.attrs">
|
|
|
+ <td>Attrs</td>
|
|
|
+ <td><a-tag color="blue" v-for="r in rule.attrs.split(',')">[[ r ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="rule.ip">
|
|
|
+ <td>IP</td>
|
|
|
+ <td><a-tag color="green" v-for="r in rule.ip.split(',')">[[ r ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="rule.domain">
|
|
|
+ <td>Domain</td>
|
|
|
+ <td><a-tag color="blue" v-for="r in rule.domain.split(',')">[[ r ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="rule.port">
|
|
|
+ <td>Port</td>
|
|
|
+ <td><a-tag color="green" v-for="r in rule.port.split(',')">[[ r ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="rule.balancerTag">
|
|
|
+ <td>Balancer Tag</td>
|
|
|
+ <td><a-tag color="blue">[[ rule.balancerTag ]]</a-tag></td>
|
|
|
+ </tr>
|
|
|
+ </table>
|
|
|
+ </template>
|
|
|
+ <a-button shape="round" size="small" style="font-size: 14px; padding: 0 10px;">
|
|
|
+ <a-icon type="info"></a-icon>
|
|
|
+ </a-button>
|
|
|
+ </a-popover>
|
|
|
+ </template>
|
|
|
+ </a-table-sortable>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="tpl-outbound" tab='{{ i18n "pages.xray.Outbounds"}}' style="padding-top: 20px;" force-render="true">
|
|
|
+ <a-row>
|
|
|
+ <a-col :xs="12" :sm="12" :lg="12">
|
|
|
+ <a-button type="primary" icon="plus" @click="addOutbound()" style="margin-bottom: 10px;">
|
|
|
+ {{ i18n "pages.xray.outbound.addOutbound" }}
|
|
|
+ </a-button>
|
|
|
+ <a-button type="primary" icon="cloud" @click="showWarp()" style="margin-bottom: 10px;">WARP</a-button>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="12" :sm="12" :lg="12" style="text-align: right;">
|
|
|
+ <a-icon type="sync" :spin="refreshing" @click="refreshOutboundTraffic()" style="margin: 0 5px;"></a-icon>
|
|
|
+ <a-popconfirm placement="topRight" @confirm="resetOutboundTraffic(-1)"
|
|
|
+ title='{{ i18n "pages.inbounds.resetTrafficContent"}}'
|
|
|
+ :overlay-class-name="themeSwitcher.currentTheme"
|
|
|
+ ok-text='{{ i18n "reset"}}'
|
|
|
+ cancel-text='{{ i18n "cancel"}}'>
|
|
|
+ <a-icon slot="icon" type="question-circle-o" :style="themeSwitcher.isDarkTheme ? 'color: #008771' : 'color: #008771'"></a-icon>
|
|
|
+ <a-icon type="retweet" style="cursor: pointer;"></a-icon>
|
|
|
+ </a-popconfirm>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-table :columns="outboundColumns" bordered
|
|
|
+ :row-key="r => r.key"
|
|
|
+ :data-source="outboundData"
|
|
|
+ :scroll="isMobile ? {} : { x: 200 }"
|
|
|
+ :pagination="false"
|
|
|
+ :indent-size="0"
|
|
|
+ :style="isMobile ? 'padding: 5px 5px' : 'margin-right: 1px;'">
|
|
|
+ <template slot="action" slot-scope="text, outbound, index">
|
|
|
+ [[ index+1 ]]
|
|
|
+ <a-dropdown :trigger="['click']">
|
|
|
+ <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
+ <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
+ <a-menu-item v-if="index>0" @click="setFirstOutbound(index)">
|
|
|
+ <a-icon type="vertical-align-top"></a-icon>
|
|
|
+ {{ i18n "pages.xray.rules.first"}}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="editOutbound(index)">
|
|
|
+ <a-icon type="edit"></a-icon>
|
|
|
+ {{ i18n "edit" }}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="resetOutboundTraffic(index)">
|
|
|
+ <span>
|
|
|
+ <a-icon type="retweet"></a-icon> {{ i18n "pages.inbounds.resetTraffic"}}
|
|
|
+ </span>
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="deleteOutbound(index)">
|
|
|
+ <span style="color: #FF4D4F">
|
|
|
+ <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
+ </span>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+ <template slot="address" slot-scope="text, outbound, index">
|
|
|
+ <p style="margin: 0 5px;" v-for="addr in findOutboundAddress(outbound)">[[ addr ]]</p>
|
|
|
+ </template>
|
|
|
+ <template slot="protocol" slot-scope="text, outbound, index">
|
|
|
+ <a-tag style="margin:0;" color="purple">[[ outbound.protocol ]]</a-tag>
|
|
|
+ <template v-if="[Protocols.VMess, Protocols.VLESS, Protocols.Trojan, Protocols.Shadowsocks].includes(outbound.protocol)">
|
|
|
+ <a-tag style="margin:0;" color="blue">[[ outbound.streamSettings.network ]]</a-tag>
|
|
|
+ <a-tag style="margin:0;" v-if="outbound.streamSettings.security=='tls'" color="green">tls</a-tag>
|
|
|
+ <a-tag style="margin:0;" v-if="outbound.streamSettings.security=='reality'" color="green">reality</a-tag>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <template slot="traffic" slot-scope="text, outbound, index">
|
|
|
+ <a-tag color="green">[[ findOutboundTraffic(outbound) ]]</a-tag>
|
|
|
+ </template>
|
|
|
+ </a-table>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="tpl-reverse" tab='{{ i18n "pages.xray.outbound.reverse"}}' style="padding-top: 20px;" force-render="true">
|
|
|
+ <a-button type="primary" icon="plus" @click="addReverse()" style="margin-bottom: 10px;">
|
|
|
+ {{ i18n "pages.xray.outbound.addReverse" }}
|
|
|
+ </a-button>
|
|
|
+ <a-table :columns="reverseColumns" bordered v-if="reverseData.length>0"
|
|
|
+ :row-key="r => r.key"
|
|
|
+ :data-source="reverseData"
|
|
|
+ :scroll="isMobile ? {} : { x: 200 }"
|
|
|
+ :pagination="false"
|
|
|
+ :indent-size="0"
|
|
|
+ :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
|
|
|
+ <template slot="action" slot-scope="text, reverse, index">
|
|
|
+ [[ index+1 ]]
|
|
|
+ <a-dropdown :trigger="['click']">
|
|
|
+ <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
+ <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
+ <a-menu-item @click="editReverse(index)">
|
|
|
+ <a-icon type="edit"></a-icon>
|
|
|
+ {{ i18n "edit" }}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="deleteReverse(index)">
|
|
|
+ <span style="color: #FF4D4F">
|
|
|
+ <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
+ </span>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+ </a-table>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="tpl-balancer" tab='{{ i18n "pages.xray.Balancers"}}' style="padding-top: 20px;" force-render="true">
|
|
|
+ <a-button type="primary" icon="plus" @click="addBalancer()" style="margin-bottom: 10px;">
|
|
|
+ {{ i18n "pages.xray.balancer.addBalancer"}}
|
|
|
+ </a-button>
|
|
|
+ <a-table :columns="balancerColumns" bordered v-if="balancersData.length>0"
|
|
|
+ :row-key="r => r.key"
|
|
|
+ :data-source="balancersData"
|
|
|
+ :scroll="isMobile ? {} : { x: 200 }"
|
|
|
+ :pagination="false"
|
|
|
+ :indent-size="0"
|
|
|
+ :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
|
|
|
+ <template slot="action" slot-scope="text, balancer, index">
|
|
|
+ [[ index+1 ]]
|
|
|
+ <a-dropdown :trigger="['click']">
|
|
|
+ <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
+ <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
+ <a-menu-item @click="editBalancer(index)">
|
|
|
+ <a-icon type="edit"></a-icon>
|
|
|
+ {{ i18n "edit" }}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="deleteBalancer(index)">
|
|
|
+ <span style="color: #FF4D4F">
|
|
|
+ <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
+ </span>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+ <template slot="strategy" slot-scope="text, balancer, index">
|
|
|
+ <a-tag style="margin:0;" v-if="balancer.strategy=='random'" color="purple">Random</a-tag>
|
|
|
+ <a-tag style="margin:0;" v-if="balancer.strategy=='roundRobin'" color="green">Round Robin</a-tag>
|
|
|
+ <a-tag style="margin:0;" v-if="balancer.strategy=='leastLoad'" color="green">Least Load</a-tag>
|
|
|
+ <a-tag style="margin:0;" v-if="balancer.strategy=='leastPing'" color="green">Least Ping</a-tag>
|
|
|
+ </template>
|
|
|
+ <template slot="selector" slot-scope="text, balancer, index">
|
|
|
+ <a-tag class="info-large-tag" style="margin:1;" v-for="sel in balancer.selector">[[ sel ]]</a-tag>
|
|
|
+ </template>
|
|
|
+ </a-table>
|
|
|
+ <a-radio-group
|
|
|
+ v-if="observatoryEnable || burstObservatoryEnable"
|
|
|
+ v-model="obsSettings"
|
|
|
+ @change="changeObsCode"
|
|
|
+ button-style="solid"
|
|
|
+ style="margin: 10px 0;"
|
|
|
+ :size="isMobile ? 'small' : ''">
|
|
|
+ <a-radio-button value="observatory" v-if="observatoryEnable">Observatory</a-radio-button>
|
|
|
+ <a-radio-button value="burstObservatory" v-if="burstObservatoryEnable">Burst Observatory</a-radio-button>
|
|
|
+ </a-radio-group>
|
|
|
+ <textarea style="position:absolute; left: -800px;" id="obsSetting"></textarea>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="tpl-dns" tab='DNS' style="padding-top: 20px;" force-render="true">
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.dns.enable" }}' desc='{{ i18n "pages.xray.dns.enableDesc" }}' v-model="enableDNS"></setting-list-item>
|
|
|
+ <template v-if="enableDNS">
|
|
|
+ <setting-list-item type="text" title='{{ i18n "pages.xray.dns.tag" }}' desc='{{ i18n "pages.xray.dns.tagDesc" }}' v-model="dnsTag"></setting-list-item>
|
|
|
+ <a-list-item>
|
|
|
+ <a-row style="padding: 20px">
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-list-item-meta title='{{ i18n "pages.xray.dns.strategy" }}' description='{{ i18n "pages.xray.dns.strategyDesc" }}' />
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-select
|
|
|
+ v-model="dnsStrategy"
|
|
|
+ style="width: 100%"
|
|
|
+ :dropdown-class-name="themeSwitcher.currentTheme">
|
|
|
+ <a-select-option :value="l" :label="l" v-for="l in ['UseIP', 'UseIPv4', 'UseIPv6']">
|
|
|
+ [[ l ]]
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-list-item>
|
|
|
+ <a-divider>DNS</a-divider>
|
|
|
+ <a-button type="primary" icon="plus" @click="addDNSServer()" style="margin-bottom: 10px;">{{ i18n "pages.xray.dns.add" }}</a-button>
|
|
|
+ <a-table :columns="dnsColumns" bordered v-if="dnsServers.length>0"
|
|
|
+ :row-key="r => r.key"
|
|
|
+ :data-source="dnsServers"
|
|
|
+ :scroll="isMobile ? {} : { x: 200 }"
|
|
|
+ :pagination="false"
|
|
|
+ :indent-size="0"
|
|
|
+ :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
|
|
|
+ <template slot="action" slot-scope="text,dns,index">
|
|
|
+ [[ index+1 ]]
|
|
|
+ <a-dropdown :trigger="['click']">
|
|
|
+ <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
+ <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
+ <a-menu-item @click="editDNSServer(index)">
|
|
|
+ <a-icon type="edit"></a-icon>
|
|
|
+ {{ i18n "edit" }}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="deleteDNSServer(index)">
|
|
|
+ <span style="color: #FF4D4F">
|
|
|
+ <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
+ </span>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+ <template slot="address" slot-scope="dns,index">
|
|
|
+ <span v-if="typeof dns == 'object'">[[ dns.address ]]</span>
|
|
|
+ <span v-else>[[ dns ]]</span>
|
|
|
+ </template>
|
|
|
+ <template slot="domain" slot-scope="dns,index">
|
|
|
+ <span v-if="typeof dns == 'object'">[[ dns.domains.join(",") ]]</span>
|
|
|
+ </template>
|
|
|
+ </a-table>
|
|
|
+ <a-divider>Fake DNS</a-divider>
|
|
|
+ <a-button type="primary" icon="plus" @click="addFakedns()" style="margin-bottom: 10px;">{{ i18n "pages.xray.fakedns.add" }}</a-button>
|
|
|
+ <a-table :columns="fakednsColumns" bordered v-if="fakeDns && fakeDns.length>0" :row-key="r => r.key"
|
|
|
+ :data-source="fakeDns" :scroll="isMobile ? {} : { x: 200 }" :pagination="false" :indent-size="0"
|
|
|
+ :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
|
|
|
+ <template slot="action" slot-scope="text,fakedns,index">
|
|
|
+ [[ index+1 ]]
|
|
|
+ <a-dropdown :trigger="['click']">
|
|
|
+ <a-icon @click="e => e.preventDefault()" type="more"
|
|
|
+ style="font-size: 16px; text-decoration: bold;"></a-icon>
|
|
|
+ <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
|
|
|
+ <a-menu-item @click="editFakedns(index)">
|
|
|
+ <a-icon type="edit"></a-icon>
|
|
|
+ {{ i18n "edit" }}
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item @click="deleteFakedns(index)">
|
|
|
+ <span style="color: #FF4D4F">
|
|
|
+ <a-icon type="delete"></a-icon> {{ i18n "delete"}}
|
|
|
+ </span>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+ </a-table>
|
|
|
+ </template>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="tpl-advanced" tab='{{ i18n "pages.xray.advancedTemplate"}}' style="padding-top: 20px;" force-render="true">
|
|
|
+ <a-list-item-meta title='{{ i18n "pages.xray.Template"}}' description='{{ i18n "pages.xray.TemplateDesc"}}'></a-list-item-meta>
|
|
|
+ <a-radio-group v-model="advSettings" @change="changeCode" button-style="solid" style="margin: 10px 0;" :size="isMobile ? 'small' : ''">
|
|
|
+ <a-radio-button value="xraySetting">{{ i18n "pages.xray.completeTemplate"}}</a-radio-button>
|
|
|
+ <a-radio-button value="inboundSettings">{{ i18n "pages.xray.Inbounds" }}</a-radio-button>
|
|
|
+ <a-radio-button value="outboundSettings">{{ i18n "pages.xray.Outbounds" }}</a-radio-button>
|
|
|
+ <a-radio-button value="routingRuleSettings">{{ i18n "pages.xray.Routings" }}</a-radio-button>
|
|
|
+ </a-radio-group>
|
|
|
+ <textarea style="position:absolute; left: -800px;" id="xraySetting"></textarea>
|
|
|
+ </a-tab-pane>
|
|
|
+ </a-tabs>
|
|
|
+ </a-space>
|
|
|
+ </a-spin>
|
|
|
+ </a-layout-content>
|
|
|
</a-layout>
|
|
|
-</a-layout>
|
|
|
+ </a-layout>
|
|
|
{{template "js" .}}
|
|
|
{{template "component/themeSwitcher" .}}
|
|
|
{{template "component/sortableTable" .}}
|