diff --git a/config/routes.ts b/config/routes.ts index f287e977..01a55735 100644 --- a/config/routes.ts +++ b/config/routes.ts @@ -26,6 +26,7 @@ export default [ path: '/models', key: 'models', icon: 'Block', + access: 'canSeeAdmin', component: './llmodels' }, { @@ -33,6 +34,7 @@ export default [ path: '/resources', key: 'resources', icon: 'CloudServer', + access: 'canSeeAdmin', component: './resources' }, { diff --git a/src/layouts/Exception.tsx b/src/layouts/Exception.tsx index 5f70000f..d4904dd0 100644 --- a/src/layouts/Exception.tsx +++ b/src/layouts/Exception.tsx @@ -1,9 +1,9 @@ // @ts-nocheck // This file is generated by Umi automatically // DO NOT CHANGE IT MANUALLY! +import { history, useIntl, type IRoute } from '@umijs/max'; +import { Button, Result } from 'antd'; import React from 'react'; -import { history, type IRoute } from '@umijs/max'; -import { Result, Button } from 'antd'; const Exception: React.FC<{ children: React.ReactNode; @@ -12,27 +12,33 @@ const Exception: React.FC<{ noAccessible?: React.ReactNode; unAccessible?: React.ReactNode; noFound?: React.ReactNode; -}> = (props) => ( - console.log('Exception========', props), +}> = (props) => { + const intl = useIntl(); // render custom 404 - (!props.route && (props.noFound || props.notFound)) || - // render custom 403 - (props.route?.unaccessible && (props.unAccessible || props.noAccessible)) || - // render default exception - ((!props.route || props.route?.unaccessible) && ( - history.push('/')}> - 返回首页 - - } - /> - )) || - // normal render - props.children -); + return ( + (!props.route && (props.noFound || props.notFound)) || + // render custom 403 + (props.route?.unaccessible && (props.unAccessible || props.noAccessible)) || + // render default exception + ((!props.route || props.route?.unaccessible) && ( + history.push('/')}> + {intl.formatMessage({ id: 'common.button.back' })} + + } + /> + )) || + // normal render + props.children + ); +}; export default Exception; diff --git a/src/locales/en-US/common.ts b/src/locales/en-US/common.ts index 59008519..e9b2bbf5 100644 --- a/src/locales/en-US/common.ts +++ b/src/locales/en-US/common.ts @@ -112,7 +112,10 @@ export default { 'common.chart.filter.holder': 'filter data items', 'common.chart.filter.tips': 'View more by filter', 'common.permission.401': 'Not logged in', - 'common.permission.403': 'Permission Denied', + 'common.permission.403': + 'Sorry, you do not have permission to access this page.', + 'common.permission.404': + 'Sorry, the page you are trying to access does not exist.', 'common.permission.action.post': 'Create', 'common.permission.action.get': 'Search', 'common.permission.action.delete': 'Delete', diff --git a/src/locales/en-US/models.ts b/src/locales/en-US/models.ts index 450c0f05..a82e528a 100644 --- a/src/locales/en-US/models.ts +++ b/src/locales/en-US/models.ts @@ -1,6 +1,7 @@ export default { 'models.button.deploy': 'Deploy Model', 'models.title': 'Models', + 'models.title.edit': 'Edit Model', 'models.table.models': 'models', 'models.table.name': 'Model Name', 'models.form.source': 'Source', diff --git a/src/locales/zh-CN/common.ts b/src/locales/zh-CN/common.ts index 71341771..bc65c069 100644 --- a/src/locales/zh-CN/common.ts +++ b/src/locales/zh-CN/common.ts @@ -107,7 +107,8 @@ export default { 'common.chart.filter.holder': '过滤数据项', 'common.chart.filter.tips': '过滤查看更多数据项', 'common.permission.401': '未登录', - 'common.permission.403': '权限不足', + 'common.permission.403': '抱歉,你无权访问该页面', + 'common.permission.404': '抱歉,你访问的页面不存在', 'common.permission.action.post': '新增', 'common.permission.action.get': '查询', 'common.permission.action.delete': '删除', diff --git a/src/locales/zh-CN/models.ts b/src/locales/zh-CN/models.ts index 26faf637..16d57832 100644 --- a/src/locales/zh-CN/models.ts +++ b/src/locales/zh-CN/models.ts @@ -1,6 +1,7 @@ export default { 'models.button.deploy': '部署模型', 'models.title': '模型', + 'models.title.edit': '编辑模型', 'models.table.models': '模型', 'models.table.name': '模型名称', 'models.form.source': '来源', diff --git a/src/pages/llmodels/components/add-modal.tsx b/src/pages/llmodels/components/add-modal.tsx index 0cd70011..75eefcfd 100644 --- a/src/pages/llmodels/components/add-modal.tsx +++ b/src/pages/llmodels/components/add-modal.tsx @@ -13,12 +13,13 @@ import { callHuggingfaceQuickSearch, queryHuggingfaceModelFiles } from '../apis'; -import { FormData } from '../config/types'; +import { FormData, ListItem } from '../config/types'; type AddModalProps = { title: string; action: PageActionType; open: boolean; + data?: ListItem; onOk: (values: FormData) => void; onCancel: () => void; }; @@ -48,6 +49,11 @@ const AddModal: React.FC = (props) => { replicas: 1 }); } + if (action === PageAction.EDIT && open) { + form.setFieldsValue({ + ...props.data + }); + } }; useEffect(() => { @@ -68,7 +74,7 @@ const AddModal: React.FC = (props) => { ); }; - const handleRepoSelect = async (repo: string) => { + const handleFetchModelFiles = async (repo: string) => { try { const res = await queryHuggingfaceModelFiles({ repo }); const list = _.filter(res, (file: any) => { @@ -88,7 +94,7 @@ const AddModal: React.FC = (props) => { const handleRepoOnBlur = (e: any) => { const repo = form.getFieldValue('huggingface_repo_id'); - handleRepoSelect(repo); + handleFetchModelFiles(repo); }; const handleOnSearchRepo = async (text: string) => { @@ -163,6 +169,7 @@ const AddModal: React.FC = (props) => { label={intl.formatMessage({ id: 'models.form.filename' })} required options={fileOptions} + onFocus={handleRepoOnBlur} > diff --git a/src/pages/llmodels/index.tsx b/src/pages/llmodels/index.tsx index 87097b0c..7c461681 100644 --- a/src/pages/llmodels/index.tsx +++ b/src/pages/llmodels/index.tsx @@ -14,6 +14,7 @@ import useUpdateChunkedList from '@/hooks/use-update-chunk-list'; import { handleBatchRequest } from '@/utils'; import { DeleteOutlined, + EditOutlined, FieldTimeOutlined, PlusOutlined, SyncOutlined, @@ -44,7 +45,8 @@ import { deleteModelInstance, queryModelInstanceLogs, queryModelInstancesList, - queryModelsList + queryModelsList, + updateModel } from './apis'; import AddModal from './components/add-modal'; import ViewLogsModal from './components/view-logs-modal'; @@ -70,6 +72,9 @@ const Models: React.FC = () => { const [action, setAction] = useState(PageAction.CREATE); const [title, setTitle] = useState(''); const [dataSource, setDataSource] = useState([]); + const [currentData, setCurrentData] = useState( + undefined + ); const timer = useRef(); let axiosToken = createAxiosToken(); const [queryParams, setQueryParams] = useState({ @@ -164,7 +169,6 @@ const Models: React.FC = () => { }; const handleSearch = (e: any) => { - console.log('request=========='); fetchData(); }; @@ -178,16 +182,20 @@ const Models: React.FC = () => { const handleAddModal = () => { setOpenAddModal(true); setAction(PageAction.CREATE); - }; - - const handleClickMenu = (e: any) => { - console.log('click', e); + setTitle(intl.formatMessage({ id: 'models.button.deploy' })); }; const handleModalOk = async (data: FormData) => { - await createModel({ data }); - setOpenAddModal(false); - message.success(intl.formatMessage({ id: 'common.message.success' })); + try { + if (action === PageAction.CREATE) { + await createModel({ data }); + } + if (action === PageAction.EDIT) { + await updateModel({ data, id: currentData?.id as number }); + } + setOpenAddModal(false); + message.success(intl.formatMessage({ id: 'common.message.success' })); + } catch (error) {} }; const handleModalCancel = () => { @@ -295,6 +303,13 @@ const Models: React.FC = () => { return data.items || []; }; + const handleEdit = (row: ListItem) => { + setCurrentData(row); + setOpenAddModal(true); + setAction(PageAction.EDIT); + setTitle(intl.formatMessage({ id: 'models.title.edit' })); + }; + useEffect(() => { fetchData(); }, [queryParams]); @@ -493,6 +508,18 @@ const Models: React.FC = () => { render={(text, record) => { return !record.transition ? ( + + + { diff --git a/src/pages/users/components/add-modal.tsx b/src/pages/users/components/add-modal.tsx index 3e31ef20..bc50df03 100644 --- a/src/pages/users/components/add-modal.tsx +++ b/src/pages/users/components/add-modal.tsx @@ -1,7 +1,7 @@ import ModalFooter from '@/components/modal-footer'; import SealInput from '@/components/seal-form/seal-input'; import SealSelect from '@/components/seal-form/seal-select'; -import { PageAction } from '@/config'; +import { PageAction, PasswordReg } from '@/config'; import { PageActionType } from '@/config/types'; import { SyncOutlined, @@ -122,12 +122,8 @@ const AddModal: React.FC = ({ rules={[ { required: true, - message: intl.formatMessage( - { id: 'common.form.rule.input' }, - { - name: intl.formatMessage({ id: 'common.form.password' }) - } - ) + pattern: PasswordReg, + message: intl.formatMessage({ id: 'users.form.rule.password' }) } ]} >