소스 검색

修复定向bug

shmily1213 1 개월 전
부모
커밋
8b90a6b169

+ 2 - 2
index.html

@@ -15,10 +15,10 @@
   <title></title>
   <!--preload-links-->
   <!--app-context-->
-  <script src="https://unpkg.com/vconsole@3.15.1/dist/vconsole.min.js"></script>
+  <!-- <script src="https://unpkg.com/vconsole@3.15.1/dist/vconsole.min.js"></script>
   <script>
     const vconsole = new VConsole();
-  </script>
+  </script> -->
 </head>
 
 <body>

+ 15 - 6
src/api/modules/study.ts

@@ -1,6 +1,6 @@
 import { ApiResponse } from "@/types";
 import flyio from "../flyio";
-import { ApiQuestion, DirectedSchool, ExamPaper, ExamPaperSubmit, Knowledge, StudyPlan, Subject } from "@/types/study";
+import { ApiQuestion, DirectedSchool, Examinee, ExamPaper, ExamPaperSubmit, GetExamPaperRequestDTO, Knowledge, KnowledgeListRequestDTO, OpenExamineeRequestDTO, SimulationTestInfo, StudyPlan, Subject, SubjectListRequestDTO } from "@/types/study";
 
 /**
  * 获取学习计划
@@ -55,7 +55,7 @@ export function saveDirectedSchool(params: DirectedSchool[]) {
  * @param params 
  * @returns 
  */
-export function getSubjectList(params: any) {
+export function getSubjectList(params: SubjectListRequestDTO) {
   return flyio.get('/front/paper/subject', params) as Promise<ApiResponse<Subject[]>>;
 }
 
@@ -64,7 +64,7 @@ export function getSubjectList(params: any) {
  * @param params 
  * @returns 
  */
-export function getKnowledgeList(params: { subjectId: number, directed: boolean }) {
+export function getKnowledgeList(params: KnowledgeListRequestDTO) {
   return flyio.get('/front/paper/knowledge', params) as Promise<ApiResponse<Knowledge[]>>;
 }
 
@@ -73,12 +73,12 @@ export function getKnowledgeList(params: { subjectId: number, directed: boolean
  * @param params 
  * @returns 
  */
-export function getOpenExaminee(params: { paperType: string, relateId: number }) {
+export function getOpenExaminee(params: OpenExamineeRequestDTO) {
   return flyio.post('/front/exam/openExaminee', null, { params }, {
     headers: {
       'Content-Type': 'application/www-form-urlencoded'
     }
-  }) as Promise<ApiResponse<any>>;
+  }) as Promise<ApiResponse<Examinee>>;
 }
 
 /**
@@ -86,7 +86,7 @@ export function getOpenExaminee(params: { paperType: string, relateId: number })
  * @param params 
  * @returns 
  */
-export function getPaper(params: { type: string, id: number }) {
+export function getPaper(params: GetExamPaperRequestDTO) {
   return flyio.get('/front/paper/paper', params) as Promise<ApiResponse<ExamPaper>>;
 }
 
@@ -98,3 +98,12 @@ export function getPaper(params: { type: string, id: number }) {
 export function commitExamineePaper(params: ExamPaperSubmit) {
   return flyio.post('/front/exam/commitExamineePaper', params) as Promise<ApiResponse<any>>;
 }
+
+/**
+ * 获取模拟考试信息
+ * @param params 
+ * @returns 
+ */
+export function getSimulationInfo() {
+  return flyio.get('/front/student/simulated/info') as Promise<ApiResponse<SimulationTestInfo>>;
+}

+ 2 - 2
src/composables/useExam.ts

@@ -99,7 +99,7 @@ export const useExam = () => {
     if (qs.subQuestions && qs.subQuestions.length > 0) {
       return qs.subQuestions.every(q => isDone(q));
     }
-    return qs.answer && qs.answer.length > 0;
+    return qs.answers && qs.answers.length > 0;
   }
   const nextQuestion = () => {
     if (currentIndex.value >= questionList.value.length - 1) {
@@ -202,7 +202,7 @@ export const useExam = () => {
         title: item.title,
         typeId: item.typeId,
         id: item.id,
-        answer: [],
+        answers: [],
         subQuestions: item.subQuestions?.map(parseQuestion) || [],
         options: item.options.map((option, index) => {
           return {

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

@@ -1,7 +1,7 @@
 <template>
   <view class="mx-30">
     <view class="flex items-center justify-between">
-      <view class="w-fit text-32 text-fore-title font-bold">模拟测试</view>
+      <view class="w-fit text-32 text-fore-title font-bold leading-60">模拟测试</view>
       <view>
         <ie-tab :modelValue="tab" :options="tabOptions"></ie-tab>
       </view>
@@ -25,17 +25,17 @@
           </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="flex-1 text-30 text-fore-subtitle">{{ selectedCollege || '选择考试院校' }}</view>
+          <view class="h-104 rounded-8 border border-solid border-border px-30 flex items-center justify-between" @click="handleSelectCollege">
+            <view class="flex-1 text-30 text-fore-subtitle">{{ selectedCollege.universityName || '选择考试院校' }}</view>
             <view class="flex items-center">
               <text class="mr-8 text-30 text-[#B3B3B3]">请选择</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用户可免费测试1次</view>
+            <view class="test-tip">非VIP用户可免费测试{{ simulationInfo.evalCount }}次</view>
           </view>
-          <ie-button type="primary" @click="handleStartTest">开始考试</ie-button>
+          <ie-button type="primary" :disabled="simulationDisabled" @click="handleStartTest">开始考试</ie-button>
         </view>
       </view>
 
@@ -44,22 +44,42 @@
 </template>
 <script lang="ts" setup>
 import { useTransferPage } from '@/hooks/useTransferPage';
+import { SimulationTestInfo, SimulationTestOptions } from '@/types/study';
+import { getSimulationInfo } from '@/api/modules/study';
 const { transferTo } = useTransferPage();
 const tab = ref('0');
-const selectedCollege = ref('长沙民政职业技术学院');
-const tabOptions = ref([
-  {
-    label: '职业技能',
-    value: '0'
-  },
-  {
-    label: '语数外',
-    value: '1'
-  }
-]);
+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;
+});
+const handleSelectCollege = () => {
+  transferTo('/pagesStudy/pages/targeted-add/targeted-add', {
+    data: {}
+  }).then(res => {
+    if (res) {
+      console.log(res)
+    }
+  });
+}
 const handleStartTest = () => {
   transferTo('/pagesStudy/pages/simulation-entry/simulation-entry');
 }
+const loadData = () => {
+  getSimulationInfo().then(res => {
+    console.log(res)
+    tabOptions.value = res.data.subjects.map(item => ({
+      label: item,
+      value: item
+    }));
+    tab.value = tabOptions.value[0].value;
+    simulationInfo.value = res.data;
+  });
+}
+onShow(() => {
+  loadData();
+});
 </script>
 <style lang="scss" scoped>
 .item {

+ 10 - 4
src/pagesStudy/pages/knowledge-practice/knowledge-practice.vue

@@ -1,6 +1,6 @@
 <template>
   <ie-page>
-    <ie-navbar title="刷题" />
+    <ie-navbar :title="pageTitle" />
     <uv-tabs :list="subjectList" key-name="subjectName" @click="handleChangeTab" :scrollable="true"></uv-tabs>
     <view class="h-16 bg-back"></view>
     <view class="px-40">
@@ -16,8 +16,13 @@ import knowledgeTree from '@/pagesStudy/components/knowledge-tree.vue';
 import * as Study from '@/types/study';
 import { EnumExamMode } from '@/common/enum';
 const { prevData, transferTo } = useTransferPage();
-const universityId = computed(() => prevData.value.universityId);
 const currentSubjectIndex = ref<number>(-1);
+const pageTitle = computed(() => {
+  if (prevData.value.directed) {
+    return '定向刷题';
+  }
+  return '全量刷题';
+});
 const currentSubjectId = computed(() => {
   if (subjectList.value.length > 0 && currentSubjectIndex.value >= 0) {
     return subjectList.value[currentSubjectIndex.value].subjectId;
@@ -52,7 +57,8 @@ const handleStartPractice = (node: Study.KnowledgeNode) => {
       name: node.name,
       mode: EnumExamMode.PRACTICE,
       paperType: 'Practice',
-      relateId: node.id
+      relateId: node.id,
+      directed: prevData.value.directed
     }
   });
 }
@@ -66,7 +72,7 @@ watch(() => currentSubjectIndex.value, () => {
 const loadData = async () => {
   try {
     const { data } = await getSubjectList({
-      universityId: universityId.value
+      directed: !!prevData.value.directed
     });
     subjectList.value = data.map(item => ({ subjectId: item.subjectId, subjectName: item.subjectName }));
     currentSubjectIndex.value = 0;

+ 10 - 10
src/pagesStudy/pages/start-exam/components/question-item.vue

@@ -44,12 +44,12 @@ const prevQuestion = inject(PREV_QUESTION);
 const nextQuestionQuickly = inject(NEXT_QUESTION_QUICKLY);
 const prevQuestionQuickly = inject(PREV_QUESTION_QUICKLY);
 const handleNotKnow = () => {
-  console.log('handleNotKnow')
+  // console.log('handleNotKnow')
   props.question.isNotKnow = true;
   nextQuestion?.();
 }
 const handleSelect = (option: Study.QuestionOption) => {
-  console.log('handleSelect', option)
+  // console.log('handleSelect', option)
   if ([
     EnumQuestionType.JUDGMENT,
     EnumQuestionType.SINGLE_CHOICE,
@@ -58,20 +58,20 @@ const handleSelect = (option: Study.QuestionOption) => {
     EnumQuestionType.ESSAY,
     EnumQuestionType.ANALYSIS
   ].includes(props.question.typeId)) {
-    props.question.answer = [option.no];
-    // props.question.answer.push(option.no);
+    props.question.answers = [option.no];
+    // props.question.answers.push(option.no);
     nextQuestion?.();
   } else if (props.question.typeId === EnumQuestionType.MULTIPLE_CHOICE) {
-    if (props.question.answer.includes(option.no)) {
-      props.question.answer = props.question.answer.filter(item => item !== option.no);
+    if (props.question.answers.includes(option.no)) {
+      props.question.answers = props.question.answers.filter(item => item !== option.no);
     } else {
-      props.question.answer.push(option.no);
+      props.question.answers.push(option.no);
     }
   }
   // props.question.answer = option.no;
 }
 const isSelected = (option: Study.QuestionOption) => {
-  const { typeId, answer } = props.question;
+  const { typeId, answers } = props.question;
   if ([
     EnumQuestionType.JUDGMENT,
     EnumQuestionType.SINGLE_CHOICE,
@@ -80,9 +80,9 @@ const isSelected = (option: Study.QuestionOption) => {
     EnumQuestionType.ESSAY,
     EnumQuestionType.ANALYSIS
   ].includes(typeId)) {
-    return answer.includes(option.no);
+    return answers.includes(option.no);
   } else if (typeId === EnumQuestionType.MULTIPLE_CHOICE) {
-    return answer.includes(option.no);
+    return answers.includes(option.no);
   }
   return false;
 }

+ 10 - 28
src/pagesStudy/pages/start-exam/start-exam.vue

@@ -99,7 +99,7 @@ import { getOpenExaminee, getPaper, commitExamineePaper } from '@/api/modules/st
 import { useExam } from '@/composables/useExam';
 import { Study } from '@/types';
 import { NEXT_QUESTION, PREV_QUESTION, NEXT_QUESTION_QUICKLY, PREV_QUESTION_QUICKLY } from '@/types/injectionSymbols';
-import { ExamPaper, ExamPaperSubmit } from '@/types/study';
+import { Examinee, ExamPaper, ExamPaperSubmit } from '@/types/study';
 const { prevData, transferBack } = useTransferPage();
 const { setQuestionList, questionList, stateQuestionList, questionTypeDesc, favoriteList, notKnowList, markList, currentIndex,
   totalCount, doneCount, notDoneCount, notKnowCount, markCount,
@@ -116,6 +116,7 @@ const isAnimationFinish = ref(false);
 const transitionStartX = ref(null);
 const transitionEndX = ref(null);
 const isReady = ref(false);
+const examineerData = ref<Examinee>({} as Examinee);
 const paperData = ref<ExamPaper>({} as ExamPaper);
 const pageTitle = computed(() => {
   const { mode } = prevData.value;
@@ -136,47 +137,26 @@ const handleLeftClick = () => {
   beforeQuit();
 };
 const handleSwiperChange = (e: any) => {
-  console.log(e)
+  // console.log(e)
   currentIndex.value = e.detail.current;
 };
 const beforeQuit = () => {
   const { mode } = prevData.value;
-  if (mode === EnumExamMode.PRACTICE) {
-    beforeQuitPractice();
-  } else {
-    beforeQuitExam();
-  }
-};
-const beforeQuitPractice = () => {
-  uni.$ie.showModal({
-    title: '提示',
-    content: '当前练习未完成,确认退出?',
-  }).then(confirm => {
-    if (confirm) {
-      uni.$ie.showLoading('保存中...');
-      setTimeout(() => {
-        uni.$ie.hideLoading();
-        uni.navigateBack();
-      }, 1000);
-    }
-  });
-};
-const beforeQuitExam = () => {
   if (!isReady.value) {
     return;
   }
+  const msg = mode === EnumExamMode.PRACTICE ? '当前练习未完成,确认退出?' : '当前考试未完成,确认退出?';
   uni.$ie.showModal({
     title: '提示',
-    content: '当前考试未完成,确认退出?',
+    content: msg,
   }).then(confirm => {
     if (confirm) {
       handleSubmit();
-      // uni.navigateBack();
     }
   });
 };
 const currentQuestion = computed(() => {
-  console.log(questionList.value[currentIndex.value])
+  // console.log(questionList.value[currentIndex.value])
   return questionList.value[currentIndex.value] || {};
 });
 const hanadleNavigate = (index: number) => {
@@ -185,11 +165,11 @@ const hanadleNavigate = (index: number) => {
   changeIndex(index);
 }
 const handleFavorite = () => {
-  console.log('handleFavorite')
+  // console.log('handleFavorite')
   currentQuestion.value.isFavorite = !currentQuestion.value.isFavorite;
 };
 const handleMark = () => {
-  console.log('handleMark')
+  // console.log('handleMark')
   currentQuestion.value.isMark = !currentQuestion.value.isMark;
 };
 const questionStatsPopupRef = ref();
@@ -283,6 +263,7 @@ const handleSubmit = () => {
     const params = {
       ...paperData.value,
       questions: questionList.value,
+      examineeId: examineerData.value.examineeId,
     } as ExamPaperSubmit;
     if (!isExamMode.value) {
       params.duration = practiceDuration.value;
@@ -305,6 +286,7 @@ const loadData = async () => {
     transferBack();
     return;
   }
+  examineerData.value = data;
   if (data.paperId) {
     const res = await getPaper({
       type: prevData.value.paperType,

+ 26 - 19
src/pagesStudy/pages/targeted-add/targeted-add.vue

@@ -1,6 +1,6 @@
 <template>
   <ie-page bg-color="#F6F8FA" :fix-height="true">
-    <ie-navbar title="添加定向院校" />
+    <ie-navbar title="选择院校" />
     <view class="mt-16 bg-white py-10">
       <view class="">
         <uv-cell-group :border="false">
@@ -29,7 +29,7 @@
     </view>
     <ie-safe-toolbar :height="84" :shadow="false">
       <view class="px-46 pt-24">
-        <ie-button type="primary" @click="handleAdd">添加</ie-button>
+        <ie-button type="primary" @click="handleAdd">确认</ie-button>
       </view>
     </ie-safe-toolbar>
   </ie-page>
@@ -50,11 +50,13 @@
               <view v-for="item in filteredMajorList" :key="item.id"
                 class="px-20 py-16 bg-white sibling-border-top flex items-center" @click="handleSelect(item)">
                 <view class="flex-1 min-w-1 flex-shrink-0">
-                  <view class="text-30 text-fore-title">{{ item.name }}</view>
-                  <view class="mt-6 text-22 text-fore-light">{{ item.ancestors }}</view>
+                  <view class="text-30 text-fore-title" :class="[isActive(item) ? 'text-primary' : 'text-fore-title']">
+                    {{ item.name }}
+                  </view>
+                  <view class="mt-6 text-22 text-fore-light"
+                    :class="[isActive(item) ? 'text-primary' : 'text-fore-light']">{{ item.ancestors }}</view>
                 </view>
-                <uv-icon v-if="selectedMajor && selectedMajor.id === item.id" name="checkmark" size="20"
-                  color="#31A0FC" />
+                <uv-icon v-if="isActive(item)" name="checkmark" size="20" color="#31A0FC" />
               </view>
             </scroll-view>
           </view>
@@ -70,10 +72,10 @@
 
 <script lang="ts" setup>
 import { useTransferPage } from '@/hooks/useTransferPage';
-import { DirectedSchool, UniversityMajor } from '@/types/study';
+import { DirectedSchool, SelectedUniversityMajor, University, UniversityMajor } from '@/types/study';
 import { getUniversityMajorList } from '@/api/modules/university';
 const { transferTo, transferBack } = useTransferPage();
-const form = ref<Partial<DirectedSchool>>({});
+const form = ref<Partial<SelectedUniversityMajor>>({});
 const keyword = ref('');
 const cellStyle = {
   padding: '20rpx 40rpx'
@@ -92,15 +94,17 @@ const handleUniversitySelect = () => {
     }
   }).then((res: any) => {
     if (res) {
-      if (res.code !== form.value.universityId) {
+      console.log(res)
+      const university = res as University;
+      if (university.code !== form.value.universityId) {
         selectedMajor.value = null;
         form.value.majorId = '';
         form.value.majorName = '';
       }
-      form.value.universityId = res.code;
-      form.value.universityName = res.name;
-      form.value.universityLogo = res.logo;
-      loadMajorList(res.id);
+      form.value.universityId = university.code;
+      form.value.universityName = university.name;
+      form.value.universityLogo = university.logo;
+      loadMajorList(university.code);
     }
   });
 }
@@ -123,7 +127,7 @@ const handleConfirm = () => {
     uni.$ie.showToast('请选择专业');
     return;
   }
-  form.value.ancestors = selectedMajor.value.ancestors;
+  form.value.majorAncestors = selectedMajor.value.ancestors;
   form.value.majorId = selectedMajor.value.id.toString();
   form.value.majorName = selectedMajor.value.name;
   popupRef.value.close();
@@ -143,11 +147,14 @@ const handleAdd = () => {
   }
   transferBack(form.value);
 }
-const loadMajorList = (universityId: string) => {
-  getUniversityMajorList({ universityId }).then(res => {
-    console.log(res);
-    majorList.value = res.data;
-  });
+const isActive = (item: UniversityMajor) => {
+  return selectedMajor.value && selectedMajor.value.id === item.id;
+}
+const loadMajorList = async (universityId: string) => {
+  uni.$ie.showLoading();
+  const { data } = await getUniversityMajorList({ universityId });
+  majorList.value = data;
+  uni.$ie.hideLoading();
 }
 </script>
 

+ 11 - 6
src/pagesStudy/pages/targeted-setting/targeted-setting.vue

@@ -15,7 +15,7 @@
         <ie-image src="/pagesStudy/static/image/icon-edit-pen.png" custom-class="w-24 h-24" mode="aspectFill" />
       </view> -->
     </view>
-    <view v-if="hasDirectedSchool || loading" class="px-30">
+    <view v-if="hasDirectedSchool" class="px-30">
       <l-drag ref="dragRef" :list="directedSchoolList" :column="1" :gridHeight="104" :touchHandle="touchHandle" ghost handle
         @change="changeSort">
         <!-- // 每一项的插槽 grid 的 content 您传入的数据 -->
@@ -59,7 +59,7 @@
       <ie-image src="/pagesStudy/static/image/icon-empty.png" custom-class="w-364 h-252 mx-auto" mode="aspectFill" />
       <text class="text-30 text-fore-light text-center">目前暂无定向院校~</text>
     </view>
-    <ie-safe-toolbar v-if="directedSchoolList.length < 3 && !loading" :height="84" :shadow="false">
+    <ie-safe-toolbar v-if="directedSchoolList.length < 3" :height="84" :shadow="false">
       <view class="px-46 pt-24">
         <ie-button type="primary" @click="handleAdd">添加</ie-button>
       </view>
@@ -69,7 +69,7 @@
 
 <script lang="ts" setup>
 import { useTransferPage } from '@/hooks/useTransferPage';
-import { DirectedSchool } from '@/types/study';
+import { DirectedSchool, SelectedUniversityMajor } from '@/types/study';
 import { getDirectedSchool, saveDirectedSchool } from '@/api/modules/study';
 const { transferTo } = useTransferPage();
 const loading = ref(true);
@@ -87,8 +87,13 @@ const handleAdd = () => {
     data: {}
   }).then(async res => {
     if (res) {
-      directedSchoolList.value.push(res as DirectedSchool);
-      save(directedSchoolList.value);
+      directedSchoolList.value.push({
+        ...res,
+        code: (res as SelectedUniversityMajor).universityId
+      } as DirectedSchool);
+      setTimeout(() => {
+        save(directedSchoolList.value);
+      }, 300);
     }
   });
 }
@@ -107,7 +112,7 @@ const save = async (list: DirectedSchool[]) => {
 }
 const loadData = async () => {
   const { data } = await getDirectedSchool();
-  directedSchoolList.value = data;
+  directedSchoolList.value = data || [];
 }
 loadData();
 </script>

+ 69 - 12
src/types/study.ts

@@ -82,6 +82,23 @@ export interface QuestionState {
   isFavorite?: boolean;
 }
 
+/**
+ * 开卷信息
+ */
+export interface Examinee {
+  examineeId: number;
+  name: string;
+  paperId: number;
+  duration: number;
+  questions: {
+    id: number;
+    title: string;
+    isFavorite: boolean;
+    isMark: boolean;
+    isNotKnow: boolean;
+  }[];
+}
+
 /**
  * 试卷
  */
@@ -100,7 +117,7 @@ export interface ApiQuestion extends QuestionState {
   title: string;
   typeId: number;
   options: string[];
-  answer: (string | number)[];
+  answers: (string | number)[];
   subQuestions: ApiQuestion[];
 }
 
@@ -113,6 +130,7 @@ export interface ExamPaperSubmit {
   subjectId: number;
   year: number;
   duration?: number;
+  examineeId?: number;
 }
 
 export interface QuestionOption {
@@ -127,7 +145,7 @@ export interface Question extends QuestionState {
   title: string;
   typeId: number;
   options: QuestionOption[];
-  answer: (string | number)[];
+  answers: (string | number)[];
   subQuestions: Question[];
 }
 
@@ -138,19 +156,35 @@ export interface QuestionOption {
   isAnswer: boolean;
 }
 
-/**
- * 定向学校
- */
-export interface DirectedSchool {
+export interface SubjectListRequestDTO {
+  directed: boolean;
+}
+
+export interface KnowledgeListRequestDTO {
+  subjectId: number;
+  directed: boolean;
+}
+
+export interface OpenExamineeRequestDTO {
+  paperType: string,
+  relateId: number
+}
+
+export interface GetExamPaperRequestDTO {
+  type: string,
+  id: number
+}
+
+export interface DirectedSchool extends SelectedUniversityMajor {
   code: string;
+}
+
+export interface University {
+  code: string;
+  id: number;
   name: string;
+  logo: string;
   type: string;
-  ancestors: string;
-  universityId: string;
-  universityName: string;
-  universityLogo: string;
-  majorId: string;
-  majorName: string;
 }
 
 export interface UniversityMajor {
@@ -159,4 +193,27 @@ export interface UniversityMajor {
   id: number;
   name: string;
   type: string
+}
+
+// 
+
+export interface SelectedUniversityMajor {
+  universityLogo: string;
+  universityId: string;
+  universityName: string;
+  majorId: string;
+  majorName: string;
+  majorAncestors: string;
+}
+
+export interface SimulationTestOptions {
+  universityId: string;
+  universityName: string;
+  majorId: string;
+  majorName: string;
+}
+
+export interface SimulationTestInfo {
+  evalCount: number;
+  subjects: string[]
 }