mirror of https://github.com/openspug/spug
update
parent
2def2cc504
commit
8bb828a4cb
|
@ -30,10 +30,11 @@ def merge_children(data, prefix, childes):
|
||||||
|
|
||||||
def filter_by_perm(data, result, ids):
|
def filter_by_perm(data, result, ids):
|
||||||
for item in data:
|
for item in data:
|
||||||
if item['key'] in ids:
|
if 'children' in item:
|
||||||
result.append(item)
|
if item['key'] in ids:
|
||||||
elif item['children']:
|
result.append(item)
|
||||||
filter_by_perm(item['children'], result, ids)
|
elif item['children']:
|
||||||
|
filter_by_perm(item['children'], result, ids)
|
||||||
|
|
||||||
|
|
||||||
class GroupView(View):
|
class GroupView(View):
|
||||||
|
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
@ -0,0 +1,16 @@
|
||||||
|
import React from 'react';
|
||||||
|
import styles from './index.module.less';
|
||||||
|
|
||||||
|
export default function NotFound() {
|
||||||
|
return (
|
||||||
|
<div className={styles.notFound}>
|
||||||
|
<div className={styles.imgBlock}>
|
||||||
|
<div className={styles.img}/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h1 className={styles.title}>404</h1>
|
||||||
|
<div className={styles.desc}>抱歉,你访问的页面不存在</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ import Action from './Action';
|
||||||
import TableCard from './TableCard';
|
import TableCard from './TableCard';
|
||||||
import Breadcrumb from './Breadcrumb';
|
import Breadcrumb from './Breadcrumb';
|
||||||
import AppSelector from './AppSelector';
|
import AppSelector from './AppSelector';
|
||||||
|
import NotFound from './NotFound';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
StatisticsCard,
|
StatisticsCard,
|
||||||
|
@ -29,4 +30,5 @@ export {
|
||||||
TableCard,
|
TableCard,
|
||||||
Breadcrumb,
|
Breadcrumb,
|
||||||
AppSelector,
|
AppSelector,
|
||||||
|
NotFound,
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,3 +192,41 @@
|
||||||
color: #888;
|
color: #888;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.notFound {
|
||||||
|
display: flex;
|
||||||
|
height: 80%;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.imgBlock {
|
||||||
|
flex: 0 0 62.5%;
|
||||||
|
width: 62.5%;
|
||||||
|
zoom: 1;
|
||||||
|
padding-right: 88px;
|
||||||
|
|
||||||
|
.img {
|
||||||
|
float: right;
|
||||||
|
height: 360px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 430px;
|
||||||
|
background-size: contain;
|
||||||
|
background: url('./404.svg') no-repeat 50% 50%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
color: #434e59;
|
||||||
|
font-size: 72px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 72px;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.desc {
|
||||||
|
color: rgba(0, 0, 0, .45);
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 28px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,6 +6,7 @@
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { Switch, Route } from 'react-router-dom';
|
import { Switch, Route } from 'react-router-dom';
|
||||||
import { Layout } from 'antd';
|
import { Layout } from 'antd';
|
||||||
|
import { NotFound } from 'components';
|
||||||
import Sider from './Sider';
|
import Sider from './Sider';
|
||||||
import Header from './Header';
|
import Header from './Header';
|
||||||
import Footer from './Footer'
|
import Footer from './Footer'
|
||||||
|
@ -25,21 +26,6 @@ function initRoutes(Routes, routes) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 404
|
|
||||||
function NotFound() {
|
|
||||||
return (
|
|
||||||
<div className={styles.router}>
|
|
||||||
<div className={styles.imgBlock}>
|
|
||||||
<div className={styles.img}/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h1 className={styles.title}>404</h1>
|
|
||||||
<div className={styles.desc}>抱歉,你访问的页面不存在</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function () {
|
export default function () {
|
||||||
const [collapsed, setCollapsed] = useState(false)
|
const [collapsed, setCollapsed] = useState(false)
|
||||||
const [Routes, setRoutes] = useState([]);
|
const [Routes, setRoutes] = useState([]);
|
||||||
|
|
|
@ -98,43 +98,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.router {
|
|
||||||
display: flex;
|
|
||||||
height: 80%;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
.imgBlock {
|
|
||||||
flex: 0 0 62.5%;
|
|
||||||
width: 62.5%;
|
|
||||||
zoom: 1;
|
|
||||||
padding-right: 88px;
|
|
||||||
|
|
||||||
.img {
|
|
||||||
float: right;
|
|
||||||
height: 360px;
|
|
||||||
width: 100%;
|
|
||||||
max-width: 430px;
|
|
||||||
background-size: contain;
|
|
||||||
background: url('./404.svg') no-repeat 50% 50%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
color: #434e59;
|
|
||||||
font-size: 72px;
|
|
||||||
font-weight: 600;
|
|
||||||
line-height: 72px;
|
|
||||||
margin-bottom: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.desc {
|
|
||||||
color: rgba(0, 0, 0, .45);
|
|
||||||
font-size: 20px;
|
|
||||||
line-height: 28px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer {
|
.footer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
|
|
|
@ -7,9 +7,10 @@ import React, { useEffect, useState } from 'react';
|
||||||
import { observer } from 'mobx-react';
|
import { observer } from 'mobx-react';
|
||||||
import { Tabs, Tree, Button, Spin } from 'antd';
|
import { Tabs, Tree, Button, Spin } from 'antd';
|
||||||
import { FolderOutlined, FolderOpenOutlined, CloudServerOutlined } from '@ant-design/icons';
|
import { FolderOutlined, FolderOpenOutlined, CloudServerOutlined } from '@ant-design/icons';
|
||||||
|
import { NotFound } from 'components';
|
||||||
import Terminal from './Terminal';
|
import Terminal from './Terminal';
|
||||||
import FileManager from './FileManager';
|
import FileManager from './FileManager';
|
||||||
import { http } from 'libs';
|
import { http, hasPermission } from 'libs';
|
||||||
import styles from './index.module.less';
|
import styles from './index.module.less';
|
||||||
import LogoSpugText from 'layout/logo-spug-txt.png';
|
import LogoSpugText from 'layout/logo-spug-txt.png';
|
||||||
import lds from 'lodash';
|
import lds from 'lodash';
|
||||||
|
@ -78,7 +79,7 @@ function WebSSH(props) {
|
||||||
'/____// .___/ \\__,_/ \\__, / |__/|__/ \\___//_.___/ \\__/ \\___//_/ /_/ /_/ /_//_//_/ /_/ \\__,_//_/ \n' +
|
'/____// .___/ \\__,_/ \\__, / |__/|__/ \\___//_.___/ \\__/ \\___//_/ /_/ /_/ /_//_//_/ /_/ \\__,_//_/ \n' +
|
||||||
' /_/ /____/ \n'
|
' /_/ /____/ \n'
|
||||||
|
|
||||||
return (
|
return hasPermission('host.console.view') ? (
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<div className={styles.sider}>
|
<div className={styles.sider}>
|
||||||
<div className={styles.logo}>
|
<div className={styles.logo}>
|
||||||
|
@ -117,6 +118,10 @@ function WebSSH(props) {
|
||||||
</div>
|
</div>
|
||||||
<FileManager id={activeId} visible={visible} onClose={() => setVisible(false)}/>
|
<FileManager id={activeId} visible={visible} onClose={() => setVisible(false)}/>
|
||||||
</div>
|
</div>
|
||||||
|
) : (
|
||||||
|
<div style={{height: '100vh'}}>
|
||||||
|
<NotFound/>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,13 +25,15 @@ export default [{
|
||||||
{key: 'import', label: '批量导入'},
|
{key: 'import', label: '批量导入'},
|
||||||
{key: 'edit', label: '编辑主机'},
|
{key: 'edit', label: '编辑主机'},
|
||||||
{key: 'del', label: '删除主机'},
|
{key: 'del', label: '删除主机'},
|
||||||
{key: 'console', label: 'Web终端'},
|
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
key: 'console',
|
key: 'console',
|
||||||
label: 'Console',
|
label: 'Web终端',
|
||||||
perms: [
|
perms: [
|
||||||
{key: 'manager', label: '文件管理器'},
|
{key: 'view', label: '使用Web终端'},
|
||||||
|
{key: 'list', label: '查看文件'},
|
||||||
|
{key: 'upload', label: '上传文件'},
|
||||||
|
{key: 'del', label: '删除文件'},
|
||||||
]
|
]
|
||||||
}]
|
}]
|
||||||
}, {
|
}, {
|
||||||
|
|
Loading…
Reference in New Issue