소스 검색

Merge branch 'beta'

lsc 1 년 전
부모
커밋
f508ef897e

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.6e06f9dfda5be731799af00e1cb49292.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.571c38d63f24b1ae9e16.js></script><script type=text/javascript src=./static/js/vendor.3cd0a0187ca1f70ded67.js></script><script type=text/javascript src=./static/js/app.e19d8fce69827cfc7d90.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.891bb6bf31f3e8ca8e28a339110d7756.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.571c38d63f24b1ae9e16.js></script><script type=text/javascript src=./static/js/vendor.3cd0a0187ca1f70ded67.js></script><script type=text/javascript src=./static/js/app.a3ecfe325f46e5d48771.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/app.891bb6bf31f3e8ca8e28a339110d7756.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/app.891bb6bf31f3e8ca8e28a339110d7756.css.map


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/app.a3ecfe325f46e5d48771.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/app.a3ecfe325f46e5d48771.js.map


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/manifest.571c38d63f24b1ae9e16.js.map


+ 26 - 12
src/components/pages/aiAddCourse/aiBox.vue

@@ -387,22 +387,35 @@ export default {
         this.$nextTick(() => {
           this.$refs.chatDialog.scrollTop = this.$refs.chatDialog.scrollHeight;
         });
+        // let params = JSON.stringify({
+        //   model: "gpt-3.5-turbo",
+        //   temperature: 0,
+        //   max_tokens: 4096,
+        //   top_p: 1,
+        //   frequency_penalty: 0,
+        //   presence_penalty: 0,
+        //   messages: [{ role: "user", content: message }],
+        //   uid: _uuid,
+        //   mind_map_question: ""
+        // });
         let params = JSON.stringify({
-          model: "gpt-3.5-turbo",
-          temperature: 0,
-          max_tokens: 4096,
-          top_p: 1,
-          frequency_penalty: 0,
-          presence_penalty: 0,
-          messages: [{ role: "user", content: message }],
+          message: {
+              anthropic_version: "bedrock-2023-05-31",
+              max_tokens: 4096,
+              temperature: 0,
+              top_p: 1,
+              messages:  [{
+                  "role": "user",
+                  "content": message
+              }] , 
+          },
           uid: _uuid,
-          mind_map_question: ""
+          model: "Claude 3 Sonnet" // Claude 3 Sonnet或者Claude 3 Haiku
         });
         this.courseText = "";
 
-        this.ajax
-          .post("https://gpt4.cocorobo.cn/chat", params)
-          .then(res => {
+        // this.ajax.post("https://gpt4.cocorobo.cn/chat", params).then(res => {
+        this.ajax.post("https://claude3.cocorobo.cn/chat", params).then(res => {
             if (res.data.FunctionResponse.result == "发送成功") {
             } else {
               this.$message.warning(res.data.FunctionResponse.result);
@@ -415,7 +428,8 @@ export default {
       }
     },
     getAiContent(_uid) {
-      let _source = new EventSource(`https://gpt4.cocorobo.cn/stream/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
+      // let _source = new EventSource(`https://gpt4.cocorobo.cn/stream/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
+      let _source = new EventSource(`https://claude3.cocorobo.cn/streamChat/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
       let _allText = "";
       let _mdText = "";
       const md = new MarkdownIt();

+ 881 - 0
src/components/pages/aiAddCourse/aiBox2.vue

@@ -0,0 +1,881 @@
+<template>
+  <div class="ai_body">
+    <div class="ai_body_dialog" v-loading="loading" ref="chatDialog">
+      <div
+        class="dialog_content"
+        v-for="(item, index) in array"
+        :key="item.uid"
+      >
+        <div v-if="item.content">
+          <div class="content content2" v-html="item.content"></div>
+          <div class="role">
+            <img src="../../../assets/icon/new/role2.png" />
+          </div>
+        </div>
+        <div style="margin-top:10px ;">
+          <div class="role">
+            <img src="../../../assets/icon/new/role1.png" />
+          </div>
+          <div
+            class="content"
+            v-loading="item.loading"
+            v-html="item.aiContent"
+          ></div>
+        </div>
+        <!-- <div class="role">
+          <img src="../../../assets/icon/new/role1.png"/>
+          <img src="../../../assets/icon/new/role2.png"/>
+        </div>
+        <div class="content content2" :class="{ content2: item.role == 2 }">
+          {{ item.text }}
+        </div>
+				<div class="role">
+          <img src="../../../assets/icon/new/role1.png"/>
+        </div>
+        <div class="content">
+          {{ item.text }}
+        </div> -->
+      </div>
+    </div>
+    <div class="ai_body_select">
+      <div class="checkBox" v-if="checkBool">
+        <div class="task">
+          <div class="title">选择需要优化的任务:</div>
+          <div class="content">
+            <div class="span" @click="addAllTask()">
+              <div class="check">
+                <img
+                  :src="checkImg"
+                  alt=""
+                  v-if="checkArray.length !== course.length"
+                />
+                <img :src="checkIsImg" alt="" v-else />
+              </div>
+              <span>全选</span>
+            </div>
+            <div
+              class="span"
+              v-for="(item, index) in course"
+              :key="index"
+              @click="addTask(index)"
+            >
+              <div class="check">
+                <img
+                  :src="checkImg"
+                  alt=""
+                  v-if="checkArray.indexOf(index) === -1"
+                />
+                <img :src="checkIsImg" alt="" v-else />
+              </div>
+              <span>任务{{ index + 1 }}</span>
+            </div>
+          </div>
+        </div>
+        <div class="part">
+          <div class="title">选择优化的部分:</div>
+          <div class="content">
+            <div
+              class="span"
+              v-for="(item, index) in partArray"
+              :key="index"
+              :class="{ active: part == item.name }"
+              @click="checkPart(item.name)"
+            >
+              {{ item.name }}
+            </div>
+          </div>
+        </div>
+      </div>
+      <span
+        class="check"
+        :class="{ isCheck: checkBool }"
+        v-if="!checkArray.length && !part"
+        @click="checkBool = !checkBool"
+        >选择优化内容</span
+      >
+      <span
+        class="check"
+        :class="{ isCheck: checkBool }"
+        @click="checkBool = !checkBool"
+        v-else
+      >
+        <el-tooltip :content="taskName" placement="top" effect="dark">
+          <!-- content to trigger tooltip here -->
+          <span>{{ taskName }}</span>
+        </el-tooltip>
+      </span>
+    </div>
+    <div class="ai_body_input">
+      <textarea
+        rows="3"
+        @keyup.enter="addContent"
+        class="binfo_input binfo_textarea"
+        cols
+        v-model.trim="courseText"
+        placeholder="在此输入您想了解的内容"
+      ></textarea>
+      <div
+        class="c_pub_button_confirm"
+        v-if="!loading && courseText"
+        @click="addContent"
+      >
+        发送
+      </div>
+      <div class="c_pub_button_confirm" @click="promptTit" v-else>发送</div>
+    </div>
+  </div>
+</template>
+
+<script>
+import checkImg from "../../../assets/icon/sourceFile/check.png";
+import checkIsImg from "../../../assets/icon/sourceFile/check_is.png";
+import { v4 as uuidv4 } from "uuid";
+import MarkdownIt from "markdown-it";
+export default {
+  props: {
+    unitJson: {
+      type: Array
+    },
+		courseId:{
+			type:String,
+			default:""
+		},
+  },
+  data() {
+    return {
+      array: [],
+      courseText: "",
+      checkImg: checkImg,
+      checkIsImg: checkIsImg,
+			userid: this.$route.query.userid,
+      checkArray: [],
+      course: [{ title: "任务1" }, { title: "任务2" }, { title: "任务3" }],
+      partArray: [
+        { name: "全部内容" },
+        { name: "任务设计" },
+        { name: "评价设计" }
+      ],
+      part: "全部内容",
+      checkBool: false,
+      loading: false
+    };
+  },
+  watch: {
+    unitJson: {
+      immediate: true,
+      deep: true,
+      handler(newValue, oldValue) {
+        this.course = this.unitJson[0].chapterInfo[0].taskJson;
+      }
+    }
+  },
+  methods: {
+    promptTit() {
+      if (!this.loading && !this.courseText) {
+        this.$message({
+          message: "请输入您想要了解的内容",
+          type: "warning"
+        });
+      } else {
+        this.$message({
+          message: "请回答完毕后再次发送",
+          type: "warning"
+        });
+      }
+    },
+    addContent() {
+      let message = this.courseText
+      if (this.courseText) {
+        let msg = `
+          ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".`
+        if(this.checkArray.length){
+          let task = []
+          if(this.part == "全部内容"){
+            // msg += `--------
+            // ## 示例
+            // [
+            //   {
+            //     detail: "面向学生的任务描述",
+            //     elist:[
+            //       {"value":"评价名字1","detail":"评价维度1", "score": 5},
+            //       {"value":"评价名字2","detail":"评价维度2", "score": 5},
+            //       {"value":"评价名字3","detail":"评价维度3", "score": 5}
+            //     ],
+            //     toolChoose: [
+            //       {
+            //         tool:"电子白板", 
+            //         detail: "工具描述"
+            //       },
+            //       {
+            //         tool:"思维大图", 
+            //         detail: "工具描述"
+            //       }
+            //     ]
+            //   },
+            //   {
+            //     detail: "面向学生的任务描述",
+            //     elist:[
+            //       {"value":"评价名字1","detail":"评价维度1", "score": 5},
+            //       {"value":"评价名字2","detail":"评价维度2", "score": 5},
+            //       {"value":"评价名字3","detail":"评价维度3", "score": 5}
+            //     ],
+            //     toolChoose: []
+            //   },
+            //   {
+            //     detail: "面向学生的任务描述",
+            //     elist:[
+            //       {"value":"评价名字1","detail":"评价维度1", "score": 5},
+            //       {"value":"评价名字2","detail":"评价维度2", "score": 5},
+            //       {"value":"评价名字3","detail":"评价维度3", "score": 5}
+            //     ],
+            //     toolChoose: [
+            //       {
+            //         tool:"文档", 
+            //         detail: "工具描述"
+            //       }
+            //     ]
+            //   }
+            // ]
+            
+            // --------
+            // ## 输出格式与要求
+            // [
+            //   {
+            //     detail: "面向学生的任务描述",
+            //     elist:[
+            //       {"value":"评价名字1","detail":"评价维度1","score":5},
+            //       {"value":"评价名字2","detail":"评价维度2","score":5},
+            //       {"value":"评价名字3","detail":"评价维度3","score":5}
+            //     ],//至少3条评价标准,这个评价是教师用来评价学生表现的,需要包含评价维度,以及该维度中教师期待学生的表现,句式为学生应该能....
+            //     toolChoose: [
+            //       {
+            //         tool: "工具", //电子白板,文档,思维导图,表格,作业提交中选择其中一个工具
+            //         detail: "工具描述"
+            //       }
+            //     ] //可0~2个工具
+            //   }
+            // ]
+            // `
+            for(var i = 0; i < this.checkArray.length; i++){
+              let _index = this.checkArray[i]
+              task.push(this.course[_index])
+            }
+          }else if(this.part == "任务设计"){
+            // msg += `
+            // --------
+            // ## 示例
+            // [
+            //   {
+            //     detail: "面向学生的任务描述",
+            //     toolChoose: [
+            //       {
+            //         tool:"电子白板", 
+            //         detail: "工具描述"
+            //       },
+            //       {
+            //         tool:"思维大图", 
+            //         detail: "工具描述"
+            //       }
+            //     ]
+            //   },
+            //   {
+            //     detail: "面向学生的任务描述",
+            //     toolChoose: []
+            //   },
+            //   {
+            //     detail: "面向学生的任务描述",
+            //     toolChoose: [
+            //       {
+            //         tool:"文档", 
+            //         detail: "工具描述"
+            //       }
+            //     ]
+            //   }
+            // ]
+            
+            // --------
+            // ## 输出格式与要求
+            // [
+            //   {
+            //     detail: "面向学生的任务描述",
+            //     toolChoose: [
+            //       {
+            //         tool: "工具", //电子白板,文档,思维导图,表格,作业提交中选择其中一个工具
+            //         detail: "工具描述"
+            //       }
+            //     ] //可0~2个工具
+            //   }
+            // ]
+            // `
+            for(var i = 0; i < this.checkArray.length; i++){
+              let _index = this.checkArray[i]
+              task.push(this.course[_index])
+            }
+          }else if(this.part == "评价设计"){
+            // msg += `
+            // --------
+            // ## 示例
+            // [
+            //   {
+            //     elist:[
+            //       {"value":"评价名字1","detail":"评价维度1", "score": 5},
+            //       {"value":"评价名字2","detail":"评价维度2", "score": 5},
+            //       {"value":"评价名字3","detail":"评价维度3", "score": 5}
+            //     ],
+            //   },
+            //   {
+            //     elist:[
+            //       {"value":"评价名字1","detail":"评价维度1", "score": 5},
+            //       {"value":"评价名字2","detail":"评价维度2", "score": 5},
+            //       {"value":"评价名字3","detail":"评价维度3", "score": 5}
+            //     ],
+            //   },
+            //   {
+            //     elist:[
+            //       {"value":"评价名字1","detail":"评价维度1", "score": 5},
+            //       {"value":"评价名字2","detail":"评价维度2", "score": 5},
+            //       {"value":"评价名字3","detail":"评价维度3", "score": 5}
+            //     ],
+            //   }
+            // ]
+            
+            // --------
+            // ## 输出格式与要求
+            // [
+            //   {
+            //     elist:[
+            //       {"value":"评价名字1","detail":"评价维度1","score":5},
+            //       {"value":"评价名字2","detail":"评价维度2","score":5},
+            //       {"value":"评价名字3","detail":"评价维度3","score":5}
+            //     ],//至少3条评价标准,这个评价是教师用来评价学生表现的,需要包含评价维度,以及该维度中教师期待学生的表现,句式为学生应该能....
+            //   }
+            // ]
+            // `
+            for(var i = 0; i < this.checkArray.length; i++){
+              let _index = this.checkArray[i]
+              task.push(this.course[_index].eList)
+            }
+          }
+          
+          msg += `
+          --------
+          ## 修改内容
+          ${JSON.stringify(task)}
+          `
+
+          msg += `
+          --------
+          ## 要求
+          ${this.courseText}
+          `
+          message = msg
+        }
+        let _uuid = uuidv4();
+        this.array.push({
+          role: "user",
+          content: `${this.courseText}`,
+          uid: _uuid,
+          AI: "AI",
+          aiContent: "",
+          oldContent: "",
+          isShowSynchronization: false,
+          filename: "",
+          index: this.array.length,
+          is_mind_map: false,
+          loading: true
+        });
+        this.$nextTick(() => {
+          this.$refs.chatDialog.scrollTop = this.$refs.chatDialog.scrollHeight;
+        });
+        let params = JSON.stringify({
+          model: "gpt-3.5-turbo",
+          temperature: 0,
+          max_tokens: 4096,
+          top_p: 1,
+          frequency_penalty: 0,
+          presence_penalty: 0,
+          messages: [{ role: "user", content: message }],
+          uid: _uuid,
+          mind_map_question: ""
+        });
+        this.courseText = "";
+
+        this.ajax
+          .post("https://gpt4.cocorobo.cn/chat", params)
+          .then(res => {
+            if (res.data.FunctionResponse.result == "发送成功") {
+            } else {
+              this.$message.warning(res.data.FunctionResponse.result);
+            }
+          })
+          .catch(e => {
+            console.log(e);
+          });
+        this.getAiContent(_uuid);
+      }
+    },
+    getAiContent(_uid) {
+      let _source = new EventSource(`https://gpt4.cocorobo.cn/stream/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
+      let _allText = "";
+      let _mdText = "";
+      const md = new MarkdownIt();
+      _source.onmessage = _e => {
+        if (_e.data.replace("'", "").replace("'", "") == "[DONE]") {
+          //对话已经完成
+          _mdText = _mdText.replace("_", "");
+          _source.close();
+          this.$nextTick(() => {
+            this.$refs.chatDialog.scrollTop = this.$refs.chatDialog.scrollHeight;
+          });
+          this.array.find(i => i.uid == _uid).aiContent = _mdText;
+          this.array.find(i => i.uid == _uid).isalltext = true;
+          this.array.find(i => i.uid == _uid).isShowSynchronization = true;
+          this.array.find(i => i.uid == _uid).loading = false;
+          // 这里保存对话
+          this.insertChat(_uid);
+          return;
+        } else {
+          //对话还在继续
+          let _text = "";
+          _text = _e.data.replaceAll("'", "");
+          if (_allText == "") {
+            _allText = _text.replace(/^\n+/, ""); //去掉回复消息中偶尔开头就存在的连续换行符
+          } else {
+            _allText += _text;
+          }
+          _mdText = _allText + "_";
+          _mdText = _mdText.replace(/\\n/g, "\n");
+          _mdText = _mdText.replace(/\\/g, "");
+          if (_allText.split("```").length % 2 == 0) _mdText += "\n```\n";
+          //转化返回的回复流数据
+          _mdText = md.render(_mdText);
+          this.array.find(i => i.uid == _uid).aiContent = _mdText;
+          this.array.find(i => i.uid == _uid).loading = false;
+          this.$nextTick(() => {
+            this.$refs.chatDialog.scrollTop = this.$refs.chatDialog.scrollHeight;
+          });
+          // 处理流数据
+        }
+      };
+    },
+    //保存消息
+    insertChat(_uid) {
+      let _data = this.array.find(i => i.uid == _uid);
+      if (!_data) return;
+      let params = {
+        userId: this.userid,
+        userName: "qgt",
+        groupId: "602def61-005d-11ee-91d8-005056b8q12w",
+        answer: _data.aiContent,
+        problem: _data.content,
+        file_id: _data.fileid ? _data.fileid : "",
+        alltext: _data.aiContent,
+        type: "chat",
+        filename: _data.filename,
+        session_name: `${this.courseId}-addCourse` //这是对话记录位置
+      };
+      this.ajax
+        .post("https://gpt4.cocorobo.cn/insert_chat", params)
+        .then(res => {});
+    },
+    // 获取对应的聊天记录
+    getChatList() {
+      return new Promise((resolve, reject) => {
+        if (this.loading) return this.$message.info("请稍等...");
+        this.array = [];
+        this.loading = true;
+        let params = {
+          userid: this.userid,
+          groupid: "602def61-005d-11ee-91d8-005056b8q12w",
+          // session_name:``
+          session_name: `${this.courseId}-addCourse`
+        };
+        this.ajax
+          .post("https://gpt4.cocorobo.cn/get_agent_park_chat", params)
+          .then(res => {
+            let _data = JSON.parse(res.data.FunctionResponse);
+            if (_data.length > 0) {
+              let _chatList = [];
+              for (let i = 0; i < _data.length; i++) {
+                _chatList.push({
+                  loading: false,
+                  role: "user",
+                  content: _data[i].problem,
+                  uid: _data[i].id,
+                  AI: "AI",
+                  aiContent: _data[i].answer,
+                  oldContent: _data[i].answer,
+                  isShowSynchronization: false,
+                  filename: _data[i].filename,
+                  index: i,
+                  is_mind_map: false,
+                  fileid: _data[i].fileid
+                });
+              }
+              this.array = _chatList;
+              this.loading = false;
+            } else {
+              //没有对话记录
+              this.loading = false;
+            }
+            resolve();
+          })
+          .catch(err => {
+            console.log(err);
+            this.$message.error("获取对话记录失败");
+            this.loading = false;
+            resolve();
+          });
+      });
+    },
+    addTask(index) {
+      if (this.checkArray.indexOf(index) !== -1) {
+        this.checkArray.splice(this.checkArray.indexOf(index), 1);
+      } else {
+        this.checkArray.push(index);
+      }
+      console.log(index);
+    },
+    addAllTask() {
+      if (this.checkArray.length === this.course.length) {
+        this.checkArray = [];
+      } else {
+        this.checkArray = [];
+        this.course.forEach((item, index) => {
+          this.checkArray.push(index);
+        });
+      }
+    },
+    checkPart(name) {
+      this.part = name;
+    }
+  },
+  computed: {
+    courseTextLength() {
+      return this.courseText.length;
+    },
+    taskName() {
+      let task = "";
+      if (this.checkArray.length) {
+        task = "任务";
+        this.checkArray = this.checkArray.sort((a, b) => a - b);
+        let a = JSON.parse(JSON.stringify(this.checkArray));
+        for (let index = 0; index < a.length; index++) {
+          a[index]++;
+        }
+        task += a.join("/");
+      }
+      return task + " " + this.part;
+    }
+  },
+  mounted() {
+    this.getChatList().then(_ => {
+      this.$nextTick(() => {
+				console.log(this.$refs.chatDialog.scrollHeight)
+        this.$refs.chatDialog.scrollTop = this.$refs.chatDialog.scrollHeight;
+      });
+    });
+  }
+};
+</script>
+
+<style scoped>
+.ai_body {
+  height: 100%;
+  width: calc(100% - 20px);
+  margin: 0 auto;
+}
+
+.binfo_input {
+  width: 100%;
+  margin: 0;
+  padding: 12px 14px;
+  display: block;
+  min-width: 0;
+  outline: none;
+  box-sizing: border-box;
+  background: none;
+  border: none;
+  border-radius: 4px;
+  background: #fff;
+  font-size: 14px;
+  resize: none;
+  font-family: "Microsoft YaHei";
+  min-height: 48px;
+  /* border: 1px solid #3682fc00; */
+  border: 1.5px solid #cad1dc;
+}
+
+.binfo_textarea {
+  border: 1.5px solid #cad1dc;
+  font-size: 14px;
+  resize: none;
+  /* background: #f6f6f6; */
+  font-family: "Microsoft YaHei";
+}
+
+.binfo_textarea::-webkit-scrollbar {
+  /*滚动条整体样式*/
+  width: 6px;
+  /*高宽分别对应横竖滚动条的尺寸*/
+  height: 6px;
+}
+
+/*定义滚动条轨道 内阴影+圆角*/
+.binfo_textarea::-webkit-scrollbar-track {
+  border-radius: 10px;
+  background-color: rgba(0, 0, 0, 0.1);
+}
+
+/*定义滑块 内阴影+圆角*/
+.binfo_textarea::-webkit-scrollbar-thumb {
+  border-radius: 10px;
+  -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+  background-color: rgba(0, 0, 0, 0.1);
+}
+
+.binfo_input:focus-visible {
+  border: 1.5px solid #3681fc !important;
+}
+
+.ai_body_input {
+  /* position: relative; */
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: end;
+}
+
+.c_pub_button_confirm {
+  /* position: absolute;
+    bottom: 13px;
+    right: 13px; */
+  margin-top: 10px;
+  width: 80px;
+  display: flex;
+  justify-content: center;
+}
+
+.ai_body_dialog {
+  padding: 10px 0;
+  box-sizing: border-box;
+  height: calc(100% - 180px);
+  overflow: auto;
+  margin-bottom: 10px;
+}
+
+.dialog_content {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.dialog_content > div {
+  display: flex;
+  align-items: flex-start;
+}
+
+.dialog_content + .dialog_content {
+  margin: 15px 0;
+}
+
+.dialog_content > div .right {
+  flex-direction: row-reverse;
+}
+
+.dialog_content > div .right .role {
+  margin-right: 0;
+  margin-left: 10px;
+}
+
+.dialog_content > div .role {
+  min-width: 30px;
+  width: 30px;
+  height: 30px;
+  margin-right: 10px;
+  border-radius: 50%;
+}
+
+.dialog_content > div .role > img {
+  height: 100%;
+  width: 100%;
+}
+
+.dialog_content > div .content {
+  padding: 10px 5px;
+  border-radius: 5px;
+  width: 100%;
+  word-break: break-word;
+  box-sizing: border-box;
+  /* white-space: pre-line; */
+  max-width: 100%;
+  background: #f7f7f7;
+  overflow: hidden;
+  margin: 0 10px;
+}
+
+.dialog_content > div .content2 {
+  background: #3681fc;
+  color: #fff;
+}
+
+.ai_body_select {
+  position: relative;
+}
+
+.ai_body_select > .check {
+  background: #e7e7e7;
+  display: flex;
+  width: fit-content;
+  padding: 0 10px;
+  height: 30px;
+  border-radius: 21px;
+  font-size: 14px;
+  align-items: center;
+  justify-content: center;
+  color: #0061ff;
+  font-weight: 700;
+  margin: 10px 0;
+  cursor: pointer;
+}
+
+.ai_body_select > .check::before {
+  content: "";
+  width: 15px;
+  height: 15px;
+  display: block;
+  background-image: url("../../../assets/icon/course/aiPart.png");
+  background-size: 100% 100%;
+  margin-right: 5px;
+}
+
+.ai_body_select > .check::after {
+  content: "";
+  width: 15px;
+  height: 15px;
+  display: block;
+  background-image: url("../../../assets/icon/course/aiPart_arrow.png");
+  background-size: 100% 100%;
+  margin-right: 5px;
+}
+
+.ai_body_select > .isCheck {
+  background: #0061ff;
+  display: flex;
+  width: fit-content;
+  padding: 0 10px;
+  height: 30px;
+  border-radius: 21px;
+  font-size: 14px;
+  align-items: center;
+  justify-content: center;
+  color: #fff;
+  font-weight: 700;
+  margin: 10px 0;
+  cursor: pointer;
+  max-width: 100%;
+  box-sizing: border-box;
+}
+
+.ai_body_select > .isCheck > span {
+  width: calc(100% - 40px);
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.ai_body_select > .isCheck::before {
+  content: "";
+  width: 15px;
+  height: 15px;
+  display: block;
+  background-image: url("../../../assets/icon/course/aiPart_active.png");
+  background-size: 100% 100%;
+  margin-right: 5px;
+}
+
+.ai_body_select > .isCheck::after {
+  content: "";
+  width: 15px;
+  height: 15px;
+  display: block;
+  background-image: url("../../../assets/icon/course/aiPart_arrow_active.png");
+  background-size: 100% 100%;
+  margin-right: 5px;
+}
+
+.ai_body_select > .checkBox {
+  position: absolute;
+  bottom: 40px;
+  border: 1px solid #e0eafb;
+  width: 100%;
+  height: 300px;
+  background: #fff;
+  border-radius: 5px;
+  padding: 10px;
+  box-sizing: border-box;
+}
+
+.ai_body_select > .checkBox > .task > .title,
+.ai_body_select > .checkBox > .part > .title {
+  font-size: 14px;
+  font-weight: 700;
+  margin-bottom: 5px;
+}
+
+.ai_body_select > .checkBox > .task {
+  height: calc(100% - 60px);
+}
+
+.ai_body_select > .checkBox > .part {
+}
+
+.ai_body_select > .checkBox > .task > .content {
+  height: calc(100% - 40px);
+  overflow: auto;
+}
+
+.ai_body_select > .checkBox > .task > .content > .span + .span {
+  margin-top: 5px;
+}
+
+.ai_body_select > .checkBox > .task > .content > .span {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  cursor: pointer;
+}
+
+.ai_body_select > .checkBox > .task > .content > .span > .check {
+  width: 13px;
+  height: 13px;
+  display: flex;
+  align-items: center;
+  margin-right: 5px;
+}
+
+.ai_body_select > .checkBox > .task > .content > .span > .check > img {
+  width: 100%;
+  height: 100%;
+}
+
+.ai_body_select > .checkBox > .part > .content {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  justify-content: space-between;
+}
+
+.ai_body_select > .checkBox > .part > .content > .span {
+  padding: 3px 6px;
+  border: 1px solid #e0eafb;
+  border-radius: 40px;
+  cursor: pointer;
+}
+
+.ai_body_select > .checkBox > .part > .content > .span.active {
+  color: #0061ff;
+  border-color: #0061ff;
+}
+</style>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1068 - 1050
src/components/pages/classroomObservation/components/chatArea.vue


+ 451 - 430
src/components/pages/pblCourse/component/chatArea.vue

@@ -1,538 +1,559 @@
 <template>
-	<div class="chat" v-loading="loading">
-		<div class="c_chat" ref="chatRef">
-			<div class="c_c_item" v-for="item in chatList" :key="item.uid">
-				<div class="c_c_i_user" v-if="item.content">
-					<div class="c_c_i_u_message">
-						<div class="c_c_i_u_m_top">
-							<span class="chatTime">{{ item.createtime }}</span>
-							<span>科科</span>
-						</div>
-						<div class="c_c_i_u_m_bottom">
-							<span class="coptText" @click="copyText(item.aiContent)"></span>
-							<div
-								class="c_c_i_u_m_content chatContent"
-								v-html="item.content"
-							></div>
-						</div>
-					</div>
-					<div class="c_c_i_u_avatar">
-						<el-avatar
-							style="width: 100%; height: 100%"
-							:src="require('../../../../assets/icon/pblCourse/userAvatar.png')"
-							fit="fit"
-						></el-avatar>
-					</div>
-				</div>
-				<div class="c_c_i_ai">
-					<div class="c_c_i_ai_avatar">
-						<el-avatar
-							style="width: 100%; height: 100%"
-							:src="
-								require('../../../../assets/icon/pblCourse/aiTeacherAvatar.png')
-							"
-							fit="fit"
-						></el-avatar>
-					</div>
-					<div class="c_c_i_ai_message">
-						<div class="c_c_i_ai_m_top">
-							<span>小可老师</span>
-							<span class="chatTime">{{item.createtime}}</span>
-						</div>
-						<div class="c_c_i_ai_m_bottom">
-							<div
-								v-loading="item.loading"
-								class="c_c_i_ai_m_content chatContent"
-								v-html="item.aiContent"
-							></div>
-							<span class="coptText" @click="copyText(item.aiContent)"></span>
-						</div>
-					</div>
-				</div>
-			</div>
-		</div>
-		<!-- <div class="c_controls">
+  <div class="chat" v-loading="loading">
+    <div class="c_chat" ref="chatRef">
+      <div class="c_c_item" v-for="item in chatList" :key="item.uid">
+        <div class="c_c_i_user" v-if="item.content">
+          <div class="c_c_i_u_message">
+            <div class="c_c_i_u_m_top">
+              <span class="chatTime">{{ item.createtime }}</span>
+              <span>科科</span>
+            </div>
+            <div class="c_c_i_u_m_bottom">
+              <span class="coptText" @click="copyText(item.aiContent)"></span>
+              <div
+                class="c_c_i_u_m_content chatContent"
+                v-html="item.content"
+              ></div>
+            </div>
+          </div>
+          <div class="c_c_i_u_avatar">
+            <el-avatar
+              style="width: 100%; height: 100%"
+              :src="require('../../../../assets/icon/pblCourse/userAvatar.png')"
+              fit="fit"
+            ></el-avatar>
+          </div>
+        </div>
+        <div class="c_c_i_ai">
+          <div class="c_c_i_ai_avatar">
+            <el-avatar
+              style="width: 100%; height: 100%"
+              :src="
+                require('../../../../assets/icon/pblCourse/aiTeacherAvatar.png')
+              "
+              fit="fit"
+            ></el-avatar>
+          </div>
+          <div class="c_c_i_ai_message">
+            <div class="c_c_i_ai_m_top">
+              <span>小可老师</span>
+              <span class="chatTime">{{ item.createtime }}</span>
+            </div>
+            <div class="c_c_i_ai_m_bottom">
+              <div
+                v-loading="item.loading"
+                class="c_c_i_ai_m_content chatContent"
+                v-html="item.aiContent"
+              ></div>
+              <span class="coptText" @click="copyText(item.aiContent)"></span>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- <div class="c_controls">
 			<span class="c_controls_item" @click="clearChat">清空对话</span>
 		</div> -->
-		<div class="c_bottom" 	v-loading="chatLoading">
-			<!-- <div class="c_b_record">
+    <div class="c_bottom" v-loading="chatLoading">
+      <!-- <div class="c_b_record">
 				<span></span>
 			</div> -->
-			<div class="c_b_inputArea">
-				<el-input
-					class="c_b_input"
-					@keyup.enter.native="send()"
-					v-model="textValue"
-				
-				>
-				</el-input>
-				<!-- <span></span> -->
-			</div>
-			<div class="c_b_send" @click="send">
-				<span></span>
-			</div>
-		</div>
-	</div>
+      <div class="c_b_inputArea">
+        <el-input
+          class="c_b_input"
+          @keyup.enter.native="send()"
+          v-model="textValue"
+        >
+        </el-input>
+        <!-- <span></span> -->
+      </div>
+      <div class="c_b_send" @click="send">
+        <span></span>
+      </div>
+    </div>
+  </div>
 </template>
 
 <script>
 import { v4 as uuidv4 } from "uuid";
 import MarkdownIt from "markdown-it";
 export default {
-	data() {
-		return {
-			loading: false,
-			chatLoading:false,
-			userId:this.$route.query['userid'],
-			chatList: [],
-			textValue: "",
-		};
-	},
-	methods: {
-		// 发送消息
-		send() {
-			if(this.chatLoading || this.loading)return this.$message.info("请稍等...")
-			if(!this.textValue.trim())return this.$message.info("请输入内容");
-			const _uuid = uuidv4();
-			this.chatLoading = true;
-			this.chatList.push({
-				role: "user",
-				content: `${this.textValue}`,
-				uid: _uuid,
-				AI: "AI",
-				aiContent: "",
-				oldContent: "",
-				filename: "",
-				index: this.chatList.length,
-				createtime:new Date().toLocaleString().replaceAll("/",'-'),
-				loading: true,
-			})
-			
-			let params = {
-				model: "gpt-3.5-turbo",
-					temperature: 0,
-					max_tokens: 4096,
-					top_p: 1,
-					frequency_penalty: 0,
-					presence_penalty: 0,
-					messages: [{role:"user",content:this.textValue}],
-					uid: _uuid,
-					mind_map_question: "",
-			}
-			this.scrollBottom();
-			this.textValue = "";
-			this.ajax
-					.post("https://gpt4.cocorobo.cn/chat", params)
-					.then((res) => {
-						if (res.data.FunctionResponse.result == "发送成功") {
-						} else {
-							this.chatLoading = false;
-							this.$message.warning(res.data.FunctionResponse.result);
-						}
-					})
-					.catch((e) => {
-						this.chatLoading = false;
-						console.log(e);
-					});
-			// this.$message.info(`发送:${this.textValue}`);
-			// this.textValue = "";
-			this.getAiContent(_uuid)
-		},
-		getAiContent(_uid) {
-			let _source = new EventSource(`https://gpt4.cocorobo.cn/stream/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
-			let _allText = "";
-			let _mdText = "";
-			const md = new MarkdownIt();
-			_source.onmessage = (_e) => {
-				if (_e.data.replace("'", "").replace("'", "") == "[DONE]") {
-					//对话已经完成
-					_mdText = _mdText.replace("_", "");
-					_source.close();
-					this.chatList.find((i) => i.uid == _uid).aiContent = _mdText;
-					this.chatList.find((i) => i.uid == _uid).isalltext = true;
-					this.chatList.find((i) => i.uid == _uid).isShowSynchronization = true;
-					this.chatList.find((i) => i.uid == _uid).loading = false;
-					this.chatLoading = false;
-					this.insertChat(_uid);
-					return;
-				} else {
-					//对话还在继续
-					let _text = "";
-					_text = _e.data.replaceAll("'", "");
-					if (_allText == "") {
-						_allText = _text.replace(/^\n+/, ""); //去掉回复消息中偶尔开头就存在的连续换行符
-					} else {
-						_allText += _text;
-					}
-					_mdText = _allText + "_";
-					_mdText = _mdText.replace(/\\n/g, "\n");
-					_mdText = _mdText.replace(/\\/g, "");
-					if (_allText.split("```").length % 2 == 0) _mdText += "\n```\n";
-					//转化返回的回复流数据
-					_mdText = md.render(_mdText);
-					this.chatList.find((i) => i.uid == _uid).aiContent = _mdText;
-					this.chatList.find((i) => i.uid == _uid).loading = false;
-					this.scrollBottom();
-					// 处理流数据
-				}
-			};
-		},
-		// 复制
-		copyText(_html) {
-			const div = document.createElement("div")
-			div.innerHTML = _html
-			const _text = div.innerText
-			navigator.clipboard.writeText(_text).then(_=>{
-			  this.$message.success("复制成功")
-			}, function(err) {
-				this.$message.error(`无法复制:${err}`)
-			});
-		},
-		// 保存对话
-		//保存消息
-		insertChat(_uid) {
-			let _data = this.chatList.find((i) => i.uid == _uid);
-			if (!_data) return;
-			let params = {
-				userId: this.userId,
-				userName: "qgt",
-				groupId: "602def61-005d-11ee-91d8-005056b8q12w",
-				answer: _data.aiContent,
-				problem: _data.content,
-				file_id: "",
-				alltext: _data.aiContent,
-				type: "chat",
-				filename: _data.filename,
-				session_name: `${this.userId}-pblCourse`,
-			};
-			this.ajax
-				.post("https://gpt4.cocorobo.cn/insert_chat", params)
-				.then((res) => {
-					console.log("保存对话")
-				});
-		},
-		// 获取对话记录
-		getChatList() {
-			return new Promise((resolve, reject) => {
-				this.chatList = [];
-				this.loading = true;
-				this.chatLoading = true;
-				let params = {
-					userid: this.userId,
-					groupid: "602def61-005d-11ee-91d8-005056b8q12w",
-					// session_name:``
-					session_name: `${this.userId}-pblCourse`,
-				};
-				this.ajax
-					.post("https://gpt4.cocorobo.cn/get_agent_park_chat", params)
-					.then((res) => {
-						let _data = JSON.parse(res.data.FunctionResponse);
-						if (_data.length > 0) {
-							console.log(_data)
-							let _chatList = [];
-							for (let i = 0; i < _data.length; i++) {
-								_chatList.push({
-									loading: false,
-									role: "user",
-									content: _data[i].problem,
-									uid: _data[i].id,
-									AI: "AI",
-									aiContent: _data[i].answer,
-									oldContent: _data[i].answer,
-									isShowSynchronization: false,
-									filename: _data[i].filename,
-									index: i,
-									is_mind_map: false,
-									fileid: _data[i].fileid,
-									createtime:_data[i].createtime
-								});
-							}
-							this.chatList = _chatList;
-							this.chatLoading = false;
-							this.loading = false;
-						} else {
-							//没有对话记录
-							this.loading = false;
-							this.chatLoading = false;
-						}
-						resolve();
-						this.scrollBottom();
-					})
-					.catch((err) => {
-						console.log(err);
-						this.$message.error("获取对话记录失败");
-						this.chatLoading = false;
-						this.scrollBottom();
-						resolve();
-					});
-			});
-		},
-		//对话触底
-		scrollBottom(){
-			this.$nextTick(()=>{
-				this.$refs.chatRef.scrollTop = this.$refs.chatRef.scrollHeight;
-			})
-		},
-		//清除对话
-		clearChat(){
-			this.chatList = [];
-			this.scrollBottom();
-		},
-	},
-
-	mounted() {
-		this.getChatList().then(_=>{
-			this.scrollBottom();
-		})
-	},
+  data() {
+    return {
+      loading: false,
+      chatLoading: false,
+      userId: this.$route.query["userid"],
+      chatList: [],
+      textValue: ""
+    };
+  },
+  methods: {
+    // 发送消息
+    send() {
+      if (this.chatLoading || this.loading)
+        return this.$message.info("请稍等...");
+      if (!this.textValue.trim()) return this.$message.info("请输入内容");
+      const _uuid = uuidv4();
+      this.chatLoading = true;
+      this.chatList.push({
+        role: "user",
+        content: `${this.textValue}`,
+        uid: _uuid,
+        AI: "AI",
+        aiContent: "",
+        oldContent: "",
+        filename: "",
+        index: this.chatList.length,
+        createtime: new Date().toLocaleString().replaceAll("/", "-"),
+        loading: true
+      });
+
+      // let params = {
+      // 	model: "gpt-3.5-turbo",
+      // 		temperature: 0,
+      // 		max_tokens: 4096,
+      // 		top_p: 1,
+      // 		frequency_penalty: 0,
+      // 		presence_penalty: 0,
+      // 		messages: [{role:"user",content:this.textValue}],
+      // 		uid: _uuid,
+      // 		mind_map_question: "",
+      // }
+      let params = JSON.stringify({
+        message: {
+          anthropic_version: "bedrock-2023-05-31",
+          max_tokens: 4096,
+          temperature: 0,
+          top_p: 1,
+          messages: [
+            {
+              role: "user",
+              content: this.textValue
+            }
+          ]
+        },
+        uid: _uuid,
+        model: "Claude 3 Sonnet" // Claude 3 Sonnet或者Claude 3 Haiku
+      });
+      this.scrollBottom();
+      this.textValue = "";
+      this.ajax
+        // .post("https://gpt4.cocorobo.cn/chat", params)
+        .post("https://claude3.cocorobo.cn/chat", params)
+        .then(res => {
+          if (res.data.FunctionResponse.result == "发送成功") {
+          } else {
+            this.chatLoading = false;
+            this.$message.warning(res.data.FunctionResponse.result);
+          }
+        })
+        .catch(e => {
+          this.chatLoading = false;
+          console.log(e);
+        });
+      // this.$message.info(`发送:${this.textValue}`);
+      // this.textValue = "";
+      this.getAiContent(_uuid);
+    },
+    getAiContent(_uid) {
+			let _source = new EventSource(`https://claude3.cocorobo.cn/streamChat/${_uid}`);
+      // let _source = new EventSource(`https://gpt4.cocorobo.cn/stream/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
+      let _allText = "";
+      let _mdText = "";
+      const md = new MarkdownIt();
+      _source.onmessage = _e => {
+        if (_e.data.replace("'", "").replace("'", "") == "[DONE]") {
+          //对话已经完成
+          _mdText = _mdText.replace("_", "");
+          _source.close();
+          this.chatList.find(i => i.uid == _uid).aiContent = _mdText;
+          this.chatList.find(i => i.uid == _uid).isalltext = true;
+          this.chatList.find(i => i.uid == _uid).isShowSynchronization = true;
+          this.chatList.find(i => i.uid == _uid).loading = false;
+          this.chatLoading = false;
+          this.insertChat(_uid);
+          return;
+        } else {
+          //对话还在继续
+          let _text = "";
+          _text = _e.data.replaceAll("'", "");
+          if (_allText == "") {
+            _allText = _text.replace(/^\n+/, ""); //去掉回复消息中偶尔开头就存在的连续换行符
+          } else {
+            _allText += _text;
+          }
+          _mdText = _allText + "_";
+          _mdText = _mdText.replace(/\\n/g, "\n");
+          _mdText = _mdText.replace(/\\/g, "");
+          if (_allText.split("```").length % 2 == 0) _mdText += "\n```\n";
+          //转化返回的回复流数据
+          _mdText = md.render(_mdText);
+          this.chatList.find(i => i.uid == _uid).aiContent = _mdText;
+          this.chatList.find(i => i.uid == _uid).loading = false;
+          this.scrollBottom();
+          // 处理流数据
+        }
+      };
+    },
+    // 复制
+    copyText(_html) {
+      const div = document.createElement("div");
+      div.innerHTML = _html;
+      const _text = div.innerText;
+      navigator.clipboard.writeText(_text).then(
+        _ => {
+          this.$message.success("复制成功");
+        },
+        function(err) {
+          this.$message.error(`无法复制:${err}`);
+        }
+      );
+    },
+    // 保存对话
+    //保存消息
+    insertChat(_uid) {
+      let _data = this.chatList.find(i => i.uid == _uid);
+      if (!_data) return;
+      let params = {
+        userId: this.userId,
+        userName: "qgt",
+        groupId: "602def61-005d-11ee-91d8-005056b8q12w",
+        answer: _data.aiContent,
+        problem: _data.content,
+        file_id: "",
+        alltext: _data.aiContent,
+        type: "chat",
+        filename: _data.filename,
+        session_name: `${this.userId}-pblCourse`
+      };
+      this.ajax
+        .post("https://gpt4.cocorobo.cn/insert_chat", params)
+        .then(res => {
+          console.log("保存对话");
+        });
+    },
+    // 获取对话记录
+    getChatList() {
+      return new Promise((resolve, reject) => {
+        this.chatList = [];
+        this.loading = true;
+        this.chatLoading = true;
+        let params = {
+          userid: this.userId,
+          groupid: "602def61-005d-11ee-91d8-005056b8q12w",
+          // session_name:``
+          session_name: `${this.userId}-pblCourse`
+        };
+        this.ajax
+          .post("https://gpt4.cocorobo.cn/get_agent_park_chat", params)
+          .then(res => {
+            let _data = JSON.parse(res.data.FunctionResponse);
+            if (_data.length > 0) {
+              console.log(_data);
+              let _chatList = [];
+              for (let i = 0; i < _data.length; i++) {
+                _chatList.push({
+                  loading: false,
+                  role: "user",
+                  content: _data[i].problem,
+                  uid: _data[i].id,
+                  AI: "AI",
+                  aiContent: _data[i].answer,
+                  oldContent: _data[i].answer,
+                  isShowSynchronization: false,
+                  filename: _data[i].filename,
+                  index: i,
+                  is_mind_map: false,
+                  fileid: _data[i].fileid,
+                  createtime: _data[i].createtime
+                });
+              }
+              this.chatList = _chatList;
+              this.chatLoading = false;
+              this.loading = false;
+            } else {
+              //没有对话记录
+              this.loading = false;
+              this.chatLoading = false;
+            }
+            resolve();
+            this.scrollBottom();
+          })
+          .catch(err => {
+            console.log(err);
+            this.$message.error("获取对话记录失败");
+            this.chatLoading = false;
+            this.scrollBottom();
+            resolve();
+          });
+      });
+    },
+    //对话触底
+    scrollBottom() {
+      this.$nextTick(() => {
+        this.$refs.chatRef.scrollTop = this.$refs.chatRef.scrollHeight;
+      });
+    },
+    //清除对话
+    clearChat() {
+      this.chatList = [];
+      this.scrollBottom();
+    }
+  },
+
+  mounted() {
+    this.getChatList().then(_ => {
+      this.scrollBottom();
+    });
+  }
 };
 </script>
 
 <style scoped>
 .chat {
-	width: 100%;
-	height: 100%;
-	background-color: #ffffff;
-	border-radius: 12px;
-	box-sizing: border-box;
-	border: solid 1px #f3f7fd;
-	box-shadow: 0 4px 10px 0 #1d388321;
+  width: 100%;
+  height: 100%;
+  background-color: #ffffff;
+  border-radius: 12px;
+  box-sizing: border-box;
+  border: solid 1px #f3f7fd;
+  box-shadow: 0 4px 10px 0 #1d388321;
 }
 
 .c_chat {
-	width: 100%;
-	height: calc(100% - 56px);
-	box-sizing: border-box;
-	padding: 15px;
-	overflow: auto;
+  width: 100%;
+  height: calc(100% - 56px);
+  box-sizing: border-box;
+  padding: 15px;
+  overflow: auto;
 }
 
 .c_c_item {
-	background-color: none;
+  background-color: none;
 }
 
 .c_c_i_user {
-	width: 100%;
-	height: auto;
-	display: flex;
-	justify-content: flex-end;
-	align-items: flex-start;
-	margin-bottom: 10px;
+  width: 100%;
+  height: auto;
+  display: flex;
+  justify-content: flex-end;
+  align-items: flex-start;
+  margin-bottom: 10px;
 }
 
 .c_c_i_u_message {
-	height: auto;
-	width: auto;
-	max-width: calc(100% - 50px - 40px);
-	display: flex;
-	flex-direction: column;
-	align-items: flex-end;
-	margin-right: 5px;
+  height: auto;
+  width: auto;
+  max-width: calc(100% - 50px - 40px);
+  display: flex;
+  flex-direction: column;
+  align-items: flex-end;
+  margin-right: 5px;
 }
 .c_c_i_u_m_top {
-	margin-bottom: 10px;
-	display: flex;
-	align-items: flex-end;
+  margin-bottom: 10px;
+  display: flex;
+  align-items: flex-end;
 }
 
 .c_c_i_u_m_top > span {
-	margin-left: 5px;
+  margin-left: 5px;
 }
 
 .c_c_i_u_m_bottom {
-	display: flex;
-	align-items: flex-end;
+  display: flex;
+  align-items: flex-end;
 }
 
 .coptText {
-	min-width: 15px;
-	min-height: 15px;
-	display: block;
-	background: url("../../../../assets/icon/pblCourse/copyIcon.png") no-repeat;
-	background-size: 100% 100%;
-	margin: 0px 10px 6px 10px;
-	cursor: pointer;
+  min-width: 15px;
+  min-height: 15px;
+  display: block;
+  background: url("../../../../assets/icon/pblCourse/copyIcon.png") no-repeat;
+  background-size: 100% 100%;
+  margin: 0px 10px 6px 10px;
+  cursor: pointer;
 }
 
 .c_c_i_u_m_content {
-	width: auto;
-	height: auto;
-	padding: 10px;
-	background-color: #e2eeff;
-	border-radius: 8px 2px 8px 8px;
-	border: solid 1px #000000e5;
+  width: auto;
+  height: auto;
+  padding: 10px;
+  background-color: #e2eeff;
+  border-radius: 8px 2px 8px 8px;
+  border: solid 1px #000000e5;
 }
 
 .c_c_i_u_avatar {
-	width: 45px;
-	height: 45px;
-	margin: 0px 0 0 10px;
+  width: 45px;
+  height: 45px;
+  margin: 0px 0 0 10px;
 }
 
 .c_c_i_ai {
-	margin-top: 10px;
-	width: 100%;
-	height: auto;
-	display: flex;
-	align-items: flex-start;
-	margin-bottom: 10px;
+  margin-top: 10px;
+  width: 100%;
+  height: auto;
+  display: flex;
+  align-items: flex-start;
+  margin-bottom: 10px;
 }
 
 .c_c_i_ai_avatar {
-	width: 45px;
-	height: 45px;
-	margin: 0px 0 0 10px;
+  width: 45px;
+  height: 45px;
+  margin: 0px 0 0 10px;
 }
 
 .c_c_i_ai_message {
-	height: auto;
-	width: auto;
-	max-width: calc(100% - 50px - 40px);
-	display: flex;
-	flex-direction: column;
-	align-items: flex-start;
-	margin-left: 5px;
+  height: auto;
+  width: auto;
+  max-width: calc(100% - 50px - 40px);
+  display: flex;
+  flex-direction: column;
+  align-items: flex-start;
+  margin-left: 5px;
 }
 .c_c_i_ai_m_top {
-	display: flex;
-	align-items: flex-end;
-	margin-bottom: 10px;
+  display: flex;
+  align-items: flex-end;
+  margin-bottom: 10px;
 }
 
 .c_c_i_ai_m_top > span {
-	margin-left: 5px;
+  margin-left: 5px;
 }
 
 .c_c_i_ai_m_bottom {
-	display: flex;
-	align-items: flex-end;
+  display: flex;
+  align-items: flex-end;
 }
 
 .c_c_i_ai_m_content {
-	min-width: 40px;
-	min-height: 25px;
-	width: auto;
-	height: auto;
-	padding: 10px;
-	background-color: #ffffff;
-	border-radius: 2px 8px 8px 8px;
-	border: solid 1px #000000e5;
+  min-width: 40px;
+  min-height: 25px;
+  width: auto;
+  height: auto;
+  padding: 10px;
+  background-color: #ffffff;
+  border-radius: 2px 8px 8px 8px;
+  border: solid 1px #000000e5;
 }
 
 .chatContent >>> ol {
-	margin-left: 25px;
+  margin-left: 25px;
 }
 
 .chatContent >>> ul {
-	margin-left: 25px;
+  margin-left: 25px;
 }
 
-.chatTime{
-	font-size: 14px;
-	margin: 0 10px;
-	color: #2c2f3b;
+.chatTime {
+  font-size: 14px;
+  margin: 0 10px;
+  color: #2c2f3b;
 }
 
-.c_controls{
-	width: 100%;
-	height: 30px;
+.c_controls {
+  width: 100%;
+  height: 30px;
 }
 
-.c_controls>span{
-	max-height: 30px;
-	width: auto;
-	padding: 5px 10px;
-	font-size: 14px;
-	border-radius: 15px;
-	box-shadow: 0 0 2px 0px gray;
-	margin-left: 10px;
-	cursor: pointer;
+.c_controls > span {
+  max-height: 30px;
+  width: auto;
+  padding: 5px 10px;
+  font-size: 14px;
+  border-radius: 15px;
+  box-shadow: 0 0 2px 0px gray;
+  margin-left: 10px;
+  cursor: pointer;
 }
 
-.c_controls>span:hover{
-	background-color: #f3f7fd;
+.c_controls > span:hover {
+  background-color: #f3f7fd;
 }
 
 .c_bottom {
-	width: 100%;
-	height: 56px;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	box-sizing: border-box;
-	border-top: solid 0.5px #e7e7e7;
+  width: 100%;
+  height: 56px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  box-sizing: border-box;
+  border-top: solid 0.5px #e7e7e7;
 }
 
 .c_b_record {
-	width: 30px;
-	height: 30px;
-	display: flex;
-	justify-content: center;
-	align-items: center;
+  width: 30px;
+  height: 30px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
 }
 
 .c_b_record > span {
-	width: 24px;
-	height: 24px;
-	background-image: url("../../../../assets/icon/pblCourse/recordIcon.png");
-	background-size: 100% 100%;
-	display: flex;
-	justify-content: center;
-	align-items: center;
+  width: 24px;
+  height: 24px;
+  background-image: url("../../../../assets/icon/pblCourse/recordIcon.png");
+  background-size: 100% 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
 }
 
 .c_b_inputArea {
-	width: calc(100% - 100px);
-	background-color: #f3f3f3;
-	border-radius: 50px;
-	height: 80%;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	margin: 0 15px;
+  width: calc(100% - 100px);
+  background-color: #f3f3f3;
+  border-radius: 50px;
+  height: 80%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin: 0 15px;
 }
 
 .c_b_input {
-	width: calc(100% - 40px);
-	margin-right: 10px;
+  width: calc(100% - 40px);
+  margin-right: 10px;
 }
 
 .c_b_input >>> .el-input__inner {
-	border: none;
-	background-color: #f3f3f3;
-	outline: none;
-	border-radius: 50px 0 0 50px;
-	font-size: 1.2em;
+  border: none;
+  background-color: #f3f3f3;
+  outline: none;
+  border-radius: 50px 0 0 50px;
+  font-size: 1.2em;
 }
 
 .c_b_inputArea > span {
-	width: 24px;
-	height: 24px;
-	background-image: url("../../../../assets/icon/pblCourse/fileIcon.png");
-	background-size: 100% 100%;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	margin-right: 10px;
-	cursor: pointer;
+  width: 24px;
+  height: 24px;
+  background-image: url("../../../../assets/icon/pblCourse/fileIcon.png");
+  background-size: 100% 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin-right: 10px;
+  cursor: pointer;
 }
 
 .c_b_send {
-	width: 40px;
-	height: 40px;
-	border-radius: 50%;
-	background-color: #3681fc;
-	cursor: pointer;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	cursor: pointer;
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+  background-color: #3681fc;
+  cursor: pointer;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
 }
 
 .c_b_send > span {
-	width: 60%;
-	height: 60%;
-	background-image: url("../../../../assets/icon/pblCourse/sendIcon.png");
-	background-size: 100% 100%;
+  width: 60%;
+  height: 60%;
+  background-image: url("../../../../assets/icon/pblCourse/sendIcon.png");
+  background-size: 100% 100%;
 }
 </style>

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.