| | |
| | | /> |
| | | </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'"> |
| | |
| | | backgroundColor: |
| | | theme === 'light' ? '#ffffff' : '#000000', |
| | | }" |
| | | style="border: none;" |
| | | v-for="(breakContent, breakIndex) in breakLine(sessionDetail.content)" |
| | | 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)"> |
| | | 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;" |
| | | backgroundColor: |
| | | theme === 'light' ? '#ffffff' : '#000000', |
| | | }" |
| | | style="border: none" |
| | | v-for="(item, tipIndex) in tipMatch(breakContent)" |
| | | > |
| | | <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"> |
| | | {{ |
| | | <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> |
| | | <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> |
| | | <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> |
| | |
| | | <a-textarea |
| | | readonly |
| | | auto-size |
| | | v-model="sessionDetail.content" |
| | | :default-value="chartText(sessionDetail.content)" |
| | | :class="{ chatItemAnswer: theme === 'light' }" |
| | | :style="{ |
| | | backgroundColor: |
| | | theme === 'light' ? '#ffffff' : '#000000', |
| | | }" |
| | | backgroundColor: |
| | | theme === 'light' ? '#ffffff' : '#000000', |
| | | }" |
| | | style="border: none" |
| | | > |
| | | </a-textarea> |
| | | <!-- <div v-html="chartText(sessionDetail.content)"> |
| | | |
| | | </div> --> |
| | | </a-card> |
| | | </template> |
| | | <!-- <div>{{ sessionDetail.role === 'assistant' }}</div> --> |
| | |
| | | > |
| | | <icon-refresh /> 重新生成 |
| | | </span> |
| | | <!-- <span class="action"><icon-to-bottom />下载 </span> --> |
| | | </template> |
| | | </a-comment> |
| | | <a-comment v-else-if="sessionDetail.role === 'last'"> |
| | |
| | | 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 { is } from 'immutable'; |
| | | |
| | | // const url = ref('../../assets/session/PDF.png'); |
| | | |
| | |
| | | const breakLine = (message: string): string[] => { |
| | | //按\n分割字符串 |
| | | let arr = message.split('\n'); |
| | | return arr |
| | | } |
| | | 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; |
| | | let matches=msg.match(/##([0-9]+)\$\$/g) |
| | | 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 }); |
| | | indexs.push({ |
| | | index: i, |
| | | item: item, |
| | | preIndex: preTip, |
| | | len: matches.length, |
| | | }); |
| | | preTip = i; |
| | | }); |
| | | return indexs; |
| | |
| | | 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 () => { |
| | | const { code, data } = await getDialogListApi(); |
| | | if (code === 200) { |