📝 修改文档.
36
README.md
@@ -3,7 +3,7 @@
|
|||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
`orion-ops-pro` 是一款现代化、高颜值的一站式智能运维管理平台,集资产管理、资产授权、批量执行、Web终端、WebSftp、角色管理、系统管理等功能于一体,致力于简化运维团队的治理工作。它是基于 `orion-ops`
|
`orion-ops-pro` 是一款现代化、高颜值的一站式智能运维管理平台,集资产管理、资产授权、批量执行、Web终端、WebSftp、角色管理、系统管理等功能于一体,致力于简化运维团队的治理工作。它是基于 `orion-ops`
|
||||||
的产品思路进行重构,技术架构升级,并优化了交互逻辑,让操作更快捷友好。
|
的产品思路进行重构,技术架构升级,并优化了交互逻辑,让操作更快捷更友好。
|
||||||
|
|
||||||
<p style="text-align: left">
|
<p style="text-align: left">
|
||||||
<a target="_blank" style="text-decoration: none" href="https://app.codacy.com/gh/lijiahangmax/orion-ops-pro/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade">
|
<a target="_blank" style="text-decoration: none" href="https://app.codacy.com/gh/lijiahangmax/orion-ops-pro/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade">
|
||||||
@@ -77,32 +77,38 @@ roadmap: https://lijiahangmax.gitee.io/orion-ops-pro/#/about/roadmap
|
|||||||
|
|
||||||
> 工作台
|
> 工作台
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
> 资产管理
|
> 资产管理
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
> 主机终端
|
> 主机终端
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
|
> 批量执行
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
> 用户管理
|
> 用户管理
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
> 系统管理
|
> 系统管理
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
## 联系我
|
## 联系我
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
<img style="margin-right: 8px;" src="./assert/logo.svg" width="32px" height="32px"/> orion-ops-pro 是什么
|
<img style="margin-right: 8px;" src="./assert/logo.svg" width="32px" height="32px"/> orion-ops-pro 是什么
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
`orion-ops-pro` 是一款现代化、高颜值的一站式智能运维管理平台,集资产管理、资产授权、批量执行、Web终端、WebSftp、角色管理、系统管理等功能于一体,致力于简化运维团队的治理工作。它是基于 `orion-ops`
|
`orion-ops-pro`
|
||||||
的产品思路进行重构,技术架构升级,并优化了交互逻辑,让操作更快捷友好。
|
是一款现代化、高颜值的一站式智能运维管理平台,集资产管理、资产授权、批量执行、Web终端、WebSftp、角色管理、系统管理等功能于一体,致力于简化运维团队的治理工作。它是基于 `orion-ops`
|
||||||
|
的产品思路进行重构,技术架构升级,并优化了交互逻辑,让操作更快捷更友好。
|
||||||
|
|
||||||
<p style="text-align: left">
|
<p style="text-align: left">
|
||||||
<a target="_blank" style="text-decoration: none" href="https://app.codacy.com/gh/lijiahangmax/orion-ops-pro/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade">
|
<a target="_blank" style="text-decoration: none" href="https://app.codacy.com/gh/lijiahangmax/orion-ops-pro/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade">
|
||||||
@@ -91,6 +92,12 @@ roadmap: https://lijiahangmax.gitee.io/orion-ops-pro/#/about/roadmap
|
|||||||

|

|
||||||

|

|
||||||
|
|
||||||
|
> 批量执行
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
> 用户管理
|
> 用户管理
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
|
|
||||||
## v1.0.2
|
## v1.0.2
|
||||||
|
|
||||||
`2024-03-22` `release`
|
`2024-03-2` `release`
|
||||||
|
|
||||||
|
* 🚀 升级 `arco design` `2.55.0`
|
||||||
* 🐞 修复 SFTP 加载失败后一直 loading
|
* 🐞 修复 SFTP 加载失败后一直 loading
|
||||||
* 🐞 修复 主机终端搜索框报错
|
* 🐞 修复 主机终端搜索框报错
|
||||||
* 🐞 修复 SSH 配置未启用还可以连接
|
* 🐞 修复 SSH 配置未启用还可以连接
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
## 功能排期 ⏳
|
## 功能排期 ⏳
|
||||||
|
|
||||||
* 批量执行
|
|
||||||
* 定时执行
|
* 定时执行
|
||||||
|
* 批量上传
|
||||||
|
* 文件夹书签
|
||||||
* 站内消息
|
* 站内消息
|
||||||
* 终端背景图片
|
* 终端背景图片
|
||||||
* 资产授权 UI 改版
|
* 资产授权 UI 改版
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 561 KiB After Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 584 KiB After Width: | Height: | Size: 100 KiB |
BIN
docs/assert/img/batch_exec.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
docs/assert/img/batch_exec_log.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
docs/assert/img/batch_exec_record.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 605 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 530 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 609 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 509 KiB After Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 504 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 563 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 524 KiB After Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 582 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 552 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 554 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 613 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 606 KiB After Width: | Height: | Size: 136 KiB |
@@ -2,7 +2,7 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>关于orion-ops-pro</title>
|
<title>关于 orion-ops-pro</title>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
||||||
<meta name="description" content="Description">
|
<meta name="description" content="Description">
|
||||||
<link rel="icon" href="./assert/logo.svg">
|
<link rel="icon" href="./assert/logo.svg">
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
在主机终端页面打开的 `SSH` `SFTP` 连接都会记录下来。
|
在主机终端页面打开的 `SSH` `SFTP` 连接都会记录下来。
|
||||||
|
|
||||||
* 详情: 查看连接详情
|
* 详情: 查看连接详情
|
||||||
* 断开: 断开连接
|
* 断开: 断开会话连接
|
||||||
* 删除: 删除连接记录
|
* 删除: 删除连接记录
|
||||||
* 清理: 根据条件清理数据
|
* 清理: 根据条件清理数据
|
||||||
|
|
||||||
|
|||||||
@@ -37,17 +37,55 @@
|
|||||||
> SFTP
|
> SFTP
|
||||||
|
|
||||||
* 预览: 默认只能预览 2MB 以内的普通文件, 这个大小可以在前端 env 文件中修改 `VITE_SFTP_PREVIEW_MB`
|
* 预览: 默认只能预览 2MB 以内的普通文件, 这个大小可以在前端 env 文件中修改 `VITE_SFTP_PREVIEW_MB`
|
||||||
|
* 上传: 如果文件已存在则自动重命名之前的文件
|
||||||
|
|
||||||
> 终端面板
|
> 终端面板
|
||||||
|
|
||||||
⭐ 双击终端标签可快速复制会话
|
⭐ 双击终端标签可快速复制会话
|
||||||
|
|
||||||
|
### 批量执行
|
||||||
|
|
||||||
|
批量执行 ssh 主机 shell 脚本。
|
||||||
|
|
||||||
|
##### 日志面板中有几个内置的快捷键
|
||||||
|
|
||||||
|
* 回车: `Enter`
|
||||||
|
* 向上滚动: `↑`
|
||||||
|
* 向上滚动一页: `ctrl` `↑`
|
||||||
|
* 向下滚动: `↓`
|
||||||
|
* 向下滚动一页: `ctrl` `↓`
|
||||||
|
* 全选: `ctrl` `A`
|
||||||
|
* 复制: `ctrl` `C`
|
||||||
|
* 搜索: `ctrl` `F`
|
||||||
|
* 清空: `ctrl` `L`
|
||||||
|
|
||||||
|
⭐ 内置参数同执行模板参数
|
||||||
|
|
||||||
|
* 重置: 重置全部参数
|
||||||
|
* 执行: 执行所输入的命令
|
||||||
|
* 返回: 返回到执行命令页面
|
||||||
|
* 从模板中选择: 从模板中选择需要执行的命令
|
||||||
|
* 执行历史: 点击历史命令可以快速填入
|
||||||
|
|
||||||
|
### 执行记录
|
||||||
|
|
||||||
|
查看批量执行任务记录。
|
||||||
|
|
||||||
|
* 执行命令: 跳转到批量执行页面
|
||||||
|
* 清空: 清空执行记录
|
||||||
|
* 删除: 删除执行记录
|
||||||
|
* 重新执行: 重新执行此命令
|
||||||
|
* 命令: 查看执行时的命令
|
||||||
|
* 参数: 查看执行时的参数
|
||||||
|
* 日志: 查看执行日志, ctrl + 左键点击会用新页面打开
|
||||||
|
* 下载: 下载执行日志
|
||||||
|
|
||||||
### 执行模板
|
### 执行模板
|
||||||
|
|
||||||
用来维护批量执行的命令模板, 支持动态参数, 使用 `@{{ xxx }}` 来替换命令参数。
|
用来维护批量执行的命令模板, 支持动态参数, 使用 `@{{ xxx }}` 来替换命令参数。
|
||||||
|
|
||||||
* 新增: 新增执行模板
|
* 新增: 新增执行模板
|
||||||
* 执行: 使用此命令模板批量执行主机命令
|
* 执行: 打开命令执行框并且带入模板参数
|
||||||
* 修改: 修改执行模板
|
* 修改: 修改执行模板
|
||||||
* 删除: 删除执行模板
|
* 删除: 删除执行模板
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
VITE_API_BASE_URL= 'http://127.0.0.1:9200/orion/api'
|
VITE_API_BASE_URL= 'http://127.0.0.1:9200/orion/api'
|
||||||
VITE_WS_BASE_URL= 'ws://127.0.0.1:9200/orion/keep-alive'
|
VITE_WS_BASE_URL= 'ws://127.0.0.1:9200/orion/keep-alive'
|
||||||
VITE_APP_VERSION= '1.0.1'
|
VITE_APP_VERSION= '1.0.2'
|
||||||
VITE_SFTP_PREVIEW_MB= 2
|
VITE_SFTP_PREVIEW_MB= 2
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
VITE_API_BASE_URL= '/orion/api'
|
VITE_API_BASE_URL= '/orion/api'
|
||||||
VITE_WS_BASE_URL= '/orion/keep-alive'
|
VITE_WS_BASE_URL= '/orion/keep-alive'
|
||||||
VITE_APP_VERSION= '1.0.1'
|
VITE_APP_VERSION= '1.0.2'
|
||||||
VITE_SFTP_PREVIEW_MB= 2
|
VITE_SFTP_PREVIEW_MB= 2
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
define: {
|
define: {
|
||||||
'process.env': {},
|
'process.env': {},
|
||||||
|
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: JSON.stringify(true),
|
||||||
},
|
},
|
||||||
css: {
|
css: {
|
||||||
preprocessorOptions: {
|
preprocessorOptions: {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "orion-ops-pro-ui",
|
"name": "orion-ops-pro-ui",
|
||||||
"description": "Orion Ops Pro for Vue",
|
"description": "Orion Ops Pro for Vue",
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"author": "Jiahang Li",
|
"author": "Jiahang Li",
|
||||||
"license": "Apache 2.0",
|
"license": "Apache 2.0",
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@arco-design/web-vue": "^2.53.3",
|
"@arco-design/web-vue": "^2.55.0",
|
||||||
"@dangojs/a-query-header": "^0.0.31",
|
"@dangojs/a-query-header": "^0.0.31",
|
||||||
"@sanqi377/arco-vue-icon-picker": "^1.0.7",
|
"@sanqi377/arco-vue-icon-picker": "^1.0.7",
|
||||||
"@vueuse/core": "^9.3.0",
|
"@vueuse/core": "^9.3.0",
|
||||||
|
|||||||
11622
orion-ops-ui/pnpm-lock.yaml
generated
@@ -1,8 +1,8 @@
|
|||||||
import type { IDisposable, ITerminalInitOnlyOptions, ITerminalOptions, Terminal } from 'xterm';
|
import type { IDisposable, ITerminalInitOnlyOptions, ITerminalOptions, Terminal } from 'xterm';
|
||||||
import type { FitAddon } from 'xterm-addon-fit';
|
import type { FitAddon } from 'xterm-addon-fit';
|
||||||
import type { SearchAddon } from 'xterm-addon-search';
|
import type { SearchAddon } from 'xterm-addon-search';
|
||||||
import type { CanvasAddon } from 'xterm-addon-canvas';
|
|
||||||
import type { WebLinksAddon } from 'xterm-addon-web-links';
|
import type { WebLinksAddon } from 'xterm-addon-web-links';
|
||||||
|
import type { WebglAddon } from 'xterm-addon-webgl';
|
||||||
|
|
||||||
// appender 配置
|
// appender 配置
|
||||||
export const AppenderOptions: ITerminalOptions & ITerminalInitOnlyOptions = {
|
export const AppenderOptions: ITerminalOptions & ITerminalInitOnlyOptions = {
|
||||||
@@ -42,7 +42,7 @@ export interface LogAppenderConf {
|
|||||||
// appender 插件
|
// appender 插件
|
||||||
export interface LogAddons extends Record<string, IDisposable> {
|
export interface LogAddons extends Record<string, IDisposable> {
|
||||||
fit: FitAddon;
|
fit: FitAddon;
|
||||||
canvas: CanvasAddon;
|
webgl: WebglAddon;
|
||||||
search: SearchAddon;
|
search: SearchAddon;
|
||||||
weblink: WebLinksAddon;
|
weblink: WebLinksAddon;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import { copy as copyText } from '@/hooks/copy';
|
|||||||
import { Terminal } from 'xterm';
|
import { Terminal } from 'xterm';
|
||||||
import { FitAddon } from 'xterm-addon-fit';
|
import { FitAddon } from 'xterm-addon-fit';
|
||||||
import { SearchAddon } from 'xterm-addon-search';
|
import { SearchAddon } from 'xterm-addon-search';
|
||||||
import { CanvasAddon } from 'xterm-addon-canvas';
|
|
||||||
import { WebLinksAddon } from 'xterm-addon-web-links';
|
import { WebLinksAddon } from 'xterm-addon-web-links';
|
||||||
|
import { WebglAddon } from 'xterm-addon-webgl';
|
||||||
|
|
||||||
// 执行日志 appender 实现
|
// 执行日志 appender 实现
|
||||||
export default class LogAppender implements ILogAppender {
|
export default class LogAppender implements ILogAppender {
|
||||||
@@ -76,26 +76,48 @@ export default class LogAppender implements ILogAppender {
|
|||||||
if (e.type !== 'keydown') {
|
if (e.type !== 'keydown') {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (e.ctrlKey && e.code === 'KeyC') {
|
if (e.code === 'Enter') {
|
||||||
// 复制
|
// 新起一行
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.copy();
|
terminal.write('\r\n');
|
||||||
return false;
|
} else if (e.code === 'ArrowUp') {
|
||||||
} else if (e.ctrlKey && e.code === 'KeyL') {
|
|
||||||
// 清空
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.clear();
|
if (e.ctrlKey) {
|
||||||
return false;
|
// 上移一页
|
||||||
|
terminal.scrollPages(-1);
|
||||||
|
} else {
|
||||||
|
// 上移
|
||||||
|
terminal.scrollLines(-1);
|
||||||
|
}
|
||||||
|
} else if (e.code === 'ArrowDown') {
|
||||||
|
e.preventDefault();
|
||||||
|
if (e.ctrlKey) {
|
||||||
|
// 下移一页
|
||||||
|
terminal.scrollPages(1);
|
||||||
|
} else {
|
||||||
|
// 下移
|
||||||
|
terminal.scrollLines(1);
|
||||||
|
}
|
||||||
} else if (e.ctrlKey && e.code === 'KeyA') {
|
} else if (e.ctrlKey && e.code === 'KeyA') {
|
||||||
// 全选
|
// 全选
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.selectAll();
|
this.selectAll();
|
||||||
return false;
|
return false;
|
||||||
|
} else if (e.ctrlKey && e.code === 'KeyC') {
|
||||||
|
// 复制
|
||||||
|
e.preventDefault();
|
||||||
|
this.copy();
|
||||||
|
return false;
|
||||||
} else if (e.ctrlKey && e.code === 'KeyF') {
|
} else if (e.ctrlKey && e.code === 'KeyF') {
|
||||||
// 搜索
|
// 搜索
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.current.openSearch();
|
this.current.openSearch();
|
||||||
return false;
|
return false;
|
||||||
|
} else if (e.ctrlKey && e.code === 'KeyL') {
|
||||||
|
// 清空
|
||||||
|
e.preventDefault();
|
||||||
|
this.clear();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
@@ -105,16 +127,16 @@ export default class LogAppender implements ILogAppender {
|
|||||||
initAddons(terminal: Terminal): LogAddons {
|
initAddons(terminal: Terminal): LogAddons {
|
||||||
const fit = new FitAddon();
|
const fit = new FitAddon();
|
||||||
const search = new SearchAddon();
|
const search = new SearchAddon();
|
||||||
const canvas = new CanvasAddon();
|
const webgl = new WebglAddon();
|
||||||
const weblink = new WebLinksAddon();
|
const weblink = new WebLinksAddon();
|
||||||
terminal.loadAddon(fit);
|
terminal.loadAddon(fit);
|
||||||
terminal.loadAddon(search);
|
terminal.loadAddon(search);
|
||||||
terminal.loadAddon(canvas);
|
terminal.loadAddon(webgl);
|
||||||
terminal.loadAddon(weblink);
|
terminal.loadAddon(weblink);
|
||||||
return {
|
return {
|
||||||
fit,
|
fit,
|
||||||
search,
|
search,
|
||||||
canvas,
|
webgl,
|
||||||
weblink
|
weblink
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||