From b74f4adfd898a65b7d9b09143ef57f5ba66bb803 Mon Sep 17 00:00:00 2001 From: maggieyyy <61950669+maggieyyy@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:58:53 +0800 Subject: [PATCH] feat: Add path match type before api path & Modify Login Page --- frontend/packages/core/src/App.css | 13 ++++ .../packages/core/src/const/system/const.tsx | 5 ++ frontend/packages/core/src/pages/Login.tsx | 23 +++--- .../api/AiServiceInsideRouterCreate.tsx | 70 +++++++++++++++---- .../system/api/SystemInsideRouterCreate.tsx | 67 +++++++++++++----- 5 files changed, 135 insertions(+), 43 deletions(-) diff --git a/frontend/packages/core/src/App.css b/frontend/packages/core/src/App.css index eee93cd3..002fa800 100644 --- a/frontend/packages/core/src/App.css +++ b/frontend/packages/core/src/App.css @@ -272,3 +272,16 @@ a{ stroke: rgba(255, 255, 255, 0.1); mask-image: radial-gradient(100% 100% at top right, white, transparent); } + + .login-block{ + background-color: rgba(255, 255, 255, 0.1); + .login-input{ + color:#fff; + background-color: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.1); + &:hover, &:focus, &.ant-input-status-error, &.ant-input-status-error:hover, &.ant-input-status-error:focus-within{ + background-color: rgba(255, 255, 255, 0.2); + border: 1px solid rgba(255, 255, 255, 0.2); + } + } + } \ No newline at end of file diff --git a/frontend/packages/core/src/const/system/const.tsx b/frontend/packages/core/src/const/system/const.tsx index a1fb3204..ac9a79d7 100644 --- a/frontend/packages/core/src/const/system/const.tsx +++ b/frontend/packages/core/src/const/system/const.tsx @@ -69,6 +69,11 @@ export const API_PROTOCOL = [ {label:'HTTPS',value:'HTTPS'} ] +export const API_PATH_MATCH_RULES = [ + {label:'前缀匹配',value:'prefix'}, + {label:'全等匹配',value:'full'} +] + export const ALGORITHM_ITEM = [ {label:'HS256',value:'HS256'}, diff --git a/frontend/packages/core/src/pages/Login.tsx b/frontend/packages/core/src/pages/Login.tsx index 1a872229..dc59c5d8 100644 --- a/frontend/packages/core/src/pages/Login.tsx +++ b/frontend/packages/core/src/pages/Login.tsx @@ -139,7 +139,7 @@ const Login:FC = ()=> { {/*
*/} -
+
{
-
+
-
-
- {$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..42984e29 100644 --- a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx +++ b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx @@ -1,4 +1,4 @@ -import {App, Button, Form, Input, InputNumber, Row, Spin, Tag} from "antd"; +import {App, Button, Form, Input, InputNumber, Row, Select, Space, Spin, Tag} from "antd"; import { MutableRefObject, useEffect, useRef, useState} from "react"; import {BasicResponse, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx"; import {useFetch} from "@common/hooks/http.ts"; @@ -17,6 +17,8 @@ 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"; type AiServiceRouterField = { name:string @@ -62,8 +64,11 @@ const AiServiceInsideRouterCreate = () => { 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 +97,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 +159,8 @@ const AiServiceInsideRouterCreate = () => { variables:[{key:'Query',value:'',require:true}], prompt:'{{Query}}', retry:0, - timeout:300000 + timeout:300000, + pathMatch:'prefix' }) } return (form.setFieldsValue({})) @@ -230,15 +249,38 @@ const AiServiceInsideRouterCreate = () => { - - className="flex-1" - label={$t("请求路径")} - name="path" - rules={[{ required: true,whitespace:true }]} - > - - + + + + + { + 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/system/api/SystemInsideRouterCreate.tsx b/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx index 62fd6c99..aa1bd0b1 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 = forwardRef - - - label={$t("请求路径")} - name="path" - rules={[{ required: true,whitespace:true }, - { - validator: validateUrlSlash, - }]} - className={styles['form-input-group']} - > - + + + + { + if((e.target.value as string).endsWith('/*')){ + form.setFieldValue('path',e.target.value.slice(0,-2)) + form.setFieldValue('pathMatch','prefix') + } + }}/> + +