Jelajahi Sumber

feat: test-考生和考试

zhangjie 2 hari lalu
induk
melakukan
2a76d81aec

+ 7 - 5
src/api/exam.ts

@@ -13,7 +13,7 @@ import {
 export function getExamList(
   params: ExamListPageParam
 ): Promise<ExamListPageRes> {
-  return axios.post('/api/admin/exam/list', params);
+  return axios.post('/api/admin/exam/query', params);
 }
 // 考试详情
 export function getExamDetail(examId: number): Promise<ExamItem> {
@@ -26,10 +26,12 @@ export function updateExam(data: ExamUpdateParam): Promise<ExamItem> {
   if (ndata.sheetConfig) {
     ndata.sheetConfig = JSON.stringify(ndata.sheetConfig);
   }
-  if (ndata.id) {
-    return axios.post('/api/admin/exam/update', ndata);
-  }
-  return axios.post('/api/admin/exam/save', ndata);
+  const url = ndata.id ? '/api/admin/exam/update' : '/api/admin/exam/save';
+  return axios.post(url, ndata, {
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  });
 }
 
 // 获取考试统计详情信息

+ 1 - 1
src/api/reject.ts

@@ -62,7 +62,7 @@ export function updateRejectType(params: RejectTypeUpdateParam): Promise<any> {
   if (params.id) {
     return axios.post('/api/admin/exam/reject/type/update', params);
   }
-  return axios.post('/api/admin/exam/reject/type/save', {}, params);
+  return axios.post('/api/admin/exam/reject/type/save', params);
 }
 // 删除打回类型
 export function deleteRejectType(id: number): Promise<any> {

+ 6 - 4
src/api/student.ts

@@ -15,10 +15,12 @@ export function getStudentList(
 }
 // 新增或编辑考生
 export function updateStudent(data: StudentUpdateParam): Promise<StudentItem> {
-  if (data.id) {
-    return axios.post('/api/admin/student/update', data);
-  }
-  return axios.post('/api/admin/student/add', data);
+  const url = data.id ? '/api/admin/student/update' : '/api/admin/student/add';
+  return axios.post(url, data, {
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  });
 }
 
 // 删除考生

+ 3 - 1
src/api/types/exam.ts

@@ -97,7 +97,9 @@ export interface ExamListFilter {
 export type ExamListPageParam = PageParams<ExamListFilter>;
 
 // 基础配置
-export type ExamUpdateParam = Omit<ExamItem, 'id' | 'createTime'>;
+export type ExamUpdateParam = Omit<ExamItem, 'id' | 'createTime'> & {
+  id?: number;
+};
 
 // 统计详情
 export interface ExamStatDetailInfo {

+ 1 - 1
src/api/types/student.ts

@@ -107,7 +107,7 @@ export interface StudentUpdateParam {
   // 准考证号
   examNumber: string;
   // 科目
-  subject: string;
+  subjectCode: string;
   // 学院
   college: string;
   // 班级

+ 5 - 1
src/api/user.ts

@@ -156,7 +156,11 @@ export function saveExportFields(data: {
   type: 'STUDENT' | 'SCORE';
   cols: string[];
 }): Promise<boolean> {
-  return axios.post('/api/admin/user/export/cols/save', paramsSerializer(data));
+  return axios.post('/api/admin/user/export/cols/save', data, {
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  });
 }
 
 // 角色权限 ------->

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

@@ -272,3 +272,13 @@
     color: var(--color-text-dark);
   }
 }
+
+.el-message-box {
+  padding: 16px;
+  .el-message-box__status.el-message-box-icon--warning {
+    color: var(--color-danger);
+  }
+  .el-message-box__content {
+    min-height: 40px;
+  }
+}

+ 4 - 2
src/components/import-dialog/index.vue

@@ -73,7 +73,7 @@
 <script setup lang="ts">
   import { computed, ref } from 'vue';
   import { fileMD5 } from '@/utils/md5';
-  import { ElMessage } from 'element-plus';
+  import { ElMessage, ElMessageBox } from 'element-plus';
   import type {
     UploadRequestOptions,
     UploadFile,
@@ -292,7 +292,9 @@
       success: true,
       message: '上传成功!',
     };
-    ElMessage.success(props.successMessage || response.message);
+    ElMessageBox.alert(props.successMessage || response.message, {
+      dangerouslyUseHTMLString: true,
+    });
     emit('uploadSuccess', {
       ...result.value,
       filename: uploadFile.name,

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

@@ -20,14 +20,14 @@ const selectConfig: Record<string, SelectConfigValue> = {
   subjectPaperType: '/api/admin/subject/getPaperType',
   // 科目层次
   subjectLevel: '/api/admin/subject/level/list',
+  // 专业类型
+  subjectCategory: '/api/admin/subject/category/list',
   // 学院
   college: '/api/admin/student/college/list',
   // 班级
   className: '/api/admin/student/className/list',
   // 考点
   examPoint: '/api/admin/student/examSite/list',
-  // 专业类型
-  subjectCategory: '/api/admin/student/category/list',
   // 仲裁类型
   arbitrationType: '/api/admin/exam/arbitrate/status',
   // 人工确认类型

+ 1 - 1
src/store/modules/app/menuData.ts

@@ -70,7 +70,7 @@ export const adminMenus = [
   },
   {
     id: 301,
-    name: '考试管理',
+    name: '考试批次管理',
     code: 'ExamManage',
     icon: '',
     privilegetype: 'MENU',

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

@@ -20,4 +20,6 @@ export const relateRoutes = {
     'QualityMonitor',
     'ScoreCurve',
   ],
+  ExamManage: ['ExamEdit'],
+  SubjectManage: ['PaperStructEdit', 'OptionalRuleEdit'],
 };

+ 3 - 0
src/utils/filter.ts

@@ -39,3 +39,6 @@ export const dictFilter = {
 export function timestampFilter(val: number | null | undefined): string {
   return val ? formatDate('YYYY-MM-DD HH:mm:ss', new Date(val)) : DEFAULT_LABEL;
 }
+export function dateFilter(val: number | null | undefined): string {
+  return val ? formatDate('YYYY-MM-DD', new Date(val)) : DEFAULT_LABEL;
+}

+ 14 - 8
src/views/exam/ExamEdit.vue

@@ -19,7 +19,7 @@
           <div class="section-body">
             <el-form-item label="考试名称" prop="name" label-width="110px">
               <el-input
-                v-model="formModel.name"
+                v-model.trim="formModel.name"
                 placeholder="请输入考试名称"
                 style="width: 200px"
               />
@@ -67,8 +67,12 @@
                 placeholder="请选择"
                 style="width: 200px"
               >
-                <el-option label="A4" value="1" />
-                <el-option label="A3" value="2" />
+                <el-option
+                  v-for="(val, key) in EXAM_STATUS"
+                  :key="key"
+                  :label="val"
+                  :value="key"
+                />
               </el-select>
             </el-form-item>
           </div>
@@ -85,7 +89,7 @@
           <div class="section-body">
             <div class="section-part">
               <h4 class="section-part-title">评卷给分方式</h4>
-              <el-space size="40">
+              <el-space :size="40">
                 <el-form-item
                   label="评卷模式"
                   prop="markMode"
@@ -286,7 +290,7 @@
                 <el-col :span="16">
                   <el-form-item label="备注描述" label-width="110px">
                     <el-input
-                      v-model="formModel.description"
+                      v-model.trim="formModel.description"
                       type="textarea"
                       :rows="4"
                       maxlength="999"
@@ -332,8 +336,9 @@
   import { getExamDetail, updateExam } from '@/api/exam';
   import type { ExamUpdateParam, ExamAdvancedConfig } from '@/api/types/exam';
   import useLoading from '@/hooks/loading';
-  import { MARKING_MODE, EXAM_TYPE } from '@/constants/enumerate';
+  import { MARKING_MODE, EXAM_TYPE, EXAM_STATUS } from '@/constants/enumerate';
   import { CoverArea } from '@/api/types/common';
+  import { objModifyAssign } from '@/utils/utils';
 
   import SelectImgArea from '@/components/select-img-area/index.vue';
   import ExamAdvancedDialog from './components/ExamAdvancedDialog.vue';
@@ -355,8 +360,9 @@
   // 表单数据
   const getInitialFormState = () => {
     const initialFormState: Partial<ExamUpdateParam> = {
+      id: undefined,
       name: '',
-      type: 'SCAN',
+      type: 'SCAN_IMAGE',
       examTime: '',
       startTime: '',
       endTime: '',
@@ -413,7 +419,7 @@
     setLoading(true);
     try {
       const result = await getExamDetail(examId.value);
-      Object.assign(formModel, result);
+      objModifyAssign(formModel, result);
     } catch (error) {
       console.error('获取考试详情失败:', error);
       ElMessage.error('获取考试详情失败');

+ 14 - 10
src/views/exam/ExamManage.vue

@@ -42,10 +42,10 @@
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
-        <el-button type="success" :loading="finishLoading" @click="onFinish"
+        <el-button type="success" @click="onAdd">新建考试</el-button>
+        <el-button :loading="finishLoading" @click="onFinish"
           >结束考试</el-button
         >
-        <el-button type="success" @click="onAdd">新建考试</el-button>
       </el-form-item>
     </el-form>
   </div>
@@ -58,7 +58,7 @@
       stripe
       @selection-change="handleSelectionChange"
     >
-      <el-table-column type="index" label="序号" width="60" />
+      <el-table-column type="selection" width="55" />
       <el-table-column prop="id" label="ID" width="80" />
       <el-table-column prop="name" label="考试名称" min-width="200">
         <template #default="scope">
@@ -67,20 +67,24 @@
           }}</el-button>
         </template>
       </el-table-column>
-      <el-table-column prop="type" label="类型" width="100">
+      <el-table-column prop="type" label="类型" width="140">
         <template #default="scope">
           {{ dictFilter.examType(scope.row.type) }}
         </template>
       </el-table-column>
-      <el-table-column prop="examTime" label="考试日期" width="120" />
+      <el-table-column prop="examTime" label="考试日期" min-width="100">
+        <template #default="scope">
+          {{ dateFilter(scope.row.examTime) }}
+        </template>
+      </el-table-column>
       <el-table-column prop="forceSpecialTag" label="强制标记" width="100">
         <template #default="scope">
-          <el-tag :type="scope.row.forceSpecialTag ? 'warning' : 'info'">
+          <el-tag :type="scope.row.forceSpecialTag ? 'primary' : 'info'">
             {{ scope.row.forceSpecialTag ? '是' : '否' }}
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column prop="status" label="状态" width="100">
+      <el-table-column prop="status" label="状态" min-width="100">
         <template #default="scope">
           {{ dictFilter.examStatus(scope.row.status) }}
         </template>
@@ -132,7 +136,7 @@
   import { EXAM_STATUS, EXAM_TYPE } from '@/constants/enumerate';
   import useTable from '@/hooks/table';
   import useLoading from '@/hooks/loading';
-  import { dictFilter } from '@/utils/filter';
+  import { dictFilter, dateFilter } from '@/utils/filter';
   import { modalConfirm } from '@/utils/ui';
 
   import ExamStatDialog from './components/ExamStatDialog.vue';
@@ -159,7 +163,7 @@
     toPage,
     pageSizeChange,
     handleSelectionChange,
-  } = useTable<ExamQueryItem>(getExamList, searchModel, false);
+  } = useTable<ExamQueryItem>(getExamList, searchModel, true);
 
   // action相关
   const currentExamId = ref(0);
@@ -179,7 +183,7 @@
   async function onFinish() {
     if (finishLoading.value) return;
     if (selectedRows.value.length === 0) {
-      ElMessage.warning('请先选择考试');
+      ElMessage.error('请先选择考试');
       return;
     }
 

+ 2 - 2
src/views/exam/components/ExamStatDialog.vue

@@ -91,7 +91,7 @@
     },
     {
       name: '扫描进度',
-      attribute: `已扫描 ${statInfo.value.scanCount}%`,
+      attribute: `已扫描 ${statInfo.value.scanCount} 个考生`,
       type: 'scanProgress',
       router: 'ScanManage',
     },
@@ -103,7 +103,7 @@
     },
     {
       name: '评卷进度',
-      attribute: `已评卷 ${statInfo.value.markedCount}%`,
+      attribute: `已评完 ${statInfo.value.markedCount} 个考生`,
       type: 'markingProgress',
       router: 'MarkProgress',
     },

+ 1 - 1
src/views/exam/components/ModifyIssuePaperType.vue

@@ -18,7 +18,7 @@
     >
       <el-form-item label="分类名称" prop="name">
         <el-input
-          v-model="formModel.name"
+          v-model.trim="formModel.name"
           placeholder="请输入分类名称"
           maxlength="50"
         />

+ 1 - 1
src/views/exam/components/ModifyRejectType.vue

@@ -18,7 +18,7 @@
     >
       <el-form-item label="分类名称" prop="name">
         <el-input
-          v-model="formModel.name"
+          v-model.trim="formModel.name"
           placeholder="请输入分类名称"
           maxlength="50"
         />

+ 20 - 12
src/views/student/ModifyStudent.vue

@@ -16,34 +16,42 @@
       :rules="rules"
       label-width="100px"
     >
-      <el-form-item label="科目" prop="subject">
-        <select-subject v-model="formModel.subject"></select-subject>
+      <el-form-item label="科目" prop="subjectCode">
+        <select-subject
+          v-model="formModel.subjectCode"
+          :disabled="isEdit"
+        ></select-subject>
       </el-form-item>
       <el-form-item label="姓名" prop="name">
-        <el-input v-model="formModel.name" placeholder="请输入姓名" />
+        <el-input v-model.trim="formModel.name" placeholder="请输入姓名" />
       </el-form-item>
       <el-form-item label="学号" prop="studentCode">
-        <el-input v-model="formModel.studentCode" placeholder="请输入学号" />
+        <el-input
+          v-model.trim="formModel.studentCode"
+          placeholder="请输入学号"
+        />
       </el-form-item>
       <el-form-item label="准考证号" prop="examNumber">
         <el-input
-          v-model="formModel.examNumber"
+          v-model.trim="formModel.examNumber"
           placeholder="请输入准考证号"
-          :disabled="isEdit"
         />
       </el-form-item>
       <el-form-item label="学院" prop="college">
-        <el-input v-model="formModel.college" placeholder="请输入学院" />
+        <el-input v-model.trim="formModel.college" placeholder="请输入学院" />
       </el-form-item>
       <el-form-item label="班级" prop="className">
-        <el-input v-model="formModel.className" placeholder="请输入班级" />
+        <el-input v-model.trim="formModel.className" placeholder="请输入班级" />
       </el-form-item>
       <el-form-item label="任课老师" prop="teacher">
-        <el-input v-model="formModel.teacher" placeholder="请输入任课老师" />
+        <el-input
+          v-model.trim="formModel.teacher"
+          placeholder="请输入任课老师"
+        />
       </el-form-item>
       <el-form-item label="签到表编号">
         <el-input
-          v-model="formModel.packageCode"
+          v-model.trim="formModel.packageCode"
           placeholder="请输入签到表编号"
         />
       </el-form-item>
@@ -98,13 +106,13 @@
     className: '',
     teacher: '',
     packageCode: '',
-    subject: '',
+    subjectCode: '',
   };
 
   const formModel = reactive({ ...initialFormState });
 
   const rules: FormRules<keyof StudentUpdateParam> = {
-    subject: [{ required: true, message: '请选择科目', trigger: 'change' }],
+    subjectCode: [{ required: true, message: '请选择科目', trigger: 'change' }],
     name: [{ required: true, message: '请输入姓名', trigger: 'change' }],
     studentCode: [{ required: true, message: '请输入学号', trigger: 'change' }],
     examNumber: [

+ 63 - 59
src/views/student/StudentManage.vue

@@ -4,7 +4,7 @@
       <el-form-item label="姓名">
         <el-input
           v-model.trim="searchModel.name"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -12,7 +12,7 @@
       <el-form-item label="准考证号">
         <el-input
           v-model.trim="searchModel.examNumber"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -20,7 +20,7 @@
       <el-form-item label="密号">
         <el-input
           v-model.trim="searchModel.secretNumber"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -28,7 +28,7 @@
       <el-form-item label="学号">
         <el-input
           v-model.trim="searchModel.studentCode"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -37,14 +37,8 @@
         <select-subject v-model="searchModel.subjectCode"></select-subject>
       </el-form-item>
       <el-form-item label="层次">
-        <el-select
-          v-model="searchModel.subjectLevel"
-          placeholder="不限"
-          clearable
-          style="width: 120px"
-        >
-          <el-option label="请选择" value="" />
-        </el-select>
+        <select-option v-model="searchModel.subjectLevel" type="subjectLevel">
+        </select-option>
       </el-form-item>
       <el-form-item label="专业类型">
         <select-option
@@ -96,7 +90,7 @@
       <el-form-item label="签到表编号">
         <el-input
           v-model.trim="searchModel.packageCode"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -104,7 +98,7 @@
       <el-form-item label="批次编号">
         <el-input
           v-model.trim="searchModel.batchCode"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -124,7 +118,7 @@
       <el-form-item label="任课老师">
         <el-input
           v-model.trim="searchModel.teacher"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -132,7 +126,7 @@
       <el-form-item label="考点">
         <el-input
           v-model.trim="searchModel.examSite"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -140,7 +134,7 @@
       <el-form-item label="考场">
         <el-input
           v-model.trim="searchModel.examRoom"
-          placeholder="请选择"
+          placeholder="请输入"
           clearable
         >
         </el-input>
@@ -155,6 +149,7 @@
           :controls="false"
           step-strictly
           style="width: 100px"
+          placeholder="请输入"
         >
         </el-input-number>
       </el-form-item>
@@ -196,19 +191,18 @@
       stripe
       @sort-change="handleSortChange"
     >
-      <el-table-column type="index" label="序号" width="60" />
       <el-table-column
         v-if="checkFieldVisible('examNumber')"
         prop="examNumber"
         label="准考证号"
-        width="120"
+        min-width="120"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('secretNumber')"
         prop="secretNumber"
         label="密号"
-        width="120"
+        min-width="120"
         sortable
       />
       <el-table-column
@@ -222,130 +216,140 @@
         v-if="checkFieldVisible('studentCode')"
         prop="studentCode"
         label="学号"
-        width="120"
+        min-width="150"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('subjectText')"
         prop="subjectText"
         label="科目"
-        min-width="120"
+        min-width="240"
         sortable
-      />
+      >
+        <template #default="{ row }">
+          {{ row.subjectCode }}-{{ row.subjectName }}
+        </template>
+      </el-table-column>
       <el-table-column
         v-if="checkFieldVisible('paperType')"
         prop="paperType"
         label="试卷类型"
-        width="100"
+        min-width="100"
       />
       <el-table-column
         v-if="checkFieldVisible('subjectLevel')"
         prop="subjectLevel"
         label="层次"
-        width="80"
+        min-width="80"
       />
       <el-table-column
         v-if="checkFieldVisible('subjectCategory')"
         prop="subjectCategory"
         label="专业类型"
-        width="100"
+        min-width="100"
       />
       <el-table-column
         v-if="checkFieldVisible('scanStatus')"
         label="扫描识别"
-        width="100"
+        min-width="130"
       >
         <template #default="{ row }">
           <span v-if="!row.upload">未上传</span>
-          <template v-else>
+          <el-space v-else :size="8">
             <!-- 上传 -->
             <span v-if="appStore.isMultiExam">已上传</span>
-            <el-button v-else type="primary" link @click="onPreviewImg(row)"
+            <el-button
+              v-else
+              type="primary"
+              link
+              style="padding-left: 0"
+              @click="onPreviewImg(row)"
               >已上传</el-button
             >
             <!-- 缺考 -->
-            <span class="ml-10">{{ row.absent ? '缺考' : '正常' }}</span>
-          </template>
+            <span>{{ row.absent ? '缺考' : '正常' }}</span>
+          </el-space>
         </template>
       </el-table-column>
       <el-table-column
         v-if="checkFieldVisible('paperCount')"
         prop="sheetCount"
         label="扫描张数"
-        width="120"
+        min-width="110"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('breachText')"
         label="人工指定"
-        width="100"
+        min-width="130"
       >
         <template #default="{ row }">
-          <!-- 违纪 -->
-          <template v-if="row.breach">
-            <el-button
-              v-if="userStore.isSchoolAdmin"
-              type="danger"
-              link
-              @click="onChangeBreach(row)"
-              >违纪</el-button
-            >
-            <span v-else>违纪</span>
-          </template>
-          <span v-else>正常</span>
-          <!-- 人工指定缺考 -->
-          <span class="ml-10">{{
-            row.manualAbsent ? '人工指定' : '正常'
-          }}</span>
+          <el-space :size="8">
+            <!-- 违纪 -->
+            <template v-if="row.breach">
+              <el-button
+                v-if="userStore.isSchoolAdmin"
+                type="danger"
+                link
+                style="padding-left: 0"
+                @click="onChangeBreach(row)"
+                >违纪</el-button
+              >
+              <span v-else>违纪</span>
+            </template>
+            <span v-else>正常</span>
+            <!-- 人工指定缺考 -->
+            <span>{{ row.manualAbsent ? '人工指定' : '正常' }}</span>
+          </el-space>
         </template>
       </el-table-column>
       <el-table-column
         v-if="checkFieldVisible('batchCode')"
         prop="batchCode"
         label="批次编号"
-        width="120"
+        min-width="110"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('packageCode')"
         prop="packageCode"
         label="签到表编号"
-        width="120"
+        min-width="120"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('college')"
         prop="college"
         label="学院"
-        width="120"
+        min-width="100"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('className')"
         prop="className"
         label="班级"
-        width="100"
+        min-width="100"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('teacher')"
         prop="teacher"
         label="任课老师"
-        width="120"
+        min-width="110"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('examSite')"
         prop="examSite"
         label="考点"
-        width="100"
+        min-width="100"
         sortable
       />
       <el-table-column
         v-if="checkFieldVisible('examRoom')"
         prop="examRoom"
         label="考场"
-        width="80"
+        min-width="100"
         sortable
       />
       <el-table-column label="操作" width="120" fixed="right">
@@ -357,7 +361,7 @@
             v-if="!appStore.isMultiExam"
             type="danger"
             link
-            @click="onDelete(row)"
+            @click="onDelete(scope.row)"
             >删除</el-button
           >
         </template>
@@ -490,11 +494,11 @@
     return headFields.value.includes(field);
   };
   async function getExportCols() {
-    const cols = await getExportFields('SCORE');
+    const cols = await getExportFields('STUDENT');
     headFields.value = cols && cols.length ? cols : defaultCols;
   }
   async function handleFieldChange() {
-    await saveExportFields({ type: 'SCORE', cols: headFields.value });
+    await saveExportFields({ type: 'STUDENT', cols: headFields.value });
   }
 
   // table action

+ 3 - 9
src/views/system/not-found/index.vue

@@ -1,13 +1,9 @@
 <template>
   <div class="content">
-    <el-result
-      icon="primary"
-      title="Primary Tip"
-      sub-title="Please follow the instructions"
-    >
+    <el-result icon="primary" title="找不到页面" sub-title="请重新尝试其他页面">
     </el-result>
     <div class="operation-row">
-      <el-button key="back" type="primary" @click="back"> back </el-button>
+      <el-button key="back" type="primary" @click="back"> 返回主页 </el-button>
     </div>
   </div>
 </template>
@@ -24,12 +20,10 @@
 
 <style scoped lang="scss">
   .content {
-    // padding-top: 100px;
     position: absolute;
     top: 50%;
     left: 50%;
-    margin-left: -95px;
-    margin-top: -121px;
+    transform: translate(-50%, -50%);
     text-align: center;
   }
 </style>

+ 10 - 7
src/views/user/ModifyUser.vue

@@ -17,17 +17,20 @@
       label-width="120px"
     >
       <el-form-item label="登录名" prop="loginName">
-        <el-input v-model="formModel.loginName" placeholder="请输入登录名" />
+        <el-input
+          v-model.trim="formModel.loginName"
+          placeholder="请输入登录名"
+        />
       </el-form-item>
       <el-form-item label="名称" prop="name">
-        <el-input v-model="formModel.name" placeholder="请输入名称" />
+        <el-input v-model.trim="formModel.name" placeholder="请输入名称" />
       </el-form-item>
       <el-form-item label="工号" prop="empno">
-        <el-input v-model="formModel.empno" placeholder="请输入工号" />
+        <el-input v-model.trim="formModel.empno" placeholder="请输入工号" />
       </el-form-item>
       <el-form-item label="密码" prop="password">
         <el-input
-          v-model="formModel.password"
+          v-model.trim="formModel.password"
           type="password"
           show-password
           placeholder="请输入密码"
@@ -59,7 +62,7 @@
         prop="subjectCodeString"
       >
         <el-input
-          v-model="formModel.subjectCodeString"
+          v-model.trim="formModel.subjectCodeString"
           placeholder="请输入"
           type="textarea"
           :rows="4"
@@ -67,7 +70,7 @@
       </el-form-item>
       <el-form-item v-if="showExamId" label="绑定考试ID">
         <el-input
-          v-model="formModel.examIdString"
+          v-model.trim="formModel.examIdString"
           placeholder="请输入"
           type="textarea"
           :rows="4"
@@ -75,7 +78,7 @@
       </el-form-item>
       <el-form-item v-if="showColleges" label="绑定学院">
         <el-input
-          v-model="formModel.colleges"
+          v-model.trim="formModel.colleges"
           placeholder="请输入"
           type="textarea"
           :rows="4"

+ 5 - 5
src/views/user/UserManage.vue

@@ -4,21 +4,21 @@
       <el-form-item label="登录名">
         <el-input
           v-model.trim="searchModel.loginName"
-          placeholder="请输入登录名"
+          placeholder="请输入"
           clearable
         />
       </el-form-item>
       <el-form-item label="名称">
         <el-input
           v-model.trim="searchModel.name"
-          placeholder="请输入名称"
+          placeholder="请输入"
           clearable
         />
       </el-form-item>
       <el-form-item label="来源">
         <el-select
           v-model="searchModel.source"
-          placeholder="请选择来源"
+          placeholder="请选择"
           clearable
           style="width: 120px"
         >
@@ -33,7 +33,7 @@
       <el-form-item label="角色">
         <el-select
           v-model="searchModel.role"
-          placeholder="请选择角色"
+          placeholder="请选择"
           clearable
           style="width: 120px"
         >
@@ -48,7 +48,7 @@
       <el-form-item label="状态">
         <el-select
           v-model="searchModel.enable"
-          placeholder="请选择状态"
+          placeholder="请选择"
           clearable
           style="width: 120px"
         >

+ 2 - 2
src/views/user/components/BatchCreateUserDialog.vue

@@ -32,7 +32,7 @@
       <el-form-item label="命名规则" prop="prefix">
         <el-input
           v-if="appStore.system.authType === 'offline'"
-          v-model="formModel.prefix"
+          v-model.trim="formModel.prefix"
           placeholder="自定义前缀"
           style="width: 120px; margin-right: 5px"
         >
@@ -55,7 +55,7 @@
       </el-form-item>
       <el-form-item v-if="!formModel.random" label="密码" prop="password">
         <el-input
-          v-model="formModel.password"
+          v-model.trim="formModel.password"
           type="password"
           placeholder="请输入密码"
           :disabled="formModel.random"