diff options
Diffstat (limited to 'web/html/index.html')
| -rw-r--r-- | web/html/index.html | 125 |
1 files changed, 78 insertions, 47 deletions
diff --git a/web/html/index.html b/web/html/index.html index 819d6df2..4ddf26b5 100644 --- a/web/html/index.html +++ b/web/html/index.html @@ -365,8 +365,7 @@ <a-checkbox v-model="logModal.syslog" @change="openLogs()">SysLog</a-checkbox> </a-form-item> <a-form-item style="float: right;"> - <a-button type="primary" icon="download" - @click="FileManager.downloadTextFile(logModal.logs?.join('\n'), 'x-ui.log')"></a-button> + <a-button type="primary" icon="download" @click="FileManager.downloadTextFile(logModal.logs?.join('\n'), 'x-ui.log')"></a-button> </a-form-item> </a-form> <div class="ant-input log-container" v-html="logModal.formattedLogs"></div> @@ -401,8 +400,7 @@ <a-checkbox v-model="xraylogModal.showProxy" @change="openXrayLogs()">Proxy</a-checkbox> </a-form-item> <a-form-item style="float: right;"> - <a-button type="primary" icon="download" - @click="FileManager.downloadTextFile(xraylogModal.logs?.join('\n'), 'x-ui.log')"></a-button> + <a-button type="primary" icon="download" @click="downloadXrayLogs"></a-button> </a-form-item> </a-form> <div class="ant-input log-container" v-html="xraylogModal.formattedLogs"></div> @@ -796,59 +794,74 @@ }; const xraylogModal = { - visible: false, - logs: [], - rows: 20, - showDirect: true, - showBlocked: true, - showProxy: true, - loading: false, - show(logs) { - this.visible = true; - this.logs = logs; - this.formattedLogs = this.logs?.length > 0 ? this.formatLogs(this.logs) : "No Record..."; - }, - formatLogs(logs) { - let formattedLogs = ''; - - logs.forEach((log, index) => { - if (index > 0) formattedLogs += '<br>'; + visible: false, + logs: [], + rows: 20, + showDirect: true, + showBlocked: true, + showProxy: true, + loading: false, + show(logs) { + this.visible = true; + this.logs = logs; + this.formattedLogs = this.logs?.length > 0 ? this.formatLogs(this.logs) : "No Record..."; + }, + formatLogs(logs) { + let formattedLogs = ` +<style> + table { + border-collapse: collapse; + width: auto; + } - const parts = log.split(' '); + table td, table th { + padding: 2px 15px; + } +</style> - if (parts.length === 10) { - const dateTime = `<b>${parts[0]} ${parts[1]}</b>`; - const from = `<b>${parts[3]}</b>`; - const to = `<b>${parts[5].replace(/^\/+/, "")}</b>`; +<table> + <tr> + <th>Date</th> + <th>From</th> + <th>To</th> + <th>Inbound</th> + <th>Outbound</th> + <th>Email</th> + </tr> +`; + logs.reverse().forEach((log, index) => { let outboundColor = ''; - if (parts[9] === "b") { + if (log.Event === 1) { outboundColor = ' style="color: #e04141;"'; //red for blocked } - else if (parts[9] === "p") { + else if (log.Event === 2) { outboundColor = ' style="color: #3c89e8;"'; //blue for proxies } - formattedLogs += `<span${outboundColor}> -${dateTime} - ${parts[2]} - ${from} - ${parts[4]} - ${to} - ${parts.slice(6, 9).join(' ')} -</span>`; - } else { - formattedLogs += `<span>${log}</span>`; - } - }); + let text = ``; + if (log.Email !== "") { + text = `<td>${log.Email}</td>`; + } - return formattedLogs; - }, - hide() { - this.visible = false; - }, - }; + formattedLogs += ` +<tr ${outboundColor}> + <td><b>${new Date(log.DateTime).toLocaleString()}</b></td> + <td>${log.FromAddress}</td> + <td>${log.ToAddress}</td> + <td>${log.Inbound}</td> + <td>${log.Outbound}</td> + ${text} +</tr> +`; + }); + return formattedLogs += "</table>"; + }, + hide() { + this.visible = false; + }, + }; const backupModal = { visible: false, show() { @@ -1023,6 +1036,25 @@ ${dateTime} await PromiseUtil.sleep(500); xraylogModal.loading = false; }, + downloadXrayLogs() { + if (!Array.isArray(this.xraylogModal.logs) || this.xraylogModal.logs.length === 0) { + FileManager.downloadTextFile('', 'x-ui.log'); + return; + } + const lines = this.xraylogModal.logs.map(l => { + try { + const dt = l.DateTime ? new Date(l.DateTime) : null; + const dateStr = dt && !isNaN(dt.getTime()) ? dt.toISOString() : ''; + const eventMap = { 0: 'DIRECT', 1: 'BLOCKED', 2: 'PROXY' }; + const eventText = eventMap[l.Event] || String(l.Event ?? ''); + const emailPart = l.Email ? ` Email=${l.Email}` : ''; + return `${dateStr} FROM=${l.FromAddress || ''} TO=${l.ToAddress || ''} INBOUND=${l.Inbound || ''} OUTBOUND=${l.Outbound || ''}${emailPart} EVENT=${eventText}`.trim(); + } catch (e) { + return JSON.stringify(l); + } + }).join('\n'); + FileManager.downloadTextFile(lines, 'x-ui.log'); + }, async openConfig() { this.loading(true); const msg = await HttpUtil.get('/panel/api/server/getConfigJson'); @@ -1071,7 +1103,6 @@ ${dateTime} fileInput.click(); }, }, - computed: {}, async mounted() { if (window.location.protocol !== "https:") { this.showAlert = true; |
