From 78263ae31074c87f303ad85dab4c238fbbbec71c Mon Sep 17 00:00:00 2001 From: jhy <184825448@qq.com> Date: Fri, 16 Oct 2026 20:27:55 +0800 Subject: [PATCH] feat: add document management workspace --- frontend/src/api.ts | 3 +++ frontend/src/router.ts | 1 + frontend/src/views/AdminView.vue | 2 +- frontend/src/views/DocumentManagementView.vue | 10 ++++++++++ 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 frontend/src/views/DocumentManagementView.vue diff --git a/frontend/src/api.ts b/frontend/src/api.ts index ae13d4f..9199c65 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -12,6 +12,9 @@ export type SourceItem={id:number;version:number;name:string;source_url:string|n export function getSources(q=''){return apiRequest<{items:SourceItem[];total:number}>(`/api/sources?q=${encodeURIComponent(q)}`)} export function createSource(payload:{name:string;source_url?:string;notes:string}){return apiRequest('/api/sources',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)},true)} export function reviewKnowledge(id:number,payload:{expected_version:number;verification_status:VerificationStatus;reviewer:string;verification_notes:string}){return apiRequest(`/api/knowledge/${id}/review`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)},true)} +export type DocumentItem={id:number;version:number;source_id:number;title:string;category:string;content:string;collected_at:string;notes:string;created_at:string;updated_at:string;is_deleted:boolean} +export function getDocuments(q='',page=1,pageSize=20){return apiRequest<{items:DocumentItem[];total:number;page:number;page_size:number}>(`/api/documents?q=${encodeURIComponent(q)}&page=${page}&page_size=${pageSize}`)} +export function createDocument(payload:{source_id:number;title:string;category:string;content:string;collected_at:string;notes?:string}){return apiRequest('/api/documents',{method:'POST',body:JSON.stringify(payload)},true)} export type RetrievalHit={rank:number;knowledge_id:number;knowledge_version:number;document_id:number|null;document_version:number|null;source_id:number|null;source_version:number|null;source_name:string|null;source_url:string;title:string;category:string;snippet:string;snippet_start:number;snippet_end:number;score:number;matched_terms:string[]} export type RetrievalResult={run_id:string;query:string;mode:'keyword';status:'ok'|'no_evidence';top_k:number;category:string|null;query_terms:string[];corpus_size:number;corpus_fingerprint:string;total_hits:number;results:RetrievalHit[];elapsed_ms:number;created_at:string;config:{tokenizer:string;scorer:string;k1:number;b:number;title_weight:number;stopwords_version:string}} diff --git a/frontend/src/router.ts b/frontend/src/router.ts index ff26225..460ce6c 100644 --- a/frontend/src/router.ts +++ b/frontend/src/router.ts @@ -12,6 +12,7 @@ const router=createRouter({history:createWebHistory(),routes:[ {path:'/settings',component:()=>import('./views/AccountSettingsView.vue')}, {path:'/indexes',component:()=>import('./views/IndexManagementView.vue'),meta:{role:'admin'}}, {path:'/reviews',component:()=>import('./views/KnowledgeReviewView.vue'),meta:{role:'admin'}}, + {path:'/documents',component:()=>import('./views/DocumentManagementView.vue'),meta:{role:'admin'}}, {path:'/admin',component:()=>import('./views/AdminView.vue'),meta:{role:'admin'}}, ]}) router.beforeEach(async to=>{if(to.meta.public)return true;try{role=(await getCurrentUser()).role}catch{return {path:'/login',query:{redirect:to.fullPath}}}if(to.meta.role&&role!==to.meta.role)return {path:'/profile',query:{forbidden:'1'}};return true}) diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue index 30bc183..2125dd0 100644 --- a/frontend/src/views/AdminView.vue +++ b/frontend/src/views/AdminView.vue @@ -29,7 +29,7 @@ onMounted(() => load(0))

管理员用户管理

用户数据由受服务端管理员权限保护的接口实时提供。

-

进入知识审核工作台 进入索引管理

+

进入知识审核工作台 进入文档管理 进入索引管理

{{ error }}

正在读取用户列表…