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

morningman pushed a commit to branch doris-manager
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/doris-manager by this push:
     new ab57443  Fix doris manager bug (#7018)
ab57443 is described below

commit ab57443d10adcde9b49b5516d425565b423445f9
Author: songchuanyuan <[email protected]>
AuthorDate: Fri Nov 5 14:44:55 2021 +0800

    Fix doris manager bug (#7018)
    
    Fix doris manager 1.0 web bug and optimize documents.
---
 manager/README.md                                  |  27 +--
 manager/build.sh                                   |  27 +--
 manager/dm-common/pom.xml                          |   2 +-
 manager/dm-server/pom.xml                          |   2 +-
 manager/doris-manager/package.json                 |   3 +-
 manager/doris-manager/public/locales/zh-cn.json    |   7 +-
 manager/doris-manager/src/common/common.api.ts     |   9 +
 manager/doris-manager/src/common/common.context.ts |   4 +
 manager/doris-manager/src/common/common.data.ts    |   6 +-
 .../doris-manager/src/common/common.interface.ts   |  22 +++
 .../src/components/doris-modal/doris-modal.jsx     |  41 +++++
 .../doris-manager/src/components/header/header.tsx |  39 ++--
 .../src/components/sidebar/sidebar.tsx             |  73 +++++---
 .../src/components/sidebar/siderbar.data.ts        |   0
 manager/doris-manager/src/config.ts                |   2 -
 manager/doris-manager/src/index.css                |  10 ++
 manager/doris-manager/src/routes.tsx               |  76 ++++----
 .../doris-manager/src/routes/cluster/cluster.tsx   |  16 ++
 .../doris-manager/src/routes/cluster/list/list.tsx |   0
 .../routes/cluster/{ => monitor}/monitor.api.ts    |   0
 .../routes/cluster/{ => monitor}/monitor.data.ts   |   0
 .../src/routes/cluster/{ => monitor}/monitor.less  |   0
 .../cluster/{index.tsx => monitor/monitor.tsx}     |   3 +-
 manager/doris-manager/src/routes/container.less    |   2 +
 manager/doris-manager/src/routes/container.tsx     | 109 ++++++------
 .../routes/dashboard/connect-info/connect-info.tsx |   4 +-
 .../src/routes/dashboard/dashboard.api.ts          |   4 -
 .../content.module.less => meta/meta.less}         |   0
 .../routes/{content/index.tsx => meta/meta.tsx}    |  19 +-
 .../src/routes/node/dashboard/index.tsx            |  66 +++----
 .../routes/node/list/be-configuration/index.tsx    |   5 +-
 .../src/routes/node/list/configuration/index.tsx   |   5 +-
 .../routes/node/list/fe-configuration/index.tsx    |   5 +-
 .../doris-manager/src/routes/node/list/index.tsx   |   5 +-
 .../doris-manager/src/routes/passport/index.tsx    |   2 +-
 manager/doris-manager/src/routes/query/index.tsx   |   3 +-
 manager/doris-manager/src/routes/space/index.tsx   | 195 --------------------
 .../doris-manager/src/routes/space/space-check.tsx | 105 -----------
 ...min-container.tsx => super-admin-container.tsx} |  21 ++-
 .../super-admin/space/detail/space-detail.tsx      | 130 ++++++++++++++
 .../src/routes/super-admin/space/list/list.less    |   0
 .../{space => super-admin/space/list}/list.tsx     |  75 ++++----
 .../super-admin/space/new-space/new-space.tsx      | 198 +++++++++++++++++++++
 .../routes/{ => super-admin}/space/space.api.ts    |   6 +-
 .../{ => super-admin}/space/space.interface.ts     |   7 +
 .../space/space.less}                              |   3 +-
 .../src/routes/table-content/schema/schema.data.ts |   4 +
 .../src/routes/table-content/tabs/data.pre.tsx     |   3 +-
 .../table-content/tabs/dataImport-menu/index.tsx   |   5 +-
 .../src/routes/tree/create-menu/index.tsx          |   3 +-
 manager/doris-manager/src/routes/tree/index.tsx    |   7 +-
 manager/doris-manager/src/routes/tree/tree.api.ts  |   3 +-
 .../src/routes/user-setting/index.tsx              |   4 +-
 .../exception/DorisHttpPortErrorException.java}    |  20 ++-
 .../stack/exception/DorisIpErrorException.java}    |  18 +-
 .../exception/DorisJdbcPortErrorException.java}    |  20 ++-
 .../exception/DorisUerOrPassErrorException.java}   |  20 ++-
 .../exception/DorisUserNoPermissionException.java} |  34 ++--
 .../doris/stack/model/response/user/UserInfo.java  |  14 ++
 .../doris/stack/service/user/UserService.java      |   1 +
 .../org/apache/doris/stack/util/PropertyUtil.java  |   2 +-
 manager/manager-bin/start_manager.sh               |   6 +-
 manager/manager-server/pom.xml                     |   7 +-
 .../java/org/apache/doris/stack/DorisManager.java  |   2 +-
 .../org/apache/doris/stack/StartManagerRunner.java |   4 +
 .../doris/stack/service/PaloUserSpaceService.java  |  16 +-
 66 files changed, 860 insertions(+), 671 deletions(-)

diff --git a/manager/README.md b/manager/README.md
index 3ab4020..a0b742a 100644
--- a/manager/README.md
+++ b/manager/README.md
@@ -28,9 +28,9 @@ Apache Doris Manager is used to manage the doris cluster, 
such as monitoring clu
 ```
 $ sh build.sh
 ```
-Compiles the front and back ends of the project. After compilation, a tar 
package will be generated in the output/ directory and output.tar.gz 
package.The content of the compiled output is:
+Compiles the front and back ends of the project. After compilation, a tar 
package will be generated in the output/ directory and 
doris-manager-1.0.0.tar.gz package.The content of the compiled output is:
 ```
-agent/
+agent/, doris manger agent
     bin/
         agent_start.sh, doris manger agent startup script
         agent_stop.sh, doris manger agent stop script
@@ -38,20 +38,23 @@ agent/
         install_fe.sh, doris fe install script
     lib/
         dm-agent.jar, executable package of doris manger agent
-conf/
-    manager.conf, doris manger server configuration file
-resources/, doris manger server static resources
-static/, doris manger server front end compilation output
-doris-manager.jar, executable package of doris manger server
-start_manager.sh, doris manger server startup script
-stop_manager.sh, doris manger server stop script
+server/, doris manger server
+    conf/
+        manager.conf, doris manger server configuration file
+    web-resource/, doris manger server front static resources
+    lib/
+        doris-manager.jar, executable package of doris manger server
+    bin/
+        start_manager.sh, doris manger server startup script
+        stop_manager.sh, doris manger server stop script
 ```
 
 ### Step2: install manager server
 #### 1) Unzip the installation package
-Copy output.tar.gz tar package to the the machine where the manager server 
needs to be installed.
+Copy doris-manager-1.0.0.tar.gz tar package to the the machine where the 
manager server needs to be installed.
 ```
-$ tar -zxvf output.tar.gz
+$ tar -zxvf doris-manager-1.0.0.tar.gz
+$ cd server
 ```
 #### 2) Modify profile
 Edit conf/manager.conf
@@ -87,7 +90,7 @@ MB_DB_DBNAME
 #### 3) Start manager server
 Start the manager service after decompression and configuration.
 ```
-$ sh start_manager.sh
+$ sh bin/start_manager.sh
 ```
 #### 4) User manager server
 Browser access ${serverIp}:8080, Manger server has a preset super 
administrator user. The information is as follows:
diff --git a/manager/build.sh b/manager/build.sh
index 9714d40..6675257 100644
--- a/manager/build.sh
+++ b/manager/build.sh
@@ -26,22 +26,27 @@ echo "build doris manager web end"
 
 cd ../
 echo "copy doris manager web resources to server"
-mkdir -p manager-server/src/main/resources/static
-cp -r doris-manager/dist/* manager-server/src/main/resources/static/
+rm -rf manager-server/src/main/resources/web-resource
+mv doris-manager/dist manager-server/src/main/resources/web-resource
 echo "copy doris manager web resources to server end"
 
 echo "build doris manager server start"
 set -e
+mvn clean install
+echo "build doris manager server end"
+
+echo "copy to output package start"
 rm -rf output
-rm -rf output.tar.gz
+rm -rf doris-manager-1.0.0.tar.gz
 mkdir -p output
-mvn clean install
-mv manager-server/target/manager-server-1.0.0.jar output/doris-manager.jar
-cp -r conf output/
-cp -r manager-bin/* output/
+mkdir -p output/server/lib
+mv manager-server/target/manager-server-1.0.0.jar 
output/server/lib/doris-manager.jar
+cp -r conf output/server/
+cp -r manager-bin output/
+mv output/manager-bin output/server/bin
+cp -r dm-agent/src/main/resources/agent output/
 mkdir -p output/agent/lib
 mv dm-agent/target/dm-agent-1.0.0.jar output/agent/lib/dm-agent.jar
-cp -r manager-server/src/main/resources/static output/
-
-cp -r manager-server/src/main/resources output/
-tar -zcvf output.tar.gz output/
+cp -r manager-server/src/main/resources/web-resource output/server/
+tar -zcvf doris-manager-1.0.0.tar.gz output/
+echo "copy to output package end"
\ No newline at end of file
diff --git a/manager/dm-common/pom.xml b/manager/dm-common/pom.xml
index b9dd5e1..9446282 100644
--- a/manager/dm-common/pom.xml
+++ b/manager/dm-common/pom.xml
@@ -10,6 +10,6 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>dm-common</artifactId>
-    <packaging>jar</packaging>
+<!--    <packaging>jar</packaging>-->
 
 </project>
\ No newline at end of file
diff --git a/manager/dm-server/pom.xml b/manager/dm-server/pom.xml
index 5388e6f..067015d 100644
--- a/manager/dm-server/pom.xml
+++ b/manager/dm-server/pom.xml
@@ -10,7 +10,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>dm-server</artifactId>
-    <packaging>jar</packaging>
+<!--    <packaging>jar</packaging>-->
 
     <name>dm-server</name>
 
diff --git a/manager/doris-manager/package.json 
b/manager/doris-manager/package.json
index e419049..2717495 100644
--- a/manager/doris-manager/package.json
+++ b/manager/doris-manager/package.json
@@ -13,7 +13,6 @@
   "dependencies": {
     "@ant-design/icons": "^4.6.3",
     "@babel/core": "^7.12.10",
-    "@baidu/aidp-middle-common": "^1.3.18",
     "@umijs/hooks": "^1.9.3",
     "antd": "^4.16.11",
     "babel-loader": "^8.2.2",
@@ -35,6 +34,8 @@
     "react-i18next": "^11.11.4",
     "react-router-dom": "^5.2.0",
     "recoil": "^0.1.2",
+    "sweetalert2": "^11.1.9",
+    "sweetalert2-react-content": "^4.1.1",
     "swr": "^0.5.6",
     "ttag": "1.7.15",
     "typescript": "^4.3.5",
diff --git a/manager/doris-manager/public/locales/zh-cn.json 
b/manager/doris-manager/public/locales/zh-cn.json
index 8f93b98..5166f1a 100644
--- a/manager/doris-manager/public/locales/zh-cn.json
+++ b/manager/doris-manager/public/locales/zh-cn.json
@@ -164,6 +164,12 @@
     "userPwd":"密码",
     "linkTest":"链接测试",
     "submit":"提交",
+    "SpaceDeleteTips": 
"连接空间的集群信息、空间内的文件夹(其中包括查询、仪表盘、定时任务等)、用户及权限信息等将被一并删除。确认删除空间?",
+    "DeleteSuccessTips": "删除成功",
+    "Failed": "失败",
+    "Delete": "删除",
+    "GoBack": "返回",
+    "NewSpace": "新建空间",
 
     "updateDoris": "请升级Doris集群!",
     "httpInfo": "HTTP连接信息",
@@ -185,6 +191,5 @@
     "TableType": "表类型(数据模型)",
     "TableStructure": "表结构",
     "loading":"加载中"
-
 }
 
diff --git a/manager/doris-manager/src/common/common.api.ts 
b/manager/doris-manager/src/common/common.api.ts
new file mode 100644
index 0000000..75a75ca
--- /dev/null
+++ b/manager/doris-manager/src/common/common.api.ts
@@ -0,0 +1,9 @@
+import { http } from "@src/utils/http";
+
+function getUserInfo() {
+    return http.get(`/api/user/current`);
+}
+
+export const CommonAPI = {
+    getUserInfo
+}
\ No newline at end of file
diff --git a/manager/doris-manager/src/common/common.context.ts 
b/manager/doris-manager/src/common/common.context.ts
new file mode 100644
index 0000000..fd8a239
--- /dev/null
+++ b/manager/doris-manager/src/common/common.context.ts
@@ -0,0 +1,4 @@
+import React from 'react';
+import { UserInfo } from './common.interface';
+
+export const UserInfoContext = React.createContext<UserInfo | null>(null);
diff --git a/manager/doris-manager/src/common/common.data.ts 
b/manager/doris-manager/src/common/common.data.ts
index 6063684..1cd8b86 100644
--- a/manager/doris-manager/src/common/common.data.ts
+++ b/manager/doris-manager/src/common/common.data.ts
@@ -15,8 +15,6 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
-
 export enum FieldTypeEnum {
     TINYINT = 'TINYINT',
     SMALLINT = 'SMALLINT',
@@ -94,5 +92,5 @@ export const FIRST_COLUMN_FIELD_TYPES = FIELD_TYPES.filter(
 );
 
 export const ANALYTICS_URL = '/login';
-export const STUDIO_INDEX_URL = `/${DEFAULT_NAMESPACE_ID}/meta/index`; //待确认
-export const MANAGE_INDEX_URL = `/${DEFAULT_NAMESPACE_ID}/meta/index`;
+export const STUDIO_INDEX_URL = `/meta/index`; //待确认
+export const MANAGE_INDEX_URL = `/meta/index`;
diff --git a/manager/doris-manager/src/common/common.interface.ts 
b/manager/doris-manager/src/common/common.interface.ts
new file mode 100644
index 0000000..5876bc4
--- /dev/null
+++ b/manager/doris-manager/src/common/common.interface.ts
@@ -0,0 +1,22 @@
+export interface UserInfo {
+    email:          string;
+    name:           string;
+    authType:       string;
+    id:             number;
+    collectionId:   number;
+    ldap_auth:      boolean;
+    last_login:     Date;
+    updated_at:     Date;
+    group_ids:      number[];
+    date_joined:    Date;
+    common_name:    string;
+    google_auth:    boolean;
+    space_id:       number;
+    space_complete: boolean;
+    deploy_type:    string;
+    manager_enable: boolean;
+    is_active:      boolean;
+    is_admin:       boolean;
+    is_qbnewb:      boolean;
+    is_super_admin: boolean;
+}
\ No newline at end of file
diff --git a/manager/doris-manager/src/components/doris-modal/doris-modal.jsx 
b/manager/doris-manager/src/components/doris-modal/doris-modal.jsx
new file mode 100644
index 0000000..5a237e9
--- /dev/null
+++ b/manager/doris-manager/src/components/doris-modal/doris-modal.jsx
@@ -0,0 +1,41 @@
+import Swal from 'sweetalert2';
+import withReactContent from 'sweetalert2-react-content';
+
+const DorisSwal = withReactContent(Swal);
+
+class DorisModal {
+    message(message) {
+        DorisSwal.fire(message);
+    }
+
+    success(title, message = '') {
+        return Swal.fire(title, message, 'success');
+    }
+
+    error(title = '', message = '') {
+        return Swal.fire(title, message, 'error');
+    }
+
+    confirm(title, message = '', callback) {
+        Swal.fire({
+            title: title,
+            text: message,
+            icon: 'warning',
+            showCancelButton: true,
+            confirmButtonColor: '#3085d6',
+            cancelButtonColor: '#d33',
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+        }).then(async result => {
+            if (result.isConfirmed && typeof callback === 'function') {
+                callback();
+            } else if (!result.isConfirmed) {
+                Swal.close();
+            } else {
+                this.success('操作成功');
+            }
+        });
+    }
+}
+
+export const modal = new DorisModal();
diff --git a/manager/doris-manager/src/components/header/header.tsx 
b/manager/doris-manager/src/components/header/header.tsx
index 23f1034..456c25b 100644
--- a/manager/doris-manager/src/components/header/header.tsx
+++ b/manager/doris-manager/src/components/header/header.tsx
@@ -16,24 +16,22 @@
 // under the License.
 
 import { Layout, Menu, Tooltip, Col, Row, Dropdown, message, Anchor } from 
'antd';
-import Sider from 'antd/lib/layout/Sider';
 import {LineChartOutlined, QuestionCircleOutlined,SettingOutlined } from 
'@ant-design/icons';
-import SubMenu from 'antd/lib/menu/SubMenu';
-import { Link } from 'react-router-dom';
-import { IconSetting } from 'src/components/icons/setting.icon';
-import React, { useEffect, useState } from 'react';
+import React, { useContext, useEffect, useState } from 'react';
 import { LayoutAPI } from './header.api';
 import { useHistory } from 'react-router-dom';
 import { useTranslation } from 'react-i18next';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import styles from './index.module.less';
 import { ANALYTICS_URL } from '@src/common/common.data';
+import { UserInfoContext } from '@src/common/common.context';
+import { UserInfo } from '@src/common/common.interface';
 
 export function Header(props: any) {
     const { t } = useTranslation();
     const history = useHistory();
     const [statisticInfo, setStatisticInfo] = useState<any>({});
     const user = JSON.parse(window.localStorage.getItem('user') as string);
+    const userInfo = useContext(UserInfoContext);
     function getCurrentUser() {
         LayoutAPI.getCurrentUser()
             .then(res => {
@@ -56,7 +54,7 @@ export function Header(props: any) {
         }
     }
     function onAccountSettings() {
-        history.push( `/${DEFAULT_NAMESPACE_ID}/user-setting`);
+        history.push( `/user-setting`);
     }
     function onLogout() {
         LayoutAPI.signOut()
@@ -80,7 +78,7 @@ export function Header(props: any) {
             className={user.is_super_admin ? styles['adminStyle']: 
styles['userStyle']}
             style={{ padding: 0, background: user.is_super_admin ?  '#000' : 
'#f9fbfc', borderBottom: '1px solid #d9d9d9' }}
         > 
-            <Row justify="space-between">
+            <Row justify="space-between" align="middle" style={{paddingBottom: 
8}}>
                 {
                     user.is_super_admin ? (
                         <div
@@ -88,33 +86,16 @@ export function Header(props: any) {
                         />
                     ) :(
                         <Col style={{ marginLeft: '2em' }}>
-                            <span>{t`namespace`}:{statisticInfo.name}</span>
+                            <span>{t`namespace`}:{(userInfo as 
UserInfo)?.space_name}</span>
                         </Col>
                     )
                 }
                 
                 <Col style={{ cursor: 'pointer', marginRight: 20, fontSize: 22 
}}>
-                    <Tooltip placement="bottom" title={t`backTo`+ "Studio"}>
-                        <LineChartOutlined
-                            className={styles['data-builder-header-items']}
-                            style={{ marginRight: 20 , color: 
user.is_super_admin ?  '#fff' : '',}}
-                            onClick={() => (window.location.href = 
`${window.location.origin}`)}
-                        />
-                    </Tooltip>
-                    <Tooltip placement="bottom" title={t`Help`}>
-                        <QuestionCircleOutlined
-                            // className={styles['data-builder-header-items']}
-                            style={{ marginRight: 20, color: 
user.is_super_admin ? '#fff' : '' }}
-                            onClick={() => {
-                                const analyticsUrl = 
`${window.location.origin}/docs/pages/产品概述/产品介绍.html`;
-                                window.open(analyticsUrl);
-                            }}
-                        />
-                    </Tooltip>
                     <Dropdown overlay={menu}>
-                                <span onClick={e=> e.preventDefault()}>
-                                    <SettingOutlined style={{ color: 
user.is_super_admin ? '#fff' : '' }}/>
-                                </span>
+                        <span onClick={e=> e.preventDefault()}>
+                            <SettingOutlined style={{ color: 
user.is_super_admin ? '#fff' : '' }}/>
+                        </span>
                     </Dropdown>
                 </Col>
             </Row>
diff --git a/manager/doris-manager/src/components/sidebar/sidebar.tsx 
b/manager/doris-manager/src/components/sidebar/sidebar.tsx
index 3aad7ab..4f266e2 100644
--- a/manager/doris-manager/src/components/sidebar/sidebar.tsx
+++ b/manager/doris-manager/src/components/sidebar/sidebar.tsx
@@ -18,56 +18,71 @@
 import { Layout, Menu, Tooltip, Col, Row, Dropdown, message, Anchor } from 
'antd';
 import Sider from 'antd/lib/layout/Sider';
 import SubMenu from 'antd/lib/menu/SubMenu';
-import { LineChartOutlined, QuestionCircleOutlined,  UserOutlined } from 
'@ant-design/icons';
-import { Link } from 'react-router-dom';
+import { LineChartOutlined, QuestionCircleOutlined, UserOutlined } from 
'@ant-design/icons';
+import { Link, useHistory, useRouteMatch } from 'react-router-dom';
 import React, { useEffect, useState } from 'react';
 
 import { useTranslation } from 'react-i18next';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import styles from './sidebar.less';
 
 export function Sidebar(props: any) {
     const { t } = useTranslation();
     const [statisticInfo, setStatisticInfo] = useState<any>({});
+    const [selectedKeys, setSelectedKeys] = useState('/dashboard/overview');
+
+    const history = useHistory();
+    useEffect(() => {
+        if (history.location.pathname.includes('configuration')) {
+            setSelectedKeys('/configuration');
+        } else {
+            setSelectedKeys(history.location.pathname);
+        }
+    }, [history.location.pathname]);
 
     return (
-            <Sider width={200} className="DAE-manager-side">
+        <Sider width={200} className="DAE-manager-side">
             <Menu
                 mode="inline"
                 theme="dark"
-                defaultSelectedKeys={['1']}
-                defaultOpenKeys={['sub1']}
+                defaultSelectedKeys={['/dashboard/overview']}
+                defaultOpenKeys={['nodes']}
+                selectedKeys={[selectedKeys]}
                 style={{ height: '100%', borderRight: 0 }}
             >
-                {/* <SubMenu key="sub1" icon={<UserOutlined />} title="Doris 
Manager"> */}
-                    <Menu.Item style = {{paddingLeft: '8px',marginTop: 
'10px'}}>
-                        <div
-                            className={styles['logo']}
-                            onClick={() => 
props.history.push(`/${DEFAULT_NAMESPACE_ID}/meta/index`)}
-                        />
+                <Menu.Item style={{ paddingLeft: '8px', marginTop: '10px' }}>
+                    <div
+                        className={styles['logo']}
+                        onClick={() => props.history.push(`/meta/index`)}
+                    />
+                </Menu.Item>
+                <Menu.Item key="2">
+                    <Link to={`/meta`}>{t`data`}</Link>
+                </Menu.Item>
+                <SubMenu key="nodes" title="节点">
+                    <Menu.Item key={`/list`}>
+                        <Link to={`/list`}>列表</Link>
                     </Menu.Item>
-                    <Menu.Item key="2">
-                        <Link 
to={`/${DEFAULT_NAMESPACE_ID}/content`}>{t`data`}</Link>
+                    <Menu.Item key={`/configuration`}>
+                        <Link to={`/configuration`}>配置项</Link>
                     </Menu.Item>
-                    <SubMenu key="sub2" title="节点" style ={{fontSize: 16}}>
-                        <Menu.Item key={`list`}>
-                            <Link 
to={`/${DEFAULT_NAMESPACE_ID}/list`}>列表</Link>
-                        </Menu.Item>
-                        <Menu.Item key={`configuration`}> 
-                            <Link 
to={`/${DEFAULT_NAMESPACE_ID}/configuration`}>配置项</Link>
-                        </Menu.Item>
-                        <Menu.Item key={`/node-dash`}>
-                            <Link 
to={`/${DEFAULT_NAMESPACE_ID}/node-dash`}>仪表盘</Link>
-                        </Menu.Item>
-                    </SubMenu>
-                    <Menu.Item key="3">
-                        <Link to={`/${DEFAULT_NAMESPACE_ID}/dash`}>集群</Link>
+                    <Menu.Item key={`/dashboard/overview`}>
+                        <Link to={`/dashboard/overview`}>仪表盘</Link>
                     </Menu.Item>
-                    <Menu.Item key="4">
-                        <Link to={`/${DEFAULT_NAMESPACE_ID}/query`}>查询</Link>
+                </SubMenu>
+                <SubMenu key="cluster" title="集群">
+                    <Menu.Item key="/cluster/monitor">
+                        <Link to={`/cluster/monitor`}>监控</Link>
                     </Menu.Item>
+                    {/* <Menu.Item key="/cluster/list">
+                        <Link to={`/cluster/list`}>列表</Link>
+                    </Menu.Item> */}
+                </SubMenu>
+                <Menu.Item key="/query">
+                    <Link to={`/query`}>查询</Link>
+                </Menu.Item>
                 {/* </SubMenu> */}
             </Menu>
         </Sider>
     );
 }
+
diff --git a/manager/doris-manager/src/components/sidebar/siderbar.data.ts 
b/manager/doris-manager/src/components/sidebar/siderbar.data.ts
new file mode 100644
index 0000000..e69de29
diff --git a/manager/doris-manager/src/config.ts 
b/manager/doris-manager/src/config.ts
index 88e5ae8..442dc5a 100644
--- a/manager/doris-manager/src/config.ts
+++ b/manager/doris-manager/src/config.ts
@@ -18,8 +18,6 @@
 import { getDefaultPageSize } from './utils/utils';
 import version from '../version.json';
 
-export const DEFAULT_NAMESPACE_ID = '0';
-
 export const TABLE_DELAY = 150;
 export const PAGESIZE_OPTIONS = ['10', '20', '50', '100', '200'];
 export const PAGINATION = {
diff --git a/manager/doris-manager/src/index.css 
b/manager/doris-manager/src/index.css
index 486dbd2..dd90097 100644
--- a/manager/doris-manager/src/index.css
+++ b/manager/doris-manager/src/index.css
@@ -19,7 +19,17 @@
   min-width: 100vw;
   height: 100%;
   min-height: 100vh;
+  background-color: #f9fbfc;
 }
 .ant-layout {
   background-color: white !important;
+}
+ul,ol,li {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+}
+h1,h2,h3,h4,h5,h6 {
+  margin: 0;
+  padding: 0;
 }
\ No newline at end of file
diff --git a/manager/doris-manager/src/routes.tsx 
b/manager/doris-manager/src/routes.tsx
index eae8735..744091b 100644
--- a/manager/doris-manager/src/routes.tsx
+++ b/manager/doris-manager/src/routes.tsx
@@ -1,3 +1,9 @@
+import React, { lazy } from 'react';
+import SuperAdminContainer from './routes/super-admin-container';
+import { auth } from './utils/auth';
+import { Loading } from './components/loading';
+import { NotFound } from './components/not-found';
+import { Suspense } from 'react';
 // Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -15,55 +21,37 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import React, { lazy } from 'react';
-import { Suspense } from "react";
-import {
-  Route,
-  Switch,
-  Redirect,
-  BrowserRouter as Router,
-} from "react-router-dom";
-import { Loading } from "./components/loading";
-import { NotFound } from "./components/not-found";
-import Container from "./routes/container";
-import AdminContainer from "./routes/admin-container";
-import { auth } from "./utils/auth";
+import { Route, Switch, Redirect, BrowserRouter as Router } from 
'react-router-dom';
+import { Container } from './routes/container';
 const Login = lazy(() => import('../src/routes/passport/index'));
 
 const user = JSON.parse(window.localStorage.getItem('user') as string);
 // 对状态属性进行监听
 const routes = (
-  <Suspense fallback={<Loading />}>
-    <Router>
-      <Switch>
-        <Route
-          path="/"
-          render={(props) =>
-            auth.checkLogin() ? (
-              user.is_super_admin ?
-               (<AdminContainer {...props} /> ):
-               (<Container {...props} /> )
-            ) : props.history.location.pathname === "/login" ? (
-              <Login></Login>
-            ) : (
-              <Redirect to="/login" />
-            )
-          }
-        />
-        <Route
-          path="/login"
-          render={(props) =>
-            auth.checkLogin() ? (
-              <Redirect to="/" />
-            ) : (
-              <></>
-            )
-          }
-        />
-        <Route component={NotFound} />
-      </Switch>
-    </Router>
-  </Suspense>
+    <Suspense fallback={<Loading />}>
+        <Router>
+            <Switch>
+                <Route
+                    path="/"
+                    render={props =>
+                        auth.checkLogin() ? (
+                            user.is_super_admin ? (
+                                <SuperAdminContainer {...props} />
+                            ) : (
+                                <Container {...props} />
+                            )
+                        ) : props.history.location.pathname === '/login' ? (
+                            <Login></Login>
+                        ) : (
+                            <Redirect to="/login" />
+                        )
+                    }
+                />
+                <Route path="/login" render={props => (auth.checkLogin() ? 
<Redirect to="/" /> : <></>)} />
+                <Route component={NotFound} />
+            </Switch>
+        </Router>
+    </Suspense>
 );
 
 export default routes;
diff --git a/manager/doris-manager/src/routes/cluster/cluster.tsx 
b/manager/doris-manager/src/routes/cluster/cluster.tsx
new file mode 100644
index 0000000..789caff
--- /dev/null
+++ b/manager/doris-manager/src/routes/cluster/cluster.tsx
@@ -0,0 +1,16 @@
+import { match } from "assert";
+import React from "react";
+import { Switch, Route, Redirect, useRouteMatch } from "react-router";
+import { Overview } from "../dashboard/overview/overview";
+import { ClusterMonitor } from "./monitor/monitor";
+
+export function Cluster(props: any) {
+    const match = useRouteMatch();
+    return (
+        <Switch>
+            {/* <Route path={`${match.path}/list`} component={Overview} /> */}
+            <Route path={`${match.path}/monitor`} component={ClusterMonitor} />
+            <Redirect to={`${match.path}/monitor`} />
+        </Switch>
+    )
+}
\ No newline at end of file
diff --git a/manager/doris-manager/src/routes/cluster/list/list.tsx 
b/manager/doris-manager/src/routes/cluster/list/list.tsx
new file mode 100644
index 0000000..e69de29
diff --git a/manager/doris-manager/src/routes/cluster/monitor.api.ts 
b/manager/doris-manager/src/routes/cluster/monitor/monitor.api.ts
similarity index 100%
rename from manager/doris-manager/src/routes/cluster/monitor.api.ts
rename to manager/doris-manager/src/routes/cluster/monitor/monitor.api.ts
diff --git a/manager/doris-manager/src/routes/cluster/monitor.data.ts 
b/manager/doris-manager/src/routes/cluster/monitor/monitor.data.ts
similarity index 100%
rename from manager/doris-manager/src/routes/cluster/monitor.data.ts
rename to manager/doris-manager/src/routes/cluster/monitor/monitor.data.ts
diff --git a/manager/doris-manager/src/routes/cluster/monitor.less 
b/manager/doris-manager/src/routes/cluster/monitor/monitor.less
similarity index 100%
copy from manager/doris-manager/src/routes/cluster/monitor.less
copy to manager/doris-manager/src/routes/cluster/monitor/monitor.less
diff --git a/manager/doris-manager/src/routes/cluster/index.tsx 
b/manager/doris-manager/src/routes/cluster/monitor/monitor.tsx
similarity index 99%
rename from manager/doris-manager/src/routes/cluster/index.tsx
rename to manager/doris-manager/src/routes/cluster/monitor/monitor.tsx
index a70c9ab..9ac888c 100644
--- a/manager/doris-manager/src/routes/cluster/index.tsx
+++ b/manager/doris-manager/src/routes/cluster/monitor/monitor.tsx
@@ -68,7 +68,7 @@ const gridStyle: React.CSSProperties = {
     width: 'calc(100%  / 6)',
     textAlign: 'center',
 };
-export function Monitor() {
+export function ClusterMonitor() {
     const { t } = useTranslation();
     const [TIMES, setTIMES] = useState(() => getTimes(dayjs()));
     const [statisticInfo, setStatisticInfo] = useState<any>({});
@@ -436,4 +436,3 @@ export function Monitor() {
         </div>
     );
 }
-export default Monitor;
diff --git a/manager/doris-manager/src/routes/container.less 
b/manager/doris-manager/src/routes/container.less
index 259f4cd..6860893 100644
--- a/manager/doris-manager/src/routes/container.less
+++ b/manager/doris-manager/src/routes/container.less
@@ -19,4 +19,6 @@
     width: calc(100% - 200px);
     padding: 20px;
     background: #f9fbfc;
+    height: 100%;
+    overflow-y: scroll;
 }
\ No newline at end of file
diff --git a/manager/doris-manager/src/routes/container.tsx 
b/manager/doris-manager/src/routes/container.tsx
index 3d8e946..d243474 100644
--- a/manager/doris-manager/src/routes/container.tsx
+++ b/manager/doris-manager/src/routes/container.tsx
@@ -15,72 +15,75 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import React, { lazy } from 'react';
+import React, { lazy, useEffect, useState } from 'react';
 import styles from './container.less';
 import { Dashboard } from './dashboard/dashboard';
 import { Layout } from 'antd';
 import { Redirect, Route, Router, Switch } from 'react-router-dom';
 import { Sidebar } from '@src/components/sidebar/sidebar';
 import { Header } from '@src/components/header/header';
-const Workspace = lazy(() => import('./workspace/workspace'));
-const Login = lazy(() => import('./passport/index'));
-
-const Content = lazy(() => import('./content/index'));
-
-const Cluster = lazy(() => import('./cluster/index'));
+import UserSetting from './user-setting';
+import QueryDetails from './query/query-details';
+import Query from './query';
+import { NodeDashboard } from './node/dashboard';
+import Configuration from './node/list/configuration';
+import { Cluster } from './cluster/cluster';
+import { CommonAPI } from '@src/common/common.api';
+import { UserInfoContext } from '@src/common/common.context';
+import { UserInfo } from '@src/common/common.interface';
+import { Meta } from './meta/meta';
 
 const NodeList = lazy(() => import('./node/list'));
 const FEConfiguration = lazy(() => 
import('./node/list/fe-configuration/index'));
 const BEConfiguration = lazy(() => 
import('./node/list/be-configuration/index'));
 
-const Configuration = lazy(() => import('./node/list/configuration'));
-const NodeDash = lazy(() => import('./node/dashboard'));
+export function Container(props: any) {
 
-const Query = lazy(() => import('./query/index'));
-const QueryDetails = lazy(() => import('./query/query-details/index'));
-const UserSetting = lazy(() => import('./user-setting/index'));
-class Container extends React.Component<any, {}> {
-    constructor(props: any) {
-        super(props);
-    }
+    const [userInfo, setUserInfo] = useState<UserInfo | null>(null);
+    useEffect(() => {
+        CommonAPI.getUserInfo().then((res) => {
+            if (res.code === 0) {
+                setUserInfo(res.data);
+            }
+        });
+    }, []);
 
-    render() {
-        return (
-            <Router history={this.props.history}>
-                <Layout style={{height: '100vh'}}>
-                    <Layout>
-                        <Sidebar width={200} className="DAE-manager-side" />
-                        <div className={styles['container-content']}>
-                            <Header>
-                                
-                            </Header>
-                            <Switch>
-                                <Route path="/dashboard" component={Dashboard} 
/>
-                                {/* 数据 */}
-                                <Route path="/:nsId/content" 
component={Content}/>
-                                
-                                {/* 集群 */}
-                                <Route path="/:nsId/dash" component={Cluster} 
/>
-                                {/* 节点 */}
-                                <Route path="/:nsId/list" component={NodeList} 
/>
-                                <Route path="/:nsId/fe-configuration" 
component={FEConfiguration} />
-                                <Route path="/:nsId/be-configuration" 
component={BEConfiguration} />
-                                <Route path="/:nsId/configuration" 
component={Configuration} />
-                                <Route path="/:nsId/node-dash" 
component={NodeDash} />
-                                {/* 查询 */}
-                                <Route path="/:nsId/query" component={Query} />
-                                <Route path="/:nsId/details/:queryId" 
component={QueryDetails} />
-                                { /*账户设置*/}
-                                <Route path="/:nsId/user-setting" 
component={UserSetting} />
-                                <Redirect to="/dashboard" />
-                              
-                            </Switch>
-                        </div>
-                    </Layout>
+    return (
+        <Router history={props.history}>
+            <UserInfoContext.Provider value={userInfo}>
+            <Layout style={{height: '100vh'}}>
+                <Layout>
+                    <Sidebar width={200} className="DAE-manager-side" />
+                    <div className={styles['container-content']}>
+                        <Header>
+                            
+                        </Header>
+                        <Switch>
+                            <Route path="/dashboard" component={Dashboard} />
+                            {/* 数据 */}
+                            <Route path="/meta" component={Meta}/>
+                            
+                            {/* 集群 */}
+                            <Route path="/cluster" component={Cluster} />
+                            {/* 节点 */}
+                            <Route path="/list" component={NodeList} />
+                            <Route path="/configuration/fe" 
component={FEConfiguration} />
+                            <Route path="/configuration/be" 
component={BEConfiguration} />
+                            <Route path="/configuration" 
component={Configuration} />
+                            <Route path="/node-dashboard" 
component={NodeDashboard} />
+                            {/* 查询 */}
+                            <Route path="/query" component={Query} />
+                            <Route path="/details/:queryId" 
component={QueryDetails} />
+                            { /*账户设置*/}
+                            <Route path="/user-setting" 
component={UserSetting} />
+                            <Redirect to="/dashboard" />
+                            
+                        </Switch>
+                    </div>
                 </Layout>
-            </Router>
-        );
-    }
+            </Layout>
+            </UserInfoContext.Provider>
+        </Router>
+    );
 }
 
-export default Container;
diff --git 
a/manager/doris-manager/src/routes/dashboard/connect-info/connect-info.tsx 
b/manager/doris-manager/src/routes/dashboard/connect-info/connect-info.tsx
index abc5c24..6d6aef9 100644
--- a/manager/doris-manager/src/routes/dashboard/connect-info/connect-info.tsx
+++ b/manager/doris-manager/src/routes/dashboard/connect-info/connect-info.tsx
@@ -58,8 +58,8 @@ export function Component(props: any) {
     return (
         <div styleName="connect-info-container">
             <Card style={{ width: '100%' }}>
-                <p>t`httpInfo` {https}</p>
-                <p>t`JDBCInfo` {mysqls}</p>
+                <p>{t`httpInfo`} {https}</p>
+                <p>{t`JDBCInfo`} {mysqls}</p>
             </Card>
         </div>
     );
diff --git a/manager/doris-manager/src/routes/dashboard/dashboard.api.ts 
b/manager/doris-manager/src/routes/dashboard/dashboard.api.ts
index 61c6654..6750f5b 100644
--- a/manager/doris-manager/src/routes/dashboard/dashboard.api.ts
+++ b/manager/doris-manager/src/routes/dashboard/dashboard.api.ts
@@ -25,11 +25,7 @@ function getMetaInfo(): Promise<IResult<MetaInfoResponse>> {
 function getSpaceList() {
     return http.get(`/api/rest/v2/manager/cluster/cluster_info/conn_info`);
 }
-function getCurrentUser() {
-    return http.get(`/api/user/current`);
-}
 export const DashboardAPI = {
     getMetaInfo,
     getSpaceList,
-    getCurrentUser,
 };
diff --git a/manager/doris-manager/src/routes/content/content.module.less 
b/manager/doris-manager/src/routes/meta/meta.less
similarity index 100%
copy from manager/doris-manager/src/routes/content/content.module.less
copy to manager/doris-manager/src/routes/meta/meta.less
diff --git a/manager/doris-manager/src/routes/content/index.tsx 
b/manager/doris-manager/src/routes/meta/meta.tsx
similarity index 71%
rename from manager/doris-manager/src/routes/content/index.tsx
rename to manager/doris-manager/src/routes/meta/meta.tsx
index d928cee..4d06a88 100644
--- a/manager/doris-manager/src/routes/content/index.tsx
+++ b/manager/doris-manager/src/routes/meta/meta.tsx
@@ -19,39 +19,34 @@
  * @format
  */
 import React, { useEffect, useState } from 'react';
-import { renderRoutes } from 'react-router-config';
-import CSSModules from 'react-css-modules';
-import styles from './content.module.less';
+import styles from './meta.less';
 import { PageSide } from '@src/layout/page-side/index';
 import { MetaBaseTree } from '../tree/index';
 import { Redirect, Route, Router, Switch } from 'react-router-dom';
 import TableContent from '../table-content';
 import Database from '../database';
 
-function MiddleContent(props: any) {
+export function Meta(props: any) {
     return (
-        <div styleName="palo-new-main">
-            <div styleName="new-main-sider">
+        <div className={styles['palo-new-main']}>
+            <div className={styles['new-main-sider']}>
                 <PageSide>
                     <MetaBaseTree></MetaBaseTree>
                 </PageSide>
             </div>
             <div
-                styleName="site-layout-background new-main-content"
+                className={styles['new-main-content']}
                 style={{
                     margin: '15px',
                     marginTop: 0,
                     height: 'calc(100vh - 95px)',
-                    // overflow: 'hidden'
                 }}
             >
                 <Switch>
-                    <Route path="/:nsId/content/table/:tableId" 
component={TableContent}/>
-                    <Route path="/:nsId/content/database" 
component={Database}/>
+                    <Route path="/meta/table/:tableId" 
component={TableContent}/>
+                    <Route path="/meta/database" component={Database}/>
                 </Switch>
             </div>
         </div>
     );
 }
-
-export default CSSModules(styles, { allowMultiple: true })(MiddleContent);
diff --git a/manager/doris-manager/src/routes/node/dashboard/index.tsx 
b/manager/doris-manager/src/routes/node/dashboard/index.tsx
index c76f614..f53cd45 100644
--- a/manager/doris-manager/src/routes/node/dashboard/index.tsx
+++ b/manager/doris-manager/src/routes/node/dashboard/index.tsx
@@ -15,7 +15,6 @@
 // specific language governing permissions and limitations
 // under the License.
 
-/* eslint-disable prettier/prettier */
 import { Row, Col, Select, Collapse, Button, Divider, AutoComplete } from 
'antd';
 import React, { useEffect, useState } from 'react';
 import { useTranslation } from 'react-i18next';
@@ -64,7 +63,7 @@ echarts.use([
 const { Panel } = Collapse;
 const { Option } = Select;
 
-export function Monitor() {
+export function NodeDashboard() {
     const { t } = useTranslation();
     const [TIMES, setTIMES] = useState(() => getTimes(dayjs()));
     const [beNodes, setBENodes] = useState<string[]>([]);
@@ -99,7 +98,7 @@ export function Monitor() {
         option.xAxis.data = xAxisData;
         const series: any[] = [];
         const legendData: any[] = [];
-        
+
         function transformChartsData(y_value: string, formatter?: string) {
             for (const [key, value] of Object.entries(y_value).sort()) {
                 if (Array.isArray(value)) {
@@ -126,23 +125,23 @@ export function Monitor() {
             transformChartsData(response.y_value);
         }
         option.legend = {
-            bottom: "0",
-            left:0,
+            bottom: '0',
+            left: 0,
             height: 80,
             width: 'auto',
-            type: "scroll",
+            type: 'scroll',
             itemHeight: 10,
             data: legendData,
-            orient: "vertical",
+            orient: 'vertical',
             pageIconSize: 7,
             textStyle: {
-                overflow: "breakAll"
+                overflow: 'breakAll',
             },
-        }
-        option.grid = {
-            bottom: 110
-          },
-        option.series = series;
+        };
+        (option.grid = {
+            bottom: 110,
+        }),
+            (option.series = series);
         return option;
     }
 
@@ -190,10 +189,13 @@ export function Monitor() {
             nodes: selectedBENodes,
         }).then(res => {
             const option = formatData(res.data, '基线数据版本合并情况');
-            option.legend.left = 20
-            option. yAxis = { type: 'value' ,minInterval : 1,
+            option.legend.left = 20;
+            option.yAxis = {
+                type: 'value',
+                minInterval: 1,
 
-            boundaryGap : [ 0, 0.1 ]}
+                boundaryGap: [0, 0.1],
+            };
             setBE_base_compaction_score(option);
         });
     }
@@ -202,10 +204,13 @@ export function Monitor() {
             nodes: selectedBENodes,
         }).then(res => {
             const option = formatData(res.data, '增量数据版本合并情况');
-            option.legend.left = 20
-            option. yAxis = { type: 'value' ,minInterval : 1,
+            option.legend.left = 20;
+            option.yAxis = {
+                type: 'value',
+                minInterval: 1,
 
-            boundaryGap : [ 0, 0.1 ]}
+                boundaryGap: [0, 0.1],
+            };
             setBE_cumu_compaction_score(option);
         });
     }
@@ -250,14 +255,14 @@ export function Monitor() {
             </Row>
             <div style={{ marginTop: 10 }}>
                 <Collapse defaultActiveKey="1">
-                    <Panel header={ t`BENodeStatusMonitoring`} key="1">
+                    <Panel header={t`BENodeStatusMonitoring`} key="1">
                         <Row justify="start" align="middle" style={{ padding: 
'20px 20px' }}>
                             <span>{t`nodeSelection`}:</span>
                             <Select
                                 mode="multiple"
                                 allowClear
                                 style={{ width: 600 }}
-                                placeholder={ t`PleaseSelectNode`}
+                                placeholder={t`PleaseSelectNode`}
                                 defaultValue={[...beNodes]}
                                 onChange={handleBENodeChange}
                             >
@@ -268,7 +273,7 @@ export function Monitor() {
                                 ))}
                             </Select>
                         </Row>
-                        <Row justify="start" >
+                        <Row justify="start">
                             <Row style={{ height: 340, width: 'calc(100% / 3)' 
}}>
                                 <h4>{t`CPUidleRate`}</h4>
                                 <ReactEChartsCore
@@ -276,7 +281,7 @@ export function Monitor() {
                                     option={be_cpu_idle}
                                     notMerge={true}
                                     lazyUpdate={true}
-                                    style={{ height: 340,width: 
'100%',top:'-20px' }}
+                                    style={{ height: 340, width: '100%', top: 
'-20px' }}
                                 />
                             </Row>
                             <Row style={{ height: 340, width: 'calc(100% / 3)' 
}}>
@@ -286,7 +291,7 @@ export function Monitor() {
                                     option={be_mem}
                                     notMerge={true}
                                     lazyUpdate={true}
-                                    style={{ height: 340, width: 
'100%',top:'-20px'}}
+                                    style={{ height: 340, width: '100%', top: 
'-20px' }}
                                 />
                             </Row>
                             <Row style={{ height: 340, width: 'calc(100% / 3)' 
}}>
@@ -296,30 +301,30 @@ export function Monitor() {
                                     option={be_disk_io}
                                     notMerge={true}
                                     lazyUpdate={true}
-                                    style={{ height: 340,width: 
'100%',top:'-20px' }}
+                                    style={{ height: 340, width: '100%', top: 
'-20px' }}
                                 />
                             </Row>
                         </Row>
                         <Divider />
-                        <Row justify="start" >
+                        <Row justify="start">
                             <Row style={{ height: 340, width: 'calc(100% / 2)' 
}}>
-                                <h4 style = {{marginLeft: 
'25px'}}>{t`BaselineDataVersionConsolidation`}</h4>
+                                <h4 style={{ marginLeft: '25px' 
}}>{t`BaselineDataVersionConsolidation`}</h4>
                                 <ReactEChartsCore
                                     echarts={echarts}
                                     option={be_base_compaction_score}
                                     notMerge={true}
                                     lazyUpdate={true}
-                                    style={{ height: 340, width: 
'100%',top:'-20px' }}
+                                    style={{ height: 340, width: '100%', top: 
'-20px' }}
                                 />
                             </Row>
                             <Row style={{ height: 340, width: 'calc(100% / 2)' 
}}>
-                                <h4 style={{ marginLeft: '25px' }}>{ 
t`IncrementalDataVersionConsolidation`}</h4>
+                                <h4 style={{ marginLeft: '25px' 
}}>{t`IncrementalDataVersionConsolidation`}</h4>
                                 <ReactEChartsCore
                                     echarts={echarts}
                                     option={be_cumu_compaction_score}
                                     notMerge={true}
                                     lazyUpdate={true}
-                                    style={{ height: 340,width: 
'100%',top:'-20px' }}
+                                    style={{ height: 340, width: '100%', top: 
'-20px' }}
                                 />
                             </Row>
                         </Row>
@@ -329,4 +334,3 @@ export function Monitor() {
         </div>
     );
 }
-export default Monitor;
diff --git 
a/manager/doris-manager/src/routes/node/list/be-configuration/index.tsx 
b/manager/doris-manager/src/routes/node/list/be-configuration/index.tsx
index fe8ca21..1beb74d 100644
--- a/manager/doris-manager/src/routes/node/list/be-configuration/index.tsx
+++ b/manager/doris-manager/src/routes/node/list/be-configuration/index.tsx
@@ -20,7 +20,6 @@ import React, { useEffect, useState } from 'react';
 import { Descriptions, Radio, Select, Table, Space, Modal, Form, Input, 
Tooltip, message, Divider } from 'antd';
 import { InfoCircleOutlined } from '@ant-design/icons';
 const { Option } = Select;
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import { ConfigurationTypeEnum } from '@src/common/common.data';
 import { BeConfigAPI } from './be-config.api';
 import { useHistory } from 'react-router-dom';
@@ -95,10 +94,10 @@ function Configuration() {
         setTypeValue(e.target.value);
         if (e.target.value === ConfigurationTypeEnum.BE) {
             localStorage.setItem("nodeText","");
-            history.push(`/${DEFAULT_NAMESPACE_ID}/be-configuration`);
+            history.push(`/configuration/be`);
         } else {
             localStorage.setItem("nodeText","");
-            history.push(`/${DEFAULT_NAMESPACE_ID}/fe-configuration`);
+            history.push(`/configuration/fe`);
         }
     }
     const handleOk = (values: any) => {
diff --git a/manager/doris-manager/src/routes/node/list/configuration/index.tsx 
b/manager/doris-manager/src/routes/node/list/configuration/index.tsx
index 408f338..2c91453 100644
--- a/manager/doris-manager/src/routes/node/list/configuration/index.tsx
+++ b/manager/doris-manager/src/routes/node/list/configuration/index.tsx
@@ -17,7 +17,6 @@
 
 import React, { useState } from 'react';
 import { Descriptions, Radio, Select, Table, message } from 'antd';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import { ConfigurationTypeEnum } from '@src/common/common.data';
 import { useHistory } from 'react-router-dom';
 import { useTranslation } from 'react-i18next';
@@ -45,10 +44,10 @@ function Configuration() {
     function onChange(e: any) {
         if (e.target.value === ConfigurationTypeEnum.BE) {
             localStorage.setItem("nodeText","");
-            history.push(`/${DEFAULT_NAMESPACE_ID}/be-configuration`);
+            history.push(`/configuration/be`);
         } else {
             localStorage.setItem("nodeText","");
-            history.push(`/${DEFAULT_NAMESPACE_ID}/fe-configuration`);
+            history.push(`/configuration/fe`);
         }
     }
 
diff --git 
a/manager/doris-manager/src/routes/node/list/fe-configuration/index.tsx 
b/manager/doris-manager/src/routes/node/list/fe-configuration/index.tsx
index e3ba100..18b5ed1 100644
--- a/manager/doris-manager/src/routes/node/list/fe-configuration/index.tsx
+++ b/manager/doris-manager/src/routes/node/list/fe-configuration/index.tsx
@@ -19,7 +19,6 @@ import React, { useEffect, useState } from 'react';
 import { Descriptions, Radio, Select, Table, Space, Modal, Form, Input, 
Tooltip, message, Divider } from 'antd';
 import { FallOutlined, InfoCircleOutlined } from '@ant-design/icons';
 const { Option } = Select;
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import { ConfigurationTypeEnum } from '@src/common/common.data';
 import { FeConfigAPI } from './fe-config.api';
 import { useHistory } from 'react-router-dom';
@@ -95,10 +94,10 @@ function Configuration() {
         setTypeValue(e.target.value);
         if (e.target.value === ConfigurationTypeEnum.BE) {
             localStorage.setItem("nodeText","");
-            history.push(`/${DEFAULT_NAMESPACE_ID}/be-configuration`);
+            history.push(`/configuration/fe`);
         } else {
             localStorage.setItem("nodeText","");
-            history.push(`/${DEFAULT_NAMESPACE_ID}/fe-configuration`);
+            history.push(`/configuration/be`);
         }
     }
     const handleOk = (values: any) => {
diff --git a/manager/doris-manager/src/routes/node/list/index.tsx 
b/manager/doris-manager/src/routes/node/list/index.tsx
index 7c74c49..8e29c6d 100644
--- a/manager/doris-manager/src/routes/node/list/index.tsx
+++ b/manager/doris-manager/src/routes/node/list/index.tsx
@@ -18,7 +18,6 @@
 /* eslint-disable prettier/prettier */
 import React, { useEffect, useState } from 'react';
 import { Table, Space, message } from 'antd';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import { NodeAPI } from './node.api';
 import { useHistory } from 'react-router-dom';
 import { useTranslation } from 'react-i18next';
@@ -145,14 +144,14 @@ function NodeList() {
         let node = "";
         node += record[2]+":"+record[6]
         localStorage.setItem("nodeText", node);
-        history.push(`/${DEFAULT_NAMESPACE_ID}/be-configuration`)
+        history.push(`/configuration/be`)
     }
 
     function toFeDetailsPage(record: any) {
         let node = "";
         node += record[1]+":"+record[4]
         localStorage.setItem("nodeText", node);
-        history.push(`/${DEFAULT_NAMESPACE_ID}/fe-configuration`) ;
+        history.push(`/configuration/fe`) ;
     }
     return (
         <>
diff --git a/manager/doris-manager/src/routes/passport/index.tsx 
b/manager/doris-manager/src/routes/passport/index.tsx
index 6bda6f8..0df4107 100644
--- a/manager/doris-manager/src/routes/passport/index.tsx
+++ b/manager/doris-manager/src/routes/passport/index.tsx
@@ -21,7 +21,7 @@ import { InfoCircleOutlined } from '@ant-design/icons';
 import styles from './index.module.less';
 import classNames from 'classnames';
 import Link from 'antd/lib/typography/Link';
-import { DEFAULT_NAMESPACE_ID, VERSION } from 'src/config';
+import { VERSION } from 'src/config';
 import { PassportAPI } from './passport.api';
 import { config } from 'process';
 import { STUDIO_INDEX_URL, MANAGE_INDEX_URL } from '@src/common/common.data';
diff --git a/manager/doris-manager/src/routes/query/index.tsx 
b/manager/doris-manager/src/routes/query/index.tsx
index 11f117e..89f5060 100644
--- a/manager/doris-manager/src/routes/query/index.tsx
+++ b/manager/doris-manager/src/routes/query/index.tsx
@@ -18,7 +18,6 @@
 /* eslint-disable prettier/prettier */
 import React, { useState, useEffect } from 'react';
 import { Table, Card, Space, Input } from 'antd';
-import { DEFAULT_NAMESPACE_ID, VERSION } from '@src/config';
 import { useTranslation } from 'react-i18next';
 import { getQueryInfo } from './query.api';
 import { ColumnsType } from 'antd/es/table';
@@ -39,7 +38,7 @@ function Query() {
 
     function queryDetails(record: any) {
         console.log(record)
-        history.push(`/${DEFAULT_NAMESPACE_ID}/details/${record[0]}`)
+        history.push(`/details/${record[0]}`)
     }
     useEffect(() => {
         getQueryInfo().then(res => {
diff --git a/manager/doris-manager/src/routes/space/index.tsx 
b/manager/doris-manager/src/routes/space/index.tsx
deleted file mode 100644
index ad8abe2..0000000
--- a/manager/doris-manager/src/routes/space/index.tsx
+++ /dev/null
@@ -1,195 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-import { Space, Card, Divider, message } from 'antd';
-import React, { useEffect, useState } from 'react';
-import { Form, Input, Button, Radio } from 'antd';
-import { InfoCircleOutlined } from '@ant-design/icons';
-import styles from './index.module.less';
-import Password from 'antd/lib/input/Password';
-type RequiredMark = boolean | 'optional';
-import { SpaceAPI } from './space.api';
-import { useHistory } from 'react-router-dom';
-import { useTranslation } from 'react-i18next';
-
-
-const FormLayoutDemo = () => {
-    const { t } = useTranslation();
-    const [form] = Form.useForm();
-    const [clusterForm] = Form.useForm();
-    const [requiredMark, setRequiredMarkType] = 
useState<RequiredMark>('optional');
-    const history = useHistory();
-
-    const onRequiredTypeChange = ({ requiredMarkValue }: { requiredMarkValue: 
RequiredMark }) => {
-        setRequiredMarkType(requiredMarkValue);
-    };
-    const handleCreate = () => {
-        form.validateFields().then(values => {
-            clusterForm.validateFields().then(cluValues => {
-                 SpaceAPI.spaceCreate({
-                        cluster:{
-                            "address": cluValues.address,
-                            "httpPort": cluValues.httpPort,
-                            "passwd": cluValues.passwd || "",
-                            "queryPort": cluValues.queryPort,
-                            "user": cluValues.user 
-                        },
-                        name: values.userName,
-                        describe: values.describe,
-                        user:{
-                            "email": values.email,
-                            "name": values.name,
-                            "password": values.password
-                        }
-                    }).then(res => {
-                    const { msg, data, code } = res;
-                    if (code === 0) {
-                        if (res.data) {
-                            message.success(msg);
-                            history.replace(`/space/list`);
-                        }
-                    } else {
-                        message.error(msg);
-                    }
-                });
-            })
-        })
-    }
-    const handleLinkTest = () => {
-        clusterForm.validateFields().then(values => {
-            SpaceAPI.spaceValidate({ 
-                    address: values.address, 
-                    httpPort: values.httpPort, 
-                    passwd: values.passwd || "", 
-                    queryPort: values.queryPort, 
-                    user: values.user 
-                }).then(res => {
-                    const { msg, data, code } = res;
-                    if (code === 0) {
-                    message.success(msg)
-                    } else {
-                        message.error(msg);
-                    }
-                },
-            );
-        })
-     
-    }
-
-    const handleCheckName = () => {
-        SpaceAPI.spaceCheck(form.getFieldValue('name'))
-    }
-
-    return (
-        <>
-          <Form
-            form={form}
-            layout="vertical"
-            initialValues={{ requiredMarkValue: requiredMark }}
-            onValuesChange={onRequiredTypeChange}
-            requiredMark={requiredMark}
-            className={styles['input-gird']}
-          >
-            <h2>{t`spaceInfo`}</h2>
-            <Divider plain></Divider>
-            <Form.Item label={t`spaceName`} name="name" 
-                rules={[
-                    {
-                      required: true,
-                      validator: async (rule, value) => {
-                        if(!value){
-                            return Promise.reject(new Error(t`required`));
-                        }
-                        let resData = await SpaceAPI.spaceCheck(value);
-                        if(resData.code === 0){
-                            return Promise.resolve();
-                        }
-                        return Promise.reject(new Error(resData.msg));
-                      }
-                    },
-                  ]}
-                  validateTrigger="onBlur">
-                <Input placeholder={t`spaceName`} onChange={handleCheckName}/>
-            </Form.Item>
-            <Form.Item label={t`spaceIntroduction`} name="describe" 
rules={[{required: true,message: t`required`}]}>
-                <Input placeholder={t`spaceIntroduction`}/>
-            </Form.Item>
-            <Form.Item label={t`adminName`} name="userName" rules={[{required: 
true,message: t`required`}]}>
-                <Input placeholder={t`adminName`} />
-            </Form.Item>
-            <Form.Item label={t`adminEmail`} name="email" rules={[{required: 
true,message: t`required`}]}>
-                <Input placeholder={t`adminEmail`} />
-            </Form.Item>
-            <Form.Item label={t`adminpsw`} name="password" rules={[{required: 
true,message: t`required`}]}>
-                <Input.Password style={{ width: '400px' }} />
-            </Form.Item>
-            <Form.Item 
-                label={t`confirmPassword`} 
-                name="passwordCopy" 
-                rules={[
-                    {
-                      required: true,
-                      message: t`confirmPassword`,
-                    },
-                    ({ getFieldValue }) => ({
-                      validator(_, value) {
-                        if (!value || getFieldValue('password') === value) {
-                          return Promise.resolve();
-                        }
-                        return Promise.reject(new 
Error(t`inconsistentPasswords`));
-                      },
-                    }),
-                  ]}
-                >
-                <Input.Password style={{ width: '400px' }} />
-            </Form.Item>
-          </Form>
-           
-          <Form
-            form={clusterForm}
-            layout="vertical"
-            initialValues={{ requiredMarkValue: requiredMark }}
-            onValuesChange={onRequiredTypeChange}
-            requiredMark={requiredMark}
-            className={styles['input-gird']}
-        >
-            <h2>{t`clusterInfo`}</h2>
-            <Divider plain></Divider>
-            <Form.Item label={t`clusterAddr`} name="address" 
rules={[{required: true,message: t`required`}]}>
-                <Input placeholder={t`clusterAddr`} />
-            </Form.Item>
-            <Form.Item label={t`httpPort`} name="httpPort" rules={[{required: 
true,message: t`required`}]}>
-                <Input placeholder={t`httpPort`} />
-            </Form.Item>
-            <Form.Item label={t`JDBCPort`} name="queryPort" rules={[{required: 
true,message: t`required`}]}>
-                <Input placeholder={t`JDBCPort`} />
-            </Form.Item>
-            <Form.Item label={t`userName`} name="user" rules={[{required: 
true,message: t`required`}]}>
-                <Input placeholder={t`userName`} />
-            </Form.Item>
-            <Form.Item label={t`userPwd`} name="passwd">
-                <Input.Password style={{ width: '400px' }} 
className={styles['input-password']} />
-            </Form.Item>
-            <Form.Item>
-                <Button type="primary" onClick = 
{handleLinkTest}>{t`linkTest`}</Button>
-                &nbsp;
-                <Button type="primary" onClick = 
{handleCreate}>{t`submit`}</Button>
-            </Form.Item>
-          </Form>
-        </>
-      );
-};
-export default FormLayoutDemo;
diff --git a/manager/doris-manager/src/routes/space/space-check.tsx 
b/manager/doris-manager/src/routes/space/space-check.tsx
deleted file mode 100644
index 3a4649d..0000000
--- a/manager/doris-manager/src/routes/space/space-check.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-import { Space, Card, Divider, message } from 'antd';
-import React, { useEffect, useState } from 'react';
-import { useParams } from 'react-router-dom';
-import { Form, Input, Button, Radio } from 'antd';
-import { InfoCircleOutlined } from '@ant-design/icons';
-import styles from './index.module.less';
-import Password from 'antd/lib/input/Password';
-type RequiredMark = boolean | 'optional';
-import { SpaceAPI } from './space.api';
-import { useTranslation } from 'react-i18next';
-
-const user = JSON.parse(JSON.stringify(window.localStorage.getItem('user')));
-const FormLayoutDemo = () => {
-    const { t } = useTranslation();
-    const [form] = Form.useForm();
-    const [ formData, setFormData ] = useState<any>({});
-    const params = useParams<{spaceId: string}>();
-    function refresh() {
-        SpaceAPI.spaceGet( params.spaceId ).then(res => {
-            const { msg, data, code } = res;
-            if (code === 0) {
-                if (res.data) {
-                    setFormData(res.data);
-                }
-            } else {
-                message.error(msg);
-            }
-        });
-    }
-    const [requiredMark, setRequiredMarkType] = 
useState<RequiredMark>('optional');
-
-    const onRequiredTypeChange = ({ requiredMarkValue }: { requiredMarkValue: 
RequiredMark }) => {
-        setRequiredMarkType(requiredMarkValue);
-    };
-    useEffect(() => {
-        refresh();
-    }, []);
-    return (
-        <Form
-            form={form}
-            layout="vertical"
-            initialValues={{ requiredMarkValue: requiredMark }}
-            onValuesChange={onRequiredTypeChange}
-            requiredMark={requiredMark}
-            className={styles['input-gird']}
-        >
-            <h2>{t`spaceInfo`}</h2>
-            <Divider plain></Divider>
-            <Form.Item label={t`spaceName`}  required>
-                <Input placeholder="input placeholder" value={formData.name} 
disabled/>
-            </Form.Item>
-            <Form.Item label={t`spaceIntroduction`} required>
-                <Input placeholder="input placeholder" 
value={formData.description} disabled/>
-            </Form.Item>
-            {/* {user.authType === "studio" && ( */}
-                 <Form.Item label={t`adminName`} required>
-                    <Input placeholder="input placeholder" 
value={formData.spaceAdminUser} disabled/>
-                </Form.Item>
-            {/* )} */}
-            {/* {user.authType === "studio" && ( */}
-                {/* <Form.Item label={t`adminpsw`} required>
-                    <Input.Password style={{ width: '400px' }} 
className={styles['input-password']} disabled/>
-                </Form.Item> */}
-            {/* )} */}
-            
-            <h2>{t`clusterInfo`}</h2>
-            <Divider plain></Divider>
-            <Form.Item label={t`clusterAddr`}  required>
-                <Input placeholder="input placeholder" 
value={formData.paloAddress} disabled/>
-            </Form.Item>
-            <Form.Item label={t`httpPort`} required>
-                <Input placeholder="input placeholder" 
value={formData.httpPort} disabled/>
-            </Form.Item>
-            <Form.Item label={t`JDBCPort`} required>
-                <Input placeholder="input placeholder"  
value={formData.queryPort} disabled/>
-            </Form.Item>
-            <Form.Item label={t`userName`} required>
-                <Input placeholder="input placeholder" 
value={formData.paloAdminUser}  disabled/>
-            </Form.Item>
-            {/* <Form.Item label={t`userPwd`}  required>
-                <Input.Password style={{ width: '400px' }} 
className={styles['input-password']} disabled/>
-            </Form.Item> */}
-            {/* <Form.Item>
-                <Button type="primary">Submit</Button>
-            </Form.Item> */}
-        </Form>
-    );
-};
-export default FormLayoutDemo;
diff --git a/manager/doris-manager/src/routes/admin-container.tsx 
b/manager/doris-manager/src/routes/super-admin-container.tsx
similarity index 69%
rename from manager/doris-manager/src/routes/admin-container.tsx
rename to manager/doris-manager/src/routes/super-admin-container.tsx
index a63499f..02bf421 100644
--- a/manager/doris-manager/src/routes/admin-container.tsx
+++ b/manager/doris-manager/src/routes/super-admin-container.tsx
@@ -16,15 +16,14 @@
 // under the License.
 
 import React, { lazy } from 'react';
-import { Redirect, Route, Router, Switch } from 'react-router-dom';
 import { Header } from '@src/components/header/header';
 import { Layout } from 'antd';
+import { Redirect, Route, Router, Switch } from 'react-router-dom';
+import SpaceNew from './super-admin/space/new-space/new-space';
+import SpaceList from './super-admin/space/list/list';
+import SpaceDetail from './super-admin/space/detail/space-detail';
 
-const SpaceList = lazy(() => import('./space/list'));
-const SpaceNew = lazy(() => import('./space/index'));
-const SpaceCheck = lazy(() => import('./space/space-check'));
-
-class AdminContainer extends React.Component<any, {}> {
+class SuperAdminContainer extends React.Component<any, {}> {
     constructor(props: any) {
         super(props);
     }
@@ -36,10 +35,10 @@ class AdminContainer extends React.Component<any, {}> {
                 <Header></Header>
                 <Switch>
                     {/* 空间 */}
-                    <Route path="/space/list" component={SpaceList} />
-                    <Route path="/space/check/:spaceId" component={SpaceCheck} 
/>
-                    <Route path="/space/new" component={SpaceNew} />
-                    <Redirect to="/space/list" />
+                    <Route path="/super-admin/space/list" 
component={SpaceList} />
+                    <Route path="/super-admin/space/detail/:spaceId" 
component={SpaceDetail} />
+                    <Route path="/super-admin/space/new" component={SpaceNew} 
/>
+                    <Redirect to="/super-admin/space/list" />
                 </Switch>
               </Layout>
                 
@@ -48,4 +47,4 @@ class AdminContainer extends React.Component<any, {}> {
     }
 }
 
-export default AdminContainer;
+export default SuperAdminContainer;
diff --git 
a/manager/doris-manager/src/routes/super-admin/space/detail/space-detail.tsx 
b/manager/doris-manager/src/routes/super-admin/space/detail/space-detail.tsx
new file mode 100644
index 0000000..263bd1a
--- /dev/null
+++ b/manager/doris-manager/src/routes/super-admin/space/detail/space-detail.tsx
@@ -0,0 +1,130 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import React, { useEffect, useState } from 'react';
+import styles from '../space.less';
+import { Button, Form, Input, Row, Space } from 'antd';
+import { Divider, message } from 'antd';
+import { SpaceAPI } from '../space.api';
+import { useHistory, useParams } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import { RequiredMark } from 'antd/lib/form/Form';
+import { modal } from '@src/components/doris-modal/doris-modal';
+
+const SpaceDetail = () => {
+    const { t } = useTranslation();
+    const [form] = Form.useForm();
+    const [formData, setFormData] = useState<any>({});
+    const params = useParams<{ spaceId: string }>();
+    const history = useHistory();
+    function refresh() {
+        SpaceAPI.spaceGet(params.spaceId).then(res => {
+            const { msg, data, code } = res;
+            if (code === 0) {
+                if (res.data) {
+                    setFormData(res.data);
+                }
+            } else {
+                message.error(msg);
+            }
+        });
+    }
+    const [requiredMark, setRequiredMarkType] = 
useState<RequiredMark>('optional');
+
+    const onRequiredTypeChange = ({ requiredMarkValue }: { requiredMarkValue: 
RequiredMark }) => {
+        setRequiredMarkType(requiredMarkValue);
+    };
+    useEffect(() => {
+        refresh();
+    }, []);
+
+    function handleDelete() {
+        const spaceId = params.spaceId;
+        modal.confirm(
+            t`notice`,
+            t`SpaceDeleteTips`,
+            async () => {
+                SpaceAPI.spaceDelete(spaceId).then(result => {
+                    if (result && result.code !== 0) {
+                        modal.error(t`Failed`, result.msg);
+                    } else {
+                        modal.success(t`DeleteSuccessTips`).then(result => {
+                            if (result.isConfirmed) {
+                                history.push(`/super-admin/space/list`);
+                            }
+                        });
+                    }
+                });
+            },
+        );
+    }
+    return (
+        <div style={{ padding: '20px 0' }}>
+            <Form
+                form={form}
+                layout="vertical"
+                initialValues={{ requiredMarkValue: requiredMark }}
+                onValuesChange={onRequiredTypeChange}
+                requiredMark={requiredMark}
+                className={styles['input-gird']}
+            >
+                <h2>{t`spaceInfo`}</h2>
+                <Divider plain></Divider>
+                <Form.Item label={t`spaceName`} required>
+                    <Input placeholder="input placeholder" 
value={formData.name} disabled />
+                </Form.Item>
+                <Form.Item label={t`spaceIntroduction`} required>
+                    <Input placeholder="input placeholder" 
value={formData.description} disabled />
+                </Form.Item>
+                <Form.Item label={t`adminName`} required>
+                    <Input placeholder="input placeholder" 
value={formData.spaceAdminUser} disabled />
+                </Form.Item>
+
+                <h2>{t`clusterInfo`}</h2>
+                <Divider plain></Divider>
+                <Form.Item label={t`clusterAddr`} required>
+                    <Input placeholder="input placeholder" 
value={formData.paloAddress} disabled />
+                </Form.Item>
+                <Form.Item label={t`httpPort`} required>
+                    <Input placeholder="input placeholder" 
value={formData.httpPort} disabled />
+                </Form.Item>
+                <Form.Item label={t`JDBCPort`} required>
+                    <Input placeholder="input placeholder" 
value={formData.queryPort} disabled />
+                </Form.Item>
+                <Form.Item label={t`userName`} required>
+                    <Input placeholder="input placeholder" 
value={formData.paloAdminUser} disabled />
+                </Form.Item>
+            </Form>
+            <Row justify="center">
+                <Space>
+                    <Button type="primary" danger onClick={handleDelete}>
+                        {t`Delete`}
+                    </Button>
+                    <Button
+                        type="primary"
+                        onClick={() => {
+                            history.push(`/super-admin/space/list`);
+                        }}
+                    >
+                        {t`GoBack`}
+                    </Button>
+                </Space>
+            </Row>
+        </div>
+    );
+};
+export default SpaceDetail;
diff --git a/manager/doris-manager/src/routes/super-admin/space/list/list.less 
b/manager/doris-manager/src/routes/super-admin/space/list/list.less
new file mode 100644
index 0000000..e69de29
diff --git a/manager/doris-manager/src/routes/space/list.tsx 
b/manager/doris-manager/src/routes/super-admin/space/list/list.tsx
similarity index 50%
rename from manager/doris-manager/src/routes/space/list.tsx
rename to manager/doris-manager/src/routes/super-admin/space/list/list.tsx
index 24255d5..ecfa09a 100644
--- a/manager/doris-manager/src/routes/space/list.tsx
+++ b/manager/doris-manager/src/routes/super-admin/space/list/list.tsx
@@ -14,19 +14,20 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-import { Space, Card, Divider, message } from 'antd';
 import React, { useEffect, useState } from 'react';
+import styles from '../space.less';
+import { Card, Form } from 'antd';
+import { message, Space } from 'antd';
 import { useHistory } from 'react-router-dom';
-import { Form, Input, Button, Radio } from 'antd';
-import { InfoCircleOutlined } from '@ant-design/icons';
-import styles from './index.module.less';
-import Password from 'antd/lib/input/Password';
-type RequiredMark = boolean | 'optional';
-import { SpaceAPI } from './space.api';
+import { SpaceAPI } from '../space.api';
+import { RequiredMark } from 'antd/lib/form/Form';
+import { PlusOutlined } from '@ant-design/icons';
+import { useTranslation } from 'react-i18next';
 
-const FormLayoutDemo = () => {
-    const [spaceList, setSpaceList] = useState<{name: string, description: 
string, id: string}[]>([]);
+const SpaceList = () => {
+    const [spaceList, setSpaceList] = useState<{ name: string; description: 
string; id: string }[]>([]);
     const history = useHistory();
+    const { t } = useTranslation();
     function refresh() {
         SpaceAPI.spaceList().then(res => {
             const { msg, data, code } = res;
@@ -41,6 +42,9 @@ const FormLayoutDemo = () => {
     }
     const [form] = Form.useForm();
     const [requiredMark, setRequiredMarkType] = 
useState<RequiredMark>('optional');
+    const cardStyle = {
+        width: 500, marginBottom: 40, cursor: 'pointer', height: 100
+    }
 
     const onRequiredTypeChange = ({ requiredMarkValue }: { requiredMarkValue: 
RequiredMark }) => {
         setRequiredMarkType(requiredMarkValue);
@@ -50,40 +54,27 @@ const FormLayoutDemo = () => {
     }, []);
     return (
         <div className={styles.dorisSpaceList}>
-        <ul className={styles.dorisSpaceListContainer}>
-          {spaceList &&
-            spaceList.map((item, index) => {
-              return (
-                <li
-                  className="columns"
-                  key={item.name + index}
-                  onClick={() => {
-                    history.push(`/space/check/${item.id}`);
-                  }}
+            <div className={styles.dorisSpaceListContainer}>
+                {spaceList &&
+                    spaceList.map((item, index) => {
+                        return (
+                            <Card onClick={() => 
history.push(`/super-admin/space/detail/${item.id}`)} key={item.name} 
title={item.name} size="small" style={cardStyle}>
+                                <p>{item.description}</p>
+                            </Card>
+                        );
+                    })}
+                <Card
+                    onClick={() => history.push('/super-admin/space/new')}
+                    size="small"
+                    style={cardStyle}
                 >
-                  <div className="bg-white rounded bordered shadowed 
overflow-hidden">
-                    <h3 className="space-title">
-                      <span>{item.name}</span>
-                    </h3>
-                    <p>{item.description}</p>
-                  </div>
-                </li>
-              );
-            })}
-          <li className="columns text-centered">
-            <div className="bg-white rounded bordered shadowed 
overflow-hidden">
-              <a
-                className="newSpaceBTN"
-                onClick={() => history.push("/space/new")}
-              >
-                {/* <span className="plus">+</span> */}
-                {/* <Icon name={"add"} color="#ccc" size={60} /> */}
-                <span>新建空间</span>
-              </a>
+                    <Space style={{display: 'flex', alignItems: 'middle', 
justifyContent: 'center', fontSize: 18, lineHeight: '80px'}}>
+                        <PlusOutlined />
+                        <span>{t`NewSpace`}</span>
+                    </Space>
+                </Card>
             </div>
-          </li>
-        </ul>
-      </div>
+        </div>
     );
 };
-export default FormLayoutDemo;
+export default SpaceList;
diff --git 
a/manager/doris-manager/src/routes/super-admin/space/new-space/new-space.tsx 
b/manager/doris-manager/src/routes/super-admin/space/new-space/new-space.tsx
new file mode 100644
index 0000000..5cfdb1c
--- /dev/null
+++ b/manager/doris-manager/src/routes/super-admin/space/new-space/new-space.tsx
@@ -0,0 +1,198 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import { Divider, message } from 'antd';
+import React, { useEffect, useState } from 'react';
+import { Form, Input, Button, Radio } from 'antd';
+import styles from '../space.less';
+type RequiredMark = boolean | 'optional';
+import { SpaceAPI } from '../space.api';
+import { useHistory } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+
+const SpaceNew = () => {
+    const { t } = useTranslation();
+    const [form] = Form.useForm();
+    const [clusterForm] = Form.useForm();
+    const [requiredMark, setRequiredMarkType] = 
useState<RequiredMark>('optional');
+    const history = useHistory();
+
+    const onRequiredTypeChange = ({ requiredMarkValue }: { requiredMarkValue: 
RequiredMark }) => {
+        setRequiredMarkType(requiredMarkValue);
+    };
+    const handleCreate = () => {
+        form.validateFields().then(values => {
+            clusterForm.validateFields().then(cluValues => {
+                SpaceAPI.spaceCreate({
+                    cluster: {
+                        address: cluValues.address,
+                        httpPort: cluValues.httpPort,
+                        passwd: cluValues.passwd || '',
+                        queryPort: cluValues.queryPort,
+                        user: cluValues.user,
+                    },
+                    name: values.userName,
+                    describe: values.describe,
+                    user: {
+                        email: values.email,
+                        name: values.name,
+                        password: values.password,
+                    },
+                }).then(res => {
+                    const { msg, data, code } = res;
+                    if (code === 0) {
+                        if (res.data) {
+                            message.success(msg);
+                            history.replace(`/space/list`);
+                        }
+                    } else {
+                        message.error(msg);
+                    }
+                });
+            });
+        });
+    };
+    const handleLinkTest = () => {
+        clusterForm.validateFields().then(values => {
+            SpaceAPI.spaceValidate({
+                address: values.address,
+                httpPort: values.httpPort,
+                passwd: values.passwd || '',
+                queryPort: values.queryPort,
+                user: values.user,
+            }).then(res => {
+                const { msg, data, code } = res;
+                if (code === 0) {
+                    message.success(msg);
+                } else {
+                    message.error(msg);
+                }
+            });
+        });
+    };
+
+    const handleCheckName = () => {
+        SpaceAPI.spaceCheck(form.getFieldValue('name'));
+    };
+
+    return (
+        <div style={{ padding: '20px 0' }}>
+            <Form
+                form={form}
+                layout="vertical"
+                initialValues={{ requiredMarkValue: requiredMark }}
+                onValuesChange={onRequiredTypeChange}
+                requiredMark={requiredMark}
+                className={styles['input-gird']}
+            >
+                <h2>{t`spaceInfo`}</h2>
+                <Divider plain></Divider>
+                <Form.Item
+                    label={t`spaceName`}
+                    name="name"
+                    rules={[
+                        {
+                            required: true,
+                            validator: async (rule, value) => {
+                                if (!value) {
+                                    return Promise.reject(new 
Error(t`required`));
+                                }
+                                let resData = await SpaceAPI.spaceCheck(value);
+                                if (resData.code === 0) {
+                                    return Promise.resolve();
+                                }
+                                return Promise.reject(new Error(resData.msg));
+                            },
+                        },
+                    ]}
+                    validateTrigger="onBlur"
+                >
+                    <Input placeholder={t`spaceName`} 
onChange={handleCheckName} />
+                </Form.Item>
+                <Form.Item
+                    label={t`spaceIntroduction`}
+                    name="describe"
+                    rules={[{ required: true, message: t`required` }]}
+                >
+                    <Input placeholder={t`spaceIntroduction`} />
+                </Form.Item>
+                <Form.Item label={t`adminName`} name="userName" rules={[{ 
required: true, message: t`required` }]}>
+                    <Input placeholder={t`adminName`} />
+                </Form.Item>
+                <Form.Item label={t`adminEmail`} name="email" rules={[{ 
required: true, message: t`required` }]}>
+                    <Input placeholder={t`adminEmail`} />
+                </Form.Item>
+                <Form.Item label={t`adminpsw`} name="password" rules={[{ 
required: true, message: t`required` }]}>
+                    <Input.Password style={{ width: '400px' }} />
+                </Form.Item>
+                <Form.Item
+                    label={t`confirmPassword`}
+                    name="passwordCopy"
+                    rules={[
+                        {
+                            required: true,
+                            message: t`confirmPassword`,
+                        },
+                        ({ getFieldValue }) => ({
+                            validator(_, value) {
+                                if (!value || getFieldValue('password') === 
value) {
+                                    return Promise.resolve();
+                                }
+                                return Promise.reject(new 
Error(t`inconsistentPasswords`));
+                            },
+                        }),
+                    ]}
+                >
+                    <Input.Password style={{ width: '400px' }} />
+                </Form.Item>
+            </Form>
+
+            <Form
+                form={clusterForm}
+                layout="vertical"
+                initialValues={{ requiredMarkValue: requiredMark }}
+                onValuesChange={onRequiredTypeChange}
+                requiredMark={requiredMark}
+                className={styles['input-gird']}
+            >
+                <h2>{t`clusterInfo`}</h2>
+                <Divider plain></Divider>
+                <Form.Item label={t`clusterAddr`} name="address" rules={[{ 
required: true, message: t`required` }]}>
+                    <Input placeholder={t`clusterAddr`} />
+                </Form.Item>
+                <Form.Item label={t`httpPort`} name="httpPort" rules={[{ 
required: true, message: t`required` }]}>
+                    <Input placeholder={t`httpPort`} />
+                </Form.Item>
+                <Form.Item label={t`JDBCPort`} name="queryPort" rules={[{ 
required: true, message: t`required` }]}>
+                    <Input placeholder={t`JDBCPort`} />
+                </Form.Item>
+                <Form.Item label={t`userName`} name="user" rules={[{ required: 
true, message: t`required` }]}>
+                    <Input placeholder={t`userName`} />
+                </Form.Item>
+                <Form.Item label={t`userPwd`} name="passwd">
+                    <Input.Password style={{ width: '400px' }} 
className={styles['input-password']} />
+                </Form.Item>
+                <Form.Item>
+                    <Button type="primary" 
onClick={handleLinkTest}>{t`linkTest`}</Button>
+                    &nbsp;
+                    <Button type="primary" 
onClick={handleCreate}>{t`submit`}</Button>
+                </Form.Item>
+            </Form>
+        </div>
+    );
+};
+export default SpaceNew;
diff --git a/manager/doris-manager/src/routes/space/space.api.ts 
b/manager/doris-manager/src/routes/super-admin/space/space.api.ts
similarity index 92%
rename from manager/doris-manager/src/routes/space/space.api.ts
rename to manager/doris-manager/src/routes/super-admin/space/space.api.ts
index 3dbe594..05934db 100644
--- a/manager/doris-manager/src/routes/space/space.api.ts
+++ b/manager/doris-manager/src/routes/super-admin/space/space.api.ts
@@ -31,8 +31,8 @@ function spaceCheck(name: string): 
Promise<IResult<MetaInfoResponse>> {
 function spaceValidate(data: any): Promise<IResult<MetaInfoResponse>> {
     return http.post(`/api/space/validate`, data);
 }
-function spaceDel(): Promise<IResult<MetaInfoResponse>> {
-    return http.post(`/api/space/:spaceId`);
+function spaceDelete(spaceId: string): Promise<IResult<MetaInfoResponse>> {
+    return http.delete(`/api/space/${spaceId}`);
 }
 function spaceGet(spaceId: string): Promise<IResult<MetaInfoResponse>> {
     return http.get(`/api/space/${spaceId}`);
@@ -45,7 +45,7 @@ export const SpaceAPI = {
     spaceList,
     spaceCheck,
     spaceValidate,
-    spaceDel,
+    spaceDelete,
     spaceGet,
     spaceUpdate,
 };
diff --git a/manager/doris-manager/src/routes/space/space.interface.ts 
b/manager/doris-manager/src/routes/super-admin/space/space.interface.ts
similarity index 88%
rename from manager/doris-manager/src/routes/space/space.interface.ts
rename to manager/doris-manager/src/routes/super-admin/space/space.interface.ts
index 822fa38..bd11a80 100644
--- a/manager/doris-manager/src/routes/space/space.interface.ts
+++ b/manager/doris-manager/src/routes/super-admin/space/space.interface.ts
@@ -27,3 +27,10 @@ export interface MetaInfoResponse {
     remainDisk: number;
     tblCount: number;
 }
+export interface Space {
+    name: string;
+    description: string;
+    id: string;
+}
+
+export type IRequiredMark = boolean | 'optional';
\ No newline at end of file
diff --git a/manager/doris-manager/src/routes/space/index.module.less 
b/manager/doris-manager/src/routes/super-admin/space/space.less
similarity index 97%
rename from manager/doris-manager/src/routes/space/index.module.less
rename to manager/doris-manager/src/routes/super-admin/space/space.less
index 1b5bf5f..4a31412 100644
--- a/manager/doris-manager/src/routes/space/index.module.less
+++ b/manager/doris-manager/src/routes/super-admin/space/space.less
@@ -36,9 +36,10 @@
 .dorisSpaceList .dorisSpaceListContainer {
   display: flex;
   flex-wrap: wrap;
-  width: 1100px;
+  padding: 40px 200px;
   margin: 0 auto;
   justify-content: space-between;
+  background-color: #f9fbfc;
 }
 .dorisSpaceList .dorisSpaceListContainer li {
   width: 500px;
diff --git 
a/manager/doris-manager/src/routes/table-content/schema/schema.data.ts 
b/manager/doris-manager/src/routes/table-content/schema/schema.data.ts
index af922a0..025366e 100644
--- a/manager/doris-manager/src/routes/table-content/schema/schema.data.ts
+++ b/manager/doris-manager/src/routes/table-content/schema/schema.data.ts
@@ -30,16 +30,19 @@ export const BASIC_COLUMN = [
         title: '列注释',
         dataIndex: 'comment',
         key: 'comment',
+        width: 80,
     },
     {
         title: '允许空值',
         dataIndex: 'isNull',
         key: 'isNull',
+        width: 80,
     },
     {
         title: '默认值',
         dataIndex: 'defaultVal',
         key: 'defaultVal',
+        width: 80,
     },
 ];
 
@@ -49,6 +52,7 @@ export const TABLE_COLUMN_DUPLICATE = [
         title: '排序列(duplicate key)',
         dataIndex: 'key',
         key: 'key',
+        width: 200,
     },
 ];
 
diff --git a/manager/doris-manager/src/routes/table-content/tabs/data.pre.tsx 
b/manager/doris-manager/src/routes/table-content/tabs/data.pre.tsx
index 3d02739..2f40e7e 100644
--- a/manager/doris-manager/src/routes/table-content/tabs/data.pre.tsx
+++ b/manager/doris-manager/src/routes/table-content/tabs/data.pre.tsx
@@ -23,7 +23,6 @@ import CSSModules from 'react-css-modules';
 import { Form, message, Table, Empty } from 'antd';
 import { useHistory } from 'react-router-dom';
 import { TableAPI } from '../table.api';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import EventEmitter from '@src/utils/event-emitter';
 const layout = {
     labelCol: { span: 6 },
@@ -43,7 +42,7 @@ function DataPre(props: any) {
     }, []);
     function refresh(id: string) {
         TableAPI.sendSql({
-            nsId: DEFAULT_NAMESPACE_ID,
+            nsId: '0',
             dbId: localStorage.getItem('database_id'),
             data: `select * from ${localStorage.getItem('table_name')} limit 
50`,
         }).then(res => {
diff --git 
a/manager/doris-manager/src/routes/table-content/tabs/dataImport-menu/index.tsx 
b/manager/doris-manager/src/routes/table-content/tabs/dataImport-menu/index.tsx
index 2041e8f..d3b71b1 100644
--- 
a/manager/doris-manager/src/routes/table-content/tabs/dataImport-menu/index.tsx
+++ 
b/manager/doris-manager/src/routes/table-content/tabs/dataImport-menu/index.tsx
@@ -20,7 +20,6 @@
 import React from 'react';
 import { Menu, Dropdown, Button } from 'antd';
 import { UploadOutlined } from '@ant-design/icons';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import { useHistory } from 'react-router-dom';
 import { FileWordOutlined, CloudServerOutlined } from '@ant-design/icons';
 import styles from '../tabs.module.less';
@@ -32,7 +31,7 @@ const getMenu = (history: any, props: any) => {
                     style={{ padding: '10px 25px', textAlign: 'center', color: 
'#757272' }}
                     onClick={() => {
                         history.push({
-                            pathname: 
`/${DEFAULT_NAMESPACE_ID}/local-import/${localStorage.table_id}`,
+                            pathname: `/local-import/${localStorage.table_id}`,
                         });
                     }}
                 >
@@ -45,7 +44,7 @@ const getMenu = (history: any, props: any) => {
                     style={{ padding: '10px 25px', textAlign: 'center', color: 
'#757272' }}
                     onClick={() => {
                         history.push({
-                            pathname: 
`/${DEFAULT_NAMESPACE_ID}/system-import/${localStorage.table_id}`,
+                            pathname: 
`/system-import/${localStorage.table_id}`,
                         });
                     }}
                 >
diff --git a/manager/doris-manager/src/routes/tree/create-menu/index.tsx 
b/manager/doris-manager/src/routes/tree/create-menu/index.tsx
index dfcbdf0..2d29448 100644
--- a/manager/doris-manager/src/routes/tree/create-menu/index.tsx
+++ b/manager/doris-manager/src/routes/tree/create-menu/index.tsx
@@ -22,7 +22,6 @@ import styles from './create.module.less';
 // import CSSModules from 'react-css-modules';
 import { Menu, Dropdown, Button, Space } from 'antd';
 import { TableOutlined, HddOutlined, PlusOutlined } from '@ant-design/icons';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import { useHistory } from 'react-router-dom';
 import DatabaseModal from './databaseModal';
 const getMenu = (history: any, setIsShow: any) => {
@@ -40,7 +39,7 @@ const getMenu = (history: any, setIsShow: any) => {
             </Menu.Item>
             <Menu.Item
                 onClick={() => {
-                    history.push(`/${DEFAULT_NAMESPACE_ID}/new-table`);
+                    history.push(`/new-table`);
                 }}
             >
                 <a style={{ padding: '15px 0', textAlign: 'center', color: 
'#757272' }}>
diff --git a/manager/doris-manager/src/routes/tree/index.tsx 
b/manager/doris-manager/src/routes/tree/index.tsx
index 8af1665..337a0fb 100644
--- a/manager/doris-manager/src/routes/tree/index.tsx
+++ b/manager/doris-manager/src/routes/tree/index.tsx
@@ -27,7 +27,6 @@ import { updateTreeData } from './tree.service';
 import { ContentRouteKeyEnum } from './tree.data';
 import CreateMenu from './create-menu/index';
 import styles from './tree.module.less';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 import EventEmitter from '@src/utils/event-emitter';
 // import { LoadingWrapper } from 
'@src/components/loadingwrapper/loadingwrapper';
 const initTreeDate: DataNode[] = [];
@@ -103,7 +102,7 @@ export function MetaBaseTree(props: any) {
                 localStorage.setItem('database_id', id);
                 localStorage.setItem('database_name', name);
                 history.push({
-                    pathname: 
`/${DEFAULT_NAMESPACE_ID}/content/${ContentRouteKeyEnum.Database}/${id}`,
+                    pathname: `/meta/${ContentRouteKeyEnum.Database}/${id}`,
                     state: { id: id, name: name },
                 });
             } else {
@@ -112,7 +111,7 @@ export function MetaBaseTree(props: any) {
                 localStorage.setItem('table_id', id);
                 localStorage.setItem('table_name', name);
                 history.push({
-                    pathname: 
`/${DEFAULT_NAMESPACE_ID}/content/${ContentRouteKeyEnum.Table}/${id}`,
+                    pathname: `/meta/${ContentRouteKeyEnum.Table}/${id}`,
                     state: { id: id, name: name },
                 });
             }
@@ -120,7 +119,7 @@ export function MetaBaseTree(props: any) {
     }
 
     function goHome() {
-        history.push(`/${DEFAULT_NAMESPACE_ID}/content`);
+        history.push(`/meta`);
     }
     return (
         <div className={styles['palo-tree-container']}>
diff --git a/manager/doris-manager/src/routes/tree/tree.api.ts 
b/manager/doris-manager/src/routes/tree/tree.api.ts
index ee00f66..d8596c7 100644
--- a/manager/doris-manager/src/routes/tree/tree.api.ts
+++ b/manager/doris-manager/src/routes/tree/tree.api.ts
@@ -26,7 +26,6 @@ import {
     NewDatabaseRequestParams,
 } from './tree.interface';
 import { IResult } from 'src/interfaces/http.interface';
-import { DEFAULT_NAMESPACE_ID } from '@src/config';
 
 function getDatabaseList(data: GetDatabaseRequestParams): 
Promise<IResult<[ResNode]>> {
     return http.get(`/api/meta/nsId/${data.nsId}/databases`);
@@ -38,7 +37,7 @@ function getTables(data: GetTablesByDbIdRequestParams): 
Promise<IResult<[ResNode
     return http.get(`/api/meta/dbId/${data.dbId}/tables`);
 }
 function newDatabase(data: NewDatabaseRequestParams) {
-    return http.post(`/api/build/nsId/${DEFAULT_NAMESPACE_ID}/database`, data);
+    return http.post(`/api/build/nsId/0/database`, data);
 }
 export const TreeAPI = {
     getDatabaseList,
diff --git a/manager/doris-manager/src/routes/user-setting/index.tsx 
b/manager/doris-manager/src/routes/user-setting/index.tsx
index 91652d2..fbe93bb 100644
--- a/manager/doris-manager/src/routes/user-setting/index.tsx
+++ b/manager/doris-manager/src/routes/user-setting/index.tsx
@@ -23,7 +23,7 @@ import { RequiredMark } from 'antd/lib/form/Form';
 import { UserSettingAPI } from './user.api';
 const { TabPane } = Tabs;
 import { useTranslation } from 'react-i18next';
-function NotFound() {
+function UserSetting() {
     useEffect(() => {
         getCurrentInfo();
     }, []);
@@ -221,4 +221,4 @@ function NotFound() {
         </div>
     );
 }
-export default NotFound;
+export default UserSetting;
diff --git a/manager/doris-manager/src/routes/cluster/monitor.less 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisHttpPortErrorException.java
similarity index 66%
copy from manager/doris-manager/src/routes/cluster/monitor.less
copy to 
manager/general/src/main/java/org/apache/doris/stack/exception/DorisHttpPortErrorException.java
index 8383000..83c9d67 100644
--- a/manager/doris-manager/src/routes/cluster/monitor.less
+++ 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisHttpPortErrorException.java
@@ -15,10 +15,20 @@
 // specific language governing permissions and limitations
 // under the License.
 
-.monitor {
-  min-height: 100%;
+package org.apache.doris.stack.exception;
 
-  h4 {
-    margin-left: 10px;
-  }
+/**
+ * Copyright (C) 2020 Baidu, Inc. All Rights Reserved.
+ *
+ * @Author: [email protected]
+ * @Description:
+ * @Date: 2021/10/18
+ */
+public class DorisHttpPortErrorException extends Exception {
+
+    public static final String MESSAGE = "HTTP端口无法访问,请检查后重新输入";
+
+    public DorisHttpPortErrorException() {
+        super(MESSAGE);
+    }
 }
diff --git a/manager/doris-manager/src/routes/cluster/index.module.less 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisIpErrorException.java
similarity index 66%
rename from manager/doris-manager/src/routes/cluster/index.module.less
rename to 
manager/general/src/main/java/org/apache/doris/stack/exception/DorisIpErrorException.java
index c1f2200..6743490 100644
--- a/manager/doris-manager/src/routes/cluster/index.module.less
+++ 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisIpErrorException.java
@@ -15,6 +15,20 @@
 // specific language governing permissions and limitations
 // under the License.
 
-.monitor {
-  background: #fafafa;
+package org.apache.doris.stack.exception;
+
+/**
+ * Copyright (C) 2020 Baidu, Inc. All Rights Reserved.
+ *
+ * @Author: [email protected]
+ * @Description:
+ * @Date: 2021/10/18
+ */
+public class DorisIpErrorException extends Exception {
+
+    public static final String MESSAGE = "IP地址无法访问,请检查后重新输入";
+
+    public DorisIpErrorException() {
+        super(MESSAGE);
+    }
 }
diff --git a/manager/doris-manager/src/routes/cluster/monitor.less 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisJdbcPortErrorException.java
similarity index 66%
copy from manager/doris-manager/src/routes/cluster/monitor.less
copy to 
manager/general/src/main/java/org/apache/doris/stack/exception/DorisJdbcPortErrorException.java
index 8383000..86b327b 100644
--- a/manager/doris-manager/src/routes/cluster/monitor.less
+++ 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisJdbcPortErrorException.java
@@ -15,10 +15,20 @@
 // specific language governing permissions and limitations
 // under the License.
 
-.monitor {
-  min-height: 100%;
+package org.apache.doris.stack.exception;
 
-  h4 {
-    margin-left: 10px;
-  }
+/**
+ * Copyright (C) 2020 Baidu, Inc. All Rights Reserved.
+ *
+ * @Author: [email protected]
+ * @Description:
+ * @Date: 2021/10/18
+ */
+public class DorisJdbcPortErrorException extends Exception {
+
+    public static final String MESSAGE = "JDBC端口无法访问,请检查后重新输入";
+
+    public DorisJdbcPortErrorException() {
+        super(MESSAGE);
+    }
 }
diff --git a/manager/doris-manager/src/routes/cluster/monitor.less 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisUerOrPassErrorException.java
similarity index 65%
rename from manager/doris-manager/src/routes/cluster/monitor.less
rename to 
manager/general/src/main/java/org/apache/doris/stack/exception/DorisUerOrPassErrorException.java
index 8383000..f0ca130 100644
--- a/manager/doris-manager/src/routes/cluster/monitor.less
+++ 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisUerOrPassErrorException.java
@@ -15,10 +15,20 @@
 // specific language governing permissions and limitations
 // under the License.
 
-.monitor {
-  min-height: 100%;
+package org.apache.doris.stack.exception;
 
-  h4 {
-    margin-left: 10px;
-  }
+/**
+ * Copyright (C) 2020 Baidu, Inc. All Rights Reserved.
+ *
+ * @Author: [email protected]
+ * @Description:
+ * @Date: 2021/10/18
+ */
+public class DorisUerOrPassErrorException extends Exception {
+
+    public static final String MESSAGE = "用户名/密码错误,请检查后重新输入";
+
+    public DorisUerOrPassErrorException() {
+        super(MESSAGE);
+    }
 }
diff --git a/manager/doris-manager/src/routes/content/content.module.less 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisUserNoPermissionException.java
similarity index 64%
rename from manager/doris-manager/src/routes/content/content.module.less
rename to 
manager/general/src/main/java/org/apache/doris/stack/exception/DorisUserNoPermissionException.java
index 139f3a7..728b20b 100644
--- a/manager/doris-manager/src/routes/content/content.module.less
+++ 
b/manager/general/src/main/java/org/apache/doris/stack/exception/DorisUserNoPermissionException.java
@@ -15,28 +15,20 @@
 // specific language governing permissions and limitations
 // under the License.
 
-/** @format */
-.palo-new-main {
-  display: flex;
-  flex-direction: row;
-  min-height: 380px;
+package org.apache.doris.stack.exception;
 
-  .new-main-sider {
-    flex: 0 0 300px;
-    height: calc(100vh - 95px);
-    margin-top: 30px;
-    margin-left: 40px;
-    border-radius: 16px;
-  }
+/**
+ * Copyright (C) 2020 Baidu, Inc. All Rights Reserved.
+ *
+ * @Author: [email protected]
+ * @Description:
+ * @Date: 2021/10/18
+ */
+public class DorisUserNoPermissionException extends Exception {
 
-  .new-main-content {
-    flex: auto;
-    height: calc(100vh - 95px);
-    border-radius: 16px;
-    // box-shadow: 3px 3px 3px #bfbdbd;
-  }
-}
+    public static final String MESSAGE = "用户不具备集群Admin权限,请更换其他具备权限用户";
 
-.site-layout-background {
-  background: none;
+    public DorisUserNoPermissionException() {
+        super(MESSAGE);
+    }
 }
diff --git 
a/manager/general/src/main/java/org/apache/doris/stack/model/response/user/UserInfo.java
 
b/manager/general/src/main/java/org/apache/doris/stack/model/response/user/UserInfo.java
index aba28fe..1b5da59 100644
--- 
a/manager/general/src/main/java/org/apache/doris/stack/model/response/user/UserInfo.java
+++ 
b/manager/general/src/main/java/org/apache/doris/stack/model/response/user/UserInfo.java
@@ -72,6 +72,8 @@ public class UserInfo {
      */
     private Integer spaceId;
 
+    private String spaceName;
+
     private Integer collectionId;
 
     /**
@@ -240,6 +242,18 @@ public class UserInfo {
         this.spaceId = spaceId;
     }
 
+    @JsonProperty("space_name")
+    @JSONField(name = "space_name")
+    public String getSpaceName() {
+        return spaceName;
+    }
+
+    @JsonProperty("space_name")
+    @JSONField(name = "space_name")
+    public void setSpaceName(String spaceName) {
+        this.spaceName = spaceName;
+    }
+
     @JsonProperty("space_complete")
     @JSONField(name = "space_complete")
     public Boolean getSpaceComplete() {
diff --git 
a/manager/general/src/main/java/org/apache/doris/stack/service/user/UserService.java
 
b/manager/general/src/main/java/org/apache/doris/stack/service/user/UserService.java
index 27ef5d0..eb58bf8 100644
--- 
a/manager/general/src/main/java/org/apache/doris/stack/service/user/UserService.java
+++ 
b/manager/general/src/main/java/org/apache/doris/stack/service/user/UserService.java
@@ -165,6 +165,7 @@ public class UserService extends BaseService {
 
             userInfo.setSpaceId(clusterId);
             ClusterInfoEntity clusterInfo = 
clusterInfoRepository.findById(clusterId).get();
+            userInfo.setSpaceName(clusterInfo.getName());
             userInfo.setCollectionId(clusterInfo.getCollectionId());
             if (clusterInfo.getAddress() == null) {
                 userInfo.setSpaceComplete(false);
diff --git 
a/manager/general/src/main/java/org/apache/doris/stack/util/PropertyUtil.java 
b/manager/general/src/main/java/org/apache/doris/stack/util/PropertyUtil.java
index f7679ce..54f287c 100644
--- 
a/manager/general/src/main/java/org/apache/doris/stack/util/PropertyUtil.java
+++ 
b/manager/general/src/main/java/org/apache/doris/stack/util/PropertyUtil.java
@@ -111,7 +111,7 @@ public class PropertyUtil {
             }
             url.append("/");
             if (StringUtils.isEmpty(DB_DBNAME)) {
-                url.append("mysqlDb");
+                url.append("manager");
             } else {
                 url.append(DB_DBNAME);
             }
diff --git a/manager/manager-bin/start_manager.sh 
b/manager/manager-bin/start_manager.sh
index 9f283b8..6cfea24 100644
--- a/manager/manager-bin/start_manager.sh
+++ b/manager/manager-bin/start_manager.sh
@@ -24,7 +24,7 @@ curdir=`cd "$curdir"; pwd`
 export MANAGER_HOME=`cd "$curdir"; pwd`
 echo "$MANAGER_HOME"
 
-export LOG_DIR="$MANAGER_HOME/logs"
+export LOG_DIR="$MANAGER_HOME/../logs"
 
 echo "Make log dir"
 # make log path
@@ -41,7 +41,7 @@ while read line; do
     if [[ $envline == *"="* ]]; then
         eval 'export "$envline"'
     fi
-done < $MANAGER_HOME/conf/manager.conf
+done < $MANAGER_HOME/../conf/manager.conf
 
 echo "config end"
 
@@ -96,5 +96,5 @@ then
 fi
 
 #start manager
-nohup $JAVA -jar $MANAGER_HOME/doris-manager.jar > $LOG_DIR/manager.out 2>&1 
</dev/null &
+nohup $JAVA -jar $MANAGER_HOME/../lib/doris-manager.jar > $LOG_DIR/manager.out 
2>&1 </dev/null &
 echo "Doris Manager start done"
\ No newline at end of file
diff --git a/manager/manager-server/pom.xml b/manager/manager-server/pom.xml
index 54dbf94..1793225 100644
--- a/manager/manager-server/pom.xml
+++ b/manager/manager-server/pom.xml
@@ -45,6 +45,11 @@ under the License.
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>3.1.0</version>
+            </plugin>
         </plugins>
         <resources>
             <resource>
@@ -59,7 +64,7 @@ under the License.
                 <filtering>true</filtering>
                 <includes>
                     <include>logback-spring.xml</include>
-                    <include>static/*</include>
+                    <include>web-resource/*</include>
                     <include>mail/*</include>
                 </includes>
             </resource>
diff --git 
a/manager/manager-server/src/main/java/org/apache/doris/stack/DorisManager.java 
b/manager/manager-server/src/main/java/org/apache/doris/stack/DorisManager.java
index 1317de0..f245126 100644
--- 
a/manager/manager-server/src/main/java/org/apache/doris/stack/DorisManager.java
+++ 
b/manager/manager-server/src/main/java/org/apache/doris/stack/DorisManager.java
@@ -58,7 +58,7 @@ public class DorisManager extends 
SpringBootServletInitializer {
 
         // Static resource allocation
         properties.put("server.servlet.context-path", "/");
-        properties.put("spring.resources.static-locations", 
"classpath:/static");
+        properties.put("spring.resources.static-locations", 
"classpath:/web-resource");
 
         return new SpringApplicationBuilder().properties(properties);
     }
diff --git 
a/manager/manager-server/src/main/java/org/apache/doris/stack/StartManagerRunner.java
 
b/manager/manager-server/src/main/java/org/apache/doris/stack/StartManagerRunner.java
index 5e2d592..975b123 100644
--- 
a/manager/manager-server/src/main/java/org/apache/doris/stack/StartManagerRunner.java
+++ 
b/manager/manager-server/src/main/java/org/apache/doris/stack/StartManagerRunner.java
@@ -18,6 +18,7 @@
 package org.apache.doris.stack;
 
 import org.apache.doris.stack.service.config.SettingService;
+import org.apache.doris.stack.service.impl.ServerProcessImpl;
 import org.apache.doris.stack.service.user.AuthenticationService;
 import org.apache.doris.stack.service.user.UserService;
 import lombok.extern.slf4j.Slf4j;
@@ -39,6 +40,9 @@ public class StartManagerRunner implements CommandLineRunner {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private ServerProcessImpl serverProcess;
+
     @Override
     public void run(String... args) {
         try {
diff --git 
a/manager/manager-server/src/main/java/org/apache/doris/stack/service/PaloUserSpaceService.java
 
b/manager/manager-server/src/main/java/org/apache/doris/stack/service/PaloUserSpaceService.java
index ab4db5b..04f1e26 100644
--- 
a/manager/manager-server/src/main/java/org/apache/doris/stack/service/PaloUserSpaceService.java
+++ 
b/manager/manager-server/src/main/java/org/apache/doris/stack/service/PaloUserSpaceService.java
@@ -18,6 +18,11 @@
 package org.apache.doris.stack.service;
 
 import org.apache.doris.stack.constant.ConstantDef;
+import org.apache.doris.stack.exception.DorisHttpPortErrorException;
+import org.apache.doris.stack.exception.DorisIpErrorException;
+import org.apache.doris.stack.exception.DorisJdbcPortErrorException;
+import org.apache.doris.stack.exception.DorisUerOrPassErrorException;
+import org.apache.doris.stack.exception.DorisUserNoPermissionException;
 import org.apache.doris.stack.model.ldap.LdapUserInfo;
 import org.apache.doris.stack.model.request.config.InitStudioReq;
 import org.apache.doris.stack.model.request.user.UserGroupRole;
@@ -307,6 +312,15 @@ public class PaloUserSpaceService extends BaseService {
             paloLoginClient.loginPalo(entity);
         } catch (Exception e) {
             log.error("Doris cluster http access error.");
+            if (e.getMessage().contains("nodename nor servname provided, or 
not known")) {
+                throw new DorisIpErrorException();
+            } else if (e.getMessage().contains("failed: Connection refused 
(Connection refused)")) {
+                throw new DorisHttpPortErrorException();
+            } else if (e.getMessage().contains("Login palo error:Access denied 
for default_cluster")) {
+                throw new DorisUserNoPermissionException();
+            } else if (e.getMessage().contains("Login palo error:Access 
denied")) {
+                throw new DorisUerOrPassErrorException();
+            }
             throw new DorisConnectionException();
         }
 
@@ -317,7 +331,7 @@ public class PaloUserSpaceService extends BaseService {
             log.debug("Doris cluster jdbc access success.");
         } catch (Exception e) {
             log.error("Doris cluster jdbc access error.");
-            throw new DorisConnectionException();
+            throw new DorisJdbcPortErrorException();
         }
 
         // The manager function is enabled by default

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to