Quellcode durchsuchen

完成了寒假Bug修复清单的1,6,8,9项,准备进行响应式开发,需要更换设备进行测试

Jiang Pengyu vor 7 Monaten
Ursprung
Commit
5c8e91fb49

+ 1 - 1
.env.example

@@ -7,7 +7,7 @@
 # 建议不要删除,只注释。按需取用
 VITE_TITLE = '本地开发'
 # 本地后端服务器端口
-VITE_BASE_URL = 'http://localhost:8082'
+VITE_BASE_URL = 'http://localhost:8080'
 # 线上正式服务器地址
 # VITE_BASE_URL = 'https://air-nju.seec.seecoder.cn/'
 # 线上http服务器地址

+ 206 - 15
src/components/AIChatter/AIChatter.module.scss

@@ -27,18 +27,113 @@
     width: 100%;
     height: 80%;
     overflow-y: auto;
+    padding: 10px 0;
 
-    .item {
+    .message-group {
+      margin-bottom: 20px;
+    }
+
+    // 用户消息样式
+    .user-message {
+      display: flex;
+      justify-content: flex-end;
+      align-items: flex-start;
+      gap: 8px;
+
+      .message-info {
+        display: flex;
+        flex-direction: column;
+        align-items: flex-end;
+        max-width: 70%;
+      }
+
+      .user-name {
+        font-size: 12px;
+        color: #666;
+        margin-bottom: 4px;
+        font-weight: 500;
+      }
+
+      .message-bubble {
+        padding: 12px 16px;        
+        word-break: break-word;
+        line-height: 1.5;
+      }
+
+      .user-bubble {
+        background:linear-gradient(135deg, #4ca1f4, #5cb3f5, #6ec0f6);
+        color: white;
+        border-radius: 20px;
+      }
+
+      .message-avatar {
+        width: 36px;
+        height: 36px;
+        border-radius: 50%;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        font-weight: 600;
+        font-size: 14px;
+        flex-shrink: 0;
+      }
+
+      .user-avatar {
+        background: linear-gradient(135deg, #4ca1f4, #5cb3f5, #6ec0f6);
+        color: white;
+      }
+    }
+
+    // AI消息样式
+    .ai-message {
       display: flex;
+      justify-content: flex-start;
       align-items: flex-start;
-      margin-bottom: 15px;
+      gap: 12px;
+      margin-bottom: 16px;
+
+      .message-info {
+        display: flex;
+        flex-direction: column;
+        align-items: flex-start;
+        max-width: 70%;
+      }
+
+      .ai-name {
+        font-size: 12px;
+        color: #666;
+        margin-bottom: 4px;
+        font-weight: 500;
+      }
 
-      .content {
-        background-color: #f0f0f0;
-        padding: 8px 12px;
-        border-radius: 16px;
+      .message-bubble {
+        padding: 12px 16px;
+        border-radius: 12px;
         word-break: break-word;
-        box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
+        line-height: 1.5;
+      }
+
+      .ai-bubble {
+        background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
+        color: #333;
+        border-radius: 20px;
+      }
+
+      .message-avatar {
+        width: 36px;
+        height: 36px;
+        border-radius: 50%;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        font-weight: 600;
+        font-size: 14px;
+        flex-shrink: 0;
+      }
+
+      .ai-avatar {
+        background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
+        color: #333;
       }
     }
   }
@@ -80,23 +175,119 @@
   background-color: #ffffff;
   border-radius: 10px;
 
-
   .message-box {
     width: 100%;
     height: 34vh;
     overflow: auto;
+    padding: 10px 0;
 
-    .item {
+    .message-group {
+      margin-bottom: 20px;
+    }
+
+    // 用户消息样式(教师视图)
+    .user-message {
       display: flex;
+      justify-content: flex-end;
       align-items: flex-start;
-      margin-bottom: 15px;
+      gap: 12px;
+      margin-bottom: 16px;
+
+      .message-info {
+        display: flex;
+        flex-direction: column;
+        align-items: flex-end;
+        max-width: 70%;
+      }
 
-      .content {
-        background-color: #f0f0f0;
-        padding: 8px 12px;
-        border-radius: 16px;
+      .user-name {
+        font-size: 12px;
+        color: #666;
+        margin-bottom: 4px;
+        font-weight: 500;
+      }
+
+      .message-bubble {
+        padding: 12px 16px;
+        border-radius: 12px;
         word-break: break-word;
-        box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
+        line-height: 1.5;
+      }
+
+      .user-bubble {
+        background: #5cb3f5;
+        color: white;
+        border-bottom-right-radius: 4px;
+      }
+
+      .message-avatar {
+        width: 36px;
+        height: 36px;
+        border-radius: 50%;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        font-weight: 600;
+        font-size: 14px;
+        flex-shrink: 0;
+      }
+
+      .user-avatar {
+        background: #5cb3f5;
+        color: white;
+      }
+    }
+
+    // AI消息样式(教师视图)
+    .ai-message {
+      display: flex;
+      justify-content: flex-start;
+      align-items: flex-start;
+      gap: 12px;
+      margin-bottom: 16px;
+
+      .message-info {
+        display: flex;
+        flex-direction: column;
+        align-items: flex-start;
+        max-width: 70%;
+      }
+
+      .ai-name {
+        font-size: 12px;
+        color: #666;
+        margin-bottom: 4px;
+        font-weight: 500;
+      }
+
+      .message-bubble {
+        padding: 12px 16px;
+        border-radius: 12px;
+        word-break: break-word;
+        line-height: 1.5;
+      }
+
+      .ai-bubble {
+        background-color: #f0f2f5;
+        color: #333;
+        border-bottom-left-radius: 4px;
+      }
+
+      .message-avatar {
+        width: 36px;
+        height: 36px;
+        border-radius: 50%;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        font-weight: 600;
+        font-size: 14px;
+        flex-shrink: 0;
+      }
+
+      .ai-avatar {
+        background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
+        color: #333;
       }
     }
   }

+ 25 - 16
src/components/AIChatter/AIChatter.vue

@@ -24,28 +24,37 @@
       </div>
      </div>
 
-    <!-- 消息区域,采用ChatGPT的交互模式 -->
+    <!-- 消息区域 -->
     <div :class="$style['message-box']" ref="containerTopRef">
       <div
           v-for="(item, index) in messageList"
           :key="index"
-          :class="$style.item"
+          :class="$style['message-group']"
       >
-        <div>
-          <!--展示头像-->
-          <el-avatar
-              :size="32"
-              :shape="'circle'"
-              :src="index % 2 === 0 ? store.user.userAvatar : ''"
-          >
-            {{ index % 2 === 0 ? store.user.name.charAt(0) : data.model.charAt(0) }}
-          </el-avatar>
+        <!-- 用户消息 -->
+        <div v-if="item?.role === 'user'" :class="$style['user-message']">
+          <div :class="$style['message-info']">
+            <div :class="$style['user-name']">{{ props.isTeacher ? 'Student' : 'You' }}</div>
+            <div :class="[$style['message-bubble'], $style['user-bubble']]">
+              {{ item?.content }}
+            </div>
+          </div>
+          <div :class="[$style['message-avatar'], $style['user-avatar']]">
+            <span>{{ props.isTeacher ? 'S' : (store.user.name.charAt(0) || 'Y') }}</span>
+          </div>
         </div>
-        <div style="margin-left: 15px">
-          <!--名字-->
-          <div style="margin-bottom: 2px">{{ index % 2 === 0 ? 'You' : data.model }}</div>
-          <!--内容-->
-          <div :class="$style.content">{{ item?.content }}</div>
+        
+        <!-- AI消息 -->
+        <div v-if="item?.role === 'assistant'" :class="$style['ai-message']">
+          <div :class="[$style['message-avatar'], $style['ai-avatar']]">
+            <span>{{ data.model.charAt(0) }}</span>
+          </div>
+          <div :class="$style['message-info']">
+            <div :class="$style['ai-name']">{{ data.model }}</div>
+            <div :class="[$style['message-bubble'], $style['ai-bubble']]">
+              {{ item?.content }}
+            </div>
+          </div>
         </div>
       </div>
       <div ref="messagesEndRef" />

+ 15 - 15
src/router/index.ts

@@ -16,24 +16,24 @@ const router = createRouter({
     },
 
     // 登录与注册
-    {
-      path: "/",
-      redirect: () => {
-        window.location.href = "https://p-nju.seec.seecoder.cn/login?from=https://air-nju.seec.seecoder.cn";
-        // window.location.href = "http://localhost:8000/login?from=http://localhost:4000";
-        // {本地门户首页地址}?from={本地eai首页地址}
-        return "/"; // 占位返回值,实际不会执行
-    },
-    },
     // {
     //   path: "/",
-    //   redirect: "/login"
+    //   redirect: () => {
+    //     window.location.href = "https://p-nju.seec.seecoder.cn/login?from=https://air-nju.seec.seecoder.cn";
+    //     // window.location.href = "http://localhost:8000/login?from=http://localhost:4000";
+    //     // {本地门户首页地址}?from={本地eai首页地址}
+    //     return "/"; // 占位返回值,实际不会执行
     // },
-    // {
-    //   path: '/login',
-    //   name: 'login',
-    //   component: () => import('../views/LoginPage/LoginPage.vue')
     // },
+    {
+      path: "/",
+      redirect: "/login"
+    },
+    {
+      path: '/login',
+      name: 'login',
+      component: () => import('../views/LoginPage/LoginPage.vue')
+    },
     {
       path: '/register',
       name: 'register',
@@ -260,7 +260,7 @@ const router = createRouter({
  */
   router.beforeEach(async (to) => {
     const store = useStore();
-    const publicPaths = [ '/register', '/passwordChange', '/admin/login',];
+    const publicPaths = [ '/register', '/passwordChange', '/admin/login','/login'];
     // 1. 检查URL中的token
     const urlToken = new URLSearchParams(window.location.search).get('token');
     if (urlToken) {

+ 73 - 7
src/views/BehaviorPage/BehaviorBoard.vue

@@ -4,8 +4,11 @@ import {Back} from "@element-plus/icons-vue";
 import {computed, onMounted, provide, type Ref, ref, watch} from "vue";
 import {ElLoading, ElMessage} from "element-plus";
 import useApis from "@/apis";
+import {useRoute} from "vue-router";
 
 const apis = useApis()
+const route = useRoute()
+
 //pageHeader
 interface CourseVO{
   courseName: string;
@@ -55,6 +58,11 @@ function getCourseList(){
     target: pageHTML,
     background: '#F5F5F59E'
   })
+  
+  // 从路由参数中获取课程ID和作业ID
+  const courseIdFromRoute = route.query.courseId ? Number(route.query.courseId) : null
+  const assignmentIdFromRoute = route.query.assignmentId ? Number(route.query.assignmentId) : null
+  
   apis.getCourseByTeacherId(0,100)
       .then((res: any)=>{
         if (res&&res.data.code===200){
@@ -64,14 +72,28 @@ function getCourseList(){
             return {courseName: item.courseName, courseId: item.courseId}
           })
           if (courseList.value&&courseList.value.length>0){
-            selectedCourse.value = courseList.value[0];
+            // 如果路由中有课程ID参数,尝试选中该课程
+            if (courseIdFromRoute) {
+              const targetCourse = courseList.value.find(c => c.courseId === courseIdFromRoute)
+              if (targetCourse) {
+                selectedCourse.value = targetCourse
+                console.log("从路由参数选中课程:", targetCourse.courseName)
+              } else {
+                selectedCourse.value = courseList.value[0]
+              }
+            } else {
+              selectedCourse.value = courseList.value[0]
+            }
           }
           else {
             selectedCourse.value = {courseName: "", courseId: -1}
             loading.close();
             return;
           }
-          apis.getAssignmentByCourseId(courseData[0].courseId,0,1000)
+          
+          // 获取选中课程的作业列表
+          const targetCourseId = selectedCourse.value.courseId
+          apis.getAssignmentByCourseId(targetCourseId,0,1000)
             .then((res: any)=>{
               if (res&&res.data.code===200){
                 loading.close();
@@ -86,7 +108,18 @@ function getCourseList(){
                 console.log(assignmentList.value);
                 // assignmentData = temp as any[];
                 if (assignmentList.value&&assignmentList.value.length>0){
-                  selectedAssignment.value = assignmentList.value[0];
+                  // 如果路由中有作业ID参数,尝试选中该作业
+                  if (assignmentIdFromRoute) {
+                    const targetAssignment = assignmentList.value.find(a => a.assignmentId === assignmentIdFromRoute)
+                    if (targetAssignment) {
+                      selectedAssignment.value = targetAssignment
+                      console.log("从路由参数选中作业:", targetAssignment.assignmentName)
+                    } else {
+                      selectedAssignment.value = assignmentList.value[0]
+                    }
+                  } else {
+                    selectedAssignment.value = assignmentList.value[0]
+                  }
                 }
                 else{
                   selectedAssignment.value = {assignmentName: "", assignmentId: -1}
@@ -119,6 +152,10 @@ function getAssignmentList(courseId:number){
     target: pageHTML,
     background: '#F5F5F59E'
   })
+  
+  // 从路由参数中获取作业ID(仅在用户手动切换课程时不使用)
+  const assignmentIdFromRoute = route.query.assignmentId ? Number(route.query.assignmentId) : null
+  
   apis.getAssignmentByCourseId(courseId,0,1000)
       .then((res: any)=>{
         if (res&&res.data.code===200){
@@ -130,7 +167,18 @@ function getAssignmentList(courseId:number){
           })
           // assignmentData = temp as any[];
           if (assignmentList.value&&assignmentList.value.length>0){
-            selectedAssignment.value = assignmentList.value[0];
+            // 如果路由中有作业ID参数且该作业在列表中,选中该作业
+            if (assignmentIdFromRoute) {
+              const targetAssignment = assignmentList.value.find(a => a.assignmentId === assignmentIdFromRoute)
+              if (targetAssignment) {
+                selectedAssignment.value = targetAssignment
+                console.log("选中路由参数中的作业:", targetAssignment.assignmentName)
+              } else {
+                selectedAssignment.value = assignmentList.value[0]
+              }
+            } else {
+              selectedAssignment.value = assignmentList.value[0]
+            }
           }
           else{
             selectedAssignment.value = {assignmentName: "", assignmentId: -1}
@@ -205,16 +253,34 @@ function AssignmentChanged(value:AssignmentVO){
     currentEngagementIndex.value = -1;
     return;
   }
+  
+  // 从路由参数中获取学生ID
+  const studentIdFromRoute = route.query.studentId ? Number(route.query.studentId) : null
+  
   apis.getEngagementByAssignmentId(value.assignmentId,0,10000)
       .then((res:any) => {
         console.log(res);
         if (res.data.code === 200){
           engagements.value = res.data.data.records;
           if (engagements.value&&engagements.value.length>0){
-            if (currentEngagementIndex.value == 0){
-              currentEngagement.value =  engagements.value[0];
+            // 如果路由中有学生ID参数,尝试定位到该学生
+            if (studentIdFromRoute) {
+              const targetIndex = engagements.value.findIndex((engagement:any) => 
+                engagement.studentId === studentIdFromRoute
+              )
+              if (targetIndex !== -1) {
+                currentEngagementIndex.value = targetIndex
+                console.log("从路由参数定位到学生,索引:", targetIndex)
+              } else {
+                currentEngagementIndex.value = 0
+                console.log("未找到指定学生,默认选择第一个")
+              }
+            } else {
+              if (currentEngagementIndex.value == 0){
+                currentEngagement.value =  engagements.value[0];
+              }
+              currentEngagementIndex.value = 0;
             }
-            currentEngagementIndex.value = 0;
           }
           else{
             currentEngagementIndex.value = -1;

+ 34 - 15
src/views/CorrectPage/CorrectPage.vue

@@ -394,11 +394,20 @@ const updateFormattedMessages = () => {
 // 获取学生信息
 async function fetchStudentInfo() {
   try {
-    const response = await apis.findUserById(studentId)
-    if (response.data.code === 200) {
-      const userData = response.data.data.records[0]
+    // 获取学生基本信息(姓名)
+    const userResponse = await apis.findUserById(studentId)
+    if (userResponse.data.code === 200) {
+      const userData = userResponse.data.data.records[0]
       studentInfo.name = userData.name
-      studentInfo.className = userData.className || ''
+    }
+    
+    // 获取学生班级信息(需要先获取课程ID)
+    if (courseId.value) {
+      const classResponse = await apis.getClassNameOfStudent(courseId.value, studentId)
+      if (classResponse.data.code === 200) {
+        const classData = classResponse.data.data
+        studentInfo.className = classData.className || ''
+      }
     }
   } catch (error) {
     console.error('获取学生信息失败:', error)
@@ -463,26 +472,33 @@ async function fetchData() {
       router.go(-1);
     })
   
-  // 获取学生信息
-  await fetchStudentInfo()
-  
   // 获取现有的评分和评语
   await fetchCorrectionData()
   
-  // 获取作业详情(获取课程ID)
+  // 获取作业详情(获取课程ID)- 必须先获取,因为获取班级信息需要用到
   await fetchAssignmentDetails()
   
+  // 获取学生信息(包括班级信息)
+  await fetchStudentInfo()
+  
   // 获取批改进度统计
   await fetchCorrectionStats()
 }
 
-// 弹窗相关函数
+// 跳转到行为数据页面
 const handleBehaviorRecord = () => {
-  showDialog.value = true
-  // 如果数据为空,重新获取
-  if (fileList.length === 0) {
-    getBehaviorRecords()
-  }
+  // 跳转到行为数据分析页面,并携带课程ID、作业ID和学生ID参数
+  router.push({
+    path: '/home/behavior/main',
+    query: {
+      courseId: courseId.value.toString(),
+      assignmentId: assignmentId.toString(),
+      studentId: studentId.toString()
+    }
+  }).then(() => {
+      // 强制刷新页面以重新加载数据
+      window.location.reload();
+    });
 }
 
 // 获取行为记录数据
@@ -693,7 +709,10 @@ const goBackStudent = () => {
       courseId: courseId.value.toString(),
       fromAssignment: 'true' // 标记是从作业页面返回
     }
-  });
+  }).then(() => {
+      // 强制刷新页面以重新加载数据
+      window.location.reload();
+    });
 };
 
 onMounted(() => {

+ 83 - 42
src/views/CorrectPage/CoursePage.vue

@@ -67,9 +67,9 @@
       
       <!-- 当选中作业时显示内容 -->
       <div v-else class="assignment-content">
-        <!-- 右上角数据看板按钮 -->
-        <div class="top-actions">
-          <el-button type="primary" class="dashboard-button">数据看板</el-button>
+        <!-- 右上角数据看板按钮 - 仅写作类型作业显示 -->
+        <div class="top-actions" v-if="isWritingAssignment">
+          <el-button type="primary" class="dashboard-button" @click="goToBehaviorDashboard">数据看板</el-button>
         </div>
         
         <!-- 统计卡片区域 -->
@@ -695,6 +695,27 @@
     return ''
   }
   
+  // 判断当前选中的作业是否为写作类型
+  const isWritingAssignment = computed(() => {
+    if (!selectedAssignment.value) return false
+    const type = selectedAssignment.value.type
+    return type === 'WRITING' || type === '写作'
+  })
+  
+  // 跳转到行为数据分析页面
+  const goToBehaviorDashboard = () => {
+    if (selectedAssignment.value) {
+      router.push({
+        path: '/home/behavior/main',
+        query: {
+          courseId: selectedAssignment.value.courseId,
+          assignmentId: selectedAssignment.value.assignmentId,
+          assignmentName: selectedAssignment.value.assignmentName
+        }
+      })
+    }
+  }
+  
   // 处理批改操作
   const handleCorrect = (row: StudentAssignmentStatusDTO) => {
     console.log('批改学生作业:', row)
@@ -961,9 +982,10 @@ export default {
 }
 
 .left-sidebar {
-  width: 280px;
-  background-color: #F0F2F5;
-  border-right: 1px solid #e8e8e8;
+  width: 250px;
+  min-width: 250px;
+  max-width: 250px;
+  background: linear-gradient(180deg, #89CDF1 0%, #1890FF 100%);
   display: flex;
   flex-direction: column;
   height: 100vh;
@@ -972,8 +994,8 @@ export default {
 
 .platform-header {
   height: 60px;
-  background-color: #F0F2F5;
-  border-bottom: 1px solid #e8e8e8;
+  background-color: transparent;
+  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
   display: flex;
   align-items: center;
   justify-content: center;
@@ -981,16 +1003,16 @@ export default {
 }
 
 .platform-name {
-  color: #606266;
-  font-size: 24px;
-  font-weight: 400;
+  color: white;
+  font-size: 20px;
+  font-weight: 600;
   font-family: "Noto Sans SC", sans-serif;
 }
 
 .search-section {
   padding: 16px 20px;
-  border-bottom: 1px solid #e8e8e8;
-  background-color: #F0F2F5;
+  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+  background-color: transparent;
 }
 
 .search-input-container {
@@ -998,12 +1020,13 @@ export default {
   display: flex;
   align-items: center;
   font-family: "Noto Sans SC", sans-serif;
+  cursor: pointer;
 }
 
 .search-icon {
   position: absolute;
   left: 12px;
-  color: #999;
+  color: rgba(255, 255, 255, 0.7);
   font-size: 16px;
 }
 
@@ -1011,24 +1034,30 @@ export default {
   width: 100%;
   height: 36px;
   padding: 0 12px 0 36px;
-  border: 1px solid #d9d9d9;
+  border: 1px solid rgba(255, 255, 255, 0.3);
   border-radius: 6px;
   font-size: 14px;
   outline: none;
-  background-color: #FFFFFF;
+  background-color: rgba(255, 255, 255, 0.15);
+  color: white;
   font-family: "Noto Sans SC", sans-serif;
+  cursor: pointer;
+}
+
+.search-input::placeholder {
+  color: rgba(255, 255, 255, 0.7);
 }
 
 .search-input:focus {
-  border-color: #1890ff;
-  background-color: white;
+  border-color: rgba(255, 255, 255, 0.5);
+  background-color: rgba(255, 255, 255, 0.2);
 }
 
 .menu-section {
   flex: 1;
   overflow-y: auto;
   overflow-x: hidden;  /* 防止水平滚动 */
-  padding: 0;
+  padding: 0 0;
   height: calc(100vh - 120px);
   width: 100%;  /* 确保宽度不超过父容器 */
 }
@@ -1040,21 +1069,25 @@ export default {
 .course-header {
   display: flex;
   align-items: center;
-  padding: 12px 20px;
+  padding: 15px 25px;
   cursor: pointer;
-  transition: background-color 0.2s;
+  transition: all 0.3s ease;
   font-family: "Noto Sans SC", sans-serif;
-  background-color: #F0F2F5;
-  color: #606266;
+  background-color: transparent;
+  color: white;
+  border-left: 4px solid transparent;
+  font-size: 14px;
+  font-weight: 500;
 }
 
 .course-header:hover {
-  background-color: #FFFFFF;
+  background-color: rgba(255, 255, 255, 0.1);
+  border-left-color: white;
 }
 
 .expand-icon {
   font-size: 12px;
-  color: #666;
+  color: white;
   margin-right: 8px;
   transition: transform 0.2s;
 }
@@ -1065,59 +1098,67 @@ export default {
 
 .course-icon {
   font-size: 16px;
-  color: #666;
+  color: white;
   margin-right: 8px;
 }
 
 .course-name {
   font-size: 14px;
-  color: #606266;
+  color: white;
   font-weight: 500;
   font-family: "Noto Sans SC", sans-serif;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
 }
 
 .assignment-list {
-  background-color: #fafafa;
+  background-color: transparent;
 }
 
 .assignment-item {
   display: flex;
   align-items: center;
-  padding: 8px 20px 8px 48px;
+  padding: 12px 25px 12px 48px;
   cursor: pointer;
-  transition: background-color 0.2s;
+  transition: all 0.3s ease;
   font-family: "Noto Sans SC", sans-serif;
-  background-color: #F0F2F5;
-  color: #606266;
+  background-color: transparent;
+  color: rgba(255, 255, 255, 0.85);
   white-space: nowrap;  /* 防止文本换行 */
   overflow: hidden;     /* 隐藏超出部分 */
   text-overflow: ellipsis;  /* 显示省略号 */
+  border-left: 4px solid transparent;
+  font-size: 13px;
 }
 
 .assignment-item:hover {
-  background-color: #FFFFFF;
+  background-color: rgba(255, 255, 255, 0.1);
+  border-left-color: white;
+  color: white;
 }
 
 .assignment-item.active {
-  background-color: rgba(112, 187, 219, 0.50);
-  border-radius: 10px;
-  opacity: 0.8;
+  background-color: rgba(255, 255, 255, 0.2);
+  border-left-color: white;
+  color: white;
+  font-weight: 600;
 }
 
 .assignment-icon {
   font-size: 14px;
-  color: #606266;
+  color: rgba(255, 255, 255, 0.85);
   margin-right: 8px;
 }
 
 .assignment-icon.active-icon {
-  color: #435FE9;
+  color: white;
 }
 
 .assignment-name {
   font-size: 13px;
   font-weight: 500;
-  color: #606266;
+  color: inherit;
   font-family: "Noto Sans SC", sans-serif;
   flex: 1;
   overflow: hidden;
@@ -1126,8 +1167,8 @@ export default {
 }
 
 .assignment-item.active .assignment-name {
-  color: #435FE9;
-  font-weight: 500;
+  color: white;
+  font-weight: 600;
 }
 
 /* 加载状态样式 */
@@ -1139,7 +1180,7 @@ export default {
 }
 
 .loading-text {
-  color: #606266;
+  color: white;
   font-size: 14px;
   font-family: "Noto Sans SC", sans-serif;
 }

+ 8 - 8
src/views/CorrectPage/index.scss

@@ -569,9 +569,9 @@
           }
 
           .user-bubble {
-            background: #5cb3f5;
+            background: linear-gradient(135deg, #4ca1f4, #5cb3f5, #6ec0f6);;
             color: white;
-            border-bottom-right-radius: 6px;
+            border-radius: 20px;
           }
         }
 
@@ -579,7 +579,7 @@
           width: 32px;
           height: 32px;
           border-radius: 16px;
-          background: #5cb3f5;
+          background: linear-gradient(135deg, #4ca1f4, #5cb3f5, #6ec0f6);;
           display: flex;
           align-items: center;
           justify-content: center;
@@ -600,7 +600,7 @@
           width: 32px;
           height: 32px;
           border-radius: 16px;
-          background: #6c757d;
+          background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
           display: flex;
           align-items: center;
           justify-content: center;
@@ -632,9 +632,9 @@
           }
 
           .ai-bubble {
-            background: #e9ecef;
+            background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
             color: #2c3e50;
-            border-bottom-left-radius: 6px;
+            border-radius: 20px;
                 }
     }
   }
@@ -899,7 +899,7 @@
     border: 1px solid #e9ecef;
     display: flex;
     flex-direction: column;
-    overflow: hidden;
+    overflow: auto;
 
     .assignment-section {
       flex: 1;
@@ -938,7 +938,7 @@
     border: 1px solid #e9ecef;
     display: flex;
     flex-direction: column;
-    overflow: hidden;
+    overflow: auto;
 
     .student-header {
       padding: 16px 20px;

+ 9 - 0
src/views/Home/component/Dictionaries/index.scss

@@ -14,6 +14,15 @@
     flex: 1;
     padding: 15px;
     box-sizing: border-box;
+  }
 
+  .dic-result {
+    white-space: pre-wrap;
+    overflow-y: auto;
+    flex: 1;
+    margin-top: 10px;
+    padding: 5px;
+    word-wrap: break-word;
+    word-break: break-word;
   }
 }

+ 1 - 1
src/views/Home/component/Dictionaries/index.vue

@@ -23,7 +23,7 @@
           </el-button>
         </template>
       </el-input>
-      <div style="white-space: pre-wrap;">{{ res }}</div>
+      <div :class="$style['dic-result']">{{ res }}</div>
     </div>
   </div>
 </template>