zhangxiao
2024-08-29 234c222e4fd9d24242440e0207bd5ccfa1bac471
src/views/sessionManager/index.vue
@@ -78,9 +78,38 @@
                  />
                </template>
                <template #content>
                  <div :class="{ chartUserText: theme === 'light' }"
                    >{{ sessionDetail.content }}
                  <div :class="{ chartUserText: theme === 'light' }">
                    {{ sessionDetail.content }}
                    <!-- <a-input
                      :style="{ width: '100%' }"
                      v-model="sessionDetail.content"
                      v-if="isEdit"
                    />
                    <div v-else>
                      {{ sessionDetail.content }}
                    </div> -->
                  </div>
                  <!-- <div v-if="!isEdit">
                    <span
                      class="action"
                      v-if="index != 0"
                      @click="copy(sessionDetail.content)"
                    >
                      <icon-copy /> 复制
                    </span>
                    <span class="action" @click="edit()">
                      <icon-pen /> 编辑
                    </span>
                  </div>
                  <a-space v-else>
                    <a-button type="outline" size="mini" @click="cancelEdit(1)"
                      >取消</a-button
                    >
                    <a-button type="primary" size="mini" @click="cancelEdit(2)"
                      >确定</a-button
                    >
                  </a-space> -->
                </template>
              </a-comment>
              <a-comment v-else-if="sessionDetail.role === 'assistant'">
@@ -99,46 +128,94 @@
                        backgroundColor:
                          theme === 'light' ? '#ffffff' : '#000000',
                      }"
                      style="border: none; display: inline"
                      v-for="(item, tipIndex) in tipMatch(sessionDetail)"
                      style="border: none"
                      v-for="(breakContent, breakIndex) in breakLine(
                        sessionDetail.content
                      )"
                    >
                      <span v-if="tipIndex == 0">
                        {{ sessionDetail.content.substring(0, item.index) }}
                        <a-tooltip
                          background-color="#3491FA"
                          :content="
                            getTipContent(messagenList.reference, index)
                          "
                      <div
                        :class="{ chatItemAnswer: theme === 'light' }"
                        :style="{
                          backgroundColor:
                            theme === 'light' ? '#ffffff' : '#000000',
                        }"
                        style="border: none"
                        v-if="isExistTip(breakContent)"
                      >
                        <div
                          :class="{ chatItemAnswer: theme === 'light' }"
                          :style="{
                            backgroundColor:
                              theme === 'light' ? '#ffffff' : '#000000',
                          }"
                          style="border: none"
                          v-for="(item, tipIndex) in tipMatch(breakContent)"
                        >
                          <img
                            style="width: 20px; height: 20px"
                            :src="tipImage"
                          />
                        </a-tooltip>
                      </span>
                      <span v-else>
                        {{
                          sessionDetail.content.substring(
                            item.preIndex + item.item.length,
                            item.index
                          )
                        }}
                        <a-tooltip
                          background-color="#3491FA"
                          :content="
                            getTipContent(messagenList.reference, index)
                          "
                        >
                          <img
                            style="width: 20px; height: 20px"
                            :src="tipImage"
                          />
                        </a-tooltip>
                      </span>
                          <span v-if="tipIndex == 0">
                            {{ breakContent.substring(0, item.index) }}
                            <a-tooltip
                              background-color="#3491FA"
                              :content="
                                getTipContent(messagenList.reference, index)
                              "
                            >
                              <img
                                style="width: 20px; height: 20px"
                                :src="tipImage"
                              />
                            </a-tooltip>
                          </span>
                          <span v-else-if="tipIndex == item.len - 1">
                            {{
                              breakContent.substring(
                                item.preIndex + item.item.length,
                                item.index
                              )
                            }}
                            <a-tooltip
                              background-color="#3491FA"
                              :content="
                                getTipContent(messagenList.reference, index)
                              "
                            >
                              <img
                                style="width: 20px; height: 20px"
                                :src="tipImage"
                              />
                            </a-tooltip>
                            {{ breakContent.substring(item.index + 5) }}
                          </span>
                          <span v-else>
                            {{
                              breakContent.substring(
                                item.preIndex + item.item.length,
                                item.index
                              )
                            }}
                            <a-tooltip
                              background-color="#3491FA"
                              :content="
                                getTipContent(messagenList.reference, index)
                              "
                            >
                              <img
                                style="width: 20px; height: 20px"
                                :src="tipImage"
                              />
                            </a-tooltip>
                          </span>
                        </div>
                      </div>
                      <div v-else>
                        {{ breakContent }}
                      </div>
                    </div>
                  </a-card>
                  <a-card v-else>
                    <div
                    <a-textarea
                      readonly
                      auto-size
                      :default-value="chartText(sessionDetail.content)"
                      :class="{ chatItemAnswer: theme === 'light' }"
                      :style="{
                        backgroundColor:
@@ -146,9 +223,20 @@
                      }"
                      style="border: none"
                    >
                      {{ sessionDetail.content }}
                    </div>
                    </a-textarea>
                  </a-card>
                  <!-- <div class="prompt">
                    <ul>
                      <li class="prompt-item" @click="copyText('43234')">
                        <span>
                          344343klsdjkjksdjkjksdjk就开始大家看数据库登记卡受打击凯撒登记卡受打击凯撒登记卡受打击凯撒的43</span
                        >
                        <span style="margin-left: 20px">
                          <icon-right />
                        </span>
                      </li>
                    </ul>
                  </div> -->
                </template>
                <!-- <div>{{ sessionDetail.role === 'assistant' }}</div> -->
                <template #actions>
@@ -191,6 +279,7 @@
                  >
                    <icon-refresh /> 重新生成
                  </span>
                  <!-- <span class="action"><icon-to-bottom />下载 </span> -->
                </template>
              </a-comment>
              <a-comment v-else-if="sessionDetail.role === 'last'">
@@ -284,12 +373,18 @@
                  display: flex;
                  justify-content: space-between;
                "
                class="uploadFileDis"
              >
                <updataFile
                  ref="fileInput"
                  :sessionId="activeSessionId"
                  @selectFileCallback="selectFileCallback"
                ></updataFile>
                <!-- <uploadFile
                  ref="fileInput"
                  :sessionId="activeSessionId"
                  @selectFileCallback="selectFileCallback"
                ></uploadFile> -->
                <a-button
                  :disabled="chatDis"
                  @click="sentClick"
@@ -377,6 +472,11 @@
          ></smartAi>
        </div>
      </a-col>
      <a-col :span="23" v-show="agentType == '5'">
        <div class="center">
          <seniorAgentSession :modalObj="agentObj"></seniorAgentSession>
        </div>
      </a-col>
    </a-row>
    <a-modal title=" " v-model:visible="fileVisible" :footer="false" fullscreen>
      <!--      <docx  previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>-->
@@ -430,9 +530,11 @@
  import chatMenu from '@/views/sessionManager/components/chatMenu.vue';
  import AddSession from '@/views/sessionManager/components/addSession.vue';
  import agentSession from '@/views/sessionManager/components/agentSession.vue';
  import seniorAgentSession from '@/views/sessionManager/components/seniorAgentSession.vue';
  import historySession from '@/views/sessionManager/components/historySession.vue';
  import smartAi from '@/views/sessionManager/components/smartAi.vue';
  import updataFile from '@/views/sessionManager/components/updataFile.vue';
  import EventBus from '@/utils/EventBus';
  import {
    addSessionApi,
@@ -456,6 +558,8 @@
  import docx from '@/views/dmx/knowledgeLib/components/docx.vue';
  import excel from '@/views/dmx/knowledgeLib/components/excel.vue';
  import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue';
  import { is } from 'immutable';
  import uploadFile from './components/uploadFile.vue';
  // const url = ref('../../assets/session/PDF.png');
@@ -496,7 +600,7 @@
  const uploadRef = ref();
  const files = ref([]);
  const file = ref('');
  const fileInput = ref(null);
  const fileInput = ref();
  const chatDataMeg = reactive({});
  const visible = ref(false);
  const fileVisible = ref(false);
@@ -539,13 +643,32 @@
    }
  };
  const tipMatch = (session: any): any[] => {
  const breakLine = (message: string): string[] => {
    //按\n分割字符串
    let arr = message.split('\n');
    return arr;
  };
  const chartText = (message: string): string => {
    //去除所有的#和**
    let arr = message.replace(/\*\*|\#\#\#/g, '');
    return arr;
  };
  const tipMatch = (msg: string): any[] => {
    //match session.content中的##[0-9]$$的索引
    let indexs: any[] = [];
    let preTip = 0;
    session.content.match(/##([0-9]+)\$\$/g)?.map((item) => {
      let i = session.content.indexOf(item);
      indexs.push({ index: i, item: item, preIndex: preTip });
    let matches = msg.match(/##([0-9]+)\$\$/g);
    matches?.map((item) => {
      let i = msg.indexOf(item);
      indexs.push({
        index: i,
        item: item,
        preIndex: preTip,
        len: matches.length,
      });
      preTip = i;
    });
    return indexs;
@@ -643,7 +766,8 @@
  };
  const selectFileCallback = (data) => {
    console.log(data, 'selectFileCallback');
    // debugger;
    // console.log(data, 'selectFileCallback');
    uploaditemList.value = [...uploaditemList.value, ...data];
  };
@@ -657,6 +781,19 @@
  const { toClipboard } = useClipboard();
  const copy = async (text) => {
    await toClipboard(text); //参数为要复制的文本
  };
  const isEdit = ref(false);
  const edit = () => {
    isEdit.value = !isEdit.value;
  };
  const cancelEdit = (val) => {
    if (val == 1) {
      isEdit.value = !isEdit.value;
    } else {
      //编辑保存
      isEdit.value = !isEdit.value;
    }
  };
  const DialogList = async () => {
@@ -729,6 +866,7 @@
  // 发送
  const sentClick = () => {
    sendMessage('click');
    uploaditemList.value = [];
  };
  // 重新生成
  const reGenerate = () => {
@@ -1089,6 +1227,33 @@
        }
      }
    }
    // .uploadFileDis {
    //   :deep(.arco-upload-list-type-text) {
    //     display: none;
    //   }
    // }
    .prompt {
      ul {
        margin: 0;
        padding: 0;
        display: flex;
      }
      ul > li {
        list-style-type: none;
      }
      .prompt-item {
        display: flex;
        justify-content: space-between;
        background-color: #fff;
        cursor: pointer;
        border-radius: 8px;
        padding: 10px;
        border: #e5e5e5;
        &:hover {
          background-color: #eee;
        }
      }
    }
    .card-btn-1 {
      margin: 8px 15px;
@@ -1232,6 +1397,19 @@
        color: #333;
        margin-top: 4px;
      }
      :deep(.arco-card-body) {
        padding: 0;
        border-radius: 10px;
      }
      :deep(.arco-textarea) {
        padding-top: 10px !important;
      }
      :deep(.arco-comment-inner-content) {
        border-radius: 10px;
      }
      :deep(.arco-card-bordered) {
        border-radius: 10px;
      }
      .icon-user-jpg {
        border: 1px solid #d9d9d9;