Explorar o código

feat: test-扫描管理

zhangjie hai 2 días
pai
achega
d46323db41

+ 1 - 1
src/components/select-option/search.ts

@@ -27,7 +27,7 @@ const selectConfig: Record<string, SelectConfigValue> = {
   // 班级
   className: '/api/admin/student/className/list',
   // 考点
-  examPoint: '/api/admin/student/examSite/list',
+  examSite: '/api/admin/student/examSite/list',
   // 仲裁类型
   arbitrationType: '/api/admin/exam/arbitrate/status',
   // 人工确认类型

+ 32 - 0
src/router/routes/modules/base.ts

@@ -45,6 +45,38 @@ const BASE: AppRouteRecordRaw = {
         title: '扫描进度',
         requiresAuth: true,
       },
+      children: [
+        {
+          path: '/scan-course-stats',
+          name: 'ScanCourseStats',
+          component: () => import('@/views/scan/ScanCourseStats.vue'),
+          meta: {
+            title: '按科目统计',
+            requiresAuth: true,
+            relationRoutes: ['ScanManage'],
+          },
+        },
+        {
+          path: '/scan-point-stats',
+          name: 'ScanPointStats',
+          component: () => import('@/views/scan/ScanPointStats.vue'),
+          meta: {
+            title: '按考点统计',
+            requiresAuth: true,
+            relationRoutes: ['ScanManage'],
+          },
+        },
+        {
+          path: '/sign-paper-stats',
+          name: 'SignPaperStats',
+          component: () => import('@/views/scan/SignPaperStats.vue'),
+          meta: {
+            title: '签到表统计',
+            requiresAuth: true,
+            relationRoutes: ['ScanManage'],
+          },
+        },
+      ],
     },
     {
       path: '/subject-manage',

+ 1 - 0
src/store/modules/app/relation.ts

@@ -22,4 +22,5 @@ export const relateRoutes = {
   ],
   ExamManage: ['ExamEdit'],
   SubjectManage: ['PaperStructEdit', 'OptionalRuleEdit'],
+  ScanManage: ['ScanCourseStats', 'ScanPointStats', 'SignPaperStats'],
 };

+ 3 - 3
src/views/scan/ScanCourseStats.vue

@@ -30,7 +30,7 @@
       stripe
       @sort-change="handleSortChange"
     >
-      <el-table-column prop="name" label="考试名称" min-width="200" sortable />
+      <el-table-column prop="name" label="考试名称" min-width="240" sortable />
       <el-table-column
         prop="totalCount"
         label="考生总数"
@@ -55,7 +55,7 @@
         min-width="100"
         sortable
       />
-      <el-table-column label="进度" width="100">
+      <el-table-column label="进度" min-width="100">
         <template #default="scope">
           {{ getProgress(scope.row) }}
         </template>
@@ -96,7 +96,7 @@
     toPage,
     pageSizeChange,
     handleSortChange,
-  } = useTable<ScanItem>(getScanCourseList, searchModel, false);
+  } = useTable<ScanItem>(getScanCourseList, searchModel, true);
 
   function getProgress(row: ScanItem) {
     if (!row.totalCount) return '0%';

+ 60 - 34
src/views/scan/ScanManage.vue

@@ -1,45 +1,71 @@
 <template>
-  <el-tabs v-model="activeTab" type="card" class="page-tab">
-    <el-tab-pane name="course">
-      <template #label>
-        <el-button :type="activeTab === 'course' ? 'primary' : 'default'"
-          >按科目统计</el-button
-        >
-      </template>
-      <ScanCourseStats />
-    </el-tab-pane>
-    <el-tab-pane name="point">
-      <template #label>
-        <el-button :type="activeTab === 'point' ? 'primary' : 'default'"
-          >按考点统计</el-button
-        >
-      </template>
-      <ScanPointStats />
-    </el-tab-pane>
-    <el-tab-pane name="signPaper">
-      <template #label>
-        <el-button :type="activeTab === 'signPaper' ? 'primary' : 'default'"
-          >签到表统计</el-button
-        >
-      </template>
-      <SignPaperStats />
-    </el-tab-pane>
-  </el-tabs>
+  <div class="scan-manage">
+    <!-- 顶部标签导航 -->
+    <el-tabs
+      v-model="activeMenu"
+      type="card"
+      class="page-tab"
+      @tab-click="handleTabClick"
+    >
+      <el-tab-pane v-for="tab in tabs" :key="tab.name" :name="tab.name">
+        <template #label>
+          <el-button :type="activeMenu === tab.name ? 'primary' : 'default'">{{
+            tab.label
+          }}</el-button>
+        </template>
+      </el-tab-pane>
+    </el-tabs>
+
+    <!-- 子页面内容区域 -->
+    <router-view />
+  </div>
 </template>
 
 <script setup lang="ts">
-  import { ref } from 'vue';
-  import { useRoute } from 'vue-router';
-
-  import ScanCourseStats from './ScanCourseStats.vue';
-  import ScanPointStats from './ScanPointStats.vue';
-  import SignPaperStats from './SignPaperStats.vue';
+  import { ref, watch, onMounted } from 'vue';
+  import { useRoute, useRouter } from 'vue-router';
 
   defineOptions({
     name: 'ScanManage',
   });
 
   const route = useRoute();
-  // 从路由参数获取tab值,默认为course
-  const activeTab = ref((route.query.tab as string) || 'course');
+  const router = useRouter();
+
+  // 标签页配置
+  const tabs = [
+    { name: 'ScanCourseStats', label: '按科目统计' },
+    { name: 'ScanPointStats', label: '按考点统计' },
+    { name: 'SignPaperStats', label: '签到表统计' },
+  ];
+
+  // 当前激活的菜单项
+  const activeMenu = ref<string>('');
+
+  // 标签点击处理
+  function handleTabClick(tab: any) {
+    const tabName = tab.paneName || tab.props.name;
+    if (tabName !== route.name) {
+      router.push({ name: tabName });
+    }
+  }
+
+  // 监听路由变化,更新激活菜单
+  watch(
+    () => route.name,
+    (newName) => {
+      activeMenu.value = newName as string;
+    },
+    { immediate: true }
+  );
+
+  // 组件挂载时初始化
+  onMounted(() => {
+    // 如果当前路径是父路由,默认跳转到按科目统计
+    if (route.name === 'ScanManage') {
+      router.replace({ name: 'ScanCourseStats' });
+    } else {
+      activeMenu.value = route.name as string;
+    }
+  });
 </script>

+ 1 - 1
src/views/scan/ScanPointStats.vue

@@ -85,7 +85,7 @@
     toPage,
     pageSizeChange,
     handleSortChange,
-  } = useTable<ScanItem>(getScanPointList, searchModel, false);
+  } = useTable<ScanItem>(getScanPointList, searchModel, true);
 
   function getProgress(row: ScanItem) {
     if (!row.totalCount) return '0%';

+ 2 - 2
src/views/scan/SignPaperStats.vue

@@ -24,7 +24,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button>总数 --</el-button>
+          <el-button>总数:{{ pagination.total }}</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -81,7 +81,7 @@
   });
 
   const { dataList, pagination, loading, toPage, pageSizeChange } =
-    useTable<SignPaperStatItem>(getSignPaperStatList, searchModel, false);
+    useTable<SignPaperStatItem>(getSignPaperStatList, searchModel, true);
 
   // 查看图片
   const showPreview = ref(false);