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;
     };