mirror of https://github.com/openspug/spug
update
parent
2def2cc504
commit
8bb828a4cb
|
@ -30,6 +30,7 @@ def merge_children(data, prefix, childes):
|
|||
|
||||
def filter_by_perm(data, result, ids):
|
||||
for item in data:
|
||||
if 'children' in item:
|
||||
if item['key'] in ids:
|
||||
result.append(item)
|
||||
elif item['children']:
|
||||
|
|
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 Breadcrumb from './Breadcrumb';
|
||||
import AppSelector from './AppSelector';
|
||||
import NotFound from './NotFound';
|
||||
|
||||
export {
|
||||
StatisticsCard,
|
||||
|
@ -29,4 +30,5 @@ export {
|
|||
TableCard,
|
||||
Breadcrumb,
|
||||
AppSelector,
|
||||
NotFound,
|
||||
}
|
||||
|
|
|
@ -192,3 +192,41 @@
|
|||
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 { Switch, Route } from 'react-router-dom';
|
||||
import { Layout } from 'antd';
|
||||
import { NotFound } from 'components';
|
||||
import Sider from './Sider';
|
||||
import Header from './Header';
|
||||
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 () {
|
||||
const [collapsed, setCollapsed] = useState(false)
|
||||
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 {
|
||||
width: 100%;
|
||||
padding: 20px;
|
||||
|
|
|
@ -7,9 +7,10 @@ import React, { useEffect, useState } from 'react';
|
|||
import { observer } from 'mobx-react';
|
||||
import { Tabs, Tree, Button, Spin } from 'antd';
|
||||
import { FolderOutlined, FolderOpenOutlined, CloudServerOutlined } from '@ant-design/icons';
|
||||
import { NotFound } from 'components';
|
||||
import Terminal from './Terminal';
|
||||
import FileManager from './FileManager';
|
||||
import { http } from 'libs';
|
||||
import { http, hasPermission } from 'libs';
|
||||
import styles from './index.module.less';
|
||||
import LogoSpugText from 'layout/logo-spug-txt.png';
|
||||
import lds from 'lodash';
|
||||
|
@ -78,7 +79,7 @@ function WebSSH(props) {
|
|||
'/____// .___/ \\__,_/ \\__, / |__/|__/ \\___//_.___/ \\__/ \\___//_/ /_/ /_/ /_//_//_/ /_/ \\__,_//_/ \n' +
|
||||
' /_/ /____/ \n'
|
||||
|
||||
return (
|
||||
return hasPermission('host.console.view') ? (
|
||||
<div className={styles.container}>
|
||||
<div className={styles.sider}>
|
||||
<div className={styles.logo}>
|
||||
|
@ -117,6 +118,10 @@ function WebSSH(props) {
|
|||
</div>
|
||||
<FileManager id={activeId} visible={visible} onClose={() => setVisible(false)}/>
|
||||
</div>
|
||||
) : (
|
||||
<div style={{height: '100vh'}}>
|
||||
<NotFound/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -25,13 +25,15 @@ export default [{
|
|||
{key: 'import', label: '批量导入'},
|
||||
{key: 'edit', label: '编辑主机'},
|
||||
{key: 'del', label: '删除主机'},
|
||||
{key: 'console', label: 'Web终端'},
|
||||
]
|
||||
}, {
|
||||
key: 'console',
|
||||
label: 'Console',
|
||||
label: 'Web终端',
|
||||
perms: [
|
||||
{key: 'manager', label: '文件管理器'},
|
||||
{key: 'view', label: '使用Web终端'},
|
||||
{key: 'list', label: '查看文件'},
|
||||
{key: 'upload', label: '上传文件'},
|
||||
{key: 'del', label: '删除文件'},
|
||||
]
|
||||
}]
|
||||
}, {
|
||||
|
|
Loading…
Reference in New Issue