diff --git a/docs/AUTH_API_REQUIREMENTS.md b/docs/AUTH_API_REQUIREMENTS.md new file mode 100644 index 0000000..ac7af5e --- /dev/null +++ b/docs/AUTH_API_REQUIREMENTS.md @@ -0,0 +1,17 @@ +# 用户系统与角色权限:前后端接口清单 + +当前后端未注册认证或管理员路由;前端只提供真实请求封装,任何 404、401、403 或 5xx 都会如实抛出,绝不创建本地假身份。 + +| 目标接口 | 方法 | 前端用途 | 后端待实现要求 | +|---|---:|---|---| +| `/api/auth/register` | POST | 注册 | 只创建 `user`;不得接受角色字段 | +| `/api/auth/login` | POST | 登录 | 建立 HttpOnly、Secure、SameSite Cookie 会话 | +| `/api/auth/logout` | POST | 退出 | 作废会话并清除 Cookie | +| `/api/auth/me` | GET | 刷新恢复会话 | 返回用户资料与 `user`/`admin` 角色 | +| `/api/users/me` | PATCH | 修改昵称/邮箱 | 只允许修改当前用户自己的基本资料 | +| `/api/auth/change-password` | POST | 修改密码 | 验证旧密码并进行安全哈希 | +| `/api/admin/users` | GET | 用户管理 | 必须由后端校验 `admin` 角色 | + +## 前端待接入条件 + +现有工程尚未安装 `vue-router`。在用户安装该依赖并确认认证接口可用后,前端将接入路由守卫:未登录跳转登录页、成功后回跳、管理员路由额外检查 `role === 'admin'`。前端只用于体验层控制;知识库、来源、实验、用户管理的最终授权必须由 FastAPI 校验。 diff --git a/frontend/src/api.ts b/frontend/src/api.ts index ad97bcb..49fe087 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -8,6 +8,11 @@ export const getKnowledge = () => apiRequest<{id:number;title:string;category:st export const createKnowledge = (payload:{title:string;category:string;content:string;source_url?:string;collected_at?:string}) => apiRequest('/api/knowledge',{method:'POST',body:JSON.stringify(payload)},true) export type VerificationStatus='pending'|'verified'|'rejected' +export type KnowledgeItem={id:number;version:number;title:string;category:string;content:string;source_url:string|null;source_id:number|null;document_id:number|null;collected_at:string|null;verification_status:VerificationStatus;reviewer:string|null;reviewed_at:string|null;verification_notes:string|null;created_at:string;updated_at:string;is_deleted:boolean} +export function getKnowledgePage(filters:{q?:string;category?:string;verification_status?:VerificationStatus;page?:number;page_size?:number}={}){const params=new URLSearchParams();for(const [key,value] of Object.entries(filters)){if(value!==undefined&&value!=='')params.set(key,String(value))}return apiRequest<{items:KnowledgeItem[];total:number;page:number;page_size:number}>(`/api/knowledge/page?${params}`)} +export function updateKnowledge(id:number,payload:{expected_version:number;title?:string;category?:string;content?:string;source_url?:string|null;collected_at?:string|null}){return apiRequest(`/api/knowledge/${id}`,{method:'PATCH',body:JSON.stringify(payload)},true)} +export function deleteKnowledge(id:number,expectedVersion:number){return apiRequest(`/api/knowledge/${id}?expected_version=${expectedVersion}`,{method:'DELETE'},true)} +export function getKnowledgeHistory(id:number,page=1,pageSize=20){return apiRequest<{items:AuditItem[];total:number;page:number;page_size:number}>(`/api/knowledge/${id}/history?page=${page}&page_size=${pageSize}`)} export type SourceItem={id:number;version:number;name:string;source_url:string|null;notes:string;created_at:string} export function getSources(q='',page=1,pageSize=20){return apiRequest<{items:SourceItem[];total:number;page:number;page_size:number}>(`/api/sources?q=${encodeURIComponent(q)}&page=${page}&page_size=${pageSize}`)} 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)} diff --git a/frontend/src/router.ts b/frontend/src/router.ts index 50624ee..98c321c 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:'/knowledge',component:()=>import('./views/KnowledgeManagementView.vue'),meta:{role:'admin'}}, {path:'/documents',component:()=>import('./views/DocumentManagementView.vue'),meta:{role:'admin'}}, {path:'/sources',component:()=>import('./views/SourceManagementView.vue'),meta:{role:'admin'}}, {path:'/retrieval-exports',component:()=>import('./views/RetrievalExportView.vue'),meta:{role:'admin'}}, diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue index 39ed9ce..5449d4d 100644 --- a/frontend/src/views/AdminView.vue +++ b/frontend/src/views/AdminView.vue @@ -29,7 +29,7 @@ onMounted(() => load(0))

管理员用户管理

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

-

进入知识审核工作台 进入来源管理 进入文档管理 进入索引管理 导出检索历史

+

进入知识管理 进入知识审核工作台 进入来源管理 进入文档管理 进入索引管理 导出检索历史

{{ error }}

正在读取用户列表…