yinbangzhong
2024-08-27 361d46d0e2a9c5f795f766ed819037faef612167
src/views/sessionManager/index.vue
@@ -87,44 +87,113 @@
                <template #avatar>
                  <img
                    class="icon-user-jpg"
                    src="../../assets/images/icon-chart.png"
                    src="../../assets/images/icon-picture.png"
                    alt="本地图片"
                  />
                </template>
                <template #content>
                  <a-card v-if="isExistTip(sessionDetail.content)">
                    <div  :class="{ chatItemAnswer: theme === 'light' }"
                      :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}" style="border: none;display: inline;"  v-for="(item,tipIndex) in tipMatch(sessionDetail)"
                    <div
                      :class="{ chatItemAnswer: theme === 'light' }"
                      :style="{
                        backgroundColor:
                          theme === 'light' ? '#ffffff' : '#000000',
                      }"
                      style="border: none;"
                      v-for="(breakContent, breakIndex) in breakLine(sessionDetail.content)"
                    >
                      <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)"
                        >
                      <span v-if="tipIndex == 0">
                        {{ sessionDetail.content.substring(0, item.index) }}
                        <a-tooltip background-color="#3491FA" :content="getTipContent(
                          messagenList.reference,
                          index
                        )">
                          <img style="width: 20px;height: 20px" :src="tipImage" />
                        {{ 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>
                        {{ 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" />
                          <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 :class="{ chatItemAnswer: theme === 'light' }"
                         :style="{
                  <a-card v-else>
                    <a-textarea
                      readonly
                      auto-size
                      v-model="sessionDetail.content"
                      :class="{ chatItemAnswer: theme === 'light' }"
                      :style="{
                      backgroundColor:
                        theme === 'light' ? '#ffffff' : '#000000',
                    }" style="border: none">
                      {{ sessionDetail.content }}
                    </div>
                    }"
                      style="border: none"
                    >
                    </a-textarea>
                  </a-card>
                </template>
                <!-- <div>{{ sessionDetail.role === 'assistant' }}</div> -->
@@ -174,7 +243,7 @@
                <template #avatar>
                  <img
                    class="icon-user-jpg"
                    src="../../assets/images/icon-chart.png"
                    src="../../assets/images/icon-picture.png"
                    alt="本地图片"
                  />
                </template>
@@ -355,6 +424,12 @@
        </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>-->
      <docx v-if="documenttype == 'docx'" :previewSrc="previewSrc"></docx>
      <excel v-if="documenttype == 'excel'" :previewSrc="previewSrc"></excel>
      <txtPdf v-if="documenttype == 'txtPdf'" :previewSrc="previewSrc"></txtPdf>
    </a-modal>
    <a-modal
      v-model:visible="visible"
      title="修改名称"
@@ -383,7 +458,7 @@
  </div>
</template>
<script setup lang="ts">
  import { useAppStore, useUserStore } from '@/store';
  import { useAppStore, userModelState, useUserStore } from '@/store';
  import {
    computed,
    nextTick,
@@ -423,7 +498,11 @@
  import pdfImg4 from '@/assets/session/icon-txt.png';
  import pdfImg5 from '@/assets/session/txt.png';
  import tipImage from '@/assets/session/tip.png';
  import { number } from "@intlify/core-base";
  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";
  // const url = ref('../../assets/session/PDF.png');
@@ -467,7 +546,13 @@
  const fileInput = ref(null);
  const chatDataMeg = reactive({});
  const visible = ref(false);
  const fileVisible = ref(false);
  let toStop = false;
  let documenttype = ref('docx');
  let previewSrc = ref('');
  const modelStore = userModelState();
  const httpUrl = modelStore.hrefUrl;
  const rules = {
    name: [
@@ -493,25 +578,32 @@
    }
  };
  let dataItem = [];
  const isExistTip=(message:string):boolean=>{
  const isExistTip = (message: string): boolean => {
    if (/##[0-9]\$\$/.test(message)) {
      return true;
    } else {
      return false;
    }
  };
  const breakLine = (message: string): string[] => {
    //按\n分割字符串
    let arr = message.split('\n');
    return arr
  }
  const tipMatch = (session: any): any[] => {
  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 preTip = 0;
    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;
  }
  };
  const getTxt = (data, role, message, index) => {
    if (isExistTip(message)) {
@@ -527,26 +619,22 @@
  };
  const getTipContent = (data, index): string => {
    let maxSimilarityContent = "";
    let maxSimilarityContent = '';
    let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0;
    let maxSimilarity = 0;
    data[i].chunks.forEach((chunk) => {
        if (chunk.similarity > maxSimilarity) {
          maxSimilarity = chunk.similarity;
          maxSimilarityContent = chunk.content_with_weight;
        }
      if (chunk.similarity > maxSimilarity) {
        maxSimilarity = chunk.similarity;
        maxSimilarityContent = chunk.content_with_weight;
      }
    );
    });
    return maxSimilarityContent;
  };
  const clickHref = (item) => {
    // return Message.warning('暂无法查看');
    // window.open(`/api/v1/document/get/${item.doc_id}`, '_blank');
    downloadFile({
      url: `/api/v1/document/get/${item.doc_id}`,
      filename: item.doc_name,
    });
  const clickHref = async (item) => {
    documenttype.value = item.doc_name.split('.').pop();
    previewSrc.value = httpUrl + `/api/v1/document/get/${item.doc_id}`;
    fileVisible.value = true;
  };
  const downloadFile = ({
@@ -610,7 +698,7 @@
  const selectFileCallback = (data) => {
    console.log(data, 'selectFileCallback');
    uploaditemList.value = data;
    uploaditemList.value = [...uploaditemList.value, ...data];
  };
  let onFileSelectedLoading = ref(false);
@@ -695,6 +783,7 @@
  // 发送
  const sentClick = () => {
    sendMessage('click');
    uploaditemList.value = [];
  };
  // 重新生成
  const reGenerate = () => {
@@ -720,7 +809,6 @@
            //新建会话
            // 如果有会话id
            console.log(inputMsg.value, '新建会话名称');
            const res = await addSessionApi({
              dialog_id: '',
              conversation_desc: inputMsg.value,
@@ -729,9 +817,15 @@
            if (res.code == 200) {
              // console.log(res.data.conversation_id);
              activeSessionId.value = res.data?.conversation_id;
              startChat(inputMsg.value);
              inputMsg.value = '';
              // queryNewSessionDetail(res.data?.conversation_id);
              const { code, data } = await getSessionDetailsApi(
                res.data?.conversation_id
              );
              if (code === 200) {
                console.log(data, '新建会话详情');
                Object.assign(chatObj, data);
                startChat(inputMsg.value);
                inputMsg.value = '';
              }
            } else {
              Message.error('创建会话失败,请重试');
            }
@@ -844,7 +938,6 @@
    sessionDetailList.value = sessionDetailList.value
      .splice(0, sessionDetailList.value.length - 2)
      .concat(lastArr);
    console.log(sessionDetailList.value, 'sessionDetailList2');
    console.log(chatObj, 'chatObj对象');
    chatObj.message = chatObj.message.concat(lastArr);