CzRger hai 1 mes
pai
achega
287fcc4d32

+ 0 - 1
src/router/index.ts

@@ -154,7 +154,6 @@ router.beforeEach((to, from, next) => {
         if (localStorage.getItem((import.meta as any).env.VITE_TOKEN)) {
           AppStore.initUserInfo()
             .then(() => {
-              console.log(to)
               isLogin ? next({ name: 'root' }) : next(to.path)
             })
             .catch((e) => {

+ 3 - 0
src/views/study/home/index.vue

@@ -538,6 +538,8 @@ const initTeacher = () => {
 }
 const initTopHistory = () => {
   state.topHistory.loading = true
+  state.topHistory.data = []
+  state.topHistory.user = null
   trainingCampPaperQuestionRelIpadPracticeRanking(state.topHistory.date)
     .then(({ data }: any) => {
       state.topHistory.data = data.map((v, i) => {
@@ -606,6 +608,7 @@ const initProjectToday = () => {
 }
 const initProject = () => {
   state.project.loading = true
+  state.project.data = []
   trainingCampLearningPlanList({
     pageNum: 1,
     pageSize: 10000,

+ 3 - 10
src/views/study/subject/chart-4.vue

@@ -49,14 +49,7 @@ const initChart = () => {
     xAxis: {
       type: 'category',
       boundaryGap: false,
-      data: [
-        '2025-03-02',
-        '2025-03-12',
-        '2025-03-22',
-        '2025-04-02',
-        '2025-04-12',
-        '2025-04-22',
-      ],
+      data: props.data.map((v) => v.planDate),
     },
     yAxis: {
       type: 'value',
@@ -66,9 +59,9 @@ const initChart = () => {
     },
     series: [
       {
-        name: '语文成绩',
+        name: '成绩',
         type: 'line',
-        data: [78, 82, 80, 85, 83, 88, 86, 90],
+        data: props.data.map((v) => v.score),
         smooth: true,
         lineStyle: {
           width: 3,

+ 224 - 284
src/views/study/subject/index.vue

@@ -100,46 +100,73 @@
             <div class="ml-auto">
               <div class="__czr-quasar-el-date">
                 <q-input
-                  class="w-[250px]"
+                  class="w-[220px]"
                   rounded
                   standout="focus"
                   :dense="true"
-                  v-model="dateStr"
+                  v-model="dateStrMakeQuestion"
                   readonly
                 >
                   <template v-slot:prepend>
                     <q-icon
                       name="event"
                       class="cursor-pointer"
-                      @click="ref_date.handleOpen()"
+                      @click="ref_dateMakeQuestion.handleOpen()"
                     >
                     </q-icon>
                   </template>
                 </q-input>
                 <el-date-picker
-                  ref="ref_date"
+                  ref="ref_dateMakeQuestion"
                   v-model="state.makeQuestion.date"
                   value-format="YYYY-MM-DD"
                   type="daterange"
+                  @change="initMakeQuestion"
                 />
               </div>
             </div>
           </div>
-          <div>
-            <template v-for="item in state.makeQuestion.data">
+          <div
+            class="h-[120px] overflow-y-auto"
+            v-loading="state.makeQuestion.loading"
+          >
+            <template v-if="state.makeQuestion.data?.length > 0">
+              <template v-for="item in state.makeQuestion.data">
+                <div class="record-item rounded-lg border border-gray-100 p-2">
+                  <div class="flex items-center justify-between">
+                    <span class="text-sm font-medium">
+                      {{ AppStore.subjectMap.get(item.subject) }}
+                    </span>
+                    <div class="flex justify-end">
+                      <button
+                        class="text-subject-color flex items-center text-xs hover:underline"
+                        @click="
+                          $router.push({
+                            name: $route.meta.subjectId + 'question-only',
+                            query: {
+                              planId: item.planId,
+                            },
+                          })
+                        "
+                      >
+                        <i class="fas fa-file-alt mr-1"></i>
+                        查看详情
+                      </button>
+                    </div>
+                  </div>
+                  <div class="mt-1 text-xs text-gray-500">
+                    {{ item.planDate }} | xxx题(<span class="text-red"
+                      >xxx</span
+                    >/<span class="text-green">xxx</span>) | 正确率xxx%
+                  </div>
+                </div>
+              </template>
+            </template>
+            <template v-else>
               <div
-                class="record-item cursor-pointer rounded-lg border border-gray-100 p-2"
-                @click="$router.push({ name: 'chinese-question-only' })"
+                class="flex size-full items-center justify-center text-xl font-semibold text-gray-700"
               >
-                <div class="flex items-center justify-between">
-                  <span class="text-sm font-medium">
-                    {{ AppStore.subjectMap.get(item.subject) }}
-                  </span>
-                </div>
-                <div class="mt-1 text-xs text-gray-500">
-                  {{ item.planDate }} | xxx题(<span class="text-red">xxx</span
-                  >/<span class="text-green">xxx</span>) | 正确率xxx%
-                </div>
+                暂无数据
               </div>
             </template>
           </div>
@@ -154,261 +181,130 @@
               <i class="fas fa-calendar-alt mr-2"></i>
               考形训练
               <div class="absolute right-2 ml-auto flex">
-                <q-select
-                  class="select ml-4 w-[120px]"
-                  rounded
-                  standout="focus"
-                  v-model="state.query.p1"
-                  :options="[
-                    { label: '近三个月', value: '近三个月' },
-                    { label: '本学期', value: '本学期' },
-                    { label: '上学期', value: '上学期' },
-                    { label: '本年度', value: '本年度' },
-                    { label: '全部', value: '全部' },
-                  ]"
-                  :dense="true"
-                >
-                </q-select>
-                <q-select
-                  class="select ml-4 w-[120px]"
-                  rounded
-                  standout="focus"
-                  v-model="state.query.p2"
-                  :options="[
-                    { label: '全部类型', value: '全部类型' },
-                    { label: '周测', value: '周测' },
-                    { label: '月考', value: '月考' },
-                    { label: '期中考试', value: '期中考试' },
-                    { label: '期末考试', value: '期末考试' },
-                  ]"
-                  :dense="true"
-                >
-                </q-select>
-              </div>
-            </div>
-          </div>
-          <div class="h-[200px]">
-            <chart4 />
-          </div>
-          <div class="flex-1 overflow-y-auto p-6">
-            <div class="timeline-date">2023年12月</div>
-            <div class="exam-item mb-3 rounded-lg border border-gray-300 p-3">
-              <div class="mb-2 flex items-start justify-between">
-                <div>
-                  <div class="flex items-center font-semibold">
-                    <span
-                      class="bg-exam-weekly mr-2 h-2 w-2 rounded-full"
-                    ></span>
-                    周测
-                  </div>
-                  <div class="mt-0.5 text-sm text-gray-500">12月22日</div>
-                </div>
-                <span class="text-sm font-medium text-gray-800">88分</span>
-              </div>
-              <div class="mt-3 grid grid-cols-2 gap-3 text-sm md:grid-cols-4">
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">试卷难度</div>
-                  <div class="font-medium text-gray-800">S</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">用时</div>
-                  <div class="font-medium text-gray-800">45分钟</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">得分</div>
-                  <div class="font-medium text-gray-800">96分</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">错题</div>
-                  <div class="font-medium text-red-500">3题</div>
-                </div>
-              </div>
-              <div class="mt-3">
-                <div class="mb-1 text-xs text-gray-500">错题类型:</div>
-                <div class="flex flex-wrap gap-2">
-                  <span
-                    class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
-                    >阅读理解(2)</span
-                  >
-                  <span
-                    class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
-                    >基础知识(1)</span
-                  >
-                </div>
-              </div>
-              <div class="mt-3 flex justify-end">
-                <button
-                  class="text-subject-color flex items-center text-xs hover:underline"
-                  @click="$router.push({ name: 'chinese-question-only' })"
-                >
-                  <i class="fas fa-file-alt mr-1"></i>
-                  查看详情
-                </button>
-              </div>
-            </div>
-            <div class="exam-item mb-3 rounded-lg border border-gray-300 p-3">
-              <div class="mb-2 flex items-start justify-between">
-                <div>
-                  <div class="flex items-center font-semibold">
-                    <span
-                      class="bg-exam-weekly mr-2 h-2 w-2 rounded-full"
-                    ></span>
-                    期中
-                  </div>
-                  <div class="mt-0.5 text-sm text-gray-500">12月12日</div>
-                </div>
-                <span class="text-sm font-medium text-gray-800">88分</span>
-              </div>
-              <div class="mt-3 grid grid-cols-2 gap-3 text-sm md:grid-cols-4">
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">试卷难度</div>
-                  <div class="font-medium text-gray-800">S</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">用时</div>
-                  <div class="font-medium text-gray-800">45分钟</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">得分</div>
-                  <div class="font-medium text-gray-800">96分</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">错题</div>
-                  <div class="font-medium text-red-500">3题</div>
-                </div>
-              </div>
-              <div class="mt-3">
-                <div class="mb-1 text-xs text-gray-500">错题类型:</div>
-                <div class="flex flex-wrap gap-2">
-                  <span
-                    class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
-                    >阅读理解(2)</span
-                  >
-                  <span
-                    class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
-                    >基础知识(1)</span
+                <div class="__czr-quasar-el-date training-date">
+                  <q-input
+                    class="w-[220px]"
+                    rounded
+                    standout="focus"
+                    :dense="true"
+                    v-model="dateStrTraining"
+                    readonly
                   >
+                    <template v-slot:prepend>
+                      <q-icon
+                        name="event"
+                        class="cursor-pointer"
+                        color="white"
+                        @click="ref_dateTraining.handleOpen()"
+                      >
+                      </q-icon>
+                    </template>
+                  </q-input>
+                  <el-date-picker
+                    ref="ref_dateTraining"
+                    v-model="state.training.date"
+                    value-format="YYYY-MM-DD"
+                    type="daterange"
+                    @change="initTraining"
+                  />
                 </div>
               </div>
-              <div class="mt-3 flex justify-end">
-                <button
-                  class="text-subject-color flex items-center text-xs hover:underline"
-                  @click="$router.push({ name: 'chinese-question-only' })"
-                >
-                  <i class="fas fa-file-alt mr-1"></i>
-                  查看详情
-                </button>
-              </div>
             </div>
-            <div class="timeline-date">2023年11月</div>
-            <div class="exam-item mb-3 rounded-lg border border-gray-300 p-3">
-              <div class="mb-2 flex items-start justify-between">
-                <div>
-                  <div class="flex items-center font-semibold">
-                    <span
-                      class="bg-exam-weekly mr-2 h-2 w-2 rounded-full"
-                    ></span>
-                    周测
-                  </div>
-                  <div class="mt-0.5 text-sm text-gray-500">12月22日</div>
-                </div>
-                <span class="text-sm font-medium text-gray-800">88分</span>
-              </div>
-              <div class="mt-3 grid grid-cols-2 gap-3 text-sm md:grid-cols-4">
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">试卷难度</div>
-                  <div class="font-medium text-gray-800">S</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">用时</div>
-                  <div class="font-medium text-gray-800">45分钟</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">得分</div>
-                  <div class="font-medium text-gray-800">96分</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">错题</div>
-                  <div class="font-medium text-red-500">3题</div>
-                </div>
-              </div>
-              <div class="mt-3">
-                <div class="mb-1 text-xs text-gray-500">错题类型:</div>
-                <div class="flex flex-wrap gap-2">
-                  <span
-                    class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
-                    >阅读理解(2)</span
-                  >
-                  <span
-                    class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
-                    >基础知识(1)</span
-                  >
-                </div>
-              </div>
-              <div class="mt-3 flex justify-end">
-                <button
-                  class="text-subject-color flex items-center text-xs hover:underline"
-                  @click="$router.push({ name: 'chinese-question-only' })"
-                >
-                  <i class="fas fa-file-alt mr-1"></i>
-                  查看详情
-                </button>
-              </div>
-            </div>
-            <div class="exam-item mb-3 rounded-lg border border-gray-300 p-3">
-              <div class="mb-2 flex items-start justify-between">
-                <div>
-                  <div class="flex items-center font-semibold">
-                    <span
-                      class="bg-exam-weekly mr-2 h-2 w-2 rounded-full"
-                    ></span>
-                    期中
-                  </div>
-                  <div class="mt-0.5 text-sm text-gray-500">12月12日</div>
-                </div>
-                <span class="text-sm font-medium text-gray-800">88分</span>
-              </div>
-              <div class="mt-3 grid grid-cols-2 gap-3 text-sm md:grid-cols-4">
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">试卷难度</div>
-                  <div class="font-medium text-gray-800">S</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">用时</div>
-                  <div class="font-medium text-gray-800">45分钟</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">得分</div>
-                  <div class="font-medium text-gray-800">96分</div>
-                </div>
-                <div class="rounded bg-gray-50 p-2 text-center">
-                  <div class="text-xs text-gray-500">错题</div>
-                  <div class="font-medium text-red-500">3题</div>
-                </div>
+          </div>
+          <div
+            class="flex flex-1 flex-col overflow-hidden"
+            v-loading="state.training.loading"
+          >
+            <template v-if="state.training.data?.length > 0">
+              <div class="h-[200px]">
+                <chart4 :data="state.training.data" />
               </div>
-              <div class="mt-3">
-                <div class="mb-1 text-xs text-gray-500">错题类型:</div>
-                <div class="flex flex-wrap gap-2">
-                  <span
-                    class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
-                    >阅读理解(2)</span
-                  >
-                  <span
-                    class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
-                    >基础知识(1)</span
-                  >
-                </div>
+              <div class="flex-1 overflow-y-auto px-6 py-2">
+                <template v-if="state.training.groupData?.length > 0">
+                  <template v-for="item in state.training.groupData">
+                    <div class="timeline-date">{{ YM(item.date, true) }}</div>
+                    <template v-for="son in item.list">
+                      <div
+                        class="exam-item mb-3 rounded-lg border border-gray-300 p-3"
+                      >
+                        <div class="mb-2 flex items-start justify-between">
+                          <div>
+                            <div class="mt-0.5 text-sm text-gray-500">
+                              {{ son.planDate }}
+                            </div>
+                          </div>
+                          <span class="text-sm font-medium text-gray-800">
+                            {{ son.score }}分
+                          </span>
+                        </div>
+                        <div
+                          class="mt-3 grid grid-cols-2 gap-3 text-sm md:grid-cols-4"
+                        >
+                          <div class="rounded bg-gray-50 p-2 text-center">
+                            <div class="text-xs text-gray-500">试卷难度</div>
+                            <div class="font-medium text-gray-800">XXX</div>
+                          </div>
+                          <div class="rounded bg-gray-50 p-2 text-center">
+                            <div class="text-xs text-gray-500">用时</div>
+                            <div class="font-medium text-gray-800">
+                              {{ Math.floor(son.usedCardTime / 60) }}分钟
+                            </div>
+                          </div>
+                          <div class="rounded bg-gray-50 p-2 text-center">
+                            <div class="text-xs text-gray-500">得分</div>
+                            <div class="font-medium text-gray-800">
+                              {{ son.score }}分
+                            </div>
+                          </div>
+                          <div class="rounded bg-gray-50 p-2 text-center">
+                            <div class="text-xs text-gray-500">错题</div>
+                            <div class="font-medium text-red-500">xxx题</div>
+                          </div>
+                        </div>
+                        <div class="mt-3">
+                          <div class="mb-1 text-xs text-gray-500">
+                            错题类型:
+                          </div>
+                          <div class="flex flex-wrap gap-2">
+                            <span
+                              class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
+                              >xxx(xxx)</span
+                            >
+                            <span
+                              class="mistake-tag rounded-full bg-red-100 px-2 py-0.5 text-xs text-red-800"
+                              >xxx(xxx)</span
+                            >
+                          </div>
+                        </div>
+                        <div class="mt-3 flex justify-end">
+                          <button
+                            class="text-subject-color flex items-center text-xs hover:underline"
+                            @click="
+                              $router.push({
+                                name: $route.meta.subjectId + 'question-only',
+                                query: {
+                                  planId: son.planId,
+                                },
+                              })
+                            "
+                          >
+                            <i class="fas fa-file-alt mr-1"></i>
+                            查看详情
+                          </button>
+                        </div>
+                      </div>
+                    </template>
+                  </template>
+                </template>
               </div>
-              <div class="mt-3 flex justify-end">
-                <button
-                  class="text-subject-color flex items-center text-xs hover:underline"
-                  @click="$router.push({ name: 'chinese-question-only' })"
-                >
-                  <i class="fas fa-file-alt mr-1"></i>
-                  查看详情
-                </button>
+            </template>
+            <template v-else>
+              <div
+                class="flex size-full items-center justify-center text-xl font-semibold text-gray-700"
+              >
+                暂无数据
               </div>
-            </div>
+            </template>
           </div>
         </div>
         <div
@@ -495,7 +391,7 @@ import chart2 from './chart-2.vue'
 import chart3 from './chart-3.vue'
 import chart4 from './chart-4.vue'
 import { trainingCampLearningPlanList } from '@/api/modules/study'
-import { oneDayTime, YMD } from '@/utils/czr-util'
+import { oneDayTime, YM, YMD } from '@/utils/czr-util'
 import { useAppStore } from '@/stores'
 import { useRoute } from 'vue-router'
 
@@ -508,20 +404,29 @@ const state: any = reactive({
     data: [],
     date: [YMD(new Date().getTime() - oneDayTime * 7), YMD(new Date())],
   },
-  query: {
-    p1: '近三个月',
-    p2: '全部类型',
-    date: {},
+  training: {
+    loading: false,
+    data: [],
+    groupData: [],
+    date: [YMD(new Date().getTime() - oneDayTime * 90), YMD(new Date())],
   },
 })
-const ref_date = ref()
-const dateStr = computed(() => {
+const ref_dateMakeQuestion = ref()
+const dateStrMakeQuestion = computed(() => {
   if (state.makeQuestion.date.length > 0) {
     return `${state.makeQuestion.date[0]} - ${state.makeQuestion.date[1]}`
   }
   return ''
 })
+const ref_dateTraining = ref()
+const dateStrTraining = computed(() => {
+  if (state.training.date.length > 0) {
+    return `${state.training.date[0]} - ${state.training.date[1]}`
+  }
+  return ''
+})
 const initMakeQuestion = () => {
+  state.makeQuestion.loading = true
   trainingCampLearningPlanList({
     pageNum: 1,
     pageSize: 10000,
@@ -540,14 +445,55 @@ const initMakeQuestion = () => {
       state.makeQuestion.loading = false
     })
 }
+const initTraining = () => {
+  state.training.loading = true
+  state.training.data = []
+  trainingCampLearningPlanList({
+    pageNum: 1,
+    pageSize: 10000,
+    studentId: AppStore.studentInfo?.studentId,
+    subject: route.meta.subjectId,
+    paperType: 2,
+    params: {
+      beginPlanDate: `${state.training.date[0]} 00:00:00`,
+      endPlanDate: `${state.training.date[1]} 23:59:59`,
+    },
+  })
+    .then(({ rows }: any) => {
+      state.training.data = rows
+      // 按照年月分组
+      state.training.groupData = rows.reduce((acc, item) => {
+        // 提取年月部分(格式:YYYY-MM)
+        const datePart = item.planDate.slice(0, 7)
+        // 查找是否已有该年月分组
+        const group = acc.find((g) => g.date === datePart)
+        if (group) {
+          // 如果已有该分组,添加到对应的list中
+          group.list.push(item)
+        } else {
+          // 如果没有该分组,创建新分组
+          acc.push({
+            date: datePart,
+            list: [item],
+          })
+        }
+        return acc
+      }, [])
+      console.log(state.training.groupData)
+    })
+    .finally(() => {
+      state.training.loading = false
+    })
+}
 onMounted(() => {
   initMakeQuestion()
+  initTraining()
 })
 onBeforeMount(() => {
-  document.documentElement.style.setProperty(
-    '--czr-quasar-color',
-    'var(--czr-main-color)',
-  )
+  // document.documentElement.style.setProperty(
+  //   '--czr-quasar-color',
+  //   'var(--czr-main-color)',
+  // )
 })
 </script>
 
@@ -634,15 +580,9 @@ onBeforeMount(() => {
   z-index: 10;
   position: relative;
 }
-:deep(.select) {
-  .ellipsis {
+:deep(.training-date) {
+  .q-placeholder {
     color: #ffffff;
   }
-  .q-select__dropdown-icon {
-    color: #ffffff;
-  }
-  .focus {
-    background: rgba(0, 0, 0, 0.1);
-  }
 }
 </style>