From 191b69edb057ce74c94650659a5ae1c2b5aa9cf3 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Mon, 21 Sep 2026 10:11:13 +0800 Subject: [PATCH] feat: portal --- ui/src/api/API_README.md | 4 + .../admin/workspace/knowledge/knowledge.ts | 16 ++ ui/src/api/types/portal.ts | 1 + ui/src/views/VIEW_README.md | 18 +- ui/src/views/knowledge/KnowledgeView.vue | 16 ++ .../KeywordIndexKnowledgeAction.vue | 33 +++ .../knowledge-card/action-dropdown/index.ts | 2 + .../KnowledgeMcpConfigDialog.vue | 51 +++++ .../McpConfigKnowledgeAction.vue | 43 ++++ .../portal-setting/PortalSettingView.vue | 15 +- .../components/ButtonEditPortal.vue | 6 +- .../components/ButtonPortalAuthSetting.vue | 197 +++++++++++------- .../components/ButtonPortalCorsSetting.vue | 37 +++- 13 files changed, 346 insertions(+), 93 deletions(-) create mode 100644 ui/src/views/knowledge/knowledge-card/action-dropdown/KeywordIndexKnowledgeAction.vue create mode 100644 ui/src/views/knowledge/knowledge-card/action-dropdown/mcp-config-action/KnowledgeMcpConfigDialog.vue create mode 100644 ui/src/views/knowledge/knowledge-card/action-dropdown/mcp-config-action/McpConfigKnowledgeAction.vue diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index 66b1cfce0b9..625f882a544 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -149,6 +149,10 @@ v3 编辑表单提交 `{ name, description }`,标题上限 64、更新说明 ### 知识库维护 +`getKnowledgeMcpConfig(knowledgeId)` 与 `postKnowledgeKeywordIndex(knowledgeId)` 为预留接口方法, +目前不发送 HTTP 请求:前者返回空配置文本,后者模拟成功。后续确认后端协议后替换方法内部实现。 +MCP 入口加载配置后打开只读及复制弹窗;分词索引入口仅调用方法并在成功后提示“操作成功”。 + `exportKnowledgeExcel`、`exportKnowledgeZip`、`exportKnowledge` 分别通过 GET 请求知识库 `//export`、`export_zip`、`export_knowledge`,复用 `getExportFile` 下载。 三种结果分别为文档 Excel、包含图片的文档 ZIP 和可导入创建的知识库 ZIP;优先使用服务端文件名。 diff --git a/ui/src/api/admin/workspace/knowledge/knowledge.ts b/ui/src/api/admin/workspace/knowledge/knowledge.ts index 525cf059646..c22c35e4512 100644 --- a/ui/src/api/admin/workspace/knowledge/knowledge.ts +++ b/ui/src/api/admin/workspace/knowledge/knowledge.ts @@ -90,7 +90,23 @@ const postKnowledgeImport = (file: File, folderId: string) => { return post(`${getPrefix()}/import_knowledge`, payload) } +/** 获取知识库 MCP 配置详情,暂返回空配置供交互联调。 */ +const getKnowledgeMcpConfig = (knowledgeId: string): Promise => { + // TODO 接入 MCP 配置查询接口,使用 knowledgeId 获取配置文本。 + void knowledgeId + return Promise.resolve('') +} + +/** 执行知识库分词索引,暂模拟成功供交互联调。 */ +const postKnowledgeKeywordIndex = (knowledgeId: string): Promise => { + // TODO 接入分词索引接口,使用 knowledgeId 提交索引任务。 + void knowledgeId + return Promise.resolve() +} + export default { + getKnowledgeMcpConfig, + postKnowledgeKeywordIndex, exportKnowledgeExcel, exportKnowledgeZip, exportKnowledge, diff --git a/ui/src/api/types/portal.ts b/ui/src/api/types/portal.ts index 487af09d0c3..112e0d7ab02 100644 --- a/ui/src/api/types/portal.ts +++ b/ui/src/api/types/portal.ts @@ -2,6 +2,7 @@ import type { Dict } from './common' export interface PortalAuthConfig extends Dict { login_value?: string[] + default_value?: string max_attempts?: number failed_attempts?: number lock_time?: number diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index 6e5fb7f59c5..6df932da2e8 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -178,6 +178,8 @@ src/views/knowledge/ │ └── action-dropdown/ │ ├── index.ts │ ├── SettingKnowledgeAction.vue # 跳转知识库设置 +│ ├── KeywordIndexKnowledgeAction.vue # 分词索引入口 +│ ├── mcp-config-action/ # MCP 配置入口与专属只读弹窗 │ ├── ExportKnowledgeAction.vue # Excel、文档 ZIP 与知识库包导出 │ ├── MoveKnowledgeAction.vue │ └── DeleteKnowledgeAction.vue @@ -198,6 +200,10 @@ src/views/knowledge/ 组合单项转移、删除 Action,并管理批量选择、全选、批量转移与批量删除。共享知识库不展示这些操作。 `SettingKnowledgeAction` 暂不增加权限判断,点击后携带当前 `workspaceId` 和知识库 ID 跳转 `workspace-knowledge-setting`;阻止事件冒泡,避免同时触发卡片详情跳转。 +“设置”之后依次组合 `KeywordIndexKnowledgeAction` 和 `McpConfigKnowledgeAction`,接收完整 +Knowledge API 并复用页面操作 loading。分词索引不增加确认弹窗,调用成功后只提示“操作成功”; +MCP 配置沿用工具的只读文本与悬浮复制交互,专属弹窗按需挂载、关闭后卸载。 +两者接口暂为本地占位,MCP 返回空文本,分词索引模拟成功,尚不执行服务端操作。 `ExportKnowledgeAction` 接收完整 Knowledge API,暂不增加权限判断;悬停“导出”展开右侧 子菜单,分别导出文档 Excel、文档 ZIP 和可再次导入的知识库包。 导出复用页面操作 loading,防止重复请求,结束或失败后恢复;共享知识库不展示该入口。 @@ -401,7 +407,7 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功 | `system/identity/workspaces/WorkspaceListView.vue` | 工作空间列表页面 | | `system/chat/user-groups/GroupsListView.vue` | 对话用户组及组成员管理页面 | | `system/chat/users/UserListView.vue` | 对话用户列表、配额及用户导入管理页面 | -| `system/chat/portal-setting/PortalSettingView.vue` | 门户基本信息、访问开关、认证配置与门户预览;跨域详细配置暂保留说明入口 | +| `system/chat-management/portal-setting/PortalSettingView.vue` | 门户基本信息、访问开关、认证配置、跨域地址编辑与门户预览 | | `system/settings/theme/ThemeSettingView.vue` | 系统外观设置和登录外观预览页面 | | `system/settings/authentication/AuthenticationView.vue` | 系统登录及认证源配置页面 | | `system/settings/email/EmailSettingsView.vue` | 系统邮件 SMTP 服务配置页面 | @@ -413,8 +419,14 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功 ## 备注要求 门户设置的 `components/ButtonEditPortal.vue`、`ButtonPortalAuthSetting.vue` 和 -`ButtonPortalCorsSetting.vue` 分别封装对应按钮、弹窗及表单状态。页面保留默认配置、统一保存和 -预览布局;编辑组件暴露草稿预览,认证组件暴露 `open()` 供首次开启认证时联动打开。 +`ButtonPortalCorsSetting.vue` 分别封装对应按钮、浮层及表单状态。认证组件使用 `MkDrawer`, +打开时与系统 `LoginSetting` 共用 `AuthSettingApi.getLoginSetting()`,通过返回的 `login_methods` +生成登录方式选项,复用登录方式标签,初始保留账号登录。提供默认登录方式及验证码与账号锁定设置;默认方式 +仅可选已勾选项,取消勾选当前默认项时回退到首个可选项。认证组件暴露 `open()` 供首次开启认证 +时联动打开;当前认证配置仅保存到页面内存,取消不回写,刷新后恢复默认配置,待接口接入后持久化。 +跨域组件通过 `v-model` 接收地址数组,弹窗按一行一个地址编辑;保存时清理行首尾空白和空行, +取消不回写,关闭后清理草稿。空数组表示不限制来源的配置意图;目前地址仅保存在页面内存, +尚未对接 `cors_config` 或实际跨域策略。 - 新增路由级页面时,必须在“页面功能登记”中添加一条简洁、明确的功能说明。 - 页面职责改变、文件重命名或目录移动时,必须同步修改登记内容。 diff --git a/ui/src/views/knowledge/KnowledgeView.vue b/ui/src/views/knowledge/KnowledgeView.vue index d7011fdbe95..7ad79561964 100644 --- a/ui/src/views/knowledge/KnowledgeView.vue +++ b/ui/src/views/knowledge/KnowledgeView.vue @@ -17,6 +17,8 @@ import { AuthorizeKnowledgeAction, DeleteKnowledgeAction, ExportKnowledgeAction, + KeywordIndexKnowledgeAction, + McpConfigKnowledgeAction, MoveKnowledgeAction, RelatedResourcesKnowledgeAction, SettingKnowledgeAction, @@ -228,6 +230,20 @@ function handleBatchDelete() { + + + + diff --git a/ui/src/views/knowledge/knowledge-card/action-dropdown/KeywordIndexKnowledgeAction.vue b/ui/src/views/knowledge/knowledge-card/action-dropdown/KeywordIndexKnowledgeAction.vue new file mode 100644 index 00000000000..6bf82239d01 --- /dev/null +++ b/ui/src/views/knowledge/knowledge-card/action-dropdown/KeywordIndexKnowledgeAction.vue @@ -0,0 +1,33 @@ + + + diff --git a/ui/src/views/knowledge/knowledge-card/action-dropdown/index.ts b/ui/src/views/knowledge/knowledge-card/action-dropdown/index.ts index 0062216a4d6..a1706a50852 100644 --- a/ui/src/views/knowledge/knowledge-card/action-dropdown/index.ts +++ b/ui/src/views/knowledge/knowledge-card/action-dropdown/index.ts @@ -1,4 +1,6 @@ /** 知识库卡片菜单操作。 */ +export { default as KeywordIndexKnowledgeAction } from './KeywordIndexKnowledgeAction.vue' +export { default as McpConfigKnowledgeAction } from './mcp-config-action/McpConfigKnowledgeAction.vue' export { default as ExportKnowledgeAction } from './ExportKnowledgeAction.vue' export { default as SettingKnowledgeAction } from './SettingKnowledgeAction.vue' export { default as MoveKnowledgeAction } from './MoveKnowledgeAction.vue' diff --git a/ui/src/views/knowledge/knowledge-card/action-dropdown/mcp-config-action/KnowledgeMcpConfigDialog.vue b/ui/src/views/knowledge/knowledge-card/action-dropdown/mcp-config-action/KnowledgeMcpConfigDialog.vue new file mode 100644 index 00000000000..9d43334e29c --- /dev/null +++ b/ui/src/views/knowledge/knowledge-card/action-dropdown/mcp-config-action/KnowledgeMcpConfigDialog.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/ui/src/views/knowledge/knowledge-card/action-dropdown/mcp-config-action/McpConfigKnowledgeAction.vue b/ui/src/views/knowledge/knowledge-card/action-dropdown/mcp-config-action/McpConfigKnowledgeAction.vue new file mode 100644 index 00000000000..530a6c5c1cb --- /dev/null +++ b/ui/src/views/knowledge/knowledge-card/action-dropdown/mcp-config-action/McpConfigKnowledgeAction.vue @@ -0,0 +1,43 @@ + + + diff --git a/ui/src/views/system/chat-management/portal-setting/PortalSettingView.vue b/ui/src/views/system/chat-management/portal-setting/PortalSettingView.vue index ca9907f8d9e..ce1c8c35950 100644 --- a/ui/src/views/system/chat-management/portal-setting/PortalSettingView.vue +++ b/ui/src/views/system/chat-management/portal-setting/PortalSettingView.vue @@ -32,6 +32,8 @@ const portalSetting = reactive({ cors_config: {}, }) const saving = ref(false) +// 跨域地址暂存于页面,待接口协议确定后接入 cors_config。 +const portalCorsOrigins = ref([]) const portalAccessUrl = new URL('/portal', window.location.origin).href const portalApiUrl = new URL('/api/portal', window.location.origin).href @@ -59,6 +61,13 @@ function handleAccessChange(field: AccessField, value: string | number | boolean return savePortalSetting({ [field]: Boolean(value) }) } +/* 认证接口暂未接入,保存到当前页面配置供再次打开回填。 */ +function savePortalAuthSetting(payload: PortalSettingPayload) { + Object.assign(portalSetting, payload) + MsgSuccess('已应用到当前页面') + return Promise.resolve() +} + /* 编辑草稿预览与认证入口联动 */ const authSettingButtonRef = useTemplateRef>('authSettingButtonRef') @@ -136,15 +145,15 @@ const previewLogo = computed(() => portalSetting.logo) 身份认证
- +
跨域设置
- - + +
diff --git a/ui/src/views/system/chat-management/portal-setting/components/ButtonEditPortal.vue b/ui/src/views/system/chat-management/portal-setting/components/ButtonEditPortal.vue index 29edb2fc230..e8cb3fdbf58 100644 --- a/ui/src/views/system/chat-management/portal-setting/components/ButtonEditPortal.vue +++ b/ui/src/views/system/chat-management/portal-setting/components/ButtonEditPortal.vue @@ -60,16 +60,14 @@ function handleClosePortalEdit() { - + diff --git a/ui/src/views/system/chat-management/portal-setting/components/ButtonPortalAuthSetting.vue b/ui/src/views/system/chat-management/portal-setting/components/ButtonPortalAuthSetting.vue index e35e3c513a1..b2ed093d958 100644 --- a/ui/src/views/system/chat-management/portal-setting/components/ButtonPortalAuthSetting.vue +++ b/ui/src/views/system/chat-management/portal-setting/components/ButtonPortalAuthSetting.vue @@ -1,50 +1,63 @@