-
-
- {$t('登录')}
-
-
-
{
rules={[{ required: true, message: $t('请输入账号') ,whitespace:true }]}
>
{
@@ -209,8 +205,9 @@ const Login:FC = ()=> {
- {$t('Version (0)-(1)',[state.version,state.updateDate])}
- {$t(state.powered)}
+
+ {$t('Version (0)-(1)',[state.version,state.updateDate])}, {$t(state.powered)}
+
diff --git a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx
index 69f14b86..0377e05e 100644
--- a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx
+++ b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx
@@ -1,5 +1,5 @@
-import {App, Button, Form, Input, InputNumber, Row, Spin, Tag} from "antd";
-import { MutableRefObject, useEffect, useRef, useState} from "react";
+import {App, Button, Form, Input, InputNumber, Row, Select, Space, Spin, Tag} from "antd";
+import { MutableRefObject, useEffect, useMemo, useRef, useState} from "react";
import {BasicResponse, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx";
import {useFetch} from "@common/hooks/http.ts";
import { $t } from "@common/locales/index.ts";
@@ -17,6 +17,9 @@ import { DrawerWithFooter } from "@common/components/aoplatform/DrawerWithFooter
import AiServiceRouterModelConfig, { AiServiceRouterModelConfigHandle } from "./AiServiceInsideRouterModelConfig";
import { AiProviderDefaultConfig, AiProviderLlmsItems } from "@core/pages/aiSetting/AiSettingList";
import { EditableFormInstance } from "@ant-design/pro-components";
+import { validateUrlSlash } from "@common/utils/validate";
+import { API_PATH_MATCH_RULES } from "@core/const/system/const";
+import { useGlobalContext } from "@common/contexts/GlobalStateContext";
type AiServiceRouterField = {
name:string
@@ -59,11 +62,16 @@ const AiServiceInsideRouterCreate = () => {
const [defaultLlm, setDefaultLlm] = useState
()
const [llmList, setLlmList] = useState([])
const [variablesTableRef, setVariablesTableRef] = useState | undefined>>()
+ const {state} = useGlobalContext()
+
const onFinish = ()=>{
return variablesTableRef?.current?.validateFields().then(()=>{
return form.validateFields().then((formValue)=>{
- const {name, path, description, variables, prompt, timeout, retry} = formValue
- const body = {name, path: prefixForce ? `${apiPrefix}/${path}`:path , description,timeout, retry,aiPrompt:{variables:variables, prompt:prompt},aiModel:{id:defaultLlm?.id, provider:defaultLlm?.provider, config:defaultLlm?.config}}
+ const {name, path, description, variables, prompt, timeout, retry,pathMatch} = formValue
+ const body = {
+ name,
+ path: `${prefixForce ? apiPrefix + '/' : ''}${path.trim()}${pathMatch === 'prefix' ? '/*' : ''}`,
+ description,timeout, retry,aiPrompt:{variables:variables, prompt:prompt},aiModel:{id:defaultLlm?.id, provider:defaultLlm?.provider, config:defaultLlm?.config}}
return fetchData>('service/ai-router',{method: routeId ? 'PUT' : 'POST',eoBody:(body), eoParams: {service:serviceId,team:teamId, ...(routeId ? {router:routeId}: {})},eoTransformKeys:['aiPrompt','aiModel']}).then(response=>{
const {code,msg} = response
if(code === STATUS_CODE.SUCCESS){
@@ -92,7 +100,20 @@ const AiServiceInsideRouterCreate = () => {
const {code,data,msg} = response
if(code === STATUS_CODE.SUCCESS){
const {path, aiPrompt,aiModel} = data.api
- form.setFieldsValue({...data.api,...aiPrompt, path:prefixForce && path?.startsWith(apiPrefix + '/')? path.slice((apiPrefix?.length || 0) + 1) : path })
+ let newPath = path
+ let pathMatch = 'full'
+ if(prefixForce && path?.startsWith(apiPrefix + '/')){
+ newPath = path.slice((apiPrefix?.length || 0) + 1)
+ }
+ if(newPath.endsWith('/*')){
+ newPath = newPath.slice(0,-2)
+ pathMatch = 'prefix'
+ }
+ form.setFieldsValue({
+ ...data.api,
+ ...aiPrompt,
+ path:newPath,
+ pathMatch})
setVariablesTable(aiPrompt.variables as VariableItems[])
setDefaultLlm(prev => ({...prev, provider: aiModel?.provider, id:aiModel?.id, config:aiModel.config}) as (AiProviderDefaultConfig & { config: string; }))
getDefaultModelConfig(aiModel?.provider)
@@ -141,7 +162,8 @@ const AiServiceInsideRouterCreate = () => {
variables:[{key:'Query',value:'',require:true}],
prompt:'{{Query}}',
retry:0,
- timeout:300000
+ timeout:300000,
+ pathMatch:'prefix'
})
}
return (form.setFieldsValue({}))
@@ -185,6 +207,9 @@ const AiServiceInsideRouterCreate = () => {
setDrawerType(undefined);
};
+ const apiPathMatchRulesOptions = useMemo(()=>API_PATH_MATCH_RULES.map(
+ x=>({label:$t(x.label), value:x.value})),[state.language])
+
return (
{
-
- className="flex-1"
- label={$t("请求路径")}
- name="path"
- rules={[{ required: true,whitespace:true }]}
- >
-
-
+
+
+
+
+
+
+
+ name="path"
+ rules={[{ required: true,whitespace:true },
+ {
+ validator: validateUrlSlash,
+ }]}
+ noStyle
+ >
+ {
+ if((e.target.value as string).endsWith('/*')){
+ form.setFieldValue('path',e.target.value.slice(0,-2))
+ form.setFieldValue('pathMatch','prefix')
+ }
+ }}/>
+
+
+
+
diff --git a/frontend/packages/core/src/pages/aiSetting/AiSettingList.tsx b/frontend/packages/core/src/pages/aiSetting/AiSettingList.tsx
index 5bcf9bef..a4c8591d 100644
--- a/frontend/packages/core/src/pages/aiSetting/AiSettingList.tsx
+++ b/frontend/packages/core/src/pages/aiSetting/AiSettingList.tsx
@@ -164,7 +164,10 @@ const AiSettingList = ()=>{
return (
-
+
+
+ {provider.name}
+
{provider.configured ? $t('已配置') : $t('未配置')}
diff --git a/frontend/packages/core/src/pages/guide/Guide.tsx b/frontend/packages/core/src/pages/guide/Guide.tsx
index 8e478c84..ef3045ed 100644
--- a/frontend/packages/core/src/pages/guide/Guide.tsx
+++ b/frontend/packages/core/src/pages/guide/Guide.tsx
@@ -30,7 +30,7 @@ export default function Guide(){
},
{
title: $t("创建调用 Token"),
- description: $t('为了安全地调用 API,你需要创建一个应用以及Token。'),
+ description: $t('为了安全地调用 API,你需要创建一个消费者以及Token。'),
link: 'https://docs.apipark.com/docs/quick/suberscriber/application'
},
{
@@ -50,7 +50,7 @@ export default function Guide(){
},
{
title: $t("创建调用 Token"),
- description: $t('为了安全地调用 API,你需要创建一个应用以及Token。'),
+ description: $t('为了安全地调用 API,你需要创建一个消费者以及Token。'),
link: 'https://docs.apipark.com/docs/quick/suberscriber/subscribe'
},
{
@@ -82,7 +82,7 @@ export default function Guide(){
},
{
title: $t("团队"),
- description: $t('团队中包含了人员、应用和服务,不同团队之间的应用和服务数据是隔离的,可用于管理企业内部不同的部门/项目组/团队。'),
+ description: $t('团队中包含了人员、消费者和服务,不同团队之间的消费者和服务数据是隔离的,可用于管理企业内部不同的部门/项目组/团队。'),
link: 'https://docs.apipark.com/docs/quick/provider/service'
},
{
@@ -102,7 +102,7 @@ export default function Guide(){
},
{
title: $t("审核订阅申请"),
- description: $t('提供服务的团队可以审核来自其他团队的订阅申请,审核通过后的应用才可发起 API 请求。'),
+ description: $t('提供服务的团队可以审核来自其他团队的订阅申请,审核通过后的消费者才可发起 API 请求。'),
link: 'https://docs.apipark.com/docs/quick/suberscriber/subscribe'
}
]
diff --git a/frontend/packages/core/src/pages/system/SystemList.tsx b/frontend/packages/core/src/pages/system/SystemList.tsx
index 5a4776ef..8f53ae96 100644
--- a/frontend/packages/core/src/pages/system/SystemList.tsx
+++ b/frontend/packages/core/src/pages/system/SystemList.tsx
@@ -14,7 +14,6 @@ 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";
import InsidePage from "@common/components/aoplatform/InsidePage.tsx";
const SystemList:FC = ()=>{
@@ -37,7 +36,7 @@ const SystemList:FC = ()=>{
getGlobalAccessData()?.then?.(()=>{
getSystemList()
})
- return
+ return Promise.resolve({data:[], success:false})
}
if(!tableHttpReload){
setTableHttpReload(true)
diff --git a/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx b/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx
index 62fd6c99..7721d564 100644
--- a/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx
+++ b/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx
@@ -1,10 +1,10 @@
-import {App, Button, Col, Form, Input, Row, Select, Spin, Switch} from "antd";
+import {App, Button, Col, Form, Input, Row, Select, Space, Spin, Switch} from "antd";
import {forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState} from "react";
import EditableTableWithModal from "@common/components/aoplatform/EditableTableWithModal.tsx";
import styles from "./SystemInsideApi.module.css"
import {BasicResponse, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx";
import {useFetch} from "@common/hooks/http.ts";
-import { API_PROTOCOL, HTTP_METHOD, MATCH_CONFIG, MatchPositionEnum, MatchTypeEnum } from "../../../const/system/const.tsx";
+import { API_PATH_MATCH_RULES, API_PROTOCOL, HTTP_METHOD, MATCH_CONFIG, MatchPositionEnum, MatchTypeEnum } from "../../../const/system/const.tsx";
import { SystemInsideRouterCreateHandle, SystemInsideRouterCreateProps, SystemApiProxyFieldType, SystemInsideApiProxyHandle } from "../../../const/system/type.ts";
import { MatchItem } from "@common/const/type.ts";
import { validateUrlSlash } from "@common/utils/validate.ts";
@@ -31,7 +31,7 @@ const SystemInsideRouterCreate = forwardRef{
return Promise.all([proxyRef.current?.validate?.(), form.validateFields()]).then(([,formValue])=>{
const body = {...formValue,
- path: prefixForce? `${apiPrefix}/${formValue.path.trim()}` : formValue.path.trim(),
+ path: `${prefixForce ? apiPrefix + '/' : ''}${formValue.path.trim()}${formValue.pathMatch === 'prefix' ? '/*' : ''}`,
proxy:{...formValue.proxy,path:formValue.proxy.path ? (formValue.proxy.path.startsWith('/')? formValue.proxy.path: '/'+ formValue.proxy.path) : undefined}}
return fetchData>('service/router',{
method: routeId ? 'PUT' :'POST' ,eoBody:(body), eoParams: {service:serviceId,team:teamId, router:routeId },eoTransformKeys:['matchType','disable']}).then(response=>{
@@ -77,7 +77,24 @@ const SystemInsideRouterCreate = forwardRefAPI_PATH_MATCH_RULES.map(
+ x=>({label:$t(x.label), value:x.value})),[state.language])
return (
-
-
- label={$t("请求路径")}
- name="path"
- rules={[{ required: true,whitespace:true },
- {
- validator: validateUrlSlash,
- }]}
- className={styles['form-input-group']}
- >
-
+
+
+
+
+
+
+ name="path"
+ rules={[{ required: true,whitespace:true },
+ {
+ validator: validateUrlSlash,
+ }]}
+ noStyle
+ >
+ {
+ if((e.target.value as string).endsWith('/*')){
+ form.setFieldValue('path',e.target.value.slice(0,-2))
+ form.setFieldValue('pathMatch','prefix')
+ }
+ }}/>
+
+
diff --git a/frontend/packages/core/src/pages/team/TeamList.tsx b/frontend/packages/core/src/pages/team/TeamList.tsx
index 1fba9241..b7d87645 100644
--- a/frontend/packages/core/src/pages/team/TeamList.tsx
+++ b/frontend/packages/core/src/pages/team/TeamList.tsx
@@ -165,7 +165,7 @@ const TeamList:FC = ()=>{
return (
diff --git a/frontend/packages/dashboard/src/component/MonitorAppPage.tsx b/frontend/packages/dashboard/src/component/MonitorAppPage.tsx
index b76bcfbc..1d3e45aa 100644
--- a/frontend/packages/dashboard/src/component/MonitorAppPage.tsx
+++ b/frontend/packages/dashboard/src/component/MonitorAppPage.tsx
@@ -99,7 +99,7 @@ export default function MonitorAppPage(props:MonitorAppPageProps){
fetchTableData(data).then((resp) => {
const {code,data,msg} = resp
if(code === STATUS_CODE.SUCCESS){
- exportExcel($t('应用调用统计'), [query!.start!, query!.end!], $t('应用调用统计'), '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 || $t(RESPONSE_TIPS.dataError))
}
@@ -144,13 +144,13 @@ export default function MonitorAppPage(props:MonitorAppPageProps){
onTimeRangeChange={handleTimeRangeChange}/>
-
+
)
@@ -186,7 +186,7 @@ const CardTitle = (service:ServiceHubTableListItem)=>{
{service.apiNum ?? '-'}
-
+
{service.subscriberNum ?? '-'}
diff --git a/frontend/packages/market/src/pages/serviceHub/management/ManagementAppSetting.tsx b/frontend/packages/market/src/pages/serviceHub/management/ManagementAppSetting.tsx
index f908907d..657db628 100644
--- a/frontend/packages/market/src/pages/serviceHub/management/ManagementAppSetting.tsx
+++ b/frontend/packages/market/src/pages/serviceHub/management/ManagementAppSetting.tsx
@@ -8,7 +8,7 @@ export default function ManagementAppSetting(){
return (
-
{$t('应用管理')}
+
{$t('消费者管理')}
diff --git a/frontend/packages/market/src/pages/serviceHub/management/ManagementConfig.tsx b/frontend/packages/market/src/pages/serviceHub/management/ManagementConfig.tsx
index 45a478c7..f57194fa 100644
--- a/frontend/packages/market/src/pages/serviceHub/management/ManagementConfig.tsx
+++ b/frontend/packages/market/src/pages/serviceHub/management/ManagementConfig.tsx
@@ -96,7 +96,7 @@ const ManagementConfig = forwardRef
- label={$t("应用名称")}
+ label={$t("消费者名称")}
name="name"
rules={[{ required: true,whitespace:true }]}
>
@@ -139,7 +139,7 @@ const ManagementConfig = forwardRef
- label={$t("应用 ID")}
+ label={$t("消费者 ID")}
name="id"
rules={[{ required: true ,whitespace:true }]}
>
@@ -167,10 +167,10 @@ const ManagementConfig = forwardRef
-
{$t('删除应用')}:{$t('删除操作不可恢复,请谨慎操作!')}
+
{$t('删除消费者')}:{$t('删除操作不可恢复,请谨慎操作!')}
-
+
diff --git a/frontend/packages/market/src/pages/serviceHub/management/ManagementInsidePage.tsx b/frontend/packages/market/src/pages/serviceHub/management/ManagementInsidePage.tsx
index 58f42fc9..994ba88e 100644
--- a/frontend/packages/market/src/pages/serviceHub/management/ManagementInsidePage.tsx
+++ b/frontend/packages/market/src/pages/serviceHub/management/ManagementInsidePage.tsx
@@ -32,7 +32,7 @@ export default function ManagementInsidePage(){
const TENANT_MANAGEMENT_APP_MENU: MenuProps['items'] = useMemo(()=>[
getItem($t('订阅的服务'), 'service'),
getItem($t('访问授权'), 'authorization'),
- getItem($t('应用管理'), 'setting'),
+ getItem($t('消费者管理'), 'setting'),
],[state.language])
const menuData = useMemo(()=>{
@@ -45,7 +45,7 @@ export default function ManagementInsidePage(){
const onMenuClick: MenuProps['onClick'] = (node) => {
setActiveMenu(node.key)
- navigateTo(`/tenantManagement/${teamId}/inside/${appId}/${node.key}`)
+ navigateTo(`/consumer/${teamId}/inside/${appId}/${node.key}`)
};
useEffect(()=>{
@@ -60,7 +60,7 @@ export default function ManagementInsidePage(){
}
setBreadcrumb(
[
- {title:{$t('应用')}},
+ {title:{$t('消费者')}},
...(_appName ? [{title:_appName}] : [])
]
)
@@ -84,7 +84,7 @@ useEffect(()=>{
-
+
)
-}
\ No newline at end of file
+}
+
+
+type TableAreaProps = {
+ language:string
+ getServiceList:()=>Promise<{data:ServiceHubAppListItem[], success:boolean}>
+ addNewApp:()=>Promise
+ setTableHttpReload:(b:boolean)=>void
+ setTableSearchWord:(s:string)=>void
+ editApp:(item:ServiceHubAppListItem)=>void
+}
+
+const TableArea = memo(({language, getServiceList, addNewApp, setTableHttpReload, setTableSearchWord, editApp}:TableAreaProps)=>{
+ const columns = useMemo(()=>{
+ const res = SERVICE_HUB_TABLE_COLUMNS.map(x=>{
+ return {...x,title:typeof x.title === 'string' ? $t(x.title as string) : x.title}})
+ return res
+ },[language])
+
+ return (
+ getServiceList()}
+ addNewBtnTitle={$t("添加服务")}
+ searchPlaceholder={$t("输入名称、ID 查找服务")}
+ onAddNewBtnClick={addNewApp}
+ onChange={() => {
+ setTableHttpReload(false)
+ }}
+ onSearchWordChange={(e) => {
+ setTableSearchWord(e.target.value)
+ }}
+ onRowClick={(row:ServiceHubAppListItem)=>editApp(row)}
+ />
+ )})
\ No newline at end of file
diff --git a/frontend/packages/openApi/src/consts/const.tsx b/frontend/packages/openApi/src/consts/const.tsx
index 45d21d31..648aaf2c 100644
--- a/frontend/packages/openApi/src/consts/const.tsx
+++ b/frontend/packages/openApi/src/consts/const.tsx
@@ -5,14 +5,14 @@ import { $t } from "@common/locales/index.ts";
export const OPENAPI_LIST_COLUMNS: PageProColumns[] = [
{
- title:$t('应用名称'),
+ title:$t('消费者名称'),
dataIndex: 'name',
ellipsis:true,
width:160,
fixed:'left'
},
{
- title:$t('应用 ID'),
+ title:$t('消费者 ID'),
dataIndex: 'id',
ellipsis:true,
width: 140,
diff --git a/frontend/packages/openApi/src/pages/OpenApiConfig.tsx b/frontend/packages/openApi/src/pages/OpenApiConfig.tsx
index e1c00a4f..ff7029c7 100644
--- a/frontend/packages/openApi/src/pages/OpenApiConfig.tsx
+++ b/frontend/packages/openApi/src/pages/OpenApiConfig.tsx
@@ -69,7 +69,7 @@ export const OpenApiConfig = forwardRef(
autoComplete="off"
>
- label={$t("应用名称")}
+ label={$t("消费者名称")}
name="name"
rules={[{ required: true,whitespace:true }]}
>
@@ -77,7 +77,7 @@ export const OpenApiConfig = forwardRef(
- label={$t("应用 ID")}
+ label={$t("消费者 ID")}
name="id"
rules={[{ required: true ,whitespace:true }]}
>
diff --git a/frontend/packages/openApi/src/pages/OpenApiList.tsx b/frontend/packages/openApi/src/pages/OpenApiList.tsx
index bb16eda2..b4f16c71 100644
--- a/frontend/packages/openApi/src/pages/OpenApiList.tsx
+++ b/frontend/packages/openApi/src/pages/OpenApiList.tsx
@@ -216,7 +216,7 @@ export default function OpenApiList(){
dataSource={tableListDataSource}
showPagination={false}
primaryKey="id"
- addNewBtnTitle={$t("添加应用")}
+ addNewBtnTitle={$t("添加消费者")}
addNewBtnAccess="system.openapi.self.add"
onChange={() => {
setTableHttpReload(false)