From 0d2a5fc482ba7ffaaefa6276e2475727e7160753 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期三, 16 九月 2026 11:31:35 +0800
Subject: [PATCH] fix(cors): 放行内网网段来源,修复局域网 IP 访问时登录 403
---
traffic-audit-web/src/views/ReportExport.vue | 86 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 85 insertions(+), 1 deletions(-)
diff --git a/traffic-audit-web/src/views/ReportExport.vue b/traffic-audit-web/src/views/ReportExport.vue
index 2cbe51b..54f5513 100644
--- a/traffic-audit-web/src/views/ReportExport.vue
+++ b/traffic-audit-web/src/views/ReportExport.vue
@@ -112,7 +112,25 @@
<span v-if="!it.ready" class="cov-bad" style="margin-left:10px">{{ it.note }}</span>
<span v-if="it.ready && it.audited === false" class="cov-bad" style="margin-left:10px">鏈鏍�</span>
</div>
- <table class="preview-summary" v-if="it.summary && it.summary.length">
+ <table class="preview-summary wb-table" v-if="it.key === 'summaryWorkbook' && it.summary && it.summary.length">
+ <thead>
+ <tr><th style="width:44%">鎸囨爣</th><th style="width:30%">鏁版嵁</th><th>鍚屾瘮</th></tr>
+ </thead>
+ <tbody>
+ <template v-for="(sec, si) in wbRows(it.summary)">
+ <tr v-for="(row, ri) in sec.rows" :key="si + '-' + ri">
+ <td v-if="ri === 0" :rowspan="sec.rows.length" class="wb-sec">{{ sec.name }}</td>
+ <td class="wb-label">{{ row.label }}</td>
+ <td class="wb-value">{{ row.value === null ? '鈥�' : fmtVal(row.value) }}</td>
+ <td class="wb-yoy" :class="{ 'yoy-empty': row.yoy === null }">{{ row.yoy === null ? '鈥�' : row.yoy }}</td>
+ </tr>
+ </template>
+ </tbody>
+ </table>
+ <div v-if="it.key === 'summaryWorkbook' && wbMissing(it.summary)" class="wb-note">
+ 閮ㄥ垎鎸囨爣缂哄皯涓婂勾鍚屾湡锛坽{ wbPrevYear() }}锛夊熀鏈熸暟鎹紝鍚屾瘮鏆傛湭璁$畻
+ </div>
+ <table class="preview-summary" v-else-if="it.summary && it.summary.length">
<tbody>
<tr v-for="(s, i) in it.summary" :key="i">
<td>{{ s.label }}</td>
@@ -380,6 +398,65 @@
}
return String(v)
},
+ wbRows(summary) {
+ const get = (key) => {
+ const hit = (summary || []).find(x => x.label === key)
+ return hit && hit.value !== null && hit.value !== undefined && hit.value !== '' ? hit.value : null
+ }
+ const pct = (key) => {
+ const v = get(key)
+ return v === null ? null : this.fmtVal(v) + '%'
+ }
+ const mk = (defs) => defs.map(d => ({
+ label: d[0],
+ value: get(d[1]),
+ yoy: d[2] ? pct(d[2]) : null
+ }))
+ return [
+ {
+ name: '閬撹矾璐ц繍',
+ rows: mk([
+ ['褰撴湀璐ц繍閲�(涓囧惃)', '鍏ㄧ渷璐ц繍閲徛峰綋鏈�'],
+ ['褰撴湀璐х墿鍛ㄨ浆閲�(涓囧惃)', '鍏ㄧ渷璐х墿鍛ㄨ浆閲徛峰綋鏈�', '鍏ㄧ渷璐х墿鍛ㄨ浆閲徛峰綋鏈堝悓姣�'],
+ ['绱璐ц繍閲�(涓囧惃)', '鍏ㄧ渷璐ц繍閲徛风疮璁�'],
+ ['绱璐х墿鍛ㄨ浆閲�(涓囧惃鍏噷)', '鍏ㄧ渷璐х墿鍛ㄨ浆閲徛风疮璁�', '鍏ㄧ渷璐х墿鍛ㄨ浆閲徛风疮璁″悓姣�']
+ ])
+ },
+ {
+ name: '鍩庡競瀹㈣繍',
+ rows: mk([
+ ['褰撴湀鍩庡競瀹㈣繍閲�:', '鍩庡競瀹㈣繍閲徛峰綋鏈�'],
+ ['褰撴湀鍩庡競瀹㈣繍鍛ㄨ浆閲�', '鍩庡競瀹㈣繍鍛ㄨ浆閲徛峰綋鏈�'],
+ ['绱鍩庡競瀹㈣繍閲�:', '鍩庡競瀹㈣繍閲徛风疮璁�'],
+ ['绱鍩庡競瀹㈣繍鍛ㄨ浆閲�', '鍩庡競瀹㈣繍鍛ㄨ浆閲徛风疮璁�']
+ ])
+ },
+ {
+ name: '涓彛寰�',
+ rows: mk([
+ ['褰撴湀涓彛寰勫杩愰噺', '涓彛寰勫杩愰噺路褰撴湀'],
+ ['褰撴湀涓彛寰勫懆杞噺', '涓彛寰勫懆杞噺路褰撴湀'],
+ ['绱涓彛寰勫杩愰噺', '涓彛寰勫杩愰噺路绱'],
+ ['绱涓彛寰勫懆杞噺', '涓彛寰勫懆杞噺路绱']
+ ])
+ }
+ ]
+ },
+ wbMissing(summary) {
+ let total = 0
+ let have = 0
+ ;(summary || []).forEach(x => {
+ if (String(x.label).indexOf('鍚屾瘮') >= 0) return
+ total++
+ if (x.value !== null && x.value !== undefined && x.value !== '') have++
+ })
+ return total > 0 && have < total
+ },
+ wbPrevYear() {
+ const m = /^(\d{4})-(\d{2})$/.exec(this.previewPeriod || '')
+ if (!m) return '涓婂勾鍚屾湡'
+ return (Number(m[1]) - 1) + '-' + m[2]
+ },
coverageText(it) {
const cov = it.monthCoverage || []
if (!cov.length) return '鏃犳暟鎹�'
@@ -494,4 +571,11 @@
@media (max-width: 900px) {
.panel-head { flex-direction: column; align-items: flex-start; }
}
+.wb-table th { background:#f5f7fa; }
+.wb-sec { background:#F7F9FC; font-weight:600; text-align:center; color:#303133; }
+.wb-label { color:#303133; }
+.wb-value { text-align:right; font-variant-numeric: tabular-nums; }
+.wb-yoy { text-align:right; color:#606266; }
+.wb-yoy.yoy-empty { color:#C0C4CC; }
+.wb-note { color:#E6A23C; font-size:12px; margin:2px 0 8px; }
</style>
--
Gitblit v1.9.1