Kaynağa Gözat

feat: 整体页面UI调整

zhangjie 5 gün önce
ebeveyn
işleme
06cf2dd88e
37 değiştirilmiş dosya ile 544 ekleme ve 390 silme
  1. 1 0
      components.d.ts
  2. 2 2
      src/api/mark.ts
  3. 22 3
      src/assets/style/base.scss
  4. 12 0
      src/assets/style/element-custom.scss
  5. 48 0
      src/assets/style/home.scss
  6. 14 3
      src/layout/default-layout.vue
  7. 5 0
      src/store/modules/app/index.ts
  8. 48 8
      src/views/analysis/AnalysisManage.vue
  9. 3 3
      src/views/analysis/BigQuestionAnalysis.vue
  10. 3 3
      src/views/analysis/ClassAnalysis.vue
  11. 3 3
      src/views/analysis/CollegeAnalysis.vue
  12. 3 3
      src/views/analysis/ObjectiveQuestionAnalysis.vue
  13. 3 3
      src/views/analysis/SegmentAnalysis.vue
  14. 3 3
      src/views/analysis/SubjectiveQuestionAnalysis.vue
  15. 3 3
      src/views/analysis/TeacherAnalysis.vue
  16. 3 3
      src/views/analysis/TotalAnalysis.vue
  17. 6 3
      src/views/check/ImageCheck.vue
  18. 6 3
      src/views/check/ManualConfirm.vue
  19. 11 9
      src/views/issue-paper/IssuePaper.vue
  20. 15 12
      src/views/mark/ArbitrationManage.vue
  21. 11 12
      src/views/mark/GroupManage.vue
  22. 22 65
      src/views/mark/MarkManage.vue
  23. 37 34
      src/views/mark/MarkProgress.vue
  24. 14 15
      src/views/mark/MarkerManage.vue
  25. 15 16
      src/views/mark/QualityMonitor.vue
  26. 15 12
      src/views/mark/TaskManage.vue
  27. 16 13
      src/views/mark/TrialManage.vue
  28. 28 24
      src/views/review/AllReview.vue
  29. 11 11
      src/views/review/ScoreQuery.vue
  30. 10 11
      src/views/review/ScoreReviewStatistics.vue
  31. 4 3
      src/views/scan/ScanCourseStats.vue
  32. 18 3
      src/views/scan/ScanManage.vue
  33. 3 3
      src/views/scan/ScanPointStats.vue
  34. 4 15
      src/views/scan/SignPaperStats.vue
  35. 11 16
      src/views/score/ScoreQuery.vue
  36. 62 5
      src/views/student/StudentManage.vue
  37. 49 65
      src/views/subject/SubjectManage.vue

+ 1 - 0
components.d.ts

@@ -21,6 +21,7 @@ declare module '@vue/runtime-core' {
     ElDescriptions: typeof import('element-plus/es')['ElDescriptions'];
     ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'];
     ElDialog: typeof import('element-plus/es')['ElDialog'];
+    ElDivider: typeof import('element-plus/es')['ElDivider'];
     ElDropdown: typeof import('element-plus/es')['ElDropdown'];
     ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'];
     ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'];

+ 2 - 2
src/api/mark.ts

@@ -178,8 +178,8 @@ export function markGroupClose(ids: number) {
 
 // 评卷进度统计
 // 获取评卷进度统计信息
-export function getMarkStatInfo(): Promise<MarkStatInfo> {
-  return axios.post('/api/mark/stat/info');
+export function getMarkStatInfo(examId: number): Promise<MarkStatInfo> {
+  return axios.post('/api/mark/stat/info', {}, { params: { examId } });
 }
 
 // 获取评卷进度统计列表

+ 22 - 3
src/assets/style/base.scss

@@ -53,8 +53,7 @@
 }
 
 .part-action {
-  border-top: 1px solid var(--color-border-light);
-  padding: 16px 0 15px;
+  padding: 0 0 16px;
 }
 
 // page-table
@@ -78,7 +77,27 @@
 // page-tab
 .page-tab {
   .el-tabs__item {
-    background-color: #fff;
+    background-color: transparent !important;
+    border: none !important;
+    padding: 0 !important;
+    margin-right: 8px;
+    height: auto;
+    min-height: 32px;
+
+    .el-button--primary {
+      box-shadow: 0px 4px 8px #7fc3ff;
+    }
+  }
+  .el-tabs__nav {
+    border: none !important;
+  }
+  .el-tabs__header {
+    border: none !important;
+    margin-bottom: 6px;
+  }
+  .el-tabs__nav-scroll {
+    overflow: auto;
+    padding-bottom: 10px;
   }
 }
 

+ 12 - 0
src/assets/style/element-custom.scss

@@ -209,3 +209,15 @@
     margin-right: 4px;
   }
 }
+
+// el-divider
+.el-divider {
+  &.el-divider--horizontal {
+    border-color: var(--color-border-light);
+    margin: 16px 0;
+  }
+
+  &.form-divider {
+    margin: 0 0 16px;
+  }
+}

+ 48 - 0
src/assets/style/home.scss

@@ -20,10 +20,16 @@
   background: #e5f4ff;
   border-right: 1px solid var(--color-border);
 
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+
   .home-title {
     padding: 16px 24px;
     display: flex;
     align-items: center;
+    flex-shrink: 0;
+    flex-grow: 0;
 
     .svg-icon {
       font-size: 24px;
@@ -38,8 +44,12 @@
   .el-menu {
     background-color: transparent;
     border-right: none;
+
     &.el-menu-home {
       padding: 16px 8px;
+      flex: 1;
+      overflow-x: hidden;
+      overflow-y: auto;
     }
 
     .svg-icon {
@@ -88,6 +98,44 @@
       white-space: normal;
     }
   }
+  .nav-footer {
+    padding: 16px;
+    font-size: 14px;
+    height: 70px;
+    line-height: 38px;
+    display: flex;
+    flex-shrink: 0;
+    flex-grow: 0;
+    align-items: center;
+    justify-content: center;
+    color: var(--color-text-dark);
+    position: relative;
+
+    &::before {
+      content: '';
+      position: absolute;
+      width: 152px;
+      height: 1px;
+      background: var(--color-border);
+      top: 0;
+      left: 50%;
+      transform: translateX(-50%);
+    }
+
+    .el-button {
+      color: var(--color-text-dark);
+      border-bottom: 1px solid var(--color-text-dark);
+      border-radius: 0;
+
+      &:hover {
+        color: var(--color-primary);
+        border-bottom-color: var(--color-primary);
+      }
+    }
+    .svg-icon {
+      font-size: 16px;
+    }
+  }
 }
 
 /* head */

+ 14 - 3
src/layout/default-layout.vue

@@ -71,6 +71,10 @@
           </el-menu-item>
         </template>
       </el-menu>
+      <div class="nav-footer">
+        <el-button link> 自命题质量分析系统 </el-button>
+        <svg-icon name="icon-jump" style="margin-left: 10px"></svg-icon>
+      </div>
     </div>
 
     <div class="home-body">
@@ -123,12 +127,16 @@
     return appStore.curExam?.name ?? '';
   });
 
-  function initData() {
+  function getRouteName() {
     let routerName = route.name as string;
     if (route.meta.relationRoutes && route.meta.relationRoutes.length) {
       routerName = route.meta.relationRoutes[0];
     }
-    curRouteName.value = routerName;
+    return routerName;
+  }
+
+  function initData() {
+    curRouteName.value = getRouteName();
     // console.log(route.name);
   }
 
@@ -137,14 +145,17 @@
   }
 
   function handleSubMenuOpen(val: string) {
+    if (appStore.checkCurRouteInSubMenu(val, getRouteName())) {
+      return;
+    }
     const subMenuFirstRouter = appStore.getSubMenuFirstRouter(val);
     if (
-      route.meta.relationRoutes?.includes(subMenuFirstRouter.name) ||
       route.name === subMenuFirstRouter.name ||
       subMenuFirstRouter.name === val
     ) {
       return;
     }
+
     router.push({ name: subMenuFirstRouter.name });
   }
 

+ 5 - 0
src/store/modules/app/index.ts

@@ -98,6 +98,11 @@ const useAppStore = defineStore('app', {
 
       return { name: firstRouteName };
     },
+    checkCurRouteInSubMenu(subMenuUrl: string, routeName: string) {
+      const subMenu = this.appMenus.find((item) => item.url === subMenuUrl);
+      if (!subMenu) return false;
+      return subMenu.children?.some((item) => item.url === routeName);
+    },
     toggleDevice(device: string) {
       this.device = device;
     },

+ 48 - 8
src/views/analysis/AnalysisManage.vue

@@ -1,27 +1,67 @@
 <template>
   <el-tabs v-model="activeTab" type="card" class="page-tab">
-    <el-tab-pane label="总量分析" name="total">
+    <el-tab-pane name="total">
+      <template #label>
+        <el-button :type="activeTab === 'total' ? 'primary' : 'default'"
+          >总量分析</el-button
+        >
+      </template>
       <TotalAnalysis />
     </el-tab-pane>
-    <el-tab-pane label="分段统计" name="segment">
+    <el-tab-pane name="segment">
+      <template #label>
+        <el-button :type="activeTab === 'segment' ? 'primary' : 'default'"
+          >分段统计</el-button
+        >
+      </template>
       <SegmentAnalysis />
     </el-tab-pane>
-    <el-tab-pane label="学院分析" name="college">
+    <el-tab-pane name="college">
+      <template #label>
+        <el-button :type="activeTab === 'college' ? 'primary' : 'default'"
+          >学院分析</el-button
+        >
+      </template>
       <CollegeAnalysis />
     </el-tab-pane>
-    <el-tab-pane label="任课老师分析" name="teacher">
+    <el-tab-pane name="teacher">
+      <template #label>
+        <el-button :type="activeTab === 'teacher' ? 'primary' : 'default'"
+          >任课老师分析</el-button
+        >
+      </template>
       <TeacherAnalysis />
     </el-tab-pane>
-    <el-tab-pane label="班级分析" name="class">
+    <el-tab-pane name="class">
+      <template #label>
+        <el-button :type="activeTab === 'class' ? 'primary' : 'default'"
+          >班级分析</el-button
+        >
+      </template>
       <ClassAnalysis />
     </el-tab-pane>
-    <el-tab-pane label="客观题分析" name="objective">
+    <el-tab-pane name="objective">
+      <template #label>
+        <el-button :type="activeTab === 'objective' ? 'primary' : 'default'"
+          >客观题分析</el-button
+        >
+      </template>
       <ObjectiveQuestionAnalysis />
     </el-tab-pane>
-    <el-tab-pane label="主观题分析" name="subjective">
+    <el-tab-pane name="subjective">
+      <template #label>
+        <el-button :type="activeTab === 'subjective' ? 'primary' : 'default'"
+          >主观题分析</el-button
+        >
+      </template>
       <SubjectiveQuestionAnalysis />
     </el-tab-pane>
-    <el-tab-pane label="大题分析" name="bigQuestion">
+    <el-tab-pane name="bigQuestion">
+      <template #label>
+        <el-button :type="activeTab === 'bigQuestion' ? 'primary' : 'default'"
+          >大题分析</el-button
+        >
+      </template>
       <BigQuestionAnalysis />
     </el-tab-pane>
   </el-tabs>

+ 3 - 3
src/views/analysis/BigQuestionAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -11,8 +11,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 3 - 3
src/views/analysis/ClassAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -19,8 +19,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 3 - 3
src/views/analysis/CollegeAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -19,8 +19,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 3 - 3
src/views/analysis/ObjectiveQuestionAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -23,8 +23,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 3 - 3
src/views/analysis/SegmentAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -23,8 +23,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 3 - 3
src/views/analysis/SubjectiveQuestionAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -11,8 +11,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 3 - 3
src/views/analysis/TeacherAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -19,8 +19,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 3 - 3
src/views/analysis/TotalAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -11,8 +11,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 6 - 3
src/views/check/ImageCheck.vue

@@ -28,12 +28,15 @@
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
       </el-form-item>
-      <el-form-item>
+    </el-form>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
         <el-button @click="exportData">导出</el-button>
         <el-button type="success" @click="startCheck">开始检查</el-button>
-      </el-form-item>
-    </el-form>
+      </el-space>
+    </div>
   </div>
   <div class="part-box">
     <el-table

+ 6 - 3
src/views/check/ManualConfirm.vue

@@ -22,11 +22,14 @@
           style="width: 120px"
         />
       </el-form-item>
-      <el-form-item>
+    </el-form>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
         <el-button type="success" @click="startCheck">开始检查</el-button>
-      </el-form-item>
-    </el-form>
+      </el-space>
+    </div>
   </div>
   <div class="part-box">
     <el-table

+ 11 - 9
src/views/issue-paper/IssuePaper.vue

@@ -45,16 +45,18 @@
           style="width: 120px"
         />
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button :disabled="selectedRows.length === 0" @click="batchReset">
-            批量重置
-          </el-button>
-          <el-button @click="exportData">导出</el-button>
-        </el-space>
-      </el-form-item>
     </el-form>
+    <el-divider class="form-divider" />
+
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button :disabled="selectedRows.length === 0" @click="batchReset">
+          批量重置
+        </el-button>
+        <el-button @click="exportData">导出</el-button>
+      </el-space>
+    </div>
   </div>
   <div class="part-box">
     <el-table

+ 15 - 12
src/views/mark/ArbitrationManage.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -37,17 +37,16 @@
       <el-form-item>
         <el-checkbox v-model="searchModel.optional"> 选做题 </el-checkbox>
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="onBatchHandle">批量处理</el-button>
-          <el-button @click="onExport">导出</el-button>
-        </el-space>
-      </el-form-item>
     </el-form>
-  </div>
+    <el-divider class="form-divider" />
 
-  <div class="part-box">
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button @click="onBatchHandle">批量处理</el-button>
+        <el-button @click="onExport">导出</el-button>
+      </el-space>
+    </div>
     <el-table
       class="page-table"
       :data="dataList"
@@ -58,11 +57,15 @@
       @sort-change="handleSortChange"
     >
       <el-table-column type="selection" width="55" />
-      <el-table-column property="subjectCode" label="科目代码" width="120" />
+      <el-table-column
+        property="subjectCode"
+        label="科目代码"
+        min-width="200"
+      />
       <el-table-column
         property="groupNo"
         label="分组序号"
-        width="100"
+        width="110"
         sortable
       />
       <el-table-column property="examCardNo" label="准考证号" width="150" />

+ 11 - 12
src/views/mark/GroupManage.vue

@@ -1,22 +1,21 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="onAdd">新增</el-button>
-          <el-button @click="onDataCheck">数量校对</el-button>
-          <el-button @click="onClose">关闭</el-button>
-          <el-button @click="onSetTrialCount">设置试评数量</el-button>
-        </el-space>
-      </el-form-item>
     </el-form>
-  </div>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button @click="onAdd">新增</el-button>
+        <el-button @click="onDataCheck">数量校对</el-button>
+        <el-button @click="onClose">关闭</el-button>
+        <el-button @click="onSetTrialCount">设置试评数量</el-button>
+      </el-space>
+    </div>
 
-  <div class="part-box">
     <el-table
       class="page-table"
       :data="dataList"

+ 22 - 65
src/views/mark/MarkManage.vue

@@ -1,43 +1,23 @@
 <template>
-  <div class="mark-manage-container">
+  <div class="mark-manage">
     <!-- 顶部标签导航 -->
-    <el-tabs v-model="activeMenu" class="mark-tabs" @tab-click="handleTabClick">
-      <el-tab-pane label="分组管理" name="GroupManage">
+    <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>
-          <span>分组管理</span>
-        </template>
-      </el-tab-pane>
-      <el-tab-pane label="评卷员管理" name="MarkerManage">
-        <template #label>
-          <span>评卷员管理</span>
-        </template>
-      </el-tab-pane>
-      <el-tab-pane label="试评管理" name="TrialManage">
-        <template #label>
-          <span>试评管理</span>
-        </template>
-      </el-tab-pane>
-      <el-tab-pane label="任务管理" name="TaskManage">
-        <template #label>
-          <span>任务管理</span>
-        </template>
-      </el-tab-pane>
-      <el-tab-pane label="仲裁管理" name="ArbitrationManage">
-        <template #label>
-          <span>仲裁管理</span>
-        </template>
-      </el-tab-pane>
-      <el-tab-pane label="质量监控" name="QualityMonitor">
-        <template #label>
-          <span>质量监控</span>
+          <el-button :type="activeMenu === tab.name ? 'primary' : 'default'">{{
+            tab.label
+          }}</el-button>
         </template>
       </el-tab-pane>
     </el-tabs>
 
     <!-- 子页面内容区域 -->
-    <div class="content-container">
-      <router-view />
-    </div>
+    <router-view />
   </div>
 </template>
 
@@ -52,6 +32,16 @@
   const route = useRoute();
   const router = useRouter();
 
+  // 标签页配置
+  const tabs = [
+    { name: 'GroupManage', label: '分组管理' },
+    { name: 'MarkerManage', label: '评卷员管理' },
+    { name: 'TrialManage', label: '试评管理' },
+    { name: 'TaskManage', label: '任务管理' },
+    { name: 'ArbitrationManage', label: '仲裁管理' },
+    { name: 'QualityMonitor', label: '质量监控' },
+  ];
+
   // 当前激活的菜单项
   const activeMenu = ref<string>('');
 
@@ -82,36 +72,3 @@
     }
   });
 </script>
-
-<style scoped>
-  .mark-manage-container {
-    height: 100%;
-    display: flex;
-    flex-direction: column;
-  }
-
-  .mark-tabs {
-    border-bottom: 1px solid var(--el-border-color-light);
-  }
-
-  .mark-tabs :deep(.el-tabs__item) {
-    display: flex;
-    align-items: center;
-    gap: 8px;
-  }
-
-  .mark-tabs :deep(.el-tabs__content) {
-    display: none;
-  }
-
-  .content-container {
-    flex: 1;
-    overflow: auto;
-    padding: 0;
-  }
-
-  /* 移除子页面的顶部间距 */
-  .content-container :deep(.part-box:first-child) {
-    margin-top: 0;
-  }
-</style>

+ 37 - 34
src/views/mark/MarkProgress.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box">
+  <div class="part-box is-border">
     <!-- 统计图表区域 -->
     <div class="chart-container">
       <div class="chart-item">
@@ -13,7 +13,7 @@
     </div>
   </div>
 
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -29,34 +29,33 @@
           <el-option label="未完成" value="0-99" />
         </el-select>
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button
-            type="primary"
-            :loading="closeLoading"
-            @click="onCloseSubject"
-            >关闭</el-button
-          >
-
-          <el-dropdown @command="onExportCommand">
-            <el-button type="primary">
-              导出
-              <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
-            </el-button>
-            <template #dropdown>
-              <el-dropdown-menu>
-                <el-dropdown-item command="fhy">整体评卷进度</el-dropdown-item>
-                <el-dropdown-item command="fhy">评卷员工作量</el-dropdown-item>
-              </el-dropdown-menu>
-            </template>
-          </el-dropdown>
-        </el-space>
-      </el-form-item>
     </el-form>
-  </div>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button
+          type="primary"
+          :loading="closeLoading"
+          @click="onCloseSubject"
+          >关闭</el-button
+        >
+
+        <el-dropdown @command="onExportCommand">
+          <el-button type="primary">
+            导出
+            <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
+          </el-button>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item command="fhy">整体评卷进度</el-dropdown-item>
+              <el-dropdown-item command="fhy">评卷员工作量</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </el-space>
+    </div>
 
-  <div class="part-box">
     <el-table
       class="page-table"
       :data="dataList"
@@ -68,7 +67,7 @@
     >
       <el-table-column type="selection" width="55" />
       <el-table-column property="courseName" label="科目" min-width="200" />
-      <el-table-column label="选做异常" sortable min-width="100">
+      <el-table-column label="选做异常" sortable min-width="110">
         <template #default="scope">
           <el-tag :type="scope.row.isOptionalException ? 'danger' : 'success'">
             {{ scope.row.isOptionalException ? '是' : '否' }}
@@ -78,20 +77,20 @@
       <el-table-column
         property="uploadCount"
         label="上传人数"
-        min-width="100"
+        min-width="110"
         sortable
       />
       <el-table-column
         property="subjectiveTotalScore"
         label="主观总分"
-        min-width="100"
+        min-width="110"
         sortable
       />
       <el-table-column
         property="groupCount"
         label="分组总数"
         sortable
-        min-width="100"
+        min-width="110"
       />
       <el-table-column label="完成进度" min-width="120">
         <template #default="scope">
@@ -104,7 +103,7 @@
       <el-table-column
         property="unReviewedCount"
         label="待复核量"
-        min-width="100"
+        min-width="110"
         sortable
       />
     </el-table>
@@ -123,6 +122,7 @@
   import { reactive, ref, computed, onMounted } from 'vue';
   import { ElMessage } from 'element-plus';
   import { ArrowDown } from '@element-plus/icons-vue';
+  import { useAppStore } from '@/store';
 
   import {
     getMarkStatInfo,
@@ -141,6 +141,7 @@
   defineOptions({
     name: 'MarkProgress',
   });
+  const appStore = useAppStore();
 
   const searchModel = reactive<MarkStatListFilter>({
     subject: null,
@@ -278,8 +279,10 @@
 
   // 获取统计信息
   async function getStatInfo() {
+    if (!appStore.curExam?.id) return;
+
     try {
-      const data = await getMarkStatInfo();
+      const data = await getMarkStatInfo(appStore.curExam.id);
       statInfo.value = data;
     } catch (error) {
       console.error('获取统计信息失败:', error);

+ 14 - 15
src/views/mark/MarkerManage.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -34,21 +34,20 @@
       <el-form-item>
         <el-checkbox v-model.trim="searchModel.marked">已评卷 </el-checkbox>
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="onImport">导入</el-button>
-          <el-button @click="onBatchEnable(true)">启用</el-button>
-          <el-button @click="onBatchEnable(false)">禁用</el-button>
-          <el-button @click="onBatchRecycle">回收</el-button>
-          <el-button @click="onBatchSetTaskCount">设置评卷数</el-button>
-          <el-button @click="onBatchResetPassword">重置密码</el-button>
-        </el-space>
-      </el-form-item>
     </el-form>
-  </div>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button @click="onImport">导入</el-button>
+        <el-button @click="onBatchEnable(true)">启用</el-button>
+        <el-button @click="onBatchEnable(false)">禁用</el-button>
+        <el-button @click="onBatchRecycle">回收</el-button>
+        <el-button @click="onBatchSetTaskCount">设置评卷数</el-button>
+        <el-button @click="onBatchResetPassword">重置密码</el-button>
+      </el-space>
+    </div>
 
-  <div class="part-box">
     <el-table
       class="page-table"
       :data="dataList"
@@ -78,7 +77,7 @@
       <el-table-column
         property="completedCount"
         label="已评数量"
-        width="100"
+        width="120"
         sortable
       >
         <template #default="scope">

+ 15 - 16
src/views/mark/QualityMonitor.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -19,19 +19,18 @@
           不含仲裁
         </el-checkbox>
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button :loading="recalLoading" @click="onRecalculate"
-            >重新计算</el-button
-          >
-          <el-button @click="onViewScoreCurve">给分曲线</el-button>
-        </el-space>
-      </el-form-item>
     </el-form>
-  </div>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button :loading="recalLoading" @click="onRecalculate"
+          >重新计算</el-button
+        >
+        <el-button @click="onViewScoreCurve">给分曲线</el-button>
+      </el-space>
+    </div>
 
-  <div class="part-box">
     <el-table
       class="page-table"
       :data="dataList"
@@ -40,8 +39,8 @@
       stripe
       @sort-change="handleSortChange"
     >
-      <el-table-column property="group" label="分组" width="100" sortable />
-      <el-table-column property="markerId" label="评卷员" width="120" />
+      <el-table-column property="group" label="分组" width="80" sortable />
+      <el-table-column property="markerId" label="评卷员" min-width="120" />
       <el-table-column property="name" label="姓名" min-width="100" />
       <el-table-column
         property="completedTasks"
@@ -63,7 +62,7 @@
       <el-table-column
         property="returnCount"
         label="打回次数"
-        width="100"
+        width="110"
         sortable
       />
       <el-table-column label="评卷采用率" width="120" sortable>
@@ -74,7 +73,7 @@
       <el-table-column
         property="markingSpeed"
         label="评卷速度(秒)"
-        width="120"
+        width="130"
         sortable
       />
       <el-table-column

+ 15 - 12
src/views/mark/TaskManage.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -96,17 +96,16 @@
       <el-form-item>
         <el-checkbox v-model="searchModel.optional"> 选做题 </el-checkbox>
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <!--TODO: 待复核数量 -->
-          <el-button @click="onExport">待复核:0</el-button>
-        </el-space>
-      </el-form-item>
     </el-form>
-  </div>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <!--TODO: 待复核数量 -->
+        <el-button @click="onExport">待复核:0</el-button>
+      </el-space>
+    </div>
 
-  <div class="part-box">
     <el-table
       class="page-table"
       :data="dataList"
@@ -115,11 +114,15 @@
       stripe
       @sort-change="handleSortChange"
     >
-      <el-table-column property="subjectCode" label="科目代码" width="120" />
+      <el-table-column
+        property="subjectCode"
+        label="科目代码"
+        min-width="200"
+      />
       <el-table-column
         property="groupNo"
         label="分组序号"
-        width="100"
+        width="110"
         sortable
       />
       <el-table-column property="examCardNo" label="准考证号" width="150" />

+ 16 - 13
src/views/mark/TrialManage.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -31,16 +31,15 @@
         >
         </el-input>
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="onExport">导出</el-button>
-        </el-space>
-      </el-form-item>
     </el-form>
-  </div>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button @click="onExport">导出</el-button>
+      </el-space>
+    </div>
 
-  <div class="part-box">
     <el-table
       class="page-table"
       :data="dataList"
@@ -49,11 +48,15 @@
       stripe
       @sort-change="handleSortChange"
     >
-      <el-table-column property="subjectCode" label="科目代码" width="120" />
+      <el-table-column
+        property="subjectCode"
+        label="科目代码"
+        min-width="200"
+      />
       <el-table-column
         property="groupNo"
         label="分组序号"
-        width="100"
+        width="110"
         sortable
       />
       <el-table-column property="examCardNo" label="准考证号" width="150" />
@@ -62,7 +65,7 @@
       <el-table-column
         property="totalScore"
         label="评卷总分"
-        width="100"
+        width="110"
         sortable
       />
       <el-table-column
@@ -74,7 +77,7 @@
       <el-table-column
         property="markingTime"
         label="评卷时间"
-        width="180"
+        width="200"
         sortable
       />
       <el-table-column label="操作" width="120" fixed="right">

+ 28 - 24
src/views/review/AllReview.vue

@@ -155,28 +155,32 @@
         />
       </el-form-item>
     </el-form>
-    <el-space wrap>
-      <el-button type="primary" @click="toPage(1)">查询</el-button>
-      <el-button @click="onBatchReview"
-        >批量复核({{ pagination.total }})</el-button
-      >
-      <el-button @click="onBatchCancelReview">取消复核</el-button>
-      <el-button @click="onImport">导入</el-button>
-      <el-dropdown @command="onExportCommand">
-        <el-button type="primary">
-          导出
-          <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
-        </el-button>
-        <template #dropdown>
-          <el-dropdown-menu>
-            <el-dropdown-item command="list">复核列表</el-dropdown-item>
-            <el-dropdown-item command="gzl">工作量</el-dropdown-item>
-          </el-dropdown-menu>
-        </template>
-      </el-dropdown>
-      <el-button @click="onExportSign">导出标记卷</el-button>
-      <el-button @click="onExportLog">错误日志</el-button>
-    </el-space>
+    <el-divider class="form-divider" />
+
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button @click="onBatchReview"
+          >批量复核({{ pagination.total }})</el-button
+        >
+        <el-button @click="onBatchCancelReview">取消复核</el-button>
+        <el-button @click="onImport">导入</el-button>
+        <el-dropdown @command="onExportCommand">
+          <el-button type="primary">
+            导出
+            <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
+          </el-button>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item command="list">复核列表</el-dropdown-item>
+              <el-dropdown-item command="gzl">工作量</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-button @click="onExportSign">导出标记卷</el-button>
+        <el-button @click="onExportLog">错误日志</el-button>
+      </el-space>
+    </div>
   </div>
 
   <div class="part-box">
@@ -193,7 +197,7 @@
       <el-table-column
         property="courseName"
         label="科目"
-        width="150"
+        min-width="200"
         sortable
       />
       <el-table-column property="secretNo" label="密号" width="120" />
@@ -209,7 +213,7 @@
       <el-table-column
         property="totalScore"
         label="试卷总分"
-        width="100"
+        width="110"
         sortable
       />
       <el-table-column

+ 11 - 11
src/views/review/ScoreQuery.vue

@@ -1,13 +1,13 @@
 <template>
-  <div class="part-box">
-    <el-space wrap>
-      <el-button>查重</el-button>
-      <el-button>批量校验:{{ dataList.length }}</el-button>
-      <el-button @click="onExport">导出</el-button>
-    </el-space>
-  </div>
-
-  <div class="part-box">
+  <div class="part-box is-border">
+    <div class="part-action">
+      <el-space wrap>
+        <el-button>查重</el-button>
+        <el-button>批量校验:{{ dataList.length }}</el-button>
+        <el-button @click="onExport">导出</el-button>
+      </el-space>
+    </div>
+    <el-divider class="form-divider" />
     <el-table
       class="page-table"
       :data="dataList"
@@ -26,8 +26,8 @@
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column property="paperScore" label="试卷总分" width="120" />
-      <el-table-column property="scoreDetail" label="得分明细" min-width="300">
+      <el-table-column property="paperScore" label="试卷总分" width="100" />
+      <el-table-column property="scoreDetail" label="得分明细" min-width="200">
       </el-table-column>
     </el-table>
     <el-pagination

+ 10 - 11
src/views/review/ScoreReviewStatistics.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box">
+  <div class="part-box is-border">
     <!-- 统计图表区域 -->
     <div class="chart-container">
       <div class="chart-item">
@@ -13,7 +13,7 @@
     </div>
   </div>
 
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subjectId"></select-subject>
@@ -44,9 +44,8 @@
         <el-button type="primary" @click="toPage(1)">查询</el-button>
       </el-form-item>
     </el-form>
-  </div>
+    <el-divider class="form-divider" />
 
-  <div class="part-box">
     <el-table
       class="page-table"
       :data="dataList"
@@ -56,7 +55,7 @@
       @sort-change="handleSortChange"
     >
       <el-table-column property="courseName" label="科目" min-width="200" />
-      <el-table-column label="选做科目" min-width="100" sortable>
+      <el-table-column label="选做科目" min-width="110" sortable>
         <template #default="scope">
           <el-tag :type="scope.row.isOptional ? 'success' : 'info'">
             {{ scope.row.isOptional ? '是' : '否' }}
@@ -66,28 +65,28 @@
       <el-table-column
         property="paperCount"
         label="试卷总量"
-        min-width="100"
+        min-width="110"
         sortable
       />
       <el-table-column
         property="taskCount"
         label="任务数"
-        min-width="80"
+        min-width="100"
         sortable
       />
       <el-table-column
         property="reviewedCount"
         label="已复核数"
-        width="100"
+        width="110"
         sortable
       />
       <el-table-column
         property="unReviewedCount"
         label="待复核数"
-        min-width="100"
+        min-width="110"
         sortable
       />
-      <el-table-column label="完成进度" min-width="100" sortable>
+      <el-table-column label="完成进度" min-width="110" sortable>
         <template #default="scope">
           <el-progress
             :percentage="scope.row.progress"
@@ -98,7 +97,7 @@
       <el-table-column
         property="reviewedTimes"
         label="已复核次数"
-        min-width="100"
+        min-width="120"
         sortable
       />
     </el-table>

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

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -31,8 +31,9 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 18 - 3
src/views/scan/ScanManage.vue

@@ -1,12 +1,27 @@
 <template>
   <el-tabs v-model="activeTab" type="card" class="page-tab">
-    <el-tab-pane label="按科目统计" name="course">
+    <el-tab-pane name="course">
+      <template #label>
+        <el-button :type="activeTab === 'course' ? 'primary' : 'default'"
+          >按科目统计</el-button
+        >
+      </template>
       <ScanCourseStats />
     </el-tab-pane>
-    <el-tab-pane label="按考点统计" name="point">
+    <el-tab-pane name="point">
+      <template #label>
+        <el-button :type="activeTab === 'point' ? 'primary' : 'default'"
+          >按考点统计</el-button
+        >
+      </template>
       <ScanPointStats />
     </el-tab-pane>
-    <el-tab-pane label="签到表统计" name="signPaper">
+    <el-tab-pane name="signPaper">
+      <template #label>
+        <el-button :type="activeTab === 'signPaper' ? 'primary' : 'default'"
+          >签到表统计</el-button
+        >
+      </template>
       <SignPaperStats />
     </el-tab-pane>
   </el-tabs>

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

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="考点">
         <el-input
@@ -17,8 +17,8 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
+
     <el-table
       class="page-table"
       :data="dataList"

+ 4 - 15
src/views/scan/SignPaperStats.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form inline>
       <el-form-item label="签到表编号">
         <el-input
@@ -27,8 +27,7 @@
         </el-space>
       </el-form-item>
     </el-form>
-  </div>
-  <div class="part-box">
+    <el-divider class="form-divider" />
     <el-table
       class="page-table"
       :data="dataList"
@@ -36,18 +35,8 @@
       border
       stripe
     >
-      <el-table-column
-        property="signPaperNo"
-        label="签到表编号"
-        width="150"
-        sortable
-      />
-      <el-table-column
-        property="imageCount"
-        label="图片数量"
-        width="100"
-        sortable
-      />
+      <el-table-column property="signPaperNo" label="签到表编号" sortable />
+      <el-table-column property="imageCount" label="图片数量" sortable />
       <el-table-column label="操作" width="100" fixed="right">
         <template #default="scope">
           <el-button size="small" link @click="onView(scope.row)">

+ 11 - 16
src/views/score/ScoreQuery.vue

@@ -165,50 +165,45 @@
       stripe
       @sort-change="handleSortChange"
     >
-      <el-table-column property="examNo" label="准考证号" min-width="120" />
+      <el-table-column property="examNo" label="准考证号" width="120" />
       <el-table-column property="name" label="姓名" min-width="100" />
-      <el-table-column
-        property="studentNo"
-        label="学号"
-        min-width="120"
-        sortable
-      />
-      <el-table-column property="subject" label="科目" min-width="120" />
+      <el-table-column property="studentNo" label="学号" width="120" sortable />
+      <el-table-column property="subject" label="科目" min-width="200" />
       <el-table-column property="level" label="层次" min-width="100" />
-      <el-table-column property="majorType" label="专业类型" min-width="120" />
+      <el-table-column property="majorType" label="专业类型" width="100" />
       <el-table-column
         property="objectiveScore"
         label="客观总分"
-        min-width="100"
+        width="110"
         sortable
       />
       <el-table-column
         property="subjectiveScore"
         label="主观总分"
-        min-width="100"
+        width="110"
         sortable
       />
       <el-table-column
         property="totalScore"
         label="全卷总分"
-        min-width="100"
+        min-width="110"
         sortable
       />
-      <el-table-column label="是否缺考" min-width="100" sortable>
+      <el-table-column label="是否缺考" width="110" sortable>
         <template #default="scope">
           <el-tag :type="scope.row.isAbsent ? 'danger' : 'success'">
             {{ scope.row.isAbsent ? '是' : '否' }}
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="是否上传" min-width="100">
+      <el-table-column label="是否上传" width="100">
         <template #default="scope">
           <el-tag :type="scope.row.isUpload ? 'success' : 'warning'">
             {{ scope.row.isUpload ? '是' : '否' }}
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="是否违纪" min-width="100">
+      <el-table-column label="是否违纪" width="100">
         <template #default="scope">
           <el-tag :type="scope.row.isDisciplinary ? 'danger' : 'success'">
             {{ scope.row.isDisciplinary ? '是' : '否' }}
@@ -218,7 +213,7 @@
       <el-table-column
         property="college"
         label="学院"
-        min-width="120"
+        min-width="100"
         sortable
       />
       <el-table-column property="className" label="班级" min-width="100" />

+ 62 - 5
src/views/student/StudentManage.vue

@@ -161,12 +161,25 @@
         </el-input-number>
       </el-form-item>
     </el-form>
+    <el-divider class="form-divider" />
     <div class="part-action box-justify">
       <el-space wrap>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
         <el-button @click="onAdd">添加</el-button>
         <el-button type="success" @click="onImport">导入</el-button>
-        <el-button @click="exportData">导出</el-button>
+        <el-dropdown @command="onImportCommand">
+          <el-button type="primary">
+            导入
+            <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
+          </el-button>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item command="breaking">违纪名单</el-dropdown-item>
+              <el-dropdown-item command="miss">缺考名单</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-button @click="exportData">导入名单</el-button>
       </el-space>
 
       <table-field v-model="headFields" :fields="tableFields"></table-field>
@@ -232,7 +245,7 @@
       <el-table-column
         v-if="checkFieldVisible('scanRecognition')"
         label="扫描识别"
-        width="80"
+        width="100"
       >
         <template #default="scope">
           <el-tag :type="scope.row.scanRecognition ? 'success' : 'danger'">
@@ -252,12 +265,12 @@
         v-if="checkFieldVisible('scanPages')"
         property="scanPages"
         label="扫描张数"
-        width="80"
+        width="100"
       />
       <el-table-column
         v-if="checkFieldVisible('manualAssign')"
         label="人工指定"
-        width="80"
+        width="100"
       >
         <template #default="scope">
           <el-tag :type="scope.row.manualAssign ? 'success' : 'danger'">
@@ -342,6 +355,16 @@
     download-filename="学生导入模板.xlsx"
   />
 
+  <!-- 导入名单 -->
+  <ImportDialog
+    ref="importUserDialogRef"
+    :title="importConfig?.title"
+    :upload-url="importConfig?.url"
+    :format="importConfig?.format"
+    :download-handle="downloadTemplate"
+    :download-filename="importConfig?.donloadFilename"
+  />
+
   <!-- 查看图片 -->
   <el-image-viewer
     v-if="showPreview"
@@ -352,7 +375,8 @@
 </template>
 
 <script setup lang="ts">
-  import { reactive, ref } from 'vue';
+  import { reactive, ref, computed } from 'vue';
+  import { ArrowDown } from '@element-plus/icons-vue';
   import { getStudentList } from '@/api/student';
   import { StudentItem, StudentListFilter } from '@/api/types/student';
   import useTable from '@/hooks/table';
@@ -442,6 +466,39 @@
     importDialogRef.value?.open();
   }
 
+  // 导入名单
+  const impoartConfigList = ref([
+    {
+      code: 'breaking',
+      title: '缺考名单',
+      url: '/api/admin/subject/import/kgt',
+      format: ['xls', 'xlsx'],
+      donloadFilename: '缺考名单导入模板.xlsx',
+    },
+    {
+      code: 'miss',
+      title: '违纪名单',
+      url: '/api/admin/subject/import/kgt',
+      format: ['xls', 'xlsx'],
+      donloadFilename: '违纪名单导入模板.xlsx',
+    },
+  ]);
+  const importUserDialogRef = ref();
+  const importData = reactive({
+    importType: 'breaking',
+  });
+  const importConfig = computed(() => {
+    return impoartConfigList.value.find(
+      (item) => item.code === importData.importType
+    );
+  });
+  const onImportCommand = (command: string) => {
+    console.log('导入命令:', command);
+    importData.importType = command;
+    importUserDialogRef.value?.open();
+  };
+
+  // 导出
   function exportData() {
     // TODO: 实现导出功能
   }

+ 49 - 65
src/views/subject/SubjectManage.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="part-box">
+  <div class="part-box is-border">
     <!-- 科目总分统计图表 -->
     <div class="chart-container">
       <h3>科目总分统计</h3>
@@ -7,7 +7,7 @@
     </div>
   </div>
 
-  <div class="part-box is-filter">
+  <div class="part-box is-border">
     <el-form :model="searchModel" inline>
       <el-form-item label="科目">
         <select-subject v-model="searchModel.subject"></select-subject>
@@ -69,55 +69,54 @@
           style="width: 120px"
         />
       </el-form-item>
-      <el-form-item>
-        <el-space wrap>
-          <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-dropdown @command="onImportCommand">
-            <el-button type="primary">
-              导入
-              <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
-            </el-button>
-            <template #dropdown>
-              <el-dropdown-menu>
-                <el-dropdown-item command="objective">客观题</el-dropdown-item>
-                <el-dropdown-item command="subjectivewStruct"
-                  >主观题结构</el-dropdown-item
-                >
-                <el-dropdown-item command="subjectivewGroup"
-                  >主观题分组</el-dropdown-item
-                >
-              </el-dropdown-menu>
-            </template>
-          </el-dropdown>
+    </el-form>
+    <el-divider class="form-divider" />
+    <div class="part-action">
+      <el-space wrap>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-dropdown @command="onImportCommand">
+          <el-button type="primary">
+            导入
+            <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
+          </el-button>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item command="objective">客观题</el-dropdown-item>
+              <el-dropdown-item command="subjectivewStruct"
+                >主观题结构</el-dropdown-item
+              >
+              <el-dropdown-item command="subjectivewGroup"
+                >主观题分组</el-dropdown-item
+              >
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
 
-          <el-dropdown @command="onExportCommand">
-            <el-button type="primary">
-              导出
-              <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
-            </el-button>
-            <template #dropdown>
-              <el-dropdown-menu>
-                <el-dropdown-item command="fhy">客观题</el-dropdown-item>
-                <el-dropdown-item command="fhy">主观题</el-dropdown-item>
-              </el-dropdown-menu>
-            </template>
-          </el-dropdown>
+        <el-dropdown @command="onExportCommand">
+          <el-button type="primary">
+            导出
+            <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
+          </el-button>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item command="fhy">客观题</el-dropdown-item>
+              <el-dropdown-item command="fhy">主观题</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
 
-          <el-button type="success" :loading="loading" @click="onObjectiveMark"
-            >客观题统计</el-button
-          >
-          <el-button type="primary" :loading="loading" @click="onAnalysis"
-            >分析统计</el-button
-          >
-          <el-button type="primary" @click="onImportCommand('package')"
-            >导入数据包</el-button
-          >
-        </el-space>
-      </el-form-item>
-    </el-form>
-  </div>
+        <el-button type="success" :loading="loading" @click="onObjectiveMark"
+          >客观题统计</el-button
+        >
+        <el-button type="primary" :loading="loading" @click="onAnalysis"
+          >分析统计</el-button
+        >
+        <el-button type="primary" @click="onImportCommand('package')"
+          >导入数据包</el-button
+        >
+      </el-space>
+    </div>
 
-  <div class="part-box">
     <el-table
       v-loading="loadingTable"
       :data="dataList"
@@ -319,6 +318,7 @@
 
   // 获取科目总分统计数据
   const getStatData = async () => {
+    if (!appStore.curExam?.id) return;
     try {
       // 这里需要传入实际的examId,暂时使用1作为示例
       const data = await getSubjectTotalScoreStatList(appStore.curExam.id);
@@ -430,23 +430,7 @@
   }
 
   onMounted(() => {
-    getList();
+    // getList();
     getStatData();
   });
 </script>
-
-<style scoped>
-  .chart-container {
-    padding: 20px;
-    background: #fff;
-    border-radius: 4px;
-    margin-bottom: 20px;
-  }
-
-  .chart-container h3 {
-    margin: 0 0 20px 0;
-    font-size: 16px;
-    font-weight: 500;
-    color: #303133;
-  }
-</style>