From 5c3818dd735ea5e889a2fb58ef4ec009302dedad Mon Sep 17 00:00:00 2001 From: chaoszhu Date: Sat, 20 Jul 2024 18:57:59 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20host=20ssh=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/package.json | 1 - server/.eslintrc.js | 4 +- server/app/controller/host.js | 53 ++- server/app/controller/ssh.js | 11 + server/app/router/routes.js | 7 +- web/src/api/index.js | 3 + web/src/components/aside-box.vue | 12 +- web/src/store/index.js | 6 +- web/src/views/group/index.vue | 8 +- web/src/views/list/components/host-card.vue | 390 ------------------ web/src/views/list/components/host-form.vue | 208 ---------- .../components/setting-tab/email-list.vue | 185 --------- .../list/components/setting-tab/group.vue | 239 ----------- .../components/setting-tab/notify-list.vue | 63 --- .../list/components/setting-tab/password.vue | 98 ----- .../list/components/setting-tab/record.vue | 46 --- .../list/components/setting-tab/sort.vue | 98 ----- web/src/views/list/components/setting.vue | 69 ---- web/src/views/list/components/ssh-form.vue | 205 --------- web/src/views/list/index.vue | 185 --------- web/src/views/server/components/host-card.vue | 50 +-- web/src/views/server/components/host-form.vue | 204 +++++++-- .../components/setting-tab/email-list.vue | 185 --------- .../server/components/setting-tab/group.vue | 239 ----------- .../components/setting-tab/notify-list.vue | 63 --- .../components/setting-tab/password.vue | 98 ----- .../server/components/setting-tab/record.vue | 46 --- .../server/components/setting-tab/sort.vue | 98 ----- web/src/views/server/components/setting.vue | 69 ---- web/src/views/server/components/ssh-form.vue | 4 +- web/src/views/server/index.vue | 99 ++--- web/src/views/setting/components/group.vue | 8 +- web/src/views/setting/index.vue | 2 +- .../terminal.vue} | 10 +- web/src/views/terminal/index.vue | 71 +++- 35 files changed, 387 insertions(+), 2750 deletions(-) delete mode 100644 web/src/views/list/components/host-card.vue delete mode 100644 web/src/views/list/components/host-form.vue delete mode 100644 web/src/views/list/components/setting-tab/email-list.vue delete mode 100644 web/src/views/list/components/setting-tab/group.vue delete mode 100644 web/src/views/list/components/setting-tab/notify-list.vue delete mode 100644 web/src/views/list/components/setting-tab/password.vue delete mode 100644 web/src/views/list/components/setting-tab/record.vue delete mode 100644 web/src/views/list/components/setting-tab/sort.vue delete mode 100644 web/src/views/list/components/setting.vue delete mode 100644 web/src/views/list/components/ssh-form.vue delete mode 100644 web/src/views/list/index.vue delete mode 100644 web/src/views/server/components/setting-tab/email-list.vue delete mode 100644 web/src/views/server/components/setting-tab/group.vue delete mode 100644 web/src/views/server/components/setting-tab/notify-list.vue delete mode 100644 web/src/views/server/components/setting-tab/password.vue delete mode 100644 web/src/views/server/components/setting-tab/record.vue delete mode 100644 web/src/views/server/components/setting-tab/sort.vue delete mode 100644 web/src/views/server/components/setting.vue rename web/src/views/terminal/{index-old.vue => components/terminal.vue} (96%) diff --git a/client/package.json b/client/package.json index 1dc58a0..e5d5a73 100644 --- a/client/package.json +++ b/client/package.json @@ -29,7 +29,6 @@ "socket.io": "^4.7.5" }, "devDependencies": { - "eslint": "^9.6.0", "nodemon": "^3.1.4", "pkg": "5.8" } diff --git a/server/.eslintrc.js b/server/.eslintrc.js index 3d437d5..82f82c9 100644 --- a/server/.eslintrc.js +++ b/server/.eslintrc.js @@ -1,9 +1,7 @@ // 规则参见:https://cn.eslint.org/docs/rules/ module.exports = { root: true, // 当前配置文件不能往父级查找 - 'globals': { - 'consola': true - }, + 'globals': { 'consola': true }, env: { node: true, es6: true diff --git a/server/app/controller/host.js b/server/app/controller/host.js index 069ea54..d2c2873 100644 --- a/server/app/controller/host.js +++ b/server/app/controller/host.js @@ -1,4 +1,4 @@ -const { readHostList, writeHostList, readSSHRecord, writeSSHRecord } = require('../utils') +const { readHostList, writeHostList } = require('../utils') async function getHostList({ res }) { // console.log('get-host-list') @@ -7,30 +7,52 @@ async function getHostList({ res }) { res.success({ data }) } -async function saveHost({ res, request }) { - let { body: { host: newHost, name, index, expired, expiredNotify, group, consoleUrl, remark } } = request +async function saveHost({ + res, request +}) { + let { + body: { + name, host: newHost, index, expired, expiredNotify, group, consoleUrl, remark, + port, username, authType, password, privateKey, command + } + } = request // console.log(request) if (!newHost || !name) return res.fail({ msg: 'missing params: name or host' }) let hostList = await readHostList() if (hostList?.some(({ host }) => host === newHost)) return res.fail({ msg: `主机${ newHost }已存在` }) if (!Array.isArray(hostList)) hostList = [] - hostList.push({ host: newHost, name, index, expired, expiredNotify, group, consoleUrl, remark }) + hostList.push({ + host: newHost, name, index, expired, expiredNotify, group, consoleUrl, remark, + port, username, authType, password, privateKey, command + }) await writeHostList(hostList) res.success() } -async function updateHost({ res, request }) { - let { body: { host: newHost, name: newName, index, oldHost, expired, expiredNotify, group, consoleUrl, remark } } = request +async function updateHost({ + res, request +}) { + let { + body: { + host: newHost, name: newName, index, oldHost, expired, expiredNotify, group, consoleUrl, remark, + port, username, authType, password, privateKey, command + } + } = request if (!newHost || !newName || !oldHost) return res.fail({ msg: '参数错误' }) let hostList = await readHostList() - if (!hostList.some(({ host }) => host === oldHost)) return res.fail({ msg: `主机${ newHost }不存在` }) + if (!hostList.some(({ host }) => host === oldHost)) return res.fail({ msg: `原实例[${ oldHost }]不存在,请尝试新增实例` }) let targetIdx = hostList.findIndex(({ host }) => host === oldHost) - hostList.splice(targetIdx, 1, { name: newName, host: newHost, index, expired, expiredNotify, group, consoleUrl, remark }) + hostList.splice(targetIdx, 1, { + name: newName, host: newHost, index, expired, expiredNotify, group, consoleUrl, remark, + port, username, authType, password, privateKey, command + }) writeHostList(hostList) res.success() } -async function removeHost({ res, request }) { +async function removeHost({ + res, request +}) { let { body: { host } } = request let hostList = await readHostList() let hostIdx = hostList.findIndex(item => item.host === host) @@ -38,13 +60,14 @@ async function removeHost({ res, request }) { hostList.splice(hostIdx, 1) writeHostList(hostList) // 查询是否存在ssh记录 - let sshRecord = await readSSHRecord() - let sshIdx = sshRecord.findIndex(item => item.host === host) - let flag = sshIdx !== -1 - if (flag) sshRecord.splice(sshIdx, 1) - writeSSHRecord(sshRecord) + // let sshRecord = await readSSHRecord() + // let sshIdx = sshRecord.findIndex(item => item.host === host) + // let flag = sshIdx !== -1 + // if (flag) sshRecord.splice(sshIdx, 1) + // writeSSHRecord(sshRecord) - res.success({ data: `${ host }已移除, ${ flag ? '并移除ssh记录' : '' }` }) + // res.success({ data: `${ host }已移除, ${ flag ? '并移除ssh记录' : '' }` }) + res.success({ data: `${ host }已移除` }) } // 原手动排序接口-废弃 diff --git a/server/app/controller/ssh.js b/server/app/controller/ssh.js index d575c8a..6af5f76 100644 --- a/server/app/controller/ssh.js +++ b/server/app/controller/ssh.js @@ -1,5 +1,15 @@ const { readSSHRecord, writeSSHRecord, AESEncryptSync } = require('../utils') +async function getSSHList({ res }) { + // console.log('get-host-list') + let data = await readSSHRecord() + data = data?.map(item => { + const { host, port, username, _id } = item + return { host, port, username, _id } + }) || [] + res.success({ data }) +} + const updateSSH = async ({ res, request }) => { let { body: { host, port, username, type, password, privateKey, randomKey, command } } = request let record = { host, port, username, type, password, privateKey, randomKey, command } @@ -50,6 +60,7 @@ const getCommand = async ({ res, request }) => { } module.exports = { + getSSHList, updateSSH, removeSSH, existSSH, diff --git a/server/app/router/routes.js b/server/app/router/routes.js index d8d19d2..9c1027a 100644 --- a/server/app/router/routes.js +++ b/server/app/router/routes.js @@ -1,10 +1,15 @@ -const { updateSSH, removeSSH, existSSH, getCommand } = require('../controller/ssh') +const { getSSHList, updateSSH, removeSSH, existSSH, getCommand } = require('../controller/ssh') const { getHostList, saveHost, updateHost, removeHost } = require('../controller/host') const { login, getpublicKey, updatePwd, getLoginRecord } = require('../controller/user') const { getSupportEmailList, getUserEmailList, updateUserEmailList, removeUserEmail, pushEmail, getNotifyList, updateNotifyList } = require('../controller/notify') const { getGroupList, addGroupList, updateGroupList, removeGroup } = require('../controller/group') const ssh = [ + { + method: 'get', + path: '/get-ssh-list', + controller: getSSHList + }, { method: 'post', path: '/update-ssh', diff --git a/web/src/api/index.js b/web/src/api/index.js index cb724b8..70471e0 100644 --- a/web/src/api/index.js +++ b/web/src/api/index.js @@ -7,6 +7,9 @@ export default { getIpInfo (params = {}) { return axios({ url: '/ip-info', method: 'get', params }) }, + getSSHList(params = {}) { + return axios({ url: '/get-ssh-list', method: 'get', params }) + }, updateSSH(data) { return axios({ url: '/update-ssh', method: 'post', data }) }, diff --git a/web/src/components/aside-box.vue b/web/src/components/aside-box.vue index 2817ac0..49e7234 100644 --- a/web/src/components/aside-box.vue +++ b/web/src/components/aside-box.vue @@ -39,7 +39,7 @@ import { useRoute } from 'vue-router' const route = useRoute() -const { proxy: { $router, $route, $store, $message } } = getCurrentInstance() +const { proxy: { $router, $store } } = getCurrentInstance() let menuList = reactive([ { @@ -52,11 +52,11 @@ let menuList = reactive([ icon: markRaw(ScaleToOriginal), index: '/terminal' }, - { - name: '凭据管理', - icon: markRaw(Key), - index: '/credentials' - }, + // { + // name: '凭据管理', + // icon: markRaw(Key), + // index: '/credentials' + // }, { name: '分组管理', icon: markRaw(FolderOpened), diff --git a/web/src/store/index.js b/web/src/store/index.js index 7000824..9606194 100644 --- a/web/src/store/index.js +++ b/web/src/store/index.js @@ -7,6 +7,7 @@ const useStore = defineStore({ state: () => ({ hostList: [], groupList: [], + sshList: [], user: localStorage.getItem('user') || null, token: sessionStorage.getItem('token') || localStorage.getItem('token') || null, title: '' @@ -32,10 +33,11 @@ const useStore = defineStore({ async getMainData() { const { data: groupList } = await $api.getGroupList() const { data: hostList } = await $api.getHostList() - // const { data: sshList } = await $api.getSshList() + const { data: sshList } = await $api.getSSHList() // console.log('hostList:', hostList) // console.log('groupList:', groupList) - this.$patch({ hostList, groupList }) + // console.log('sshList:', sshList) + this.$patch({ groupList, hostList, sshList }) }, async getHostList() { const { data: hostList } = await $api.getHostList() diff --git a/web/src/views/group/index.vue b/web/src/views/group/index.vue index cb93a86..6c809b8 100644 --- a/web/src/views/group/index.vue +++ b/web/src/views/group/index.vue @@ -37,21 +37,21 @@
- + - - - - - - diff --git a/web/src/views/list/components/host-form.vue b/web/src/views/list/components/host-form.vue deleted file mode 100644 index f079771..0000000 --- a/web/src/views/list/components/host-form.vue +++ /dev/null @@ -1,208 +0,0 @@ - - - - - diff --git a/web/src/views/list/components/setting-tab/email-list.vue b/web/src/views/list/components/setting-tab/email-list.vue deleted file mode 100644 index 94dadf6..0000000 --- a/web/src/views/list/components/setting-tab/email-list.vue +++ /dev/null @@ -1,185 +0,0 @@ - - - - - diff --git a/web/src/views/list/components/setting-tab/group.vue b/web/src/views/list/components/setting-tab/group.vue deleted file mode 100644 index 1b2a2e6..0000000 --- a/web/src/views/list/components/setting-tab/group.vue +++ /dev/null @@ -1,239 +0,0 @@ - - - - - diff --git a/web/src/views/list/components/setting-tab/notify-list.vue b/web/src/views/list/components/setting-tab/notify-list.vue deleted file mode 100644 index fb9efb5..0000000 --- a/web/src/views/list/components/setting-tab/notify-list.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - - - diff --git a/web/src/views/list/components/setting-tab/password.vue b/web/src/views/list/components/setting-tab/password.vue deleted file mode 100644 index ffe1b3e..0000000 --- a/web/src/views/list/components/setting-tab/password.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/views/list/components/setting-tab/record.vue b/web/src/views/list/components/setting-tab/record.vue deleted file mode 100644 index 30aeec8..0000000 --- a/web/src/views/list/components/setting-tab/record.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/web/src/views/list/components/setting-tab/sort.vue b/web/src/views/list/components/setting-tab/sort.vue deleted file mode 100644 index 35cfa78..0000000 --- a/web/src/views/list/components/setting-tab/sort.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - - - diff --git a/web/src/views/list/components/setting.vue b/web/src/views/list/components/setting.vue deleted file mode 100644 index 9c3865b..0000000 --- a/web/src/views/list/components/setting.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - - - diff --git a/web/src/views/list/components/ssh-form.vue b/web/src/views/list/components/ssh-form.vue deleted file mode 100644 index 6aed4f1..0000000 --- a/web/src/views/list/components/ssh-form.vue +++ /dev/null @@ -1,205 +0,0 @@ - - - - - diff --git a/web/src/views/list/index.vue b/web/src/views/list/index.vue deleted file mode 100644 index 7a4375d..0000000 --- a/web/src/views/list/index.vue +++ /dev/null @@ -1,185 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/views/server/components/host-card.vue b/web/src/views/server/components/host-card.vue index 285b85c..7d5dbd8 100644 --- a/web/src/views/server/components/host-card.vue +++ b/web/src/views/server/components/host-card.vue @@ -160,7 +160,6 @@ /> - @@ -185,11 +184,8 @@ const props = defineProps({ const emit = defineEmits(['update-list', 'update-host',]) -const sshFormVisible = ref(false) -const tempHost = ref('') - const hostIp = computed(() => { - let ip = props.hostInfo?.ipInfo?.query || props.hostInfo?.host || '--' + let ip = hostInfo.value?.ipInfo?.query || hostInfo.value?.host || '--' try { let formatIp = ip.replace(/\d/g, '*').split('.').map((item) => item.padStart(3, '*')).join('.') return props.hiddenIp ? formatIp : ip @@ -198,22 +194,23 @@ const hostIp = computed(() => { } }) -const host = computed(() => props.hostInfo?.host) -const name = computed(() => props.hostInfo?.name) -const ping = computed(() => props.hostInfo?.ping || '') -const expiredTime = computed(() => $tools.formatTimestamp(props.hostInfo?.expired, 'date')) -const consoleUrl = computed(() => props.hostInfo?.consoleUrl) -const ipInfo = computed(() => props.hostInfo?.ipInfo || {}) -const isError = computed(() => !Boolean(props.hostInfo?.osInfo)) -const cpuInfo = computed(() => props.hostInfo?.cpuInfo || {}) -const memInfo = computed(() => props.hostInfo?.memInfo || {}) -const osInfo = computed(() => props.hostInfo?.osInfo || {}) -const driveInfo = computed(() => props.hostInfo?.driveInfo || {}) +const hostInfo = computed(() => props.hostInfo || {}) +const host = computed(() => hostInfo.value?.host) +const name = computed(() => hostInfo.value?.name) +const ping = computed(() => hostInfo.value?.ping || '') +const expiredTime = computed(() => $tools.formatTimestamp(hostInfo.value?.expired, 'date')) +const consoleUrl = computed(() => hostInfo.value?.consoleUrl) +const ipInfo = computed(() => hostInfo.value?.ipInfo || {}) +const isError = computed(() => !Boolean(hostInfo.value?.osInfo)) +const cpuInfo = computed(() => hostInfo.value?.cpuInfo || {}) +const memInfo = computed(() => hostInfo.value?.memInfo || {}) +const osInfo = computed(() => hostInfo.value?.osInfo || {}) +const driveInfo = computed(() => hostInfo.value?.driveInfo || {}) const netstatInfo = computed(() => { - let { total: netTotal, ...netCards } = props.hostInfo?.netstatInfo || {} + let { total: netTotal, ...netCards } = hostInfo.value?.netstatInfo || {} return { netTotal, netCards: netCards || {} } }) -const openedCount = computed(() => props.hostInfo?.openedCount || 0) +const openedCount = computed(() => hostInfo.value?.openedCount || 0) const setColor = (num) => { num = Number(num) @@ -221,8 +218,7 @@ const setColor = (num) => { } const handleUpdate = () => { - let { expired, expiredNotify, group, consoleUrl, remark, index } = props.hostInfo - emit('update-host', { name: name.value, host: host.value, index, expired, expiredNotify, group, consoleUrl, remark }) + emit('update-host', hostInfo.value) } const handleToConsole = () => { @@ -230,17 +226,7 @@ const handleToConsole = () => { } const handleSSH = async () => { - let { data } = await $api.existSSH(host.value) - if (data) return window.open(`/terminal?host=${ host.value }&name=${ name.value }`) - if (!host.value) { - return ElMessage({ - message: '请等待获取服务器ip或刷新页面重试', - type: 'warning', - center: true - }) - } - tempHost.value = host.value - sshFormVisible.value = true + let { data } = host.value } const handleRemoveSSH = async () => { @@ -259,7 +245,7 @@ const handleRemoveSSH = async () => { } const handleRemoveHost = async () => { - ElMessageBox.confirm('确认删除主机', 'Warning', { + ElMessageBox.confirm('确认删除实例', 'Warning', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' diff --git a/web/src/views/server/components/host-form.vue b/web/src/views/server/components/host-form.vue index 1cbed5e..ca67e14 100644 --- a/web/src/views/server/components/host-form.vue +++ b/web/src/views/server/components/host-form.vue @@ -1,7 +1,7 @@