diff --git a/react-ui/config/config.ts b/react-ui/config/config.ts index 405f85cb..3b681f86 100644 --- a/react-ui/config/config.ts +++ b/react-ui/config/config.ts @@ -78,7 +78,7 @@ export default defineConfig({ */ title: '智能软件开发平台', layout: { - locale: true, + locale: false, ...defaultSettings, }, // keepalive: [/./], @@ -97,10 +97,8 @@ export default defineConfig({ * @doc https://umijs.org/docs/max/i18n */ locale: { - // default zh-CN default: 'zh-CN', antd: true, - // default true, when it is true, will use `navigator.language` overwrite default baseNavigator: true, }, /** @@ -110,6 +108,7 @@ export default defineConfig({ */ antd: { configProvider: {}, + appConfig: {}, }, /** * @name 网络请求配置 diff --git a/react-ui/config/routes.ts b/react-ui/config/routes.ts index a44c0cbb..cd81e412 100644 --- a/react-ui/config/routes.ts +++ b/react-ui/config/routes.ts @@ -13,7 +13,7 @@ export default [ { path: '/', - redirect: '/account/center', + redirect: '/workspace', }, { path: '*', @@ -88,13 +88,6 @@ export default [ }, ], }, - { - name: 'experiment', - path: '/experiment', - routes: [ - - ], - }, { name: 'developmentEnvironment', path: '/developmentEnvironment', @@ -127,14 +120,36 @@ export default [ path: '/dataset', routes: [ { - name: '数据集管理', - path: '/dataset/datasetIndex', - component: './Dataset/index', + name: '数据集', + path: 'dataset', + routes: [ + { + name: '数据集列表', + path: '', + component: './Dataset/index', + }, + { + name: '数据集简介', + path: ':id', + component: './Dataset/datasetIntro', + }, + ], }, { - name: '数据集简介', - path: '/dataset/datasetIntro/:id', - component: './Dataset/datasetIntro', + name: '模型', + path: 'model', + routes: [ + { + name: '模型列表', + path: '', + component: './Model/index', + }, + { + name: '模型简介', + path: ':id', + component: './Model/modelIntro', + }, + ], }, { name: '镜像', @@ -157,19 +172,9 @@ export default [ }, ], }, - { - name: '模型管理', - path: '/dataset/modelIndex', - component: './Model/index', - }, - { - name: '模型简介', - path: '/dataset/modelIntro/:id', - component: './Model/modelIntro', - }, ], }, - + { name: 'workspace', path: '/workspace', @@ -177,7 +182,8 @@ export default [ { name: '工作空间', path: '', - component: './missingPage.jsx', + key: 'workspace', + component: './Workspace/index', }, ], }, @@ -188,11 +194,11 @@ export default [ { name: '模型部署', path: '', + key: 'modelDseployment', component: './missingPage.jsx', }, ], }, - { name: 'appsDeployment', path: '/appsDeployment', @@ -200,6 +206,7 @@ export default [ { name: '应用开发', path: '', + key: 'appsDeployment', component: './missingPage.jsx', }, ], @@ -211,6 +218,7 @@ export default [ { name: '监控运维', path: '', + key: 'see', component: './missingPage.jsx', }, ], @@ -242,4 +250,16 @@ export default [ }, ], }, + { + name: 'docs', + path: '/docs', + routes: [ + { + name: '使用指南', + path: '', + key: 'docs', + component: './Docs/index', + }, + ], + }, ]; diff --git a/react-ui/package.json b/react-ui/package.json index a3ad6812..1534f112 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -60,6 +60,7 @@ "@umijs/route-utils": "^4.0.1", "antd": "^5.4.4", "classnames": "^2.3.2", + "echarts": "^5.5.0", "fabric": "^5.3.0", "highlight.js": "^11.7.0", "lodash": "^4.17.21", @@ -70,6 +71,7 @@ "rc-menu": "^9.8.4", "rc-util": "^5.30.0", "react": "^18.2.0", + "react-activation": "^0.12.4", "react-cropper": "^2.3.3", "react-dev-inspector": "^1.8.1", "react-dom": "^18.2.0", diff --git a/react-ui/public/assets/材料科研软件平台使用文档.pdf b/react-ui/public/assets/材料科研软件平台使用文档.pdf new file mode 100644 index 00000000..2cebf49f Binary files /dev/null and b/react-ui/public/assets/材料科研软件平台使用文档.pdf differ diff --git a/react-ui/src/app.tsx b/react-ui/src/app.tsx index db9ce231..a4642589 100644 --- a/react-ui/src/app.tsx +++ b/react-ui/src/app.tsx @@ -1,8 +1,7 @@ import RightContent from '@/components/RightContent'; import themes from '@/styles/theme.less'; import type { Settings as LayoutSettings } from '@ant-design/pro-components'; -import type { RunTimeLayoutConfig } from '@umijs/max'; -import { history } from '@umijs/max'; +import { RuntimeConfig, history } from '@umijs/max'; import { RuntimeAntdConfig } from 'umi'; import defaultSettings from '../config/defaultSettings'; import '../public/fonts/font.css'; @@ -10,6 +9,7 @@ import { getAccessToken } from './access'; import './dayjsConfig'; import { PageEnum } from './enums/pagesEnums'; import './global.less'; +import { removeAllPageCacheState } from './hooks/pageCacheState'; import { getRemoteMenu, getRoutersInfo, @@ -29,20 +29,18 @@ export async function getInitialState(): Promise<{ loading?: boolean; fetchUserInfo?: () => Promise; }> { - console.log('getInitialState'); - + // console.log('getInitialState'); const fetchUserInfo = async () => { try { const response = await getUserInfo({ skipErrorHandler: true, }); - response.user.avatar = - response.user.avatar || - 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png'; return { ...response.user, + avatar: response.user.avatar || require('@/assets/img/avatar-default.png'), permissions: response.permissions, roles: response.roles, + roleNames: response.user.roles, } as API.CurrentUser; } catch (error) { console.log(error); @@ -67,7 +65,7 @@ export async function getInitialState(): Promise<{ } // ProLayout 支持的api https://procomponents.ant.design/components/layout -export const layout: RunTimeLayoutConfig = ({ initialState }) => { +export const layout: RuntimeConfig['layout'] = ({ initialState }) => { return { rightContentRender: () => , waterMarkProps: { @@ -129,7 +127,7 @@ export const layout: RunTimeLayoutConfig = ({ initialState }) => { // , // ] // : [], - menuHeaderRender: undefined, + menuHeaderRender: false, // 自定义 403 页面 // unAccessible:
unAccessible
, // 增加一个 loading 的状态 @@ -137,30 +135,66 @@ export const layout: RunTimeLayoutConfig = ({ initialState }) => { // if (initialState?.loading) return ; return <>{children}; }, + menuProps: { + onClick: () => { + // 点击菜单项,删除所有的页面 state 缓存 + removeAllPageCacheState(); + }, + // onSelect: (e) => { + // console.log(e); + // }, + }, ...initialState?.settings, + token: { + sider: { + colorTextMenu: themes['textColor'], + colorTextMenuSelected: themes['primaryColor'], + colorTextMenuActive: themes['primaryColor'], + colorBgMenuItemSelected: 'rgba(197, 232, 255, 0.8)', + colorMenuBackground: themes['siderBGColor'], + }, + }, + // menuItemRender: (itemProps, defaultDom, props) => { + // console.log('menuItemProps', itemProps); + // console.log('defaultDom', defaultDom); + // console.log('props', props); + + // const { pathname } = window.location; + // const isSelected = pathname === itemProps.path; + + // // 根据菜单项的状态动态显示不同的 icon + // const icon = isSelected ? 'icon-developmentEnvironment-icon' : 'icon-kaifahuanjing'; + // return ( + // + // + // {itemProps.name} + // + // ); + // }, }; }; -export async function onRouteChange({ clientRoutes, location }: any) { +export const onRouteChange: RuntimeConfig['onRouteChange'] = async (e) => { + const { location } = e; const menus = getRemoteMenu(); - // console.log('onRouteChange', clientRoutes, location, menus); + console.log('onRouteChange', e); if (menus === null && location.pathname !== PageEnum.LOGIN) { console.log('refresh'); history.go(0); } -} +}; -export function patchRoutes({ routes, routeComponents }: any) { - //console.log('patchRoutes', routes, routeComponents); -} +export const patchRoutes: RuntimeConfig['patchRoutes'] = (e) => { + console.log('patchRoutes', e); +}; -export async function patchClientRoutes({ routes }: any) { - // console.log('patchClientRoutes', routes); - patchRouteWithRemoteMenus(routes); -} +export const patchClientRoutes: RuntimeConfig['patchClientRoutes'] = (e) => { + console.log('patchClientRoutes', e); + patchRouteWithRemoteMenus(e.routes); +}; export function render(oldRender: () => void) { - // console.log('render get routers', oldRender); + console.log('render'); const token = getAccessToken(); if (!token || token?.length === 0) { oldRender(); diff --git a/react-ui/src/assets/img/avatar-default.png b/react-ui/src/assets/img/avatar-default.png new file mode 100644 index 00000000..b2022f38 Binary files /dev/null and b/react-ui/src/assets/img/avatar-default.png differ diff --git a/react-ui/src/assets/img/blue-triangle.png b/react-ui/src/assets/img/blue-triangle.png new file mode 100644 index 00000000..b82879d9 Binary files /dev/null and b/react-ui/src/assets/img/blue-triangle.png differ diff --git a/react-ui/src/assets/img/functional-material.png b/react-ui/src/assets/img/functional-material.png new file mode 100644 index 00000000..9eb39a70 Binary files /dev/null and b/react-ui/src/assets/img/functional-material.png differ diff --git a/react-ui/src/assets/img/molecular-material.png b/react-ui/src/assets/img/molecular-material.png new file mode 100644 index 00000000..5cd79357 Binary files /dev/null and b/react-ui/src/assets/img/molecular-material.png differ diff --git a/react-ui/src/assets/img/user-avatar/1.png b/react-ui/src/assets/img/user-avatar/1.png new file mode 100644 index 00000000..bb55cbb8 Binary files /dev/null and b/react-ui/src/assets/img/user-avatar/1.png differ diff --git a/react-ui/src/assets/img/user-avatar/2.png b/react-ui/src/assets/img/user-avatar/2.png new file mode 100644 index 00000000..941690cc Binary files /dev/null and b/react-ui/src/assets/img/user-avatar/2.png differ diff --git a/react-ui/src/assets/img/user-avatar/3.png b/react-ui/src/assets/img/user-avatar/3.png new file mode 100644 index 00000000..36b9a8fd Binary files /dev/null and b/react-ui/src/assets/img/user-avatar/3.png differ diff --git a/react-ui/src/assets/img/user-avatar/4.png b/react-ui/src/assets/img/user-avatar/4.png new file mode 100644 index 00000000..5f59cd8f Binary files /dev/null and b/react-ui/src/assets/img/user-avatar/4.png differ diff --git a/react-ui/src/assets/img/user-avatar/5.png b/react-ui/src/assets/img/user-avatar/5.png new file mode 100644 index 00000000..7f815419 Binary files /dev/null and b/react-ui/src/assets/img/user-avatar/5.png differ diff --git a/react-ui/src/assets/img/user-avatar/6.png b/react-ui/src/assets/img/user-avatar/6.png new file mode 100644 index 00000000..df2b149b Binary files /dev/null and b/react-ui/src/assets/img/user-avatar/6.png differ diff --git a/react-ui/src/assets/img/user-avatar/7.png b/react-ui/src/assets/img/user-avatar/7.png new file mode 100644 index 00000000..3526a286 Binary files /dev/null and b/react-ui/src/assets/img/user-avatar/7.png differ diff --git a/react-ui/src/assets/img/user-avatar/8.png b/react-ui/src/assets/img/user-avatar/8.png new file mode 100644 index 00000000..e672d96d Binary files /dev/null and b/react-ui/src/assets/img/user-avatar/8.png differ diff --git a/react-ui/src/assets/img/workspace-experiment.png b/react-ui/src/assets/img/workspace-experiment.png new file mode 100644 index 00000000..bcd69981 Binary files /dev/null and b/react-ui/src/assets/img/workspace-experiment.png differ diff --git a/react-ui/src/assets/img/workspace-intro-icon.png b/react-ui/src/assets/img/workspace-intro-icon.png new file mode 100644 index 00000000..d6d75417 Binary files /dev/null and b/react-ui/src/assets/img/workspace-intro-icon.png differ diff --git a/react-ui/src/assets/img/workspace-intro.png b/react-ui/src/assets/img/workspace-intro.png new file mode 100644 index 00000000..a8bc72ac Binary files /dev/null and b/react-ui/src/assets/img/workspace-intro.png differ diff --git a/react-ui/src/assets/img/workspace-pipeline.png b/react-ui/src/assets/img/workspace-pipeline.png new file mode 100644 index 00000000..fbbc3ed7 Binary files /dev/null and b/react-ui/src/assets/img/workspace-pipeline.png differ diff --git a/react-ui/src/assets/img/workspace-quick-start.png b/react-ui/src/assets/img/workspace-quick-start.png new file mode 100644 index 00000000..b4e9f43c Binary files /dev/null and b/react-ui/src/assets/img/workspace-quick-start.png differ diff --git a/react-ui/src/assets/img/workspace-user.png b/react-ui/src/assets/img/workspace-user.png new file mode 100644 index 00000000..f64de254 Binary files /dev/null and b/react-ui/src/assets/img/workspace-user.png differ diff --git a/react-ui/src/components/CommonTableCell/index.tsx b/react-ui/src/components/CommonTableCell/index.tsx index 6493899e..65a1dff2 100644 --- a/react-ui/src/components/CommonTableCell/index.tsx +++ b/react-ui/src/components/CommonTableCell/index.tsx @@ -1,3 +1,9 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-28 14:18:11 + * @Description: 自定义 Table 单元格,没有数据时展示 -- + */ + function CommonTableCell(text?: string | null) { return {text ?? '--'}; } diff --git a/react-ui/src/components/DateTableCell/index.tsx b/react-ui/src/components/DateTableCell/index.tsx index 1b7d785c..0b4efe93 100644 --- a/react-ui/src/components/DateTableCell/index.tsx +++ b/react-ui/src/components/DateTableCell/index.tsx @@ -1,3 +1,9 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-28 14:18:11 + * @Description: 自定义 Table 日期类单元格 + */ + import dayjs from 'dayjs'; function DateTableCell(text?: string | null) { @@ -5,7 +11,7 @@ function DateTableCell(text?: string | null) { return --; } if (!dayjs(text).isValid()) { - return 日期无效; + return 无效的日期; } return {dayjs(text).format('YYYY-MM-DD HH:mm:ss')}; } diff --git a/react-ui/src/components/IconSelector/IconPicSearcher.tsx b/react-ui/src/components/IconSelector/IconPicSearcher.tsx index 2183f4d4..d80311c6 100644 --- a/react-ui/src/components/IconSelector/IconPicSearcher.tsx +++ b/react-ui/src/components/IconSelector/IconPicSearcher.tsx @@ -1,6 +1,7 @@ +import KFModal from '@/components/KFModal'; import * as AntdIcons from '@ant-design/icons'; import { useIntl } from '@umijs/max'; -import { Modal, Popover, Progress, Result, Spin, Tooltip, Upload } from 'antd'; +import { Popover, Progress, Result, Spin, Tooltip, Upload } from 'antd'; import React, { useCallback, useEffect, useState } from 'react'; import './style.less'; @@ -134,7 +135,7 @@ const PicSearcher: React.FC = () => { > - { )} - + ); }; diff --git a/react-ui/src/components/KFIcon/index.tsx b/react-ui/src/components/KFIcon/index.tsx index eef4dbe7..e3951928 100644 --- a/react-ui/src/components/KFIcon/index.tsx +++ b/react-ui/src/components/KFIcon/index.tsx @@ -17,15 +17,16 @@ interface KFIconProps extends IconFontProps { font?: number; color?: string; style?: React.CSSProperties; + className?: string; } -function KFIcon({ type, font = 15, color = '', style = {} }: KFIconProps) { +function KFIcon({ type, font = 15, color = '', style = {}, className }: KFIconProps) { const iconStyle = { ...style, fontSize: font, color, }; - return ; + return ; } export default KFIcon; diff --git a/react-ui/src/components/KFModal/index.less b/react-ui/src/components/KFModal/index.less index d24b6135..57153a58 100644 --- a/react-ui/src/components/KFModal/index.less +++ b/react-ui/src/components/KFModal/index.less @@ -1,30 +1,29 @@ .kf-modal { .ant-modal-content { - padding: 20px 67px; + padding: 40px 67px; background-image: url(/assets/images/modal-back.png); -background-repeat:no-repeat; -background-size:100%; -background-position: top center; - // background: linear-gradient(180deg, #cfdfff 0%, #d4e2ff 9.77%, #ffffff 40%, #ffffff 100%); - border-radius: 21px; + background-repeat: no-repeat; + background-position: top center; + background-size: 100%; + border-radius: 20px; } .ant-modal-header { - margin: 20px 0 30px; + margin-bottom: 30px; background-color: transparent; } .ant-modal-footer { display: flex; justify-content: center; - margin: 40px 0 20px 0; + margin-top: 40px; .ant-btn { height: 40px; padding: 0 30px; - font-size: 16px; + font-size: @font-size-content; border-radius: 10px; } .ant-btn-default { - color: #1d1d20; + color: @text-color; background: rgba(22, 100, 255, 0.06); border-color: transparent; } @@ -32,10 +31,4 @@ background-position: top center; margin-left: 20px; } } - .ant-modal-close { - top: 27px; - right: 27px; - width: 26px; - height: 26px; - } } diff --git a/react-ui/src/components/KFModal/index.tsx b/react-ui/src/components/KFModal/index.tsx index 3491ca6b..0105324f 100644 --- a/react-ui/src/components/KFModal/index.tsx +++ b/react-ui/src/components/KFModal/index.tsx @@ -5,31 +5,22 @@ */ import ModalTitle from '@/components/ModalTitle'; -import { ConfigProvider, Modal, theme, type ModalProps } from 'antd'; +import { Modal, type ModalProps } from 'antd'; import classNames from 'classnames'; -import { useAntdConfig } from 'umi'; import './index.less'; -const { useToken } = theme; - export interface KFModalProps extends ModalProps { - image: string; + image?: string; } function KFModal({ title, image, children, className = '', ...rest }: KFModalProps) { - const { token } = useToken(); - console.log('token', token); - const antdConfig = useAntdConfig(); - console.log('antdConfig', antdConfig); return ( - - } - > - {children} - - + } + > + {children} + ); } diff --git a/react-ui/src/components/KFRadio/index.tsx b/react-ui/src/components/KFRadio/index.tsx index b60a4d11..4bb4ccce 100644 --- a/react-ui/src/components/KFRadio/index.tsx +++ b/react-ui/src/components/KFRadio/index.tsx @@ -1,7 +1,7 @@ /* * @Author: 赵伟 * @Date: 2024-04-17 16:59:42 - * @Description: 自定义Radio + * @Description: 自定义 Radio */ import classNames from 'classnames'; @@ -16,12 +16,14 @@ export type KFRadioItem = { type KFRadioProps = { items: KFRadioItem[]; value?: string; + style?: React.CSSProperties; + className?: string; onChange?: (value: string) => void; }; -function KFRadio({ items, value, onChange }: KFRadioProps) { +function KFRadio({ items, value, style, className, onChange }: KFRadioProps) { return ( - + {items.map((item) => { return ( {}, []); - -// return ( -//
-// -//
-// ); -// } - -// export default KFTabs; diff --git a/react-ui/src/components/ModalTitle/index.less b/react-ui/src/components/ModalTitle/index.less index ac4d8360..20ebc539 100644 --- a/react-ui/src/components/ModalTitle/index.less +++ b/react-ui/src/components/ModalTitle/index.less @@ -1,11 +1,11 @@ -.modal_title { +.modal-title { display: flex; align-items: center; color: @primary-color; font-weight: 400; font-size: 20px; - &_image { + &__image { width: 22px; margin-right: 10px; } diff --git a/react-ui/src/components/ModalTitle/index.tsx b/react-ui/src/components/ModalTitle/index.tsx index 34bdda74..11825486 100644 --- a/react-ui/src/components/ModalTitle/index.tsx +++ b/react-ui/src/components/ModalTitle/index.tsx @@ -1,15 +1,24 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-28 14:18:11 + * @Description: 自定义 Modal Title + */ + +import classNames from 'classnames'; import React from 'react'; import styles from './index.less'; type ModalTitleProps = { title: React.ReactNode; image?: string; + style?: React.CSSProperties; + className?: string; }; -function ModalTitle({ title, image }: ModalTitleProps) { +function ModalTitle({ title, image, style, className }: ModalTitleProps) { return ( -
- +
+ {image && } {title}
); diff --git a/react-ui/src/components/RightContent/AvatarDropdown.tsx b/react-ui/src/components/RightContent/AvatarDropdown.tsx index fca317ef..5f8d639a 100644 --- a/react-ui/src/components/RightContent/AvatarDropdown.tsx +++ b/react-ui/src/components/RightContent/AvatarDropdown.tsx @@ -2,7 +2,7 @@ import { clearSessionToken } from '@/access'; import { setRemoteMenu } from '@/services/session'; import { logout } from '@/services/system/auth'; import { gotoLoginPage } from '@/utils/ui'; -import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons'; +import { LogoutOutlined, UserOutlined } from '@ant-design/icons'; import { setAlpha } from '@ant-design/pro-components'; import { useEmotionCss } from '@ant-design/use-emotion-css'; import { history, useModel } from '@umijs/max'; @@ -127,11 +127,11 @@ const AvatarDropdown: React.FC = ({ menu }) => { icon: , label: '个人中心', }, - { - key: 'settings', - icon: , - label: '个人设置', - }, + // { + // key: 'settings', + // icon: , + // label: '个人设置', + // }, { type: 'divider' as const, }, diff --git a/react-ui/src/components/RightContent/index.tsx b/react-ui/src/components/RightContent/index.tsx index 6fbfa37c..70e57e23 100644 --- a/react-ui/src/components/RightContent/index.tsx +++ b/react-ui/src/components/RightContent/index.tsx @@ -48,7 +48,7 @@ const GlobalHeaderRight: React.FC = () => { > */} - + {/* */}
); diff --git a/react-ui/src/components/SubAreaTitle/index.tsx b/react-ui/src/components/SubAreaTitle/index.tsx index cfdef539..a1d5e33e 100644 --- a/react-ui/src/components/SubAreaTitle/index.tsx +++ b/react-ui/src/components/SubAreaTitle/index.tsx @@ -4,17 +4,19 @@ * @Description: 分区标题 */ +import classNames from 'classnames'; import './index.less'; type SubAreaTitleProps = { title: string; image: string; style?: React.CSSProperties; + className?: string; }; -function SubAreaTitle({ title, image, style }: SubAreaTitleProps) { +function SubAreaTitle({ title, image, style, className }: SubAreaTitleProps) { return ( -
+
{title}
diff --git a/react-ui/src/global.less b/react-ui/src/global.less index 4117cad0..5e9ab02e 100644 --- a/react-ui/src/global.less +++ b/react-ui/src/global.less @@ -1,6 +1,7 @@ html, body, #root { + min-width: 1440px; height: 100%; margin: 0; padding: 0; @@ -20,9 +21,6 @@ body, .ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed { left: unset; } -.ant-layout-sider-children { - margin-top: 60px !important; -} canvas { display: block; } @@ -33,58 +31,29 @@ body { -moz-osx-font-smoothing: grayscale; } .ant-pro-layout .ant-pro-layout-content { - padding: 10px; + padding: 0 10px 10px; + background-color: transparent; } .ant-pro-layout .ant-pro-layout-bg-list { - background: #f9fafb; + background: @background-color; } -.ant-menu-light .ant-menu-item-selected { - background: rgba(197, 232, 255, 0.8) !important; -} -.ant-menu-light .ant-menu-item-selected .ant-pro-base-menu-inline-item-text { - // color: #1664ff; -} -.ant-pro-layout .ant-pro-sider .ant-layout-sider-children { - background: #f2f5f7; -} .ant-pro-base-menu-inline-item-title .ant-pro-base-menu-inline-item-text { - // color: #1d1d20; font-size: 16px; } -// .ant-menu-light .ant-menu-item-selected{ -// color:#1664ff; -// } + .ant-pro-layout .ant-pro-sider-menu { padding-top: 40px; } -.ant-table-wrapper .ant-table-container table > thead > tr:first-child > *:first-child, -.ant-table-wrapper .ant-table-tbody>tr>td:first-child { - padding: 0 30px; -} - - .ant-pro-global-header-logo-mix { - width: 257px; - height: 75px; - margin-left: -16px; - padding-left: 28px; - background: #f2f5f7; - border-bottom: 1px solid rgba(233, 237, 240, 1); - border-top-right-radius: 20px; + padding-left: 12px; } .ant-pro-layout .ant-pro-sider .ant-layout-sider-children { border-right: unset; - border-bottom-right-radius: 20px; } .ant-pro-base-menu-inline { - // height: 87vh; - background: #f2f5f7; border-radius: 0px 20px 20px 0px; } -.ant-pro-layout .ant-pro-layout-content { - background-color: transparent; -} .ant-drawer .ant-drawer-body { padding: 0; } @@ -102,99 +71,17 @@ body { padding: 20px 16px; background-color: #fff; } -// .ant-table-wrapper .ant-table { -// height: 81vh; -// // overflow-y: auto; -// } .ant-pro-global-header-logo img { height: 21px; } .ant-pro-layout .ant-layout-sider.ant-pro-sider { - height: 94vh; + height: 100vh; + padding-top: 56px; } .ant-pro-layout .ant-pro-layout-container { height: 100vh; overflow-y: hidden; } -.ant-modal-confirm .ant-modal-confirm-paragraph { - margin: 54px 0 auto; - text-align: center; -} -.ant-modal-confirm-confirm .ant-modal-confirm-body > .anticon { - display: none; -} -.ant-modal-confirm .ant-modal-confirm-btns { - margin-top: 30px; - text-align: center; -} -.ant-modal-confirm-btns .ant-btn-default { - width: 110px; - height: 40px; - margin-right: 10px; - // color: #1d1d20; - font-size: 18px; - background: rgba(22, 100, 255, 0.06); - border-color: transparent; - border-radius: 10px; -} -.ant-modal-confirm-btns .ant-btn-default:hover { - background: rgba(22, 100, 255, 0.06); - border-color: transparent; -} -.ant-modal-confirm-btns .ant-btn-primary { - width: 110px; - height: 40px; - font-size: 18px; - border-radius: 10px; - border-radius: 10px; -} -.ant-modal .ant-input-affix-wrapper { - height: 46px; - padding: 1px 11px; -} -.ant-input-textarea-affix-wrapper.ant-input-affix-wrapper{ - padding: 0; -} -.ant-modal .ant-select-single { - height: 46px; -} -.ant-modal .ant-select-single .ant-select-selector .ant-select-selection-placeholder { - line-height: 46px; -} -.ant-menu-light.ant-menu-inline .ant-menu-item{ - color:#575757; -} -.ant-modal .ant-modal-close-x { - width: 26px; - height: 26px; - color: #272536; - border: 2px solid #272536; - border-radius: 50%; -} -.ant-modal-content { - margin-top: 50px; - margin-left: -130px; -} -.ant-modal .ant-modal-content { - padding: 0; -} -.ant-modal-confirm-body-wrapper { - height: 303px; - background-image: url(/assets/images/modal-back.png); - background-repeat: no-repeat; - background-position: top center; - background-size: 100%; - border-radius: 0; -} -.ant-modal .ant-modal-content { - border-radius: 20px; -} -.ant-modal .ant-modal-close:hover { - background-color: transparent; -} -.ant-modal .ant-modal-footer > .ant-btn + .ant-btn { - margin-left: 20px; -} .ant-pagination .ant-pagination-item.ant-pagination-item-active { background: @primary-color; border-width: 0; @@ -212,22 +99,18 @@ body { border: 1px solid #e6e6e6; } -// ::-webkit-scrollbar-button { -// background: #97a1bd; -// } ::-webkit-scrollbar { - width: 9px; - border-radius: 2px; + width: 8px; + background: transparent; } ::-webkit-scrollbar-thumb { - // background-color: #9aa3bc!important; - width: 7px; - background: rgba(77, 87, 123, 0.5) !important; + width: 8px; + background: rgba(0, 0, 0, 0.5); + border-radius: 99px; } ::-webkit-scrollbar-track { - // background-color: #eaf1ff!important; - width: 9px; - background: rgba(22, 100, 255, 0.06) !important; + width: 8px; + background: transparent; } ul, ol { diff --git a/react-ui/src/hooks/index.ts b/react-ui/src/hooks/index.ts index 24a80d81..1d56a24d 100644 --- a/react-ui/src/hooks/index.ts +++ b/react-ui/src/hooks/index.ts @@ -41,7 +41,7 @@ export function useVisible(initialValue: boolean) { setVisible(false); }, []); - return [visible, open, close]; + return [visible, open, close] as const; } type Callback = (state: T) => void; @@ -92,7 +92,7 @@ export function useDomSize( setWidth(domRef.current.offsetWidth); } }; - const debounceFunc = debounce(setDomHeight, 200); + const debounceFunc = debounce(setDomHeight, 100); setDomHeight(); window.addEventListener('resize', debounceFunc); diff --git a/react-ui/src/hooks/pageCacheState.ts b/react-ui/src/hooks/pageCacheState.ts new file mode 100644 index 00000000..9268a07a --- /dev/null +++ b/react-ui/src/hooks/pageCacheState.ts @@ -0,0 +1,58 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-28 11:49:48 + * @Description: 页面状态缓存,pop 回到这个页面的时候,重新构建之前的状态 + */ + +import { useCallback, useState } from 'react'; + +const pageKeys: string[] = []; +// let stateCaches: Record = {}; + +// 获取页面缓存 +const getCacheState = (key: string) => { + const jsonStr = sessionStorage.getItem(key); + if (jsonStr) { + removeCacheState(key); + try { + return JSON.parse(jsonStr); + } catch (error) { + return undefined; + } + } + return undefined; +}; + +// 移除页面 state 缓存 +const removeCacheState = (key: string) => { + sessionStorage.removeItem(key); + const index = pageKeys.indexOf(key); + if (index !== -1) { + pageKeys.splice(index, 1); + } +}; + +// 移除所有页面 state 缓存 +export const removeAllPageCacheState = () => { + pageKeys.forEach((key) => { + sessionStorage.removeItem(key); + }); +}; + +export const useCacheState = () => { + const { pathname } = window.location; + const key = 'pagecache:' + pathname; + + const setCacheState = useCallback( + (state?: any) => { + if (state) { + pageKeys.push(key); + sessionStorage.setItem(key, JSON.stringify(state)); + } + }, + [key], + ); + + const [cacheState] = useState(() => getCacheState(key)); + return [cacheState, setCacheState] as const; +}; diff --git a/react-ui/src/iconfont/iconfont.js b/react-ui/src/iconfont/iconfont.js index a7ee3e08..77f8486f 100644 --- a/react-ui/src/iconfont/iconfont.js +++ b/react-ui/src/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4511447='',function(t){var a=(a=document.getElementsByTagName("script"))[a.length-1],h=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var v,i,o,l,z,m=function(a,h){h.parentNode.insertBefore(a,h)};if(h&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}v=function(){var a,h=document.createElement("div");h.innerHTML=t._iconfont_svg_string_4511447,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(a=document.body).firstChild?m(h,a.firstChild):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(v,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),v()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=v,l=t.document,z=!1,d(),l.onreadystatechange=function(){"complete"==l.readyState&&(l.onreadystatechange=null,n())})}function n(){z||(z=!0,o())}function d(){try{l.documentElement.doScroll("left")}catch(a){return void setTimeout(d,50)}n()}}(window); \ No newline at end of file +window._iconfont_svg_string_4511447='',function(t){var a=(a=document.getElementsByTagName("script"))[a.length-1],h=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var l,i,v,o,z,m=function(a,h){h.parentNode.insertBefore(a,h)};if(h&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}l=function(){var a,h=document.createElement("div");h.innerHTML=t._iconfont_svg_string_4511447,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(a=document.body).firstChild?m(h,a.firstChild):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),l()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(v=l,o=t.document,z=!1,p(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,n())})}function n(){z||(z=!0,v())}function p(){try{o.documentElement.doScroll("left")}catch(a){return void setTimeout(p,50)}n()}}(window); \ No newline at end of file diff --git a/react-ui/src/overrides.less b/react-ui/src/overrides.less index c65420fb..e962088a 100644 --- a/react-ui/src/overrides.less +++ b/react-ui/src/overrides.less @@ -52,3 +52,88 @@ .ant-table-wrapper .ant-table-thead > tr > td { background-color: #fff; } + +.ant-pro-page-container { + overflow-y: auto; +} + +// Input +.ant-input-textarea-affix-wrapper.ant-input-affix-wrapper { + padding: 0; +} + +// Modal +.ant-modal { + .ant-modal-close { + top: 27px; + right: 27px; + width: 26px; + height: 26px; + color: @text-color-secondary; + border: 2px solid @text-color-secondary; + border-radius: 50%; + + &:hover, + &:active { + color: #272536; + background-color: transparent; + border: 2px solid #272536; + } + } + + .ant-input-affix-wrapper { + height: 46px; + padding: 1px 11px; + } + + .ant-select-single { + height: 46px; + } + + .ant-select-single .ant-select-selector .ant-select-selection-placeholder { + line-height: 46px; + } +} + +// Confirm Modal +.ant-modal-confirm { + .ant-modal-content { + padding: 40px 67px; + background-image: url(/assets/images/modal-back.png); + background-repeat: no-repeat; + background-position: top center; + background-size: 100%; + border-radius: 20px; + } + .ant-modal-confirm-body { + .anticon { + display: none; + } + } + + .ant-modal-confirm-paragraph { + max-width: 100%; + margin-top: 27px; + text-align: center; + } + + .ant-modal-confirm-btns { + margin-top: 40px; + text-align: center; + + .ant-btn { + height: 40px; + padding: 0 30px; + font-size: @font-size-content; + border-radius: 10px; + } + .ant-btn-default { + color: @text-color; + background: rgba(22, 100, 255, 0.06); + border-color: transparent; + } + .ant-btn + .ant-btn { + margin-left: 20px; + } + } +} diff --git a/react-ui/src/pages/Dataset/index.jsx b/react-ui/src/pages/Dataset/index.jsx index 297e6d81..4d39b34e 100644 --- a/react-ui/src/pages/Dataset/index.jsx +++ b/react-ui/src/pages/Dataset/index.jsx @@ -46,7 +46,7 @@ const Dataset = () => { const onFinish = (values) => {}; const routeToIntro = (e, record) => { e.stopPropagation(); - navgite({ pathname: '/dataset/datasetIntro' }); + navgite({ pathname: '/dataset/dataset' }); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); diff --git a/react-ui/src/pages/Dataset/personalData.jsx b/react-ui/src/pages/Dataset/personalData.jsx index 0dd09739..0d126025 100644 --- a/react-ui/src/pages/Dataset/personalData.jsx +++ b/react-ui/src/pages/Dataset/personalData.jsx @@ -117,14 +117,14 @@ const PublicData = (React.FC = () => { }; const chooseDatasetType = (val, item) => { console.log(val, item); - if (item.path == queryFlow.data_type) { + if (item.id == queryFlow.data_type) { setActiveType(''); setQueryFlow({ ...queryFlow, data_type: null }); getDatasetlist({ ...queryFlow, data_type: null }); } else { - setActiveType(item.path); - setQueryFlow({ ...queryFlow, data_type: item.path }); - getDatasetlist({ ...queryFlow, data_type: item.path }); + setActiveType(item.id); + setQueryFlow({ ...queryFlow, data_type: item.id }); + getDatasetlist({ ...queryFlow, data_type: item.id }); } // setQueryFlow({...queryFlow,data_type:item.path},()=>{ // getDatasetlist() @@ -132,14 +132,14 @@ const PublicData = (React.FC = () => { }; const chooseDatasetTag = (val, item) => { console.log(val, item); - if (item.path == queryFlow.data_tag) { + if (item.id == queryFlow.data_tag) { setActiveTag(''); setQueryFlow({ ...queryFlow, data_tag: null }); getDatasetlist({ ...queryFlow, data_tag: null }); } else { - setActiveTag(item.path); - setQueryFlow({ ...queryFlow, data_tag: item.path }); - getDatasetlist({ ...queryFlow, data_tag: item.path }); + setActiveTag(item.id); + setQueryFlow({ ...queryFlow, data_tag: item.id }); + getDatasetlist({ ...queryFlow, data_tag: item.id }); } // setQueryFlow({...queryFlow,data_type:item.path},()=>{ // getDatasetlist() @@ -155,7 +155,7 @@ const PublicData = (React.FC = () => { const routeToIntro = (e, record) => { e.stopPropagation(); console.log(record); - navgite({ pathname: `/dataset/datasetIntro/${record.id}` }); + navgite({ pathname: `/dataset/dataset/${record.id}` }); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); @@ -196,7 +196,7 @@ const PublicData = (React.FC = () => {
{ chooseDatasetType(e, item); @@ -230,7 +230,7 @@ const PublicData = (React.FC = () => {
{ chooseDatasetTag(e, item); diff --git a/react-ui/src/pages/Dataset/publicData.jsx b/react-ui/src/pages/Dataset/publicData.jsx index 19ae0323..bf5980d4 100644 --- a/react-ui/src/pages/Dataset/publicData.jsx +++ b/react-ui/src/pages/Dataset/publicData.jsx @@ -76,14 +76,14 @@ const PublicData = () => { }; const chooseDatasetType = (val, item) => { console.log(val, item); - if (item.path == queryFlow.data_type) { + if (item.id == queryFlow.data_type) { setActiveType(''); setQueryFlow({ ...queryFlow, data_type: null }); getDatasetlist({ ...queryFlow, data_type: null }); } else { - setActiveType(item.path); - setQueryFlow({ ...queryFlow, data_type: item.path }); - getDatasetlist({ ...queryFlow, data_type: item.path }); + setActiveType(item.id); + setQueryFlow({ ...queryFlow, data_type: item.id }); + getDatasetlist({ ...queryFlow, data_type: item.id }); } // setQueryFlow({...queryFlow,data_type:item.path},()=>{ // getDatasetlist() @@ -91,14 +91,14 @@ const PublicData = () => { }; const chooseDatasetTag = (val, item) => { console.log(val, item); - if (item.path == queryFlow.data_tag) { + if (item.id == queryFlow.data_tag) { setActiveTag(''); setQueryFlow({ ...queryFlow, data_tag: null }); getDatasetlist({ ...queryFlow, data_tag: null }); } else { - setActiveTag(item.path); - setQueryFlow({ ...queryFlow, data_tag: item.path }); - getDatasetlist({ ...queryFlow, data_tag: item.path }); + setActiveTag(item.id); + setQueryFlow({ ...queryFlow, data_tag: item.id }); + getDatasetlist({ ...queryFlow, data_tag: item.id }); } // setQueryFlow({...queryFlow,data_type:item.path},()=>{ // getDatasetlist() @@ -108,7 +108,7 @@ const PublicData = () => { const routeToIntro = (e, record) => { e.stopPropagation(); console.log(record); - navgite({ pathname: `/dataset/datasetIntro/${record.id}` }); + navgite({ pathname: `/dataset/dataset/${record.id}` }); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); @@ -146,7 +146,7 @@ const PublicData = () => {
{ chooseDatasetType(e, item); @@ -180,7 +180,7 @@ const PublicData = () => {
{ chooseDatasetTag(e, item); diff --git a/react-ui/src/pages/Docs/index.less b/react-ui/src/pages/Docs/index.less new file mode 100644 index 00000000..e69de29b diff --git a/react-ui/src/pages/Docs/index.tsx b/react-ui/src/pages/Docs/index.tsx new file mode 100644 index 00000000..fcf4ed12 --- /dev/null +++ b/react-ui/src/pages/Docs/index.tsx @@ -0,0 +1,9 @@ +const Docs = () => { + return ( + + ); +}; +export default Docs; diff --git a/react-ui/src/pages/Experiment/index.less b/react-ui/src/pages/Experiment/index.less index 94264bdf..50ec2305 100644 --- a/react-ui/src/pages/Experiment/index.less +++ b/react-ui/src/pages/Experiment/index.less @@ -24,7 +24,7 @@ align-items: center; width: 100%; padding: 0 0 0 33px; - color: #1d1d20; + color: @text-color; font-size: 15px; & > div { @@ -76,16 +76,18 @@ .statusBox:hover .statusIcon { visibility: visible; } -.experimentBox{ +.experimentBox { height: calc(100% - 20px); - .experimentTable{ + .experimentTable { height: calc(100% - 60px); - :global{ - .ant-table-wrapper .ant-table{ + :global { + .ant-table-wrapper .ant-table { // overflow-y: auto; height: calc(100% - 48px); } + .ant-table-row-expand-icon-cell { + padding: 0 30px; + } } } - -} \ No newline at end of file +} diff --git a/react-ui/src/pages/Experiment/status.ts b/react-ui/src/pages/Experiment/status.ts index 2a075951..9f568795 100644 --- a/react-ui/src/pages/Experiment/status.ts +++ b/react-ui/src/pages/Experiment/status.ts @@ -16,7 +16,7 @@ export enum ExperimentStatus { } type ExperimentStatusKeys = keyof typeof ExperimentStatus; -type ExperimentStatusValues = (typeof ExperimentStatus)[ExperimentStatusKeys]; +export type ExperimentStatusValues = (typeof ExperimentStatus)[ExperimentStatusKeys]; export const experimentStatusInfo: Record = { Running: { diff --git a/react-ui/src/pages/Mirror/create.tsx b/react-ui/src/pages/Mirror/create.tsx index d50e8877..8ac38f6c 100644 --- a/react-ui/src/pages/Mirror/create.tsx +++ b/react-ui/src/pages/Mirror/create.tsx @@ -11,7 +11,7 @@ import SubAreaTitle from '@/components/SubAreaTitle'; import { CommonTabKeys } from '@/enums'; import { createMirrorReq } from '@/services/mirror'; import { to } from '@/utils/promise'; -import { mirrorNameKey } from '@/utils/sessionKeys'; +import { getSessionItemThenRemove, mirrorNameKey } from '@/utils/sessionStorage'; import { getFileListFromEvent } from '@/utils/ui'; import { useNavigate } from '@umijs/max'; import { Button, Col, Form, Input, Row, Upload, UploadFile, message, type UploadProps } from 'antd'; @@ -56,14 +56,11 @@ function MirrorCreate() { }; useEffect(() => { - const name = sessionStorage.getItem(mirrorNameKey); + const name = getSessionItemThenRemove(mirrorNameKey); if (name) { form.setFieldValue('name', name); setNameDisabled(true); } - return () => { - sessionStorage.removeItem(mirrorNameKey); - }; }, []); // 创建公网、本地镜像 diff --git a/react-ui/src/pages/Mirror/info.tsx b/react-ui/src/pages/Mirror/info.tsx index ee461c2b..8f26dd9f 100644 --- a/react-ui/src/pages/Mirror/info.tsx +++ b/react-ui/src/pages/Mirror/info.tsx @@ -9,6 +9,7 @@ import KFIcon from '@/components/KFIcon'; import PageTitle from '@/components/PageTitle'; import SubAreaTitle from '@/components/SubAreaTitle'; import { useDomSize } from '@/hooks'; +import { useCacheState } from '@/hooks/pageCacheState'; import { deleteMirrorVersionReq, getMirrorInfoReq, @@ -16,17 +17,17 @@ import { } from '@/services/mirror'; import themes from '@/styles/theme.less'; import { to } from '@/utils/promise'; -import { mirrorNameKey } from '@/utils/sessionKeys'; +import { mirrorNameKey, setSessionStorageItem } from '@/utils/sessionStorage'; import { modalConfirm } from '@/utils/ui'; import { useNavigate, useParams, useSearchParams } from '@umijs/max'; import { + App, Button, Col, ConfigProvider, Flex, Row, Table, - message, type TablePaginationConfig, type TableProps, } from 'antd'; @@ -56,17 +57,19 @@ function MirrorInfo() { const navigate = useNavigate(); const urlParams = useParams(); const [searchParams] = useSearchParams(); + const [cacheState, setCacheState] = useCacheState(); const [mirrorInfo, setMirrorInfo] = useState({}); const [tableData, setTableData] = useState([]); const [topRef, { height: topHeight }] = useDomSize(0, 0, [mirrorInfo]); const [total, setTotal] = useState(0); - const [pagination, setPagination] = useState({ - showSizeChanger: true, - showQuickJumper: true, - current: 1, - pageSize: 10, - }); + const [pagination, setPagination] = useState( + cacheState?.pagination ?? { + current: 1, + pageSize: 10, + }, + ); const isPublic = searchParams.get('isPublic') === 'true'; + const { message } = App.useApp(); useEffect(() => { getMirrorInfo(); }, []); @@ -115,7 +118,7 @@ function MirrorInfo() { // 如果是一页的唯一数据,删除时,请求第一页的数据 // 否则直接刷新这一页的数据 // 避免回到第一页 - if (tableData.length > 1) { + if (tableData.length === 1) { setPagination((prev) => ({ ...prev, current: 1, @@ -146,7 +149,10 @@ function MirrorInfo() { const createMirrorVersion = () => { navigate(`/dataset/mirror/create`); - sessionStorage.setItem(mirrorNameKey, mirrorInfo.name || ''); + setSessionStorageItem(mirrorNameKey, mirrorInfo.name || ''); + setCacheState({ + pagination, + }); }; const columns: TableProps['columns'] = [ @@ -256,13 +262,14 @@ function MirrorInfo() {
- + {!isPublic && ( )} +
diff --git a/react-ui/src/pages/Mirror/list.tsx b/react-ui/src/pages/Mirror/list.tsx index 6feca192..06685548 100644 --- a/react-ui/src/pages/Mirror/list.tsx +++ b/react-ui/src/pages/Mirror/list.tsx @@ -7,11 +7,12 @@ import CommonTableCell from '@/components/CommonTableCell'; import DateTableCell from '@/components/DateTableCell'; import KFIcon from '@/components/KFIcon'; import { CommonTabKeys } from '@/enums'; +import { useCacheState } from '@/hooks/pageCacheState'; import { deleteMirrorReq, getMirrorListReq } from '@/services/mirror'; import themes from '@/styles/theme.less'; import { to } from '@/utils/promise'; import { modalConfirm } from '@/utils/ui'; -import { useNavigate, useSearchParams } from '@umijs/max'; +import { useNavigate } from '@umijs/max'; import { Button, ConfigProvider, @@ -50,20 +51,17 @@ export type MirrorData = { function MirrorList() { const navigate = useNavigate(); - const [searchParams, setSearchParams] = useSearchParams(); - const isPrivate = searchParams.get('isPublic') === 'false'; - const [activeTab, setActiveTab] = useState( - isPrivate ? CommonTabKeys.Private : CommonTabKeys.Public, - ); - const [searchText, setSearchText] = useState(''); + const [cacheState, setCacheState] = useCacheState(); + const [activeTab, setActiveTab] = useState(cacheState?.activeTab ?? CommonTabKeys.Public); + const [searchText, setSearchText] = useState(cacheState?.searchText); const [tableData, setTableData] = useState([]); const [total, setTotal] = useState(0); - const [pagination, setPagination] = useState({ - showSizeChanger: true, - showQuickJumper: true, - current: 1, - pageSize: 10, - }); + const [pagination, setPagination] = useState( + cacheState?.pagination ?? { + current: 1, + pageSize: 10, + }, + ); useEffect(() => { getMirrorList(); @@ -73,17 +71,12 @@ function MirrorList() { const hanleTabChange: TabsProps['onChange'] = (value) => { setSearchText(''); setPagination({ - showSizeChanger: true, - showQuickJumper: true, current: 1, pageSize: 10, }); setTotal(0); setTableData([]); setActiveTab(value); - setSearchParams([['isPublic', value === CommonTabKeys.Public ? 'true' : 'false']], { - replace: true, - }); }; // 获取镜像列表 const getMirrorList = async (params?: Record) => { @@ -131,11 +124,11 @@ function MirrorList() { // 查看详情 const toDetail = (record: MirrorData) => { - console.log('record', record); - navigate(`/dataset/mirror/${record.id}?isPublic=${activeTab === CommonTabKeys.Public}`, { - state: { - isPublic: activeTab === CommonTabKeys.Public, - }, + navigate(`/dataset/mirror/${record.id}?isPublic=${activeTab === CommonTabKeys.Public}`); + setCacheState({ + activeTab, + pagination, + searchText, }); }; @@ -153,6 +146,11 @@ function MirrorList() { // 创建镜像 const createMirror = () => { navigate(`/dataset/mirror/create`); + setCacheState({ + activeTab, + pagination, + searchText, + }); }; // 分页切换 @@ -276,7 +274,12 @@ function MirrorList() { dataSource={tableData} columns={columns} scroll={{ y: 'calc(100% - 55px)' }} - pagination={{ ...pagination, total: total }} + pagination={{ + ...pagination, + total: total, + showSizeChanger: true, + showQuickJumper: true, + }} onChange={handleTableChange} rowKey="id" /> diff --git a/react-ui/src/pages/Model/index.jsx b/react-ui/src/pages/Model/index.jsx index 12396a66..310823f4 100644 --- a/react-ui/src/pages/Model/index.jsx +++ b/react-ui/src/pages/Model/index.jsx @@ -46,7 +46,7 @@ const Dataset = () => { const onFinish = (values) => {}; const routeToIntro = (e, record) => { e.stopPropagation(); - navgite({ pathname: '/dataset/datasetIntro' }); + navgite({ pathname: '/dataset/dataset' }); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); diff --git a/react-ui/src/pages/Model/personalData.jsx b/react-ui/src/pages/Model/personalData.jsx index 34ff8f2a..e951e741 100644 --- a/react-ui/src/pages/Model/personalData.jsx +++ b/react-ui/src/pages/Model/personalData.jsx @@ -121,14 +121,14 @@ const PublicData = () => { const chooseModelType = (val, item) => { console.log(val, item); - if (item.path == queryFlow.model_type) { + if (item.id == queryFlow.model_type) { setActiveType(''); setQueryFlow({ ...queryFlow, model_type: null }); getModelLists({ ...queryFlow, model_type: null }); } else { - setActiveType(item.path); - setQueryFlow({ ...queryFlow, model_type: item.path }); - getModelLists({ ...queryFlow, model_type: item.path }); + setActiveType(item.id); + setQueryFlow({ ...queryFlow, model_type: item.id }); + getModelLists({ ...queryFlow, model_type: item.id }); } // setQueryFlow({...queryFlow,data_type:item.path},()=>{ @@ -136,14 +136,14 @@ const PublicData = () => { // }) }; const chooseModelTag = (val, item) => { - if (item.path == queryFlow.model_tag) { + if (item.id == queryFlow.model_tag) { setActiveTag(''); setQueryFlow({ ...queryFlow, model_tag: null }); getModelLists({ ...queryFlow, model_tag: null }); } else { - setActiveTag(item.path); - setQueryFlow({ ...queryFlow, model_tag: item.path }); - getModelLists({ ...queryFlow, model_tag: item.path }); + setActiveTag(item.id); + setQueryFlow({ ...queryFlow, model_tag: item.id }); + getModelLists({ ...queryFlow, model_tag: item.id }); } // setQueryFlow({...queryFlow,data_type:item.path},()=>{ // getDatasetlist() @@ -152,7 +152,7 @@ const PublicData = () => { const routeToIntro = (e, record) => { e.stopPropagation(); console.log(record); - navgite({ pathname: `/dataset/modelIntro/${record.id}` }); + navgite({ pathname: `/dataset/model/${record.id}` }); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); @@ -190,7 +190,7 @@ const PublicData = () => {
{ chooseModelType(e, item); @@ -231,7 +231,7 @@ const PublicData = () => {
{ chooseModelTag(e, item); diff --git a/react-ui/src/pages/Model/publicData.jsx b/react-ui/src/pages/Model/publicData.jsx index 36261368..5cb7082e 100644 --- a/react-ui/src/pages/Model/publicData.jsx +++ b/react-ui/src/pages/Model/publicData.jsx @@ -77,14 +77,14 @@ const PublicData = () => { }; const chooseModelType = (val, item) => { console.log(val, item); - if (item.path == queryFlow.model_type) { + if (item.id == queryFlow.model_type) { setActiveType(''); setQueryFlow({ ...queryFlow, model_type: null }); getModelLists({ ...queryFlow, model_type: null }); } else { - setActiveType(item.path); - setQueryFlow({ ...queryFlow, model_type: item.path }); - getModelLists({ ...queryFlow, model_type: item.path }); + setActiveType(item.id); + setQueryFlow({ ...queryFlow, model_type: item.id }); + getModelLists({ ...queryFlow, model_type: item.id }); } // setQueryFlow({...queryFlow,data_type:item.path},()=>{ @@ -92,14 +92,14 @@ const PublicData = () => { // }) }; const chooseModelTag = (val, item) => { - if (item.path == queryFlow.model_tag) { + if (item.id == queryFlow.model_tag) { setActiveTag(''); setQueryFlow({ ...queryFlow, model_tag: null }); getModelLists({ ...queryFlow, model_tag: null }); } else { - setActiveTag(item.path); - setQueryFlow({ ...queryFlow, model_tag: item.path }); - getModelLists({ ...queryFlow, model_tag: item.path }); + setActiveTag(item.id); + setQueryFlow({ ...queryFlow, model_tag: item.id }); + getModelLists({ ...queryFlow, model_tag: item.id }); } // setQueryFlow({...queryFlow,data_type:item.path},()=>{ // getDatasetlist() @@ -109,7 +109,7 @@ const PublicData = () => { const routeToIntro = (e, record) => { e.stopPropagation(); console.log(record); - navgite({ pathname: `/dataset/modelIntro/${record.id}` }); + navgite({ pathname: `/dataset/model/${record.id}` }); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); @@ -147,7 +147,7 @@ const PublicData = () => {
{ chooseModelType(e, item); @@ -181,7 +181,7 @@ const PublicData = () => {
{ chooseModelTag(e, item); diff --git a/react-ui/src/pages/Monitor/Job/detail.tsx b/react-ui/src/pages/Monitor/Job/detail.tsx index 476f5816..f664b76a 100644 --- a/react-ui/src/pages/Monitor/Job/detail.tsx +++ b/react-ui/src/pages/Monitor/Job/detail.tsx @@ -1,9 +1,9 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { getValueEnumLabel } from '@/utils/options'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Button, Descriptions, Modal } from 'antd'; +import { Button, Descriptions } from 'antd'; import React, { useEffect } from 'react'; - /* * * * @author whiteshader@163.com @@ -39,7 +39,7 @@ const OperlogForm: React.FC = (props) => { }; return ( - = (props) => { {values.invokeTarget} - + ); }; diff --git a/react-ui/src/pages/Monitor/Job/edit.tsx b/react-ui/src/pages/Monitor/Job/edit.tsx index 9e927e78..58dc7785 100644 --- a/react-ui/src/pages/Monitor/Job/edit.tsx +++ b/react-ui/src/pages/Monitor/Job/edit.tsx @@ -11,7 +11,7 @@ import { import { FormattedMessage, useIntl } from '@umijs/max'; import { Form, Modal } from 'antd'; import React, { useEffect } from 'react'; - +import KFModal from '@/components/KFModal'; /** * 定时任务调度 Edit Form * @@ -66,7 +66,7 @@ const JobForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/Monitor/JobLog/detail.tsx b/react-ui/src/pages/Monitor/JobLog/detail.tsx index f9311219..d6b25913 100644 --- a/react-ui/src/pages/Monitor/JobLog/detail.tsx +++ b/react-ui/src/pages/Monitor/JobLog/detail.tsx @@ -1,16 +1,10 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { getValueEnumLabel } from '@/utils/options'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Descriptions, Modal } from 'antd'; +import { Descriptions } from 'antd'; import React, { useEffect } from 'react'; -/* * - * - * @author whiteshader@163.com - * @datetime 2021/09/16 - * - * */ - export type JobLogFormValueType = Record & Partial; export type JobLogFormProps = { @@ -33,7 +27,7 @@ const JobLogDetailForm: React.FC = (props) => { }; return ( - = (props) => { {getValueEnumLabel(statusOptions, values.status, '未知')} - + ); }; diff --git a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less index fddea2b7..bfff8100 100644 --- a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less +++ b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less @@ -22,7 +22,7 @@ height: 398px; margin-right: 15px; padding: 15px; - background-color: @background-color-primay; + background-color: @background-color-primary; border: 1px solid @border-color; border-radius: 8px; @@ -31,7 +31,7 @@ padding-left: 0; background-color: transparent; border-width: 0; - border-bottom: 1px solid @border-color-second; + border-bottom: 1px solid @border-color-secondary; border-radius: 0; } } @@ -40,7 +40,7 @@ width: calc(100% - 488px - 15px); height: 398px; padding: 15px; - background-color: @background-color-primay; + background-color: @background-color-primary; border: 1px solid @border-color; border-radius: 8px; @@ -49,7 +49,7 @@ padding: 3px 0 6px; color: @text-color; font-size: @font-size; - border-bottom: 1px solid @border-color-second; + border-bottom: 1px solid @border-color-secondary; } &__files { height: calc(100% - 75px); diff --git a/react-ui/src/pages/System/Config/edit.tsx b/react-ui/src/pages/System/Config/edit.tsx index 3e91bc2f..97048e26 100644 --- a/react-ui/src/pages/System/Config/edit.tsx +++ b/react-ui/src/pages/System/Config/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormDigit, @@ -7,9 +8,8 @@ import { ProFormTextArea, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import React, { useEffect } from 'react'; - export type ConfigFormData = Record & Partial; export type ConfigFormProps = { @@ -53,7 +53,7 @@ const ConfigForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/Dept/edit.tsx b/react-ui/src/pages/System/Dept/edit.tsx index 736761fa..8a04deaa 100644 --- a/react-ui/src/pages/System/Dept/edit.tsx +++ b/react-ui/src/pages/System/Dept/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormDigit, @@ -7,10 +8,9 @@ import { ProFormTreeSelect, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import { DataNode } from 'antd/es/tree'; import React, { useEffect } from 'react'; - export type DeptFormData = Record & Partial; export type DeptFormProps = { @@ -59,7 +59,7 @@ const DeptForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/Dict/edit.tsx b/react-ui/src/pages/System/Dict/edit.tsx index e7f5e625..9593cddb 100644 --- a/react-ui/src/pages/System/Dict/edit.tsx +++ b/react-ui/src/pages/System/Dict/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormDigit, @@ -7,9 +8,8 @@ import { ProFormTextArea, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import React, { useEffect } from 'react'; - export type DictTypeFormData = Record & Partial; export type DictTypeFormProps = { @@ -52,7 +52,7 @@ const DictTypeForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/DictData/edit.tsx b/react-ui/src/pages/System/DictData/edit.tsx index 75646f15..8f03931a 100644 --- a/react-ui/src/pages/System/DictData/edit.tsx +++ b/react-ui/src/pages/System/DictData/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormDigit, @@ -8,9 +9,8 @@ import { ProFormTextArea, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import React, { useEffect } from 'react'; - export type DataFormData = Record & Partial; export type DataFormProps = { @@ -58,7 +58,7 @@ const DictDataForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/Logininfor/edit.tsx b/react-ui/src/pages/System/Logininfor/edit.tsx index 1e4a82c4..6248b376 100644 --- a/react-ui/src/pages/System/Logininfor/edit.tsx +++ b/react-ui/src/pages/System/Logininfor/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormDigit, @@ -7,9 +8,8 @@ import { ProFormTimePicker, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import React, { useEffect } from 'react'; - export type LogininforFormData = Record & Partial; export type LogininforFormProps = { @@ -53,7 +53,7 @@ const LogininforForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/Menu/edit.tsx b/react-ui/src/pages/System/Menu/edit.tsx index 00a39c74..db4e6e88 100644 --- a/react-ui/src/pages/System/Menu/edit.tsx +++ b/react-ui/src/pages/System/Menu/edit.tsx @@ -1,5 +1,6 @@ import { DictValueEnumObj } from '@/components/DictTag'; import IconSelector from '@/components/IconSelector'; +import KFModal from '@/components/KFModal'; import { createIcon } from '@/utils/IconUtil'; import { ProForm, @@ -10,7 +11,7 @@ import { ProFormTreeSelect, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import { DataNode } from 'antd/es/tree'; import React, { useEffect, useState } from 'react'; @@ -73,7 +74,7 @@ const MenuForm: React.FC = (props) => { }; return ( - = (props) => { }} /> - { @@ -382,8 +383,8 @@ const MenuForm: React.FC = (props) => { setIconSelectorOpen(false); }} /> - - + + ); }; diff --git a/react-ui/src/pages/System/Notice/edit.tsx b/react-ui/src/pages/System/Notice/edit.tsx index 2e5446bf..1c45cb75 100644 --- a/react-ui/src/pages/System/Notice/edit.tsx +++ b/react-ui/src/pages/System/Notice/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormDigit, @@ -8,9 +9,8 @@ import { ProFormTextArea, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import React, { useEffect } from 'react'; - export type NoticeFormData = Record & Partial; export type NoticeFormProps = { @@ -55,7 +55,7 @@ const NoticeForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/Operlog/detail.tsx b/react-ui/src/pages/System/Operlog/detail.tsx index 74e2c3bc..6a4358f9 100644 --- a/react-ui/src/pages/System/Operlog/detail.tsx +++ b/react-ui/src/pages/System/Operlog/detail.tsx @@ -1,9 +1,9 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { getValueEnumLabel } from '@/utils/options'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Descriptions, Modal } from 'antd'; +import { Descriptions } from 'antd'; import React from 'react'; - export type OperlogFormData = Record & Partial; export type OperlogFormProps = { @@ -28,7 +28,7 @@ const OperlogDetailForm: React.FC = (props) => { }; return ( - = (props) => { {values.operTime?.toString()} - + ); }; diff --git a/react-ui/src/pages/System/Post/edit.tsx b/react-ui/src/pages/System/Post/edit.tsx index 15d56b82..abf5a87e 100644 --- a/react-ui/src/pages/System/Post/edit.tsx +++ b/react-ui/src/pages/System/Post/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormDigit, @@ -7,9 +8,8 @@ import { ProFormTextArea, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import React, { useEffect } from 'react'; - export type PostFormData = Record & Partial; export type PostFormProps = { @@ -53,7 +53,7 @@ const PostForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/Role/components/DataScope.tsx b/react-ui/src/pages/System/Role/components/DataScope.tsx index b8e92a71..01502cdb 100644 --- a/react-ui/src/pages/System/Role/components/DataScope.tsx +++ b/react-ui/src/pages/System/Role/components/DataScope.tsx @@ -1,10 +1,10 @@ +import KFModal from '@/components/KFModal'; import { Key, ProForm, ProFormDigit, ProFormSelect, ProFormText } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Checkbox, Col, Form, Modal, Row, Tree } from 'antd'; +import { Checkbox, Col, Form, Row, Tree } from 'antd'; import { CheckboxValueType } from 'antd/es/checkbox/Group'; import { DataNode } from 'antd/es/tree'; import React, { useEffect, useState } from 'react'; - /* * * * @author whiteshader@163.com @@ -90,7 +90,7 @@ const DataScopeForm: React.FC = (props) => { }; return ( - = (props) => { - + ); }; diff --git a/react-ui/src/pages/System/Role/components/UserSelectorModal.tsx b/react-ui/src/pages/System/Role/components/UserSelectorModal.tsx index e09d6143..c769cd1b 100644 --- a/react-ui/src/pages/System/Role/components/UserSelectorModal.tsx +++ b/react-ui/src/pages/System/Role/components/UserSelectorModal.tsx @@ -1,4 +1,5 @@ import DictTag from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { getDictValueEnum } from '@/services/system/dict'; import { ActionType, @@ -8,9 +9,7 @@ import { RequestData, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Modal } from 'antd'; import React, { useEffect, useRef, useState } from 'react'; - /* * * * @author whiteshader@163.com @@ -90,7 +89,7 @@ const UserSelectorModal: React.FC = (props) => { ]; return ( - = (props) => { }, }} /> - + ); }; diff --git a/react-ui/src/pages/System/Role/edit.tsx b/react-ui/src/pages/System/Role/edit.tsx index dda8d9eb..00c64247 100644 --- a/react-ui/src/pages/System/Role/edit.tsx +++ b/react-ui/src/pages/System/Role/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormDigit, @@ -7,10 +8,9 @@ import { ProFormTextArea, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import Tree, { DataNode } from 'antd/es/tree'; import React, { useEffect, useState } from 'react'; - export type RoleFormData = Record & Partial; export type RoleFormProps = { @@ -61,7 +61,7 @@ const RoleForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/User/components/AuthRole.tsx b/react-ui/src/pages/System/User/components/AuthRole.tsx index 4cc25a35..6a199fb6 100644 --- a/react-ui/src/pages/System/User/components/AuthRole.tsx +++ b/react-ui/src/pages/System/User/components/AuthRole.tsx @@ -1,15 +1,8 @@ +import KFModal from '@/components/KFModal'; import { ProForm, ProFormSelect } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import React, { useEffect } from 'react'; - -/* * - * - * @author whiteshader@163.com - * @datetime 2023/02/06 - * - * */ - export type FormValueType = any & Partial; export type AuthRoleFormProps = { @@ -40,7 +33,7 @@ const AuthRoleForm: React.FC = (props) => { }; return ( - = (props) => { rules={[{ required: true, message: '请选择角色!' }]} /> - + ); }; diff --git a/react-ui/src/pages/System/User/components/ResetPwd.tsx b/react-ui/src/pages/System/User/components/ResetPwd.tsx index 5d33efce..fd5d2870 100644 --- a/react-ui/src/pages/System/User/components/ResetPwd.tsx +++ b/react-ui/src/pages/System/User/components/ResetPwd.tsx @@ -1,15 +1,9 @@ +import KFModal from '@/components/KFModal'; import { ProForm, ProFormText } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import React from 'react'; -/* * - * - * @author whiteshader@163.com - * @datetime 2023/02/06 - * - * */ - export type FormValueType = any & Partial; export type UpdateFormProps = { @@ -44,7 +38,7 @@ const UpdateForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/System/User/edit.tsx b/react-ui/src/pages/System/User/edit.tsx index 2b68b53e..101ec96c 100644 --- a/react-ui/src/pages/System/User/edit.tsx +++ b/react-ui/src/pages/System/User/edit.tsx @@ -1,4 +1,5 @@ import { DictValueEnumObj } from '@/components/DictTag'; +import KFModal from '@/components/KFModal'; import { ProForm, ProFormRadio, @@ -8,17 +9,10 @@ import { ProFormTreeSelect, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; -import { Form, Modal } from 'antd'; +import { Form } from 'antd'; import { DataNode } from 'antd/es/tree'; import React, { useEffect } from 'react'; -/* * - * - * @author whiteshader@163.com - * @datetime 2023/02/06 - * - * */ - export type UserFormData = Record & Partial; export type UserFormProps = { @@ -74,7 +68,7 @@ const UserForm: React.FC = (props) => { }; return ( - = (props) => { ]} /> - + ); }; diff --git a/react-ui/src/pages/Tool/Gen/components/PreviewCode.tsx b/react-ui/src/pages/Tool/Gen/components/PreviewCode.tsx index 1e364d16..14242a59 100644 --- a/react-ui/src/pages/Tool/Gen/components/PreviewCode.tsx +++ b/react-ui/src/pages/Tool/Gen/components/PreviewCode.tsx @@ -1,10 +1,10 @@ +import KFModal from '@/components/KFModal'; import { useIntl } from '@umijs/max'; import type { TabsProps } from 'antd'; -import { Modal, Tabs } from 'antd'; +import { Tabs } from 'antd'; import 'highlight.js/styles/base16/material.css'; import React, { useEffect } from 'react'; import Highlight from 'react-highlight'; - interface PreviewTableProps { open: boolean; data?: any; @@ -26,7 +26,7 @@ const PreviewTableCode: React.FC = (props) => { useEffect(() => {}, []); return ( - = (props) => { }} > - + ); }; diff --git a/react-ui/src/pages/User/Center/components/AvatarCropper/index.tsx b/react-ui/src/pages/User/Center/components/AvatarCropper/index.tsx index 66bd3bae..a2e19b0b 100644 --- a/react-ui/src/pages/User/Center/components/AvatarCropper/index.tsx +++ b/react-ui/src/pages/User/Center/components/AvatarCropper/index.tsx @@ -1,3 +1,4 @@ +import KFModal from '@/components/KFModal'; import { uploadAvatar } from '@/services/system/user'; import { MinusOutlined, @@ -7,7 +8,7 @@ import { UploadOutlined, } from '@ant-design/icons'; import { useIntl } from '@umijs/max'; -import { Button, Col, Modal, Row, Space, Upload, message } from 'antd'; +import { Button, Col, Row, Space, Upload, message } from 'antd'; import React, { useEffect, useRef, useState } from 'react'; import { Cropper } from 'react-cropper'; import './cropper.css'; @@ -88,7 +89,7 @@ const AvatarCropperForm: React.FC = (props) => { }; }; return ( - = (props) => { - + ); }; diff --git a/react-ui/src/pages/Workspace/components/AssetsManagement/index.less b/react-ui/src/pages/Workspace/components/AssetsManagement/index.less new file mode 100644 index 00000000..122d3bf4 --- /dev/null +++ b/react-ui/src/pages/Workspace/components/AssetsManagement/index.less @@ -0,0 +1,54 @@ +.assets-management { + flex: 1; + width: 100%; + padding: 20px 20px 0; + background-color: white; + border-radius: 4px; + + :global { + .ant-select-filled { + background-color: rgba(138, 138, 138, 0.12); + border-radius: 2px; + + .ant-select-selection-item { + color: @text-color-secondary !important; + font-size: 13px; + } + } + } + + &__title { + color: @text-color; + font-weight: 500; + font-size: @font-size-title; + } + + &__increase { + display: inline-block; + margin-top: 12px; + margin-bottom: 30px; + padding: 2px 7px; + color: @primary-color-secondary; + font-size: 13px; + background-color: rgba(187, 210, 255, 0.29); + border-radius: 2px; + } + + &__summary { + display: flex; + flex-direction: column; + width: 33.33%; + + &__title { + margin-bottom: 12px; + color: @text-color-secondary; + font-size: @font-size; + } + + &__value { + color: @text-color; + font-weight: 500; + font-size: 22px; + } + } +} diff --git a/react-ui/src/pages/Workspace/components/AssetsManagement/index.tsx b/react-ui/src/pages/Workspace/components/AssetsManagement/index.tsx new file mode 100644 index 00000000..dc1af6c9 --- /dev/null +++ b/react-ui/src/pages/Workspace/components/AssetsManagement/index.tsx @@ -0,0 +1,81 @@ +import { CommonTabKeys } from '@/enums'; +import { getWorkspaceAssetCountReq } from '@/services/workspace'; +import { to } from '@/utils/promise'; +import { Flex, Select } from 'antd'; +import { useEffect, useState } from 'react'; +import styles from './index.less'; +function AssetsManagement() { + const [type, setType] = useState(CommonTabKeys.Public); + const [assetCounts, setAssetCounts] = useState<{ title: string; value: number }[]>([]); + useEffect(() => { + getWorkspacAssetCount(); + }, [type]); + // 获取工作空间资产数量 + const getWorkspacAssetCount = async () => { + const params = { + isPublic: type === CommonTabKeys.Public, + }; + const [res] = await to(getWorkspaceAssetCountReq(params)); + if (res && res.data) { + const { component, dataset, image, model, workflow } = res.data; + const items = [ + { + title: '数据集', + value: dataset, + }, + { + title: '模型', + value: model, + }, + { + title: '镜像', + value: image, + }, + { + title: '组件', + value: component, + }, + { + title: '代码配置', + value: 0, + }, + { + title: '流水线模版', + value: workflow, + }, + ]; + setAssetCounts(items); + } + }; + + return ( +
+ +
AI资产
+