소스 검색

题目知识节点

jinxia.mo 1 개월 전
부모
커밋
fb4a136cbe
2개의 변경된 파일25개의 추가작업 그리고 90개의 파일을 삭제
  1. 25 33
      back-ui/src/views/learn/questions/index.vue
  2. 0 57
      optimize_statistic_study_record_answer_indexes.sql

+ 25 - 33
back-ui/src/views/learn/questions/index.vue

@@ -421,7 +421,7 @@
                     </el-select>
                 </el-form-item> -->
 
-                
+
                 <el-row :gutter="20">
 
                     <el-col :span="12">
@@ -683,7 +683,7 @@ const filteredKnowledgeTreeList = computed(() => {
     return filterKnowledgeTreeBySubjectId(knowledgeTreeList.value, queryParams.value.subjectId)
 })
 
-/** 按科目分组的知识点树(用于知识点关系编辑弹窗) */
+/** 按科目分组的知识点树(用于知识点关系编辑弹窗),保持完整的树级结构,类似filteredKnowledgeTreeList */
 const groupedKnowledgeTreeList = computed(() => {
     if (!knowledgeTreeList.value || knowledgeTreeList.value.length === 0) {
         return []
@@ -692,12 +692,27 @@ const groupedKnowledgeTreeList = computed(() => {
     // 创建一个Map来存储按科目分组的知识点
     const subjectMap = new Map()
     
-    // 递归处理知识点树,按科目分组
-    const processNode = (node) => {
-        const subjectId = node.subjectId
+    // 递归复制节点,保持完整的树级结构
+    const cloneNode = (node) => {
+        const cloned = {
+            ...node,
+            children: node.children && node.children.length > 0 
+                ? node.children.map(child => cloneNode(child))
+                : undefined
+        }
+        return cloned
+    }
+    
+    // 处理所有根节点,按科目分组
+    knowledgeTreeList.value.forEach(rootNode => {
+        // 只处理根节点(pid为null或0的节点)
+        if (rootNode.pid && rootNode.pid !== 0) {
+            return
+        }
+        
+        const subjectId = rootNode.subjectId
         if (!subjectId) {
-            // 如果没有subjectId,跳过
-            return null
+            return
         }
         
         // 获取科目名称
@@ -715,32 +730,9 @@ const groupedKnowledgeTreeList = computed(() => {
             })
         }
         
-        // 将当前节点添加到对应科目的children中
+        // 将根节点(包含完整的树级结构)添加到对应科目的children中
         const subjectNode = subjectMap.get(subjectKey)
-        
-        // 创建节点副本,保留原有结构
-        const nodeCopy = {
-            ...node,
-            children: []
-        }
-        
-        // 如果有子节点,递归处理
-        if (node.children && node.children.length > 0) {
-            node.children.forEach(child => {
-                const processedChild = processNode(child)
-                if (processedChild) {
-                    nodeCopy.children.push(processedChild)
-                }
-            })
-        }
-        
-        subjectNode.children.push(nodeCopy)
-        return nodeCopy
-    }
-    
-    // 处理所有根节点
-    knowledgeTreeList.value.forEach(rootNode => {
-        processNode(rootNode)
+        subjectNode.children.push(cloneNode(rootNode))
     })
     
     // 转换为数组并排序
@@ -1214,7 +1206,7 @@ function handleUpdateKnowledgeQuestion(row) {
             }
             knowledgeQuestionTitle.value = "修改知识点关系"
             showKnowledgeQuestionDialog.value = true
-        } else {
+                } else {
             ElMessage.warning("未找到对应的知识点关系")
         }
     }).catch(() => {

+ 0 - 57
optimize_statistic_study_record_answer_indexes.sql

@@ -1,57 +0,0 @@
--- ============================================
--- 优化 statisticStudyRecordAnswer 查询的索引
--- 根据慢SQL日志分析,该查询耗时约9.87秒,需要优化
--- ============================================
-
--- 1. learn_answer 表索引优化(最关键)
--- 支持按state和时间范围过滤,以及JOIN examinee_id
-CREATE INDEX IF NOT EXISTS idx_learn_answer_state_examinee_time ON learn_answer(state, examinee_id, create_time);
-CREATE INDEX IF NOT EXISTS idx_learn_answer_state_student_time ON learn_answer(state, student_id, create_time);
-CREATE INDEX IF NOT EXISTS idx_learn_answer_examinee_state ON learn_answer(examinee_id, state);
-
--- 2. learn_examinee 表索引优化
--- 支持按state和时间范围过滤,以及JOIN examinee_id
-CREATE INDEX IF NOT EXISTS idx_learn_examinee_state_examinee_time ON learn_examinee(state, examinee_id, end_time);
-CREATE INDEX IF NOT EXISTS idx_learn_examinee_state_student_time ON learn_examinee(state, student_id, end_time);
-CREATE INDEX IF NOT EXISTS idx_learn_examinee_examinee_state ON learn_examinee(examinee_id, state);
-CREATE INDEX IF NOT EXISTS idx_learn_examinee_paper_type_state_id ON learn_examinee(paper_type, state, paper_id);
-
--- 3. sys_user 表索引优化(如果还没有)
--- 支持JOIN操作
-CREATE INDEX IF NOT EXISTS idx_sys_user_user_id ON sys_user(user_id);
-CREATE INDEX IF NOT EXISTS idx_sys_user_card_id ON sys_user(card_id);
-
--- 4. dz_cards 表索引优化
--- 支持WHERE条件过滤和JOIN
-CREATE INDEX IF NOT EXISTS idx_dz_cards_card_id ON dz_cards(card_id);
-CREATE INDEX IF NOT EXISTS idx_dz_cards_dept_id ON dz_cards(dept_id);
-CREATE INDEX IF NOT EXISTS idx_dz_cards_school_id ON dz_cards(school_id);
-CREATE INDEX IF NOT EXISTS idx_dz_cards_class_id ON dz_cards(class_id);
-CREATE INDEX IF NOT EXISTS idx_dz_cards_campus_id ON dz_cards(campus_id);
-CREATE INDEX IF NOT EXISTS idx_dz_cards_campus_class_id ON dz_cards(campus_class_id);
-CREATE INDEX IF NOT EXISTS idx_dz_cards_agent_id ON dz_cards(agent_id);
-CREATE INDEX IF NOT EXISTS idx_dz_cards_leaf_agent_id ON dz_cards(leaf_agent_id);
-CREATE INDEX IF NOT EXISTS idx_dz_cards_card_no ON dz_cards(card_no);
-
--- 5. dz_teacher_class 表索引优化(用于teacherId过滤)
-CREATE INDEX IF NOT EXISTS idx_dz_teacher_class_teacher_id ON dz_teacher_class(teacher_id);
-CREATE INDEX IF NOT EXISTS idx_dz_teacher_class_teacher_class ON dz_teacher_class(teacher_id, class_id, out_date);
-
--- ============================================
--- 索引使用说明
--- ============================================
--- 1. 复合索引的顺序很重要:
---    - 过滤条件字段在前(state)
---    - JOIN字段在中间(examinee_id, student_id)
---    - 时间字段在后(create_time, end_time)
---
--- 2. 如果表数据量很大,建议定期分析表并更新统计信息:
---    ANALYZE TABLE learn_answer;
---    ANALYZE TABLE learn_examinee;
---    ANALYZE TABLE sys_user;
---    ANALYZE TABLE dz_cards;
---
--- 3. 如果某些索引使用率很低,可以考虑删除以节省存储空间
---
--- 4. 建议在业务低峰期执行索引创建,避免影响正常业务
-