From 831813abe5db31b59ff404da5911034bc10a1ca5 Mon Sep 17 00:00:00 2001 From: han2015 <1019850453@qq.com> Date: Mon, 4 Aug 2025 15:06:11 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E9=9B=86=E6=88=90AI=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 + src/api/doc/space.ts | 68 ++++++++++++- src/api/doc/type.ts | 1 + src/views/doc/agent.vue | 214 ++++++++++++++++++++++++++++++++++++++++ src/views/doc/space.vue | 126 ++++++++++++++++++++--- 5 files changed, 396 insertions(+), 16 deletions(-) create mode 100644 src/views/doc/agent.vue diff --git a/package.json b/package.json index e567a88..c0fd78b 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ ] }, "dependencies": { + "@crazydos/vue-markdown": "^1.1.4", "@dnd-kit/core": "^6.1.0", "@element-plus/icons-vue": "^2.3.1", "@onlyoffice/document-editor-vue": "^1.5.0", @@ -72,6 +73,8 @@ "quill-image-resize-custom-module": "^4.1.7", "quill-image-uploader": "^1.3.0", "react-dnd-html5-backend": "^16.0.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", "screenfull": "^6.0.0", "sortablejs": "^1.15.2", "spark-md5": "^3.0.2", diff --git a/src/api/doc/space.ts b/src/api/doc/space.ts index 2b4aad6..52a8e28 100644 --- a/src/api/doc/space.ts +++ b/src/api/doc/space.ts @@ -1,6 +1,6 @@ import request from '@/utils/request'; import { AxiosPromise } from 'axios'; -import { matterPage,createDir,matterTreeList} from './type'; +import { matterPage,createDir,matterTreeList,matterInfo} from './type'; /** * 获取空间目录文件 @@ -31,6 +31,31 @@ export function doCreateSpaceDir(uid:string,data?: createDir){ data: data }); } +/** + * 文件上传 + */ +export function doFileUpload(params:FormData,_url:string): AxiosPromise { + return request({ + url: _url, + method: 'post', + data: params, + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +} + +export function doCreateAiagent(uid:string,data?: {space:string,matter:string}){ + return request({ + url: '/hxpan/api/space/aiagent', + method: 'post', + headers: { + 'Identifier':uid, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: data + }); +} /** * 空间权限控制管理 @@ -75,4 +100,45 @@ export function doDelSpaceMatter(uid:string,data?: any){ }, data: data }); +} + +//-------------------AI backend APIs--------------- +/** + * 文档训练 + */ +export function doAiTraining(_url:string,data?: any){ + return request({ + url: '/aibot'+_url, + method: 'post', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: data + }); +} + +export interface aiChatData{ + inputs:object; + query:string; + response_mode:string; + conversation_id?:string; + user:string, + file?:[] +} + + +/** + * 问答api + */ +export function doAiChat(_url:string,data: aiChatData,sig?:AbortSignal){ + return fetch( + _url,{ + method: 'post', + headers: { + 'Content-Type': 'application/json' + }, + signal:sig, + body: JSON.stringify(data) + } + ) } \ No newline at end of file diff --git a/src/api/doc/type.ts b/src/api/doc/type.ts index a423475..d6ef417 100644 --- a/src/api/doc/type.ts +++ b/src/api/doc/type.ts @@ -25,6 +25,7 @@ export interface matterInfo{ puuid?:string; // parent dir uuid path?:string; size?:number; + agent?:boolean; dir?:boolean; deleted?:boolean; expireInfinity?:boolean; diff --git a/src/views/doc/agent.vue b/src/views/doc/agent.vue new file mode 100644 index 0000000..b245509 --- /dev/null +++ b/src/views/doc/agent.vue @@ -0,0 +1,214 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/doc/space.vue b/src/views/doc/space.vue index 119383e..14e569b 100644 --- a/src/views/doc/space.vue +++ b/src/views/doc/space.vue @@ -7,7 +7,8 @@ import { getFileIcon, readableSize,fileType} from "./tools" import sharePermission from './sharePermission.vue'; import { matterPage,matterInfo} from "@/api/doc/type" -import { doAccessManage,getSpaceMatterList,doCreateSpaceDir,doDelSpaceMatter,doDelSpace} from "@/api/doc/space" +import { doAccessManage,getSpaceMatterList,doCreateSpaceDir,doDelSpaceMatter,doDelSpace, + doAiTraining ,doCreateAiagent,doFileUpload} from "@/api/doc/space" import { h, proxyRefs } from 'vue' import { Delete, @@ -15,28 +16,38 @@ import { Download, Plus, Edit, + CircleCheckFilled, Promotion, Folder, } from '@element-plus/icons-vue' import {ElMessage,UploadFile,UploadFiles,ElPagination} from "element-plus"; import preview from './preview.vue'; +import aiagent from './agent.vue'; import router from "@/router"; +import { formToJSON } from "axios"; const matterList = ref([]) const newdir=ref("") //创建新目录时的目录名 const currentHoverRow=ref("") //table 行的按钮控制 const breadcrumbList=ref([{name:"根目录",uuid:"root", dir:true}]) //面包屑导航 -const selectedValue = ref("sixhour") //分享弹窗的时间变量 - const tabSelected=ref([]) //table组件多选数据维护 const currentNode=ref({}) //打开的路径层次 const dynamicVNode = ref(null) //permission 组件的父组件 const paginInfo = ref({ page: 0, total: 0 }) +const filesUpload=ref() + +//-----------AI--------------------- +const aiAgentVNode = ref(null) //ai chat 容器 +//const agent=ref<{model:boolean,name:string}>({}) +const currentAgent=ref<{model:boolean,name:string,uuid:string}>({}) + +//--------------------------------- + const props = withDefaults(defineProps<{ - uid:string, //当前用户的uuid,注意已经过base64编码 + uid:string, //当前用户的uuid,注意已经且必须通过base64编码,因为后端获取Identifier后,会base64解码 spaceid:string, spacename:string, officeHost:string, @@ -188,7 +199,7 @@ function handleDoubleClick(row:matterInfo,ind?:number){ if(row.dir){ //table的双击事件也在此方法处理 if(typeof(ind)==="number"){ - //返回某一级 + //返回某一级,面包屑组件的点击处理 if(breadcrumbList.value.length>1){ breadcrumbList.value=breadcrumbList.value.slice(0,ind+1) currentNode.value=breadcrumbList.value[breadcrumbList.value.length-1] @@ -196,6 +207,11 @@ function handleDoubleClick(row:matterInfo,ind?:number){ } }else{ //进入下一级 + //TODO:当前的目录暂时作为agentid,后期判断当前dir是不是智能体,来决定是否更新 + if(row.agent){ + currentAgent.value={name:row.name,model:false,uuid:row.uuid} + } + currentNode.value=row breadcrumbList.value.push(row) onLoadMatterList() @@ -208,6 +224,7 @@ function handleMouseEnter(row:any){ } //上传成功 function handleSingleUpload(response:any){ + handleAiUpload(response.data) fileList.value=[] onLoadMatterList() } @@ -218,6 +235,75 @@ interface uploadError{ function handleSigLoadErr(error: Error, uploadFile: UploadFile, uploadFiles:UploadFiles){ ElMessage.error(JSON.parse(error.message).msg) } + +function onCustomUpload(files:any){ + console.log(files) + console.log(fileList.value,"<<<<<<<<<<<<<") + + if (fileList.value.length === 0) { + alert('请先选择文件') + } + + console.log("sdfsdfsdf") + return + for (const file of fileList.value) { + const formData = new FormData() + formData.append('file', file) + + + const fields=new FormData() + fields.append("space",uploadFormData.value.space) + fields.append("puuid",uploadFormData.value.puuid) + fields.append("file","uploadFormData.value.space") + try { + doFileUpload(fields,'/hxpan/api/space/upload') + } catch (err) { + console.error('上传失败:', err) + } + } + + // 清空列表 + fileList.value = [] + filesUpload.value.clearFiles() +} + + +//-------------------------AI section-------------- +//处理智能体创建 +function onAiAgent(){ + if(currentNode.value.uuid=="root"){ + alert("根目录不支持创建智能体") + return + } + + if(currentNode.value.agent){ + alert("当前目录已经是智能体目录") + return + } + + ElMessageBox.confirm(`确认创建智能体( ${currentNode.value.name}) ?`, "警告", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + }).then(()=>{ + doCreateAiagent(props.uid,{ + space:props.spaceid, + matter:currentNode.value.uuid + }).then(()=>{ + router.replace({ query: { t: Date.now() } }) + }) + }) +} +function handleAiUpload(info:matterInfo){ + if (currentNode.value.puuid){ + doAiTraining(`/agents/${currentAgent.value.uuid}/updates`,{"matter":info.uuid}).then(resp=>{ + console.log(resp) + }) + } +} + +//------------------------------------------------- + //-------------------edit & preive file for space--------------------- //文件预览 function onPrivateView(row:matterInfo){ @@ -259,6 +345,8 @@ async function onlyOfficeEdit(row:matterInfo){ //渲染完页面再执行 onMounted(() => { currentNode.value.uuid="root" + //设置默认的AI智能体 + currentAgent.value={name:"通用AI",model:false,uuid:"5bd9b0e9-d3f4-4089-670a-880009e925a8"} onLoadMatterList() }); @@ -286,20 +374,26 @@ function isOwner(){ - + :on-change="onCustomUpload" + :show-file-list="true" + multiple + :limit="2" + :action="apiURL+'/space/upload'"> 上传文件 新建目录 删除目录 - + AI助手 + 成员 + 创建智能体 删除 @@ -328,10 +422,10 @@ function isOwner(){ - -