Ver código fonte

feat: api-科目试题结构

zhangjie 2 dias atrás
pai
commit
d998aefda2

+ 1 - 0
.gitignore

@@ -4,6 +4,7 @@ dist
 dist-ssr
 *.local
 components.d.ts
+typecheck-errors.txt
 
 # Log files
 *.log*

+ 1 - 0
package.json

@@ -11,6 +11,7 @@
     "report": "cross-env REPORT=true npm run build",
     "preview": "npm run build && vite preview --host",
     "typecheck": "vue-tsc --noEmit --skipLibCheck",
+    "typecheck:file": "vue-tsc --noEmit --skipLibCheck > typecheck-errors.txt 2>&1",
     "lint-staged": "npx lint-staged",
     "prepare": "husky"
   },

+ 1 - 1
src/api/base.ts

@@ -1,5 +1,5 @@
 import axios from 'axios';
-import type { SubjectItem } from './types/base';
+import type { SubjectItem } from './types/subject';
 import type { ExamQueryItem } from './types/exam';
 
 // 通用查询

+ 0 - 276
src/api/order.ts

@@ -1,276 +0,0 @@
-import axios, { AxiosResponse } from 'axios';
-import type {
-  OptionItem,
-  TaskListPageParam,
-  TaskListPageRes,
-  TaskItemDetail,
-  TaskRuleUpdateParams,
-  TaskTimeUpdateParams,
-  TaskNoticeUpdateParams,
-  OrderRecordListPageRes,
-  OrderRecordListPageParam,
-  StudentExportListPageRes,
-  OrderRecordPrintTimeItem,
-  OrderRecordPrintParam,
-  ExportOrderRecordDetailParam,
-  AgentQueryParam,
-  RoomQueryParam,
-  OrderPeriodSetItem,
-  TimePeriodItem,
-} from './types/order';
-import { AbleParams, PageParams } from './types/common';
-
-// 通用查询
-// 通用查询-任务查询
-export function taskQuery(): Promise<OptionItem[]> {
-  return axios.post('/api/admin/apply/task/list', {});
-}
-// 通用查询-教学点查询
-export function teachingQuery(params: {
-  flag?: boolean;
-}): Promise<OptionItem[]> {
-  return axios.post('/api/admin/apply/teaching/list', {}, { params });
-}
-// 通用查询-考点查询
-export function agentQuery(params: AgentQueryParam): Promise<OptionItem[]> {
-  return axios.post('/api/admin/apply/agent/list', {}, { params });
-}
-// 通用查询-考场查询
-export function roomQuery(params: RoomQueryParam): Promise<OptionItem[]> {
-  return axios.post('/api/admin/room/list', {}, { params });
-}
-// 通用查询-城市查询
-export function cityQuery(): Promise<OptionItem[]> {
-  return axios.post('/api/admin/teaching/city/list', {});
-}
-
-// 预约任务管理
-// 预约任务管理-查询
-export function taskListPage(
-  params: TaskListPageParam
-): Promise<TaskListPageRes> {
-  return axios.post('/api/admin/apply/task/page', {}, params);
-}
-// 预约任务管理-详情
-export function taskDetailInfo(id: number): Promise<TaskItemDetail> {
-  return axios.post('/api/admin/apply/task/find', {}, { params: { id } });
-}
-// 预约任务管理-新增编辑规则
-export function updateTaskRule(
-  datas: TaskRuleUpdateParams
-): Promise<{ id: number }> {
-  return axios.post('/api/admin/apply/task/rule/save', datas);
-}
-// 预约任务管理-编辑时段
-export function updateTaskTime(
-  datas: TaskTimeUpdateParams
-): Promise<{ id: number }> {
-  return axios.post('/api/admin/apply/task/time/save', datas);
-}
-// 预约任务管理-编辑说明
-export function updateTaskNotice(
-  datas: TaskNoticeUpdateParams
-): Promise<{ id: number }> {
-  return axios.post('/api/admin/apply/task/notice/save', datas);
-}
-// 预约任务管理-启用禁用
-export function ableTask(params: AbleParams): Promise<boolean> {
-  return axios.post('/api/admin/apply/task/enable', {}, { params });
-}
-// 预约任务管理-删除时段
-export function deleteTaskTime(timeId: number): Promise<boolean> {
-  return axios.post(
-    '/api/admin/apply/task/rule/delete',
-    {},
-    { params: { timeId } }
-  );
-}
-
-// 考生信息导入
-// 考生信息导入分页
-export function studentImportListPage(
-  params: PageParams
-): Promise<StudentExportListPageRes> {
-  return axios.post('/api/admin/std/page', params);
-}
-// 考生信息导入-导入模板下载
-export function studentInfoTemplate(): Promise<AxiosResponse<Blob>> {
-  return axios.post('/api/admin/std/import/template', {
-    responseType: 'blob',
-  });
-}
-
-// 预约名单
-// 预约名单详情分页
-export function orderRecordListPage(
-  params: OrderRecordListPageParam
-): Promise<OrderRecordListPageRes> {
-  return axios.post('/api/admin/apply/std/page', params);
-}
-
-export function orderRecordListPage2(
-  params: OrderRecordListPageParam
-): Promise<OrderRecordListPageRes> {
-  return axios.post('/api/admin/student/page', params);
-}
-
-// 预约名单详情-取消预约
-export function orderRecordCancel(id: number): Promise<boolean> {
-  return axios.post('/api/admin/apply/std/cancel', {}, { params: { id } });
-}
-// 删除预约
-export function orderRecordDelete(ids: string) {
-  return axios.post('/api/admin/student/delete', {}, { params: { ids } });
-}
-// 预约名单详情-一键自动分配
-export function orderRecordAutoAssign(params: {
-  taskId: number;
-}): Promise<boolean> {
-  return axios.post('/api/admin/apply/std/auto/assign', {}, { params });
-}
-// 预约名单详情-导入模板下载
-export function orderRecordTemplate(): Promise<AxiosResponse<Blob>> {
-  return axios.post(
-    '/api/admin/apply/imp/template',
-    {},
-    {
-      responseType: 'blob',
-    }
-  );
-}
-
-export function orderDetailExport(data: any): Promise<AxiosResponse<Blob>> {
-  return axios.post('/api/admin/apply/detail/export', data, {
-    responseType: 'blob',
-  });
-}
-
-// 预约名单详情分页
-export function orderRecordPrintTimeListPage(): Promise<
-  OrderRecordPrintTimeItem[]
-> {
-  return axios.post('/api/admin/apply/sign/in/date', {});
-}
-// 预约名单详情-打印签到表
-export function orderRecordPrint(
-  params: OrderRecordPrintParam
-): Promise<AxiosResponse<Blob>> {
-  return axios.post(
-    '/api/admin/apply/std/auto/sign/in/print',
-    {},
-    {
-      responseType: 'blob',
-      params,
-    }
-  );
-}
-// 预约名单详情-导出考场预约情况表
-export function exportOrderRecordDetail(
-  params: ExportOrderRecordDetailParam
-): Promise<AxiosResponse<Blob>> {
-  return axios.post(
-    '/api/admin/apply/export/teaching/available',
-    {},
-    {
-      responseType: 'blob',
-      params,
-    }
-  );
-}
-
-// 时段列表(对应表格第一行)
-export function getTimeSliceList(params: {
-  taskId: string;
-}): Promise<string[]> {
-  return axios.post('/api/admin/time/period/exam/site/list', {}, { params });
-}
-// 时段设置列表
-export function getDateAndTimeList(params: any) {
-  return axios.post(
-    '/api/admin/time/period/exam/site/detail/list',
-    {},
-    { params }
-  );
-}
-
-// 预约设置保存
-export function saveReservation(data: any, params: any) {
-  return axios.post('/api/admin/time/period/exam/site/save', data, { params });
-}
-
-// 开启/关闭 自主预约
-export function toggleSelfYYStatus(params: any) {
-  return axios.post('/api/admin/teaching/selfApplyEnable', {}, { params });
-}
-
-// 管理开始关闭自主预约
-// 查询状态
-export function adminSwitchReservationStatus() {
-  return axios.post(
-    '/api/admin/time/period/exam/site/switch/find',
-    {},
-    {
-      params: {
-        propKey: 'APPLY_SWITCH',
-      },
-    }
-  );
-}
-// 修改状态
-export function adminSwitchReservation(status: boolean) {
-  return axios.post(
-    '/api/admin/time/period/exam/site/switch/enable',
-    {},
-    { params: { status } }
-  );
-}
-
-// 考场排版设置
-// 预约时段设置列表
-export function getRoomDateAndTimeList(
-  examRoomId: number
-): Promise<OrderPeriodSetItem[]> {
-  return axios.post(
-    '/api/admin/time/period/exam/room/detail/list',
-    {},
-    { params: { examRoomId } }
-  );
-}
-// 预约时段设置保存
-export function saveScheduling(data: TimePeriodItem[], examRoomId: number) {
-  return axios.post('/api/admin/time/period/exam/room/save', data, {
-    params: { examRoomId },
-  });
-}
-
-export function getUserList(data: any): any {
-  return axios.post('/api/admin/user/page', data);
-}
-
-export function addUser(data: any): any {
-  return axios.post('/api/admin/user/save', data);
-}
-export function ableUser(params: any): any {
-  return axios.post('/api/admin/user/enable', {}, { params });
-}
-export function resetUserPwd(params: any): any {
-  return axios.post('/api/admin/user/reset/password', {}, { params });
-}
-export function getMyTasks(data: any): any {
-  return axios.post('/api/admin/async/task/page', data);
-}
-
-export function getTaskTypes(): any {
-  return axios.post('/api/admin/async/task/type/list');
-}
-
-export function studentExport(params: any): Promise<AxiosResponse<Blob>> {
-  return axios.post(
-    '/api/admin/student/export',
-    {},
-    {
-      responseType: 'blob',
-      params,
-    }
-  );
-}

+ 1 - 1
src/api/student.ts

@@ -1,4 +1,4 @@
-import axios from 'axios';
+import axios, { AxiosResponse } from 'axios';
 import {
   StudentItem,
   StudentListPageParam,

+ 10 - 3
src/api/subject.ts

@@ -96,20 +96,27 @@ export function downloadSubjectObjectiveImportTemplate(params: {
 export function getPaperStructureList(
   subjectCode: string
 ): Promise<PaperStructureListPageRes> {
-  return axios.post(`/api/subject/paper-structure/${subjectCode}`);
+  return axios.post(
+    `/api/admin/question/list`,
+    {},
+    { params: { subjectCode } }
+  );
 }
 
 // 新增/编辑试卷结构
 export function savePaperStructure(
   data: PaperStructureUpdateParams
 ): Promise<PaperStructureItem> {
-  return axios.post('/api/subject/paper-structure', data);
+  if (data.id) {
+    return axios.post('/api/admin/question/update', data);
+  }
+  return axios.post('/api/admin/question/save', data);
 }
 
 // 批量删除试卷结构
 export function deletePaperStructures(ids: number[]): Promise<boolean> {
   return axios.post(
-    '/api/subject/paper-structure/batch',
+    '/api/admin/question/delete',
     {},
     {
       params: { ids },

+ 0 - 108
src/api/types/base.ts

@@ -1,108 +0,0 @@
-import { PageResult, PageParams } from './common';
-
-export interface OptionItem {
-  id: number;
-  name: string;
-}
-export interface TeachingListFilter {
-  name: string;
-  code: string;
-  enable: boolean;
-}
-export type TeachingListPageParam = PageParams<TeachingListFilter>;
-
-export interface TeachingItem {
-  id: number;
-  name: string;
-  code: string;
-  cityId: number;
-  cityName: string;
-  capacity: number;
-  enable: boolean;
-}
-
-export type TeachingListPageRes = PageResult<TeachingItem>;
-
-export interface TeachingUpdateParams {
-  id?: number;
-  name: string;
-  code: string;
-  cityId: number | null;
-}
-
-export interface AgentListFilter {
-  teachingId: number | null;
-  name: string;
-  enable: boolean | undefined;
-}
-export type AgentListPageParam = PageParams<AgentListFilter>;
-
-export interface AgentItem {
-  id: number;
-  name: string;
-  code: string;
-  address: string;
-  teachingId: number;
-  teachingName: string;
-  capacity: number;
-  enable: boolean;
-}
-
-export type AgentListPageRes = PageResult<AgentItem>;
-
-export interface AgentUpdateParams {
-  id?: number;
-  name: string;
-  code: string;
-  address: string;
-  teachingId: number | null;
-}
-export interface AgentGuideUpdateParams {
-  id: number;
-  guide: string;
-}
-
-export interface RoomListFilter {
-  teachingId: number | null;
-  examSiteId: number | null;
-  name: string;
-  enable: boolean | undefined;
-}
-export type RoomListPageParam = PageParams<RoomListFilter>;
-
-export interface RoomItem {
-  id: number;
-  name: string;
-  code: string;
-  address: string;
-  teachingId: number;
-  teachingName: string;
-  examSiteId: number;
-  examSiteName: string;
-  capacity: number;
-  enable: boolean;
-}
-
-export type RoomListPageRes = PageResult<RoomItem>;
-
-export interface RoomUpdateParams {
-  id?: number;
-  name: string;
-  code: string;
-  address: string;
-  capacity: number | undefined;
-  teachingId: number | null;
-  examSiteId: number | null;
-}
-
-export interface ExamItem {
-  id: number;
-  // 考试名称
-  name: string;
-  // 类型
-  type: ExamType;
-}
-export interface SubjectItem {
-  name: string;
-  code: string;
-}

+ 0 - 135
src/api/types/order.ts

@@ -1,135 +0,0 @@
-import { PageResult, PageParams } from './common';
-
-export interface OptionItem {
-  id: number;
-  name: string;
-}
-
-export interface AgentQueryParam {
-  id: number; // teachingId
-  flag?: boolean;
-}
-export interface RoomQueryParam {
-  examSiteId: number;
-}
-
-export interface TaskListFilter {
-  name: string;
-}
-export type TaskListPageParam = PageParams<TaskListFilter>;
-
-export interface TaskItem {
-  id: number;
-  name: string;
-  selfApplyStartTime: number;
-  selfApplyEndTime: number;
-  openApplyStartTime: number;
-  openApplyEndTime: number;
-  enable: number; // 1:启用;0:禁用
-  updateTime: number;
-}
-
-export type TaskListPageRes = PageResult<TaskItem>;
-
-export interface TaskItemDetail {
-  id: number;
-  name: string;
-  allowApplyDays: number;
-  allowApplyCancelDays: number;
-  selfApplyStartTime: number;
-  selfApplyEndTime: number;
-  openApplyStartTime: number;
-  openApplyEndTime: number;
-  timeList: Array<{
-    id: number | null;
-    startTime: number | undefined;
-    endTime: number | undefined;
-  }>;
-  notice: string;
-}
-
-export interface TaskRuleUpdateParams {
-  id: number | null;
-  name: string;
-  allowApplyCancelDays: number;
-  selfApplyStartTime: number | undefined;
-  selfApplyEndTime: number | undefined;
-  openApplyStartTime: number | undefined;
-  openApplyEndTime: number | undefined;
-  enable: boolean;
-}
-
-export interface TaskTimeUpdateParams {
-  id: number;
-  timeJson: string;
-}
-
-export interface TaskNoticeUpdateParams {
-  id: number;
-  notice: string;
-}
-
-export interface OrderRecordItem {
-  id: number;
-  name: string;
-  identityNumber: string;
-  studentCode: string;
-  teachingName: string; // 教学点
-  agentName: string; // 考点
-  roomName: string; // 考场
-  seatNumber: string; // 座位号
-  cancel: boolean; // 是否取消
-  endTime: number;
-  startTime: number;
-  updateTime: number; // 操作时间
-  userName: string; // 操作人
-}
-export type OrderRecordListPageRes = PageResult<OrderRecordItem>;
-export interface OrderRecordListFilter {
-  taskId: number | null;
-  teachingId: number | null;
-  agentId: number | null;
-  name: string;
-  identityNumber: string;
-  studentCode: string;
-  startDate: number | undefined;
-  endDate: number | undefined;
-}
-export type OrderRecordListPageParam = PageParams<OrderRecordListFilter>;
-
-export interface StudentExportItem {
-  id: number;
-  name: string;
-  fileName: string;
-  status: string;
-  message: string | null;
-  uploadTime: number;
-}
-
-export type StudentExportListPageRes = PageResult<StudentExportItem>;
-
-export interface OrderRecordPrintTimeItem {
-  examDate: number;
-}
-
-export interface OrderRecordPrintParam {
-  teachingId: number | null;
-  agentId: number | null;
-  examDate: number | undefined;
-}
-export interface ExportOrderRecordDetailParam {
-  teachingId: number | null;
-}
-
-export interface TimePeriodItem {
-  id: number; // 注意:教学点管理员第一次设置和学校管理员新增了时段的情况下为空
-  timePeriodId: number;
-  timePeriodStr: string; // 如:08:00-09:30,作用:和原型中第一行做比较
-  enable: boolean; // false:关闭,true:开启
-  editable: boolean; // false:不可编辑,true:可编辑
-}
-export interface OrderPeriodSetItem {
-  dateStr: string;
-  timePeriodList: TimePeriodItem[];
-  batchStatus?: boolean; // false:未批量设置,true:已批量设置
-}

+ 8 - 4
src/api/types/subject.ts

@@ -1,4 +1,8 @@
-import { OptionalScoreRule } from '@/constants/enumerate';
+import {
+  OptionalScoreRule,
+  ObjectiveQuestionType,
+  ObjectivePolicy,
+} from '@/constants/enumerate';
 import { PageResult, PageParams, CoverArea } from './common';
 
 export interface SubjectTotalScoreStatItem {
@@ -101,13 +105,13 @@ export interface PaperStructureItem {
   // 间隔分
   intervalScore: number;
   // 题型
-  type: string;
+  type: ObjectiveQuestionType;
   // 答案
   answer: string;
   // 判分策略
-  objectivePolicy: string;
+  objectivePolicy: ObjectivePolicy;
   // 分组
-  groupNumber: string;
+  groupNumber: number;
 }
 export type PaperStructureListPageRes = PaperStructureItem[];
 

+ 16 - 0
src/constants/enumerate.ts

@@ -131,3 +131,19 @@ export const EXAM_STATUS = {
   FINISH: '已结束',
 };
 export type ExamStatus = keyof typeof EXAM_STATUS;
+
+// 客观题题型 SINGLE,MULTIPLE,TRUE_OR_FALSE
+export const OBJECTIVE_QUESTION_TYPE = {
+  SINGLE: '单选题',
+  MULTIPLE: '多选题',
+  TRUE_OR_FALSE: '判断题',
+};
+export type ObjectiveQuestionType = keyof typeof OBJECTIVE_QUESTION_TYPE;
+
+// 客观题判分策略 NONE,ALL,LEAK
+export const OBJECTIVE_POLICY = {
+  NONE: '无',
+  ALL: '任选给分',
+  LEAK: '漏选给分',
+};
+export type ObjectivePolicy = keyof typeof OBJECTIVE_POLICY;

+ 27 - 15
src/views/subject/PaperStructEdit.vue

@@ -16,14 +16,13 @@
     <el-form inline>
       <el-form-item label="试卷类型">
         <el-select
-          v-model="searchModel.paperType"
+          v-model="searchModel.objective"
           placeholder="不限"
           clearable
           style="width: 120px"
         >
-          <el-option label="不限" value="" />
-          <el-option label="A" value="A" />
-          <el-option label="B" value="B" />
+          <el-option label="客观" :value="true" />
+          <el-option label="主观" :value="false" />
         </el-select>
       </el-form-item>
       <el-form-item label="大题">
@@ -33,9 +32,12 @@
           clearable
           style="width: 120px"
         >
-          <el-option label="不限" value="" />
-          <el-option label="1" :value="1" />
-          <el-option label="2" :value="2" />
+          <el-option
+            v-for="item in mainNumberList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -145,7 +147,7 @@
   const router = useRouter();
 
   // 从路由参数获取科目ID
-  const subjectCode = computed(() => Number(route.params.subjectCode) || 0);
+  const subjectCode = computed(() => route.params.subjectCode || '');
 
   const subjectInfo = reactive({
     code: '',
@@ -165,26 +167,36 @@
   };
 
   interface SearchModel {
-    paperType: string;
-    mainNumber: number | string;
+    objective?: boolean;
+    mainNumber?: number;
   }
 
   const searchModel = reactive<SearchModel>({
-    paperType: '',
-    mainNumber: '',
+    objective: undefined,
+    mainNumber: undefined,
   });
 
   // 获取试卷结构列表
   const { loading, setLoading } = useLoading();
   const structList = ref<PaperStructureItem[]>([]);
   const dataList = ref<PaperStructureItem[]>([]);
+  const mainNumberList = computed(() => {
+    return [
+      ...new Set(
+        structList.value.map((item) => ({
+          label: item.mainTitle,
+          value: item.mainNumber,
+        }))
+      ),
+    ];
+  });
   // 更新dataList
   const updateDataList = () => {
-    const { paperType, mainNumber } = searchModel;
+    const { objective, mainNumber } = searchModel;
     dataList.value = structList.value.filter((item) => {
       return (
-        (!paperType || item.paperType === paperType) &&
-        (!mainNumber || item.mainNumber === mainNumber)
+        (objective === undefined || item.objective === objective) &&
+        (mainNumber === undefined || item.mainNumber === mainNumber)
       );
     });
   };

+ 2 - 2
src/views/subject/SubjectManage.vue

@@ -10,7 +10,7 @@
   <div class="part-box is-border">
     <el-form :model="searchModel" inline>
       <el-form-item label="科目">
-        <select-subject v-model="searchModel.subject"></select-subject>
+        <select-subject v-model="searchModel.code"></select-subject>
       </el-form-item>
       <el-form-item label="层次">
         <el-select
@@ -214,7 +214,7 @@
   <!-- 科目设置弹窗 -->
   <SubjectSettingDialog
     ref="subjectSettingDialogRef"
-    :subject-data="currentSubject"
+    :row-data="currentSubject"
     @modified="getList"
   />
 

+ 45 - 57
src/views/subject/components/ModifyPaperStructure.vue

@@ -16,17 +16,6 @@
       :rules="formRules"
       label-width="100px"
     >
-      <el-form-item label="试卷类型" prop="paperType">
-        <el-select
-          v-model="formModel.paperType"
-          placeholder="请选择试卷类型"
-          style="width: 100%"
-        >
-          <el-option label="A" value="A" />
-          <el-option label="B" value="B" />
-        </el-select>
-      </el-form-item>
-
       <el-form-item label="大题名称" prop="mainTitle">
         <el-input v-model="formModel.mainTitle" placeholder="请输入大题名称" />
       </el-form-item>
@@ -84,47 +73,43 @@
           style="width: 100%"
         />
       </el-form-item>
-
-      <el-form-item label="题型" prop="type">
-        <el-select v-model="formModel.type" placeholder="请选择题型">
-          <el-option label="单选题" value="single" />
-          <el-option label="多选题" value="multiple" />
-          <el-option label="填空题" value="blank" />
-          <el-option label="简答题" value="short" />
-          <el-option label="论述题" value="essay" />
-        </el-select>
-      </el-form-item>
-
-      <el-form-item label="答案" prop="answer">
-        <el-input
-          v-model="formModel.answer"
-          placeholder="请输入答案"
-          maxlength="200"
-        />
-      </el-form-item>
-
-      <el-form-item
-        v-if="formModel.objective"
-        label="判分策略"
-        prop="objectivePolicy"
-      >
-        <el-select
-          v-model="formModel.objectivePolicy"
-          placeholder="请选择判分策略"
-        >
-          <el-option label="全对得分" value="all_correct" />
-          <el-option label="部分得分" value="partial" />
-        </el-select>
-      </el-form-item>
-
-      <el-form-item label="分组" prop="groupNumber">
-        <el-input-number
-          v-model="formModel.groupNumber"
-          :min="0"
-          :max="99"
-          controls-position="right"
-        />
-      </el-form-item>
+      <template v-if="formModel.objective">
+        <el-form-item label="试卷类型" prop="paperType">
+          <el-input v-model="formModel.paperType" clearable />
+        </el-form-item>
+        <el-form-item label="题型" prop="type">
+          <el-select v-model="formModel.type" placeholder="请选择题型">
+            <el-option
+              v-for="(label, value) in OBJECTIVE_QUESTION_TYPE"
+              :key="value"
+              :label="label"
+              :value="value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="答案" prop="answer">
+          <el-input
+            v-model="formModel.answer"
+            placeholder="请输入答案"
+            maxlength="200"
+          />
+        </el-form-item>
+
+        <el-form-item label="判分策略" prop="objectivePolicy">
+          <el-select
+            v-model="formModel.objectivePolicy"
+            placeholder="请选择判分策略"
+          >
+            <el-option
+              v-for="(label, value) in OBJECTIVE_POLICY"
+              :key="value"
+              :label="label"
+              :value="value"
+            />
+          </el-select>
+        </el-form-item>
+      </template>
     </el-form>
 
     <template #footer>
@@ -151,6 +136,10 @@
   import useModal from '@/hooks/modal';
   import useLoading from '@/hooks/loading';
   import { objAssign, objModifyAssign } from '@/utils/utils';
+  import {
+    OBJECTIVE_POLICY,
+    OBJECTIVE_QUESTION_TYPE,
+  } from '@/constants/enumerate';
 
   defineOptions({
     name: 'ModifyPaperStructure',
@@ -185,11 +174,10 @@
     totalScore: 0,
     trackCount: 1,
     objective: false,
-    intervalScore: 0.5,
-    type: '',
+    intervalScore: undefined,
+    type: 'SINGLE',
     answer: '',
-    objectivePolicy: '',
-    groupNumber: 0,
+    objectivePolicy: 'NONE',
   };
   const formModel = reactive<PaperStructureUpdateParams>({
     ...initialFormState,
@@ -197,7 +185,7 @@
 
   const formRules: FormRules<keyof PaperStructureUpdateParams> = {
     paperType: [
-      { required: true, message: '请选择试卷类型', trigger: 'change' },
+      { required: false, message: '请选择试卷类型', trigger: 'change' },
     ],
     mainTitle: [
       { required: true, message: '请输入大题名称', trigger: 'blur' },

+ 1 - 0
src/views/user/UserManage.vue

@@ -35,6 +35,7 @@
           v-model="searchModel.role"
           placeholder="请选择角色"
           clearable
+          style="width: 120px"
         >
           <el-option
             v-for="(val, key) in ROLE_TYPE"