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:54:04 UTC

[incubator-apisix-dashboard] branch next updated (6313553 -> 5836b69)

This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a change to branch next
in repository https://gitbox.apache.org/repos/asf/incubator-apisix-dashboard.git.


 discard 6313553  feat: update plugin
 discard 7fd8563  fix: typing for Route
 discard 620162d  fix some issue for creating route
 discard fddbc83  fix pr
     new 5836b69  fix some issue for creating route

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (6313553)
            \
             N -- N -- N   refs/heads/next (5836b69)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../Routes/components/ResultView/ResultView.tsx      |  7 ++-----
 .../Routes/components/Step1/MatchingRulesView.tsx    |  2 +-
 src/pages/Routes/service.ts                          |  6 +++---
 src/pages/Routes/transform.ts                        | 20 +++++++++++++-------
 4 files changed, 19 insertions(+), 16 deletions(-)


[incubator-apisix-dashboard] 01/01: fix some issue for creating route

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch next
in repository https://gitbox.apache.org/repos/asf/incubator-apisix-dashboard.git

commit 5836b69ea0946ec121ecd61fc3ffbaf2585a1f4f
Author: juzhiyuan <jj...@gmail.com>
AuthorDate: Fri Jun 5 21:06:54 2020 +0800

    fix some issue for creating route
---
 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;
     };