From d93f89b1b6bf8a4ec3f22bc6bfbaff7ce33cc86b Mon Sep 17 00:00:00 2001
From: Guarp <guarp2022@163.com>
Date: Thu, 6 Mar 2025 09:46:28 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=B0pod;=20=E4=BF=AE?=
 =?UTF-8?q?=E6=94=B9pod=E6=8E=92=E7=89=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/GeneralRenderer.vue            | 14 ++++
 src/pages/Demos_home.vue                      |  2 +-
 src/pages/demoPages/podExercise/Pod_page.vue  | 67 +++++++++++++++----
 .../demoPages/podExercise/QuestionText.vue    |  6 +-
 src/pages/demoPages/podExercise/Quiz.vue      | 20 ++++--
 5 files changed, 83 insertions(+), 26 deletions(-)

diff --git a/src/components/GeneralRenderer.vue b/src/components/GeneralRenderer.vue
index 87eb65c..7e503f3 100644
--- a/src/components/GeneralRenderer.vue
+++ b/src/components/GeneralRenderer.vue
@@ -75,6 +75,8 @@ onMounted(async () => {
 
 .renderer-container p {
   margin-bottom: 1rem;
+  display: flex;
+  justify-content: center;
 }
 
 .renderer-container code {
@@ -132,6 +134,18 @@ onMounted(async () => {
   background-color: #222;
   color: #f0f0f0;
 }
+.pod-image {
+  align-self: center;
+  filter: invert(92%);
+  height: auto;
+  max-height: 300px;
+  width: auto;
+  max-width: 100%;
+  margin: 10px 0;
+}
+.theme-light img {
+  filter: invert(0);
+}
 .theme-light .renderer-container {
   font-family: 'Arial', sans-serif;
   font-size: 1rem;
diff --git a/src/pages/Demos_home.vue b/src/pages/Demos_home.vue
index dfbd1be..5c57fa5 100644
--- a/src/pages/Demos_home.vue
+++ b/src/pages/Demos_home.vue
@@ -17,7 +17,7 @@ const demos = ref([
     date: '2025-2-26',
     author: ["Louis Zhou"],
     tags: ['课内'],
-    image: 'https://' + getDomain() + '/data/file/pod.png'
+    image: 'https://' + getDomain() + '/data/demos/pod/icon.png'
   },
 ]);
 
diff --git a/src/pages/demoPages/podExercise/Pod_page.vue b/src/pages/demoPages/podExercise/Pod_page.vue
index 80aafaa..be60cec 100644
--- a/src/pages/demoPages/podExercise/Pod_page.vue
+++ b/src/pages/demoPages/podExercise/Pod_page.vue
@@ -1,30 +1,51 @@
 <script setup>
 
-import {ref} from "vue";
+import {computed, ref} from "vue";
 
 const podList = ref([
   {
-    title: 'PHY MCQ 1',
-    file: 'phy250226',
+    title: 'MCQ 1',
+    categories: 'AP phy 1',
+    file: '250227',
     describe: '',
     date: '2025-2-26'
   },{
-    title: 'PHY MCQ 2',
-    file: 'phy250227',
+    title: 'MCQ 2',
+    categories: 'AP phy 1',
+    file: '250306',
     describe: '',
     date: '2025-2-27'
-  },
+  },{
+    title: 'MCQ 3',
+    categories: 'AP phy 1',
+    file: '250313',
+    describe: '',
+    date: '2025-3-6'
+  }
 ])
+
+const uniqueCats = computed(() => {
+  const keys = new Set();
+  podList.value.forEach(item => {
+    keys.add(item.categories);
+  });
+  return Array.from(keys);
+});
 </script>
 
 <template>
   <div class="container" v-if="/^\/demos\/pod\/?$/.test($route.path)">
     <h1>无限制做题大赛</h1>
-    <div class="pod-container">
-      <router-link class="pods" v-for="pod in podList" :to="`/demos/pod/quiz?id=${pod.file}`">
-        <div class="title">{{ pod.title }}</div>
-        <div class="date">{{ pod.date }}</div>
-      </router-link>
+    <div class="pod-container" v-for="cat in uniqueCats">
+      <div class="folder">
+        <div class="folder-title">{{ cat }}</div>
+        <div class="pods-display">
+          <router-link class="pods" v-for="pod in podList" :to="`/demos/pod/quiz?cat=${pod.categories.toLowerCase().replaceAll(' ', '')}&id=${pod.file}`">
+            <div class="title">{{ pod.title }}</div>
+            <div class="date">{{ pod.date }}</div>
+          </router-link>
+        </div>
+      </div>
     </div>
   </div>
   <router-view v-else />
@@ -49,6 +70,26 @@ const podList = ref([
   flex-wrap: wrap;
   gap: 20px;
 }
+.folder {
+  background: rgba(128, 128, 128, 0.11);
+  display: flex;
+  padding: 15px;
+  flex-wrap: wrap;
+  flex-direction: column;
+  align-items: center;
+  max-width: 520px;
+}
+.folder-title {
+  font-size: 25px;
+}
+.pods-display {
+  display: flex;
+  padding: 15px;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: center;
+  gap: 20px;
+}
 .pods {
   display: flex;
   flex-direction: column;
@@ -56,12 +97,12 @@ const podList = ref([
   justify-content: center;
   width: 150px;
   height: 150px;
-  background: #2a2a2a;
+  background: #131313;
   max-width: 800px;
   cursor: pointer;
 }
 .theme-light .pods {
-  background: #efefef;
+  background: #ffffff;
 }
 .title {
   font-size: 20px;
diff --git a/src/pages/demoPages/podExercise/QuestionText.vue b/src/pages/demoPages/podExercise/QuestionText.vue
index ca05918..cb520e5 100644
--- a/src/pages/demoPages/podExercise/QuestionText.vue
+++ b/src/pages/demoPages/podExercise/QuestionText.vue
@@ -26,7 +26,7 @@ function replaceMedia(text, medias) {
     if (medias[mediaKey]) {
       const [type, url, width, height] = medias[mediaKey];
       if (type === 'image') {
-        return `<img src="${url}" width="100%" height="auto" alt="Question Image" />`;
+        return `<img class="pod-image" src="${url}" width="100%" height="auto" alt="Question Image" />`;
       }
     }
     return '';
@@ -37,9 +37,5 @@ const processedText = computed(() => replaceMedia(props.text, props.medias));
 </script>
 
 <style scoped>
-img {
 
-  height: auto;
-  margin: 10px 0;
-}
 </style>
\ No newline at end of file
diff --git a/src/pages/demoPages/podExercise/Quiz.vue b/src/pages/demoPages/podExercise/Quiz.vue
index a8b6085..9e97354 100644
--- a/src/pages/demoPages/podExercise/Quiz.vue
+++ b/src/pages/demoPages/podExercise/Quiz.vue
@@ -43,11 +43,16 @@
         <div v-if="similarQuestions.length > 0" class="similar-questions">
           <h3>对比其他类似题目</h3>
           <div v-for="(similar, index) in similarQuestions" :key="index" class="similar-question">
-            <h4>题目 {{ index + 1 }}</h4>
+
+            <h4>-- 题目 {{ index + 1 }} --</h4>
             <QuestionText :text="similar.text" :medias="data.medias"/>
             <p>正确答案:
               <general-renderer :content-input="processMedia(similar.correctAnswer, data.medias)"></general-renderer>
             </p>
+            <div v-if="similar.explanation" class="explanation">
+              <h4>解题思路</h4>
+              <general-renderer :content-input="processMedia(similar.explanation, data.medias)"></general-renderer>
+            </div>
           </div>
         </div>
       </div>
@@ -84,7 +89,6 @@ const data = reactive({
   itemtypes: [],
   texts: [],
   explanations: [],
-  gradings: [],
   answerkeys: [],
   answers: [],
   medias: {}
@@ -115,9 +119,10 @@ const progressPercentage = computed(() => {
 });
 
 const initial = async () => {
-  const file = route.query.id || 'phy250226';
+  const categorise = route.query.cat || 'apphy1'
+  const file = route.query.id || 'phy250227';
   try {
-    const response = await axios.get(`https://mva-cyber.club/data/file/${file}.json`);
+    const response = await axios.get(`https://mva-cyber.club/data/demos/pod/${categorise}/${file}.json`);
     const jsonData = response.data;
     Object.assign(data, jsonData);
     generateNewExam(); // 初始生成一份试卷
@@ -170,7 +175,7 @@ function processMedia(text, medias) {
     if (medias[mediaKey]) {
       const [type, url, width, height] = medias[mediaKey];
       if (type === 'image') {
-        return `<img src="${url}" width="100%" height="auto" alt="Question Image" />`;
+        return `<img class="pod-image" src="${url}" width="100%" height="auto" alt="Question Image" />`;
       }
     }
     return '';
@@ -270,7 +275,8 @@ function findSimilarQuestions() {
       const correctIdx = data.answerkeys[i].findIndex((key, idx) => idx > 0 && key === 1) - 1;
       similar.push({
         text: data.texts[i],
-        correctAnswer: data.answers[i][correctIdx + 1]
+        correctAnswer: data.answers[i][correctIdx + 1],
+        explanation: data.explanations[i]
       });
     }
   }
@@ -334,7 +340,7 @@ function nextQuestion() {
   //max-width: 800px;
   margin: auto;
   height: calc(100vh - 109px);
-  overflow-y: auto;
+  overflow-y: scroll;
   padding: 20px;
   font-family: Arial, sans-serif;
 }