瀏覽代碼

Merge remote-tracking branch 'origin/beta'

SanHQin 3 月之前
父節點
當前提交
bea2916587

+ 1 - 1
dist/index.html

@@ -27,7 +27,7 @@
     html,
     body{
       font-family: '黑体';
-    }</style><link href=./static/css/app.96bc1c02534051bd931b31e3ebc57d15.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.43cd677d9291e0373eea.js></script><script type=text/javascript src=./static/js/app.5763cb10a111b19460c3.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.443339f74644d630e207050b782a43eb.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.43cd677d9291e0373eea.js></script><script type=text/javascript src=./static/js/app.430d776527dab9123e87.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

文件差異過大導致無法顯示
+ 0 - 0
dist/static/css/app.443339f74644d630e207050b782a43eb.css


文件差異過大導致無法顯示
+ 0 - 0
dist/static/css/app.443339f74644d630e207050b782a43eb.css.map


文件差異過大導致無法顯示
+ 0 - 0
dist/static/css/app.96bc1c02534051bd931b31e3ebc57d15.css.map


文件差異過大導致無法顯示
+ 0 - 0
dist/static/js/app.430d776527dab9123e87.js


文件差異過大導致無法顯示
+ 0 - 0
dist/static/js/app.430d776527dab9123e87.js.map


文件差異過大導致無法顯示
+ 0 - 0
dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map


+ 6 - 0
src/assets/css/markdownCss.css

@@ -302,4 +302,10 @@
 
 .vditor-reset blockquote:last-child,.vditor-reset hr:last-child,.vditor-reset ol:last-child,.vditor-reset p:last-child,.vditor-reset pre:last-child,.vditor-reset ul:last-child {
     margin-bottom: 0
+}
+
+.tooltipMaxWidth{
+	max-width: 30%;
+  overflow: auto;
+  max-height: 60vh;
 }

+ 3 - 0
src/assets/icon/svgImg/nrk_fullscreen.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8 3.2H11.9516L8.7758 6.3758L9.6242 7.2242L12.8 4.0484V8H14V2H8V3.2ZM3.2 11.9516L6.3758 8.7758L7.2242 9.6242L4.0484 12.8H8V14H2V8H3.2V11.9516Z" fill="black"/>
+</svg>

+ 4 - 2
src/components/EnglishVoice2/index.vue

@@ -163,11 +163,13 @@ export default {
                     this.close2();
                 })
                 .catch((err) => {
+                   
+                    this.$message.error("提交失败");
+                    console.error(err);
+                    
                     this.addOp3('1', "", { courseid: this.id,tool:'英语口语',
                     data: JSON.stringify(this.work),
                     type: "course_tool_sub" }, err)
-                    this.$message.error("提交失败");
-                    console.error(err);
                 });
         },
     },

+ 12 - 0
src/components/EnglishVoice3/index.vue

@@ -17,8 +17,11 @@
 <script>
 import right from './component/right.vue'
 import left from './component/left.vue'
+import { myMixin } from "@/mixins/mixin.js"
 
 export default {
+    mixins: [ myMixin ],
+
     components: {
         right,
         left
@@ -138,6 +141,11 @@ export default {
                         message: "提交成功",
                         type: "success",
                     });
+
+                    this.addOp3('1', "", { courseid: this.id,tool:'英语口语',
+                    data: JSON.stringify(this.work),
+                    type: "course_tool_sub" }, 'success')
+
                     // this.$emit('selectSWorks')
                     // this.$emit('selectStudent')
                     // this.close2();
@@ -145,6 +153,10 @@ export default {
                 .catch((err) => {
                     this.$message.error("提交失败");
                     console.error(err);
+                    
+                    this.addOp3('1', "", { courseid: this.id,tool:'英语口语',
+                    data: JSON.stringify(this.work),
+                    type: "course_tool_sub" }, err)
                 });
         },
     },

+ 11 - 11
src/components/components/choseWorksDetailDialog.vue

@@ -15,7 +15,7 @@
             <div class="s_b_m_t_left">
               <div class="s_b_m_t_leftSp" :style="{'margin-right': item.showType.includes(toolType) ? '40px' : 0}" v-for="item in dialogTypeList" :key="item.value">
                 <span
-                  v-if="item.showType.includes(toolType)"
+                  v-if="item.showType.includes(toolType) && !item.noShow.includes(tType)"
                   :class="{ s_b_m_t_l_active: showType === item.value }"
                   @click="changeShowType(item.value)"
                   >{{ (toolType == 15 && item.value ==1)? "词云" : item.label }}</span
@@ -1057,7 +1057,7 @@
                       <el-table-column prop="label" label="选项">
 												<template slot-scope="scope">
                           <span>{{ optionTypeList[scope.$index] }}.</span>
-													<img  @click.stop="$hevueImgPreview(scope.row.label.src)" class="tableImage" 
+													<img  @click.stop="$hevueImgPreview(scope.row.label.src)" class="tableImage"
                           v-if="scope.row.label.imgType && scope.row.label.imgType === 1" :src="scope.row.label.src"/>
 													<span v-else>{{ scope.row.label }}</span>
 												</template>
@@ -1171,7 +1171,7 @@
                         <div>
                           <span v-if="toolType == 45">{{ accuracy(item) }}</span>
                         </div>
-                        <img @click.stop="deleteWorks(item.wid)" src="../../assets/deleteworks.png" alt="" />
+                        <img v-if="item.userid == userId || ['1','4'].includes(tType)" @click.stop="deleteWorks(item.wid)" src="../../assets/deleteworks.png" alt="" />
                       </div>
 
 											<div class="s_b_b_i_ws_b_i_s_i_t_t_answer">
@@ -1184,7 +1184,7 @@
 													<span v-if="answer.type===1" v-for="(item2,indP) in answer.label" :key="indP +'indP'">
 														<span :class="`${item2.right?'answerRight':'answerWrong'}`">{{ item2.label }}</span>
 													</span>
-													<span v-if="answer.type===2" class="answer2" :class="`${answer.isRight?'answerRightLine':'answerWrongLine'}`" 
+													<span v-if="answer.type===2" class="answer2" :class="`${answer.isRight?'answerRightLine':'answerWrongLine'}`"
                           v-for="(item3,indUi) in answer.label" :key="indUi + 'indUi2'">
 														<span :class="`${item3.right?'answerRight':'answerWrong'}`">{{ item3.label }}</span>
 													</span>
@@ -1251,13 +1251,13 @@
                     </div>
                   </div>
                   </div>
-                  
+
                   <span v-if="worksStudent.length === 0">暂无提交学生...</span>
                 </div>
               </div>
             </div>
 
-            <div class="s_b_m_b_item" v-show="showType === 3 && dialogTypeList[2].showType.includes(toolType) && worksStudent.length>0">
+            <div class="s_b_m_b_item" v-if="tType!=2" v-show="showType === 3 && dialogTypeList[2].showType.includes(toolType) && worksStudent.length>0">
               <smarter v-if="show" :worksStudent="worksStudent" :toolType="toolType" :toolList="toolList" :testData="testData"/>
             </div>
           </div>
@@ -1465,10 +1465,10 @@ export default {
         worksPreview: false
       },
       dialogTypeList: [
-        { label: "作业详细", value: 0,showType:[1,7,15,40,41,45,47,48,49,52,3,4,57,18,21,71,69,70,23,24,32,63,28,31,39,66,72], loading: false },
-        { label: "题目统计", value: 1,showType:[45,15], loading: false },
-        { label: "学生统计", value: 2,showType:[1,7,15,40,41,45,47,48,52,3,4,57,72], loading: false },
-        { label: "智能分析",value:3,showType:[1,7,15,40,41,45,47,48,52,3,4,57,72],loading: false}
+        { label: "作业详细", value: 0,showType:[1,7,15,40,41,45,47,48,49,52,3,4,57,18,21,71,69,70,23,24,32,63,28,31,39,66,72], loading: false,noShow:[] },
+        { label: "题目统计", value: 1,showType:[45,15], loading: false,noShow:['2']},
+        { label: "学生统计", value: 2,showType:[1,7,15,40,41,45,47,48,52,3,4,57,72], loading: false,noShow:[] },
+        { label: "智能分析",value:3,showType:[1,7,15,40,41,45,47,48,52,3,4,57,72],loading: false,noShow:['2']}
       ],
 			toolList:[
 				{label:"选择题",value:45,img:require("../../assets/icon/thirdToolList/choose.png")},
@@ -2266,7 +2266,7 @@ export default {
     },
     // 截图类提交作业
     async captureScreenshot(){
-      
+
       // this.$refs.iframeWhiteBoardRef.contentWindow;
       document.getElementById('loadLi_JieE').children[0].style.display = "block"
 

+ 100 - 33
src/components/components/cocoFlowDia.vue

@@ -9,25 +9,32 @@
             :before-close="handleClose">
             <div slot="title">
                 <div class="markScore_diyTit">
-                <div>查看作业</div>
-                <img  @click="markFullScreenBtn" style="cursor: pointer;height: 20px;" src="../../assets/icon/newIcons/FullS.svg" alt="" />
+                    <div>查看作业</div>
+                    <img  @click="markFullScreenBtn" style="cursor: pointer;height: 16px;" src="../../assets/icon/svgImg/nrk_fullscreen.svg" alt="" />
                 </div>
             </div>
            
-            <div  style="margin-bottom: 20px;" v-for="(item,index) in listData" :key="index">
-                <div style="margin-bottom: 15px;font-size: 20px;font-weight: 600;color: #000;">第{{ index + 1}}阶段</div>
-                <div v-for="(po, index2) in item.messages" :key="index+'-'+index2">
-                    <div class="left" v-if="po.role == 'assistant'">
-                            <div class="TName">小可AI助手</div>:
-                            <div class="con" v-html="MarkdownT(po.content)"></div>
-                    </div>
+            <div class="markDialog">
+                <template  v-for="(item,index) in listData">
+                    <div class="BodyCon" v-if="item.messages.length"  :key="index">
+                        <div class="BodyConTit">节点{{ index + 1}}</div>
+
+                        <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
+                            <div class="left" v-if="po.role == 'assistant'">
+                                    <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
+                                    <div class="con" v-html="MarkdownT(po.content)"></div>
+                            </div>
 
-                    <div class="left" v-if="po.role == 'user'">
-                            <div class="TName">{{ username }}</div>:
-                            <div class="con" v-html="po.content"></div>
+                            <div class="left" v-if="po.role == 'user'">
+                                    <div class="TName" style="background-color: #9747FF;">{{ username }}</div>
+                                    <div class="con" v-html="po.content"></div>
+                            </div>
+                        </div>
                     </div>
-                </div>
+                </template>
             </div>
+            
+
         </el-dialog>
 
     </div>
@@ -87,8 +94,14 @@ import MarkdownIt from "markdown-it";
     }
 
     .dialog_diy >>> .el-dialog__header {
-    background: #454545 !important;
-    padding: 15px 20px;
+        background: #fff !important;
+        padding: 15px 20px;
+        border-radius: 12px 12px 0 0 !important;
+        border-bottom: 1px #E7E7E7 solid;
+    }
+    .dialog_diy >>> .el-dialog{
+        border-radius: 12px;
+        overflow: hidden;
     }
 
     .dialog_diy >>> .el-dialog__title{
@@ -100,52 +113,106 @@ import MarkdownIt from "markdown-it";
     }
 
     .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close{
-    color: #fff;
+        color: #000;
     }
 
     .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
-    color: #fff;
+        color: #000;
     }
 
 
 
-    .dialog_diy >>> .el-dialog__body,
-    .dialog_diy >>> .el-dialog__footer{
-    background: #fafafa;
-    /* max-height: 850px; */
-    /* overflow: auto; */
+    .dialog_diy >>> .el-dialog__body{
+        background: #FFFFFFCC;
+        border-radius: 12px !important;
+        overflow: auto;
+        box-sizing: border-box;
+        min-height: 70vh;
+        max-height: calc(100vh - 90px);
+        padding: 0 !important;
+        margin: 30px auto 0;
+        width: 99%;
+    }
+
+    .dialog_diy >>> .el-dialog__body::-webkit-scrollbar-thumb {
+        background-color: #0560FD; /* 设置滚动条滑块颜色 */
+    }
+
+    .markDialog{
+        height: 100%;
+        min-height: 600px;
+        display: flex;
+        padding:0 30px 30px;
+        box-sizing: border-box;
+        flex-direction: column;
+        gap: 30px;
     }
     .markScore_diyTit {
-        color: #fff;
+        color: #000000;
         width: calc(100% - 50px);
         display: flex;
         height: 24px;
         justify-content: space-between;
         align-items: center;
+        font-family: PingFang SC;
     }
     .TName{
-        /* font-size: 14px; */
-        color: #4472C4;
-        margin-bottom: 5px;
+        color: #fff;
         font-weight: 600;
-        width: 80px;
+        width: 150px;
         flex-shrink: 0;
         overflow: hidden;
         white-space: nowrap;
         text-overflow: ellipsis;
+        border-radius: 12px 12px 0 0;
+        height: 28px;
+        padding: 6px 17px;
+        box-sizing: border-box;
+        display: flex;
+        align-items: center;
     }
     .con{
-        margin-left: 10px;
-        /* font-size: 14px; */
-        color: #000;
+        color: #000000E5;
+        border-radius: 0 0 12px 12px;
+        border: 1px solid #E7E7E7;
+        padding: 16px;
+        box-sizing: border-box;
+        box-shadow: 0px 4px 20px 0px #0000001A;
     }
     .left{
         display: flex;
+        flex-direction: column;
         font-size: 16px !important;
         justify-content: flex-start;
-        margin-bottom: 10px;
         line-height: 25px;
-        flex: 1;
-        border-bottom: 1px  #e7e7e7 solid;
     }
+    .BodyCon{
+        background: #FFFFFF;
+        border: 0.5px solid #E7E7E7;
+        border-radius: 12px;
+        padding: 10px;
+        box-sizing: border-box;
+        display: flex;
+        flex-direction: column;
+        gap: 10px;
+    }
+    .BodyConTit{
+        font-family: PingFang SC;
+        font-weight: 500;
+        font-size: 16px;
+        line-height: 24px;
+        color: #000;
+    }
+    .BodyConChat{
+        display: flex;
+        flex-direction: column;
+        /* border-radius: 0 0 12px 12px;
+        border: 1px solid #E7E7E7;
+        padding: 16px;
+        box-sizing: border-box; */
+    }
+
+
+
+    
 </style>

+ 43 - 6
src/components/components/intelligentAnalysis/checkAi/aiLeader.vue

@@ -627,17 +627,54 @@ ${JSON.stringify(fileData.data)}
 `;
       // });
       let _msg = `Language: ${this.getLang()} ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example". Instruction: Based on the context, follow "Format example", write content
-## 任务 
-你的任务是根据“作业内容”的作业数据来提供用户需要的搜索建议,将搜索建议的结果以有序列表的形式返回给用户。
-## 规则 
+## 任务
+你是一位课堂学生作业分析助手,你的任务是根据“作业内容”的作业数据来提供教师可能想要了解的学生情况,将老师可能想要了解的问题以有序列表的形式返回给教师。
+- 具备敏锐的观察力,能够从作业中发现学生整体表现的细节。
+- 有深入的分析能力,准确找出学生表现好与需优化之处。
+- 掌握良好的沟通技巧,以便给出合理的反馈建议。
+- 拥有较强的逻辑思维,提出有效的拓展思考和练习。
+- 深刻理解课程内容,从而推理出课程评价标准。
+## 规则
 输出结果基于“作业内容”,避免提供无关的信息。 搜索建议的结果符合伦理规范。
 输出的内容符合“作业内容”的数据,要求要有所关联。
-## 输出 
-输出应包括6个相关的搜索建议,每个搜索建议需要以问号的方式结束。 请一步步思考如何根据现有信息推送搜索建议,但是不需要输出搜索建议以外的内容。
-## 输出格式 
+### 理论框架
+### 教育评价理论
+1. 基本原理:
+- 教育评价理论旨在通过系统的方法对教育现象进行价值判断,包括对学生学习成果等的评估。
+- 评价过程包含确定目标、收集信息、分析判断等环节。
+- 多种评价方法如形成性评价、总结性评价可用于不同目的。
+2. 具体应用:
+- 确定任务目标:根据作业内容确定对学生评价的目标,如知识掌握程度等。
+- 推理评价标准:从课程要求和教学目标出发推理出评价学生作业的标准。
+- 了解学生情况:通过设计问题全面了解学生在作业中的表现情况。
+
+### 因材施教理论
+1. 基本原理:
+- 因材施教理论认为应根据学生的个体差异进行有区别的教育教学。
+- 考虑学生的能力、兴趣、学习风格等方面的差异。
+- 目的是使每个学生都能得到适合自己的教育,发挥最大潜力。
+2. 具体应用:
+- 分析学生表现:通过问题分析学生在作业中的表现好与需优化之处。
+- 提供反馈建议:根据学生个体情况给出针对性的反馈建议。
+- 拓展思考练习:基于学生特点给出适合的拓展思考和练习。
+
+### 教学反馈理论
+1. 基本原理:
+- 教学反馈理论强调教学过程中信息的双向流动,教师给予学生反馈,学生的反应也是反馈给教师的信息。
+- 及时有效的反馈有助于提高教学效果和学生学习成绩。
+- 反馈内容应明确、具体且具有建设性。
+2. 具体应用:
+- 整体表现判断:根据作业内容给出对学生整体表现的判断作为反馈的一部分。
+- 针对性反馈:针对学生作业中的情况给出具体的反馈建议。
+- 调整教学策略:根据学生的反馈信息调整教学策略。
+## 输出
+输出应包括5个相关的搜索建议,每个搜索建议需要以问号的方式结束。 请一步步思考如何根据现有信息推送搜索建议,但是不需要输出搜索建议以外的内容。
+## 输出格式
 搜索建议应以有序列表形式呈现,每个建议包括关键词和简短描述。输出JSON格式的内容,不要有多余的内容。
 ## 作业内容
 ${fileText}
+
+
 ## Format example
 [{"index": 1,"title": "垃圾分类标准","label": "不同国家的垃圾分类标准和方法?"},{"index": 2,"title":"可回收垃圾处理","label": "可回收垃圾的处理流程和再利用方法?"},{  "index": 3,  "title": "有害垃圾的影响",  "label": "有害垃圾对环境和人体健康的潜在影响?"},{  "index": 4,  "title": "垃圾分类标准",  "label": "不同国家的垃圾分类标准和方法?"},{  "index": 5,  "title": "可回收垃圾处理",  "label": "可回收垃圾的处理流程和再利用方法?"},{  "index": 6,  "title": "有害垃圾的影响",  "label": "有害垃圾对环境和人体健康的潜在影响?"}]`;
       // let params = {

+ 7 - 2
src/components/components/intelligentAnalysis/choseCheck/csvTableView.vue

@@ -2,10 +2,10 @@
   <div class="txtView" v-loading="loading">
     <el-table :data="tableData" border style="width: 100%;"
       :header-cell-style="{ background: '#f1f1f1', fontSize: '16px' }" :fit="true">
-      <el-table-column :fixed="[].includes(index)" :label="item.label" :prop="item.prop"
+      <el-table-column :fixed="[].includes(index)" :width="['姓名','提交时间'].includes(item.label)?'100px':'auto'" :label="item.label" :prop="item.prop"
         v-for="(item, index) in columnList" :key="item.label + '_' + index">
         <template slot-scope="scope">
-          <el-tooltip class="item" effect="dark" :content="scope.row[item.prop]" placement="top">
+          <el-tooltip effect="dark" :content="scope.row[item.prop]" popper-class="tooltipMaxWidth" placement="top">
             <!-- 为每个单元格内容添加自定义的多行文本样式 -->
             <div class="multi-line-text">{{ scope.row[item.prop] }}</div>
           </el-tooltip>
@@ -151,6 +151,7 @@ export default {
   box-sizing: border-box;
   background-color: #ececec;
   padding: 0px 0px;
+  position: relative;
 }
 
 .tv_content {
@@ -176,4 +177,8 @@ export default {
   max-height: 3em;
 }
 
+.tooltip>>>.el-tooltip__popper {
+  max-width: 30vw!important;
+}
+
 </style>

+ 71 - 16
src/components/components/studentWorkPreviewDialog.vue

@@ -270,20 +270,38 @@
               </div>
             </div>
             <div class="s_b_m_tool40" v-if="[72].includes(tool)">
-              <div  style="margin-bottom: 20px;" v-for="(item,index) in JSON.parse(studentWork.works)" :key="index">
+              <!-- <div  style="margin-bottom: 20px;" v-for="(item,index) in JSON.parse(studentWork.works)" :key="index">
                 <div style="margin-bottom: 15px;font-size: 20px;font-weight: 600;color: #000;">第{{ index + 1}}阶段</div>
                 <div v-for="(po,pInd) in item.messages" :key="pInd+'pInd'">
                     <div class="left" v-if="po.role == 'assistant'">
                             <div class="TName">小可AI助手</div>:
                             <div class="con"  v-html="MarkdownT(po.content)"></div>
-                    </div>
-
-                    <div class="left" v-if="po.role == 'user'">
+                    </div> -->
+                    <!-- <div class="left" v-if="po.role == 'user'">
                             <div class="TName">{{ studentWork.sName }}</div>:
                             <div class="con" v-html="po.content"></div>
                     </div>
                 </div>
-            </div>
+            </div> -->
+
+              <template v-for="(item,index) in JSON.parse(studentWork.works)">
+                  <div class="BodyCon" v-if="item.messages.length"  :key="index">
+                      <div class="BodyConTit">节点{{ index + 1}}</div>
+
+                      <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
+                          <div class="left" v-if="po.role == 'assistant'">
+                                  <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
+                                  <div class="con" v-html="MarkdownT(po.content)"></div>
+                          </div>
+
+                          <div class="left" v-if="po.role == 'user'">
+                                  <div class="TName" style="background-color: #9747FF;">{{ studentWork.sName }}</div>
+                                  <div class="con" v-html="po.content"></div>
+                          </div>
+                      </div>
+                  </div>
+              </template>
+
             </div>
           </div>
         </div>
@@ -803,30 +821,67 @@ export default {
 .redioStyle >>> .el-checkbox__label {
   font-size: 18px;
 }
-.TName{
-        /* font-size: 14px; */
-        color: #4472C4;
-        margin-bottom: 5px;
+.markScore_diyTit {
+        color: #000000;
+        width: calc(100% - 50px);
+        display: flex;
+        height: 24px;
+        justify-content: space-between;
+        align-items: center;
+        font-family: PingFang SC;
+
+    }
+    .TName{
+        color: #fff;
         font-weight: 600;
-        width: 80px;
+        width: 150px;
         flex-shrink: 0;
         overflow: hidden;
         white-space: nowrap;
         text-overflow: ellipsis;
+        border-radius: 12px 12px 0 0;
+        height: 28px;
+        padding: 6px 17px;
+        box-sizing: border-box;
+        display: flex;
+        align-items: center;
     }
     .con{
-        margin-left: 10px;
-        /* font-size: 14px; */
-        color: #000;
+        color: #000000E5;
+        border-radius: 0 0 12px 12px;
+        border: 1px solid #E7E7E7;
+        padding: 16px;
+        box-sizing: border-box;
+        box-shadow: 0px 4px 20px 0px #0000001A;
     }
     .left{
         display: flex;
+        flex-direction: column;
         font-size: 16px !important;
         justify-content: flex-start;
-        margin-bottom: 10px;
         line-height: 25px;
-        flex: 1;
-        border-bottom: 1px  #e7e7e7 solid;
+    }
+    .BodyCon{
+        background: #FFFFFF;
+        border: 0.5px solid #E7E7E7;
+        border-radius: 12px;
+        padding: 10px;
+        box-sizing: border-box;
+        display: flex;
+        flex-direction: column;
+        gap: 10px;
+        margin-bottom: 20px;
+    }
+    .BodyConTit{
+        font-family: PingFang SC;
+        font-weight: 500;
+        font-size: 16px;
+        line-height: 24px;
+        color: #000;
+    }
+    .BodyConChat{
+        display: flex;
+        flex-direction: column;
     }
 
 

部分文件因文件數量過多而無法顯示