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; }