diff --git a/ui/package.json b/ui/package.json index b00ec03117a..e0c86e1b427 100644 --- a/ui/package.json +++ b/ui/package.json @@ -32,6 +32,7 @@ "dingtalk-jsapi": "^3.2.9", "element-plus": "^2.14.2", "jsencrypt": "^3.5.4", + "lodash": "^4.18.1", "nanoid": "^6.0.1", "nprogress": "^0.2.0", "pinia": "^3.0.4", @@ -43,6 +44,7 @@ "devDependencies": { "@tailwindcss/vite": "^4.3.2", "@tsconfig/node24": "^24.0.4", + "@types/lodash": "^4.17.25", "@types/node": "^24.13.2", "@types/nprogress": "^0.2.3", "@vitejs/plugin-vue": "^6.0.7", diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index 46229f12e4f..aef6a8e4cd3 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -75,6 +75,8 @@ API 枚举与类型统一在 `src/api` 范围内管理,相关规则由本文 - API 专用的请求参数、响应包装、请求配置和基础设施类型,放在对应 API 文件、资源目录的 `types.ts`,或该 API 业务域的 `common.ts`。 +- 字符串键字典统一使用 `@/api/types` 导出的 `Dict`;未收窄值类型的请求查询参数使用 + `Dict`,不再为相同结构声明额外别名。 - `src/api/types` 只存放 API 与 View 或 Component 跨层共用的业务类型,使用方统一通过 `import type { ... } from '@/api/types'` 导入,不写 `/index.ts`。 - `src/api/types/index.ts` 只负责导出各业务域类型,不直接声明类型。 diff --git a/ui/src/api/admin/core/request.ts b/ui/src/api/admin/core/request.ts index 65728786d92..c236dc9eaf8 100644 --- a/ui/src/api/admin/core/request.ts +++ b/ui/src/api/admin/core/request.ts @@ -9,7 +9,7 @@ import axios, { import router from '@/router/admin' import { useStore } from '@/stores' import type { ApiResponse, LoadingTarget } from './types' -import type { RequestParams } from '@/api/types' +import type { Dict } from '@/api/types' import { MsgError } from '@/utils/message' const DEFAULT_TIMEOUT = 30 * 60 * 1_000 // 30 minutes @@ -200,7 +200,7 @@ export async function promise( /** 发送 GET 请求。 */ export function get( url: string, - params?: RequestParams, + params?: Dict, loading?: LoadingTarget, timeout?: number, ) { @@ -211,7 +211,7 @@ export function get( export async function getExportFile( fileName: string, url: string, - params?: RequestParams, + params?: Dict, loading?: LoadingTarget, ): Promise { startLoading(loading) @@ -232,7 +232,7 @@ export async function getExportFile( export async function postExportExcel( fileName: string, url: string, - params?: RequestParams, + params?: Dict, data?: TData, loading?: LoadingTarget, ): Promise { @@ -254,7 +254,7 @@ export async function postExportExcel( export function post( url: string, data?: TData, - params?: RequestParams, + params?: Dict, loading?: LoadingTarget, timeout?: number, ) { @@ -265,7 +265,7 @@ export function post( export function put( url: string, data?: TData, - params?: RequestParams, + params?: Dict, loading?: LoadingTarget, timeout?: number, ) { @@ -275,7 +275,7 @@ export function put( /** 发送 DELETE 请求。 */ export function del( url: string, - params?: RequestParams, + params?: Dict, data?: TData, loading?: LoadingTarget, timeout?: number, diff --git a/ui/src/api/admin/system/chat-user-groups.ts b/ui/src/api/admin/system/chat-user-groups.ts index 27b91e79aef..dc9fb10da3c 100644 --- a/ui/src/api/admin/system/chat-user-groups.ts +++ b/ui/src/api/admin/system/chat-user-groups.ts @@ -1,11 +1,6 @@ import { del, get, post } from '../core/request' import type { ParamsPage, ResponsePage } from '../core/types' -import type { - ChatUserGroupMember, - ChatUserGroupPayload, - ListItem, - RequestParams, -} from '@/api/types' +import type { ChatUserGroupMember, ChatUserGroupPayload, ListItem, Dict } from '@/api/types' const prefix = '/system/group' @@ -25,7 +20,7 @@ const deleteChatUserGroup = (groupId: string) => { } /** 获取用户组成员分页列表。 */ -const getChatUserGroupMembers = (groupId: string, page: ParamsPage, query?: RequestParams) => { +const getChatUserGroupMembers = (groupId: string, page: ParamsPage, query?: Dict) => { return get>( `${prefix}/${groupId}/user_list/${page.currentPage}/${page.pageSize}`, query, diff --git a/ui/src/api/admin/system/chat-user.ts b/ui/src/api/admin/system/chat-user.ts index 3af30185981..f70007728bd 100644 --- a/ui/src/api/admin/system/chat-user.ts +++ b/ui/src/api/admin/system/chat-user.ts @@ -11,7 +11,7 @@ import type { ChatUserQuotaPayload, ChatUserSyncResult, ChatUserUpdateRequest, - RequestParams, + Dict, } from '@/api/types' const prefix = '/system/chat_user' @@ -22,7 +22,7 @@ const getChatUser = () => { } /** 获取对话用户分页列表。 */ -const getChatUserPage = (page: ParamsPage, query?: RequestParams) => { +const getChatUserPage = (page: ParamsPage, query?: Dict) => { return get>( `${prefix}/user_manage/${page.currentPage}/${page.pageSize}`, query, diff --git a/ui/src/api/admin/system/common.ts b/ui/src/api/admin/system/common.ts index eac89adbed0..f8b5c591711 100644 --- a/ui/src/api/admin/system/common.ts +++ b/ui/src/api/admin/system/common.ts @@ -1,5 +1,5 @@ import { get } from '../core/request' -import type { RequestParams, SystemUserOption, CommonUserOption } from '@/api/types' +import type { CommonUserOption, Dict, SystemUserOption } from '@/api/types' /** 获取默认密码。 */ const getDefaultPassword = () => { @@ -7,17 +7,15 @@ const getDefaultPassword = () => { } /** 获得全部用户 */ -const getAllUsers = (query?: RequestParams) => { +const getAllUsers = (query?: Dict) => { return get('/user/list', query) } /** 获取指定工作空间的普通用户选项。 */ -const getWorkspaceMembers = (workspaceId: string, query?: RequestParams) => { +const getWorkspaceMembers = (workspaceId: string, query?: Dict) => { return get(`/workspace/${workspaceId}/user_member`, query) } - - export default { getDefaultPassword, getAllUsers, diff --git a/ui/src/api/admin/system/operate-log.ts b/ui/src/api/admin/system/operate-log.ts index 062f5e5e987..46bdd72fd1c 100644 --- a/ui/src/api/admin/system/operate-log.ts +++ b/ui/src/api/admin/system/operate-log.ts @@ -1,11 +1,11 @@ import { postExportExcel, get, post } from '../core/request' import type { ParamsPage, ResponsePage } from '../core/types' -import type { OperateLog, OperateLogMenuOption, RequestParams } from '@/api/types' +import type { Dict, OperateLog, OperateLogMenuOption } from '@/api/types' const prefix = '/operate_log' /** 获取操作日志分页列表。 */ -const getOperateLogPage = (page: ParamsPage, query: RequestParams) => { +const getOperateLogPage = (page: ParamsPage, query: Dict) => { return get>(`${prefix}/${page.currentPage}/${page.pageSize}`, query) } @@ -15,7 +15,7 @@ const getOperateLogMenuOptions = () => { } /** 导出操作日志。 */ -const exportOperateLog = (query: RequestParams) => { +const exportOperateLog = (query: Dict) => { return postExportExcel('log.xlsx', `${prefix}/export/`, query) } diff --git a/ui/src/api/admin/system/resource-authorization.ts b/ui/src/api/admin/system/resource-authorization.ts index 74dc83a1968..057fed45532 100644 --- a/ui/src/api/admin/system/resource-authorization.ts +++ b/ui/src/api/admin/system/resource-authorization.ts @@ -1,6 +1,6 @@ import { get, put } from '../core/request' import type { - RequestParams, + Dict, ResourceAuthorizationType, ResourcePermissionItem, ResourcePermissionPayload, @@ -13,7 +13,7 @@ const getUserResourcePermissions = ( workspaceId: string, userId: string, resource: ResourceAuthorizationType, - query?: RequestParams, + query?: Dict, ) => { return get( `${prefix(workspaceId)}/user/${userId}/resource/${resource}`, @@ -34,7 +34,6 @@ const putUserResourcePermissions = ( ) } - export default { getUserResourcePermissions, putUserResourcePermissions, diff --git a/ui/src/api/admin/system/role.ts b/ui/src/api/admin/system/role.ts index 56488537321..b574f42935b 100644 --- a/ui/src/api/admin/system/role.ts +++ b/ui/src/api/admin/system/role.ts @@ -2,7 +2,7 @@ import { del, get, post } from '../core/request' import type { ParamsPage, ResponsePage } from '../core/types' import type { CreateRoleMembersRequest, - RequestParams, + Dict, RoleItem, RoleMember, RolePermissionModule, @@ -27,20 +27,18 @@ const deleteRole = (roleId: string) => { return del(`${prefix}/${roleId}`) } - /** 获取指定角色的权限配置。 */ const getRolePermissionList = (roleId: string) => { return get(`${prefix}/${roleId}/permission`) } - /** 保存指定角色的权限配置。 */ const postRolePermissions = (roleId: string, permissions: SaveRolePermissionRequest[]) => { return post(`${prefix}/${roleId}/permission`, permissions) } /** 获取指定角色的成员分页列表。 */ -const getRoleMemberList = (roleId: string, page: ParamsPage, query?: RequestParams) => { +const getRoleMemberList = (roleId: string, page: ParamsPage, query?: Dict) => { return get>( `${prefix}/${roleId}/user_list/${page.currentPage}/${page.pageSize}`, query, diff --git a/ui/src/api/admin/system/user-groups.ts b/ui/src/api/admin/system/user-groups.ts index 290583bb05d..f86fa9814f0 100644 --- a/ui/src/api/admin/system/user-groups.ts +++ b/ui/src/api/admin/system/user-groups.ts @@ -1,6 +1,6 @@ import { del, get, post } from '../core/request' import type { ParamsPage, ResponsePage } from '../core/types' -import type { SystemUserGroup, SystemUserGroupMember, RequestParams } from '@/api/types' +import type { Dict, SystemUserGroup, SystemUserGroupMember } from '@/api/types' const prefix = (workspaceId: string) => `/system/workspace/${workspaceId}/user_group` @@ -24,7 +24,7 @@ const getSystemUserGroupMembers = ( workspaceId: string, groupId: string, page: ParamsPage, - query?: RequestParams, + query?: Dict, ) => { return get>( `${prefix(workspaceId)}/${groupId}/user_list/${page.currentPage}/${page.pageSize}`, diff --git a/ui/src/api/admin/system/user-manage.ts b/ui/src/api/admin/system/user-manage.ts index bcba3adec54..98ad97e1246 100644 --- a/ui/src/api/admin/system/user-manage.ts +++ b/ui/src/api/admin/system/user-manage.ts @@ -1,7 +1,7 @@ import { del, get, post, put } from '../core/request' import type { ResponsePage, ParamsPage, PasswordRequest } from '../core/types' import type { - RequestParams, + Dict, SystemUser, SystemUserPayload, SystemUserUpdateRequest, @@ -12,7 +12,7 @@ import type { const prefix = '/user_manage' /** 获取系统用户分页列表。 */ -const getUserManagePage = (page: ParamsPage, query?: RequestParams) => { +const getUserManagePage = (page: ParamsPage, query?: Dict) => { return get>(`${prefix}/${page.currentPage}/${page.pageSize}`, query) } @@ -51,7 +51,6 @@ const postBatchSetUserWorkspaceRoles = (payload: BatchSetUserWorkspaceRolesReque return post(`${prefix}/batch/add_role_ee`, payload) } - export default { deleteUser, getUserManagePage, diff --git a/ui/src/api/admin/system/workspace.ts b/ui/src/api/admin/system/workspace.ts index 9c3c9f80a30..ca75d5b7e1e 100644 --- a/ui/src/api/admin/system/workspace.ts +++ b/ui/src/api/admin/system/workspace.ts @@ -2,7 +2,7 @@ import { del, get, post } from '../core/request' import type { ParamsPage, ResponsePage } from '../core/types' import type { CreateWorkspaceMemberPayload, - RequestParams, + Dict, WorkspaceItem, WorkspaceMemberItem, } from '@/api/types' @@ -18,7 +18,7 @@ const getSystemWorkspaceList = () => { /** 获取工作空间成员列表 **/ // TODO 工作空间管理员接口 /workspace 未区分 -const getWorkspaceMemberList = (workspace_id: string, page: ParamsPage, query?: RequestParams) => { +const getWorkspaceMemberList = (workspace_id: string, page: ParamsPage, query?: Dict) => { return get>( `${prefix}/${workspace_id}/user_list/${page.currentPage}/${page.pageSize}`, query, diff --git a/ui/src/api/admin/workspace/application/application.ts b/ui/src/api/admin/workspace/application/application.ts index 61e8da697a1..04c503f42cf 100644 --- a/ui/src/api/admin/workspace/application/application.ts +++ b/ui/src/api/admin/workspace/application/application.ts @@ -1,6 +1,6 @@ import { get, post, put } from '../../core/request' import type { ParamsPage, ResponsePage } from '../../core/types' -import type { ApplicationDetail, ApplicationFormPayload, RequestParams } from '@/api/types' +import type { ApplicationDetail, ApplicationFormPayload, Dict } from '@/api/types' import { getWorkspaceId } from '@/utils/workspace-context' const getPrefix = () => { @@ -9,7 +9,7 @@ const getPrefix = () => { } /** 获取工作空间智能体列表。 */ -const getApplicationPage = (page: ParamsPage, query?: RequestParams) => { +const getApplicationPage = (page: ParamsPage, query?: Dict) => { return get>( `${getPrefix()}/${page.currentPage}/${page.pageSize}`, query, diff --git a/ui/src/api/admin/workspace/common.ts b/ui/src/api/admin/workspace/common.ts index 8b959cf8825..891cf1b0bbc 100644 --- a/ui/src/api/admin/workspace/common.ts +++ b/ui/src/api/admin/workspace/common.ts @@ -1,9 +1,9 @@ import { get } from '../core/request' -import type { RequestParams, WorkspaceUserOption } from '@/api/types' +import type { Dict, WorkspaceUserOption } from '@/api/types' import { getWorkspaceId } from '@/utils/workspace-context' /** 获取当前工作空间下的用户选项。 */ -const getAllUsers = (query?: RequestParams) => { +const getAllUsers = (query?: Dict) => { const workspaceId = getWorkspaceId() return get(`/workspace/${workspaceId}/user_list`, query) } diff --git a/ui/src/api/admin/workspace/folder.ts b/ui/src/api/admin/workspace/folder.ts index 36d4f6cc9c1..ac0bc7cbe2b 100644 --- a/ui/src/api/admin/workspace/folder.ts +++ b/ui/src/api/admin/workspace/folder.ts @@ -1,5 +1,5 @@ import { del, get, post, put } from '../core/request' -import type { FolderSource, FolderItem, RequestParams, FolderPayload } from '@/api/types' +import type { Dict, FolderSource, FolderItem, FolderPayload } from '@/api/types' import { getWorkspaceId } from '@/utils/workspace-context' const getPrefix = (source: FolderSource) => { @@ -8,7 +8,7 @@ const getPrefix = (source: FolderSource) => { } /** 获取指定资源模块的 Workspace 文件夹树。 */ -const getFolderTree = (source: FolderSource, query?: RequestParams) => { +const getFolderTree = (source: FolderSource, query?: Dict) => { return get(getPrefix(source), query) } diff --git a/ui/src/api/admin/workspace/knowledge/knowledge.ts b/ui/src/api/admin/workspace/knowledge/knowledge.ts index f329b17e69e..943621bdd53 100644 --- a/ui/src/api/admin/workspace/knowledge/knowledge.ts +++ b/ui/src/api/admin/workspace/knowledge/knowledge.ts @@ -1,6 +1,6 @@ import { del, get } from '../../core/request' import type { ParamsPage, ResponsePage } from '../../core/types' -import type { KnowledgeItem, RequestParams } from '@/api/types' +import type { Dict, KnowledgeItem } from '@/api/types' import { getWorkspaceId } from '@/utils/workspace-context' const getPrefix = () => { @@ -9,7 +9,7 @@ const getPrefix = () => { } /** 获取工作空间知识库分页列表。 */ -const getKnowledgePage = (page: ParamsPage, query?: RequestParams) => { +const getKnowledgePage = (page: ParamsPage, query?: Dict) => { return get>( `${getPrefix()}/${page.currentPage}/${page.pageSize}`, query, diff --git a/ui/src/api/admin/workspace/model/model.ts b/ui/src/api/admin/workspace/model/model.ts index 3dc0c4cc2a6..267e37eb298 100644 --- a/ui/src/api/admin/workspace/model/model.ts +++ b/ui/src/api/admin/workspace/model/model.ts @@ -1,5 +1,5 @@ import { del, get, post, put } from '../../core/request' -import type { RequestParams, ModelPayload, ModelItem } from '@/api/types' +import type { Dict, ModelPayload, ModelItem } from '@/api/types' import { getWorkspaceId } from '@/utils/workspace-context' const getPrefix = () => { @@ -8,7 +8,7 @@ const getPrefix = () => { } /** 获取工作空间模型列表。 */ -const getModelList = (query?: RequestParams) => { +const getModelList = (query?: Dict) => { return get(getPrefix(), query) } diff --git a/ui/src/api/admin/workspace/shared.ts b/ui/src/api/admin/workspace/shared.ts index 54b6f9959f7..68c6b8a6d32 100644 --- a/ui/src/api/admin/workspace/shared.ts +++ b/ui/src/api/admin/workspace/shared.ts @@ -1,6 +1,6 @@ import { get } from '../core/request' import type { ParamsPage, ResponsePage } from '../core/types' -import type { KnowledgeItem, RequestParams, ModelItem, ToolItem } from '@/api/types' +import type { Dict, KnowledgeItem, ModelItem, ToolItem } from '@/api/types' import { getWorkspaceId } from '@/utils/workspace-context' const getPrefix = () => { @@ -9,12 +9,12 @@ const getPrefix = () => { } /** 获取工作空间共享的模型列表。 */ -const getModelList = (query?: RequestParams) => { +const getModelList = (query?: Dict) => { return get(`${getPrefix()}/model`, query) } /** 获取工作空间共享的工具列表。 */ -const getToolPage = (page: ParamsPage, query?: RequestParams) => { +const getToolPage = (page: ParamsPage, query?: Dict) => { return get>( `${getPrefix()}/tool/${page.currentPage}/${page.pageSize}`, query, @@ -22,7 +22,7 @@ const getToolPage = (page: ParamsPage, query?: RequestParams) => { } /** 获取工作空间共享的知识库列表。 */ -const getKnowledgePage = (page: ParamsPage, query?: RequestParams) => { +const getKnowledgePage = (page: ParamsPage, query?: Dict) => { return get>( `${getPrefix()}/knowledge/${page.currentPage}/${page.pageSize}`, query, diff --git a/ui/src/api/admin/workspace/tool/store.ts b/ui/src/api/admin/workspace/tool/store.ts index cee8959fd2d..19d06e514e6 100644 --- a/ui/src/api/admin/workspace/tool/store.ts +++ b/ui/src/api/admin/workspace/tool/store.ts @@ -1,29 +1,28 @@ import { get, post } from '../../core/request' -import type { ToolItem } from '@/api/types' -import type { RequestParams } from '@/api/types' +import type { Dict, ToolItem } from '@/api/types' /** 获取系统内置工具。 */ -const getInternalToolList = (query?: RequestParams) => { +const getInternalToolList = (query?: Dict) => { return get('/workspace/internal/tool', query) } /** 获取工具商店列表。 */ -const getStoreToolList = (query?: RequestParams) => { +const getStoreToolList = (query?: Dict) => { return get('/workspace/store/tool', query) } /** 获取知识库模板商店列表。 */ -const getStoreKnowledgeList = (query?: RequestParams) => { +const getStoreKnowledgeList = (query?: Dict) => { return get('/workspace/store/knowledge_template', query) } /** 获取工作流工具模板商店列表。 */ -const getStoreToolWorkflowList = (query?: RequestParams) => { +const getStoreToolWorkflowList = (query?: Dict) => { return get('/workspace/store/tool_workflow_template', query) } /** 获取应用模板商店列表。 */ -const getStoreApplicationList = (query?: RequestParams) => { +const getStoreApplicationList = (query?: Dict) => { return get('/workspace/store/application_template', query) } diff --git a/ui/src/api/admin/workspace/tool/tool.ts b/ui/src/api/admin/workspace/tool/tool.ts index b4d34cf8352..ad2f7f2cd3c 100644 --- a/ui/src/api/admin/workspace/tool/tool.ts +++ b/ui/src/api/admin/workspace/tool/tool.ts @@ -1,12 +1,6 @@ import { del, getExportFile, get, post, put } from '../../core/request' import type { ParamsPage, ResponsePage } from '../../core/types' -import type { - RequestParams, - ToolDebugPayload, - ToolItem, - ToolPayload, - ToolPylintIssue, -} from '@/api/types' +import type { Dict, ToolDebugPayload, ToolItem, ToolPayload, ToolPylintIssue } from '@/api/types' import { getWorkspaceId } from '@/utils/workspace-context' const getPrefix = () => { @@ -15,7 +9,7 @@ const getPrefix = () => { } /** 获取工具分页列表。 */ -const getToolPage = (page: ParamsPage, query?: RequestParams) => { +const getToolPage = (page: ParamsPage, query?: Dict) => { return get>(`${getPrefix()}/${page.currentPage}/${page.pageSize}`, query) } diff --git a/ui/src/api/types/common.ts b/ui/src/api/types/common.ts index ce2ca75bb0f..ce30b1ae210 100644 --- a/ui/src/api/types/common.ts +++ b/ui/src/api/types/common.ts @@ -1,6 +1,3 @@ -/** 多个公共组件共同使用的通用选项类型。 */ -export type RequestParams = Record - /** 键为字符串的通用字典类型。 */ export type Dict = Record diff --git a/ui/src/api/types/system-operate-log.ts b/ui/src/api/types/system-operate-log.ts index b5fa820e4fc..0749fbad543 100644 --- a/ui/src/api/types/system-operate-log.ts +++ b/ui/src/api/types/system-operate-log.ts @@ -1,5 +1,3 @@ -import type { RequestParams } from './common' - export interface OperateLogUser { email?: string username?: string diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index 16ce657882f..d522c4ee0bd 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -827,21 +827,27 @@ function selectItem(item: SearchListItem, index: number) { 使用方必须从 `@/components/mk-dynamics-form` 手动导入,不安装为 Vue 插件,也不全局注册其内部 字段组件。 -组件专用类型和选项常量维护在 `mk-dynamics-form/type.ts` 与 `mk-dynamics-form/enums.ts`,不放入 +组件专用类型和选项常量维护在 `mk-dynamics-form/type.ts` 与 `mk-dynamics-form/constant.ts`,不放入 项目级 `api/types`、`api/enums` 或 `constants`。使用方统一从组件 `index.ts` 获取公开组件、类型 和字段类型选项,不深层导入内部文件。 +组件 TypeScript 类型使用 PascalCase 和单数语义,例如 `FormField`、`DynamicFormValue`、 +`VisibilityCompareOperator`;数组和集合变量使用复数业务名称。Vue 脚本中的 Props、事件参数和 +局部变量使用 camelCase,模板属性使用 kebab-case。`input_type`、`default_value`、 +`visibility_rules` 等服务端字段协议保持 snake_case,不在组件边界内改名。 + ```vue