From 42ce67062f23239a235f714d7f6b2c50fcc38444 Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Tue, 22 Oct 2024 09:47:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E9=AA=8C=E5=AF=B9=E6=AF=94?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=8A=E6=8B=89=E5=8A=A0=E8=BD=BD=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/.npmrc | 1 + react-ui/package.json | 4 +- react-ui/src/assets/img/robot.png | Bin 1777 -> 15171 bytes react-ui/src/components/KFModal/index.less | 2 +- react-ui/src/overrides.less | 2 +- .../pages/Experiment/Comparison/index.less | 29 ++- .../src/pages/Experiment/Comparison/index.tsx | 102 ++++---- .../components/AddExperimentModal/index.tsx | 2 +- react-ui/src/pages/Workspace/index.less | 10 +- react-ui/src/services/typings.d.ts | 223 ++++++++++++++++++ 10 files changed, 319 insertions(+), 56 deletions(-) create mode 100644 react-ui/.npmrc diff --git a/react-ui/.npmrc b/react-ui/.npmrc new file mode 100644 index 00000000..dd026c83 --- /dev/null +++ b/react-ui/.npmrc @@ -0,0 +1 @@ +save-prefix=~ diff --git a/react-ui/package.json b/react-ui/package.json index d5c09dbd..aebf21ca 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -60,7 +60,7 @@ "@antv/hierarchy": "^0.6.12", "@types/crypto-js": "^4.2.2", "@umijs/route-utils": "^4.0.1", - "antd": "^5.4.4", + "antd": "~5.21.4", "classnames": "^2.3.2", "crypto-js": "^4.2.0", "echarts": "^5.5.0", @@ -111,7 +111,7 @@ "umi-presets-pro": "^2.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=16.14.0" }, "create-umi": { "ignoreScript": [ diff --git a/react-ui/src/assets/img/robot.png b/react-ui/src/assets/img/robot.png index c1379ef35055ce861d41a5ae240da54982d6dac2..9e179741cce50d8e436f887cd6ac25a777e99ae5 100644 GIT binary patch literal 15171 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 literal 1777 zcmah}>p#>9AN~Hu%ot?zWXZVH)FXtXafwJnD7g=w2{VjHt)-#C} zY0@f*R1CISw;{aRt#X0A5-ki_*oEInA#p#5sw6Zh+$l9H>rfwWj&dB0fhW_@_lId`ZzW=4-) zzwpvPOZiv%Ra7Hnk6qMCdJkQt@9?p{zTCd6t;Npin{A)vcCE`a6eRRg!U=G=eiBJS{q@|Ix=*5(eUrsb8u~9ar~^#{tII%rC9Mk?R5_%?Ka5AGkUDT$u z$ilFZ#+q$F=T4hwBLBw(E24f`W$}3q)%9)PgZjXR+=W+;yj?V%qjhaN;4!Plq3%Kbh4x?q|*FO9;o`e3;?xFvm?g#aCN051hR?@@JJ=AX#WV zG^{qsd{_UB%ZmgM9pKaOFgdMAC%iac$crRN=*R}JQK!9o>CASP&W1`qax$chj(?jH>ef8)FrM9)diCLX36k=>r(E#C8ft!f z?(z^t0jii|N8_`d1q$i1>JLp~FoTV?Z};5d_uj>$?z*BkzKf|vbZ_dd7Ypc!sbe=} zjJRn%?R&1ZReDWY|E=`krIVAbO%LY8SV@NsCri_!}`_AfQ;s7)&`VLY4 z`pyaGh@ohwY6c@93sg&c#PA=}voa96w@Ay)Ok!p@du($uvh+Xze7Bnl`Ib-Qi#tP0`l{ zr9WJZ6f*;m_~9TM_S_X9{d}z6d8d!9yE(^5-v{dtnPcCikZkmx+&4NO!x zDpS(OrKHz9$Tpc{epP7A{u7MXSvd6YQMSglUt4;$4ticc^6D6bW{m)a6wY&&1PV|@ zDK~^qPPuLsds?Rpz=a3KO8rH%quJwQq|o=l25c-)@)0jgODnf0_sf8RuUFxR#93eb-l0wrtZpcS$Gk-5U<)!?wlJW=x`(^buIS@KMKN@8;GvU|! zqXilLWm)6yHgMot_DDfV<K1i~e*l%IaL76%zP>40!Aqb7ZW00=-TUAs6NA%$Zq@CRls=!n2{^xviu;E$Xu z?F!{Y5vI1G3z@xN?r9KbZFAzJ$7VB{BtXuvv*WMjRSy75wp?(N$~`F{oyRA<+36pN z0CsNA$tHyyER%d4ij|&Sx3|L-iBI_i*HEwAl;(ykrZ!hXRxzzvc7A@ GO!zOCIu|$q diff --git a/react-ui/src/components/KFModal/index.less b/react-ui/src/components/KFModal/index.less index b034672d..fafc6f7d 100644 --- a/react-ui/src/components/KFModal/index.less +++ b/react-ui/src/components/KFModal/index.less @@ -20,7 +20,7 @@ height: 40px; padding: 0 30px; font-size: @font-size-content; - border-radius: 10px; + border-radius: 6px; } .ant-btn-default { border-color: transparent; diff --git a/react-ui/src/overrides.less b/react-ui/src/overrides.less index 9e4b34cc..f676890e 100644 --- a/react-ui/src/overrides.less +++ b/react-ui/src/overrides.less @@ -168,7 +168,7 @@ height: 40px; padding: 0 30px; font-size: @font-size-content; - border-radius: 10px; + border-radius: 6px; } .ant-btn-default { border-color: transparent; diff --git a/react-ui/src/pages/Experiment/Comparison/index.less b/react-ui/src/pages/Experiment/Comparison/index.less index b9198e74..273791c4 100644 --- a/react-ui/src/pages/Experiment/Comparison/index.less +++ b/react-ui/src/pages/Experiment/Comparison/index.less @@ -14,10 +14,30 @@ &__table { height: calc(100% - 60px); - padding: 20px 30px 0; + padding: 20px 30px; background-color: white; border-radius: 10px; + &__footer { + display: flex; + align-items: center; + padding-top: 20px; + color: @text-color-secondary; + font-size: 12px; + background-color: white; + + div { + flex: 1; + height: 1px; + background-color: @border-color-base; + } + + p { + flex: none; + margin: 0 8px; + } + } + :global { .ant-table-container { border: none !important; @@ -34,6 +54,13 @@ border-left: none !important; } } + .ant-table-tbody-virtual::after { + border-bottom: none !important; + } + .ant-table-footer { + padding: 0; + border: none !important; + } } } } diff --git a/react-ui/src/pages/Experiment/Comparison/index.tsx b/react-ui/src/pages/Experiment/Comparison/index.tsx index fe09198b..1667a064 100644 --- a/react-ui/src/pages/Experiment/Comparison/index.tsx +++ b/react-ui/src/pages/Experiment/Comparison/index.tsx @@ -1,4 +1,10 @@ -// import { useCacheState } from '@/hooks/pageCacheState'; +/* + * @Author: 赵伟 + * @Date: 2024-10-10 09:55:12 + * @Description: 实验对比 + */ + +import { useDomSize } from '@/hooks'; import { getExpEvaluateInfosReq, getExpMetricsReq, @@ -8,7 +14,6 @@ import { to } from '@/utils/promise'; import tableCellRender, { TableCellValueType } from '@/utils/table'; import { useSearchParams } from '@umijs/max'; import { App, Button, Table, /* TablePaginationConfig,*/ TableProps, Tooltip } from 'antd'; -import classNames from 'classnames'; import { useEffect, useMemo, useState } from 'react'; import ExperimentStatusCell from '../components/ExperimentStatusCell'; import { ComparisonType, comparisonConfig } from './config'; @@ -26,40 +31,57 @@ type TableData = { params: Record; }; +const pageSize = 30; + +// function Footer() { +// return ( +//
+//
+//

我是有底线的

+//
+//
+// ); +// } + function ExperimentComparison() { const [searchParams] = useSearchParams(); const comparisonType = searchParams.get('type') as ComparisonType; const experimentId = searchParams.get('id'); const [tableData, setTableData] = useState([]); - // const [cacheState, setCacheState] = useCacheState(); - // const [total, setTotal] = useState(0); const [selectedRowKeys, setSelectedRowKeys] = useState([]); - // const [loading, setLoading] = useState(false); const { message } = App.useApp(); const config = useMemo(() => comparisonConfig[comparisonType], [comparisonType]); - // const [pagination, setPagination] = useState( - // cacheState?.pagination ?? { - // current: 1, - // pageSize: 10, - // }, - // ); + const [tableRef, { width: tableWidth, height: tableHeight }] = useDomSize( + 0, + 0, + [], + ); + const [loadCompleted, setLoadCompleted] = useState(false); + const [loading, setLoading] = useState(false); // 避免误触发加载更多 useEffect(() => { getComparisonData(); }, [experimentId]); // 获取对比数据列表 - const getComparisonData = async () => { - // setLoading(true); + const getComparisonData = async (offset: string = '') => { const request = comparisonType === ComparisonType.Train ? getExpTrainInfosReq : getExpEvaluateInfosReq; - const [res] = await to(request(experimentId, { offset: '', limit: 50 })); - // setLoading(false); + const [res] = await to(request(experimentId, { offset: offset, limit: pageSize })); if (res && res.data) { - // const { content = [], totalElements = 0 } = res.data; - setTableData(res.data); - // setTotal(totalElements); + setTableData((prev) => [...prev, ...res.data]); + if (res.data.length === 0) { + setLoadCompleted(true); + const ele = document.getElementsByClassName('ant-table-body')[0]; + if (ele) { + const div = document.createElement('div'); + div.className = styles['experiment-comparison__table__footer']; + div.innerHTML = '

我是有底线的

'; + ele.appendChild(div); + } + } } + setLoading(false); }; // 获取对比 url @@ -80,17 +102,10 @@ function ExperimentComparison() { getExpMetrics(); }; - // 分页切换 - // const handleTableChange: TableProps['onChange'] = (pagination, filters, sorter, { action }) => { - // if (action === 'paginate') { - // setPagination(pagination); - // } - // // console.log(pagination, filters, sorter, action); - // }; - // 选择行 const rowSelection: TableProps['rowSelection'] = { type: 'checkbox', + columnWidth: 48, fixed: 'left', selectedRowKeys, onChange: (selectedRowKeys: React.Key[]) => { @@ -98,7 +113,20 @@ function ExperimentComparison() { }, }; - const columns: TableProps['columns'] = useMemo(() => { + const handleTableScroll = (e: React.UIEvent) => { + const target = e.target as HTMLDivElement; + + const { scrollTop, scrollHeight, clientHeight } = target; + + // 实现自动加载更多 + if (!loadCompleted && !loading && scrollHeight - scrollTop - clientHeight <= 0) { + const last = tableData[tableData.length - 1]; + setLoading(true); + getComparisonData(last?.run_id); + } + }; + + const columns: TableProps['columns'] = useMemo(() => { const first: TableData | undefined = tableData[0]; return [ { @@ -192,29 +220,15 @@ function ExperimentComparison() { 可视化对比 -
+
diff --git a/react-ui/src/pages/Experiment/components/AddExperimentModal/index.tsx b/react-ui/src/pages/Experiment/components/AddExperimentModal/index.tsx index 4758a165..2b7e80c5 100644 --- a/react-ui/src/pages/Experiment/components/AddExperimentModal/index.tsx +++ b/react-ui/src/pages/Experiment/components/AddExperimentModal/index.tsx @@ -126,7 +126,7 @@ function AddExperimentModal({ , - , ]; diff --git a/react-ui/src/pages/Workspace/index.less b/react-ui/src/pages/Workspace/index.less index 300887e9..3fbcc8e8 100644 --- a/react-ui/src/pages/Workspace/index.less +++ b/react-ui/src/pages/Workspace/index.less @@ -47,13 +47,11 @@ &__robot-img { position: fixed; - right: 30px; - bottom: 20px; + right: 20px; + bottom: 90px; z-index: 99; - width: 64px; - height: 64px; - background-color: white; - border-radius: 10px; + width: 56px; + height: 56px; cursor: pointer; } } diff --git a/react-ui/src/services/typings.d.ts b/react-ui/src/services/typings.d.ts index 1e0b8b5f..5720efd7 100644 --- a/react-ui/src/services/typings.d.ts +++ b/react-ui/src/services/typings.d.ts @@ -188,4 +188,227 @@ declare namespace API { filter?: string; sorter?: string; }; + type CurrentUser = UserInfo & { + signature?: string; + title?: string; + group?: string; + tags?: { key?: string; label?: string }[]; + notifyCount?: number; + unreadCount?: number; + country?: string; + access?: string; + geographic?: { + province?: { label?: string; key?: string }; + city?: { label?: string; key?: string }; + }; + address?: string; + phone?: string; + roleNames?: { + roleName?: string; + }[]; + }; + + type ErrorResponse = { + /** 业务约定的错误码 */ + errorCode: string; + /** 业务上的错误信息 */ + errorMessage?: string; + /** 业务上的请求是否成功 */ + success?: boolean; + }; + + type FakeCaptcha = { + code?: number; + status?: string; + }; + + type getFakeCaptchaParams = { + /** 手机号 */ + phone?: string; + }; + + type LoginParams = { + username?: string; + password?: string; + uuid?: string; + autoLogin?: boolean; + type?: string; + }; + + type LoginResult = { + code: number; + msg?: string; + type?: string; + data?: { + access_token?: string; + expires_in?: number; + }; + }; + + type NoticeIconItem = { + id?: string; + extra?: string; + key?: string; + read?: boolean; + avatar?: string; + title?: string; + status?: string; + datetime?: string; + description?: string; + type?: NoticeIconItemType; + }; + + type NoticeIconItemType = 'notification' | 'message' | 'event'; + + type NoticeIconList = { + data?: NoticeIconItem[]; + /** 列表的内容总数 */ + total?: number; + success?: boolean; + }; + + type PageParams = { + current?: number; + pageSize?: number; + }; + + type RuleList = { + data?: RuleListItem[]; + /** 列表的内容总数 */ + total?: number; + success?: boolean; + }; + + type RuleListItem = { + key?: number; + disabled?: boolean; + href?: string; + avatar?: string; + name?: string; + owner?: string; + desc?: string; + callNo?: number; + status?: number; + updatedAt?: string; + createdAt?: string; + progress?: number; + }; + + type ruleParams = { + /** 当前的页码 */ + current?: number; + /** 页面的容量 */ + pageSize?: number; + }; + + type ApiResponse = { + code?: number; + type?: string; + message?: string; + }; + + type Category = { + id?: number; + name?: string; + }; + + type deleteOrderParams = { + /** ID of the order that needs to be deleted */ + orderId: number; + }; + + type deletePetParams = { + api_key?: string; + /** Pet id to delete */ + petId: number; + }; + + type deleteUserParams = { + /** The name that needs to be deleted */ + username: string; + }; + + type findPetsByStatusParams = { + /** Status values that need to be considered for filter */ + status: ('available' | 'pending' | 'sold')[]; + }; + + type findPetsByTagsParams = { + /** Tags to filter by */ + tags: string[]; + }; + + type getOrderByIdParams = { + /** ID of pet that needs to be fetched */ + orderId: number; + }; + + type getPetByIdParams = { + /** ID of pet to return */ + petId: number; + }; + + type getUserByNameParams = { + /** The name that needs to be fetched. Use user1 for testing. */ + username: string; + }; + + type loginUserParams = { + /** The user name for login */ + username: string; + /** The password for login in clear text */ + password: string; + }; + + type Order = { + id?: number; + petId?: number; + quantity?: number; + shipDate?: string; + /** Order Status */ + status?: 'placed' | 'approved' | 'delivered'; + complete?: boolean; + }; + + type Pet = { + id?: number; + category?: Category; + name: string; + photoUrls: string[]; + tags?: Tag[]; + /** pet status in the store */ + status?: 'available' | 'pending' | 'sold'; + }; + + type Tag = { + id?: number; + name?: string; + }; + + type updatePetWithFormParams = { + /** ID of pet that needs to be updated */ + petId: number; + }; + + type updateUserParams = { + /** name that need to be updated */ + username: string; + }; + + type uploadFileParams = { + /** ID of pet to update */ + petId: number; + }; + + type User = { + id?: number; + username?: string; + firstName?: string; + lastName?: string; + email?: string; + password?: string; + phone?: string; + /** User Status */ + userStatus?: number; + }; }