Compare commits
No commits in common. 'main' and 'master_basic' have entirely different histories.
main
...
master_bas
@ -0,0 +1,9 @@
|
||||
/node_modules
|
||||
/.env.local
|
||||
/.umirc.local.ts
|
||||
/config/config.local.ts
|
||||
/src/.umi
|
||||
/src/.umi-production
|
||||
/src/.umi-test
|
||||
/dist
|
||||
.swc
|
@ -0,0 +1,10 @@
|
||||
import { defineConfig } from "umi";
|
||||
import routes from './config/routes/index';
|
||||
import proxy from './config/proxy';
|
||||
|
||||
export default defineConfig({
|
||||
proxy,
|
||||
hash: true,
|
||||
routes,
|
||||
npmClient: 'yarn',
|
||||
});
|
@ -0,0 +1,11 @@
|
||||
import GlobalConfig from '../src/utils/env/dev';
|
||||
const proxy = {
|
||||
'/xgd': {
|
||||
target: GlobalConfig['PROXY_SERVER'],
|
||||
changeOrigin: true,
|
||||
withCredentials: true,
|
||||
secure: false,
|
||||
cookieDomainRewrite: 'localhost',
|
||||
}
|
||||
};
|
||||
export default proxy;
|
@ -0,0 +1,151 @@
|
||||
const routes = [
|
||||
{ path: '/', redirect: '/index', }, // 本地跑时为了方便先使用这个
|
||||
// { path: '/', redirect: '/404', }, // 后续上线时开放
|
||||
|
||||
// 桌面
|
||||
{ path: '/index', name: '桌面', component: '@/pages/index', layout: false },
|
||||
|
||||
// ------------------------------流程------------------------------
|
||||
{ path: '/installExe/:fileType', name: '01MMD049安装.exe', component: '@/pages/InstallExe', layout: false },
|
||||
{ path: '/initialSystem/:fileType', name: '初装系统', component: '@/pages/InitialSystem', layout: false },
|
||||
{ path: '/coreSystemEntrance', name: '核心管理系统', component: '@/pages/CoreSystemEntrance', layout: false },
|
||||
|
||||
|
||||
// ------------------------------GLQ远程维护----------------------------------
|
||||
// 建立远程链接
|
||||
{ path: '/teamViewer/paramsSetting', name: '参数设置', component: '@/pages/GLQ/TeamViewer/ParamsSetting' },
|
||||
// 交互维护命令
|
||||
{ path: '/teamViewer/systemTime', name: '系统时间', component: '@/pages/GLQ/TeamViewer/SystemTime' },
|
||||
{ path: '/teamViewer/currentIP', name: '当前IP', component: '@/pages/GLQ/TeamViewer/CurrentIP' },
|
||||
{ path: '/teamViewer/pingCommand', name: 'PING命令', component: '@/pages/GLQ/TeamViewer/PingCommand' },
|
||||
{ path: '/teamViewer/telnetCommand', name: 'TELNET命令', component: '@/pages/GLQ/TeamViewer/TelnetCommand' },
|
||||
{ path: '/teamViewer/otherCommand', name: '其他命令', component: '@/pages/GLQ/TeamViewer/OtherCommand' },
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
// ------------------------------网络MMJ管理----------------------------------
|
||||
{ path: '/webMMJ/mmjInitInstall', name: 'MMJ初装', component: '@/pages/GLQ/WebMMJ/MmjInitInstall' },
|
||||
{ path: '/webMMJ/statusQuery', name: '状态查询', component: '@/pages/GLQ/WebMMJ/StatusQuery' },
|
||||
{ path: '/webMMJ/keyDestruction', name: '密钥销毁', component: '@/pages/GLQ/WebMMJ/KeyDestruction' },
|
||||
{ path: '/webMMJ/keyRemoteKill', name: '密钥遥毙', component: '@/pages/GLQ/WebMMJ/KeyRemoteKill' },
|
||||
{ path: '/webMMJ/mmjRemoteKill', name: 'MMJ遥毙', component: '@/pages/GLQ/WebMMJ/MmjRemoteKill' },
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
// ------------------------------网络GLQ配置----------------------------------
|
||||
// 获取配置信息
|
||||
{ path: '/webGLQ/serviceListInfo', name: '服务列表信息', component: '@/pages/GLQ/WebGLQ/ServiceListInfo' },
|
||||
{ path: '/webGLQ/networkConfigInfo', name: '网络配置信息', component: '@/pages/GLQ/WebGLQ/NetworkConfigInfo' },
|
||||
{ path: '/webGLQ/securityPolicyInfo', name: '安全策略信息', component: '@/pages/GLQ/WebGLQ/SecurityPolicyInfo' },
|
||||
{ path: '/webGLQ/manageConfigInfo', name: '管理配置信息', component: '@/pages/GLQ/WebGLQ/ManageConfigInfo' },
|
||||
{ path: '/webGLQ/vpnPolicyInfo', name: 'VPN策略信息', component: '@/pages/GLQ/WebGLQ/VpnPolicyInfo' },
|
||||
{ path: '/webGLQ/firewallPolicyInfo', name: '防火墙策略信息', component: '@/pages/GLQ/WebGLQ/FirewallPolicyInfo'},
|
||||
{ path: '/webGLQ/logRecordInfo', name: '日志记录信息', component: '@/pages/GLQ/WebGLQ/LogRecordInfo' },
|
||||
// 远程文件配置
|
||||
{ path: '/webMMJ/serviceList', name: '服务列表', component: '@/pages/GLQ/WebGLQ/ServiceList' },
|
||||
{ path: '/webMMJ/networkParams', name: '网络参数', component: '@/pages/GLQ/WebGLQ/NetworkParams' },
|
||||
{ path: '/webMMJ/securityPolicy', name: '安全策略', component: '@/pages/GLQ/WebGLQ/SecurityPolicy' },
|
||||
{ path: '/webMMJ/manageConfig', name: '管理配置', component: '@/pages/GLQ/WebGLQ/ManageConfig' },
|
||||
{ path: '/webMMJ/vpnPolicy', name: 'VPN策略', component: '@/pages/GLQ/WebGLQ/VpnPolicy' },
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
// ------------------------------MY管理----------------------------------
|
||||
// 密钥体管理
|
||||
{ path: '/KeyBodyManage/formatImport', name: '密钥体格式导入', component: '@/pages/MY/KeyBodyManage/FormatImport' },
|
||||
{ path: '/KeyBodyManage/formatPublishing', name: '密钥体格式发布', component: '@/pages/MY/KeyBodyManage/FormatPublishing' },
|
||||
{ path: '/KeyBodyManage/application', name: '密钥体申请', component: '@/pages/MY/KeyBodyManage/Application' },
|
||||
{ path: '/KeyBodyManage/import', name: '密钥体导入', component: '@/pages/MY/KeyBodyManage/Import' },
|
||||
{ path: '/KeyBodyManage/receiptForm', name: '密钥体接收单', component: '@/pages/MY/KeyBodyManage/ReceiptForm' },
|
||||
{ path: '/KeyBodyManage/cleaned', name: '已清理密钥体', component: '@/pages/MY/KeyBodyManage/Cleaned' },
|
||||
{ path: '/KeyBodyManage/codeComparisonTable', name: '密钥体代号对照表', component: '@/pages/MY/KeyBodyManage/CodeComparisonTable' },
|
||||
{ path: '/KeyBodyManage/subordinateDistr', name: '向下级配发', component: '@/pages/MY/KeyBodyManage/SubordinateDistr' },
|
||||
{ path: '/KeyBodyManage/emailDistr', name: '向邮箱配发', component: '@/pages/MY/KeyBodyManage/EmailDistr' },
|
||||
{ path: '/KeyBodyManage/systemDistr', name: '向专用密码管理系统配发', component: '@/pages/MY/KeyBodyManage/SystemDistr' },
|
||||
{ path: '/KeyBodyManage/distrTriple', name: '密钥体配发三联单', component: '@/pages/MY/KeyBodyManage/DistrTriple' },
|
||||
{ path: '/KeyBodyManage/plaintext', name: '明文载体包封', component: '@/pages/MY/KeyBodyManage/Plaintext' },
|
||||
{ path: '/KeyBodyManage/ciphertext', name: '密文载体包封', component: '@/pages/MY/KeyBodyManage/Ciphertext' },
|
||||
// 密钥管理
|
||||
{ path: '/KeyManage/dataMaintenance', name: '管理系统管理盘数据维护', component: '@/pages/MY/KeyManage/DataMaintenance' },
|
||||
{ path: '/KeyManage/relationConfig', name: '统型完善普密设备密钥互通关系配置', component: '@/pages/MY/KeyManage/RelationConfig' },
|
||||
{ path: '/KeyManage/manageKeys', name: '管理密钥装配', component: '@/pages/MY/KeyManage/ManageKeys' },
|
||||
{ path: '/KeyManage/userKey', name: '用户密钥装配', component: '@/pages/MY/KeyManage/UserKey' },
|
||||
{ path: '/KeyManage/privateKey', name: '专用密钥装配', component: '@/pages/MY/KeyManage/PrivateKey' },
|
||||
{ path: '/KeyManage/keyConfigQuery', name: '密钥配置查询', component: '@/pages/MY/KeyManage/KeyConfigQuery' },
|
||||
{ path: '/KeyManage/tripleKeyDistri', name: '密钥配发三联单', component: '@/pages/MY/KeyManage/TripleKeyDistri' },
|
||||
// 邮箱管理
|
||||
{ path: '/mailboxManage/index', name: '邮箱管理', component: '@/pages/MY/MailboxManage/index' },
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
// ------------------------------SB管理----------------------------------
|
||||
// 设备管理
|
||||
{ path: '/deviceManage/dutyAreaConfig', name: '执勤区配置', component: '@/pages/SB/DeviceManage/DutyAreaConfig' },
|
||||
{ path: '/deviceManage/dataSync', name: '数据同步', component: '@/pages/SB/DeviceManage/DataSync' },
|
||||
{ path: '/deviceManage/remoteMaintenance', name: '远程维护', component: '@/pages/SB/DeviceManage/RemoteMaintenance' },
|
||||
{ path: '/deviceManage/numberMaintenance', name: '报号维护', component: '@/pages/SB/DeviceManage/NumberMaintenance' },
|
||||
// 日志管理
|
||||
{ path: '/logManage/index', name: '日志管理', component: '@/pages/SB/LogManage/index' },
|
||||
// 审计管理
|
||||
{ path: '/auditManage/index', name: '审计管理', component: '@/pages/SB/AuditManage/index' },
|
||||
// 境外任务管理
|
||||
{ path: '/overseasTaskManage/index', name: '境外任务管理', component: '@/pages/SB/OverseasTaskManage/index' },
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// ------------------------------SF管理----------------------------------
|
||||
// 算法资源管理
|
||||
{ path: '/resourceManage/algorithmMaintenance', name: '算法信息维护', component: '@/pages/SF/ResourceManage/AlgorithmMaintenance' },
|
||||
{ path: '/resourceManage/paramMaintenance', name: '参数信息维护', component: '@/pages/SF/ResourceManage/ParamMaintenance' },
|
||||
{ path: '/resourceManage/algorithmSetConfig', name: '算法集合配置', component: '@/pages/SF/ResourceManage/AlgorithmSetConfig' },
|
||||
{ path: '/resourceManage/networkConfig', name: '管理类参数所属网络配置', component: '@/pages/SF/ResourceManage/NetworkConfig' },
|
||||
{ path: '/resourceManage/algorithmDistr', name: '算法配发', component: '@/pages/SF/ResourceManage/AlgorithmDistr' },
|
||||
{ path: '/resourceManage/algorithmParam', name: '算法参数配发', component: '@/pages/SF/ResourceManage/AlgorithmParam' },
|
||||
// 算法配置管理
|
||||
{ path: '/configManage/sfSingleInstallConfig', name: '单算法安装配置', component: '@/pages/SF/ConfigManage/SFSingleInstallConfig' },
|
||||
{ path: '/configManage/sfSingleChangeConfig', name: '单算法更换配置', component: '@/pages/SF/ConfigManage/SFSingleChangeConfig' },
|
||||
{ path: '/configManage/sfMultiInstallConfig', name: '多算法安装配置', component: '@/pages/SF/ConfigManage/SFMultiInstallConfig' },
|
||||
{ path: '/configManage/sfMultiChangeConfig', name: '多算法更换配置', component: '@/pages/SF/ConfigManage/SFMultiChangeConfig' },
|
||||
{ path: '/configManage/paramSingleInstallConfig', name: '单参数安装配置', component: '@/pages/SF/ConfigManage/ParamSingleInstallConfig' },
|
||||
{ path: '/configManage/paramSingleChangeConfig', name: '单参数更换配置', component: '@/pages/SF/ConfigManage/ParamSingleChangeConfig' },
|
||||
{ path: '/configManage/paramMultiInstallConfig', name: '多参数安装配置', component: '@/pages/SF/ConfigManage/ParamMultiInstallConfig' },
|
||||
{ path: '/configManage/paramMultiChangeConfig', name: '多参数更换配置', component: '@/pages/SF/ConfigManage/ParamMultiChangeConfig' },
|
||||
// 算法托收管理
|
||||
{ path: '/collectionManage/dataSync', name: '算法托收管理', component: '@/pages/SF/CollectionManage/index' },
|
||||
// 算法邮箱管理
|
||||
{ path: '/mailboxManage/index', name: '算法邮箱管理', component: '@/pages/SF/MailboxManage/index' },
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
// ------------------------------SBJK二维版-----------------------------------
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
// ------------------------------设备注册-----------------------------------
|
||||
// 注册管理
|
||||
{ path: '/registerManage/deviceRegister/:id', name: '设备注册管理', component: '@/pages/Register/RegisterManage/DeviceRegister' },
|
||||
{ path: '/registerManage/manageDiskMainten', name: '管理盘维护', component: '@/pages/Register/RegisterManage/ManageDiskMainten' },
|
||||
{ path: '/registerManage/devicePhotoMainten', name: '设备照片维护', component: '@/pages/Register/RegisterManage/DevicePhotoMainten' },
|
||||
{ path: '/registerManage/deviceSearch', name: '设备查找', component: '@/pages/Register/RegisterManage/DeviceSearch' },
|
||||
{ path: '/registerManage/appSystemConfig', name: '应用系统配置', component: '@/pages/Register/RegisterManage/AppSystemConfig' },
|
||||
{ path: '/registerManage/infoAggre', name: '信息汇总', component: '@/pages/Register/RegisterManage/InfoAggre' },
|
||||
// 位置管理
|
||||
{ path: '/registerManage/unitLocation/:id', name: '单位位置管理', component: '@/pages/Register/PositionManage/UnitLocation' },
|
||||
{ path: '/registerManage/regionalEdit', name: '地域编辑', component: '@/pages/Register/PositionManage/RegionalEdit' },
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
// 建设中页面
|
||||
{
|
||||
path: '/construction',
|
||||
component: '@/pages/construction'
|
||||
},
|
||||
|
||||
{
|
||||
path: '*',
|
||||
component: '@/pages/404',
|
||||
layout: false
|
||||
}
|
||||
]
|
||||
|
||||
export default routes;
|
@ -0,0 +1,26 @@
|
||||
{
|
||||
"private": true,
|
||||
"author": "鲁誉程 <2659568239@qq.com>",
|
||||
"scripts": {
|
||||
"dev": "umi dev",
|
||||
"build": "umi build",
|
||||
"postinstall": "umi setup",
|
||||
"setup": "umi setup",
|
||||
"start": "npm run dev"
|
||||
},
|
||||
"dependencies": {
|
||||
"antd": "^5.11.2",
|
||||
"body-parser": "^1.20.2",
|
||||
"dayjs": "^1.11.10",
|
||||
"dva": "^2.4.1",
|
||||
"express": "^4.18.2",
|
||||
"moment": "^2.29.4",
|
||||
"umi": "^4.0.88"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/cors": "^2.8.17",
|
||||
"@types/react": "^18.0.33",
|
||||
"@types/react-dom": "^18.0.11",
|
||||
"typescript": "^5.0.3"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 749 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 366 KiB |
After Width: | Height: | Size: 216 KiB |
After Width: | Height: | Size: 468 KiB |
After Width: | Height: | Size: 192 KiB |
After Width: | Height: | Size: 196 KiB |
After Width: | Height: | Size: 258 KiB |
After Width: | Height: | Size: 241 KiB |
After Width: | Height: | Size: 196 KiB |
After Width: | Height: | Size: 193 KiB |
After Width: | Height: | Size: 202 KiB |
After Width: | Height: | Size: 199 KiB |
After Width: | Height: | Size: 181 KiB |
After Width: | Height: | Size: 634 KiB |
After Width: | Height: | Size: 634 KiB |
After Width: | Height: | Size: 634 KiB |
After Width: | Height: | Size: 634 KiB |
After Width: | Height: | Size: 634 KiB |
After Width: | Height: | Size: 634 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 71 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 547 KiB |
@ -0,0 +1,48 @@
|
||||
.btn {
|
||||
height: 32px;
|
||||
// width: 112px;
|
||||
padding: 0px 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.confirm_btn {
|
||||
background: linear-gradient(180deg, #87CDEE 0%, #69C0E9 34%, #7ECDF2 51%, #56B9E6 63%, #81D7FE 100%);
|
||||
box-shadow: 0px 1px 4px 0px rgba(81, 84, 90, 0.5);
|
||||
border-radius: 4px;
|
||||
border: 1px solid rgba(76, 106, 118, 0.22);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.cancel_btn {
|
||||
background: linear-gradient(180deg, #E3F6FF 0%, #F3FBFF 37%, #FFFFFF 51%, #EBF9FF 60%, #FFFFFF 100%);
|
||||
box-shadow: 0px 1px 4px 0px rgba(81, 84, 90, 0.5);
|
||||
border-radius: 4px;
|
||||
border: 1px solid rgba(171, 207, 223, 0.22);
|
||||
color: #65686E;
|
||||
}
|
||||
|
||||
.delete_btn {
|
||||
background: linear-gradient(180deg, #FFE5C5 0%, #FFE1B4 30%, #FCEED7 52%, #FFDC9B 73%, #F8E7C5 100%);
|
||||
box-shadow: 0px 1px 4px 0px rgba(81, 84, 90, 0.5);
|
||||
border-radius: 4px;
|
||||
border: 1px solid #C2BFB8;
|
||||
color: #65686E;
|
||||
}
|
||||
|
||||
.special_btn {
|
||||
background: linear-gradient(rgb(244, 251, 255) 0%, rgb(207, 233, 246) 100%);
|
||||
box-shadow: 0px 1px 1px 0px rgba(177, 197, 218, 0.5);
|
||||
border-radius: 4px;
|
||||
border: 1px solid #D0DAE7;
|
||||
font-size: 16px;
|
||||
color: #333333;
|
||||
padding: 0 30px;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
cursor: no-drop;
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
import { FC } from 'react';
|
||||
import { Modal } from 'antd';
|
||||
import ButtonComp from '../ButtonComp';
|
||||
|
||||
interface PageProps {
|
||||
title?: string;
|
||||
visibility: boolean;
|
||||
onCancel: () => void;
|
||||
onOk: () => void;
|
||||
children?: any; // 插槽内容
|
||||
}
|
||||
|
||||
const ClearInfoDialog: FC<PageProps> = ({
|
||||
title = "提示",
|
||||
visibility = false,
|
||||
onCancel,
|
||||
onOk,
|
||||
...props
|
||||
}) => {
|
||||
|
||||
return (
|
||||
<Modal
|
||||
title={title}
|
||||
open={visibility}
|
||||
centered
|
||||
width={420}
|
||||
onCancel={onCancel}
|
||||
footer={null}
|
||||
maskClosable={false}
|
||||
>
|
||||
{props?.children}
|
||||
<div className='flex_jE mt20'>
|
||||
<ButtonComp style={{ marginRight: 20 }} text={'确定'} onClick={onOk} />
|
||||
<ButtonComp type="cancel" text={'取消'} onClick={onCancel} />
|
||||
</div>
|
||||
</Modal>
|
||||
)
|
||||
}
|
||||
|
||||
export default ClearInfoDialog
|
@ -0,0 +1,25 @@
|
||||
.cont_warp {
|
||||
position: relative;
|
||||
background: #FFFFFF;
|
||||
border-radius: 2px 0px 0px 0px;
|
||||
border: 1px solid #D8D8D8;
|
||||
margin-top: 8px;
|
||||
padding-top: 25px;
|
||||
|
||||
.cont_warp_title {
|
||||
position: absolute;
|
||||
top: -8px;
|
||||
left: -1px;
|
||||
padding: 0 30px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
background: linear-gradient(180deg, #F4FBFF 0%, #CFE9F6 100%);
|
||||
border-radius: 4px 4px 4px 0px;
|
||||
border: 1px solid #D0DAE7;
|
||||
cursor: default;
|
||||
|
||||
font-size: 16px;
|
||||
font-weight: 400;
|
||||
color: #333333;
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import styles from './index.less';
|
||||
|
||||
interface PageProps {
|
||||
style?: any; // 样式
|
||||
text: any; // 标题区域
|
||||
children?: any; // 插槽内容
|
||||
}
|
||||
|
||||
const ContentWarp: FC<PageProps> = ({
|
||||
style,
|
||||
text,
|
||||
...props
|
||||
}) => {
|
||||
|
||||
return (
|
||||
<div className={styles.cont_warp} style={style}>
|
||||
<div className={styles.cont_warp_title}>{text}</div>
|
||||
{props?.children}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default ContentWarp
|
@ -0,0 +1,37 @@
|
||||
.tabs {
|
||||
width: 100%;
|
||||
height: 36px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
font-size: 14px;
|
||||
|
||||
.item_tab,
|
||||
.active_tab {
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
margin-right: 50px;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.active_tab {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.item_tab {
|
||||
color: #333;
|
||||
&:hover {
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
|
||||
.active_line {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
background: linear-gradient(180deg, #FFFFFF 0%, #3F9DC8 100%);
|
||||
top: 21px;
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import styles from './index.less';
|
||||
|
||||
interface PageProps {
|
||||
dataSource: { id: string | number; name: string }[]; // tabs
|
||||
activeTab: number; // 当前选中的tab
|
||||
onChange: (id: any) => void;
|
||||
}
|
||||
|
||||
const TabsComp: FC<PageProps> = ({ dataSource, activeTab, onChange }) => {
|
||||
return (
|
||||
<div className={styles.tabs}>
|
||||
{dataSource.map((item: any, i: number) => {
|
||||
return (
|
||||
<div
|
||||
key={i}
|
||||
className={`${activeTab == item.id ? styles.active_tab : styles.item_tab}`}
|
||||
onClick={() => {
|
||||
if (item.id == activeTab) return;
|
||||
onChange(item.id);
|
||||
}}
|
||||
>
|
||||
<div style={{ position: 'relative' }}>
|
||||
{item.name}
|
||||
<div className={`${activeTab == item.id ? styles.active_line : ''}`}></div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default TabsComp
|
@ -0,0 +1,23 @@
|
||||
@import './styles/reset.less';
|
||||
@import './styles/minix.less';
|
||||
@import './styles/antd.less';
|
||||
|
||||
::-webkit-scrollbar {
|
||||
height: 3px;
|
||||
width: 3px;
|
||||
background: rgba(0, 0, 0, 0.1) !important;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 0, 0, 0.1) !important;
|
||||
border-radius: 3px;
|
||||
|
||||
&:hover {
|
||||
background: rgba(0, 0, 0, 0.20) !important;
|
||||
}
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background-color: #f6f7f94d !important;
|
||||
box-shadow: initial !important;
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
.bottom_warp {
|
||||
width: 100%;
|
||||
height: 140px;
|
||||
background: #FFFFFF;
|
||||
border-radius: 2px 0px 0px 0px;
|
||||
border-top: 1px solid #D8D8D8;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
.item_con {
|
||||
width: 50%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
|
||||
._img {
|
||||
width: 54px;
|
||||
height: 54px;
|
||||
margin: 20px;
|
||||
background-color: saddlebrown;
|
||||
}
|
||||
|
||||
.item_info {
|
||||
|
||||
&:nth-child(2),
|
||||
&:nth-child(3) {
|
||||
height: 22px;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #333333;
|
||||
line-height: 22px;
|
||||
}
|
||||
}
|
||||
|
||||
.item_title {
|
||||
margin-top: 34px;
|
||||
height: 26px;
|
||||
line-height: 26px;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
.menu_item {
|
||||
width: 260px;
|
||||
height: 32px;
|
||||
background: linear-gradient(180deg, #4AB4E4 0%, #A2E1FF 100%);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
|
||||
.triangle {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 6px solid #fff;
|
||||
border-bottom: 6px solid transparent;
|
||||
border-top: 6px solid transparent;
|
||||
transition: all 0.15s ease-in;
|
||||
}
|
||||
}
|
||||
|
||||
.item_warp {
|
||||
transition: all 2s ease-in;
|
||||
|
||||
.item1 {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
margin: 20px 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.item1_img {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background-color: saddlebrown;
|
||||
}
|
||||
|
||||
.item1_name {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #1A374A;
|
||||
margin-top: 6px;
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
.menu_item {
|
||||
width: 260px;
|
||||
height: 32px;
|
||||
background: linear-gradient(180deg, #4AB4E4 0%, #A2E1FF 100%);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
|
||||
.triangle {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 6px solid #fff;
|
||||
border-bottom: 6px solid transparent;
|
||||
border-top: 6px solid transparent;
|
||||
transition: all 0.15s ease-in;
|
||||
}
|
||||
}
|
||||
|
||||
.item_warp {
|
||||
transition: all 2s ease-in;
|
||||
|
||||
.item1 {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
margin: 20px 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.item1_img {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background-color: saddlebrown;
|
||||
}
|
||||
|
||||
.item1_name {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #1A374A;
|
||||
margin-top: 6px;
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
.item1 {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
margin: 20px 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.item1_img {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background-color: saddlebrown;
|
||||
}
|
||||
|
||||
.item1_name {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #1A374A;
|
||||
margin-top: 6px;
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { history, useLocation } from "umi";
|
||||
import styles from './index.less';
|
||||
|
||||
interface PageProps {
|
||||
data: Array<{
|
||||
// 名称
|
||||
name: string;
|
||||
// 路由
|
||||
url: string;
|
||||
// 图标
|
||||
img: any;
|
||||
}>
|
||||
}
|
||||
|
||||
const LeftMenuCom: FC<PageProps> = ({ data }) => {
|
||||
|
||||
const [list, setList] = useState<any>([]);
|
||||
const route = useLocation();
|
||||
|
||||
useEffect(() => {
|
||||
setList([...data])
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div>
|
||||
{list.map((item: any, index: number) => {
|
||||
return (
|
||||
<div className={styles.item1} key={index} onClick={() => history.push(item.url)}>
|
||||
<div className={styles.item1_img}></div>
|
||||
<div className={styles.item1_name} style={{color: (route.pathname == item.url ? 'red' : '')}}>
|
||||
{item.name}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default LeftMenuCom
|
||||
|
@ -0,0 +1,199 @@
|
||||
#layout_main {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
min-width: 1440px;
|
||||
min-height: 100vh;
|
||||
transition: all ease 2s;
|
||||
font-size: 14px;
|
||||
|
||||
.nav_warp {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
user-select: none;
|
||||
|
||||
.nav_warp_t,
|
||||
.logo_warp,
|
||||
.menu_list {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.nav_warp_t {
|
||||
width: 100%;
|
||||
height: 92px;
|
||||
background: linear-gradient(180deg, #F7FCFF 0%, #ECF7FF 100%);
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.logo_icon {
|
||||
width: 46px;
|
||||
height: 46px;
|
||||
background-color: saddlebrown;
|
||||
margin: 0 10px 0 20px;
|
||||
}
|
||||
|
||||
.system_title {
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
color: #4A6B89;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
.menu_list {
|
||||
margin-right:200px;
|
||||
&_item {
|
||||
&_img {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
background-color: saddlebrown;
|
||||
margin-right: 40px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&_name {
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #1A374A;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.name_active{
|
||||
color:#E30000;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.times {
|
||||
margin-right: 20px;
|
||||
font-size: 12px;
|
||||
|
||||
div {
|
||||
height: 20px;
|
||||
line-height: 20px;
|
||||
color: #666666;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.nav_warp_b {
|
||||
display:flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
background: linear-gradient(rgb(74, 180, 228) 0%, rgb(162, 225, 255) 100%);
|
||||
box-shadow: 0px 2px 4px 0px rgba(36, 57, 75, 0.5);
|
||||
|
||||
&_version{
|
||||
margin-left:20px;
|
||||
}
|
||||
|
||||
&_menu {
|
||||
display: flex;
|
||||
height: 40px;
|
||||
|
||||
.tab_warp {
|
||||
padding: 0 30px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
&:not(:last-child)::after {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 50%;
|
||||
bottom: 50%;
|
||||
transform: translateY(-50%);
|
||||
content: '';
|
||||
height: 28px;
|
||||
border-right: 1px solid rgba(217, 217, 217, .55);
|
||||
height: 28px;
|
||||
}
|
||||
}
|
||||
|
||||
.tab_con {
|
||||
width: auto;
|
||||
padding: 0 44px;
|
||||
border: 1px solid rgba(0, 0, 0, 0);
|
||||
margin-top: 4px;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
border-radius: 4px 4px 0px 0px;
|
||||
display: flex;
|
||||
padding-top: 8px;
|
||||
|
||||
&:hover {
|
||||
border: 1px solid #fff;
|
||||
background: linear-gradient(180deg, #CAE9F7 0%, #FFFFFF 100%);
|
||||
color: #4A6B89;
|
||||
}
|
||||
}
|
||||
|
||||
.active_tab {
|
||||
border: 1px solid #fff;
|
||||
background: linear-gradient(180deg, #CAE9F7 0%, #FFFFFF 100%);
|
||||
color: #4A6B89;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.nav_warp_sub{
|
||||
width:100%;
|
||||
height:40px;
|
||||
line-height:40px;
|
||||
text-align:center;
|
||||
color: #4A6B89;
|
||||
font-size:16px;
|
||||
font-weight: 600;
|
||||
background: linear-gradient(180deg, #CAE9F7 0%, #FFFFFF 100%);
|
||||
}
|
||||
}
|
||||
|
||||
.main_warp {
|
||||
width: 100%;
|
||||
height: calc(100vh - 114px);
|
||||
min-height: 600px;
|
||||
display: flex;
|
||||
|
||||
.left_menu {
|
||||
width: 260px;
|
||||
min-width: 260px;
|
||||
height: 100%;
|
||||
min-height: calc(100vh - 114px - 50px);
|
||||
background: #FFFFFF;
|
||||
border-right: 1px solid #D8D8D8;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.right_warp {
|
||||
height: calc(100% - 114px);
|
||||
min-height: calc(100vh - 114px);
|
||||
width: calc(100% - 261px)
|
||||
}
|
||||
|
||||
.right_route {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
background: #F9F9F9;
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
padding: 0 20px;
|
||||
height: 50px;
|
||||
background: linear-gradient(180deg, #BEE5F8 0%, #4AB4E4 100%);
|
||||
box-shadow: 0px -2px 4px 0px rgba(199, 206, 213, 0.5);
|
||||
border-radius: 1px;
|
||||
border: 2px solid;
|
||||
border-image: linear-gradient(180deg, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)) 2 2;
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
import { history } from 'umi';
|
||||
import { Button, Result } from 'antd';
|
||||
import React from 'react';
|
||||
|
||||
const NoFoundPage: React.FC = () => (
|
||||
<Result
|
||||
status="404"
|
||||
title="404"
|
||||
subTitle="Sorry, the page you visited does not exist."
|
||||
extra={
|
||||
<Button type="primary" onClick={() => history.push('/')}>
|
||||
Back Home
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
);
|
||||
|
||||
export default NoFoundPage;
|
@ -0,0 +1,62 @@
|
||||
.entrance {
|
||||
position: relative;
|
||||
width: 100vw;
|
||||
min-height: 100vh;
|
||||
background: url('../../assets/images/bk_img.png') no-repeat;
|
||||
background-size: 100% 100%;
|
||||
|
||||
.text_warp {
|
||||
width: 80vw;
|
||||
margin: 0 auto;
|
||||
|
||||
div {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div:nth-child(1) {
|
||||
font-size: 36px;
|
||||
font-weight: 600;
|
||||
padding-top: 30vh;
|
||||
}
|
||||
|
||||
div:nth-child(2) {
|
||||
font-size: 50px;
|
||||
font-weight: 600;
|
||||
margin: 50px 0 80px 0;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
div:nth-child(3) {
|
||||
font-size: 28px;
|
||||
}
|
||||
}
|
||||
|
||||
.prompt {
|
||||
position: fixed;
|
||||
bottom: 45px;
|
||||
right: 20px;
|
||||
font-size: 24px;
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
.login_warp {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.imges {
|
||||
width: 81px;
|
||||
height: 81px;
|
||||
margin-right: 20px;
|
||||
background-color: saddlebrown;
|
||||
}
|
||||
}
|
||||
|
||||
.goback {
|
||||
position: absolute;
|
||||
left: 20px;
|
||||
top: 20px;
|
||||
font-size: 18px;
|
||||
cursor: pointer;
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import styles from './index.less';
|
||||
|
||||
// GLQ远程维护 --> 交互维护命令--> 当前IP
|
||||
export default function Page() {
|
||||
return (
|
||||
<div>
|
||||
{'GLQ远程维护 --> 交互维护命令--> 当前IP'}
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import styles from './index.less';
|
||||
|
||||
// GLQ远程维护 --> 交互维护命令--> 当前IP
|
||||
export default function Page() {
|
||||
return (
|
||||
<div>
|
||||
{'GLQ远程维护 --> 交互维护命令--> 当前IP'}
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
import ContentWarp from '@/components/ContentWarp';
|
||||
import styles from '../../index.less';
|
||||
import { Form, Input, message } from 'antd';
|
||||
import ButtonComp from '@/components/ButtonComp';
|
||||
import { setParameter } from '@/services/gql';
|
||||
import { validateIPAddress } from '@/utils/validate';
|
||||
|
||||
export default function Page() {
|
||||
const [form] = Form.useForm();
|
||||
|
||||
const onFinish = (values: any) => {
|
||||
setParameter({
|
||||
ipAddress: values.ipAddress
|
||||
}).then((res) => {
|
||||
if (res.result == 'success') {
|
||||
message.success('连接成功')
|
||||
}else {
|
||||
message.success(res.errorMsg)
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
return (
|
||||
<div className={styles.params_warp}>
|
||||
<ContentWarp text={'参数设置'}>
|
||||
<div className='pd20'>配置与被控端连接的连接参数</div>
|
||||
<div className='line'></div>
|
||||
<div className='pd20 pb100'>
|
||||
<Form form={form} onFinish={onFinish}>
|
||||
<Form.Item
|
||||
name="ipAddress"
|
||||
label="本地GLQ后端IP"
|
||||
rules={[
|
||||
{ required: true, message: '请输入本地GLQ后端IP' },
|
||||
{ validator: validateIPAddress },
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入本地GLQ后端IP" style={{ width: '560px' }} />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
<div className={styles.btn_warp}>
|
||||
<ButtonComp style={{ marginRight: 20 }} text={'建立连接'} onClick={() => form.submit()} />
|
||||
<ButtonComp type={'cancel'} text={'参数重置'} onClick={() => form.resetFields()} />
|
||||
</div>
|
||||
</div>
|
||||
</ContentWarp>
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import styles from './index.less';
|
||||
|
||||
// GLQ远程维护 --> 交互维护命令--> PING命令
|
||||
export default function Page() {
|
||||
return (
|
||||
<div>
|
||||
{'GLQ远程维护 --> 交互维护命令--> PING命令'}
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import styles from './index.less';
|
||||
|
||||
// GLQ远程维护 --> 交互维护命令--> 系统时间
|
||||
export default function Page() {
|
||||
return (
|
||||
<div>
|
||||
{'GLQ远程维护 --> 交互维护命令--> 系统时间'}
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import styles from './index.less';
|
||||
|
||||
// GLQ远程维护 --> 交互维护命令-->TELNET命令
|
||||
export default function Page() {
|
||||
return (
|
||||
<div>
|
||||
{'GLQ远程维护 --> 交互维护命令-->TELNET命令'}
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,123 @@
|
||||
import ContentWarp from '@/components/ContentWarp';
|
||||
import styles from '../../index.less';
|
||||
import { Form, Input, Select, message } from 'antd';
|
||||
import ButtonComp from '@/components/ButtonComp';
|
||||
import { useEffect } from 'react';
|
||||
import { remoteFileConfiSendData, remoteFileConfigClean } from '@/services/gql';
|
||||
|
||||
// 网络GLQ配置 --> 远程文件配置--> 管理配置
|
||||
export default function Page() {
|
||||
|
||||
const [form] = Form.useForm();
|
||||
|
||||
useEffect(() => {
|
||||
form.setFieldsValue({
|
||||
deviceLocation: '前端机平台',
|
||||
deviceType: '类型1',
|
||||
hotStandby: 'no',
|
||||
deviceId: '',
|
||||
})
|
||||
}, [])
|
||||
|
||||
const onFinish = (values: any) => {
|
||||
remoteFileConfiSendData({
|
||||
jsonStr: JSON.stringify(values),
|
||||
type: 4
|
||||
}).then((res) => {
|
||||
if (res?.result == "success") {
|
||||
message.success('文件提交成功');
|
||||
form.resetFields();
|
||||
} else {
|
||||
message.error(res?.errorMsg);
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
const clearInfo = () => {
|
||||
remoteFileConfigClean({type: 4}).then(res => {
|
||||
if (res?.result == "success") {
|
||||
message.success('清除信息成功');
|
||||
}else {
|
||||
message.error(res?.errorMsg);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
return (
|
||||
<div className={`${styles.params_warp}`}>
|
||||
<ContentWarp text={'管理文件配置'}>
|
||||
<div className='pd20'>配置隔离器应用程序运行管理参数</div>
|
||||
<div className='line'></div>
|
||||
<div className='pd20 pb100'>
|
||||
<Form
|
||||
form={form}
|
||||
onFinish={onFinish}
|
||||
>
|
||||
<Form.Item
|
||||
name="deviceLocation"
|
||||
label="设备位置"
|
||||
rules={[
|
||||
{ required: true, message: '请选择设备位置' },
|
||||
]}
|
||||
>
|
||||
<Select
|
||||
style={{ width: 560 }}
|
||||
onChange={(e) => { }}
|
||||
options={[
|
||||
{ label: '前端机平台', value: '前端机平台' },
|
||||
{ label: '后端机平台', value: '后端机平台' }
|
||||
]}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
name="deviceType"
|
||||
label="设备类型"
|
||||
rules={[
|
||||
{ required: true, message: '请选择设备类型' },
|
||||
]}
|
||||
>
|
||||
<Select
|
||||
style={{ width: 560 }}
|
||||
onChange={(e) => { }}
|
||||
options={[
|
||||
{ label: '类型1', value: '类型1' },
|
||||
{ label: '类型2', value: '类型2' }
|
||||
]}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
name="hotStandby"
|
||||
label="存在热备"
|
||||
rules={[
|
||||
{ required: true, message: '请选择存在热备' },
|
||||
]}
|
||||
>
|
||||
<Select
|
||||
style={{ width: 560 }}
|
||||
onChange={(e) => { }}
|
||||
options={[
|
||||
{ label: 'no', value: 'no' },
|
||||
{ label: 'yes', value: 'yes' }
|
||||
]}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
name="deviceId"
|
||||
label="设备标识"
|
||||
rules={[
|
||||
{ required: true, message: '请输入设备标识' },
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入设备标识" style={{ width: '560px' }} />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
<div className={styles.btn_warp}>
|
||||
<ButtonComp style={{ marginRight: 20 }} text={'文件提交'} onClick={() => form.submit()} />
|
||||
<ButtonComp type={'cancel'} text={'清空信息'} onClick={() => clearInfo()} />
|
||||
</div>
|
||||
</div>
|
||||
</ContentWarp>
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
.params_warp1 {
|
||||
[class~='ant-form-item-label'] {
|
||||
width: 80px;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
import ContentWarp from '@/components/ContentWarp';
|
||||
import styles from '../../index.less';
|
||||
import styles1 from './index.less';
|
||||
import { Form, Input, message } from 'antd';
|
||||
import ButtonComp from '@/components/ButtonComp';
|
||||
import { remoteFileConfiSendData, remoteFileConfigClean } from '@/services/gql';
|
||||
import { subnetMaskValidator, validateIPAddress } from '@/utils/validate';
|
||||
|
||||
// 网络GLQ配置 --> 远程文件配置--> 网络参数
|
||||
export default function Page() {
|
||||
|
||||
const [form] = Form.useForm();
|
||||
|
||||
const onFinish = (values: any) => {
|
||||
remoteFileConfiSendData({
|
||||
jsonStr: JSON.stringify(values),
|
||||
type: 2
|
||||
}).then( (res) => {
|
||||
if (res?.result == "success") {
|
||||
message.success('文件提交成功');
|
||||
form.resetFields();
|
||||
}else {
|
||||
message.error(res?.errorMsg);
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
const clearInfo = () => {
|
||||
remoteFileConfigClean({type: 2}).then(res => {
|
||||
if (res?.result == "success") {
|
||||
message.success('清除信息成功');
|
||||
}else {
|
||||
message.error(res?.errorMsg);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={`${styles.params_warp} ${styles1.params_warp1}`}>
|
||||
<ContentWarp text={'网络参数配置'}>
|
||||
<div className='pd20'>配置隔离器网络运行参数</div>
|
||||
<div className='line'></div>
|
||||
<div className='pd20 pb100'>
|
||||
<Form
|
||||
form={form}
|
||||
onFinish={onFinish}
|
||||
>
|
||||
<Form.Item
|
||||
name="ipAddress"
|
||||
label="IP地址"
|
||||
rules={[
|
||||
{ required: true, message: '请输入IP地址' },
|
||||
{ validator: validateIPAddress }
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入IP地址" style={{ width: '560px' }} />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
name="mask"
|
||||
label="子网掩码"
|
||||
rules={[
|
||||
{ required: true, message: '请输入子网掩码' }
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入子网掩码" style={{ width: '560px' }} />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
name="defaultGateway"
|
||||
label="默认网关"
|
||||
rules={[
|
||||
{ required: true, message: '请输入默认网关' },
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入默认网关" style={{ width: '560px' }} />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
<div className={styles.btn_warp}>
|
||||
<ButtonComp style={{ marginRight: 20 }} text={'文件提交'} onClick={() => form.submit()} />
|
||||
<ButtonComp type={'cancel'} text={'清空信息'} onClick={() => clearInfo()} />
|
||||
</div>
|
||||
</div>
|
||||
</ContentWarp>
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,111 @@
|
||||
|
||||
import ContentWarp from '@/components/ContentWarp';
|
||||
import styles from '../../index.less';
|
||||
import { ConfigProvider, Form, Input, Table, message } from 'antd';
|
||||
import ButtonComp from '@/components/ButtonComp';
|
||||
import { useState } from 'react';
|
||||
|
||||
import { rowClassName } from '@/utils';
|
||||
import { validateIPAddress, validatePort } from '@/utils/validate';
|
||||
import { remoteFileConfiSendData, remoteFileConfigClean } from '@/services/gql';
|
||||
|
||||
// 网络GLQ配置 --> 远程文件配置--> 服务列表
|
||||
export default function Page() {
|
||||
const [form] = Form.useForm();
|
||||
const [tableData, setTableData] = useState<any>([]);
|
||||
|
||||
const onFinish = (values: any) => {
|
||||
values.rowKey = Math.random();
|
||||
setTableData([...tableData, values])
|
||||
};
|
||||
|
||||
const columns: any = [
|
||||
{
|
||||
title: '序号', key: 'index', align: 'center', width: 80,
|
||||
render: (a: any, b: any, c: any) => {
|
||||
return <span>{c + 1}</span>;
|
||||
},
|
||||
},
|
||||
{ title: '服务名称', dataIndex: 'serviceName', key: 'serviceName', align: 'center' },
|
||||
{ title: '服务器IP', dataIndex: 'serviceIP', key: 'serviceIP', align: 'center' },
|
||||
{ title: '服务端口', dataIndex: 'servicePort', key: 'servicePort', align: 'center' },
|
||||
]
|
||||
|
||||
const sending = () => {
|
||||
if(tableData.length == 0) {
|
||||
message.info('请添加数据');
|
||||
return
|
||||
}
|
||||
|
||||
let serviceList = tableData.map(({serviceName, serviceIP, servicePort}: any) => {
|
||||
return {serviceName, serviceIP, servicePort}
|
||||
})
|
||||
remoteFileConfiSendData({
|
||||
jsonStr: JSON.stringify({ serviceList: serviceList }),
|
||||
type: 1
|
||||
}).then( (res) => {
|
||||
if (res?.result == "success") {
|
||||
message.success('发送数据成功');
|
||||
form.resetFields();
|
||||
}else {
|
||||
message.error(res?.errorMsg);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const clearInfo = () => {
|
||||
remoteFileConfigClean({type: 1}).then(res => {
|
||||
if (res?.result == "success") {
|
||||
message.success('清除信息成功');
|
||||
}else {
|
||||
message.error(res?.errorMsg);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={styles.params_warp}>
|
||||
<ContentWarp text={'服务列表配置'}>
|
||||
<div className='pd20'>配置隔离器与应用服务器通信参数列表</div>
|
||||
<div className='line'></div>
|
||||
<div className='pd20 pb100'>
|
||||
|
||||
<Form form={form} layout={'inline'} onFinish={onFinish} className='mb20'>
|
||||
<Form.Item name="serviceName" label="服务名称" rules={[{ required: true, message: '请输入服务名称' }]} >
|
||||
<Input placeholder="请输入服务名称" style={{ width: '200px' }} />
|
||||
</Form.Item>
|
||||
<Form.Item name="serviceIP" label="服务IP" rules={[
|
||||
{ required: true, message: '请输入服务IP' },
|
||||
{ validator: validateIPAddress}
|
||||
]} >
|
||||
<Input placeholder="请输入服务IP" style={{ width: '200px' }} />
|
||||
</Form.Item>
|
||||
<Form.Item name="servicePort" label="服务端口" rules={[
|
||||
{ required: true, message: '请输入服务端口' },
|
||||
{ validator: validatePort }
|
||||
]} >
|
||||
<Input placeholder="请输入服务端口" style={{ width: '200px' }} />
|
||||
</Form.Item>
|
||||
<ButtonComp text={'提交'} onClick={() => form.submit()} />
|
||||
</Form>
|
||||
|
||||
<Table
|
||||
scroll={tableData.length > 0 ? { y: 41 * 5 } : {}}
|
||||
pagination={false}
|
||||
bordered
|
||||
columns={columns}
|
||||
dataSource={tableData}
|
||||
rowKey={(record: any) => record?.rowKey}
|
||||
rowClassName={rowClassName}
|
||||
/>
|
||||
|
||||
<div className={styles.btn_warp}>
|
||||
<ButtonComp style={{ marginRight: 20 }} text={'发送数据'} onClick={() => sending()} />
|
||||
<ButtonComp type={'cancel'} text={'清空信息'} onClick={() => clearInfo()} />
|
||||
</div>
|
||||
</div>
|
||||
</ContentWarp>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -0,0 +1,6 @@
|
||||
.params_warp1 {
|
||||
[class~='ant-form-item-label'] {
|
||||
width: 110px;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|