ServerOverview.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <template>
  2. <div>
  3. <el-row>
  4. <el-col :md="12">
  5. <div class="source">
  6. <el-form
  7. label-position="left"
  8. label-width="220px"
  9. class="server_info"
  10. >
  11. <el-form-item label="Version">
  12. <span>{{ data.version }}</span>
  13. </el-form-item>
  14. <el-form-item label="BindPort">
  15. <span>{{ data.bindPort }}</span>
  16. </el-form-item>
  17. <el-form-item label="KCP Bind Port" v-if="data.kcpBindPort != 0">
  18. <span>{{ data.kcpBindPort }}</span>
  19. </el-form-item>
  20. <el-form-item
  21. label="QUIC Bind Port"
  22. v-if="data.quicBindPort != 0"
  23. >
  24. <span>{{ data.quicBindPort }}</span>
  25. </el-form-item>
  26. <el-form-item label="Http Port" v-if="data.vhostHTTPPort != 0">
  27. <span>{{ data.vhostHTTPPort }}</span>
  28. </el-form-item>
  29. <el-form-item label="Https Port" v-if="data.vhostHTTPSPort != 0">
  30. <span>{{ data.vhostHTTPSPort }}</span>
  31. </el-form-item>
  32. <el-form-item
  33. label="TCPMux HTTPConnect Port"
  34. v-if="data.tcpmuxHTTPConnectPort != 0"
  35. >
  36. <span>{{ data.tcpmuxHTTPConnectPort }}</span>
  37. </el-form-item>
  38. <el-form-item
  39. label="Subdomain Host"
  40. v-if="data.subdomainHost != ''"
  41. >
  42. <LongSpan :content="data.subdomainHost" :length="30"></LongSpan>
  43. </el-form-item>
  44. <el-form-item label="Max PoolCount">
  45. <span>{{ data.maxPoolCount }}</span>
  46. </el-form-item>
  47. <el-form-item label="Max Ports Per Client">
  48. <span>{{ data.maxPortsPerClient }}</span>
  49. </el-form-item>
  50. <el-form-item label="Allow Ports" v-if="data.allowPortsStr != ''">
  51. <LongSpan :content="data.allowPortsStr" :length="30"></LongSpan>
  52. </el-form-item>
  53. <el-form-item label="TLS Force" v-if="data.tlsForce === true">
  54. <span>{{ data.tlsForce }}</span>
  55. </el-form-item>
  56. <el-form-item label="HeartBeat Timeout">
  57. <span>{{ data.heartbeatTimeout }}</span>
  58. </el-form-item>
  59. <el-form-item label="Client Counts">
  60. <span>{{ data.clientCounts }}</span>
  61. </el-form-item>
  62. <el-form-item label="Current Connections">
  63. <span>{{ data.curConns }}</span>
  64. </el-form-item>
  65. <el-form-item label="Proxy Counts">
  66. <span>{{ data.proxyCounts }}</span>
  67. </el-form-item>
  68. </el-form>
  69. </div>
  70. </el-col>
  71. <el-col :md="12">
  72. <div
  73. id="traffic"
  74. style="width: 400px; height: 250px; margin-bottom: 30px"
  75. ></div>
  76. <div id="proxies" style="width: 400px; height: 250px"></div>
  77. </el-col>
  78. </el-row>
  79. </div>
  80. </template>
  81. <script setup lang="ts">
  82. import { ref } from 'vue'
  83. import { ElMessage } from 'element-plus'
  84. import { DrawTrafficChart, DrawProxyChart } from '../utils/chart'
  85. import LongSpan from './LongSpan.vue'
  86. let data = ref({
  87. version: '',
  88. bindPort: 0,
  89. kcpBindPort: 0,
  90. quicBindPort: 0,
  91. vhostHTTPPort: 0,
  92. vhostHTTPSPort: 0,
  93. tcpmuxHTTPConnectPort: 0,
  94. subdomainHost: '',
  95. maxPoolCount: 0,
  96. maxPortsPerClient: '',
  97. allowPortsStr: '',
  98. tlsForce: false,
  99. heartbeatTimeout: 0,
  100. clientCounts: 0,
  101. curConns: 0,
  102. proxyCounts: 0,
  103. })
  104. const fetchData = () => {
  105. fetch('../api/serverinfo', { credentials: 'include' })
  106. .then((res) => res.json())
  107. .then((json) => {
  108. data.value.version = json.version
  109. data.value.bindPort = json.bindPort
  110. data.value.kcpBindPort = json.kcpBindPort
  111. data.value.quicBindPort = json.quicBindPort
  112. data.value.vhostHTTPPort = json.vhostHTTPPort
  113. data.value.vhostHTTPSPort = json.vhostHTTPSPort
  114. data.value.tcpmuxHTTPConnectPort = json.tcpmuxHTTPConnectPort
  115. data.value.subdomainHost = json.subdomainHost
  116. data.value.maxPoolCount = json.maxPoolCount
  117. data.value.maxPortsPerClient = json.maxPortsPerClient
  118. if (data.value.maxPortsPerClient == '0') {
  119. data.value.maxPortsPerClient = 'no limit'
  120. }
  121. data.value.allowPortsStr = json.allowPortsStr
  122. data.value.tlsForce = json.tlsForce
  123. data.value.heartbeatTimeout = json.heartbeatTimeout
  124. data.value.clientCounts = json.clientCounts
  125. data.value.curConns = json.curConns
  126. data.value.proxyCounts = 0
  127. if (json.proxyTypeCount != null) {
  128. if (json.proxyTypeCount.tcp != null) {
  129. data.value.proxyCounts += json.proxyTypeCount.tcp
  130. }
  131. if (json.proxyTypeCount.udp != null) {
  132. data.value.proxyCounts += json.proxyTypeCount.udp
  133. }
  134. if (json.proxyTypeCount.http != null) {
  135. data.value.proxyCounts += json.proxyTypeCount.http
  136. }
  137. if (json.proxyTypeCount.https != null) {
  138. data.value.proxyCounts += json.proxyTypeCount.https
  139. }
  140. if (json.proxyTypeCount.stcp != null) {
  141. data.value.proxyCounts += json.proxyTypeCount.stcp
  142. }
  143. if (json.proxyTypeCount.sudp != null) {
  144. data.value.proxyCounts += json.proxyTypeCount.sudp
  145. }
  146. if (json.proxyTypeCount.xtcp != null) {
  147. data.value.proxyCounts += json.proxyTypeCount.xtcp
  148. }
  149. }
  150. // draw chart
  151. DrawTrafficChart('traffic', json.totalTrafficIn, json.totalTrafficOut)
  152. DrawProxyChart('proxies', json)
  153. })
  154. .catch(() => {
  155. ElMessage({
  156. showClose: true,
  157. message: 'Get server info from frps failed!',
  158. type: 'warning',
  159. })
  160. })
  161. }
  162. fetchData()
  163. </script>
  164. <style>
  165. .source {
  166. border-radius: 4px;
  167. transition: 0.2s;
  168. padding-left: 24px;
  169. padding-right: 24px;
  170. }
  171. .server_info {
  172. margin-left: 40px;
  173. font-size: 0px;
  174. }
  175. .server_info .el-form-item__label {
  176. color: #99a9bf;
  177. height: 40px;
  178. line-height: 40px;
  179. }
  180. .server_info .el-form-item__content {
  181. height: 40px;
  182. line-height: 40px;
  183. }
  184. .server_info .el-form-item {
  185. margin-right: 0;
  186. margin-bottom: 0;
  187. width: 100%;
  188. }
  189. </style>