From 1d3c41f62cf27717f5c965bd1813e153ad1ff141 Mon Sep 17 00:00:00 2001 From: zhaowei Date: Mon, 11 Aug 2025 13:48:16 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E9=9B=86=E6=88=90qiankun?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/config/config.ts | 15 +++++++++++++++ react-ui/config/routes.ts | 24 ++++++++++++++++++++++++ react-ui/package.json | 2 +- react-ui/src/app.tsx | 12 ++++++++++++ react-ui/src/pages/Mixed/index.less | 3 +++ react-ui/src/pages/Mixed/index.tsx | 25 +++++++++++++++++++++++++ 6 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 react-ui/src/pages/Mixed/index.less create mode 100644 react-ui/src/pages/Mixed/index.tsx diff --git a/react-ui/config/config.ts b/react-ui/config/config.ts index 653f2a54..8d0e45d1 100644 --- a/react-ui/config/config.ts +++ b/react-ui/config/config.ts @@ -159,4 +159,19 @@ export default defineConfig({ javascriptEnabled: true, }, valtio: {}, + qiankun: { + master: { + sandbox: true, + apps: [ + { + name: 'app1', + entry: '//localhost:7001', + }, + { + name: 'app2', + entry: '//localhost:3000', + }, + ], + }, + }, }); diff --git a/react-ui/config/routes.ts b/react-ui/config/routes.ts index 1a53fe8b..ce40e189 100644 --- a/react-ui/config/routes.ts +++ b/react-ui/config/routes.ts @@ -596,6 +596,18 @@ export default [ }, ], }, + { + name: 'mixed', + path: '/mixed', + routes: [ + { + name: '父子页面混合', + path: '', + key: 'mixed', + component: './Mixed/index', + }, + ], + }, { name: '算力积分', path: '/points', @@ -608,6 +620,18 @@ export default [ }, ], }, + { + path: '/app1/*', + name: '子应用1', + microApp: 'app1', + layout: true, + }, + { + path: '/app2/*', + name: '子应用2', + microApp: 'app2', + layout: true, + }, { path: '*', layout: false, diff --git a/react-ui/package.json b/react-ui/package.json index 21710bca..953b6329 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -1,5 +1,5 @@ { - "name": "cl-model", + "name": "ci4s", "version": "1.0.0", "private": true, "description": "", diff --git a/react-ui/src/app.tsx b/react-ui/src/app.tsx index 9c6650f2..5df18e05 100644 --- a/react-ui/src/app.tsx +++ b/react-ui/src/app.tsx @@ -4,6 +4,7 @@ import { type GlobalInitialState } from '@/types'; import { menuItemRender } from '@/utils/menuRender'; import type { Settings as LayoutSettings } from '@ant-design/pro-components'; import { RuntimeConfig, history } from '@umijs/max'; +import { useState } from 'react'; import { RuntimeAntdConfig } from 'umi'; import defaultSettings from '../config/defaultSettings'; import '../public/fonts/font.css'; @@ -172,6 +173,17 @@ export function render(oldRender: () => void) { }); } +export const useQiankunStateForSlave = () => { + const [globalState, setGlobalState] = useState({ + slogan: 'Hello MicroFrontend', + }); + + return { + globalState, + setGlobalState, + }; +}; + // 主题修改 export const antd: RuntimeAntdConfig = (memo) => { memo.theme ??= {}; diff --git a/react-ui/src/pages/Mixed/index.less b/react-ui/src/pages/Mixed/index.less new file mode 100644 index 00000000..911ec33c --- /dev/null +++ b/react-ui/src/pages/Mixed/index.less @@ -0,0 +1,3 @@ +.mixed { + height: 100%; +} diff --git a/react-ui/src/pages/Mixed/index.tsx b/react-ui/src/pages/Mixed/index.tsx new file mode 100644 index 00000000..c9d657d9 --- /dev/null +++ b/react-ui/src/pages/Mixed/index.tsx @@ -0,0 +1,25 @@ +import { MicroAppWithMemoHistory } from '@umijs/max'; +import { Tabs } from 'antd'; +import styles from './index.less'; + +const Docs = () => { + const mirrorTabItems = [ + { + key: '1', + label: '父页面', + children:
Parent
, + }, + { + key: '2', + label: '子页面', + children: , + }, + ]; + + return ( +
+ +
+ ); +}; +export default Docs; From 7251927ccb8ebf2c9de4fa853a56be0fa35a3e9e Mon Sep 17 00:00:00 2001 From: zhaowei Date: Tue, 12 Aug 2025 10:49:24 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=A8=A1=E5=9E=8B=E3=80=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E7=89=88=E6=9C=AC=E8=87=AA=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/config/proxy.ts | 2 +- .../components/AddDatasetModal/index.tsx | 128 +--------------- .../components/AddModelModal/index.tsx | 120 +-------------- .../components/AddVersionModal/index.tsx | 22 ++- .../components/ResourceInfo/index.less | 7 + .../Dataset/components/ResourceInfo/index.tsx | 139 +++++++++++------- react-ui/src/pages/Dataset/config.tsx | 5 + .../components/ExportModelModal/index.tsx | 45 ++---- react-ui/src/services/dataset/index.js | 20 ++- 9 files changed, 164 insertions(+), 324 deletions(-) diff --git a/react-ui/config/proxy.ts b/react-ui/config/proxy.ts index 20769b3c..1ecbb4b4 100644 --- a/react-ui/config/proxy.ts +++ b/react-ui/config/proxy.ts @@ -22,7 +22,7 @@ export default { // 要代理的地址 target: 'http://172.20.32.197:31213', // 开发环境 // target: 'http://172.20.32.235:31213', // 测试环境 - // target: 'http://172.20.32.44:8082', + // target: 'http://172.20.32.127:8082', // target: 'http://172.20.32.164:8082', // 配置了这个可以从 http 代理到 https // 依赖 origin 的功能可能需要这个,比如 cookie diff --git a/react-ui/src/pages/Dataset/components/AddDatasetModal/index.tsx b/react-ui/src/pages/Dataset/components/AddDatasetModal/index.tsx index 8bb68cf9..ea8f9765 100644 --- a/react-ui/src/pages/Dataset/components/AddDatasetModal/index.tsx +++ b/react-ui/src/pages/Dataset/components/AddDatasetModal/index.tsx @@ -1,30 +1,8 @@ -import { getAccessToken } from '@/access'; -import KFIcon from '@/components/KFIcon'; import KFModal from '@/components/KFModal'; -import { CategoryData, DataSource, ResourceType, resourceConfig } from '@/pages/Dataset/config'; +import { CategoryData, DataSource } from '@/pages/Dataset/config'; import { addDataset } from '@/services/dataset/index.js'; import { to } from '@/utils/promise'; -import { - getFileListFromEvent, - limitUploadFileType, - removeUploadedFile, - validateUploadFiles, -} from '@/utils/ui'; -import { - Button, - Form, - Input, - Radio, - Select, - Upload, - UploadFile, - message, - type ModalProps, - type UploadProps, -} from 'antd'; -import { omit } from 'lodash'; -import { useState } from 'react'; -import styles from './index.less'; +import { Form, Input, Radio, Select, message, type ModalProps } from 'antd'; interface AddDatasetModalProps extends Omit { typeList: CategoryData[]; @@ -33,20 +11,6 @@ interface AddDatasetModalProps extends Omit { } function AddDatasetModal({ typeList, tagList, onOk, ...rest }: AddDatasetModalProps) { - const [uuid] = useState(Date.now()); - - // 上传组件参数 - const uploadProps: UploadProps = { - action: resourceConfig[ResourceType.Dataset].uploadAction, - headers: { - Authorization: getAccessToken() || '', - }, - defaultFileList: [], - accept: '.zip,.tgz', - beforeUpload: limitUploadFileType('zip,tgz'), - onRemove: removeUploadedFile, - }; - // 上传请求 const createDataset = async (params: any) => { const [res] = await to(addDataset(params)); @@ -58,22 +22,11 @@ function AddDatasetModal({ typeList, tagList, onOk, ...rest }: AddDatasetModalPr // 提交 const onFinish = (formData: any) => { - const fileList: UploadFile[] = formData['fileList'] ?? []; - if (validateUploadFiles(fileList)) { - const params = { - ...omit(formData, ['fileList']), - dataset_source: DataSource.Create, - dataset_version_vos: fileList.map((item) => { - const data = item.response?.data?.[0] ?? {}; - return { - file_name: data.fileName, - file_size: data.fileSize, - url: data.url, - }; - }), - }; - createDataset(params); - } + const params = { + ...formData, + dataset_source: DataSource.Create, + }; + createDataset(params); }; return ( @@ -108,32 +61,6 @@ function AddDatasetModal({ typeList, tagList, onOk, ...rest }: AddDatasetModalPr > - { - if (value === 'master') { - return Promise.reject(`数据集版本不能为 master`); - } else if (value === 'origin') { - return Promise.reject(`数据集版本不能为 origin`); - } - return Promise.resolve(); - }, - }, - ]} - > - - - { - if (value === 'master') { - return Promise.reject(`模型版本不能为 master`); - } else if (value === 'origin') { - return Promise.reject(`模型版本不能为 origin`); - } - return Promise.resolve(); - }, - }, - ]} - > - - + { const { message } = App.useApp(); // 获取详情 - const getResourceDetail = useCallback(async () => { - const params = { - id: resourceId, - owner, - name, - identifier, - version, - is_public, - }; - const request = config.getInfo; - const [res] = await to(request(params)); - if (res && res.data) { - setInfo(res.data); - } - }, [config, resourceId, owner, name, identifier, version, is_public]); + const getResourceDetail = useCallback( + async (version: string | undefined) => { + const params = { + id: resourceId, + owner, + name, + identifier, + version, + is_public, + }; + const request = config.getInfo; + const [res] = await to(request(params)); + if (res && res.data) { + setInfo(res.data); + } + }, + [config, resourceId, owner, name, identifier, is_public], + ); // 获取版本列表 const getVersionList = useCallback( @@ -100,14 +104,15 @@ const ResourceInfo = ({ resourceType }: ResourceInfoProps) => { } } else { setVersion(undefined); + getResourceDetail(undefined); } }, - [config, owner, identifier, versionParam], + [config, owner, identifier, versionParam, getResourceDetail], ); useEffect(() => { if (version) { - getResourceDetail(); + getResourceDetail(version); } }, [version, getResourceDetail]); @@ -116,7 +121,7 @@ const ResourceInfo = ({ resourceType }: ResourceInfoProps) => { }, [getVersionList]); // 新建版本 - const showModal = () => { + const showAddVersionModal = () => { const { close } = openAntdModal(AddVersionModal, { resourceType: resourceType, resourceId: resourceId, @@ -278,44 +283,70 @@ const ResourceInfo = ({ resourceType }: ResourceInfoProps) => { {info.praises_count} - - 版本号: - + + + + + ) : ( + - 删除版本 - - + {info.description ?? '暂无描述'} + + )}
- setActiveTab(key)}> -
- {activeTab === ResourceInfoTabKeys.Evolution && } -
+ {version ? ( + <> + setActiveTab(key)}> +
+ {activeTab === ResourceInfoTabKeys.Evolution && } +
+ + ) : ( + + )}
); diff --git a/react-ui/src/pages/Dataset/config.tsx b/react-ui/src/pages/Dataset/config.tsx index 4799c75c..0369bc8f 100644 --- a/react-ui/src/pages/Dataset/config.tsx +++ b/react-ui/src/pages/Dataset/config.tsx @@ -11,9 +11,11 @@ import { deleteModelVersion, getDatasetInfo, getDatasetList, + getDatasetNextVersionReq, getDatasetVersionList, getModelInfo, getModelList, + getModelNextVersionReq, getModelVersionList, } from '@/services/dataset/index.js'; import { limitUploadFileType } from '@/utils/ui'; @@ -39,6 +41,7 @@ type ResourceTypeInfo = { deleteVersion: (params: any) => Promise; // 删除版本 getInfo: (params: any) => Promise; // 获取详情 compareVersion: (params: any) => Promise; // 版本对比 + getNextVersion: (params: any) => Promise; // 获取下一个版本 name: string; // 名称 typeParamKey: 'data_type' | 'model_type'; // 类型参数名称,获取资源列表接口使用 tagParamKey: 'data_tag' | 'model_tag'; // 标签参数名称,获取资源列表接口使用 @@ -68,6 +71,7 @@ export const resourceConfig: Record = { deleteVersion: deleteDatasetVersion, getInfo: getDatasetInfo, compareVersion: compareDatasetVersion, + getNextVersion: getDatasetNextVersionReq, name: '数据集', typeParamKey: 'data_type', tagParamKey: 'data_tag', @@ -106,6 +110,7 @@ export const resourceConfig: Record = { deleteVersion: deleteModelVersion, getInfo: getModelInfo, compareVersion: compareModelVersion, + getNextVersion: getModelNextVersionReq, name: '模型', typeParamKey: 'model_type', tagParamKey: 'model_tag', diff --git a/react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx b/react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx index 60f0555b..a49bf6a6 100644 --- a/react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx +++ b/react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx @@ -3,12 +3,10 @@ import KFModal from '@/components/KFModal'; import { DataSource, ResourceType, - ResourceVersionData, resourceConfig, type ResourceData, } from '@/pages/Dataset/config'; import { to } from '@/utils/promise'; -import { InfoCircleOutlined } from '@ant-design/icons'; import { Form, Input, ModalProps, Select } from 'antd'; import { pick } from 'lodash'; import { useEffect, useState } from 'react'; @@ -44,7 +42,6 @@ function ExportModelModal({ }: ExportModelModalProps) { const [form] = Form.useForm(); const [resources, setResources] = useState([]); - const [versions, setVersions] = useState([]); const config = resourceConfig[resourceType]; const layout = { @@ -77,35 +74,24 @@ function ExportModelModal({ return undefined; }; - // 版本 tooltip - const getTooltip = () => { - const id = form.getFieldValue('id'); - const resource = getSelectedResource(id); - const name = resource?.name ?? ''; - const versionNames = versions.map((item: ResourceVersionData) => item.name).join('、'); - const tooltip = - versions.length > 0 ? `${name}有以下版本:\n${versionNames}\n注意不能重复` : undefined; - return tooltip; - }; - // 处理数据集、模型选择变化 const handleResourceChange = (id: number | undefined) => { if (id) { - getRecourceVersions(id); + getRecourceNextVersion(id); } else { - setVersions([]); + form.setFieldValue('version', ''); } }; - // 获取数据集、模型版本列表 - const getRecourceVersions = async (id: number) => { + // 获取数据集、模型下一个版本 + const getRecourceNextVersion = async (id: number) => { const resource = getSelectedResource(id); if (!resource) { return; } - const [res] = await to(config.getVersions(pick(resource, ['identifier', 'owner']))); + const [res] = await to(config.getNextVersion(pick(resource, ['identifier', 'owner']))); if (res && res.data) { - setVersions(res.data); + form.setFieldValue('version', res.data); } }; @@ -184,15 +170,6 @@ function ExportModelModal({ , - } - : undefined - } rules={[ { required: true, message: `请输入${config.name}版本` }, { @@ -205,8 +182,6 @@ function ExportModelModal({ return Promise.reject(`${config.name}版本不能为 master`); } else if (value === 'origin') { return Promise.reject(`${config.name}版本不能为 origin`); - } else if (value && versions.map((item) => item.name).includes(value)) { - return Promise.reject(`${config.name}版本已存在`); } else { return Promise.resolve(); } @@ -214,7 +189,13 @@ function ExportModelModal({ }, ]} > - + Date: Mon, 1 Sep 2025 15:09:27 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=81=AB=E7=9F=B3=E7=94=A8=E6=88=B7id-uapId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/src/pages/System/User/edit.tsx | 2 ++ react-ui/src/types/system/user.d.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/react-ui/src/pages/System/User/edit.tsx b/react-ui/src/pages/System/User/edit.tsx index fc5809f4..dc90e47c 100644 --- a/react-ui/src/pages/System/User/edit.tsx +++ b/react-ui/src/pages/System/User/edit.tsx @@ -63,6 +63,7 @@ const UserForm: React.FC = (props) => { loginIp: props.values.loginIp, loginDate: props.values.loginDate, remark: props.values.remark, + // gitLinkUsername: props.values.gitLinkUsername, // gitLinkPassword: props.values.gitLinkPassword, credit: props.values.credit, @@ -81,6 +82,7 @@ const UserForm: React.FC = (props) => { ...values, userId: props.values.userId, originPassword: props.values.originPassword, + uapId: props.values.uapId, }; props.onSubmit(params as UserFormData); }; diff --git a/react-ui/src/types/system/user.d.ts b/react-ui/src/types/system/user.d.ts index c129130c..79235374 100644 --- a/react-ui/src/types/system/user.d.ts +++ b/react-ui/src/types/system/user.d.ts @@ -23,6 +23,7 @@ declare namespace API.System { gitLinkPassword?: string; credit?: number; originPassword?: string; + uapId: string?; } export interface UserListParams {