Quellcode durchsuchen

学习计划数据对接

shmily1213 vor 1 Monat
Ursprung
Commit
06a10c7b98

+ 1 - 1
src/api/modules/study.ts

@@ -8,7 +8,7 @@ import { ApiQuestion, DirectedSchool, Examinee, ExamPaper, ExamPaperSubmit, GetE
  * @returns 
  */
 export function getStudyPlan() {
-  return flyio.get('/front/student/plan') as Promise<ApiResponse<any>>;
+  return flyio.get('/front/student/plan') as Promise<ApiResponse<StudyPlan>>;
 }
 
 /**

+ 6 - 7
src/pagesStudy/pages/index/compoentns/index-banner.vue

@@ -30,16 +30,15 @@
 import { useTransferPage } from '@/hooks/useTransferPage';
 import { getStudyPlan, getDirectedSchool } from '@/api/modules/study';
 const { transferTo } = useTransferPage();
-const navigateTo = (pageUrl: string) => {
-  transferTo(pageUrl);
-}
 
 const handleOpenPlan = async () => {
-  const { data } = await getStudyPlan()
-  console.log(data)
-  // console.log(data, directedSchool)
+  const { data } = await getStudyPlan();
   if (data) {
-    transferTo('/pagesStudy/pages/study-plan/study-plan');
+    transferTo('/pagesStudy/pages/study-plan/study-plan', {
+      data: {
+        ...data
+      }
+    });
   } else {
     transferTo('/pagesStudy/pages/study-plan-edit/study-plan-edit');
   }

+ 27 - 17
src/pagesStudy/pages/study-plan-edit/study-plan-edit.vue

@@ -11,7 +11,7 @@
               <text class="text-30 text-fore-subtitle">课程学习</text>
             </template>
             <template #value>
-              <text v-if="form.courseTime" class="mr-10 text-30 text-fore-title">{{ form.courseTime }}课时</text>
+              <text v-if="form.videoTime" class="mr-10 text-30 text-fore-title">{{ form.videoTime }}课时</text>
               <text v-else class="mr-10 text-30 text-fore-placeholder">去设置</text>
             </template>
           </uv-cell>
@@ -21,7 +21,7 @@
               <text class="text-30 text-fore-subtitle">题库练习</text>
             </template>
             <template #value>
-              <text v-if="form.questionTime" class="mr-10 text-30 text-fore-title">{{ form.questionTime }}题</text>
+              <text v-if="form.questionCnt" class="mr-10 text-30 text-fore-title">{{ form.questionCnt }}题</text>
               <text v-else class="mr-10 text-30 text-fore-placeholder">去设置</text>
             </template>
           </uv-cell>
@@ -43,7 +43,8 @@ import { StudyPlan } from '@/types/study';
 import CourseSetting from './components/course-setting.vue';
 import QuestionSetting from './components/question-setting.vue';
 import { saveStudyPlan } from '@/api/modules/study';
-// type SubmitStudyPlan = Omit<StudyPlan, 'id' | 'beginTime' | 'studentId' | 'status'>;
+import { useTransferPage } from '@/hooks/useTransferPage';
+const { prevData } = useTransferPage();
 const cellStyle = {
   padding: '30rpx 40rpx'
 }
@@ -51,34 +52,43 @@ const rightIconStyle = {
   fontSize: '14px'
 }
 const form = ref({
-  courseTime: null as number | null,
-  questionTime: null as number | null
+  questionCnt: 0,
+  videoTime: 0
 })
 const courseStudySetting = ref();
 const questionStudySetting = ref();
 const handleCourseStudySetting = () => {
-  courseStudySetting.value.open(form.value.courseTime, (time: number) => {
-    form.value.courseTime = time;
+  courseStudySetting.value.open(form.value.videoTime, (time: number) => {
+    form.value.videoTime = time;
   });
 }
 const handleQuestionStudySetting = () => {
-  questionStudySetting.value.open(form.value.questionTime, (time: number) => {
-    form.value.questionTime = time;
+  questionStudySetting.value.open(form.value.questionCnt, (time: number) => {
+    form.value.questionCnt = time;
   });
 }
 const handleConfirm = async () => {
-  const { courseTime, questionTime } = form.value;
-  if (questionTime == null || courseTime == null) {
-    uni.$ie.showToast('请设置题库习计划');
+  const { questionCnt, videoTime } = form.value;
+  if (!questionCnt) {
+    uni.$ie.showToast('请设置题库习计划');
     return;
   }
-  console.log(form.value);
-  // await saveStudyPlan(form.value);
+  uni.$ie.showLoading();
+  await saveStudyPlan(form.value);
+  uni.$ie.hideLoading();
   uni.$ie.showToast('保存成功');
-  uni.navigateBack();
-  // uni.$ie.showToast('保存成功');
-  // uni.navigateBack();
+  setTimeout(() => {
+    uni.navigateBack();
+  }, 500);
 }
+
+onLoad(() => {
+  form.value = {
+    ...prevData.value,
+    questionCnt: prevData.value.questionCnt || 0,
+    videoTime: prevData.value.videoTime || 0
+  }
+});
 </script>
 
 <style lang="scss" scoped></style>

+ 50 - 44
src/pagesStudy/pages/study-plan/components/page-calendar.vue

@@ -19,51 +19,55 @@
   </view>
 </template>
 <script lang="ts" setup>
-const stat = ref([
-  {
-    name: '答题数',
-    unit: '道题',
-    value: '0/90',
-    icon: '/pagesStudy/static/image/icon-pen.png'
-  },
-  {
-    name: '课程学习',
-    unit: '课时',
-    value: '0/5',
-    icon: '/pagesStudy/static/image/icon-video.png'
-  },
-  {
-    name: '学习时长',
-    unit: '分钟',
-    value: '0/120',
-    icon: '/pagesStudy/static/image/icon-time.png'
-  },
-  {
-    name: '正确率',
-    unit: '',
-    value: '70%',
-    icon: '/pagesStudy/static/image/icon-chart.png'
-  }
-])
-const selected = ref([
-  {
-    date: '2025-09-29',
-    info: 2
-  },
-  {
-    date: '2025-10-01',
-    info: 1
-  },
-  {
-    date: '2025-10-02',
-    info: 3
-  }
-])
+import { STUDY_PLAN_STATS, STUDY_PLAN } from '@/types/injectionSymbols';
+const studyPlanRef = inject(STUDY_PLAN);
+const studyPlanStatsRef = inject(STUDY_PLAN_STATS);
+
+const stat = computed(() => {
+  const studyPlan = studyPlanRef?.value;
+  const todayData = studyPlanStatsRef?.value?.today;
+  const questionCnt = studyPlan?.questionCnt;
+  const videoTime = studyPlan?.videoTime;
+  
+  return [
+    {
+      name: '答题数',
+      unit: '道题',
+      value: `${getValue(todayData?.questionCnt)}/${getValue(questionCnt)}`,
+      icon: '/pagesStudy/static/image/icon-pen.png'
+    },
+    {
+      name: '课程学习',
+      unit: '课时',
+      value: `${getValue(todayData?.videoTime)}/${getValue(videoTime)}`,
+      icon: '/pagesStudy/static/image/icon-video.png'
+    },
+    {
+      name: '学习时长',
+      unit: '分钟',
+      value: `${getValue(todayData?.videoTimes)}`,
+      icon: '/pagesStudy/static/image/icon-time.png'
+    },
+    {
+      name: '正确率',
+      unit: '',
+      value: `${getValue(todayData?.rightRate)}%`,
+      icon: '/pagesStudy/static/image/icon-chart.png'
+    }
+  ]
+});
+const selected = ref([])
 const endDate = ref('')
 const todayPlanFinish = computed(() => {
-  const todayTarget = selected.value.find(item => item.date === endDate.value)
-  if (todayTarget) {
-    return todayTarget.info > 2;
+  const studyPlan = studyPlanRef?.value;
+  const todayData = studyPlanStatsRef?.value?.today;
+  const questionCnt = studyPlan?.questionCnt;
+  const videoTime = studyPlan?.videoTime;
+  
+  if (
+    getValue(todayData?.questionCnt) >= getValue(questionCnt) &&
+    getValue(todayData?.videoTime) >= getValue(videoTime)) {
+    return true;
   }
   return false
 });
@@ -73,7 +77,9 @@ const tip = computed(() => {
   }
   return '今日计划进行中,加油~'
 });
-
+const getValue = (val?: number) => {
+  return val || 0;
+}
 const init = () => {
   endDate.value = uni.$uv.timeFormat(new Date(), 'yyyy-mm-dd')
 }

+ 32 - 22
src/pagesStudy/pages/study-plan/components/page-header.vue

@@ -21,27 +21,37 @@
   </view>
 </template>
 <script lang="ts" setup>
-const stat = [
-  {
-    data: 5,
-    unit: '天',
-    desc: '本月已完成'
-  },
-  {
-    data: 13,
-    unit: '天',
-    desc: '本月未完成'
-  },
-  {
-    data: 10,
-    unit: 'h',
-    desc: '学习时长'
-  },
-  {
-    data: 450,
-    unit: '题',
-    desc: '答题总数'
-  }
-]
+import { STUDY_PLAN_STATS, STUDY_PLAN } from '@/types/injectionSymbols';
+const studyPlan = inject(STUDY_PLAN);
+const studyPlanStatsRef = inject(STUDY_PLAN_STATS);
+
+const stat = computed(() => {
+  const studyPlanStats = studyPlanStatsRef?.value;
+  return [
+    {
+      data: getValue(studyPlanStats?.doneDay),
+      unit: '天',
+      desc: '本月已完成'
+    },
+    {
+      data: getValue(studyPlanStats?.undoneDay),
+      unit: '天',
+      desc: '本月未完成'
+    },
+    {
+      data: getValue(studyPlanStats?.videoTimes),
+      unit: 'h',
+      desc: '学习时长'
+    },
+    {
+      data: getValue(studyPlanStats?.questionCnt),
+      unit: '题',
+      desc: '答题总数'
+    }
+  ]
+});
+const getValue = (val?: number) => {
+  return val || 0;
+}
 </script>
 <style lang="scss" scoped></style>

+ 18 - 6
src/pagesStudy/pages/study-plan/study-plan.vue

@@ -15,24 +15,36 @@
 import PageHeader from './components/page-header.vue';
 import PageCalendar from './components/page-calendar.vue';
 import { useTransferPage } from '@/hooks/useTransferPage';
-import { getStudyPlanStats } from '@/api/modules/study';
-const { transferTo } = useTransferPage();
+import { getStudyPlan, getStudyPlanStats } from '@/api/modules/study';
+import { StudyPlan, StudyPlanStats } from '@/types/study';
+import { STUDY_PLAN, STUDY_PLAN_STATS } from '@/types/injectionSymbols';
+
+const { prevData, transferTo } = useTransferPage();
 const today = uni.$uv.timeFormat(new Date(), 'yyyy-mm-dd');
+const studyPlan = ref<StudyPlan>({} as StudyPlan);
+const studyPlanStats = ref<StudyPlanStats>({} as StudyPlanStats);
+provide(STUDY_PLAN, studyPlan);
+provide(STUDY_PLAN_STATS, studyPlanStats);
+
 const handleEditPlan = () => {
   transferTo('/pagesStudy/pages/study-plan-edit/study-plan-edit', {
     data: {
-
+      ...studyPlan.value
     }
   });
 }
-
 const loadData = async () => {
+  const res = await getStudyPlan();
+  studyPlan.value = res.data;
   const { data } = await getStudyPlanStats({
     reportMonth: today
   });
-  console.log(data)
+  studyPlanStats.value = data;
+  console.log('学习计划统计数据:', data)
 }
-loadData();
+onShow(() => {
+  loadData();
+});
 onPageScroll(() => { });
 </script>
 

+ 11 - 1
src/types/injectionSymbols.ts

@@ -1,4 +1,5 @@
 import type { InjectionKey } from 'vue'
+import { StudyPlan, StudyPlanStats } from './study';
 /**
  * 打开知识点记录详情
  */
@@ -21,4 +22,13 @@ export const PREV_QUESTION = Symbol('PREV_QUESTION') as InjectionKey<() => void>
 
 export const NEXT_QUESTION_QUICKLY = Symbol('NEXT_QUESTION_QUICKLY') as InjectionKey<() => void>;
 
-export const PREV_QUESTION_QUICKLY = Symbol('PREV_QUESTION_QUICKLY') as InjectionKey<() => void>;
+export const PREV_QUESTION_QUICKLY = Symbol('PREV_QUESTION_QUICKLY') as InjectionKey<() => void>;
+
+/**
+ * 学习计划
+ */
+export const STUDY_PLAN = Symbol('STUDY_PLAN') as InjectionKey<Ref<StudyPlan>>;
+/**
+ * 学习计划统计数据
+ */
+export const STUDY_PLAN_STATS = Symbol('STUDY_PLAN_STATS') as InjectionKey<Ref<StudyPlanStats>>;

+ 4 - 4
src/types/study.ts

@@ -47,12 +47,12 @@ export interface StudentVideoStat {
  * 学习计划
  */
 export interface StudyPlan {
-  id: number;
-  beginTime: string;
+  id?: number;
+  beginTime?: string;
   questionCnt: number;
-  studentId: number;
+  studentId?: number;
   videoTime: number;
-  status: number;
+  status?: number;
 }
 
 /**