diff options
Diffstat (limited to 'web/html/xui/xray.html')
| -rw-r--r-- | web/html/xui/xray.html | 1205 |
1 files changed, 610 insertions, 595 deletions
diff --git a/web/html/xui/xray.html b/web/html/xui/xray.html index 98dacd92..f42fb076 100644 --- a/web/html/xui/xray.html +++ b/web/html/xui/xray.html @@ -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> -
|
