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>
-
- <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>
+
+ <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]