diff --git a/react-ui/config/proxy.ts b/react-ui/config/proxy.ts
index 0fdf89e3..f8875e9d 100644
--- a/react-ui/config/proxy.ts
+++ b/react-ui/config/proxy.ts
@@ -20,16 +20,16 @@ export default {
// localhost:8000/api/** -> https://preview.pro.ant.design/api/**
'/api/': {
// 要代理的地址
- // target: 'http://172.20.32.181:31205',
- target: 'http://172.20.32.98:8082',
+ target: 'http://172.20.32.181:31213', // 开发环境
+ // target: 'http://172.20.32.98:8082',
// target: 'http://172.20.32.150:8082',
// 配置了这个可以从 http 代理到 https
// 依赖 origin 的功能可能需要这个,比如 cookie
changeOrigin: true,
- pathRewrite: { '^/api': '' },
+ // pathRewrite: { '^/api': '' },
},
'/profile/avatar/': {
- target: 'http://172.20.32.181:31205',
+ target: 'http://172.20.32.181:31213',
changeOrigin: true,
},
},
diff --git a/react-ui/config/routes.ts b/react-ui/config/routes.ts
index c93f43a5..82c568bc 100644
--- a/react-ui/config/routes.ts
+++ b/react-ui/config/routes.ts
@@ -14,10 +14,9 @@ export default [
{
path: '/',
redirect: '/workspace',
- breadcrumb: '工作空间',
},
{
- name: 'workspace',
+ name: '工作空间',
path: '/workspace',
routes: [
{
@@ -41,6 +40,7 @@ export default [
},
{
path: '/account',
+ name: '用户中心',
routes: [
{
name: '用户中心',
@@ -70,7 +70,7 @@ export default [
],
},
{
- name: 'developmentEnvironment',
+ name: '开发环境',
path: '/developmentEnvironment',
routes: [
{
@@ -79,12 +79,12 @@ export default [
component: './DevelopmentEnvironment/Editor',
},
{
- name: '创建编辑器',
+ name: '创建开发环境',
path: 'create',
component: './DevelopmentEnvironment/Create',
},
{
- name: '编辑器',
+ name: '开发环境详情',
path: 'editor',
component: './DevelopmentEnvironment/Editor',
},
@@ -229,7 +229,7 @@ export default [
name: '应用开发',
path: '',
key: 'appsDeployment',
- component: './missingPage.jsx',
+ component: './Application',
},
],
},
@@ -306,47 +306,47 @@ export default [
},
{
name: '用户管理',
- path: '/system/user',
+ path: 'user',
component: './System/User',
},
{
name: '角色管理',
- path: '/system/role',
+ path: 'role',
component: './System/Role',
},
{
name: '定时任务',
- path: '/system/job',
+ path: 'job',
component: './Monitor/Job',
},
{
name: '菜单管理',
- path: '/system/menu',
+ path: 'menu',
component: './System/Menu',
},
{
name: '部门管理',
- path: '/system/dept',
+ path: 'dept',
component: './System/Dept',
},
{
name: '岗位管理',
- path: '/system/post',
+ path: 'post',
component: './System/Post',
},
{
name: '字典管理',
- path: '/system/dict',
+ path: 'dict',
component: './System/Dict',
},
{
name: '字典数据',
- path: '/system/dict-data/index/:id',
+ path: 'dict-data/index/:id',
component: './System/DictData',
},
{
name: '分配用户',
- path: '/system/role-auth/user/:id',
+ path: 'role-auth/user/:id',
component: './System/Role/authUser',
},
],
diff --git a/react-ui/src/app.tsx b/react-ui/src/app.tsx
index 9f6db9b9..ff14f8c9 100644
--- a/react-ui/src/app.tsx
+++ b/react-ui/src/app.tsx
@@ -181,7 +181,7 @@ export const patchClientRoutes: RuntimeConfig['patchClientRoutes'] = (e) => {
};
export function render(oldRender: () => void) {
- //console.log('render');
+ // console.log('render');
const token = getAccessToken();
if (!token || token?.length === 0) {
oldRender();
@@ -207,6 +207,7 @@ export const antd: RuntimeAntdConfig = (memo) => {
colorWarning: themes['warningColor'],
colorLink: themes['primaryColor'],
colorText: themes['textColor'],
+ controlHeightLG: 46,
};
memo.theme.components ??= {};
memo.theme.components.Tabs = {};
diff --git a/react-ui/src/assets/img/robot.png b/react-ui/src/assets/img/robot.png
index e91be9ac..c1379ef3 100644
Binary files a/react-ui/src/assets/img/robot.png and b/react-ui/src/assets/img/robot.png differ
diff --git a/react-ui/src/pages/DatasetPreparation/DatasetAnnotation/index.less b/react-ui/src/components/FullScreenFrame/index.less
similarity index 70%
rename from react-ui/src/pages/DatasetPreparation/DatasetAnnotation/index.less
rename to react-ui/src/components/FullScreenFrame/index.less
index d0d8b09b..e7a68498 100644
--- a/react-ui/src/pages/DatasetPreparation/DatasetAnnotation/index.less
+++ b/react-ui/src/components/FullScreenFrame/index.less
@@ -1,8 +1,8 @@
-.container {
+.kf-full-screen-frame {
width: 100%;
height: 100%;
- .frame {
+ &__iframe {
width: 100%;
height: 100%;
border: none;
diff --git a/react-ui/src/components/FullScreenFrame/index.tsx b/react-ui/src/components/FullScreenFrame/index.tsx
new file mode 100644
index 00000000..f93fcfae
--- /dev/null
+++ b/react-ui/src/components/FullScreenFrame/index.tsx
@@ -0,0 +1,18 @@
+import classNames from 'classnames';
+import './index.less';
+
+type FullScreenFrameProps = {
+ url: string;
+ className?: string;
+ style?: React.CSSProperties;
+};
+
+function FullScreenFrame({ url, className, style }: FullScreenFrameProps) {
+ return (
+
+ {url && }
+
+ );
+}
+
+export default FullScreenFrame;
diff --git a/react-ui/src/components/MenuIconSelector/index.less b/react-ui/src/components/MenuIconSelector/index.less
new file mode 100644
index 00000000..c4b134b8
--- /dev/null
+++ b/react-ui/src/components/MenuIconSelector/index.less
@@ -0,0 +1,32 @@
+.menu-icon-selector {
+ // grid 布局,每行显示 8 个图标
+ display: grid;
+ grid-auto-rows: 1fr;
+ grid-template-columns: repeat(4, 1fr);
+
+ &__item {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 80px;
+ cursor: pointer;
+
+ &__icon {
+ display: block;
+ }
+
+ &__icon--active {
+ display: none;
+ }
+
+ &:hover &__icon,
+ &:active &__icon {
+ display: none;
+ }
+
+ &:hover &__icon--active,
+ &:active &__icon--active {
+ display: block;
+ }
+ }
+}
diff --git a/react-ui/src/components/MenuIconSelector/index.tsx b/react-ui/src/components/MenuIconSelector/index.tsx
new file mode 100644
index 00000000..2709c22d
--- /dev/null
+++ b/react-ui/src/components/MenuIconSelector/index.tsx
@@ -0,0 +1,62 @@
+import KFIcon from '@/components/KFIcon';
+import KFModal from '@/components/KFModal';
+import iconData from '@/iconfont/iconfont.json';
+import { type ModalProps } from 'antd';
+import { useEffect, useState } from 'react';
+import styles from './index.less';
+
+interface MenuIconSelectorProps extends Omit {
+ selectedIcon?: string;
+ onOk: (param: string) => void;
+}
+
+type IconObject = {
+ icon_id: string;
+ font_class: string;
+};
+
+function MenuIconSelector({ open, selectedIcon, onOk, ...rest }: MenuIconSelectorProps) {
+ const [icons, setIcons] = useState([]);
+ useEffect(() => {
+ const glyphs = iconData.glyphs as IconObject[];
+ setIcons(glyphs.filter((item) => !item.font_class.endsWith('-active')));
+ }, []);
+
+ return (
+
+
+ {icons.map((icon) => (
+
onOk(icon.font_class)}
+ >
+
+
+
+ ))}
+
+
+ );
+}
+
+export default MenuIconSelector;
diff --git a/react-ui/src/iconfont/iconfont.json b/react-ui/src/iconfont/iconfont.json
new file mode 100644
index 00000000..db913c64
--- /dev/null
+++ b/react-ui/src/iconfont/iconfont.json
@@ -0,0 +1,163 @@
+{
+ "id": "4511326",
+ "name": "复杂智能软件-导航",
+ "font_family": "iconfont",
+ "css_prefix_text": "icon-",
+ "description": "",
+ "glyphs": [
+ {
+ "icon_id": "40233218",
+ "name": "操作手册-active",
+ "font_class": "manual-icon-active",
+ "unicode": "e62c",
+ "unicode_decimal": 58924
+ },
+ {
+ "icon_id": "40233217",
+ "name": "操作手册",
+ "font_class": "manual-icon",
+ "unicode": "e62d",
+ "unicode_decimal": 58925
+ },
+ {
+ "icon_id": "40171713",
+ "name": "监控运维-active",
+ "font_class": "monitor-icon-active",
+ "unicode": "e627",
+ "unicode_decimal": 58919
+ },
+ {
+ "icon_id": "40171711",
+ "name": "监控运维",
+ "font_class": "monitor-icon",
+ "unicode": "e629",
+ "unicode_decimal": 58921
+ },
+ {
+ "icon_id": "40171710",
+ "name": "开发环境-active",
+ "font_class": "developmentEnvironment-icon-active",
+ "unicode": "e62a",
+ "unicode_decimal": 58922
+ },
+ {
+ "icon_id": "40171699",
+ "name": "开发环境",
+ "font_class": "developmentEnvironment-icon",
+ "unicode": "e62b",
+ "unicode_decimal": 58923
+ },
+ {
+ "icon_id": "39969575",
+ "name": "系统管理",
+ "font_class": "system-icon",
+ "unicode": "e618",
+ "unicode_decimal": 58904
+ },
+ {
+ "icon_id": "39969573",
+ "name": "流水线-active",
+ "font_class": "workflow-icon-active",
+ "unicode": "e61a",
+ "unicode_decimal": 58906
+ },
+ {
+ "icon_id": "39969569",
+ "name": "数据准备-active",
+ "font_class": "datasetPreparation-icon-active",
+ "unicode": "e61c",
+ "unicode_decimal": 58908
+ },
+ {
+ "icon_id": "39969568",
+ "name": "数据准备",
+ "font_class": "datasetPreparation-icon",
+ "unicode": "e61d",
+ "unicode_decimal": 58909
+ },
+ {
+ "icon_id": "39969570",
+ "name": "模型在线部署",
+ "font_class": "modelDseployment-icon",
+ "unicode": "e61e",
+ "unicode_decimal": 58910
+ },
+ {
+ "icon_id": "39969567",
+ "name": "流水线",
+ "font_class": "workflow-icon",
+ "unicode": "e61f",
+ "unicode_decimal": 58911
+ },
+ {
+ "icon_id": "39969566",
+ "name": "AI资产管理-active",
+ "font_class": "aiAsset-icon-active",
+ "unicode": "e620",
+ "unicode_decimal": 58912
+ },
+ {
+ "icon_id": "39969563",
+ "name": "AI资产管理",
+ "font_class": "aiAsset-icon",
+ "unicode": "e621",
+ "unicode_decimal": 58913
+ },
+ {
+ "icon_id": "39969580",
+ "name": "工作空间",
+ "font_class": "workspace-icon",
+ "unicode": "e611",
+ "unicode_decimal": 58897
+ },
+ {
+ "icon_id": "39969572",
+ "name": "模型开发-active",
+ "font_class": "model-icon-active",
+ "unicode": "e610",
+ "unicode_decimal": 58896
+ },
+ {
+ "icon_id": "39969579",
+ "name": "系统管理-active",
+ "font_class": "system-icon-active",
+ "unicode": "e612",
+ "unicode_decimal": 58898
+ },
+ {
+ "icon_id": "39969578",
+ "name": "模型在线部署-active",
+ "font_class": "modelDseployment-icon-active",
+ "unicode": "e613",
+ "unicode_decimal": 58899
+ },
+ {
+ "icon_id": "39969565",
+ "name": "模型开发",
+ "font_class": "model-icon",
+ "unicode": "e614",
+ "unicode_decimal": 58900
+ },
+ {
+ "icon_id": "39969577",
+ "name": "应用开发",
+ "font_class": "appsDeployment-icon",
+ "unicode": "e615",
+ "unicode_decimal": 58901
+ },
+ {
+ "icon_id": "39969576",
+ "name": "工作空间-active",
+ "font_class": "workspace-icon-active",
+ "unicode": "e616",
+ "unicode_decimal": 58902
+ },
+ {
+ "icon_id": "39969574",
+ "name": "应用开发-active",
+ "font_class": "appsDeployment-icon-active",
+ "unicode": "e617",
+ "unicode_decimal": 58903
+ }
+ ]
+}
diff --git a/react-ui/src/overrides.less b/react-ui/src/overrides.less
index a3080072..e20ad0e4 100644
--- a/react-ui/src/overrides.less
+++ b/react-ui/src/overrides.less
@@ -120,6 +120,12 @@
.ant-select-single {
height: 46px;
}
+
+ .ant-input-number {
+ .ant-input-number-input {
+ height: 44px;
+ }
+ }
}
// Confirm Modal
@@ -187,3 +193,53 @@
.ant-pro-layout .ant-pro-sider-logo > a > h1 {
margin-inline-start: 12px;
}
+
+// PageContainer 里的 ProTable 只滑动内容区域
+.system-menu.ant-pro-page-container {
+ height: 100%;
+ overflow: hidden;
+ .ant-pro-grid-content {
+ height: 100%;
+ .ant-pro-grid-content-children {
+ height: 100%;
+ .ant-pro-layout-watermark-wrapper {
+ height: 100%;
+ .ant-pro-page-container-children-container {
+ height: 100%;
+ padding: 0;
+ .ant-pro-table {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ .ant-pro-card.ant-pro-table-search {
+ flex: none;
+ height: auto;
+ }
+ .ant-pro-card {
+ flex: 1;
+ min-height: 0;
+ .ant-pro-card-body {
+ height: 100%;
+ .ant-table-wrapper {
+ height: calc(100% - 64px);
+ .ant-spin-nested-loading {
+ height: 100%;
+ .ant-spin-container {
+ height: 100%;
+ .ant-table-fixed-header {
+ height: 100%;
+ .ant-table-container {
+ height: 100%;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/react-ui/src/pages/Application/index.tsx b/react-ui/src/pages/Application/index.tsx
new file mode 100644
index 00000000..77f70208
--- /dev/null
+++ b/react-ui/src/pages/Application/index.tsx
@@ -0,0 +1,9 @@
+import FullScreenFrame from '@/components/FullScreenFrame';
+import { useState } from 'react';
+
+function Application() {
+ const [iframeUrl] = useState('http://172.20.32.181:30080/');
+ return ;
+}
+
+export default Application;
diff --git a/react-ui/src/pages/DatasetPreparation/DatasetAnnotation/index.tsx b/react-ui/src/pages/DatasetPreparation/DatasetAnnotation/index.tsx
index a1f017e6..090d941e 100644
--- a/react-ui/src/pages/DatasetPreparation/DatasetAnnotation/index.tsx
+++ b/react-ui/src/pages/DatasetPreparation/DatasetAnnotation/index.tsx
@@ -1,7 +1,7 @@
+import FullScreenFrame from '@/components/FullScreenFrame';
import { getLabelStudioUrl } from '@/services/developmentEnvironment';
import { to } from '@/utils/promise';
import { useEffect, useState } from 'react';
-import styles from './index.less';
function DatasetAnnotation() {
const [iframeUrl, setIframeUrl] = useState('');
@@ -14,11 +14,7 @@ function DatasetAnnotation() {
setIframeUrl(res.data);
}
};
- return (
-
- {iframeUrl && }
-
- );
+ return ;
}
export default DatasetAnnotation;
diff --git a/react-ui/src/pages/Experiment/Comparison/index.tsx b/react-ui/src/pages/Experiment/Comparison/index.tsx
index 29bbc388..e11a0166 100644
--- a/react-ui/src/pages/Experiment/Comparison/index.tsx
+++ b/react-ui/src/pages/Experiment/Comparison/index.tsx
@@ -93,8 +93,7 @@ function ExperimentComparison() {
type: 'checkbox',
fixed: 'left',
selectedRowKeys,
- onChange: (selectedRowKeys: React.Key[], selectedRows: any[]) => {
- // console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
+ onChange: (selectedRowKeys: React.Key[]) => {
setSelectedRowKeys(selectedRowKeys);
},
};
@@ -159,6 +158,8 @@ function ExperimentComparison() {
align: 'center',
render: tableCellRender(true),
ellipsis: { showTitle: false },
+ sorter: (a, b) => a.params[name] - b.params[name],
+ showSorterTooltip: false,
})),
},
{
@@ -176,6 +177,8 @@ function ExperimentComparison() {
align: 'center',
render: tableCellRender(true),
ellipsis: { showTitle: false },
+ sorter: (a, b) => a.metrics[name] - b.metrics[name],
+ showSorterTooltip: false,
})),
},
];
diff --git a/react-ui/src/pages/Monitor/Job/index.tsx b/react-ui/src/pages/Monitor/Job/index.tsx
index a160be3e..6bf166d9 100644
--- a/react-ui/src/pages/Monitor/Job/index.tsx
+++ b/react-ui/src/pages/Monitor/Job/index.tsx
@@ -319,8 +319,8 @@ const JobTableList: React.FC = () => {
];
return (
-
-
+
+
headerTitle={intl.formatMessage({
id: 'pages.searchTable.title',
@@ -333,6 +333,9 @@ const JobTableList: React.FC = () => {
search={{
labelWidth: 120,
}}
+ scroll={{ y: 'calc(100% - 55px)' }}
+ tableAlertRender={false}
+ tableAlertOptionRender={false}
toolBarRender={() => [
,
,
]}
diff --git a/react-ui/src/pages/Monitor/JobLog/index.tsx b/react-ui/src/pages/Monitor/JobLog/index.tsx
index c0d7052d..4c69330a 100644
--- a/react-ui/src/pages/Monitor/JobLog/index.tsx
+++ b/react-ui/src/pages/Monitor/JobLog/index.tsx
@@ -217,8 +217,8 @@ const JobLogTableList: React.FC = () => {
];
return (
-
-
+
+
headerTitle={intl.formatMessage({
id: 'pages.searchTable.title',
@@ -231,6 +231,9 @@ const JobLogTableList: React.FC = () => {
search={{
labelWidth: 120,
}}
+ scroll={{ y: 'calc(100% - 55px)' }}
+ tableAlertRender={false}
+ tableAlertOptionRender={false}
toolBarRender={() => [
,
,
]}
diff --git a/react-ui/src/pages/System/Config/index.tsx b/react-ui/src/pages/System/Config/index.tsx
index a86937dc..bb671cd2 100644
--- a/react-ui/src/pages/System/Config/index.tsx
+++ b/react-ui/src/pages/System/Config/index.tsx
@@ -258,8 +258,8 @@ const ConfigTableList: React.FC = () => {
];
return (
-
-
+
+
headerTitle={intl.formatMessage({
id: 'pages.searchTable.title',
@@ -272,6 +272,9 @@ const ConfigTableList: React.FC = () => {
search={{
labelWidth: 120,
}}
+ scroll={{ y: 'calc(100% - 55px)' }}
+ tableAlertRender={false}
+ tableAlertOptionRender={false}
toolBarRender={() => [
,
,