From 092910404a76e2c24c9b929d80e65dbac4c4499d Mon Sep 17 00:00:00 2001
From: qubiaobiao <3294694717@qq.com>
Date: Fri, 9 Oct 2026 15:27:39 +0800
Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E9=80=89=E6=89=8B=E5=88=97?=
=?UTF-8?q?=E8=A1=A8=E6=96=B0=E5=A2=9E=E5=B0=8F=E7=BB=84=E7=BC=96=E5=8F=B7?=
=?UTF-8?q?/=E6=89=80=E5=B1=9E=E5=AD=A6=E6=A0=A1=E5=88=97=EF=BC=8C?=
=?UTF-8?q?=E5=B0=8F=E7=BB=84=E8=A7=86=E5=9B=BE=E6=B1=87=E6=80=BB=E5=8F=8C?=
=?UTF-8?q?=E5=8F=A3=E5=BE=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
R90 人工测试反馈修复(方案 1 + 方案 3-A):
- 选手列表新增「小组编号」「所属学校」两列,便于与小组视图横向对照
- 小组视图汇总行改为「全集 + 当前筛选后」三段式,并新增差额说明行
· 明确解释「选手列表激活人数」与「已激活小组成员数」的差额来源
(差额 = 部分激活小组内已激活的选手)
- 新增 teamFilteredSummary / teamPartialExtra computed
· 防御式读取:后端未同步时自动退回全量口径,不显示 undefined
- 新增 accountTeamLabel() 显示助手与 .team-summary-filtered / .team-summary-hint 样式
生产已部署并复验:线上产物与本地产物逐字节一致(sha256 3d09ea90…),
新增 UI 文案均已在线上 JS 中检出。
---
src/views/Admin.vue | 54 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/src/views/Admin.vue b/src/views/Admin.vue
index bbafb42..7ad49ca 100644
--- a/src/views/Admin.vue
+++ b/src/views/Admin.vue
@@ -170,6 +170,19 @@
{{ groupMap[row.group] || row.group }}
+
+
+
+ {{ accountTeamLabel(row) }}
+ — 无小组
+
+
+
+
+ {{ row.schoolName }}
+ — 未填写
+
+
{{ row.activated ? '已激活' : '未激活' }}
@@ -230,6 +243,13 @@
共 {{ teamSummary.total }} 个小组 · 已激活 {{ teamSummary.activated }} · 部分激活 {{ teamSummary.partial }} · 未激活 {{ teamSummary.inactive }}
|成员 {{ teamSummary.memberActivated }}/{{ teamSummary.memberTotal }} 已激活
+
+ |当前筛选后 {{ teamFilteredSummary.total }} 个小组 · 成员 {{ teamFilteredSummary.memberActivated }}/{{ teamFilteredSummary.memberTotal }} 已激活
+
+
+
+
+ 说明:「已激活小组」只统计「全员已激活」的小组;另有 {{ teamPartialExtra }} 名已激活选手所在小组尚未全员激活(部分激活),故不计入上表,但会计入「选手列表」的已激活人数。
@@ -1869,6 +1889,22 @@ const teamActivatedFilter = ref('')
const teamIncludeTest = ref(false)
const teamSummary = ref(null)
+// R90:双口径汇总的读取辅助(防御式——后端未同步时自动退回全量口径,不显示 undefined)
+const teamFilteredSummary = computed(() => {
+ const s = teamSummary.value
+ if (!s) return { total: 0, memberTotal: 0, memberActivated: 0 }
+ return {
+ total: s.filteredTotal === undefined ? s.total : s.filteredTotal,
+ memberTotal: s.filteredMemberTotal === undefined ? s.memberTotal : s.filteredMemberTotal,
+ memberActivated: s.filteredMemberActivated === undefined ? s.memberActivated : s.filteredMemberActivated,
+ }
+})
+// 「部分激活」小组内已激活的选手数(= 选手列表激活人数 − 已激活小组成员数 的差额来源)
+const teamPartialExtra = computed(() => {
+ const s = teamSummary.value
+ return s && typeof s.memberActivatedInPartial === 'number' ? s.memberActivatedInPartial : 0
+})
+
async function fetchTeams() {
teamsLoading.value = true
try {
@@ -1894,6 +1930,14 @@ function onAccountsViewChange(view) {
if (view === 'teams') fetchTeams()
}
+// R90:选手列表「小组编号」显示文本(与小组视图同优先级:teamNumber → teamId → 队伍 #uid)
+function accountTeamLabel(row) {
+ if (!row) return ''
+ if (row.teamNumber || row.teamId) return row.teamNumber || row.teamId
+ if (row.teamUid !== null && row.teamUid !== undefined) return '队伍 #' + row.teamUid
+ return ''
+}
+
async function fetchAccounts() {
accountsLoading.value = true
try {
@@ -3815,6 +3859,16 @@ onMounted(() => {
color: #606266;
line-height: 1.6;
}
+/* R90:当前筛选后口径(与全量口径同排显示,用主色区分) */
+.team-summary-filtered { color: #409eff; font-weight: 600; }
+/* R90:口径说明(解释「选手列表激活人数」与「已激活小组成员数」的差额来源) */
+.team-summary-hint {
+ flex-basis: 100%;
+ font-size: 12px;
+ color: #909399;
+ line-height: 1.6;
+ margin-top: 4px;
+}
/* 小组视图:未填写学校时的占位样式(区别于有值文本) */
.team-school-missing { color: #c0c4cc; }