You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ju...@apache.org on 2020/06/05 15:51:14 UTC
[incubator-apisix-dashboard] 01/01: fix pr
This is an automated email from the ASF dual-hosted git repository.
juzhiyuan pushed a commit to branch feat-pr
in repository https://gitbox.apache.org/repos/asf/incubator-apisix-dashboard.git
commit f1e875b404d1c11c43573e53f7fb839520ebc7e0
Author: juzhiyuan <jj...@gmail.com>
AuthorDate: Fri Jun 5 21:06:54 2020 +0800
fix pr
fix some issue for creating route
fix: typing for Route
feat: update plugin
feat: added
feat:
---
src/app.tsx | 3 +-
src/pages/Routes/Create.tsx | 2 ++
src/pages/Routes/List.tsx | 18 ++++++------
.../Routes/components/CreateStep3/CreateStep3.tsx | 7 +++--
.../Routes/components/CreateStep3/PluginDrawer.tsx | 2 +-
.../Routes/components/ResultView/ResultView.tsx | 12 ++------
.../Routes/components/Step1/MatchingRulesView.tsx | 7 +++--
.../Routes/components/Step1/RequestConfigView.tsx | 8 ++++--
src/pages/Routes/service.ts | 7 +++--
src/pages/Routes/transform.ts | 32 +++++++++++++---------
src/pages/Routes/typing.d.ts | 6 ++--
11 files changed, 58 insertions(+), 46 deletions(-)
diff --git a/src/app.tsx b/src/app.tsx
index be1c18c..6faa1f1 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -68,7 +68,8 @@ const codeMessage = {
const errorHandler = (error: { response: Response; data: any }): Promise<Response> => {
const { response } = error;
if (response && response.status) {
- const errorText = error.data.message || error.data.error_msg || codeMessage[response.status];
+ const errorText =
+ error.data.msg || error.data.message || error.data.error_msg || codeMessage[response.status];
notification.error({
message: `请求错误,错误码: ${error.data.errorCode || response.status}`,
diff --git a/src/pages/Routes/Create.tsx b/src/pages/Routes/Create.tsx
index f759833..c1ab25b 100644
--- a/src/pages/Routes/Create.tsx
+++ b/src/pages/Routes/Create.tsx
@@ -55,7 +55,9 @@ const Create: React.FC = (props) => {
if ((props as any).route.name === 'edit') {
initRoute((props as any).match.params.rid);
}
+ }, []);
+ useEffect(() => {
if (step1Data.redirectURI !== '') {
if (step1Data.forceHttps) {
setStep1Data({ ...step1Data, redirectURI: '' });
diff --git a/src/pages/Routes/List.tsx b/src/pages/Routes/List.tsx
index cc6d6dc..3ff532f 100644
--- a/src/pages/Routes/List.tsx
+++ b/src/pages/Routes/List.tsx
@@ -13,18 +13,20 @@ const RouteList: React.FC = () => {
const columns: ProColumns<ListItem<RouteModule.BaseData>>[] = [
{
- title: 'ID',
- dataIndex: 'id',
- sortOrder: 'descend',
- hideInSearch: true,
- },
- {
title: '名称',
dataIndex: 'name',
},
{
+ title: '优先级',
+ dataIndex: 'priority',
+ },
+ {
title: '描述',
- dataIndex: 'desc',
+ dataIndex: 'description',
+ },
+ {
+ title: '更新时间',
+ dataIndex: 'update_time',
},
{
title: '操作',
@@ -61,7 +63,7 @@ const RouteList: React.FC = () => {
<PageHeaderWrapper>
<ProTable<ListItem<RouteModule.BaseData>>
actionRef={ref}
- rowKey="id"
+ rowKey="name"
request={() => fetchRouteList()}
columns={columns}
search={false}
diff --git a/src/pages/Routes/components/CreateStep3/CreateStep3.tsx b/src/pages/Routes/components/CreateStep3/CreateStep3.tsx
index 2803b56..5f5f266 100644
--- a/src/pages/Routes/components/CreateStep3/CreateStep3.tsx
+++ b/src/pages/Routes/components/CreateStep3/CreateStep3.tsx
@@ -99,9 +99,10 @@ const CreateStep3: React.FC<Props> = ({ data, disabled, onChange }) => {
setCurrentPlugin(undefined);
}}
onClose={() => setCurrentPlugin(undefined)}
- onFinish={(value) =>
- onChange(merge(data.step3Data, { plugins: { [currentPlugin as string]: value } }))
- }
+ onFinish={(value) => {
+ onChange(merge(data.step3Data, { plugins: { [currentPlugin as string]: value } }));
+ setCurrentPlugin(undefined);
+ }}
/>
</>
);
diff --git a/src/pages/Routes/components/CreateStep3/PluginDrawer.tsx b/src/pages/Routes/components/CreateStep3/PluginDrawer.tsx
index 366bce7..b26d63f 100644
--- a/src/pages/Routes/components/CreateStep3/PluginDrawer.tsx
+++ b/src/pages/Routes/components/CreateStep3/PluginDrawer.tsx
@@ -57,7 +57,7 @@ const PluginDrawer: React.FC<Props> = ({
style={{ marginRight: 8, marginLeft: 8 }}
onClick={() => form.submit()}
>
- 提交
+ 确认
</Button>
</div>
)}
diff --git a/src/pages/Routes/components/ResultView/ResultView.tsx b/src/pages/Routes/components/ResultView/ResultView.tsx
index 3297040..9b81812 100644
--- a/src/pages/Routes/components/ResultView/ResultView.tsx
+++ b/src/pages/Routes/components/ResultView/ResultView.tsx
@@ -1,25 +1,19 @@
import React from 'react';
import { Result, Button } from 'antd';
+import { history } from 'umi';
type Props = {
onReset?(): void;
};
-const ResultView: React.FC<Props> = ({ onReset }) => (
+const ResultView: React.FC<Props> = () => (
<Result
status="success"
title="提交成功"
extra={[
- <Button
- type="primary"
- key="goto-list"
- onClick={() => window.location.replace('/dashboard/routes')}
- >
+ <Button type="primary" key="goto-list" onClick={() => history.replace('/routes')}>
返回路由列表
</Button>,
- <Button key="create" onClick={onReset}>
- 创建新路由
- </Button>,
]}
/>
);
diff --git a/src/pages/Routes/components/Step1/MatchingRulesView.tsx b/src/pages/Routes/components/Step1/MatchingRulesView.tsx
index 994955e..5d0d991 100644
--- a/src/pages/Routes/components/Step1/MatchingRulesView.tsx
+++ b/src/pages/Routes/components/Step1/MatchingRulesView.tsx
@@ -129,7 +129,7 @@ const MatchingRulesView: React.FC<Props> = ({ data, disabled, onChange }) => {
const renderModal = () => {
return (
<Modal
- title={mode === 'EDIT' ? '编辑' : '增加'}
+ title={mode === 'EDIT' ? '编辑规则' : '增加规则'}
centered
visible={visible}
onOk={onOk}
@@ -150,9 +150,9 @@ const MatchingRulesView: React.FC<Props> = ({ data, disabled, onChange }) => {
<Select
onChange={(value) => {
if (value === 'http') {
- setNamePlaceholder('请求头名字比如:Host');
+ setNamePlaceholder('请求头键名:例如 HOST');
} else {
- setNamePlaceholder('比如:name');
+ setNamePlaceholder('参数名称:例如 id');
}
}}
>
@@ -165,6 +165,7 @@ const MatchingRulesView: React.FC<Props> = ({ data, disabled, onChange }) => {
label="参数名称"
name="name"
rules={[{ required: true, message: '请输入参数名称' }]}
+ extra="只支持字母和数字,并且以字母开头"
>
<Input placeholder={namePlaceholder} />
</Form.Item>
diff --git a/src/pages/Routes/components/Step1/RequestConfigView.tsx b/src/pages/Routes/components/Step1/RequestConfigView.tsx
index 09c486c..65f4403 100644
--- a/src/pages/Routes/components/Step1/RequestConfigView.tsx
+++ b/src/pages/Routes/components/Step1/RequestConfigView.tsx
@@ -32,7 +32,7 @@ const RequestConfigView: React.FC<Props> = ({ data, disabled, onChange }) => {
label={index === 0 ? '域名' : ''}
required
key={field.key}
- extra='域名或 IP:支持泛域名,如 "\*.test.com"'
+ extra={index === 0 ? '域名或 IP:支持泛域名,如 "*.test.com"' : ''}
>
<Form.Item
{...field}
@@ -89,7 +89,11 @@ const RequestConfigView: React.FC<Props> = ({ data, disabled, onChange }) => {
extra='请求路径,如 "/foo/index.html",支持请求路径前缀 "/foo/\*"'
>
<Form.Item {...field} validateTrigger={['onChange', 'onBlur']} noStyle>
- <Input placeholder="请输入请求路径" style={{ width: '60%' }} disabled={disabled} />
+ <Input
+ placeholder="请输入请求路径"
+ style={{ width: '60%' }}
+ disabled={disabled}
+ />
</Form.Item>
{!disabled && (
<MinusCircleOutlined
diff --git a/src/pages/Routes/service.ts b/src/pages/Routes/service.ts
index a7e5b5c..9300030 100644
--- a/src/pages/Routes/service.ts
+++ b/src/pages/Routes/service.ts
@@ -2,8 +2,8 @@ import { request } from 'umi';
import { transformStepData, transformRouteData } from './transform';
-export const createRoute = (data: Pick<RouteModule.Data, 'data'>) =>
- request('/workspaces/default/routes', {
+export const createRoute = (data: Pick<RouteModule.Data, 'data'>, wid = 0) =>
+ request(`/workspaces/${wid}/routes`, {
method: 'POST',
data: transformStepData(data),
});
@@ -19,4 +19,5 @@ export const fetchRoute = (rid: number, wid = 0) =>
export const fetchRouteList = (wid = 0) => request(`/workspaces/${wid}/routes?page=1&size=100000`);
-export const removeRoute = (rid: number, wid = 0) => request(`/workspaces/${wid}/routes/${rid}`);
+export const removeRoute = (rid: number, wid = 0) =>
+ request(`/workspaces/${wid}/routes/${rid}`, { method: 'DELETE' });
diff --git a/src/pages/Routes/transform.ts b/src/pages/Routes/transform.ts
index 008e41e..3baa679 100644
--- a/src/pages/Routes/transform.ts
+++ b/src/pages/Routes/transform.ts
@@ -15,7 +15,7 @@ export const transformStepData = ({
let redirect: RouteModule.Redirect = {};
if (step1Data.forceHttps) {
- redirect = { redirect_to_https: true };
+ redirect = { http_to_https: true };
} else if (step1Data.redirectURI !== '') {
redirect = {
code: step1Data.redirectCode,
@@ -66,10 +66,9 @@ export const transformStepData = ({
}
// 未启用 redirect
- if (!redirect.uri && !redirect.redirect_to_https) {
+ if (!redirect.uri) {
// 移除前端部分自定义变量
return omit(data, [
- 'redirect',
'advancedMatchingRules',
'upstreamHostList',
'upstreamPath',
@@ -79,6 +78,7 @@ export const transformStepData = ({
'redirectURI',
'redirectCode',
'forceHttps',
+ Object.keys(redirect).length === 0 ? 'redirect' : '',
]);
}
@@ -86,7 +86,7 @@ export const transformStepData = ({
};
const transformVarsToRules = (
- data: [string, RouteModule.Operator, string][],
+ data: [string, RouteModule.Operator, string][] = [],
): RouteModule.MatchingRule[] =>
data.map(([key, operator, value]) => {
const [position, name] = key.split('_');
@@ -99,8 +99,10 @@ const transformVarsToRules = (
};
});
-const transformUpstreamNodes = (nodes: { [key: string]: number }): RouteModule.UpstreamHost[] => {
- const data: RouteModule.UpstreamHost[] = [];
+const transformUpstreamNodes = (
+ nodes: { [key: string]: number } = {},
+): RouteModule.UpstreamHost[] => {
+ const data: RouteModule.UpstreamHost[] = [{} as RouteModule.UpstreamHost];
Object.entries(nodes).forEach(([k, v]) => {
const [host, port] = k.split(':');
data.push({ host, port: Number(port), weight: Number(v) });
@@ -120,17 +122,17 @@ export const transformRouteData = (data: RouteModule.Body) => {
paths: uris,
methods,
advancedMatchingRules: transformVarsToRules(vars),
- forceHttps: Boolean(redirect.redirect_to_https),
+ forceHttps: Boolean(redirect?.http_to_https),
};
- if (redirect.uri) {
+ if (redirect?.uri) {
step1Data.redirectCode = redirect.code;
step1Data.redirectURI = redirect.uri;
}
- const { upstream, upstream_path, upstream_header, upstream_protocol } = data;
+ const { upstream, upstream_path, upstream_header, upstream_protocol = 'keep' } = data;
- const upstreamHeaderList = Object.entries(upstream_header).map(([k, v]) => {
+ const upstreamHeaderList = Object.entries(upstream_header || {}).map(([k, v]) => {
return {
header_name: k,
header_value: v,
@@ -142,9 +144,13 @@ export const transformRouteData = (data: RouteModule.Body) => {
const step2Data: RouteModule.Step2Data = {
upstream_protocol,
upstreamHeaderList,
- upstreamHostList: transformUpstreamNodes(upstream.nodes),
- upstreamPath: upstream_path.to,
- timeout: upstream.timeout,
+ upstreamHostList: transformUpstreamNodes(upstream?.nodes),
+ upstreamPath: upstream_path?.to,
+ timeout: upstream?.timeout || {
+ connect: 6000,
+ send: 6000,
+ read: 6000,
+ },
};
const { plugins } = data;
diff --git a/src/pages/Routes/typing.d.ts b/src/pages/Routes/typing.d.ts
index a19273b..6b42531 100644
--- a/src/pages/Routes/typing.d.ts
+++ b/src/pages/Routes/typing.d.ts
@@ -82,7 +82,7 @@ declare namespace RouteModule {
type Redirect = {
code?: number;
uri?: string;
- redirect_to_https?: boolean;
+ http_to_https?: boolean;
};
// Request Body or Response Data for API
@@ -95,7 +95,7 @@ declare namespace RouteModule {
uris: string[];
hosts: string[];
protocols: RequestProtocol[];
- redirect: Redirect;
+ redirect?: Redirect;
vars: [string, Operator, string][];
upstream: {
type: 'roundrobin' | 'chash';
@@ -108,7 +108,7 @@ declare namespace RouteModule {
read: number;
};
};
- upstream_path: {
+ upstream_path?: {
from?: string;
to: string;
};