Bläddra i källkod

修改模拟测试

shmily1213 3 veckor sedan
förälder
incheckning
74c42515f0

+ 12 - 2
src/api/modules/study.ts

@@ -1,6 +1,6 @@
 import { ApiResponse, ApiResponseList } from "@/types";
 import flyio from "../flyio";
-import { ApiQuestion, DirectedSchool, Examinee, ExamPaper, ExamPaperSubmit, GetExamPaperRequestDTO, Knowledge, KnowledgeListRequestDTO, KnowledgeRecord, OpenExamineeRequestDTO, PracticeRecord, SimulatedRecord, SimulationTestInfo, StudyPlan, Subject, SubjectListRequestDTO, VideoStudyRecord } from "@/types/study";
+import { ApiQuestion, DirectedSchool, Examinee, ExamPaper, ExamPaperSubmit, GetExamPaperRequestDTO, Knowledge, KnowledgeListRequestDTO, KnowledgeRecord, OpenExamineeRequestDTO, PracticeRecord, SimulatedRecord, SimulationExamSubject, SimulationTestInfo, StudyPlan, Subject, SubjectListRequestDTO, VideoStudyRecord } from "@/types/study";
 
 /**
  * 获取学习计划
@@ -69,7 +69,7 @@ export function getKnowledgeList(params: KnowledgeListRequestDTO) {
 }
 
 /**
- * 获取试
+ * 
  * @param params 
  * @returns 
  */
@@ -168,3 +168,13 @@ export function getPlanStudyRecord(params: { year: number, month: number }) {
 export function getVideoStudyRecord() {
   return flyio.get('/front/student/record/video') as Promise<ApiResponse<VideoStudyRecord>>;
 }
+
+
+/**
+ * 获取模拟考试科目
+ * @param params 
+ * @returns 
+ */
+export function getSimulationExamSubjects() {
+  return flyio.get('/front/exam/subjects') as Promise<ApiResponse<SimulationExamSubject[]>>;
+}

+ 3 - 3
src/components/ie-page/ie-page.vue

@@ -24,9 +24,9 @@ defineOptions({
   }
 });
 type PageProps = {
-  safeAreaInsetBottom: boolean;
-  bgColor: string;
-  fixHeight: boolean;
+  safeAreaInsetBottom?: boolean;
+  bgColor?: string;
+  fixHeight?: boolean;
 }
 const props = withDefaults(defineProps<PageProps>(), {
   safeAreaInsetBottom: true,

+ 16 - 21
src/pagesStudy/pages/index/compoentns/index-test.vue

@@ -2,21 +2,18 @@
   <view class="mx-30">
     <view class="flex items-center justify-between">
       <view class="w-fit text-32 text-fore-title font-bold leading-60">模拟测试</view>
-      <view>
-        <ie-tab :modelValue="tab" :options="tabOptions"></ie-tab>
-      </view>
     </view>
     <view class="my-44">
       <view class="border border-solid border-primary rounded-15">
         <view class="h-132 bg-[#EBF9FF] flex px-30 text-center rounded-t-15">
           <view class="flex-1 -translate-y-24">
             <view class="w-50 h-50 bg-primary rounded-full text-28 text-white font-bold leading-50 mx-auto">1</view>
-            <view class="mt-26 text-24 text-fore-title">选择考试院校</view>
+            <view class="mt-26 text-24 text-fore-title">定向院校专业</view>
           </view>
           <ie-image src="/pagesStudy/static/image/icon-arrow-multiple.png" customClass="w-30 h-18 -translate-y-8" />
           <view class="flex-1 -translate-y-24">
             <view class="w-50 h-50 bg-primary rounded-full text-28 text-white font-bold leading-50 mx-auto">2</view>
-            <view class="mt-26 text-24 text-fore-title">选择考试专业</view>
+            <view class="mt-26 text-24 text-fore-title">选择考试科目</view>
           </view>
           <ie-image src="/pagesStudy/static/image/icon-arrow-multiple.png" customClass="w-30 h-18 -translate-y-8" />
           <view class="flex-1 -translate-y-24">
@@ -25,17 +22,14 @@
           </view>
         </view>
         <view class="py-60 px-46">
-          <view class="h-104 rounded-8 border border-solid border-border px-30 flex items-center justify-between"
+          <view class="h-104 rounded-8 border border-solid border-border mb-40 px-30 flex items-center justify-between"
             @click="handleSelectCollege">
-            <view class="flex-1 text-30 text-fore-subtitle">{{ selectedCollege.universityName || '选择考试院校' }}</view>
+            <view class="flex-1 text-30 text-fore-subtitle">定向</view>
             <view class="flex items-center">
-              <text class="mr-8 text-30 text-[#B3B3B3]">请选择</text>
+              <text class="mr-8 text-30 text-[#B3B3B3]">{{ directedSchool.universityName || '请选择' }}</text>
               <uv-icon name="arrow-right" size="15px" color="#B3B3B3"></uv-icon>
             </view>
           </view>
-          <view class="my-30 flex items-center justify-end">
-            <view class="test-tip">非VIP用户可免费测试{{ simulationInfo.evalCount }}次</view>
-          </view>
           <ie-button type="primary" :disabled="simulationDisabled" @click="handleStartTest">开始考试</ie-button>
         </view>
       </view>
@@ -45,29 +39,30 @@
 </template>
 <script lang="ts" setup>
 import { useTransferPage } from '@/hooks/useTransferPage';
-import { SelectedUniversityMajor, SimulationTestInfo, SimulationTestOptions } from '@/types/study';
+import { DirectedSchool, SelectedUniversityMajor, SimulationTestInfo, SimulationTestOptions } from '@/types/study';
 import { getSimulationInfo } from '@/api/modules/study';
 const { transferTo } = useTransferPage();
+type Props = {
+  directedSchool: DirectedSchool;
+}
+const props = withDefaults(defineProps<Props>(), {
+  directedSchool: () => ({}) as DirectedSchool
+});
+
 const tab = ref('0');
 const simulationInfo = ref<SimulationTestInfo>({} as SimulationTestInfo);
-const selectedCollege = ref<SimulationTestOptions>({} as SimulationTestOptions);
 const tabOptions = ref<{ label: string, value: string }[]>([]);
 const simulationDisabled = computed(() => {
-  return !selectedCollege.value.universityId || simulationInfo.value.evalCount <= 0;
+  return !props.directedSchool.universityId;
 });
 const handleSelectCollege = () => {
-  transferTo('/pagesStudy/pages/targeted-add/targeted-add', {
+  transferTo('/pagesStudy/pages/targeted-setting/targeted-setting', {
     data: {}
-  }).then(res => {
-    if (res) {
-      const selectedUniversityMajor = res as SelectedUniversityMajor;
-      selectedCollege.value = selectedUniversityMajor;
-    }
   });
 }
 const handleStartTest = () => {
   transferTo('/pagesStudy/pages/simulation-entry/simulation-entry', {
-    data: selectedCollege.value
+    data: props.directedSchool
   });
 }
 const loadData = () => {

+ 2 - 2
src/pagesStudy/pages/index/index.vue

@@ -63,8 +63,8 @@
     <index-menu />
     <index-banner />
     <view class="h-16 bg-back my-32"></view>
-    <!-- <index-test />
-    <index-exam-record /> -->
+    <index-test :directed-school="firstDirectedSchool" />
+    <!-- <index-exam-record /> -->
   </ie-page>
 </template>
 

+ 60 - 37
src/pagesStudy/pages/simulation-entry/simulation-entry.vue

@@ -1,34 +1,31 @@
 <template>
   <ie-page bg-color="#F6F8FA">
-    <ie-navbar title="模拟测试" bg-color="transparent" :placeholder="false" />
+    <ie-navbar title="" bg-color="transparent" :placeholder="false" />
     <view class="relative">
       <ie-image :is-oss="true" src="/study-bg7.png" customClass="w-full h-[544rpx] absolute top-0 left-0 z-0" />
       <ie-image :is-oss="true" src="/study-bg8.png" customClass="w-360 h-310 absolute top-49 right-33 z-1" />
       <view class="relative z-2">
         <view class="pt-126 ml-90">
-          <ie-image :is-oss="true" src="/study-title3.png" customClass="w-300 h-54" />
+          <ie-image :is-oss="true" src="/study-title3.png" customClass="w-264 h-60" />
         </view>
-        <view class="mx-30 mt-64 bg-white rounded-15 px-40 pt-70 pb-84">
-          <view class="px-34 py-26 bg-back rounded-10 flex items-center justify-between">
-            <text class="text-30 text-fore-title">我的语数外成绩</text>
-            <text class="text-32">
-              <text v-if="form.score !== undefined" class="text-primary">{{ form.score }}分</text>
-              <text v-else class="text-fore-light">未知</text>
-            </text>
+        <view class="mx-30 mt-64">
+          <view class="p-32 bg-white rounded-15">
+            <view class="text-32 text-fore-title font-bold">考试院校</view>
+            <view class="mt-20 text-28 text-fore-subtitle flex items-center">
+              <text>{{ prevData.universityName }}</text>
+              <uv-icon name="arrow-right" size="14px" color="#1A1A1A" custom-class="mx-10"></uv-icon>
+              <text>{{ prevData.majorName }}</text>
+            </view>
           </view>
-          <view class="mt-30 px-34 py-26 bg-back rounded-10 flex items-center justify-between">
-            <text class="text-30 text-fore-title">我的职业技能成绩</text>
-            <text class="text-32">
-              <text v-if="form.score2 !== undefined" class="text-primary">{{ form.score2 }}分</text>
-              <text v-else class="text-fore-light">未知</text>
-            </text>
+          <view v-for="item in subjects" :key="item.subjectId"
+            class="flex items-center justify-between mt-20 p-32 bg-white rounded-15">
+            <ie-image :src="item.icon" custom-class="w-86 h-72" mode="aspectFill" />
+            <view class="ml-30 flex-1 min-w-1">
+              <view class="text-320 text-fore-title font-bold">{{ item.subject }}</view>
+              <view class="mt-6 text-24 text-fore-light">剩余模考次数<text class="ml-20 text-fore-title font-bold">{{ item.examTime }}</text></view>
+            </view>
+            <view class="text-24 text-white bg-primary px-20 py-14 rounded-full" @click="handleAIOutPaper(item)">智能出卷</view>
           </view>
-          <view class="mt-66 text-30 text-fore-light">
-            现在AI系统给您依据“<text class="text-fore-title font-bold">
-              {{ form.selectedCollege.universityName }}
-            </text>”的考试大纲,通过智能扫描提取考纲要点给您生成一张职业技能模拟试卷,这样测试的成绩会更接近真实的考试结果。
-          </view>
-          <ie-button type="primary" custom-class="mt-112" @click="handleAIOutPaper">AI出卷</ie-button>
         </view>
       </view>
     </view>
@@ -37,24 +34,50 @@
 
 <script lang="ts" setup>
 import { useTransferPage } from '@/hooks/useTransferPage';
-import { SimulationTestOptions } from '@/types/study';
+import { getSimulationExamSubjects } from '@/api/modules/study';
+import iconChinese from '@/pagesStudy/static/image/icon-chinese.png';
+import iconMath from '@/pagesStudy/static/image/icon-math.png';
+import iconForeign from '@/pagesStudy/static/image/icon-foreign.png';
+import iconSkill from '@/pagesStudy/static/image/icon-skill.png';
+import { Study } from '@/types';
 const { transferTo, prevData } = useTransferPage();
-const form = ref({
-  selectedCollege: {} as SimulationTestOptions,
-  score: 240,
-  score2: undefined
-});
-// const form = ref({});
-const handleAIOutPaper = () => {
-  uni.$ie.showLoading('AI出卷中...');
-  setTimeout(() => {
-    uni.$ie.hideLoading();
-    transferTo('/pagesStudy/pages/simulation-start/simulation-start');
-  }, 2000);
+const subjects = ref<Study.SimulationExamSubject[]>([]);
+
+const handleAIOutPaper = (item: Study.SimulationExamSubject) => {
+  if (item.examTime < 1) {
+    uni.$ie.showToast('剩余模考次数不足');
+    return;
+  }
+  transferTo('/pagesStudy/pages/simulation-start/simulation-start', {
+    data: {
+      subjectInfo: item,
+      universityInfo: prevData.value
+    }
+  });
+}
+const getIcon = (subjectName: string) => {
+  if (subjectName === '语文') {
+    return iconChinese;
+  } else if (subjectName === '数学') {
+    return iconMath;
+  } else if (subjectName === '外语' || /.语/.test(subjectName)) {
+    return iconForeign;
+  } else {
+    return iconSkill;
+  }
+}
+const loadData = async () => {
+  const { data } = await getSimulationExamSubjects();
+  subjects.value = data.map(item => {
+    return {
+      ...item,
+      icon: getIcon(item.subject)
+    }
+  });
+  console.log(subjects.value);
 }
-onLoad(() => {
-  form.value.selectedCollege = prevData.value as SimulationTestOptions;
-  console.log(prevData.value)
+onShow(() => {
+  loadData();
 });
 </script>
 

+ 55 - 16
src/pagesStudy/pages/simulation-start/simulation-start.vue

@@ -1,33 +1,35 @@
 <template>
   <ie-page bg-color="#F6F8FA">
-    <ie-navbar title="模拟测试" bg-color="transparent" :placeholder="false" />
+    <ie-navbar title="" bg-color="transparent" :placeholder="false" />
     <view class="relative">
       <ie-image :is-oss="true" src="/study-bg9.png" custom-class="w-full h-[544rpx] absolute top-0 left-0 z-0" />
-      <ie-image :is-oss="true" src="/study-bg10.png" custom-class="w-276 h-175 absolute top-98 left-75 z-1" />
-      <view class="mt-196 relative z-2 mx-30">
-        <view class="flex items-center justify-end">
-          <text class="mr-10 text-30 text-fore-title">考试记录</text>
-          <uv-icon name="arrow-right" size="15px" color="#B3B3B3"></uv-icon>
+      <ie-image :is-oss="true" src="/study-bg10.png" custom-class="w-312 h-198 absolute top-75 right-32 z-1"
+        mode="aspectFill" />
+      <view class="relative z-2 mx-30">
+        <view class="pt-126 ml-55">
+          <ie-image :is-oss="true" src="/study-title5.png" customClass="w-264 h-60" />
         </view>
-        <view class="mt-20 bg-white rounded-15 px-40 pt-50 pb-40">
-          <view class="text-36 text-fore-title text-center font-bold">长沙民政职业技术学院</view>
+        <view class="mt-65 bg-white rounded-15 px-40 pt-50 pb-40">
+          <view class="text-36 text-fore-title text-center font-bold">{{ universityInfo.universityName }}</view>
           <view class="mt-26 text-32 text-fore-title text-center font-bold">模考须知</view>
           <view class="mt-66">
             <view class="flex items-center justify-between">
               <text class="text-28 text-fore-light">所考专业</text>
-              <text class="text-28 text-fore-title">大数据与会计</text>
+              <text class="text-28 text-fore-title">{{ universityInfo.majorName }}</text>
             </view>
             <view class="mt-40 flex items-center justify-between">
               <text class="text-28 text-fore-light">考生类型</text>
-              <text class="text-28 text-fore-title">单招(应届普高)</text>
+              <text class="text-28 text-fore-title">
+                <ie-dict :dict-name="EnumDictName.EXAM_TYPE" :dict-value="userStore.getExamType || '--'" />
+              </text>
             </view>
             <view class="mt-40 flex items-center justify-between">
               <text class="text-28 text-fore-light">考试类型</text>
-              <text class="text-28 text-fore-title">职业技能模拟考试</text>
+              <text class="text-28 text-fore-title">{{ subjectInfo.subject }}</text>
             </view>
             <view class="mt-40 flex items-center justify-between">
               <text class="text-28 text-fore-light">考试标准</text>
-              <text class="text-28 text-fore-title">90分钟,满分300分</text>
+              <text class="text-28 text-fore-title">{{ examTime }}分钟,满分{{ totalScore }}分</text>
             </view>
             <view class="mt-40 flex items-center justify-between">
               <text class="text-28 text-fore-light">考试题型</text>
@@ -36,15 +38,15 @@
           </view>
           <view class="mt-36 rounded-15 bg-back px-40 py-36 flex">
             <view class="flex-1 text-center">
-              <view class="text-40 text-fore-title font-bold">100</view>
+              <view class="text-40 text-fore-title font-bold">{{ questions.length }}</view>
               <view class="mt-10 text-28 text-fore-light">题量</view>
             </view>
             <view class="flex-1 text-center">
-              <view class="text-40 text-fore-title font-bold">300</view>
+              <view class="text-40 text-fore-title font-bold">{{ totalScore }}</view>
               <view class="mt-10 text-28 text-fore-light">总分</view>
             </view>
           </view>
-          <ie-button type="primary" custom-class="mt-44" @click="handleStartTest">开始考试</ie-button>
+          <ie-button type="primary" custom-class="mt-44" :disabled="!isReady" @click="handleStartTest">开始考试</ie-button>
         </view>
       </view>
     </view>
@@ -53,11 +55,48 @@
 
 <script lang="ts" setup>
 import { useTransferPage } from '@/hooks/useTransferPage';
-const { transferTo } = useTransferPage();
+import { getOpenExaminee, getPaper } from '@/api/modules/study';
+import { useUserStore } from '@/store/userStore';
+import { EnumDictName } from '@/common/enum';
+import { Study } from '@/types';
+const { prevData, transferTo } = useTransferPage();
+const userStore = useUserStore();
 
+const isReady = ref(false);
+const totalScore = ref(0);
+const examTime = ref(0);
+const questions = ref<Study.Question[]>([]);
+const universityInfo = computed(() => {
+  return prevData.value.universityInfo;
+});
+const subjectInfo = computed(() => {
+  return prevData.value.subjectInfo;
+});
 const handleStartTest = () => {
   transferTo('/pagesStudy/pages/simulation-analysis/simulation-analysis')
 }
+const loadData = async () => {
+  uni.$ie.showLoading('AI智能出卷中...');
+  const { data } = await getOpenExaminee({
+    paperType: 'Simulated',
+    subjectId: subjectInfo.value.subjectId,
+    directed: true
+  });
+  if (!data) {
+    uni.$ie.hideLoading();
+    return;
+  }
+  const { examineeId, paperId } = data;
+  const { data: paperData } = await getPaper({ type: 'Simulated', id: paperId });
+  if (paperData) {
+    console.log(paperData)
+    isReady.value = true;
+  }
+  uni.$ie.hideLoading();
+}
+onLoad(() => {
+  loadData();
+});
 </script>
 
 <style lang="scss" scoped></style>

BIN
src/pagesStudy/static/image/icon-chinese.png


BIN
src/pagesStudy/static/image/icon-foreign.png


BIN
src/pagesStudy/static/image/icon-math.png


BIN
src/pagesStudy/static/image/icon-skill.png


+ 14 - 2
src/types/study.ts

@@ -190,8 +190,10 @@ export interface KnowledgeListRequestDTO {
 
 export interface OpenExamineeRequestDTO {
   paperType: string,
-  relateId: number,
-  directed: boolean
+  relateId?: number,
+  directed: boolean,
+  subjectId?: number,
+  testType?: string
 }
 
 export interface GetExamPaperRequestDTO {
@@ -279,4 +281,14 @@ export interface PracticeRecord {
     date: string;
     study: number;
   }[]
+}
+
+/**
+ * 模拟考试科目
+ */
+export interface SimulationExamSubject {
+  subjectId: number;
+  subject: string;
+  examTime: number;
+  icon: string;
 }

+ 10 - 0
src/utils/request/requestInterceptors.js

@@ -1,6 +1,7 @@
 import env from "@/config"
 import {useUserStore} from "@/hooks/useUserStore";
 import {useEnvStore} from "@/hooks/useEnvStore"
+import {useUserStore as useUserStoreNew} from "@/store/userStore"
 
 /**
  * 请求拦截
@@ -19,6 +20,15 @@ export const requestInterceptors = (vm) => {
         // 补充header信息
         config.header['X-Requested-With'] = 'XMLHttpRequest';
         config.header['type'] = env.identifier
+        const userStore = useUserStoreNew();
+        const examType = userStore.getExamType;
+        const location = userStore.getLocation;
+        if (examType) {
+          config.header['examType'] = examType;
+        }
+        if (location) {
+          config.header['location'] = encodeURIComponent(location);
+        }
         if (isAgreeProtocol.value) {
             // NOTE: 这里在明确用户同意协议后才访问系统信息,否则有可能提前出现权限询问,导致平台审核被拒!
             const {systemInfo} = useEnvStore()