diff --git a/frontend/README.pro.md b/frontend/README.pro.md index 93bfd817..b95b1e79 100644 --- a/frontend/README.pro.md +++ b/frontend/README.pro.md @@ -2,7 +2,7 @@ ## 代码同步 packages目录下,部分子项目为企业版独有,不要同步到开源版: - packages/businessEntry, packages/dashboard, packages/openApi, packages/systemRunning, README.pro.md + packages/businessEntry, packages/openApi, packages/systemRunning, README.pro.md ## 安装依赖 建议使用pnpm diff --git a/frontend/package.json b/frontend/package.json index f16fd4b4..0818e906 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,7 +15,7 @@ "dev": "lerna run dev --scope=core --stream", "dev:pro": "lerna run dev --scope=business-entry --stream", "stop": "kill-port --port 5000", - "scan":"i18next-scanner --config i18next-scanner.config.js" + "scan": "i18next-scanner --config i18next-scanner.config.js" }, "keywords": [], "author": "", @@ -42,6 +42,7 @@ "react-ace": "^10.1.0", "react-dom": "^18.2.0", "react-i18next": "^15.0.1", + "react-joyride": "^2.8.2", "react-router-dom": "^6.20.0", "tailwindcss": "^3.3.5", "uuid": "^9.0.1", diff --git a/frontend/packages/businessEntry/src/components/aoplatform/RenderRoutes.tsx b/frontend/packages/businessEntry/src/components/aoplatform/RenderRoutes.tsx index 69f50f4d..da7bd552 100644 --- a/frontend/packages/businessEntry/src/components/aoplatform/RenderRoutes.tsx +++ b/frontend/packages/businessEntry/src/components/aoplatform/RenderRoutes.tsx @@ -11,7 +11,6 @@ import {FC,lazy} from 'react'; import { TeamProvider } from '@core/contexts/TeamContext.tsx'; import SystemOutlet from '@core/pages/system/SystemOutlet.tsx'; import { DashboardProvider } from '@core/contexts/DashboardContext.tsx'; -import { PartitionProvider } from '@core/contexts/PartitionContext.tsx'; import { TenantManagementProvider } from '@market/contexts/TenantManagementContext.tsx'; type RouteConfig = { @@ -182,6 +181,11 @@ const PUBLIC_ROUTES:RouteConfig[] = [ key: uuidv4(), lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@core/pages/system/publish/SystemInsidePublish.tsx')), children:[ + { + path:'', + key: uuidv4(), + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@core/pages/system/publish/SystemInsidePublishList.tsx')), + }, { path:'*', key: uuidv4(), @@ -202,6 +206,10 @@ const PUBLIC_ROUTES:RouteConfig[] = [ ] } ] + },{ + path:'dashboardsetting', + key: uuidv4(), + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@core/pages/partitions/PartitionInsideDashboardSetting.tsx')), }, { path:'cluster', @@ -338,16 +346,6 @@ const PUBLIC_ROUTES:RouteConfig[] = [ lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@openApi/pages/OpenApiList.tsx')), key:uuidv4(), }, - { - path:'logretrieval', - lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@core/pages/logRetrieval/LogRetrieval.tsx')), - key:uuidv4(), - }, - { - path:'auditlog', - lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@core/pages/auditLog/AuditLog.tsx')), - key:uuidv4(), - }, { path:'assets', component:

设计中

, @@ -394,7 +392,7 @@ const PUBLIC_ROUTES:RouteConfig[] = [ key: uuidv4(), children:[{ path:'template/:moduleId', - lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '../../../../common/src/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx')), + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@common/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx')), key:uuidv4() }] @@ -405,10 +403,20 @@ const PUBLIC_ROUTES:RouteConfig[] = [ key: uuidv4(), children:[{ path:'template/:moduleId', - lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '../../../../common/src/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx')), + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@common/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx')), + key:uuidv4() + }] + + }, + { + path:'userProfile/*', + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@core/pages/userProfile/UserProfile.tsx')), + key:uuidv4(), + children:[{ + path:'changepsw', + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@core/pages/userProfile/ChangePsw.tsx')), key:uuidv4() }] - } ] }, @@ -433,7 +441,7 @@ const generateRoutes = (routerConfig: RouteConfig[]) => { const LazyComponent = route.lazy as React.ExoticComponent; routeElement = ( - }> + }> {route.provider ? ( createElement(route.provider, {}, ) ) : ( diff --git a/frontend/packages/businessEntry/tsconfig.json b/frontend/packages/businessEntry/tsconfig.json index bfb0e8fa..92776632 100644 --- a/frontend/packages/businessEntry/tsconfig.json +++ b/frontend/packages/businessEntry/tsconfig.json @@ -28,6 +28,6 @@ "@businessEntry/*": ["./src/*"], }, }, - "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TransferTable.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/Navigation.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/GroupTree.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../common/src/components/aoplatform/ScrollableSection.tsx", "../common/src/utils/postcat.tsx", "../common/src/utils/curl.ts", "../common/src/components/aoplatform/ResetPsw.tsx", "../common/src/components/aoplatform/SubscribeApprovalModalContent.tsx", "src/components/aoplatform/RenderRoutes.tsx", "../common/src/components/aoplatform/PublishApprovalModalContent.tsx", "../common/src/components/aoplatform/InsidePage.tsx", "../common/src/const/type.ts", "../common/src/components/aoplatform/intelligent-plugin", "../common/src/const/domain"], + "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/Navigation.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../common/src/components/aoplatform/ScrollableSection.tsx", "../common/src/utils/postcat.tsx", "../common/src/utils/curl.ts", "../common/src/components/aoplatform/ResetPsw.tsx", "../common/src/components/aoplatform/SubscribeApprovalModalContent.tsx", "src/components/aoplatform/RenderRoutes.tsx", "../common/src/components/aoplatform/PublishApprovalModalContent.tsx", "../common/src/components/aoplatform/InsidePage.tsx", "../common/src/const/type.ts", "../common/src/components/aoplatform/intelligent-plugin", "../common/src/const/domain"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/frontend/packages/common/src/components/aoplatform/BasicLayout.tsx b/frontend/packages/common/src/components/aoplatform/BasicLayout.tsx index 0d20a951..3866f308 100644 --- a/frontend/packages/common/src/components/aoplatform/BasicLayout.tsx +++ b/frontend/packages/common/src/components/aoplatform/BasicLayout.tsx @@ -55,10 +55,10 @@ const themeToken = { getNavItem({$t('API 市场')}, 'serviceHub','/serviceHub',,undefined,undefined,'system.workspace.api_market.view'), ]), - APP_MODE === 'pro' ? getNavItem($t('仪表盘'), 'mainPage', '/dashboard',,[ - getNavItem({$t('运行视图')}, 'dashboard','/dashboard',,undefined,undefined,''), - getNavItem({$t('系统拓扑图')}, 'systemrunning','/systemrunning',,undefined,undefined,''), - ]):null, + getNavItem($t('仪表盘'), 'mainPage', APP_MODE === 'pro' ? '/dashboard' : '/dashboard/total',,[ + getNavItem({$t('运行视图')}, 'dashboard',APP_MODE === 'pro' ? '/dashboard' : '/dashboard/total' ,,undefined,undefined,'system.dashboard.dashboard.view'), + APP_MODE === 'pro' ? getNavItem({$t('系统拓扑图')}, 'systemrunning','/systemrunning',,undefined,undefined,'system.dashboard.systemrunning.view') : null, + ]), getNavItem($t('系统设置'), 'operationCenter','/member',, [ getNavItem($t('组织'), 'organization','/member',null,[ @@ -70,6 +70,7 @@ const themeToken = { ],undefined,'system.api_market.service_classification.view'), getNavItem($t('运维与集成'), 'maintenanceCenter','/cluster', null, [ + getNavItem({$t('监控报表')}, 'dashboardsetting','/dashboardsetting',,undefined,undefined,'system.devops.dashboardsetting.view'), getNavItem({$t('集群')}, 'cluster','/cluster',,undefined,undefined,'system.devops.cluster.view'), getNavItem({$t('证书')}, 'cert','/cert',,undefined,undefined,'system.devops.ssl_certificate.view'), getNavItem({$t('日志')}, 'logsettings','/logsettings',,undefined,undefined,'system.devops.log_configuration.view'), @@ -79,7 +80,6 @@ const themeToken = { ]), ],[state.language]) - useEffect(()=>{console.log(state.language, $t('工作空间'))},[state.language]) useEffect(() => { if(currentUrl === '/'){ @@ -119,6 +119,7 @@ const themeToken = { // 初始过滤操作 const res = [...TOTAL_MENU_ITEMS]!.filter(x => x).map((x: any) => (x.routes ? { ...x, routes: filterMenu(x.routes) } : x)); + console.log(res) // 返回处理后的数据 return { path: '/', routes: res.map(x=> ({...x, routes: x.routes?.filter(x=> (x.access || x.routes?.length > 0))})).filter(x=> (x.access || x.routes?.length > 0)) }; }, [accessData, state.language]); @@ -196,6 +197,7 @@ const themeToken = { return document.getElementById('test-pro-layout') || document.body; }} > + extends ProTableProps, RefAttributes>(props: React.PropsWithChildren>,ref: React.Ref) => { - const {id,columns,request,dropMenu,searchPlaceholder,showPagination=true,primaryKey='id',addNewBtnTitle,addNewBtnAccess,tableClickAccess,tableClass,onAddNewBtnClick,beforeSearchNode,onSearchWordChange,manualReloadTable,afterNewBtn,dragSortKey,onDragSortEnd,tableTitle,rowSelection,onChange,dataSource,onRowClick,showColSetting=false,minVirtualHeight,noTop,addNewBtnWrapperClass,tableTitleClass,delayLoading = true,besidesTableHeight, noScroll} = props + const {id,columns,request,dropMenu,searchPlaceholder,showPagination=true,primaryKey='id',addNewBtnTitle,addNewBtnAccess,tableClickAccess,tableClass,onAddNewBtnClick,beforeSearchNode,onSearchWordChange,manualReloadTable,afterNewBtn,dragSortKey,onDragSortEnd,tableTitle,rowSelection,onChange,dataSource,onRowClick,showColSetting=false,minVirtualHeight,noTop,addNewBtnWrapperClass = '',tableTitleClass,delayLoading = true,besidesTableHeight, noScroll} = props const parentRef = useRef(null); const [tableHeight, setTableHeight] = useState(minVirtualHeight || window.innerHeight); const [tableWidth, setTableWidth] = useState(undefined); diff --git a/frontend/packages/common/src/components/aoplatform/Tour.tsx b/frontend/packages/common/src/components/aoplatform/Tour.tsx new file mode 100644 index 00000000..fc6cb3f3 --- /dev/null +++ b/frontend/packages/common/src/components/aoplatform/Tour.tsx @@ -0,0 +1,18 @@ +import JoyRide, { Props } from 'react-joyride' + +const Tour = (props: Partial) => { + return ( + <> + + + ) +} + +export default Tour diff --git a/frontend/packages/common/src/const/const.tsx b/frontend/packages/common/src/const/const.tsx index 8bec4469..9afb8ab3 100644 --- a/frontend/packages/common/src/const/const.tsx +++ b/frontend/packages/common/src/const/const.tsx @@ -27,7 +27,7 @@ export const routerKeyMap = new Map([ ['operationCenter',['member','user','role','servicecategories']], ['organization',['member','user','role']], ['serviceHubSetting',['servicecategories']], - ['maintenanceCenter',['partition','logsettings','resourcesettings','openapi'] + ['maintenanceCenter',['dashboardsetting','cluster','cert','logsettings','resourcesettings','openapi'] ]]) diff --git a/frontend/packages/common/src/const/permissions.ts b/frontend/packages/common/src/const/permissions.ts index f20b78c7..520dd31a 100644 --- a/frontend/packages/common/src/const/permissions.ts +++ b/frontend/packages/common/src/const/permissions.ts @@ -139,6 +139,11 @@ export const PERMISSION_DEFINITION = [ "anyOf": [{ "backend": ["system.api_market.service_classification.manager"] }] } }, + "system.devops.dashboardsetting.view":{ + "grented":{ + "anyOf":[{"backend":[]}] + } + }, "system.devops.cluster.view": { "granted": { "anyOf": [{ "backend": ["system.devops.cluster.view"] }] @@ -224,6 +229,16 @@ export const PERMISSION_DEFINITION = [ "anyOf": [{ "backend": ["system.workspace.api_market.view"] }] } }, + "system.dashboard.dashboard.view": { + "granted": { + "anyOf": [{ "backend": [] }] + } + }, + "system.dashboard.systemrunning.view": { + "granted": { + "anyOf": [{ "backend": [] }] + } + }, "team.service.api.view": { "granted": { "anyOf": [{ "backend": ["team.service.api.view"] }] diff --git a/frontend/packages/common/src/utils/permission.ts b/frontend/packages/common/src/utils/permission.ts index 8c6bc5fe..5f5dbb05 100644 --- a/frontend/packages/common/src/utils/permission.ts +++ b/frontend/packages/common/src/utils/permission.ts @@ -17,6 +17,8 @@ export const checkAccess:(access:AccessDataType, accessData:Map } const hasIntersection = (arr1:string[], arr2:string[])=> { + // 当没有对应后端权限字段时,默认有权限 + if(arr1.length === 0) return true const set = new Set(arr1.length > arr2.length ? arr2:arr1) const arr = arr1.length > arr2.length ? arr1:arr2 for (const item of arr) { diff --git a/frontend/packages/common/tailwind.config.js b/frontend/packages/common/tailwind.config.js index 33c2e2c7..b621c7be 100644 --- a/frontend/packages/common/tailwind.config.js +++ b/frontend/packages/common/tailwind.config.js @@ -91,6 +91,9 @@ module.exports = { '.h-calc-100vh-minus-navbar': { height: 'calc(100vh - var(--layout-header-height))', }, + '.w-calc-100vw-minus-padding-r': { + width: 'calc(100% - 40px)', + }, }, ['responsive', 'hover']); } ], diff --git a/frontend/packages/core/src/App.tsx b/frontend/packages/core/src/App.tsx index 72c38005..5d6a3d4c 100644 --- a/frontend/packages/core/src/App.tsx +++ b/frontend/packages/core/src/App.tsx @@ -12,6 +12,7 @@ import 'dayjs/locale/zh-cn'; import dayjs from 'dayjs'; import { useTranslation } from "react-i18next"; import { useGlobalContext } from '@common/contexts/GlobalStateContext'; +import Joyride from 'react-joyride'; type Locale = ConfigProviderProps['locale']; @@ -139,6 +140,7 @@ const antdComponentThemeToken = { } } + function App() { const [locale, setLocal] = useState(enUS); useInitializeMonaco() diff --git a/frontend/packages/core/src/components/aoplatform/RenderRoutes.tsx b/frontend/packages/core/src/components/aoplatform/RenderRoutes.tsx index ed6360f0..08b57842 100644 --- a/frontend/packages/core/src/components/aoplatform/RenderRoutes.tsx +++ b/frontend/packages/core/src/components/aoplatform/RenderRoutes.tsx @@ -11,8 +11,6 @@ import {useGlobalContext} from "@common/contexts/GlobalStateContext.tsx"; import {FC,lazy} from 'react'; import { TeamProvider } from '@core/contexts/TeamContext.tsx'; import SystemOutlet from '@core/pages/system/SystemOutlet.tsx'; -import { DashboardProvider } from '@core/contexts/DashboardContext.tsx'; -import { PartitionProvider } from '@core/contexts/PartitionContext.tsx'; import { TenantManagementProvider } from '@market/contexts/TenantManagementContext.tsx'; type RouteConfig = { @@ -210,6 +208,11 @@ const PUBLIC_ROUTES:RouteConfig[] = [ } ] }, + { + path:'dashboardsetting', + key: uuidv4(), + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@core/pages/partitions/PartitionInsideDashboardSetting.tsx')), + }, { path:'cluster', key: uuidv4(), @@ -343,6 +346,18 @@ const PUBLIC_ROUTES:RouteConfig[] = [ component:

设计中

, key:uuidv4() }, + { + path:'dashboard', + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@dashboard/pages/Dashboard.tsx')), + key:uuidv4(), + children:[ + { + path:'total', + key:uuidv4(), + lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@dashboard/pages/DashboardTotal.tsx')), + }, + ] + }, { path:'template/:moduleId', lazy:lazy(() => import(/* webpackChunkName: "[request]" */ '@common/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx')), @@ -403,7 +418,7 @@ const generateRoutes = (routerConfig: RouteConfig[]) => { const LazyComponent = route.lazy as React.ExoticComponent; routeElement = ( - }> + }> {route.provider ? ( createElement(route.provider, {}, ) ) : ( diff --git a/frontend/packages/core/src/index.css b/frontend/packages/core/src/index.css index 34a334d0..2b601c3d 100644 --- a/frontend/packages/core/src/index.css +++ b/frontend/packages/core/src/index.css @@ -662,7 +662,7 @@ p{ .ant-pro-table-list-toolbar-setting-items{ position:absolute; - top:13px; + top:14px; right:16px; z-index:9; .ant-pro-table-list-toolbar-setting-item{ diff --git a/frontend/packages/core/src/pages/Login.tsx b/frontend/packages/core/src/pages/Login.tsx index e37b3c8c..222195d3 100644 --- a/frontend/packages/core/src/pages/Login.tsx +++ b/frontend/packages/core/src/pages/Login.tsx @@ -1,5 +1,5 @@ import {FC, useCallback, useEffect, useRef, useState} from "react"; -import {App, Button, Form, FormInstance, Input} from "antd"; +import {App, Button, Divider, Form, FormInstance, Input, Tooltip} from "antd"; import {useGlobalContext} from "@common/contexts/GlobalStateContext.tsx"; import {useFetch} from "@common/hooks/http.ts"; import {BasicResponse, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx"; @@ -7,6 +7,7 @@ import {useNavigate} from "react-router-dom"; // import {useCrypto} from "../hooks/crypto.ts"; import Logo from '@common/assets/logo.png' import { $t } from "@common/locales"; +import { Icon } from "@iconify/react/dist/iconify.js"; const Login:FC = ()=> { const {state, dispatch} = useGlobalContext() @@ -16,16 +17,19 @@ const Login:FC = ()=> { const formRef = useRef(null); const [loading,setLoading] = useState() // const { encryptByEnAES } = useCrypto(); + const [allowGuest, setAllowGuest] = useState(false) const check = useCallback(()=>{ fetchData, status:string}>>('account/login',{method:'GET'}).then(response=>{ const {code,data} = response + if(code === STATUS_CODE.SUCCESS && data.status !== 'anonymous'){ dispatch({type:'LOGIN'}) navigate(state.mainPage) }else{ dispatch({type:'LOGOUT'}) + setAllowGuest(data.channel.filter(x=>x.name === 'guest_access').length > 0) } }) },[]) @@ -41,47 +45,54 @@ const Login:FC = ()=> { }) },[]) + + const fetchLogin = async (values:any)=>{ + try { + setLoading(true); + const { username, password } = values; + // const encryptedPassword = encryptByEnAES(username, password); + + const body = { + name:username, + password: password + // client: 1, + // type: 1, + // app_type: 4, + }; + + const {code,msg } = await fetchData>('account/login/username',{method:'POST',eoBody:(body)}) + + if (code === STATUS_CODE.SUCCESS) { + dispatch({type:'LOGIN'}) + message.success(RESPONSE_TIPS.loginSuccess); + const callbackUrl = new URLSearchParams(window.location.search).get('callbackUrl'); + if (callbackUrl && callbackUrl !== 'null') { + navigate(callbackUrl); + } else { + navigate(state.mainPage); + } + }else{ + dispatch({type:'LOGOUT'}) + message.error(msg) + } + + } catch (err) { + console.warn(err); + } finally { + setLoading(false) + } + } const login = async () => { if (formRef.current) { - try { - const values = await formRef.current.validateFields(); - setLoading(true); - - const { username, password } = values; - // const encryptedPassword = encryptByEnAES(username, password); - - const body = { - name:username, - password: password - // client: 1, - // type: 1, - // app_type: 4, - }; - - const {code,msg } = await fetchData>('account/login/username',{method:'POST',eoBody:(body)}) - - if (code === STATUS_CODE.SUCCESS) { - dispatch({type:'LOGIN'}) - message.success(RESPONSE_TIPS.loginSuccess); - const callbackUrl = new URLSearchParams(window.location.search).get('callbackUrl'); - if (callbackUrl && callbackUrl !== 'null') { - navigate(callbackUrl); - } else { - navigate(state.mainPage); - } - }else{ - dispatch({type:'LOGOUT'}) - message.error(msg) - } - - } catch (err) { - console.warn(err); - } finally { - setLoading(false) - } + const values = await formRef.current.validateFields(); + fetchLogin(values); } }; + const loginAsGuest = ()=>{ + fetchLogin({username:'guest',password:'12345678'}) + } + useEffect(() => { check() getSystemInfo() @@ -133,15 +144,26 @@ const Login:FC = ()=> { /> -
- - - -
+ + + + { + allowGuest && <> + + + + + + + } diff --git a/frontend/packages/core/src/pages/logsettings/LogSettings.tsx b/frontend/packages/core/src/pages/logsettings/LogSettings.tsx index 1f5acc31..c84616b6 100644 --- a/frontend/packages/core/src/pages/logsettings/LogSettings.tsx +++ b/frontend/packages/core/src/pages/logsettings/LogSettings.tsx @@ -59,7 +59,7 @@ const LogSettings = ()=>{ return ( <> - + void +} +export type DashboardSettingEditProps = { + changeStatus:(status:DashboardPageShowStatus)=>void + refreshData:()=>void + data?:PartitionDashboardConfigFieldType +} + + const DashboardSettingEdit = (props:DashboardSettingEditProps)=>{ + + const {changeStatus,refreshData,data} = props + const { message } = App.useApp() + const [ form ] = Form.useForm(); + const { fetchData} = useFetch() + const onFinish = () => { + form.validateFields().then((value)=>{ + fetchData>('monitor/config',{method: 'POST',body:JSON.stringify(value),eoParams:{}}).then(response=>{ + const {code,msg} = response + if(code === STATUS_CODE.SUCCESS){ + message.success(msg || '操作成功,即将刷新页面') + refreshData?.() + }else{ + message.error(msg || '操作失败') + } + }) + }) + } + + useEffect(()=>{form.setFieldsValue(data)},[data]) + + useEffect(() => { + return (form.setFieldsValue({})) + }, []); + + return ( + <> +
+ +
+ + label="数据源类型" + name="driver" + rules={[{ required: true, message: VALIDATE_MESSAGE.required }]} + > + + + + + label="Organization" + name={['config','org']} + rules={[{ required: true, message: VALIDATE_MESSAGE.required }]} + > + + + + + label="鉴权 Token" + name={['config','token']} + > + + + +
+ + + + +
+ +
+
+ + ) +} + +export default DashboardSettingEdit \ No newline at end of file diff --git a/frontend/packages/core/src/pages/partitions/PartitionInsideCluster.tsx b/frontend/packages/core/src/pages/partitions/PartitionInsideCluster.tsx index e03f276f..1c9230f6 100644 --- a/frontend/packages/core/src/pages/partitions/PartitionInsideCluster.tsx +++ b/frontend/packages/core/src/pages/partitions/PartitionInsideCluster.tsx @@ -1,7 +1,7 @@ import { FC, useEffect, useRef, useState} from "react"; import {useBreadcrumb} from "@common/contexts/BreadcrumbContext.tsx"; import {App, Button, Card, Col, Row, Spin, Tag} from "antd"; -import {BasicResponse, STATUS_CODE} from "@common/const/const.tsx"; +import {BasicResponse, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx"; import {useFetch} from "@common/hooks/http.ts"; import { ClusterPageShowStatus, NodeModalHandle, PartitionClusterNodeTableListItem } from "../../const/partitions/types.ts"; import WithPermission from "@common/components/aoplatform/WithPermission.tsx"; @@ -12,7 +12,7 @@ import { $t } from "@common/locales/index.ts"; const PartitionInsideCluster:FC = ()=> { const {setBreadcrumb} = useBreadcrumb() - const {modal, message} = App.useApp() + const { message} = App.useApp() const {fetchData} = useFetch() const [nodeData, setNodeData] = useState() const [loading, setLoading] = useState(false) @@ -65,7 +65,7 @@ const PartitionInsideCluster:FC = ()=> {
APIPark Node diff --git a/frontend/packages/core/src/pages/partitions/PartitionInsideDashboardSetting.tsx b/frontend/packages/core/src/pages/partitions/PartitionInsideDashboardSetting.tsx new file mode 100644 index 00000000..5a1da9ad --- /dev/null +++ b/frontend/packages/core/src/pages/partitions/PartitionInsideDashboardSetting.tsx @@ -0,0 +1,93 @@ +import { FC, useEffect, useState} from "react"; +import {useBreadcrumb} from "@common/contexts/BreadcrumbContext.tsx"; +import {App, Button, Card, Col, Row, Spin, Tag} from "antd"; +import {BasicResponse, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx"; +import {useFetch} from "@common/hooks/http.ts"; +import WithPermission from "@common/components/aoplatform/WithPermission.tsx"; +import { LoadingOutlined } from "@ant-design/icons"; +import InsidePage from "@common/components/aoplatform/InsidePage.tsx"; +import { $t } from "@common/locales/index.ts"; +import DashboardSettingEdit, { DashboardPageShowStatus } from "./DashboardSettingEdit.tsx"; +import { PartitionDashboardConfigFieldType } from "@core/const/partitions/types.ts"; + +const PartitionInsideDashboardSetting:FC = ()=> { + const {setBreadcrumb} = useBreadcrumb() + const {message} = App.useApp() + const {fetchData} = useFetch() + const [data, setData] = useState() + const [loading, setLoading] = useState(false) + const [showStatus, setShowStatus] = useState('view') + + const getDashboardSettingInfo = () => { + setLoading(true) + return fetchData>('monitor/config', {method: 'GET',eoTransformKeys:[]}).then(response => { + const {code, data, msg} = response + if (code === STATUS_CODE.SUCCESS) { + data?.info?.driver && setData(data.info) + setShowStatus('view') + } else { + message.error(msg || RESPONSE_TIPS.error) + } + }).catch(() => { + return {data: [], success: false} + }).finally(()=>{ + setLoading(false) + }) + } + + + useEffect(() => { + setBreadcrumb([ + {title: $t('监控报表')} + ]) + getDashboardSettingInfo() + }, []); + + const setDashboardSettingBtn = ()=>{ + return (<> + {showStatus === 'view' && + + } + ) + } + + return ( + <> + +
+ } spinning={loading}> +
+ {$t('统计图表')} + {!loading && !data?.driver && { $t('未配置')} + }
} + + extra={setDashboardSettingBtn()}> + {showStatus === 'view'&& data && data.driver && DashboardConfigPreview(data) } + {showStatus !== 'view' && } + +
+ +
+
+ + ) +} + +export function DashboardConfigPreview (x:PartitionDashboardConfigFieldType){ + return
+ {$t('数据源')}:{x?.driver} + {$t('地址(IP:端口)')}:{x?.config?.addr} + {$t('组织(Organization)')}:{x?.config?.org} +
} + +export default PartitionInsideDashboardSetting \ No newline at end of file diff --git a/frontend/packages/core/src/pages/resourcesettings/ResourceSettings.tsx b/frontend/packages/core/src/pages/resourcesettings/ResourceSettings.tsx index e9abf44d..73603f52 100644 --- a/frontend/packages/core/src/pages/resourcesettings/ResourceSettings.tsx +++ b/frontend/packages/core/src/pages/resourcesettings/ResourceSettings.tsx @@ -58,7 +58,7 @@ const LogSettings = ()=>{ return ( <> - + diff --git a/frontend/packages/core/src/pages/system/SystemList.tsx b/frontend/packages/core/src/pages/system/SystemList.tsx index f1fbe627..06ba92a0 100644 --- a/frontend/packages/core/src/pages/system/SystemList.tsx +++ b/frontend/packages/core/src/pages/system/SystemList.tsx @@ -1,4 +1,5 @@ import PageList from "@common/components/aoplatform/PageList.tsx" +import Tour from "@common/components/aoplatform/Tour.tsx" import {ActionType} from "@ant-design/pro-components"; import {FC, useEffect, useMemo, useRef, useState} from "react"; import {useNavigate} from "react-router-dom"; @@ -13,6 +14,7 @@ import { DrawerWithFooter } from "@common/components/aoplatform/DrawerWithFooter import SystemConfig from "./SystemConfig.tsx"; import { useGlobalContext } from "@common/contexts/GlobalStateContext.tsx"; import { $t } from "@common/locales/index.ts"; +import Joyride from "react-joyride"; const SystemList:FC = ()=>{ const navigate = useNavigate(); @@ -114,15 +116,28 @@ const SystemList:FC = ()=>{ return res },[memberValueEnum,teamList]) + const steps = [ + { + target: '.my-first-step', + content: '点击按钮新建服务', + }, + { + target: '.ant-table-tbody', + content: '点击表格查看详情', + placement: 'top' + }, + ]; + return (
- + getSystemList()} addNewBtnTitle={$t("添加服务")} + addNewBtnWrapperClass={'my-first-step'} searchPlaceholder={$t("输入名称、ID、所属团队、负责人查找服务")} onAddNewBtnClick={() => { setOpen(true) @@ -140,7 +155,6 @@ const SystemList:FC = ()=>{
- //
) } diff --git a/frontend/packages/core/tsconfig.json b/frontend/packages/core/tsconfig.json index 32fcee3b..b2dc4117 100644 --- a/frontend/packages/core/tsconfig.json +++ b/frontend/packages/core/tsconfig.json @@ -23,6 +23,7 @@ "@core/*": ["./src/*"], "@common/*": ["../common/src/*"], "@market/*": ["../market/src/*"], + "@dashboard/*": ["../dashboard/src/*"], }, }, "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../common/src/components/aoplatform/ScrollableSection.tsx", "../common/src/utils/postcat.tsx", "../common/src/utils/curl.ts", "../common/src/components/aoplatform/ResetPsw.tsx", "../common/src/components/aoplatform/SubscribeApprovalModalContent.tsx", "../common/src/components/aoplatform/InsidePageForHub.tsx", "src/components/aoplatform/RenderRoutes.tsx", "../common/src/components/aoplatform/PublishApprovalModalContent.tsx", "../common/src/components/aoplatform/InsidePage.tsx", "../common/src/const/type.ts", "../common/src/components/aoplatform/intelligent-plugin", "../common/src/const/domain"], diff --git a/frontend/packages/core/vite.config.ts b/frontend/packages/core/vite.config.ts index 10964f3f..05a1727e 100644 --- a/frontend/packages/core/vite.config.ts +++ b/frontend/packages/core/vite.config.ts @@ -57,6 +57,7 @@ export default defineConfig({ { find: '@common', replacement: path.resolve(__dirname, '../common/src') }, { find: '@market', replacement: path.resolve(__dirname, '../market/src') }, { find: '@core', replacement: path.resolve(__dirname, './src') }, + { find: '@dashboard', replacement: path.resolve(__dirname, '../dashboard/src') }, ] }, server: { diff --git a/frontend/packages/dashboard/src/component/MonitorApiPage.tsx b/frontend/packages/dashboard/src/component/MonitorApiPage.tsx index e9115635..117a4b7f 100644 --- a/frontend/packages/dashboard/src/component/MonitorApiPage.tsx +++ b/frontend/packages/dashboard/src/component/MonitorApiPage.tsx @@ -7,7 +7,7 @@ import { getTime } from "../utils/dashboard"; import ScrollableSection from "@common/components/aoplatform/ScrollableSection"; import TimeRangeSelector, { RangeValue, TimeRange, TimeRangeButton } from "@common/components/aoplatform/TimeRangeSelector"; import MonitorTable, { MonitorTableHandler } from "./MonitorTable"; -import { BasicResponse, STATUS_CODE } from "@common/const/const"; +import { BasicResponse, RESPONSE_TIPS, STATUS_CODE } from "@common/const/const"; import { DefaultOptionType } from "antd/es/select"; import { useParams } from "react-router-dom"; import { RouterParams } from "@core/components/aoplatform/RenderRoutes"; @@ -15,6 +15,7 @@ import { useExcelExport } from "@common/hooks/excel"; import { API_TABLE_GLOBAL_COLUMNS_CONFIG } from "@dashboard/const/const"; import { useFetch } from "@common/hooks/http"; import { EntityItem } from "@common/const/type"; +import { $t } from "@common/locales"; export type MonitorApiPageProps = { fetchTableData:(body:SearchBody)=>Promise> detailDrawerContent:React.ReactNode @@ -55,7 +56,7 @@ export default function MonitorApiPage(props:MonitorApiPageProps){ if(code === STATUS_CODE.SUCCESS){ setApiOptionList(data.apis?.map((x:EntityItem)=>({label:x.name, value:x.id}))) }else{ - message.error(msg || '获取数据失败,请重试') + message.error(msg || RESPONSE_TIPS.dataError) return setApiOptionList([]) } }).catch(() => { @@ -69,7 +70,7 @@ export default function MonitorApiPage(props:MonitorApiPageProps){ if(code === STATUS_CODE.SUCCESS){ setProjectOptionList(data.projects?.map((x:EntityItem)=>({label:x.name, value:x.id}))) }else{ - message.error(msg || '获取数据失败,请重试') + message.error(msg || RESPONSE_TIPS.dataError) return setProjectOptionList([]) } }).catch(() => { @@ -110,9 +111,9 @@ export default function MonitorApiPage(props:MonitorApiPageProps){ fetchTableData(data).then((resp) => { const {code,data,msg} = resp if(code === STATUS_CODE.SUCCESS){ - exportExcel('API调用统计', [query!.start!, query!.end!], 'API调用统计', 'dashboard_api', API_TABLE_GLOBAL_COLUMNS_CONFIG, data.statistics) + exportExcel($t('API调用统计'), [query!.start!, query!.end!], $t('API调用统计'), 'dashboard_api', API_TABLE_GLOBAL_COLUMNS_CONFIG, data.statistics) }else{ - message.error(msg || '获取数据失败,请重试') + message.error(msg || RESPONSE_TIPS.dataError) } }) }; @@ -134,7 +135,7 @@ export default function MonitorApiPage(props:MonitorApiPageProps){ if(code === STATUS_CODE.SUCCESS){ return {data:data.statistics?.map((x:MonitorApiData)=>{x.proxyRate = Number((x.proxyRate*100).toFixed(2));x.requestRate = Number((x.requestRate*100).toFixed(2));return x}), success: true} }else{ - message.error(msg || '获取数据失败,请重试') + message.error(msg || RESPONSE_TIPS.dataError) return {data:[], success:false} } }).catch(() => { @@ -160,7 +161,7 @@ export default function MonitorApiPage(props:MonitorApiPageProps){ initialDatePickerValue={datePickerValue} onTimeRangeChange={handleTimeRangeChange}/>
- + debounce((e)=>{setQueryData(prevData=>({...prevData || {}, path:e.target.value}))}, 100)(e)} allowClear placeholder='请输入请求路径进行搜索' prefix={}/> + debounce((e)=>{setQueryData(prevData=>({...prevData || {}, path:e.target.value}))}, 100)(e)} allowClear placeholder={$t('请输入请求路径进行搜索')} prefix={}/>
@@ -212,9 +213,9 @@ export default function MonitorApiPage(props:MonitorApiPageProps){ mask={!fullScreen} title={<> {fullScreen && {setFullScreen?.(false)}}> - 退出全屏 + {$t('退出全屏')} } - {detailEntityName}调用详情 + {$t('(0)调用详情',[detailEntityName])} {!fullScreen && {setFullScreen?.(true)}}/>} } width={fullScreen ? '100%' : '60%'} diff --git a/frontend/packages/dashboard/src/component/MonitorAppPage.tsx b/frontend/packages/dashboard/src/component/MonitorAppPage.tsx index b804e7c9..eeba460f 100644 --- a/frontend/packages/dashboard/src/component/MonitorAppPage.tsx +++ b/frontend/packages/dashboard/src/component/MonitorAppPage.tsx @@ -5,13 +5,14 @@ import { EntityItem } from "@common/const/type"; import TimeRangeSelector, { RangeValue, TimeRange, TimeRangeButton } from "@common/components/aoplatform/TimeRangeSelector"; import MonitorTable, { MonitorTableHandler } from "./MonitorTable"; import { DefaultOptionType } from "antd/es/select"; -import { BasicResponse, STATUS_CODE } from "@common/const/const"; +import { BasicResponse, RESPONSE_TIPS, STATUS_CODE } from "@common/const/const"; import { getTime } from "../utils/dashboard"; import { useExcelExport } from "@common/hooks/excel"; import { APPLICATION_TABLE_GLOBAL_COLUMNS_CONFIG } from "@dashboard/const/const"; import { CloseOutlined, ExpandOutlined } from "@ant-design/icons"; import { useFetch } from "@common/hooks/http"; import { MonitorSubQueryData } from "./MonitorSubPage"; +import { $t } from "@common/locales"; export type MonitorAppPageProps = { fetchTableData:(body:SearchBody)=>Promise> @@ -60,7 +61,7 @@ export default function MonitorAppPage(props:MonitorAppPageProps){ if(code === STATUS_CODE.SUCCESS){ setListOfApps(data.projects?.map((x:EntityItem)=>({label:x.name, value:x.id}))) }else{ - message.error(msg || '获取数据失败,请重试') + message.error(msg || RESPONSE_TIPS.dataError) return setListOfApps([]) } }).catch(() => { @@ -98,9 +99,9 @@ export default function MonitorAppPage(props:MonitorAppPageProps){ fetchTableData(data).then((resp) => { const {code,data,msg} = resp if(code === STATUS_CODE.SUCCESS){ - exportExcel('应用调用统计', [query!.start!, query!.end!], '应用调用统计', 'dashboard_application', APPLICATION_TABLE_GLOBAL_COLUMNS_CONFIG, data.statistics) + exportExcel($t('应用调用统计'), [query!.start!, query!.end!], $t('应用调用统计'), 'dashboard_application', APPLICATION_TABLE_GLOBAL_COLUMNS_CONFIG, data.statistics) }else{ - message.error(msg || '获取数据失败,请重试') + message.error(msg || RESPONSE_TIPS.dataError) } }) }; @@ -117,7 +118,7 @@ export default function MonitorAppPage(props:MonitorAppPageProps){ if(code === STATUS_CODE.SUCCESS){ return {data:data.statistics?.map((x:MonitorSubscriberData)=>{x.proxyRate = Number((x.proxyRate*100).toFixed(2));x.requestRate = Number((x.requestRate*100).toFixed(2));return x}), success: true} }else{ - message.error(msg || '获取数据失败,请重试') + message.error(msg || RESPONSE_TIPS.dataError) return {data:[], success:false} } }).catch(() => { @@ -143,13 +144,13 @@ export default function MonitorAppPage(props:MonitorAppPageProps){ onTimeRangeChange={handleTimeRangeChange}/>
- + {setQueryData(prevData=>({...prevData || {}, clusters:value}))}} - /> -
*/} - {/* 重置和查询按钮 */}
- - + +
} spinning={queryBtnLoading}> @@ -263,25 +251,25 @@ const MonitorTotalPage = (props:MonitorTotalPageProps) => { {/* 图表区域 */}
{/* 请求统计饼图 */} - {pieError ? : : } {/* 转发统计饼图 */} - {pieError ? : : {
{/* 折线图区域 */} {/* 调用量统计折线图 */} - {invokeStaticError ? : : } {/* 报文量统计折线图 */} - {trafficStaticError ? ::} @@ -314,9 +302,9 @@ const MonitorTotalPage = (props:MonitorTotalPageProps) => { mask={!fullScreen} title={<> {fullScreen && {setFullScreen(false)}}> - 退出全屏 + {$t('退出全屏')} } - {detailEntityName}调用详情 + {detailEntityName}{$t('调用详情')} {!fullScreen && {setFullScreen(true)}}/>} } width={fullScreen ? '100%' : '60%'} diff --git a/frontend/packages/dashboard/src/const/const.tsx b/frontend/packages/dashboard/src/const/const.tsx index 21ab14b5..97601bae 100644 --- a/frontend/packages/dashboard/src/const/const.tsx +++ b/frontend/packages/dashboard/src/const/const.tsx @@ -1,13 +1,14 @@ -import { ProColumns } from "@ant-design/pro-components" import { MonitorApiData, MonitorData } from "./type" import { EChartsOption } from "echarts-for-react" import { Tooltip } from "antd" +import { $t } from "@common/locales" +import { PageProColumns } from "@common/components/aoplatform/PageList" // 监控表格参数 -export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:string})[] = [ +export const DASHBOARD_BASE_COLUMNS_CONFIG:(PageProColumns&{eoTitle:string})[] = [ { - title: '请求总数', - eoTitle:'请求总数', + title:$t('请求总数'), + eoTitle:$t('请求总数'), dataIndex: 'requestTotal', sorter: (a,b)=> { return a.requestTotal - b.requestTotal @@ -16,9 +17,8 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str width: 96 }, { - // title: '请求成功数', - title: 请求成功数, - eoTitle:'请求成功数', + title: {$t('请求成功数')}, + eoTitle:$t('请求成功数'), dataIndex: 'requestSuccess', width: 106, ellipsis:true, @@ -27,9 +27,9 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '请求成功率', - title: 请求成功率, - eoTitle:'请求成功率', + // title:$t('请求成功率', + title: {$t('请求成功率')}, + eoTitle:$t('请求成功率'), dataIndex: 'requestRate', valueType:'percent', ellipsis:true, @@ -39,9 +39,9 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str width: 106 }, { - title: '转发总数', - eoTitle:'转发总数', - width: 96, + title:$t('转发总数'), + eoTitle:$t('转发总数'), + width: 96, dataIndex: 'proxyTotal', ellipsis:true, sorter: (a,b)=> { @@ -49,10 +49,10 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '转发成功数', - title: 转发成功数, - eoTitle:'转发成功数', - width: 106, + // title:$t('转发成功数', + title: {$t('转发成功数')}, + eoTitle:$t('转发成功数'), + width: 106, dataIndex: 'proxySuccess', ellipsis:true, sorter: (a,b)=> { @@ -60,10 +60,10 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '转发成功率', - title: 转发成功率, - eoTitle:'转发成功率', - width: 106, + // title:$t('转发成功率', + title: {$t('转发成功率')}, + eoTitle:$t('转发成功率'), + width: 106, dataIndex: 'proxyRate', valueType:'percent', ellipsis:true, @@ -72,10 +72,10 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '失败状态码数', - title: 失败状态码数, - eoTitle:'失败状态码数', - width: 120, + // title:$t('失败状态码数', + title: {$t('失败状态码数')}, + eoTitle:$t('失败状态码数'), + width: 120, dataIndex: 'statusFail', ellipsis:true, sorter: (a,b)=> { @@ -83,9 +83,9 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '平均响应时间(ms)', - title: 平均响应时间(ms), - eoTitle:'平均响应时间(ms)', + // title:$t('平均响应时间(ms)', + title: {$t('平均响应时间(ms)')}, + eoTitle:$t('平均响应时间(ms)'), width: 148, dataIndex: 'avgResp', valueType:'digit', @@ -95,9 +95,9 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '最大响应时间(ms)', - title: 最大响应时间(ms), - eoTitle:'最大响应时间(ms)', + // title:$t('最大响应时间(ms)', + title: {$t('最大响应时间(ms)')}, + eoTitle:$t('最大响应时间(ms)'), width: 148, dataIndex: 'maxResp', valueType:'digit', @@ -107,9 +107,9 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '最小响应时间(ms)', - title: 最小响应时间(ms), - eoTitle:'最小响应时间(ms)', + // title:$t('最小响应时间(ms)', + title: {$t('最小响应时间(ms)')}, + eoTitle:$t('最小响应时间(ms)'), width: 148, dataIndex: 'minResp', valueType:'digit', @@ -119,9 +119,9 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '平均请求流量(KB)', - title: 平均请求流量(KB), - eoTitle:'平均请求流量(KB)', + // title:$t('平均请求流量(KB)', + title: {$t('平均请求流量(KB)')}, + eoTitle:$t('平均请求流量(KB)'), width: 148, dataIndex: 'avgTraffic', valueType:'digit', @@ -131,9 +131,9 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '最大请求流量(KB)', - title: 最大请求流量(KB), - eoTitle:'最大请求流量(KB)', + // title:$t('最大请求流量(KB)', + title: {$t('最大请求流量(KB)')}, + eoTitle:$t('最大请求流量(KB)'), width: 148, dataIndex: 'maxTraffic', valueType:'digit', @@ -143,9 +143,9 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }, }, { - // title: '最小请求流量(KB)', - title: 最小请求流量(KB), - eoTitle:'最小请求流量(KB)', + // title:$t('最小请求流量(KB)', + title: {$t('最小请求流量(KB)')}, + eoTitle:$t('最小请求流量(KB)'), width: 148, dataIndex: 'minTraffic', valueType:'digit', @@ -156,11 +156,11 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str }] - export const API_TABLE_GLOBAL_COLUMNS_CONFIG:(ProColumns&{eoTitle:string})[] = [ + export const API_TABLE_GLOBAL_COLUMNS_CONFIG:(PageProColumns&{eoTitle:string})[] = [ { - title: 'API 名称', - eoTitle:'API 名称', + title:$t('API 名称'), + eoTitle:$t('API 名称'), dataIndex: 'name', width:120, ellipsis:true, @@ -168,29 +168,29 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str disable:true }, { - title: '请求路径', - eoTitle:'请求路径', + title:$t('请求路径'), + eoTitle:$t('请求路径'), dataIndex: 'path', ellipsis:true, width: 80 }, { - title: '所属服务', - eoTitle:'所属服务', + title:$t('所属服务'), + eoTitle:$t('所属服务'), dataIndex: ['project','name'], ellipsis:true, width: 80 }, - ...DASHBOARD_BASE_COLUMNS_CONFIG as (ProColumns&{eoTitle:string})[] + ...DASHBOARD_BASE_COLUMNS_CONFIG as (PageProColumns&{eoTitle:string})[] ] - export const APPLICATION_TABLE_GLOBAL_COLUMNS_CONFIG:(ProColumns&{eoTitle:string})[] = [ + export const APPLICATION_TABLE_GLOBAL_COLUMNS_CONFIG:(PageProColumns&{eoTitle:string})[] = [ { - title: '应用名称', - eoTitle:'应用名称', + title:$t('应用名称'), + eoTitle:$t('应用名称'), dataIndex: 'name', width:160, ellipsis:true, @@ -198,21 +198,21 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str disable:true }, { - title: '应用 ID', - eoTitle:'应用 ID', + title:$t('应用 ID'), + eoTitle:$t('应用 ID'), dataIndex: 'id', width: 140, ellipsis:true, fixed: 'left' }, - ...DASHBOARD_BASE_COLUMNS_CONFIG as (ProColumns&{eoTitle:string})[] + ...DASHBOARD_BASE_COLUMNS_CONFIG as (PageProColumns&{eoTitle:string})[] ] - export const SERVICE_TABLE_GLOBAL_COLUMNS_CONFIG:(ProColumns&{eoTitle:string})[] = [ + export const SERVICE_TABLE_GLOBAL_COLUMNS_CONFIG:(PageProColumns&{eoTitle:string})[] = [ { - title: '服务名称', - eoTitle:'服务名称', + title:$t('服务名称'), + eoTitle:$t('服务名称'), dataIndex: 'name', width:160, ellipsis:true, @@ -220,14 +220,14 @@ export const DASHBOARD_BASE_COLUMNS_CONFIG:(ProColumns&{eoTitle:str disable:true }, { - title: '服务 ID', - eoTitle:'服务 ID', + title:$t('服务 ID'), + eoTitle:$t('服务 ID'), dataIndex: 'id', width: 140, ellipsis:true, fixed: 'left' }, - ...DASHBOARD_BASE_COLUMNS_CONFIG as (ProColumns&{eoTitle:string})[] + ...DASHBOARD_BASE_COLUMNS_CONFIG as (PageProColumns&{eoTitle:string})[] ] export const MONITOR_LINE_CHART_BASIC_INVOKE_SELECTED = { diff --git a/frontend/packages/dashboard/src/pages/Dashboard.tsx b/frontend/packages/dashboard/src/pages/Dashboard.tsx index c4967d82..84a6b78a 100644 --- a/frontend/packages/dashboard/src/pages/Dashboard.tsx +++ b/frontend/packages/dashboard/src/pages/Dashboard.tsx @@ -2,6 +2,7 @@ import { useEffect } from "react"; import { useBreadcrumb } from "@common/contexts/BreadcrumbContext"; import DashboardPage from "./DashboardTabPage"; +import { $t } from "@common/locales"; export default function Dashboard(){ const { setBreadcrumb } = useBreadcrumb() @@ -9,7 +10,7 @@ export default function Dashboard(){ useEffect(() => { setBreadcrumb([ { - title:'运行视图' + title:$t('运行视图') }, ]) @@ -17,8 +18,9 @@ export default function Dashboard(){ return ( <> - - +
+ +
) } \ No newline at end of file diff --git a/frontend/packages/dashboard/src/pages/DashboardTabPage.tsx b/frontend/packages/dashboard/src/pages/DashboardTabPage.tsx index 180b6030..d6d5ccf3 100644 --- a/frontend/packages/dashboard/src/pages/DashboardTabPage.tsx +++ b/frontend/packages/dashboard/src/pages/DashboardTabPage.tsx @@ -4,6 +4,9 @@ import DashboardTotal from "./DashboardTotal"; import { Outlet, useNavigate, useParams } from "react-router-dom"; import { RouterParams } from "@core/components/aoplatform/RenderRoutes"; import { useEffect, useState } from "react"; +import { $t } from "@common/locales"; + +const APP_MODE = import.meta.env.VITE_APP_MODE; export default function DashboardTabPage(){ const { dashboardType} = useParams() @@ -16,32 +19,32 @@ export default function DashboardTabPage(){ const monitorTabItems:TabsProps['items'] = [ { - label:'监控总览', + label:$t('监控总览'), key:'total', children: }, { - label:'服务被调用统计', + label:$t('服务被调用统计'), key:'subscriber', children: }, { - label:'应用调用统计', + label:$t('应用调用统计'), key:'provider', children: }, { - label:'API 调用统计', + label:$t('API 调用统计'), key:'api', children: } ] return (<> - { + {APP_MODE === 'pro' ? { setActiveKey(val); navigateTo(`/dashboard/${val === 'total' ? val :`${val}/list`}`) }} items={monitorTabItems} className="h-auto mt-[6px]" size="small" tabBarStyle={{paddingLeft:'10px',marginTop:'0px',marginBottom:'0px'}} /> - ) + : } ) } \ No newline at end of file diff --git a/frontend/packages/dashboard/src/utils/dashboard.ts b/frontend/packages/dashboard/src/utils/dashboard.ts index b74ed142..5748f3db 100644 --- a/frontend/packages/dashboard/src/utils/dashboard.ts +++ b/frontend/packages/dashboard/src/utils/dashboard.ts @@ -1,5 +1,6 @@ import { RangeValue } from "@common/components/aoplatform/TimeRangeSelector"; +import { $t } from "@common/locales"; export function getTime ( timeButton: string, @@ -45,23 +46,23 @@ export function getTime ( // 相差秒数 switch (timeInterval) { case '1m': { - timeUnit = '每分钟' + timeUnit = $t('每分钟') break } case '5m': { - timeUnit = '每5分钟' + timeUnit = $t('每5分钟') break } case '1h': { - timeUnit = '每小时' + timeUnit = $t('每小时') break } case '1d': { - timeUnit = '每天' + timeUnit = $t('每天') break } case '1w': { - timeUnit = '每周' + timeUnit = $t('每周') break } } @@ -71,23 +72,23 @@ export function getTime ( // 当数据超过10万时,保留两个小数点,单位为万,如123212,显示12.32万; export function changeNumberUnit (value?:number):string { if (value && value > 1000000000) { - return (value && value / 100000000).toFixed(2) + '亿' + return (value && value / 100000000).toFixed(2) + $t('亿') } else if (value && value > 1000000) { - return (value && value / 10000).toFixed(0) + '万' + return (value && value / 10000).toFixed(0) + $t('万') } else if (value && value > 10000) { - return (value && value / 10000).toFixed(2) + '万' + return (value && value / 10000).toFixed(2) + $t('万') } - return (value ?? '-') + ' 次' + return (value ?? '-') + $t(' 次') } export function yUnitFormatter (value:number):string { let res:string = '' if (value > 100000000) { - res = (value / 100000000).toFixed(2) + '亿' + res = (value / 100000000).toFixed(2) + $t('亿') } else if (value > 1000000) { - res = (value / 10000).toFixed(0) + '万' + res = (value / 10000).toFixed(0) + $t('万') } else if (value > 100000) { - res = (value / 10000).toFixed(2) + '万' + res = (value / 10000).toFixed(2) + $t('万') } else { res = value.toFixed(0) } diff --git a/frontend/packages/dashboard/tsconfig.json b/frontend/packages/dashboard/tsconfig.json index 3dbba79f..1733c32f 100644 --- a/frontend/packages/dashboard/tsconfig.json +++ b/frontend/packages/dashboard/tsconfig.json @@ -24,6 +24,6 @@ "@dashboard/*": ["./src/*"] }, }, - "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TransferTable.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/Navigation.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/GroupTree.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../core/src/pages/serviceCategory/ServiceHubCategoryConfig.tsx"], + "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../core/src/pages/serviceCategory/ServiceHubCategoryConfig.tsx"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/frontend/packages/market/src/components/aoplatform/RenderRoutes.tsx b/frontend/packages/market/src/components/aoplatform/RenderRoutes.tsx index 64d018b8..b57f6174 100644 --- a/frontend/packages/market/src/components/aoplatform/RenderRoutes.tsx +++ b/frontend/packages/market/src/components/aoplatform/RenderRoutes.tsx @@ -147,7 +147,7 @@ const generateRoutes = (routerConfig: RouteConfig[]) => { const LazyComponent = route.lazy as React.ExoticComponent; routeElement = ( - }> + }> {route.provider ? ( createElement(route.provider, {}, ) ) : ( diff --git a/frontend/packages/market/src/const/serviceHub/const.tsx b/frontend/packages/market/src/const/serviceHub/const.tsx index ee3aa866..761bc422 100644 --- a/frontend/packages/market/src/const/serviceHub/const.tsx +++ b/frontend/packages/market/src/const/serviceHub/const.tsx @@ -1,12 +1,13 @@ -import { ProColumns } from "@ant-design/pro-components"; import { MenuProps } from "antd"; import { getItem } from "@common/utils/navigation"; import { ServiceHubTableListItem } from "./type"; +import { $t } from "@common/locales"; +import { PageProColumns } from "@common/components/aoplatform/PageList"; -export const SERVICE_HUB_TABLE_COLUMNS: ProColumns[] = [ +export const SERVICE_HUB_TABLE_COLUMNS: PageProColumns[] = [ { - title: '服务名称', + title:$t('服务名称'), dataIndex: 'name', ellipsis:true, width:160, @@ -16,29 +17,29 @@ export const SERVICE_HUB_TABLE_COLUMNS: ProColumns[] = }, }, { - title: '服务ID', + title:$t('服务ID'), dataIndex: 'id', width: 140, ellipsis:true }, { - title: '服务标签', + title:$t('服务标签'), dataIndex: 'tags', ellipsis:true, renderText:(_,entity:ServiceHubTableListItem)=>entity.tags?.map(x=>x.name).join(',') || '-' }, { - title: '所属系统', + title:$t('所属系统'), dataIndex: ['app','name'], ellipsis:true }, { - title: '所属团队', + title:$t('所属团队'), dataIndex: ['team','name'], ellipsis:true }, { - title: '服务分类', + title:$t('服务分类'), dataIndex: ['catalogue','name'], ellipsis:true } @@ -47,7 +48,7 @@ export const SERVICE_HUB_TABLE_COLUMNS: ProColumns[] = export const TENANT_MANAGEMENT_APP_MENU: MenuProps['items'] = [ - getItem('订阅的服务', 'service'), - getItem('访问授权', 'authorization'), - getItem('应用管理', 'setting'), + getItem($t('订阅的服务'), 'service'), + getItem($t('访问授权'), 'authorization'), + getItem($t('应用管理'), 'setting'), ]; diff --git a/frontend/packages/market/src/const/serviceHub/type.ts b/frontend/packages/market/src/const/serviceHub/type.ts index 758eaaea..e3041f3b 100644 --- a/frontend/packages/market/src/const/serviceHub/type.ts +++ b/frontend/packages/market/src/const/serviceHub/type.ts @@ -93,7 +93,7 @@ export type ServiceHubAppListItem = { export type TenantManagementServiceListItem = { id:string service:EntityItem - applyStatus:SubscribeEnum + applyStatus:typeof SubscribeEnum app:EntityItem team:EntityItem from:SubscribeFromEnum diff --git a/frontend/packages/market/src/index.css b/frontend/packages/market/src/index.css index 0a28ace8..9154cbf7 100644 --- a/frontend/packages/market/src/index.css +++ b/frontend/packages/market/src/index.css @@ -353,13 +353,13 @@ p{ color:var(--primary-color) !important; } - button.ant-btn:not(:disabled):not(.text-table_text){ + /* button.ant-btn:not(:disabled):not(.text-table_text){ color:var(--primary-color); } button.ant-btn:not(:disabled):not(.text-table_text):hover{ color:var(--button-primary-hover-background-color) !important; - } + } */ } .ant-popover .ant-popover-inner{ diff --git a/frontend/packages/market/src/pages/Login.tsx b/frontend/packages/market/src/pages/Login.tsx deleted file mode 100644 index 9fffcba6..00000000 --- a/frontend/packages/market/src/pages/Login.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import {FC, useCallback, useEffect, useRef, useState} from "react"; -import {App, Button, Form, FormInstance, Input} from "antd"; -import {useGlobalContext} from "@common/contexts/GlobalStateContext.tsx"; -import {useFetch} from "@common/hooks/http.ts"; -import {BasicResponse, STATUS_CODE} from "@common/const/const.ts"; -import {useNavigate} from "react-router-dom"; -// import {useCrypto} from "../hooks/crypto.ts"; -import Logo from '@common/assets/logo.png' - -const Login:FC = ()=> { - const {state, dispatch} = useGlobalContext() - const {fetchData} = useFetch() - const { message } = App.useApp() - const navigate = useNavigate(); - const formRef = useRef(null); - const [loading,setLoading] = useState() - // const { encryptByEnAES } = useCrypto(); - - - const check = useCallback(()=>{ - fetchData, status:string}>>('account/login',{method:'GET'}).then(response=>{ - const {code,data} = response - if(code === STATUS_CODE.SUCCESS && data.status !== 'anonymous'){ - dispatch({type:'LOGIN'}) - //console.log('校验成功') - navigate('/serviceHub/list') - }else{ - dispatch({type:'LOGOUT'}) - } - }) - },[]) - - - const getSystemInfo = useCallback(()=>{ - fetchData>('common/version',{method:'GET', eoTransformKeys:['build_time']}).then(response=>{ - const {code,data} = response - if(code === STATUS_CODE.SUCCESS){ - dispatch({type:'UPDATE_VERSION',version:data.version}) - dispatch({type:'UPDATE_DATE',updateDate:data.buildTime}) - } - }) - },[]) - - const login = async () => { - if (formRef.current) { - try { - const values = await formRef.current.validateFields(); - setLoading(true); - - const { username, password } = values; - // const encryptedPassword = encryptByEnAES(username, password); - - const body = { - name:username, - password: password - // client: 1, - // type: 1, - // app_type: 4, - }; - - const {code,msg } = await fetchData>('account/login/username',{method:'POST',eoBody:(body)}) - - if (code === STATUS_CODE.SUCCESS) { - dispatch({type:'LOGIN'}) - message.success('登录成功'); - const callbackUrl = new URLSearchParams(window.location.search).get('callbackUrl'); - if (callbackUrl && callbackUrl !== 'null') { - navigate(callbackUrl); - } else { - navigate('/serviceHub/list') - } - }else{ - dispatch({type:'LOGOUT'}) - //console.log(msg) - message.error(msg) - } - - } catch (err) { - console.warn(err); - } finally { - setLoading(false) - } - } - }; - - useEffect(() => { - check() - getSystemInfo() - }, []); - - return ( -
-
-
- - - -
- -
-
-
-
- 登录 -
- -
- - - - - - - - -
- - - -
-
-
-
-
- -
-

Version {state.version}-{state.updateDate}

-

{state.powered}

-
-
-
- ); -} -export default Login; \ No newline at end of file diff --git a/frontend/packages/market/src/pages/serviceHub/ApiTestGroup.tsx b/frontend/packages/market/src/pages/serviceHub/ApiTestGroup.tsx index e52acc9c..177d6369 100644 --- a/frontend/packages/market/src/pages/serviceHub/ApiTestGroup.tsx +++ b/frontend/packages/market/src/pages/serviceHub/ApiTestGroup.tsx @@ -7,6 +7,7 @@ import {DataNode} from "antd/es/tree"; import {ApiDetail} from "@common/const/api-detail"; import ApiTest from "@common/components/postcat/ApiTest.tsx"; import DirectoryTree from "antd/es/tree/DirectoryTree"; +import { $t } from "@common/locales"; type ApiTestGroupType = { apiInfoList:ApiDetail[] @@ -62,7 +63,7 @@ export default function ApiTestGroup({apiInfoList,selectedApiId }:ApiTestGroupTy
debounce(onSearchWordChange, 100)(e)} - allowClear placeholder="搜索分类或标签" + allowClear placeholder={$t("搜索分类或标签")} prefix={ { onSearchWordChange(e) }}/>}/> @@ -78,7 +79,7 @@ export default function ApiTestGroup({apiInfoList,selectedApiId }:ApiTestGroupTy
{selectedApiInfo ? : - + }
) diff --git a/frontend/packages/market/src/pages/serviceHub/ApplyServiceModal.tsx b/frontend/packages/market/src/pages/serviceHub/ApplyServiceModal.tsx index b742e74d..eb9dbc2e 100644 --- a/frontend/packages/market/src/pages/serviceHub/ApplyServiceModal.tsx +++ b/frontend/packages/market/src/pages/serviceHub/ApplyServiceModal.tsx @@ -2,9 +2,10 @@ import { App, Form, Row, Col, Select, Input } from "antd"; import { forwardRef, useEffect, useImperativeHandle, useMemo } from "react"; import WithPermission from "@common/components/aoplatform/WithPermission"; -import { BasicResponse, STATUS_CODE } from "@common/const/const"; +import { BasicResponse, RESPONSE_TIPS, STATUS_CODE, VALIDATE_MESSAGE } from "@common/const/const"; import { ApplyServiceHandle, ApplyServiceProps } from "../../const/serviceHub/type"; import { useFetch } from "@common/hooks/http"; +import { $t } from "@common/locales"; export const ApplyServiceModal = forwardRef((props,ref)=>{ const { message } = App.useApp() @@ -22,11 +23,11 @@ export const ApplyServiceModal = forwardRef>('catalogue/service/subscribe',{method:'POST',eoParams:{team:entity?.team?.id}, eoBody:({...value,service:entity.id})}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }).catch((errorInfo)=> reject(errorInfo)) @@ -48,23 +49,23 @@ export const ApplyServiceModal = forwardRef - 服务名称: + {$t('服务名称')}: {entity.name} - 服务 ID: + {$t('服务 ID')}: {entity.id} - x.value !== entity.id)}/> diff --git a/frontend/packages/market/src/pages/serviceHub/ServiceHubApiDocument.tsx b/frontend/packages/market/src/pages/serviceHub/ServiceHubApiDocument.tsx index 50441c1b..f677e2fb 100644 --- a/frontend/packages/market/src/pages/serviceHub/ServiceHubApiDocument.tsx +++ b/frontend/packages/market/src/pages/serviceHub/ServiceHubApiDocument.tsx @@ -8,6 +8,7 @@ import {ApiDetail} from "@common/const/api-detail"; import {ServiceDetailType } from "../../const/serviceHub/type.ts"; import ApiMatch from "@common/components/postcat/api/ApiPreview/components/ApiMatch/index.tsx"; import ApiProxy from "@common/components/postcat/api/ApiPreview/components/ApiProxy/index.tsx"; +import { $t } from "@common/locales/index.ts"; const ServiceHubApiDocument = ({service}:{service:ServiceDetailType})=>{ const {serviceId} = useParams(); @@ -28,7 +29,7 @@ const ServiceHubApiDocument = ({service}:{service:ServiceDetailType})=>{ { key: 'apiDocument-list', href: '#apiDocument-list', - title: 'API 列表', + title:$t('API 列表'), children:apiDocs?.map((x)=>({ key:x.id, href:`#apiDocument-${x.id}`, @@ -38,7 +39,7 @@ const ServiceHubApiDocument = ({service}:{service:ServiceDetailType})=>{ // { // key: 'apiDocument-statusCode', // href: '#apiDocument-statusCode', - // title: '状态码', + // title:$t('状态码', // }, ], [apiDocs]); @@ -63,9 +64,6 @@ const ServiceHubApiDocument = ({service}:{service:ServiceDetailType})=>{ return ( <>
- {/*
- -
*/}

API 列表

@@ -83,23 +81,20 @@ const ServiceHubApiDocument = ({service}:{service:ServiceDetailType})=>{ readOnly addonBefore={apiDetail?.method} value={apiDetail?.path} - // enterButton={} - // onSearch={handleTest} /> { apiDetail?.match && apiDetail.match?.length > 0 && - + } { apiDetail?.proxy && Object.keys(apiDetail?.proxy).length > 0 && - + } {apiDetail && }
- // testClick(apiDocs.id)} entity={doc} /> }]} activeKey={activeKey} onChange={(val)=>{setActiveKey(val as string[])}} @@ -108,18 +103,10 @@ const ServiceHubApiDocument = ({service}:{service:ServiceDetailType})=>{ ))}
- {/*
-
-

状态码

- -
*/}
document.getElementById('layout-ref')!} items={category} @@ -133,7 +120,7 @@ const ServiceHubApiDocument = ({service}:{service:ServiceDetailType})=>{ maskClosable={false} width="100%" placement="right" onClose={onClose} open={apiTestDrawOpen} extra={ - + } closeIcon={false} > diff --git a/frontend/packages/market/src/pages/serviceHub/ServiceHubDetail.tsx b/frontend/packages/market/src/pages/serviceHub/ServiceHubDetail.tsx index 5f3b16dd..c1c96336 100644 --- a/frontend/packages/market/src/pages/serviceHub/ServiceHubDetail.tsx +++ b/frontend/packages/market/src/pages/serviceHub/ServiceHubDetail.tsx @@ -3,17 +3,18 @@ import {RouterParams} from "@core/components/aoplatform/RenderRoutes.tsx"; import { App, Avatar, Button, Descriptions, Divider, Tabs} from "antd"; import { useEffect, useRef, useState} from "react"; import {useBreadcrumb} from "@common/contexts/BreadcrumbContext.tsx"; -import {BasicResponse, STATUS_CODE} from "@common/const/const.ts"; +import {BasicResponse, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx"; import {useFetch} from "@common/hooks/http.ts"; import {DefaultOptionType} from "antd/es/cascader"; import { ApplyServiceHandle, ServiceBasicInfoType, ServiceDetailType } from "../../const/serviceHub/type.ts"; import { EntityItem } from "@common/const/type.ts"; import { ApplyServiceModal } from "./ApplyServiceModal.tsx"; import ServiceHubApiDocument from "./ServiceHubApiDocument.tsx"; -import { ApiFilled, ArrowLeftOutlined, LeftOutlined } from "@ant-design/icons"; +import { ApiFilled, ArrowLeftOutlined } from "@ant-design/icons"; import { SimpleSystemItem } from "@core/const/system/type.ts"; import { Icon } from "@iconify/react/dist/iconify.js"; import DOMPurify from 'dompurify'; +import { $t } from "@common/locales/index.ts"; const ServiceHubDetail = ()=>{ @@ -44,7 +45,7 @@ const ServiceHubDetail = ()=>{ setServiceDoc(DOMPurify.sanitize(data.service.document)) setActiveKey(data.service.apis.map((x)=>x.id)) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }) } @@ -61,8 +62,8 @@ const ServiceHubDetail = ()=>{ getMySelectList() setBreadcrumb( [ - {title:服务市场}, - {title:'服务详情'} + {title:{$t('服务市场')}}, + {title:$t('服务详情')} ] ) @@ -78,7 +79,7 @@ const ServiceHubDetail = ()=>{ label:x.name, value:x.id }})) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }) } @@ -86,15 +87,15 @@ const ServiceHubDetail = ()=>{ const openModal = (type:'apply')=>{ modal.confirm({ - title:'申请服务', + title:$t('申请服务'), content:, onOk:()=>{ return applyRef.current?.apply().then((res)=>{ if(res === true) setApplied(true) }) }, - okText:'确认', - cancelText:'取消', + okText:$t('确认'), + cancelText:$t('取消'), closable:true, icon:<>, width:600 @@ -104,13 +105,13 @@ const ServiceHubDetail = ()=>{ const items = [ { key: 'introduction', - label: '介绍', + label: $t('介绍'), children: <>
, icon: , }, { key: 'api-document', - label: 'API 文档', + label: $t('API 文档'), children:
, icon: } @@ -122,7 +123,7 @@ const ServiceHubDetail = ()=>{
- +
{/* {service?.name?.substring(0,1)} */} @@ -137,7 +138,7 @@ const ServiceHubDetail = ()=>{
{serviceDesc || '-'}
- +
@@ -151,16 +152,16 @@ const ServiceHubDetail = ()=>{
- - {serviceBasicInfo?.appNum ?? '-'} - {serviceBasicInfo?.team?.name || '-'} - {serviceBasicInfo?.catalogue?.name || '-'} - {serviceBasicInfo?.tags?.map(x=>x.name)?.join(',') || '-'} + + {serviceBasicInfo?.appNum ?? '-'} + {serviceBasicInfo?.team?.name || '-'} + {serviceBasicInfo?.catalogue?.name || '-'} + {serviceBasicInfo?.tags?.map(x=>x.name)?.join(',') || '-'} - { serviceBasicInfo?.version || '-'} - {serviceBasicInfo?.updateTime || '-'} + { serviceBasicInfo?.version || '-'} + {serviceBasicInfo?.updateTime || '-'}
diff --git a/frontend/packages/market/src/pages/serviceHub/ServiceHubGroup.tsx b/frontend/packages/market/src/pages/serviceHub/ServiceHubGroup.tsx index b16e33a2..151a75d9 100644 --- a/frontend/packages/market/src/pages/serviceHub/ServiceHubGroup.tsx +++ b/frontend/packages/market/src/pages/serviceHub/ServiceHubGroup.tsx @@ -3,11 +3,12 @@ import {SearchOutlined} from "@ant-design/icons"; import {App, Divider, Input, TreeDataNode} from "antd"; import {useCallback, useEffect, useState} from "react"; import Tree, {DataNode} from "antd/es/tree"; -import {BasicResponse, STATUS_CODE} from "@common/const/const.ts"; +import {BasicResponse, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx"; import {useFetch} from "@common/hooks/http.ts"; import { CategorizesType } from "../../const/serviceHub/type.ts"; import { filterServiceList, initialServiceHubListState, SERVICE_HUB_LIST_ACTIONS, ServiceHubListActionType } from "./ServiceHubList.tsx"; import { EntityItem } from "@common/const/type.ts"; +import { $t } from "@common/locales/index.ts"; type ServiceHubGroup = { children:JSX.Element @@ -35,11 +36,11 @@ export const ServiceHubGroup = ({children,filterOption,dispatch}:ServiceHubGroup const {code,data,msg} = response if(code === STATUS_CODE.SUCCESS){ dispatch({type:SERVICE_HUB_LIST_ACTIONS.GET_CATEGORIES,payload:data.catalogues}) - dispatch({type:SERVICE_HUB_LIST_ACTIONS.GET_TAGS,payload:[...data.tags,{id:'empty',name:'无标签'}]}) + dispatch({type:SERVICE_HUB_LIST_ACTIONS.GET_TAGS,payload:[...data.tags,{id:'empty',name:$t('无标签')}]}) dispatch({type:SERVICE_HUB_LIST_ACTIONS.SET_SELECTED_CATE,payload:[...data.catalogues.map((x:CategorizesType)=>x.id)]}) dispatch({type:SERVICE_HUB_LIST_ACTIONS.SET_SELECTED_TAG,payload:[...data.tags.map((x:EntityItem)=>x.id),'empty']}) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }) } @@ -75,11 +76,11 @@ export const ServiceHubGroup = ({children,filterOption,dispatch}:ServiceHubGroup
debounce(onSearchWordChange, 500)(e.target.value)} - allowClear placeholder="搜索服务" + allowClear placeholder={$t("搜索服务")} prefix={}/>
-

分类

+

{$t('分类')}

x.children && x.children.length > 0).length > 0 ? '' : 'no-first-switch-tree'}`} checkable @@ -93,7 +94,7 @@ export const ServiceHubGroup = ({children,filterOption,dispatch}:ServiceHubGroup
-

标签

+

{$t('标签')}

{ dispatch({type:SERVICE_HUB_LIST_ACTIONS.SET_SERVICES,payload: filterServiceList({...filterOption, servicesList:data.services})}) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }).finally(()=>{ dispatch({type:SERVICE_HUB_LIST_ACTIONS.LIST_LOADING,payload:false})}) } @@ -117,7 +118,7 @@ const ServiceHubList:FC = ()=>{ useEffect(() => { setBreadcrumb( [ - {title:'服务市场'} + {title:$t('服务市场')} ] ) getServiceList() @@ -137,7 +138,7 @@ const ServiceHubList:FC = ()=>{
showDocumentDetail(item)}> {item.description || '暂无服务描述'} + style={{'word-break':'auto-phrase'}}>{item.description || $t('暂无服务描述')}
); @@ -182,10 +183,10 @@ const CardTitle = (service:ServiceHubTableListItem)=>{
{service.catalogue?.name || '-'} - + {service.apiNum ?? '-'} - + {service.subscriberNum ?? '-'}
diff --git a/frontend/packages/market/src/pages/serviceHub/management/ApprovalModalContent.tsx b/frontend/packages/market/src/pages/serviceHub/management/ApprovalModalContent.tsx index e54d7c09..7af5d508 100644 --- a/frontend/packages/market/src/pages/serviceHub/management/ApprovalModalContent.tsx +++ b/frontend/packages/market/src/pages/serviceHub/management/ApprovalModalContent.tsx @@ -2,10 +2,11 @@ import { App, Form, Row, Col, Input } from "antd" import { forwardRef, useImperativeHandle, useEffect } from "react" import WithPermission from "@common/components/aoplatform/WithPermission" -import { BasicResponse, STATUS_CODE } from "@common/const/const" +import { BasicResponse, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE } from "@common/const/const" import { useFetch } from "@common/hooks/http" import { SYSTEM_SUBSCRIBE_APPROVAL_DETAIL_LIST } from "@core/const/system/const" import { SubSubscribeApprovalModalHandle, SubSubscribeApprovalModalProps } from "@core/const/system/type" +import { $t } from "@common/locales" type FieldType = { reason: string @@ -28,11 +29,11 @@ export const ApprovalModalContent = forwardRef>('catalogue/service/subscribe',{method: 'POST',eoParams:{team:teamId}, eoBody:({service:data!.service.id, applications:[serviceId], reason:value.reason})}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }).catch((errorInfo)=> reject(errorInfo)) @@ -59,8 +60,6 @@ export const ApprovalModalContent = forwardRef @@ -69,22 +68,21 @@ export const ApprovalModalContent = forwardRef {x.title}: - {/* {showData(x)} */} {x.nested ? data?.[x.key]?.[x.nested] : ( (data as {[k:string]:unknown})?.[x.key] || '-')} ) })} - label="申请原因" + label={$t("申请原因")} name="reason" > - + - label="审核意见" + label={$t("审核意见")} name="opinion" > - + diff --git a/frontend/packages/market/src/pages/serviceHub/management/ManagementAppSetting.tsx b/frontend/packages/market/src/pages/serviceHub/management/ManagementAppSetting.tsx index e995f4e8..f908907d 100644 --- a/frontend/packages/market/src/pages/serviceHub/management/ManagementAppSetting.tsx +++ b/frontend/packages/market/src/pages/serviceHub/management/ManagementAppSetting.tsx @@ -1,13 +1,14 @@ import { RouterParams } from "@core/components/aoplatform/RenderRoutes"; import { useParams } from "react-router-dom"; import ManagementConfig from "./ManagementConfig"; +import { $t } from "@common/locales"; export default function ManagementAppSetting(){ const {teamId,appId} = useParams() return (
-
应用管理
+
{$t('应用管理')}
diff --git a/frontend/packages/market/src/pages/serviceHub/management/ManagementAuthorityConfig.tsx b/frontend/packages/market/src/pages/serviceHub/management/ManagementAuthorityConfig.tsx index 142dabd6..d389ff63 100644 --- a/frontend/packages/market/src/pages/serviceHub/management/ManagementAuthorityConfig.tsx +++ b/frontend/packages/market/src/pages/serviceHub/management/ManagementAuthorityConfig.tsx @@ -1,13 +1,13 @@ import {forwardRef, useEffect, useImperativeHandle, useState} from "react"; -import {App, Checkbox, Form, Input, Select,Switch} from "antd"; -import moment from "moment"; -import {BasicResponse, STATUS_CODE} from "@common/const/const.ts"; +import {App, Checkbox, DatePicker, Form, Input, Select,Switch} from "antd"; +import {BasicResponse, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE, VALIDATE_MESSAGE} from "@common/const/const.tsx"; import {useFetch} from "@common/hooks/http.ts"; -import DatePicker from "@common/components/aoplatform/DatePicker.tsx"; -import WithPermission from "@common/components/aoplatform/WithPermission.tsx"; import { v4 as uuidv4} from 'uuid'; import { ALGORITHM_ITEM } from "@core/const/system/const.tsx"; import { EditAuthFieldType } from "@core/const/system/type"; +import { RangePickerProps } from "antd/es/date-picker"; +import dayjs from 'dayjs'; +import { $t } from "@common/locales"; export type ManagementAuthorityConfigProps = { type:'add'|'edit' @@ -35,11 +35,11 @@ export const ManagementAuthorityConfig = forwardRef>('app/authorization',{method:type === 'add'? 'POST' : 'PUT',eoBody:({...value,expireTime:value.expireTime ? value.expireTime.unix() : 0}), eoParams:type === 'add' ? {app:appId,team:teamId}:{authorization:data!.id,app:appId,team:teamId},eoTransformKeys:['hideCredential','expireTime','tokenName','userName']}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }).catch((errorInfo)=> reject(errorInfo)) @@ -70,18 +70,17 @@ export const ManagementAuthorityConfig = forwardRef { - // 禁用今天以前的日期,包括今天 - // 使用current?.startOf('day')是为了获取日期的开始时间点,以确保整个今天都被禁用 - // 如果只需要禁用今天之前的日期(今天可选),则可以将`isBefore`的第二个参数设置为 'day' - return current ? current.startOf('day') < moment().startOf('day') : false; + + const disabledDate: RangePickerProps['disabledDate'] = (current) => { + // Can not select days before today and today + return current && current.isBefore(dayjs().endOf('day'), 'day'); }; useEffect(() => { //console.log(data) if(type === 'edit' && data){ - form.setFieldsValue({...data,expireTime:data.expireTime === 0 ? '' : moment(data.expireTime *1000)}) + form.setFieldsValue({...data,expireTime:data.expireTime === 0 ? '' : dayjs(data.expireTime * 1000)}) forceUpdate({}) }else{ form.setFieldsValue({driver, position:'Header',tokenName:'Authorization'}) @@ -106,29 +105,29 @@ export const ManagementAuthorityConfig = forwardRef - label="名称" + label={$t("名称")} name="name" - rules={[{required: true, message: '必填项',whitespace:true }]} + rules={[{required: true, message: VALIDATE_MESSAGE.required,whitespace:true }]} > - + - label="鉴权类型" + label={$t("鉴权类型")} name="driver" - rules={[{required: true, message: '必填项'}]} + rules={[{required: true, message: VALIDATE_MESSAGE.required}]} > @@ -138,70 +137,70 @@ export const ManagementAuthorityConfig = forwardRef - label="用户名" + label={$t("用户名")} name={['config','userName']} - rules={[{required: true, message: '必填项',whitespace:true }]} + rules={[{required: true, message: VALIDATE_MESSAGE.required,whitespace:true }]} > - + - label="密码" + label={$t("密码")} name={['config','password']} - rules={[{required: true, message: '必填项',whitespace:true }]} + rules={[{required: true, message: VALIDATE_MESSAGE.required,whitespace:true }]} > - + case 'jwt': return <> - label="Iss" + label={$t("Iss")} name={['config','iss']} - rules={[{required: true, message: '必填项'}]} + rules={[{required: true, message: VALIDATE_MESSAGE.required}]} > - + - label="签名算法" + label={$t("签名算法")} name={['config','algorithm']} - rules={[{required: true, message: '必填项'}]} + rules={[{required: true, message: VALIDATE_MESSAGE.required}]} > + - label="用户名" + label={$t("用户名")} name={['config','user']} > - + - label="用户名 JsonPath" + label={$t("用户名 JsonPath")} name={['config','userPath']} > - + - label="校验字段" + label={$t("校验字段")} name={['config','claimsToVerify']} > - {algorithm.includes('HS') && - label="是否 Base64 加密" + label={$t("是否 Base64 加密")} name={['config', 'signatureIsBase64']} > @@ -210,29 +209,29 @@ export const ManagementAuthorityConfig = forwardRef - label="AK" + label={$t("AK")} name={['config','ak']} - rules={[{required: true, message: '必填项'}]} + rules={[{required: true, message: VALIDATE_MESSAGE.required}]} > - + - label="SK" + label={$t("SK")} name={['config','sk']} - rules={[{required: true, message: '必填项'}]} + rules={[{required: true, message: VALIDATE_MESSAGE.required}]} > - + case 'apikey': return <> - label="Apikey" + label={$t("Apikey")} name={['config','apikey']} - rules={[{required: true, message: '必填项',whitespace:true }]} + rules={[{required: true, message: VALIDATE_MESSAGE.required,whitespace:true }]} > - + } @@ -240,7 +239,7 @@ export const ManagementAuthorityConfig = forwardRef - label="过期时间" + label={$t("过期时间")} name="expireTime" > - label="隐藏鉴权信息" + label={$t("隐藏鉴权信息")} name="hideCredential" valuePropName="checked" > diff --git a/frontend/packages/market/src/pages/serviceHub/management/ManagementConfig.tsx b/frontend/packages/market/src/pages/serviceHub/management/ManagementConfig.tsx index 2e6c652d..820b57b1 100644 --- a/frontend/packages/market/src/pages/serviceHub/management/ManagementConfig.tsx +++ b/frontend/packages/market/src/pages/serviceHub/management/ManagementConfig.tsx @@ -1,12 +1,13 @@ -import {App, Button, Divider, Form, Input, Row} from "antd"; +import {App, Button, Form, Input, Row} from "antd"; import {forwardRef, useEffect, useImperativeHandle, useState} from "react"; import {v4 as uuidv4} from 'uuid' import WithPermission from "@common/components/aoplatform/WithPermission"; -import { BasicResponse, STATUS_CODE } from "@common/const/const"; +import { BasicResponse, DELETE_TIPS, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE, VALIDATE_MESSAGE } from "@common/const/const"; import { useFetch } from "@common/hooks/http"; import { useNavigate } from "react-router-dom"; import { useTenantManagementContext } from "@market/contexts/TenantManagementContext"; +import { $t } from "@common/locales"; export type ManagementConfigFieldType = { name:string @@ -41,13 +42,13 @@ const ManagementConfig = forwardRef>(type === 'add'? 'team/app' : 'app/info',{method:type === 'add'? 'POST' : 'PUT',eoBody:(value), eoParams:type === 'add' ? {team:teamId}:{app:appId,team:teamId}}).then(response=>{ const {code,data,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) form.setFieldsValue(data.apps) type === 'edit' && setAppName(data.apps.name) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }).catch((errorInfo)=> reject(errorInfo)) @@ -62,7 +63,7 @@ const ManagementConfig = forwardRef{form.setFieldsValue({...data.app})},0) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }) }; @@ -70,20 +71,20 @@ const ManagementConfig = forwardRef{ setDelBtnLoading(true) modal.confirm({ - title:'删除', - content:'该数据删除后将无法找回,请确认是否删除?', + title:$t('删除'), + content:DELETE_TIPS.default, onOk:()=> { return deleteApplication() }, width:600, - okText:'确认', + okText:$t('确认'), okButtonProps:{ danger:true }, onCancel:()=>{ setDelBtnLoading(false) }, - cancelText:'取消', + cancelText:$t('取消'), closable:true, icon:<> }) @@ -94,10 +95,10 @@ const ManagementConfig = forwardRef>('app',{method:'DELETE',eoParams:{app:appId,team:teamId}}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) navigate(`/tenantManagement/list`) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }) } @@ -125,41 +126,38 @@ const ManagementConfig = forwardRef
- label="应用名称" + label={$t("应用名称")} name="name" - rules={[{ required: true, message: '必填项',whitespace:true }]} + rules={[{ required: true, message: VALIDATE_MESSAGE.required,whitespace:true }]} > - + - label="应用 ID" + label={$t("应用 ID")} name="id" - rules={[{ required: true, message: '必填项' ,whitespace:true }]} + rules={[{ required: true, message: VALIDATE_MESSAGE.required ,whitespace:true }]} > - + - + {type === 'edit' && <> @@ -169,10 +167,10 @@ const ManagementConfig = forwardRef
-

删除应用:删除操作不可恢复,请谨慎操作!

+

{$t('删除应用')}:{$t('删除操作不可恢复,请谨慎操作!')}

- +
diff --git a/frontend/packages/market/src/pages/serviceHub/management/ManagementInsideAuth.tsx b/frontend/packages/market/src/pages/serviceHub/management/ManagementInsideAuth.tsx index db873778..e828d6a9 100644 --- a/frontend/packages/market/src/pages/serviceHub/management/ManagementInsideAuth.tsx +++ b/frontend/packages/market/src/pages/serviceHub/management/ManagementInsideAuth.tsx @@ -2,18 +2,18 @@ import { MoreOutlined } from "@ant-design/icons" import { message, Card, Button, Tag, Dropdown, App, Empty } from "antd" import { useState, useEffect, forwardRef, useRef } from "react" import { VirtuosoGrid } from "react-virtuoso" -import { BasicResponse, STATUS_CODE } from "@common/const/const" -import { useBreadcrumb } from "@common/contexts/BreadcrumbContext" +import { BasicResponse, DELETE_TIPS, RESPONSE_TIPS, STATUS_CODE } from "@common/const/const" import { useFetch } from "@common/hooks/http" import { EditAuthFieldType, SystemAuthorityTableListItem } from "@core/const/system/type" -import { Link, useParams } from "react-router-dom" +import { useParams } from "react-router-dom" import { RouterParams } from "@core/components/aoplatform/RenderRoutes" -import moment from "moment" import { useTenantManagementContext } from "../../../contexts/TenantManagementContext" import { ManagementAuthorityConfig, ManagementAuthorityConfigHandle } from "./ManagementAuthorityConfig" import { ManagementAuthorityView } from "./ManagementAuthorityView" import { checkAccess } from "@common/utils/permission" import { useGlobalContext } from "@common/contexts/GlobalStateContext" +import dayjs from 'dayjs'; +import { $t } from "@common/locales" export default function ManagementInsideAuth(){ const {modal} = App.useApp() @@ -22,7 +22,6 @@ export default function ManagementInsideAuth(){ const {appId,teamId} = useParams() const addRef = useRef(null) const editRef = useRef(null) - const {appName} = useTenantManagementContext() const {accessData} = useGlobalContext() @@ -32,7 +31,7 @@ export default function ManagementInsideAuth(){ if(code === STATUS_CODE.SUCCESS){ setAuthList(data.authorizations) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }).catch(() => { return {data:[], success:false} @@ -49,11 +48,11 @@ export default function ManagementInsideAuth(){ fetchData>('app/authorization',{method:'DELETE',eoParams:{authorization:entity!.id,app:appId, team:teamId}}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }) @@ -65,36 +64,36 @@ export default function ManagementInsideAuth(){ let content:string|React.ReactNode = '' switch (type){ case 'view':{ - title='鉴权详情' - message.loading('正在加载数据') + title=$t('鉴权详情') + message.loading(RESPONSE_TIPS.loading) const {code,data,msg} = await fetchData>('app/authorization/details',{method:'GET',eoParams:{authorization:entity!.id,app:appId, team:teamId}}) message.destroy() if(code === STATUS_CODE.SUCCESS){ content= }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) return }} break; case 'add': - title='添加鉴权' + title=$t('添加鉴权') content= break; case 'edit':{ - title='编辑鉴权' - message.loading('正在加载数据') + title=$t('编辑鉴权') + message.loading(RESPONSE_TIPS.loading) const {code,data,msg} = await fetchData>('app/authorization',{method:'GET',eoParams:{authorization:entity!.id,app:appId, team:teamId},eoTransformKeys:['hide_credential','token_name','expire_time','user_name','public_key','user_path','claims_to_verify','signature_is_base64']}) message.destroy() if(code === STATUS_CODE.SUCCESS){ content= }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) return }} break; case 'delete': - title='删除' - content='该数据删除后将无法找回,请确认是否删除?' + title=$t('删除') + content=DELETE_TIPS.default break; } @@ -114,11 +113,11 @@ export default function ManagementInsideAuth(){ } }, width:600, - okText: '确认', + okText: $t('确认'), okButtonProps:{ disabled : !checkAccess( `team.application.authorization.${type}`, accessData) }, - cancelText:type === 'view'? '关闭':'取消', + cancelText:type === 'view'? $t('关闭'):$t('取消'), closable:true, icon:<>, footer:(_, { OkBtn, CancelBtn }) =>{ @@ -136,28 +135,24 @@ export default function ManagementInsideAuth(){ { key: 'edit', label: ( - // - // ), }, { key: 'delete', label: ( - // - // ), }, ] return (
-
访问授权
-
+
{$t('访问授权')}
+
{authList && authList.length > 0 ?
-
{item.name}
+
{item.name}
{`${item.driver.substring(0,1).toLocaleUpperCase()}${item.driver.substring(1)}`} - {item.expireTime === 0 ? '永不过期' : `到期时间:${moment(item.expireTime * 1000).format('YYYY-MM-DD hh:mm:ss')}`}
+ {item.expireTime === 0 ?$t('永不过期') : `${$t('到期时间')}:${dayjs(item.expireTime * 1000).format('YYYY-MM-DD hh:mm:ss')}`}
); @@ -183,9 +178,6 @@ export default function ManagementInsideAuth(){ {...props} style={{ display: 'grid', - // gridTemplateColumns: 'repeat(auto-fill, minmax(250px, 1fr))', - // gap: '20px', - // padding:'30px', ...style, }} > diff --git a/frontend/packages/market/src/pages/serviceHub/management/ManagementInsidePage.tsx b/frontend/packages/market/src/pages/serviceHub/management/ManagementInsidePage.tsx index 05bac89e..773ada32 100644 --- a/frontend/packages/market/src/pages/serviceHub/management/ManagementInsidePage.tsx +++ b/frontend/packages/market/src/pages/serviceHub/management/ManagementInsidePage.tsx @@ -12,6 +12,7 @@ import { RouterParams } from "@core/components/aoplatform/RenderRoutes"; import { useTenantManagementContext } from "@market/contexts/TenantManagementContext"; import { ManagementConfigFieldType } from "./ManagementConfig"; import { useGlobalContext } from "@common/contexts/GlobalStateContext"; +import { $t } from "@common/locales"; export default function ManagementInsidePage(){ const { message } = App.useApp() @@ -51,7 +52,7 @@ export default function ManagementInsidePage(){ } setBreadcrumb( [ - {title:应用}, + {title:{$t('应用')}}, ...(_appName ? [{title:_appName}] : []) ] ) @@ -75,7 +76,7 @@ useEffect(()=>{
- +
([]) const {fetchData} = useFetch() - const { setBreadcrumb} = useBreadcrumb() const {teamId,appId} = useParams() - const navigateTo = useNavigate() const [keyword, setKeyword] = useState('') - const { refreshGroup} = useOutletContext<{refreshGroup:()=>void,appName:string}>() - const {appName} = useTenantManagementContext() + const { refreshGroup} = useOutletContext<{refreshGroup:()=>void}>() const {accessData} = useGlobalContext() const onSearchWordChange = (e)=>{ setKeyword(e.target.value) } - const cancelSubscribeApply = (entity:TenantManagementServiceListItem) => { return new Promise((resolve, reject)=>{ fetchData>('application/subscription/cancel_apply',{method:'POST',eoParams:{subscription:entity.id!,application:appId!,team:teamId}}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }) @@ -52,11 +47,11 @@ export default function ManagementInsideService(){ fetchData>('application/subscription/cancel',{method:'POST',eoParams:{subscription:entity.id!,application:appId!,team:teamId}}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }) @@ -67,25 +62,25 @@ export default function ManagementInsideService(){ let content:string|React.ReactNode = '' switch (type){ case 'view':{ - message.loading('正在加载数据') + message.loading(RESPONSE_TIPS.loading) const {code,data,msg} = await fetchData>('app/subscription/approval',{method:'GET',eoParams:{subscription:entity!.id, app:appId,team:teamId},eoTransformKeys:['apply_project','apply_team','apply_time','approval_time']}) message.destroy() if(code === STATUS_CODE.SUCCESS){ - title='审批详情' + title=$t('审批详情') content = ; }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) return } break; } case 'cancelSub': - title='取消订阅' - content='请确认是否取消订阅?' + title=$t('取消订阅') + content=$t('请确认是否取消订阅?') break; case 'cancelSubApply': - title='取消订阅申请' - content='请确认是否取消订阅申请?' + title=$t('取消订阅申请') + content=$t('请确认是否取消订阅申请?') break; } @@ -103,11 +98,11 @@ export default function ManagementInsideService(){ } }, width:600, - okText:'确认', + okText:$t('确认'), okButtonProps:{ disabled : !checkAccess( `team.application.authorization.${type}`, accessData) }, - cancelText:'取消', + cancelText:$t('取消'), closable:true, icon:<>, }) @@ -130,7 +125,7 @@ export default function ManagementInsideService(){ label: ( // // ), @@ -139,7 +134,7 @@ export default function ManagementInsideService(){ label: ( // // ), @@ -153,7 +148,7 @@ export default function ManagementInsideService(){ setServiceList(data.subscriptions && data.subscriptions.length > 0 ? [...data.subscriptions] : []) // return {data:data.services, success: true,total:data.total} }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) // return {data:[], success:false} } }) @@ -166,8 +161,8 @@ export default function ManagementInsideService(){ return (
- 服务 - debounce(onSearchWordChange, 100)(e) : undefined } onPressEnter={()=>getServiceList()} allowClear placeholder='搜索服务' prefix={{getServiceList()}}/>}/> + {$t('服务')} + debounce(onSearchWordChange, 100)(e) : undefined } onPressEnter={()=>getServiceList()} allowClear placeholder={$t('搜索服务')} prefix={{getServiceList()}}/>}/>
{ (keyword ? serviceList.filter(x=>x.service.name.includes(keyword)) :serviceList)?.length > 0 ? x.service.name.includes(keyword)) :serviceList)[index]; return (
{item.service.name}{ item.applyStatus === 1 && - 审批中 + {$t('审批中')} }
- +
@@ -194,9 +189,6 @@ export default function ManagementInsideService(){ {...props} style={{ display: 'grid', - // gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', - // gap: '20px', - // padding:'30px', ...style, }} > diff --git a/frontend/packages/market/src/pages/serviceHub/management/ServiceHubManagement.tsx b/frontend/packages/market/src/pages/serviceHub/management/ServiceHubManagement.tsx index 0501c20b..26ea7eb7 100644 --- a/frontend/packages/market/src/pages/serviceHub/management/ServiceHubManagement.tsx +++ b/frontend/packages/market/src/pages/serviceHub/management/ServiceHubManagement.tsx @@ -1,7 +1,7 @@ import { MenuProps, Menu, App, Avatar, Card, Tooltip, Empty } from "antd"; import { useState, forwardRef, useEffect, useRef } from "react"; import { VirtuosoGrid } from "react-virtuoso"; -import { BasicResponse, STATUS_CODE } from "@common/const/const"; +import { BasicResponse, RESPONSE_TIPS, STATUS_CODE } from "@common/const/const"; import { ServiceHubAppListItem } from "../../../const/serviceHub/type"; import { useFetch } from "@common/hooks/http"; import { useBreadcrumb } from "@common/contexts/BreadcrumbContext"; @@ -12,6 +12,7 @@ import { SimpleTeamItem } from "@common/const/type"; import { useTenantManagementContext } from "../../../contexts/TenantManagementContext"; import { Icon } from "@iconify/react/dist/iconify.js"; import { useGlobalContext } from "@common/contexts/GlobalStateContext"; +import { $t } from "@common/locales"; export default function ServiceHubManagement() { const { message ,modal} = App.useApp() @@ -30,14 +31,13 @@ export default function ServiceHubManagement() { const getServiceList = ()=>{ - //console.log(pagination,sorter,categoryId,tagId) setServiceLoading(true) return fetchData>(!checkPermission('system.workspace.application.view_all') ? 'my_apps':'apps',{method:'GET',eoParams:{ team:teamId,keyword:''},eoTransformKeys:['api_num','subscribe_num','subscribe_verify_num']}).then(response=>{ const {code,data,msg} = response if(code === STATUS_CODE.SUCCESS){ setServiceList([...data.apps,{type:'addNewItem'}]) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }).finally(()=>{ setServiceLoading(false) @@ -59,7 +59,7 @@ const getServiceList = ()=>{ navigateTo(data.teams[0].id) } }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }).finally(()=>{ setPageLoading(false) @@ -73,7 +73,7 @@ const getServiceList = ()=>{ let content:string|React.ReactNode = '' switch (type){ case 'add': - title='添加应用' + title=$t('添加应用') content= break; // case 'edit':{ @@ -84,7 +84,7 @@ const getServiceList = ()=>{ // if(code === STATUS_CODE.SUCCESS){ // content= // }else{ - // message.error(msg || '操作失败') + // message.error(msg || RESPONSE_TIPS.error) // return // } // break;} @@ -108,8 +108,8 @@ const getServiceList = ()=>{ } }, width:600, - okText:'确认', - cancelText:'取消', + okText:$t('确认'), + cancelText:$t('取消'), closable:true, icon:<>, }) @@ -128,7 +128,7 @@ useEffect(()=>{ useEffect(() => { setBreadcrumb( [ - {title:'应用'} + {title:$t('应用')} ] ) getTeamsList() @@ -139,7 +139,7 @@ useEffect(() => { teamList && teamList.length > 0 ?
-
团队
+
{$t('团队')}
{ />
-
应用
+
{$t('应用')}
{ return (
{ item.type === 'addNewItem' ?{openModal('add')}}> -
添加应用
+
{$t('添加应用')}
: {setAppName(item.name);navigateTo(`/tenantManagement/${teamId}/inside/${item.id}/service`)}}> - {item.description || '暂无服务描述'} + {item.description || $t('暂无服务描述')} }
); @@ -204,7 +204,7 @@ const CardTitle = (service:ServiceHubAppListItem)=>{

{service.name}

- + {(service.subscribeNum + service.subscribeVerifyNum)?? '-'}
diff --git a/frontend/packages/market/tsconfig.json b/frontend/packages/market/tsconfig.json index 61db1eac..9549c6dc 100644 --- a/frontend/packages/market/tsconfig.json +++ b/frontend/packages/market/tsconfig.json @@ -24,6 +24,6 @@ "@market/*": ["./src/*"] }, }, - "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TransferTable.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/Navigation.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/GroupTree.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../core/src/pages/serviceCategory/ServiceHubCategoryConfig.tsx"], + "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../core/src/pages/serviceCategory/ServiceHubCategoryConfig.tsx"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/frontend/packages/openApi/src/consts/const.tsx b/frontend/packages/openApi/src/consts/const.tsx new file mode 100644 index 00000000..45d21d31 --- /dev/null +++ b/frontend/packages/openApi/src/consts/const.tsx @@ -0,0 +1,49 @@ +import { PageProColumns } from "@common/components/aoplatform/PageList"; +import { OpenApiTableListItem } from "./type"; +import { $t } from "@common/locales/index.ts"; + + +export const OPENAPI_LIST_COLUMNS: PageProColumns[] = [ + { + title:$t('应用名称'), + dataIndex: 'name', + ellipsis:true, + width:160, + fixed:'left' + }, + { + title:$t('应用 ID'), + dataIndex: 'id', + ellipsis:true, + width: 140, + }, + { + title:$t('鉴权 Token'), + dataIndex: 'token', + ellipsis:{ + showTitle:true + } + }, + { + title:$t('关联标签'), + dataIndex: 'tag' + }, + { + title:$t('启用'), + dataIndex: 'status' + }, + { + title:$t('更新者'), + dataIndex: ['operator','name'], + filters: true, + onFilter: true, + valueType: 'select', + filterSearch: true + }, + { + title:$t('更新时间'), + width:182, + dataIndex: 'updateTime', + sorter: (a,b)=>(new Date(a.updateTime)).getTime() - (new Date(b.updateTime)).getTime() + } +]; diff --git a/frontend/packages/openApi/src/consts/type.ts b/frontend/packages/openApi/src/consts/type.ts new file mode 100644 index 00000000..390e25ee --- /dev/null +++ b/frontend/packages/openApi/src/consts/type.ts @@ -0,0 +1,11 @@ +import { EntityItem } from "@common/const/type"; + +export type OpenApiTableListItem = { + id:string; + name: string; + token:string; + tags:string; + status:boolean; + operator:EntityItem; + updateTime:string; +}; \ No newline at end of file diff --git a/frontend/packages/openApi/src/pages/OpenApiConfig.tsx b/frontend/packages/openApi/src/pages/OpenApiConfig.tsx index e8afd6fe..e828eec2 100644 --- a/frontend/packages/openApi/src/pages/OpenApiConfig.tsx +++ b/frontend/packages/openApi/src/pages/OpenApiConfig.tsx @@ -1,10 +1,11 @@ import {App, Form, Input} from "antd"; import {forwardRef, useEffect, useImperativeHandle} from "react"; -import {BasicResponse, STATUS_CODE} from "@common/const/const.ts"; +import {BasicResponse, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE, VALIDATE_MESSAGE} from "@common/const/const.tsx"; import {useFetch} from "@common/hooks/http.ts"; import WithPermission from "@common/components/aoplatform/WithPermission.tsx"; import {v4 as uuidv4} from 'uuid' +import { $t } from "@common/locales"; export type OpenApiConfigFieldType = { id?:string @@ -33,11 +34,11 @@ export const OpenApiConfig = forwardRef( fetchData>('external-app',{method:type === 'add'? 'POST' : 'PUT',eoBody:(value), eoParams:type === 'add' ? {}:{id:entity!.id}}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }).catch((errorInfo)=> reject(errorInfo)) @@ -65,31 +66,29 @@ export const OpenApiConfig = forwardRef( form={form} className="mx-auto " name="OpenApiConfig" - // labelCol={{ offset:1, span: 4 }} - // wrapperCol={{ span: 19}} autoComplete="off" > - label="应用名称" + label={$t("应用名称")} name="name" - rules={[{ required: true, message: '必填项',whitespace:true }]} + rules={[{ required: true, message: VALIDATE_MESSAGE.required,whitespace:true }]} > - + - label="应用 ID" + label={$t("应用 ID")} name="id" - rules={[{ required: true, message: '必填项' ,whitespace:true }]} + rules={[{ required: true, message: VALIDATE_MESSAGE.required ,whitespace:true }]} > - + - + diff --git a/frontend/packages/openApi/src/pages/OpenApiList.tsx b/frontend/packages/openApi/src/pages/OpenApiList.tsx index d8d66246..739e1b97 100644 --- a/frontend/packages/openApi/src/pages/OpenApiList.tsx +++ b/frontend/packages/openApi/src/pages/OpenApiList.tsx @@ -1,71 +1,18 @@ -import PageList from "@common/components/aoplatform/PageList.tsx"; +import PageList, { PageProColumns } from "@common/components/aoplatform/PageList.tsx"; import {useEffect, useRef, useState} from "react"; -import {ActionType, ProColumns} from "@ant-design/pro-components"; +import {ActionType} from "@ant-design/pro-components"; import {useBreadcrumb} from "@common/contexts/BreadcrumbContext.tsx"; import { App, Divider, Switch} from "antd"; import copy from "copy-to-clipboard"; import {useFetch} from "@common/hooks/http.ts"; -import {BasicResponse, STATUS_CODE} from "@common/const/const.ts"; +import {BasicResponse, COLUMNS_TITLE, DELETE_TIPS, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx"; import {OpenApiConfig, OpenApiConfigFieldType, OpenApiConfigHandle} from "./OpenApiConfig.tsx"; -import { EntityItem } from "@common/const/type.ts"; import { SimpleMemberItem } from "@common/const/type.ts"; import TableBtnWithPermission from "@common/components/aoplatform/TableBtnWithPermission.tsx"; import { frontendTimeSorter } from "@common/utils/dataTransfer.ts"; - -type OpenApiTableListItem = { - id:string; - name: string; - token:string; - tags:string; - status:boolean; - operator:EntityItem; - updateTime:string; -}; - -const OPENAPI_LIST_COLUMNS: ProColumns[] = [ - { - title: '应用名称', - dataIndex: 'name', - ellipsis:true, - width:160, - fixed:'left' - }, - { - title: '应用 ID', - dataIndex: 'id', - ellipsis:true, - width: 140, - }, - { - title: '鉴权 Token', - dataIndex: 'token', - ellipsis:{ - showTitle:true - } - }, - { - title: '关联标签', - dataIndex: 'tag' - }, - { - title: '启用', - dataIndex: 'status' - }, - { - title: '更新者', - dataIndex: ['operator','name'], - filters: true, - onFilter: true, - valueType: 'select', - filterSearch: true - }, - { - title: '更新时间', - width:182, - dataIndex: 'updateTime', - sorter: (a,b)=>(new Date(a.updateTime)).getTime() - (new Date(b.updateTime)).getTime() - } -]; +import { OPENAPI_LIST_COLUMNS } from "@market/consts/const.tsx"; +import { OpenApiTableListItem } from "@market/consts/type.ts"; +import { $t } from "@common/locales/index.ts"; export default function OpenApiList(){ @@ -74,7 +21,7 @@ export default function OpenApiList(){ const [init, setInit] = useState(true) const [tableListDataSource, setTableListDataSource] = useState([]); const [tableHttpReload, setTableHttpReload] = useState(true); - const [columns,setColumns] = useState[] >([]) + const [columns,setColumns] = useState[] >([]) const pageListRef = useRef(null); const addOpenApiRef = useRef(null) const editOpenApiRef = useRef(null) @@ -82,21 +29,21 @@ export default function OpenApiList(){ const { setBreadcrumb } = useBreadcrumb() const [memberValueEnum, setMemberValueEnum] = useState<{[k:string]:{text:string}}>({}) - const operation:ProColumns[] =[ + const operation:PageProColumns[] =[ { - title: '操作', + title: COLUMNS_TITLE.operate, key: 'option', - width: 266, + btnNums:4, valueType: 'option', fixed:'right', render: (_: React.ReactNode, entity: OpenApiTableListItem) => [ - {refreshToken(entity)}} btnTitle="更新token"/>, + {refreshToken(entity)}} btnTitle="更新token"/>, , - {copyToken(entity)}} btnTitle="复制token"/>, + {copyToken(entity)}} btnTitle="复制token"/>, , - {openModal('edit',entity)}} btnTitle="编辑"/>, + {openModal('edit',entity)}} btnTitle="编辑"/>, , - {openModal('delete',entity)}} btnTitle="删除"/> + {openModal('delete',entity)}} btnTitle="删除"/> ], } ] @@ -118,7 +65,7 @@ export default function OpenApiList(){ setTableHttpReload(false) return {data:data.apps, success: true} }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) return {data:[], success:false} } }).catch(() => { @@ -130,19 +77,19 @@ export default function OpenApiList(){ fetchData>('external-app/token',{method:'PUT',eoParams:{id:entity.id}}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) manualReloadTable() }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }) } const copyToken = (entity: OpenApiTableListItem)=>{ if(copy(entity.token)){ - message.success('复制成功') + message.success(RESPONSE_TIPS.copySuccess) }else{ - message.error('复制失败,请重试') + message.error(RESPONSE_TIPS.copyError) } } @@ -156,11 +103,11 @@ export default function OpenApiList(){ fetchData>('external-app',{method:'DELETE',eoParams:{id:entity!.id}}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) resolve(true) }else{ - message.error(msg || '操作失败') - reject(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) + reject(msg || RESPONSE_TIPS.error) } }).catch((errorInfo)=> reject(errorInfo)) }) @@ -172,24 +119,24 @@ export default function OpenApiList(){ let content:string|React.ReactNode = '' switch (type){ case 'add': - title='添加 Open Api' + title=$t('添加 Open Api') content= break; case 'edit':{ - title='配置 Open Api' - message.loading('正在加载数据') + title=$t('配置 Open Api') + message.loading(RESPONSE_TIPS.loading) const {code,data,msg} = await fetchData>('external-app',{method:'GET',eoParams:{id:entity!.id}}) message.destroy() if(code === STATUS_CODE.SUCCESS){ content= }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) return } break;} case 'delete': - title='删除' - content='该数据删除后将无法找回,请确认是否删除?' + title=$t('删除') + content=DELETE_TIPS.default break; } @@ -207,8 +154,8 @@ export default function OpenApiList(){ } }, width:600, - okText:'确认', - cancelText:'取消', + okText:$t('确认'), + cancelText:$t('取消'), closable:true, icon:<>, }) @@ -218,10 +165,10 @@ export default function OpenApiList(){ fetchData>(`external-app/${enabled ? 'disable' :'enable'}`,{method:'PUT',eoParams:{id:entity.id}}).then(response=>{ const {code,msg} = response if(code === STATUS_CODE.SUCCESS){ - message.success(msg || '操作成功!') + message.success(msg || RESPONSE_TIPS.success) manualReloadTable() }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }) } @@ -237,13 +184,13 @@ export default function OpenApiList(){ }) setMemberValueEnum(tmpValueEnum) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } } useEffect(() => { - setBreadcrumb([{ title: 'Open Api'}]) + setBreadcrumb([{ title:$t('Open Api')}]) getMemberList() setColumns(OPENAPI_LIST_COLUMNS .map((x)=>{ @@ -269,7 +216,7 @@ export default function OpenApiList(){ dataSource={tableListDataSource} showPagination={false} primaryKey="id" - addNewBtnTitle="添加应用" + addNewBtnTitle={$t("添加应用")} addNewBtnAccess="system.openapi.self.add" onChange={() => { setTableHttpReload(false) diff --git a/frontend/packages/openApi/tsconfig.json b/frontend/packages/openApi/tsconfig.json index 61db1eac..9549c6dc 100644 --- a/frontend/packages/openApi/tsconfig.json +++ b/frontend/packages/openApi/tsconfig.json @@ -24,6 +24,6 @@ "@market/*": ["./src/*"] }, }, - "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TransferTable.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/Navigation.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/GroupTree.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../core/src/pages/serviceCategory/ServiceHubCategoryConfig.tsx"], + "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../core/src/pages/serviceCategory/ServiceHubCategoryConfig.tsx"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/frontend/packages/systemRunning/src/pages/SystemRunning.tsx b/frontend/packages/systemRunning/src/pages/SystemRunning.tsx index ed0be460..541da197 100644 --- a/frontend/packages/systemRunning/src/pages/SystemRunning.tsx +++ b/frontend/packages/systemRunning/src/pages/SystemRunning.tsx @@ -11,9 +11,10 @@ import { PictureTypeEnum, NodeClickItem, GraphData } from "@core/const/system-ru import { UnionFind, edgesFormatter, getNodeSpacing, nodesFormatter } from "@common/utils/systemRunning.ts"; import { EDGE_STYLE, END_ARROW_STYLE, OUT_SPACE_CONTENT_EDGE_COLOR, RELATIVE_PICTURE_NODE_FONTSIZE, SELF_SPACE_CONTENT_EDGE_COLOR, SYSTEM_TUNNING_CONFIG } from "@core/const/system-running/const.ts"; import ReactDOM from "react-dom"; -import {BasicResponse, STATUS_CODE} from "@common/const/const.ts"; +import {BasicResponse, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx"; import SystemRunningInstruction from "./SystemRunningInstruction.tsx"; import { useBreadcrumb } from "@common/contexts/BreadcrumbContext.tsx"; +import { $t } from "@common/locales/index.ts"; export type TopologyItem = { projects:TopologyProjectItem[] @@ -114,9 +115,6 @@ export default function SystemRunning(){ const newNodes = nodesFormatter(projects) const newEdges = edgesFormatter(tmpProjectConnectMap) - // 从 edges 中提取所有唯一的节点 - // const allNodeIds = tmpProjectConnectMap.map(({ source, target }) => source || []).concat(tmpProjectConnectMap.map(({ source, target }) => target || [])).filter(Boolean); - // const nodes: Node[] = allNodeIds.map(id => ({ id })); // 从 edges 中提取所有唯一的节点,并将 Set 转换为数组 const allNodeIds:string[] = Array.from(new Set(newEdges.flatMap(edge => [edge.source, edge.target]))) as string[]; @@ -239,7 +237,7 @@ export default function SystemRunning(){ setShowGraph(newGraphData?.nodes?.length > 0) }else{ - message.error(msg || '操作失败') + message.error(msg || RESPONSE_TIPS.error) } }).finally(()=>setLoading(false)) } @@ -351,7 +349,7 @@ export default function SystemRunning(){ }, defaultEdge: { // type: 'quadratic', - label: '调用服务', + label: $t('调用服务'), labelCfg: { style: { fill: '5B8FF9', @@ -544,24 +542,24 @@ export default function SystemRunning(){ useEffect(() => { - setBreadcrumb([{title:'系统拓扑图'}]) + setBreadcrumb([{title:$t('系统拓扑图')}]) getNodeData() }, []); return (<> { showGraph ? -
-
-
-
-
-
-
-
diff --git a/frontend/packages/systemRunning/src/pages/SystemRunningInstruction.tsx b/frontend/packages/systemRunning/src/pages/SystemRunningInstruction.tsx index 9c72500a..383b716e 100644 --- a/frontend/packages/systemRunning/src/pages/SystemRunningInstruction.tsx +++ b/frontend/packages/systemRunning/src/pages/SystemRunningInstruction.tsx @@ -1,4 +1,5 @@ import { useBreadcrumb } from "@common/contexts/BreadcrumbContext"; +import { $t } from "@common/locales"; import { useEffect } from "react"; import { Link } from "react-router-dom"; export default function SystemRunningInstruction() { @@ -6,7 +7,7 @@ export default function SystemRunningInstruction() { useEffect(()=>{ setBreadcrumb([ - {title:'系统拓扑图'} + {title:$t('系统拓扑图')} ]) },[]) return ( diff --git a/frontend/packages/systemRunning/tsconfig.json b/frontend/packages/systemRunning/tsconfig.json index 7c6fbbf2..e1ba500f 100644 --- a/frontend/packages/systemRunning/tsconfig.json +++ b/frontend/packages/systemRunning/tsconfig.json @@ -23,6 +23,6 @@ "@core/*": ["../core/src/*"], }, }, - "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TransferTable.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/Navigation.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/GroupTree.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../core/src/pages/serviceCategory/ServiceHubCategoryConfig.tsx"], + "include": ["src", "public/iconpark_eolink.js", "public/iconpark_apinto.js", "../common/src/component/aoplatform/EditableTableWithModal.tsx", "../common/src/components/aoplatform/TreeWithMore.tsx", "../common/src/components/aoplatform/DatePicker.tsx", "../common/src/components/aoplatform/TimeRangeSelector.tsx", "../common/src/components/aoplatform/TimePicker.tsx", "../common/src/components/aoplatform/MemberTransfer.tsx", "../common/src/components/aoplatform/PageList.tsx", "../common/src/components/aoplatform/ErrorBoundary.tsx", "../core/src/pages/serviceCategory/ServiceHubCategoryConfig.tsx"], "references": [{ "path": "./tsconfig.node.json" }] }