From b3b34fa409762b44e6fd3c89e651f8c465556a48 Mon Sep 17 00:00:00 2001 From: zhangxiao <898441624@qq.com> Date: 星期五, 23 八月 2024 19:25:05 +0800 Subject: [PATCH] Merge branch 'master' of http://192.168.5.5:10010/r/web/flow_web --- src/views/authority/role/index.vue | 31 ++++ src/views/sessionManager/components/agentSession.vue | 132 ++++++++++++--------- src/views/sessionManager/index.vue | 147 ++++++++++++++++++------ src/api/authority.ts | 4 src/views/sessionManager/components/historySession.vue | 1 src/views/dmx/knowledgeLib/config.vue | 6 src/views/login/components/login-form.vue | 4 7 files changed, 224 insertions(+), 101 deletions(-) diff --git a/src/api/authority.ts b/src/api/authority.ts index 697a8b3..8f855da 100644 --- a/src/api/authority.ts +++ b/src/api/authority.ts @@ -175,9 +175,9 @@ } export function KnowledgeList() { - return axios.get<Result<Knowledge>>('/base/system/knowledge/list'); + return axios.get<Result<Knowledge>>('/api/v1/kb/list'); } export function DialogList() { - return axios.get<Result<Knowledge>>('/base/system/dialog/list'); + return axios.get<Result<Knowledge>>('/api/v1/dialog/list'); } diff --git a/src/views/authority/role/index.vue b/src/views/authority/role/index.vue index 300fc72..f049890 100644 --- a/src/views/authority/role/index.vue +++ b/src/views/authority/role/index.vue @@ -285,6 +285,8 @@ import Authheader from '@/views/authority/components/authheader.vue'; import router from "@/router"; import { queryCanvasList } from "@/api/Agent"; + import { getUserResources } from "@/utils/auth"; + import { forEach } from "lodash"; let treeDataMenu = ref([]); let checkedKeysMenu = ref([]); @@ -667,18 +669,43 @@ }; + let userResources = JSON.parse(getUserResources()); + const isExist = (val): boolean => { + let isok = false; + userResources.forEach((r) => { + if (val == r.menuId) { + isok = true; + } + }); + return isok; + }; + const removeChild = (nodes,newT) => { + nodes.forEach((child) => { + if (isExist(child.menuId)){ + newT.push(child); + let nt = []; + if (child.children?.length > 0) { + removeChild(child.children, nt); + child.children = nt; + } + } + }); + }; + const MenuData = async (key) => { await ResourceList(key).then((res) => { + let newTree=[] + removeChild(res.rows,newTree) treeDataMenu.value = [...res.rows]; }); }; KnowledgeList().then((res) => { - knowledgeList.value = res.rows; + knowledgeList.value = res.data; }); DialogList().then((res) => { - DialogsList.value = res.rows; + DialogsList.value = res.data; }); queryCanvasList(null).then((canvas) => { AgentList= canvas.data diff --git a/src/views/dmx/knowledgeLib/config.vue b/src/views/dmx/knowledgeLib/config.vue index 48c6b6a..088b890 100644 --- a/src/views/dmx/knowledgeLib/config.vue +++ b/src/views/dmx/knowledgeLib/config.vue @@ -47,7 +47,7 @@ </a-select> </a-form-item> <a-form-item field="parser_id" label="瑙f瀽鏂规硶"> - <a-select v-model="form.parser_id" placeholder="璇烽�夋嫨" :disabled="kbObj.chunk_num && kbObj.token_num " > + <a-select v-model="form.parser_id" placeholder="璇烽�夋嫨" :disabled="!!(kbObj.chunk_num && kbObj.token_num)" > <a-option v-for="item in parser_ids" :key="item.value" :label="item.name" :value="item.value"></a-option> </a-select> </a-form-item> @@ -314,7 +314,7 @@ Object.assign(form,{ }); - formRef.value.resetFields(); + // formRef.value.resetFields(); } const queryModel = async (params) => { @@ -331,7 +331,7 @@ const changekbObj = (value) => { nextTick(()=>{ - formRef.value.resetFields(); + // formRef.value.resetFields(); kbObj = value; console.log(kbObj, 'kbObj'); let configObj = { diff --git a/src/views/login/components/login-form.vue b/src/views/login/components/login-form.vue index e615cf8..8656e4a 100644 --- a/src/views/login/components/login-form.vue +++ b/src/views/login/components/login-form.vue @@ -12,11 +12,11 @@ > <a-form-item field="email" - :rules="[{ required: true, message: '璇疯緭鍏ラ偖绠�' }]" + :rules="[{ required: true, message: '璇疯緭鍏ョ敤鎴峰悕' }]" :validate-trigger="['change', 'blur']" hide-label > - <a-input v-model="userInfo.email" placeholder="璇疯緭鍏ラ偖绠�"> + <a-input v-model="userInfo.email" placeholder="璇疯緭鍏ョ敤鎴峰悕"> <template #prefix> <icon-user /> </template> diff --git a/src/views/sessionManager/components/agentSession.vue b/src/views/sessionManager/components/agentSession.vue index 0c25dda..9c70b48 100644 --- a/src/views/sessionManager/components/agentSession.vue +++ b/src/views/sessionManager/components/agentSession.vue @@ -9,7 +9,13 @@ trigger="click" > <a-button border - >{{agentTitle}} + > + <span style=" + width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + ">{{ from.name }}</span> <icon-down style="margin-left: 4px" /> </a-button> <template #content> @@ -75,7 +81,7 @@ auto-size v-model="sessionDetail.content" :class="{ chatItemAnswer: theme === 'light' }" - :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}" + :style="{ backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}" style="border: none" > </a-textarea> @@ -108,14 +114,14 @@ > </a-textarea> </template> -<!-- <template #actions>--> -<!-- <div class="action"--> -<!-- @click="stopChat"--> -<!-- style="background: var(--color-bg-2);color: var(--color-primary-light-4);" v-if="displayedText != ''">--> -<!-- <icon-record-stop />--> -<!-- 鍋滄鐢熸垚--> -<!-- </div>--> -<!-- </template>--> + <template #actions> + <div class="action" + @click="stopChat" + style="background: var(--color-bg-2);color: var(--color-primary-light-4);" v-if="displayedText != ''"> + <icon-record-stop /> + 鍋滄鐢熸垚 + </div> + </template> </a-comment> </div> <!-- <div class="chartStart" v-if="isStart" @click="startChat" @@ -141,9 +147,8 @@ maxRows: 5, }" /> - <div style="height: 40px"></div> - <div class="btn-send"> - <!-- <icon-send size="32" /> --> + <div style="width: 100%;display: flex;justify-content: space-between"> + <span></span> <a-button :disabled="chatDis" @click="sentClick" @@ -155,11 +160,24 @@ </a-button > </div> +<!-- <div class="btn-send">--> +<!-- <!– <icon-send size="32" /> –>--> +<!-- <a-button--> +<!-- :disabled="chatDis"--> +<!-- @click="sentClick"--> +<!-- type="text"--> +<!-- style="border-radius: 24px"--> +<!-- :loading="loading"--> +<!-- >--> +<!-- <icon-send size="32" style="color: #0960bd;"/>--> +<!-- </a-button--> +<!-- >--> +<!-- </div>--> </div> <a-modal v-model:visible="visible" title="淇敼鍚嶇О" @before-open="handleOpened" @cancel="handleCancel" :footer="false" title-align="start"> - <a-form ref="formRef" :rules="rules" :model="agentObj" @submit="handleSubmit" > + <a-form ref="formRef" :rules="rules" :model="from" @submit="handleSubmit" > <a-form-item field="name" label="鍚嶇О"> - <a-input v-model="agentTitle" placeholder="璇疯緭鍏ュ悕绉�"/> + <a-input v-model="from.name" placeholder="璇疯緭鍏ュ悕绉�"/> </a-form-item> <a-form-item> <div style="width: 100%;text-align: right"> @@ -214,11 +232,14 @@ const theme = computed(() => { return appStore.theme; }); +let from = reactive({ + name:'鏈懡鍚嶄細璇�', +}); const visible = ref(false); let isHistory = ref(false);//鏄惁鏄巻鍙茶褰� let dsl = reactive({}); - +const chatDataMeg = reactive({}); const rules = { @@ -232,19 +253,16 @@ const handleSubmit = async({values, errors}) => { if(errors) return; - // agentObj.name = agentTitle.value; - // agentObj.conversation_id = agentObj.id; console.log(agentObj, 'agentObj'); let chatData = { - id:activeSessionId.value, - conversation_id:activeSessionId.value, - name: agentTitle.value + id:agentObj.id, + conversation_id:agentObj.id, + name: from.name } const { code, data } = await addSessionApi(chatData); if (data) { Message.success("淇敼鎴愬姛"); handleCancel() - // queryAgentSessionDetail(agentObj.id); } } @@ -269,15 +287,11 @@ }; const createNewAgent = async (session) => { + console.log(session,'鏂板缓agent浼氳瘽瀵硅薄'); Object.assign(agentObj, session); isHistory.value = false; initPage(); - - } - - - // 璋冪敤set鏂规硶 const agentSet = async () => { const res = await agentSetApi({ @@ -285,10 +299,8 @@ title: agentObj.title, dsl: agentObj.dsl, }); - console.log(res,'agentSet'); + // console.log(res,'agentSet'); if (res.code == 0) { - // sessionDetailList.value = res.data.dsl.messages; - // Message.success('淇敼鎴愬姛'); agentReset(); } } @@ -352,30 +364,30 @@ inputMsg.value = ''; } // 璋冪敤get鏂规硶 - const queryAgentSessionDetail = async (id) => { const { code, data } = await getAgentSessionDetailsApi(id); if (code == 0) { - console.log(data,'浼氳瘽璇︽儏'); + console.log(data,'agent浼氳瘽璇︽儏'); + Object.assign(chatObj, data); sessionDetailList.value = data.dsl.messages; - agentTitle.value = `鍜�${data.title}鐨勪細璇漙 || '鏈懡鍚嶄細璇�'; + agentTitle.value = `${data.title}` || '鏈懡鍚嶄細璇�'; + from.name = `${data.title}` || '鏈懡鍚嶄細璇�'; refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃� } }; -// 鑾峰彇agent浼氳瘽璇︽儏 +// 鍘嗗彶璁板綍璺宠浆鑾峰彇agent浼氳瘽璇︽儏 const querySessionDetail = async (session) => { - Object.assign(agentObj, session); - agentObj.id = session.dialog_id; activeSessionId.value = session.id; - agentTitle.value = session.name; - console.log(agentTitle.value, '浼氳瘽鍚嶇О'); + from.name = session.name; const { code, data } = await getSessionDetailsApi(session.id); if (code == 200) { sessionDetailList.value = data.message.messages; const res = await getAgentSessionDetailsApi(session.dialog_id); if (res.code == 0) { - console.log(res.data,'浼氳瘽璇︽儏'); + console.log(res.data,'agent浼氳瘽璇︽儏'); + Object.assign(agentObj, res.data); + Object.assign(chatObj, res.data); Object.assign(dsl, res.data.dsl); refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃� } @@ -483,8 +495,13 @@ if (done) { console.info('done'); displayedText.value = ''; - queryAgentSessionDetail(agentObj.id); - EventBus.emit('queryAppUsageList'); + if (isStopChat.value) { + isStopChat.value = false; + setChatDataMeg(chatDataMeg); + } else { + queryAgentSessionDetail(agentObj.id); + EventBus.emit('queryAppUsageList'); + } break; } } @@ -494,10 +511,9 @@ } const stopChat=async()=>{ - // const { code, data } = await stopChatApi(activeSessionId.value); + // const { code, data } = await stopChatApi(agentObj.id); // if (code === 200) { // Message.success("宸插仠姝�"); - // queryNewSessionDetail(activeSessionId.value); // } loading.value = false; chatDis.value = false; @@ -517,21 +533,27 @@ 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); - // clearTimeout(timer!); - // timer = null; - // const { code, data } = await addSessionApi(chatObj); - // if (data) { - // //鍋滄瀹氭椂鍣� - // clearTimeout(timer!); - // timer = null; - // displayedText.value = ""; - // queryNewSessionDetail(activeSessionId.value); - // } - + chatObj.dsl.messages = chatObj.dsl.messages.concat(lastArr); + Object.assign(chatDataMeg, { + id: chatObj.id, + conversation_id: chatObj.id, + message: sessionDetailList.value, + }); } + +const setChatDataMeg = async (chatData) => { + const { code, data } = await addSessionApi(chatData); + if (data) { + //鍋滄瀹氭椂鍣� + clearTimeout(timer!); + timer = null; + // displayedText.value = ""; + queryAgentSessionDetail(chatObj.id); + } +}; + const handleShiftEnter = (event) => { event.preventDefault(); inputMsg.value += '\n'; diff --git a/src/views/sessionManager/components/historySession.vue b/src/views/sessionManager/components/historySession.vue index 58e0bb1..76a948f 100644 --- a/src/views/sessionManager/components/historySession.vue +++ b/src/views/sessionManager/components/historySession.vue @@ -308,6 +308,7 @@ }) onMounted(() => { + console.log(httpUrl,'褰撳墠鍦板潃'); EventBus.on("history", () => { emit('changeAgentType','3'); // DialogList() diff --git a/src/views/sessionManager/index.vue b/src/views/sessionManager/index.vue index 3404ffb..31bb72c 100644 --- a/src/views/sessionManager/index.vue +++ b/src/views/sessionManager/index.vue @@ -24,7 +24,13 @@ <a-popover position="bottom" trigger="click"> <a-button border - >{{ agentTitle }} + > + <span style=" + width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + ">{{ from.name }}</span> <icon-down style="margin-left: 4px" /> </a-button> <template #content> @@ -227,8 +233,27 @@ maxRows: 5, }" /> - - <div class="btn-send"> + <div style="width: 100%;display: flex;justify-content: space-between"> + <a-button + :disabled="onFileSelectedLoading" + @click="selectFile" + type="text" + style="border-radius: 24px" + > + <icon-attachment + size="28" + style="color: #0960bd" + /> + <input + ref="fileInput" + type="file" + style="display: none" + @change="onFileSelected" + /> + </a-button> + <span + style="cursor: pointer;margin-left: 20px;"> + </span> <a-button :disabled="chatDis" @click="sentClick" @@ -239,6 +264,17 @@ <icon-send size="32" style="color: #0960bd" /> </a-button> </div> +<!-- <div class="btn-send">--> +<!-- <a-button--> +<!-- :disabled="chatDis"--> +<!-- @click="sentClick"--> +<!-- type="text"--> +<!-- style="border-radius: 24px"--> +<!-- :loading="loading"--> +<!-- >--> +<!-- <icon-send size="32" style="color: #0960bd" />--> +<!-- </a-button>--> +<!-- </div>--> </div> <!-- <div style="margin-top: 0px">--> <!-- <a-upload--> @@ -253,27 +289,27 @@ <!-- </template>--> <!-- </a-upload>--> <!-- </div>--> - <span - style=" - position: absolute; - top: 94px; - left: 20px; - z-index: 999; - cursor: pointer; - " - > - <icon-attachment - size="28" - @click="selectFile" - style="color: #0960bd" - /> - <input - ref="fileInput" - type="file" - style="display: none" - @change="onFileSelected" - /> - </span> +<!-- <span--> +<!-- style="--> +<!-- position: absolute;--> +<!-- top: 94px;--> +<!-- left: 20px;--> +<!-- z-index: 999;--> +<!-- cursor: pointer;--> +<!-- "--> +<!-- >--> +<!-- <icon-attachment--> +<!-- size="28"--> +<!-- @click="selectFile"--> +<!-- style="color: #0960bd"--> +<!-- />--> +<!-- <input--> +<!-- ref="fileInput"--> +<!-- type="file"--> +<!-- style="display: none"--> +<!-- @change="onFileSelected"--> +<!-- />--> +<!-- </span>--> <div class="uploadFileList"> <div class="files" @@ -283,11 +319,12 @@ > <a-comment :author="item.name" - :content="item.size + ''" + :content="(item.size/1024).toFixed(2) + 'K'" style=" background: var(--color-bg-2); padding: 10px; border-radius: 10px; + font-size: 12px; " > <template #avatar> @@ -355,11 +392,11 @@ <a-form ref="formRef" :rules="rules" - :model="chatObj" + :model="from" @submit="handleSubmit" > <a-form-item field="name" label="鍚嶇О"> - <a-input v-model="agentTitle" placeholder="璇疯緭鍏ュ悕绉�" /> + <a-input v-model="from.name" placeholder="璇疯緭鍏ュ悕绉�" /> </a-form-item> <a-form-item> <div style="width: 100%; text-align: right"> @@ -434,6 +471,9 @@ const agentType = ref('1'); const agentTitle = ref('鏈懡鍚嶄細璇�'); let chatObj = reactive({}); + let from = reactive({ + name:'鏈懡鍚嶄細璇�', + }); const isStopChat = ref(false); const currIndex = ref(0); const displayedText = ref(''); // 姝e湪鏄剧ず鐨勬枃瀛� @@ -456,6 +496,7 @@ const fileInput = ref(null); const chatDataMeg = reactive({}); const visible = ref(false); + let toStop = false; const rules = { name: [ @@ -468,12 +509,10 @@ const handleSubmit = async ({ values, errors }) => { if (errors) return; - // chatObj.name = agentTitle.value; - // chatObj.conversation_id = chatObj.id; let chatData = { id: chatObj.id, conversation_id: chatObj.id, - name: agentTitle.value, + name: from.name, }; const { code, data } = await addSessionApi(chatData); if (data) { @@ -484,13 +523,10 @@ }; let dataItem = []; const getTxt = (data, role, message, index) => { - if (/##0\$\$/.test(message)) { + if (/##[0-9]\$\$/.test(message)) { if (role == 'assistant' && index) { - data.forEach((item) => { - if (Object.keys(item).length !== 0 && item?.doc_aggs.length > 0) { - dataItem = item.doc_aggs; - } - }); + let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0; + dataItem = data[i].doc_aggs; } } else { dataItem = []; @@ -501,7 +537,35 @@ const clickHref = (item) => { // return Message.warning('鏆傛棤娉曟煡鐪�'); - window.open(`/api/v1/document/show/${item.doc_id}`, '_blank'); + // window.open(`/api/v1/document/get/${item.doc_id}`, '_blank'); + downloadFile({ + url: `/api/v1/document/get/${item.doc_id}`, + filename: item.doc_name, + }); + }; + + const downloadFile = ({ + url, + filename, + target, + }: { + url: string; + filename?: string; + target?: string; + }) => { + const downloadElement = document.createElement('a'); + downloadElement.style.display = 'none'; + downloadElement.href = url; + if (target) { + downloadElement.target = '_blank'; + } + downloadElement.rel = 'noopener noreferrer'; + if (filename) { + downloadElement.download = filename; + } + document.body.appendChild(downloadElement); + downloadElement.click(); + document.body.removeChild(downloadElement); }; const getIconByExtension = computed(() => (extension) => { @@ -740,6 +804,7 @@ const startChat = async (valMsg) => { chatDis.value = true; loading.value = true; + toStop = false; sessionDetailList.value.push({ content: valMsg, role: 'user', @@ -767,6 +832,11 @@ .getReader(); currIndex.value = 0; while (true) { + if (toStop) { + displayedText.value = ''; + setChatDataMeg(chatDataMeg); + break; + } const x = await reader?.read(); if (x) { const { done, value } = x; @@ -809,6 +879,7 @@ loading.value = false; chatDis.value = false; isStopChat.value = true; + toStop = true; console.log('stopChat'); console.log(displayedText.value, 'displayedText'); console.log(sessionDetailList.value, 'sessionDetailList'); @@ -859,6 +930,7 @@ sessionDetailList.value = data.message; messagenList.value = data; agentTitle.value = data.name; + from.name = data.name; refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃� isStopChat.value = false; } @@ -872,6 +944,7 @@ const querySessionDetail = async (session) => { sectionList.value = session; activeSessionId.value = session.id; + from.name = session.name; const { code, data } = await getSessionDetailsApi(session.id); if (code === 200) { sessionDetailList.value = data.message; -- Gitblit v1.8.0