Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions ui/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ ui/
│ │ ├── iconfont.js # Generated SVG Symbol resource; replace, do not edit
│ │ ├── logo/ # Product and brand logos
│ │ └── workflow/ # Workflow-related visual assets
│ ├── api/ # Request infrastructure, business APIs, and shared API types
│ ├── api/ # Request infrastructure, business APIs, enums, and shared API types
│ │ ├── enums/ # Backend fixed-value enums, exposed through one public entry
│ │ ├── types/ # Types shared by APIs and their View or Component consumers
│ │ └── API_README.md # API layering, placement, typing, and request rules
│ ├── components/ # Shared UI and cross-page business components
Expand Down Expand Up @@ -115,6 +116,8 @@ Structural responsibilities:
route and page-level actions around `MkWorkflow`.
- Put server communication in `api/`, isolate Admin and Chat request systems, and group business APIs
by domain and resource according to `src/api/API_README.md`.
- Put backend fixed-value enums in `api/enums/` and import them through `@/api/enums`; keep
`api/types/` as the type-only public entry for API and UI consumers.
- Put constants shared by most pages or multiple business modules in `constants/`, and split files by a specific domain. Keep constants used by only one page or feature with their owning code.
- Put shared client state in `stores/`; component-local state should remain in the component.
- Reuse the Pinia instance exported by `stores/index.ts`; application code accesses Store instances
Expand Down Expand Up @@ -175,7 +178,7 @@ Keep these behaviors:
- `base: './'` for v2-compatible static deployment.
- `envDir: './env'`.
- Proxy `/admin/api`, `/chat/api`, `/doc`, `/schema`, `/static`, and `oss` file paths to the backend.
- Keep Tailwind, Vue, Vue JSX, Vue DevTools, Element Plus auto import, and component auto registration plugins.
- Keep Tailwind, Vue, Vue JSX, Element Plus auto import, and component auto registration plugins.
- Do not add `unplugin-vue-define-options`; Vue 3.5 already supports `defineOptions`.
- Avoid adding `vite-plugin-html` unless multi-template requirements exceed Vite's built-in HTML env replacement.

Expand Down
1 change: 0 additions & 1 deletion ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
"unplugin-auto-import": "^21.0.0",
"unplugin-vue-components": "^32.1.0",
"vite": "^8.0.16",
"vite-plugin-vue-devtools": "^8.1.2",
"vue-eslint-parser": "^10.4.1",
"vue-tsc": "^3.3.5"
},
Expand Down
21 changes: 14 additions & 7 deletions ui/src/api/API_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ src/api/
│ ├── workspace/ # 工作空间业务接口
│ └── system/ # 系统管理业务接口
├── chat/ # Chat 独立请求体系,当前预留
├── enums/ # 后端固定枚举值
│ ├── index.ts # API 枚举值的唯一导入入口
│ └── <domain>.ts # 按明确业务域拆分的枚举值
├── types/ # API 与 View/Component 共用的业务类型
│ ├── index.ts # API 公共类型的唯一导入入口
│ ├── common.ts # 多个 API 业务域共用的基础类型
Expand Down Expand Up @@ -46,9 +49,17 @@ src/api/
`LoginApi.postLogin()`;System Workspace API 使用
`import WorkspaceApi from '@/api/admin/system/workspace'`。

## 类型组织
## 枚举与类型组织

API 类型统一在 `src/api` 范围内管理,相关规则由本文档统一维护。
API 枚举与类型统一在 `src/api` 范围内管理,相关规则由本文档统一维护。

后端字段的固定枚举值放在 `src/api/enums/<domain>.ts`,使用 `as const` 对象声明,并通过
`src/api/enums/index.ts` 统一导出。业务代码统一从 `@/api/enums` 导入运行时枚举值,不直接
引用领域文件;不得重复使用裸字符串或另建同值常量。

`src/api/enums` 按明确业务域拆分文件,不创建收集无关枚举的通用文件。枚举的联合类型在对应的
`src/api/types/<domain>.ts` 中由枚举对象派生,并继续通过 `@/api/types` 对外提供。例如
`TOOL_TYPE` 从 `@/api/enums` 导入,`ToolType` 从 `@/api/types` 导入。

新增或移动类型时按以下顺序判断:

Expand All @@ -68,11 +79,7 @@ API 类型统一在 `src/api` 范围内管理,相关规则由本文档统一
`import type { ... } from '@/api/types'` 导入,不写 `/index.ts`。
- `src/api/types/index.ts` 只负责导出各业务域类型,不直接声明类型。
- 新增类型前先搜索是否已有等价声明,优先复用或扩展已有类型。
- 后端字段的固定协议值与其类型放在同一个 `src/api/types/<domain>.ts` 中:使用
`as const` 对象声明运行时常量,并从该对象派生联合类型。协议常量是唯一数据源;新增、删除或
修改协议值只维护对应的 API 类型文件,业务判断不得重复使用裸字符串或另建同值常量。
- 同时导出协议常量的类型模块在 `src/api/types/index.ts` 中使用 `export *`;只有纯类型模块使用
`export type *`。
- `src/api/types/index.ts` 只使用 `export type *` 导出类型,运行时值不得从 `@/api/types` 暴露。
- 同一业务边界内的重复类型提取到最近共同目录的 `common.ts`;`common.ts` 不得成为无关类型
的集合。
- API 与 View 或 Component 使用同一业务类型时只保留一份声明,不得在两层分别定义。
Expand Down
10 changes: 5 additions & 5 deletions ui/src/api/admin/system/auth-scan-setting.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { get, post, put } from '../core/request'
import type { QrLoginPlatform, QrLoginPlatformRequest } from '@/api/types'
import type { QrLoginPlatform, QrLoginPlatformPayload } from '@/api/types'

const prefix = '/platform/source'

Expand All @@ -9,13 +9,13 @@ const getQrLoginPlatforms = () => {
}

/** 保存扫码登录平台配置。 */
const putQrLoginPlatform = (platform: QrLoginPlatformRequest) => {
return put<QrLoginPlatformRequest, boolean>(prefix, platform)
const putQrLoginPlatform = (payload: QrLoginPlatformPayload) => {
return put<QrLoginPlatformPayload, boolean>(prefix, payload)
}

/** 校验扫码登录平台配置是否可用。 */
const postValidateQrLoginPlatform = (platform: QrLoginPlatformRequest) => {
return post<QrLoginPlatformRequest, boolean>(`${prefix}`, platform)
const postValidateQrLoginPlatform = (payload: QrLoginPlatformPayload) => {
return post<QrLoginPlatformPayload, boolean>(`${prefix}`, payload)
}

export default {
Expand Down
18 changes: 9 additions & 9 deletions ui/src/api/admin/system/auth-setting.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
import { get, post, put } from '../core/request'
import type { AuthProviderSetting, AuthProviderType, LoginAuthSetting } from '@/api/types'
import type { AuthProviderSettingPayload, AuthProviderType, LoginAuthSettingPayload } from '@/api/types'

const prefix = '/auth'

/** 获取指定认证源配置。 */
const getAuthSetting = (authType: AuthProviderType) => {
return get<Partial<AuthProviderSetting>>(`${prefix}/${authType}/detail`)
return get<Partial<AuthProviderSettingPayload>>(`${prefix}/${authType}/detail`)
}

/** 测试认证源连接。 */
const postAuthSettingConnection = (setting: AuthProviderSetting) => {
return post<AuthProviderSetting, boolean>(`${prefix}/connection`, setting)
const postAuthSettingConnection = (payload: AuthProviderSettingPayload) => {
return post<AuthProviderSettingPayload, boolean>(`${prefix}/connection`, payload)
}

/** 保存指定认证源配置。 */
const putAuthSetting = (authType: AuthProviderType, setting: AuthProviderSetting) => {
return put<AuthProviderSetting, boolean>(`${prefix}/${authType}/info`, setting)
const putAuthSetting = (authType: AuthProviderType, payload: AuthProviderSettingPayload) => {
return put<AuthProviderSettingPayload, boolean>(`${prefix}/${authType}/info`, payload)
}

/** 获取系统登录设置。 */
const getLoginSetting = () => {
return get<LoginAuthSetting>(`${prefix}/setting`)
return get<LoginAuthSettingPayload>(`${prefix}/setting`)
}

/** 保存系统登录设置。 */
const putLoginSetting = (setting: LoginAuthSetting) => {
return put<LoginAuthSetting, boolean>(`${prefix}/setting`, setting)
const putLoginSetting = (payload: LoginAuthSettingPayload) => {
return put<LoginAuthSettingPayload, boolean>(`${prefix}/setting`, payload)
}

export default {
Expand Down
10 changes: 5 additions & 5 deletions ui/src/api/admin/system/chat-user-auth-scan.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { get, post, put } from '../core/request'
import type { QrLoginPlatform, QrLoginPlatformRequest } from '@/api/types'
import type { QrLoginPlatform, QrLoginPlatformPayload } from '@/api/types'

const prefix = '/chat_user/auth/platform/source'

Expand All @@ -9,13 +9,13 @@ const getQrLoginPlatforms = () => {
}

/** 保存对话用户扫码登录平台配置。 */
const postQrLoginPlatform = (platform: QrLoginPlatformRequest) => {
return post<QrLoginPlatformRequest, boolean>(prefix, platform)
const postQrLoginPlatform = (payload: QrLoginPlatformPayload) => {
return post<QrLoginPlatformPayload, boolean>(prefix, payload)
}

/** 校验对话用户扫码登录平台配置是否可用。 */
const putValidateQrLoginPlatform = (platform: QrLoginPlatformRequest) => {
return put<QrLoginPlatformRequest, boolean>(prefix, platform)
const putValidateQrLoginPlatform = (payload: QrLoginPlatformPayload) => {
return put<QrLoginPlatformPayload, boolean>(prefix, payload)
}

export default {
Expand Down
12 changes: 6 additions & 6 deletions ui/src/api/admin/system/chat-user-auth.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import { get, post, put } from '../core/request'
import type { AuthProviderSetting, AuthProviderType, LoginAuthSetting } from '@/api/types'
import type { AuthProviderSettingPayload, AuthProviderType } from '@/api/types'

const prefix = '/chat_user/auth'

/** 获取对话用户指定认证源配置。 */
const getAuthSetting = (authType: AuthProviderType) => {
return get<Partial<AuthProviderSetting>>(`${prefix}/${authType}/detail`)
return get<Partial<AuthProviderSettingPayload>>(`${prefix}/${authType}/detail`)
}

/** 测试对话用户认证源连接。 */
const postAuthSettingConnection = (setting: AuthProviderSetting) => {
return post<AuthProviderSetting, boolean>(`${prefix}/connection`, setting)
const postAuthSettingConnection = (payload: AuthProviderSettingPayload) => {
return post<AuthProviderSettingPayload, boolean>(`${prefix}/connection`, payload)
}

/** 保存对话用户指定认证源配置。 */
const putAuthSetting = (authType: AuthProviderType, setting: AuthProviderSetting) => {
return put<AuthProviderSetting, boolean>(`${prefix}/${authType}/info`, setting)
const putAuthSetting = (authType: AuthProviderType, payload: AuthProviderSettingPayload) => {
return put<AuthProviderSettingPayload, boolean>(`${prefix}/${authType}/info`, payload)
}
export default {
getAuthSetting,
Expand Down
6 changes: 3 additions & 3 deletions ui/src/api/admin/system/chat-user-groups.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { del, get, post } from '../core/request'
import type { ParamsPage, ResponsePage } from '../core/types'
import type {
ChatUserGroupMember,
ChatUserGroupRequest,
ChatUserGroupPayload,
ListItem,
RequestParams,
} from '@/api/types'
Expand All @@ -15,8 +15,8 @@ const getChatUserGroups = () => {
}

/** 创建或重命名对话用户组。 */
const postChatUserGroup = (group: ChatUserGroupRequest) => {
return post<ChatUserGroupRequest, boolean>(prefix, group)
const postChatUserGroup = (payload: ChatUserGroupPayload) => {
return post<ChatUserGroupPayload, boolean>(prefix, payload)
}

/** 删除对话用户组。 */
Expand Down
10 changes: 5 additions & 5 deletions ui/src/api/admin/system/chat-user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type {
BatchSetChatUserGroupsRequest,
ChatUserBase,
ChatUser,
ChatUserRequest,
ChatUserPayload,
ChatUserSyncResult,
ChatUserUpdateRequest,
RequestParams,
Expand All @@ -26,13 +26,13 @@ const getChatUserPage = (page: ParamsPage, query?: RequestParams) => {
}

/** 创建对话用户。 */
const postChatUser = (user: ChatUserRequest) => {
return post<ChatUserRequest, ChatUser>(prefix, user)
const postChatUser = (payload: ChatUserPayload) => {
return post<ChatUserPayload, ChatUser>(prefix, payload)
}

/** 编辑对话用户。 */
const putChatUser = (userId: string, user: ChatUserUpdateRequest) => {
return put<ChatUserUpdateRequest, ChatUser>(`${prefix}/${userId}`, user)
const putChatUser = (userId: string, payload: ChatUserUpdateRequest) => {
return put<ChatUserUpdateRequest, ChatUser>(`${prefix}/${userId}`, payload)
}

/** 修改对话用户密码。 */
Expand Down
12 changes: 6 additions & 6 deletions ui/src/api/admin/system/email-setting.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import { get, post, put } from '../core/request'
import type { EmailSetting } from '@/api/types'
import type { EmailSettingPayload } from '@/api/types'

const prefix = '/email_setting'

/** 获取邮箱设置。 */
const getEmailSetting = () => {
return get<Partial<EmailSetting>>(prefix)
return get<Partial<EmailSettingPayload>>(prefix)
}

/** 测试邮箱设置是否可用。 */
const postEmailSettingTest = (setting: EmailSetting) => {
return post<EmailSetting, boolean>(prefix, setting)
const postEmailSettingTest = (payload: EmailSettingPayload) => {
return post<EmailSettingPayload, boolean>(prefix, payload)
}

/** 保存邮箱设置。 */
const putEmailSetting = (setting: EmailSetting) => {
return put<EmailSetting, boolean>(prefix, setting)
const putEmailSetting = (payload: EmailSettingPayload) => {
return put<EmailSettingPayload, boolean>(prefix, payload)
}

export default {
Expand Down
11 changes: 5 additions & 6 deletions ui/src/api/admin/system/role.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ import type {
RoleItem,
RoleMember,
RolePermissionModule,
SaveRoleRequest,
RolePayload,
SaveRolePermissionRequest,
RoleType,
} from '@/api/types'

const prefix = '/system/role'
Expand All @@ -19,8 +18,8 @@ const getRoleList = () => {
}

/** 创建或重命名自定义角色。 */
const postRole = (role: SaveRoleRequest) => {
return post<SaveRoleRequest, RoleItem>(prefix, role)
const postRole = (payload: RolePayload) => {
return post<RolePayload, RoleItem>(prefix, payload)
}

/** 删除自定义角色。 */
Expand Down Expand Up @@ -49,8 +48,8 @@ const getRoleMemberList = (roleId: string, page: ParamsPage, query?: RequestPara
}

/** 为指定角色添加成员。 */
const postRoleMembers = (roleId: string, request: CreateRoleMembersRequest) => {
return post<CreateRoleMembersRequest, boolean>(`${prefix}/${roleId}/add_member`, request)
const postRoleMembers = (roleId: string, payload: CreateRoleMembersRequest) => {
return post<CreateRoleMembersRequest, boolean>(`${prefix}/${roleId}/add_member`, payload)
}

/** 从指定角色移除成员。 */
Expand Down
19 changes: 9 additions & 10 deletions ui/src/api/admin/system/user-manage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ import type { ResponsePage, ParamsPage, PasswordRequest } from '../core/types'
import type {
RequestParams,
SystemUser,
SystemUserRequest,
SystemUserPayload,
SystemUserUpdateRequest,
SystemUserOption,
BatchSetUserRolesRequest,
BatchSetUserWorkspaceRolesRequest,
} from '@/api/types'
Expand All @@ -18,13 +17,13 @@ const getUserManagePage = (page: ParamsPage, query?: RequestParams) => {
}

/** 创建系统用户。 */
const postUser = (user: SystemUserRequest) => {
return post<SystemUserRequest, SystemUser>(prefix, user)
const postUser = (payload: SystemUserPayload) => {
return post<SystemUserPayload, SystemUser>(prefix, payload)
}

/** 编辑系统用户。 */
const putUser = (userId: string, user: SystemUserUpdateRequest) => {
return put<SystemUserUpdateRequest, SystemUser>(`${prefix}/${userId}`, user)
const putUser = (userId: string, payload: SystemUserUpdateRequest) => {
return put<SystemUserUpdateRequest, SystemUser>(`${prefix}/${userId}`, payload)
}

/** 修改系统用户密码。 */
Expand All @@ -43,13 +42,13 @@ const postBatchDeleteUsers = (userIds: string[]) => {
}

/** 专业版批量设置系统用户角色。 */
const postBatchSetUserRoles = (request: BatchSetUserRolesRequest) => {
return post<BatchSetUserRolesRequest, boolean>(`${prefix}/batch/add_role`, request)
const postBatchSetUserRoles = (payload: BatchSetUserRolesRequest) => {
return post<BatchSetUserRolesRequest, boolean>(`${prefix}/batch/add_role`, payload)
}

/** 企业版批量设置系统用户角色及工作空间。 */
const postBatchSetUserWorkspaceRoles = (request: BatchSetUserWorkspaceRolesRequest) => {
return post<BatchSetUserWorkspaceRolesRequest, boolean>(`${prefix}/batch/add_role_ee`, request)
const postBatchSetUserWorkspaceRoles = (payload: BatchSetUserWorkspaceRolesRequest) => {
return post<BatchSetUserWorkspaceRolesRequest, boolean>(`${prefix}/batch/add_role_ee`, payload)
}


Expand Down
6 changes: 3 additions & 3 deletions ui/src/api/admin/system/workspace.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { del, get, post } from '../core/request'
import type { ParamsPage, ResponsePage } from '../core/types'
import type {
CreateWorkspaceMemberParamsItem,
CreateWorkspaceMemberPayload,
RequestParams,
WorkspaceItem,
WorkspaceMemberItem,
Expand Down Expand Up @@ -41,8 +41,8 @@ const deleteWorkspace = (workspaceId: string) => {
}

/** 新增工作空间成员。 */
const postWorkspaceMembers = (workspaceId: string, members: CreateWorkspaceMemberParamsItem[]) => {
return post<CreateWorkspaceMemberParamsItem[], boolean>(
const postWorkspaceMembers = (workspaceId: string, members: CreateWorkspaceMemberPayload[]) => {
return post<CreateWorkspaceMemberPayload[], boolean>(
`${prefix}/${workspaceId}/add_member`,
members,
)
Expand Down
15 changes: 5 additions & 10 deletions ui/src/api/admin/workspace/folder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,16 @@ const getFolderTree = (source: FolderSource, query?: RequestParams) => {
return get<FolderItem[]>(getPrefix(source), query)
}

/** 更新 Workspace 的文件夹。 */
const putFolder = (folderId: string, source: FolderSource, payload?: FolderRequest) => {
return put<FolderRequest, FolderItem>(`${getPrefix(source)}/${folderId}`, payload)
}

/** 在指定资源模块中创建 Workspace 文件夹。 */
const postFolder = (source: FolderSource, payload: FolderRequest) => {
return post<FolderRequest, FolderItem>(getPrefix(source), payload)
}

/** 更新指定 Workspace 文件夹。 */
const putFolder = (
workspaceId: string,
source: FolderSource,
folderId: string,
payload: FolderRequest,
) => {
return put<FolderRequest, FolderItem>(`${getPrefix(source)}/${folderId}`, payload)
}

/** 删除指定 Workspace 文件夹及其中的资源。 */
const deleteFolder = (source: FolderSource, folderId: string) => {
return del<boolean>(`${getPrefix(source)}/${folderId}`)
Expand Down
Loading
Loading