From e7179bfe5406697519f7757f30c877f9b6475ab6 Mon Sep 17 00:00:00 2001 From: qubiaobiao <3294694717@qq.com> Date: Fri, 9 Oct 2026 09:33:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E9=80=89=E6=89=8B=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=96=B0=E5=A2=9E=E3=80=8C=E5=B0=8F=E7=BB=84=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E3=80=8D=E2=80=94=E2=80=94=20=E6=BF=80=E6=B4=BB?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B8=8E=E6=89=80=E5=B1=9E=E5=AD=A6=E6=A0=A1?= =?UTF-8?q?=E6=B8=85=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - api/admin.js:新增 getTeams({ group, activated, includeTest }) - Admin.vue:列表/小组视图切换、组别 + 激活状态 + 含测试三筛选、汇总条、小组表格(所属学校 / 成员数 / 已激活 / 状态) 线上验证:R86 已部署(dist 157 文件 / 70 个 .gz),线上入口 index-DQf5Bj8S.js --- src/api/admin.js | 9 ++++ src/views/Admin.vue | 124 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 132 insertions(+), 1 deletion(-) diff --git a/src/api/admin.js b/src/api/admin.js index 39bb0bd..c8b9392 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -19,6 +19,15 @@ export function getAccounts(params) { return request.get('/admin/accounts', { params }) } +/** + * 获取小组(团队)激活状态清单(R84 续六) + * @param {object} params - { group, activated, includeTest } + * @returns {Promise} { list, summary, filteredTotal, filters } + */ +export function getTeams(params) { + return request.get('/admin/teams', { params }) +} + /** * 导入 Excel 批量创建账号 * @param {FormData} formData - 包含 Excel 文件的 FormData diff --git a/src/views/Admin.vue b/src/views/Admin.vue index 7584779..1fd5d95 100644 --- a/src/views/Admin.vue +++ b/src/views/Admin.vue @@ -123,6 +123,16 @@ @@ -1632,7 +1703,12 @@ function onMenuSelect(index) { sessionStorage.setItem('admin_activeMenu', index) // 切换时加载对应数据 if (index === 'dashboard') fetchStats() - if (index === 'accounts') fetchAccounts() + // 选手管理:默认加载选手列表;若用户当前停在「小组视图」页签则同时刷新小组数据, + // 避免切回该菜单时表格空白(R84 续六) + if (index === 'accounts') { + fetchAccounts() + if (accountsView.value === 'teams') fetchTeams() + } if (index === 'questions' && questionGroup.value) { // R29:试卷管理只刷题库(含大题库);「考生答题记录 / 大题作答查证」已迁到成绩管理 refreshQuestionData(true) @@ -1771,6 +1847,41 @@ const accountGroupFilter = ref('') const accountActivatedFilter = ref('') const accountDateRange = ref(null) +// ---- 小组视图(R84 续六)---- +// 与「选手列表」共用二级页签 accountsView;筛选条件独立,互不干扰。 +const accountsView = ref('list') // 'list' | 'teams' +const teams = ref([]) +const teamsLoading = ref(false) +const teamGroupFilter = ref('') +const teamActivatedFilter = ref('') +const teamIncludeTest = ref(false) +const teamSummary = ref(null) + +async function fetchTeams() { + teamsLoading.value = true + try { + const params = {} + if (teamGroupFilter.value) params.group = teamGroupFilter.value + if (teamActivatedFilter.value !== '') params.activated = teamActivatedFilter.value + // 显式传 '0'/'1':后端只有 'true'/'1' 等真值字符串才认「含测试数据」, + // 缺省或其它值一律按「不含测试数据」处理(生产口径)。 + params.includeTest = teamIncludeTest.value ? '1' : '0' + const data = await adminApi.getTeams(params) + teams.value = (data && data.list) || [] + teamSummary.value = (data && data.summary) || null + } catch (e) { + console.warn('获取小组列表失败', e) + } finally { + teamsLoading.value = false + } +} + +function onTeamFilterChange() { fetchTeams() } + +function onAccountsViewChange(view) { + if (view === 'teams') fetchTeams() +} + async function fetchAccounts() { accountsLoading.value = true try { @@ -3670,6 +3781,17 @@ onMounted(() => { align-items: center; } +/* R84 续六:选手管理二级视图切换(选手列表 / 小组视图) */ +.view-switch { margin-bottom: 16px; } +.team-summary { + margin-left: auto; + font-size: 12px; + color: #606266; + line-height: 1.6; +} +/* 小组视图:未填写学校时的占位样式(区别于有值文本) */ +.team-school-missing { color: #c0c4cc; } + /* R30:`.exam-score-form` 相关样式已随「考生答题记录 · 评分」弹窗一并删除 */ .search-input { width: 220px; }