diff --git a/server/app/controller/group.js b/server/app/controller/group.js index 7ec32ab..d3b4fba 100644 --- a/server/app/controller/group.js +++ b/server/app/controller/group.js @@ -23,7 +23,7 @@ const updateGroupList = async ({ res, request }) => { let groupList = await readGroupList() let idx = groupList.findIndex(item => item.id === id) let group = { id, name, index: Number(index) || 0 } - if (idx === -1) return res.fail({ data: false, msg: `分组ID${id}不存在` }) + if (idx === -1) return res.fail({ data: false, msg: `分组ID${ id }不存在` }) groupList.splice(idx, 1, group) await writeGroupList(groupList) res.success({ data: '修改成功' }) diff --git a/server/app/controller/host.js b/server/app/controller/host.js index 32a2736..f5283bf 100644 --- a/server/app/controller/host.js +++ b/server/app/controller/host.js @@ -11,7 +11,7 @@ async function saveHost({ res, 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 (hostList?.some(({ host }) => host === newHost)) return res.fail({ msg: `主机${ newHost }已存在` }) if (!Array.isArray(hostList)) hostList = [] hostList.push({ host: newHost, name, expired, expiredNotify, group, consoleUrl, remark }) await writeHostList(hostList) @@ -22,7 +22,7 @@ async function updateHost({ res, request }) { let { body: { host: newHost, name: newName, oldHost, expired, expiredNotify, group, consoleUrl, remark } } = 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: `主机${ newHost }不存在` }) let targetIdx = hostList.findIndex(({ host }) => host === oldHost) hostList.splice(targetIdx, 1, { name: newName, host: newHost, expired, expiredNotify, group, consoleUrl, remark }) writeHostList(hostList) @@ -33,7 +33,7 @@ async function removeHost({ res, request }) { let { body: { host } } = request let hostList = await readHostList() let hostIdx = hostList.findIndex(item => item.host === host) - if (hostIdx === -1) return res.fail({ msg: `${host}不存在` }) + if (hostIdx === -1) return res.fail({ msg: `${ host }不存在` }) hostList.splice(hostIdx, 1) writeHostList(hostList) // 查询是否存在ssh记录 @@ -43,7 +43,7 @@ async function removeHost({ res, request }) { if (flag) sshRecord.splice(sshIdx, 1) writeSSHRecord(sshRecord) - res.success({ data: `${host}已移除, ${flag ? '并移除ssh记录' : ''}` }) + res.success({ data: `${ host }已移除, ${ flag ? '并移除ssh记录' : '' }` }) } async function updateHostSort({ res, request }) { @@ -55,7 +55,7 @@ async function updateHostSort({ res, request }) { for (let i = 0; i < list.length; i++) { const curHost = list[i] let temp = hostList.find(({ host }) => curHost.host === host) - if (!temp) return res.fail({ msg: `查找失败: ${curHost.name}` }) + if (!temp) return res.fail({ msg: `查找失败: ${ curHost.name }` }) sortResult.push(temp) } writeHostList(sortResult) diff --git a/server/app/db.js b/server/app/db.js index ba74ae6..5d4034c 100644 --- a/server/app/db.js +++ b/server/app/db.js @@ -1,5 +1,3 @@ -const Datastore = require('@seald-io/nedb') -const { resolvePath } = require('./utils/tools') const { writeKey, writeNotifyList, writeGroupList } = require('./utils/storage') const { KeyDB, NotifyDB, GroupDB, EmailNotifyDB } = require('./utils/db-class') @@ -14,10 +12,10 @@ function initKeyDB() { if (count === 0) { consola.log('初始化keyDB✔') const defaultData = { - pwd: "admin", - commonKey: "", - publicKey: "", - privateKey: "" + pwd: 'admin', + commonKey: '', + publicKey: '', + privateKey: '' } await writeKey(defaultData) } @@ -38,24 +36,24 @@ function initNotifyDB() { if (count === 0) { consola.log('初始化notifyDB✔') const defaultData = [{ - "type": "login", - "desc": "登录面板提醒", - "sw": true + 'type': 'login', + 'desc': '登录面板提醒', + 'sw': true }, { - "type": "err_login", - "desc": "登录错误提醒(连续5次)", - "sw": true + 'type': 'err_login', + 'desc': '登录错误提醒(连续5次)', + 'sw': true }, { - "type": "updatePwd", - "desc": "修改密码提醒", - "sw": true + 'type': 'updatePwd', + 'desc': '修改密码提醒', + 'sw': true }, { - "type": "host_offline", - "desc": "客户端离线提醒(每小时最多发送一次提醒)", - "sw": true + 'type': 'host_offline', + 'desc': '客户端离线提醒(每小时最多发送一次提醒)', + 'sw': true }] await writeNotifyList(defaultData) } @@ -76,7 +74,7 @@ function initGroupDB() { } else { if (count === 0) { consola.log('初始化groupDB✔') - const defaultData = [{ "id": "default", "name": "默认分组", "index": 0 }] + const defaultData = [{ 'id': 'default', 'name': '默认分组', 'index': 0 }] await writeGroupList(defaultData) } } @@ -96,39 +94,39 @@ function initEmailNotifyDB() { if (count === 0) { consola.log('初始化emailNotifyDB✔') const defaultData = { - "support": [ + 'support': [ { - "name": "QQ邮箱", - "target": "qq", - "host": "smtp.qq.com", - "port": 465, - "secure": true, - "tls": { - "rejectUnauthorized": false + 'name': 'QQ邮箱', + 'target': 'qq', + 'host': 'smtp.qq.com', + 'port': 465, + 'secure': true, + 'tls': { + 'rejectUnauthorized': false } }, { - "name": "网易126", - "target": "wangyi126", - "host": "smtp.126.com", - "port": 465, - "secure": true, - "tls": { - "rejectUnauthorized": false + 'name': '网易126', + 'target': 'wangyi126', + 'host': 'smtp.126.com', + 'port': 465, + 'secure': true, + 'tls': { + 'rejectUnauthorized': false } }, { - "name": "网易163", - "target": "wangyi163", - "host": "smtp.163.com", - "port": 465, - "secure": true, - "tls": { - "rejectUnauthorized": false + 'name': '网易163', + 'target': 'wangyi163', + 'host': 'smtp.163.com', + 'port': 465, + 'secure': true, + 'tls': { + 'rejectUnauthorized': false } } ], - "user": [ + 'user': [ ] } emailNotifyDB.update({}, { $set: defaultData }, { upsert: true }, (err, numReplaced) => { diff --git a/server/app/init.js b/server/app/init.js index b598f5b..7c33bda 100644 --- a/server/app/init.js +++ b/server/app/init.js @@ -4,6 +4,7 @@ const { getNetIPInfo, readHostList, writeHostList, readKey, writeKey, randomStr, const isDev = !isProd() // 存储本机IP, 供host列表接口调用 +// eslint-disable-next-line no-unused-vars async function initLocalIp() { if(isDev) return consola.info('非生产环境不初始化保存本地IP') const localNetIPInfo = await getNetIPInfo() @@ -20,7 +21,7 @@ async function initRsa() { let keyObj = await readKey() if(keyObj.privateKey && keyObj.publicKey) return consola.info('公私钥已存在[重新生成会导致已保存的ssh密钥信息失效]') let key = new NodeRSA({ b: 1024 }) - key.setOptions({ encryptionScheme: 'pkcs1', environment: "browser" }) + key.setOptions({ encryptionScheme: 'pkcs1', environment: 'browser' }) let privateKey = key.exportKey('pkcs1-private-pem') let publicKey = key.exportKey('pkcs8-public-pem') keyObj.privateKey = await AESEncryptSync(privateKey) // 加密私钥 diff --git a/server/app/schedule/expired-notify.js b/server/app/schedule/expired-notify.js index c33cedf..ae77143 100644 --- a/server/app/schedule/expired-notify.js +++ b/server/app/schedule/expired-notify.js @@ -1,7 +1,7 @@ const schedule = require('node-schedule') const { readHostList, sendEmailToConfList, formatTimestamp } = require('../utils') -const expiredNotifyJob = () => { +const expiredNotifyJob = async () => { consola.info('=====开始检测服务器到期时间=====', new Date()) const hostList = await readHostList() for (const item of hostList) { diff --git a/server/app/socket/terminal.js b/server/app/socket/terminal.js index 41b9750..b92e2dc 100644 --- a/server/app/socket/terminal.js +++ b/server/app/socket/terminal.js @@ -51,7 +51,7 @@ module.exports = (httpServer) => { } const sshRecord = await readSSHRecord() let loginInfo = sshRecord.find(item => item.host === ip) - if (!sshRecord.some(item => item.host === ip)) return socket.emit('create_fail', `未找到【${ip}】凭证`) + if (!sshRecord.some(item => item.host === ip)) return socket.emit('create_fail', `未找到【${ ip }】凭证`) let { type, host, port, username, randomKey } = loginInfo try { // 解密放到try里面,防止报错【公私钥必须配对, 否则需要重新添加服务器密钥】 @@ -64,7 +64,7 @@ module.exports = (httpServer) => { sshClient .on('ready', () => { consola.success('已连接到终端:', host) - socket.emit('connect_success', `已连接到终端:${host}`) + socket.emit('connect_success', `已连接到终端:${ host }`) createTerminal(socket, sshClient) }) .on('error', (err) => { @@ -73,7 +73,7 @@ module.exports = (httpServer) => { socket.emit('connect_fail', err.message) }) .connect({ - ...authInfo, + ...authInfo // debug: (info) => console.log(info) }) } catch (err) { diff --git a/server/app/utils/encrypt.js b/server/app/utils/encrypt.js index f2501e7..76fce17 100644 --- a/server/app/utils/encrypt.js +++ b/server/app/utils/encrypt.js @@ -9,7 +9,7 @@ const RSADecryptSync = async (ciphertext) => { let { privateKey } = await readKey() privateKey = await AESDecryptSync(privateKey) // 先解密私钥 const rsakey = new NodeRSA(privateKey) - rsakey.setOptions({ encryptionScheme: 'pkcs1', environment: "browser" }) // Must Set It When Frontend Use jsencrypt + rsakey.setOptions({ encryptionScheme: 'pkcs1', environment: 'browser' }) // Must Set It When Frontend Use jsencrypt const plaintext = rsakey.decrypt(ciphertext, 'utf8') return plaintext } diff --git a/server/app/utils/storage.js b/server/app/utils/storage.js index 58218d2..0088397 100644 --- a/server/app/utils/storage.js +++ b/server/app/utils/storage.js @@ -1,5 +1,3 @@ -const fs = require('fs') -const { sshRecordDBPath, hostListDBPath, keyDBPath, emailNotifyDBPath, notifyConfDBPath, groupConfDBPath } = require('../config') const { KeyDB, HostListDB, SshRecordDB, NotifyDB, GroupDB, EmailNotifyDB } = require('./db-class') const readKey = async () => { @@ -46,7 +44,7 @@ const readSSHRecord = async () => { const writeSSHRecord = async (record = []) => { return new Promise((resolve, reject) => { const sshRecordDB = new SshRecordDB().getInstance() - sshRecordDB.remove({}, { multi: true }, (err, numRemoved) => { + sshRecordDB.remove({}, { multi: true }, (err) => { if (err) { consola.error('清空SSHRecord出错:', err) reject(err) @@ -82,7 +80,7 @@ const readHostList = async () => { const writeHostList = async (record = []) => { return new Promise((resolve, reject) => { const hostListDB = new HostListDB().getInstance() - hostListDB.remove({}, { multi: true }, (err, numRemoved) => { + hostListDB.remove({}, { multi: true }, (err) => { if (err) { consola.error('清空HostList出错:', err) reject(err) @@ -91,7 +89,7 @@ const writeHostList = async (record = []) => { hostListDB.insert(record, (err, newDocs) => { if (err) { consola.error('写入新的HostList出错:', err) - reject(err); + reject(err) } else { hostListDB.compactDatafile() resolve(newDocs) @@ -117,10 +115,11 @@ const readEmailNotifyConf = () => { } const writeUserEmailList = (user) => { const emailNotifyDB = new EmailNotifyDB().getInstance() + // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { let support = await readSupportEmailList() const emailConf = { support, user } - emailNotifyDB.update({}, { $set: emailConf }, { upsert: true }, (err, numReplaced) => { + emailNotifyDB.update({}, { $set: emailConf }, { upsert: true }, (err) => { if (err) { reject({ code: -1, msg: err.message || err }) } else { @@ -151,7 +150,6 @@ const readUserEmailList = async () => { return user } - const getNotifySwByType = async (type) => { if (!type) throw Error('missing params: type') try { @@ -159,7 +157,7 @@ const getNotifySwByType = async (type) => { let { sw } = notifyList.find((item) => item.type === type) return sw } catch (error) { - consola.error(`通知类型[${type}]不存在`) + consola.error(`通知类型[${ type }]不存在`) return false } } @@ -181,18 +179,18 @@ const readNotifyList = async () => { const writeNotifyList = async (notifyList) => { return new Promise((resolve, reject) => { const notifyDB = new NotifyDB().getInstance() - notifyDB.remove({}, { multi: true }, (err, numRemoved) => { + notifyDB.remove({}, { multi: true }, (err) => { if (err) { - consola.error('清空notify list出错:', err); - reject(err); + consola.error('清空notify list出错:', err) + reject(err) } else { notifyDB.insert(notifyList, (err, newDocs) => { if (err) { - consola.error('写入新的notify list出错:', err); + consola.error('写入新的notify list出错:', err) reject(err) } else { notifyDB.compactDatafile() - resolve(newDocs); + resolve(newDocs) } }) } @@ -217,7 +215,7 @@ const readGroupList = async () => { const writeGroupList = async (list = []) => { return new Promise((resolve, reject) => { const groupDB = new GroupDB().getInstance() - groupDB.remove({}, { multi: true }, (err, numRemoved) => { + groupDB.remove({}, { multi: true }, (err) => { if (err) { consola.error('清空group list出错:', err) reject(err) diff --git a/server/app/utils/tools.js b/server/app/utils/tools.js index cc4f713..d67c2bc 100644 --- a/server/app/utils/tools.js +++ b/server/app/utils/tools.js @@ -1,4 +1,3 @@ -const fs = require('fs') const net = require('net') const axios = require('axios') const request = axios.create({ timeout: 3000 }) @@ -104,8 +103,8 @@ function isLocalIP(ip) { const localIPv6Ranges = [ '::1', // Loopback 'fc00::', // Unique local address - 'fd00::' // Unique local address - ]; + 'fd00::' // Unique local address + ] function isInRange(ip, start, end) { const ipNum = ipToNumber(ip) diff --git a/server/package.json b/server/package.json index abd2287..20200ae 100644 --- a/server/package.json +++ b/server/package.json @@ -14,7 +14,9 @@ "start": "node ./app/index.js", "pkgwin": "pkg . -t node20-win-x64", "pkglinux:x86": "pkg . -t node20-linux-x64", - "pkglinux:arm": "pkg . -t node20-linux-arm64" + "pkglinux:arm": "pkg . -t node20-linux-arm64", + "lint": "eslint . --ext .js,.vue", + "lint:fix": "eslint . --ext .js,.jsx,.cjs,.mjs --fix" }, "keywords": [], "author": "", @@ -54,7 +56,7 @@ "ssh2-sftp-client": "^10.0.3" }, "devDependencies": { - "eslint": "^9.6.0", + "eslint": "^8.56.0", "nodemon": "^3.1.4", "pkg": "5.8" } diff --git a/web/package.json b/web/package.json index 459c066..bc9e4bd 100644 --- a/web/package.json +++ b/web/package.json @@ -7,7 +7,8 @@ "dev": "vite", "build": "vite build", "preview": "vite preview --port 5050", - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore" + "lint": "eslint . --ext .js,.vue", + "lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore" }, "dependencies": { "@codemirror/lang-cpp": "^6.0.2", @@ -43,7 +44,7 @@ "devDependencies": { "@vitejs/plugin-vue": "^5.0.5", "@vitejs/plugin-vue-jsx": "^4.0.0", - "eslint": "^9.6.0", + "eslint": "^8.56.0", "eslint-plugin-vue": "^9.27.0", "sass": "^1.77.7", "unplugin-auto-import": "^0.17.6", diff --git a/web/src/components/input-command/index.vue b/web/src/components/input-command/index.vue index 92aadb9..3087b11 100644 --- a/web/src/components/input-command/index.vue +++ b/web/src/components/input-command/index.vue @@ -1,13 +1,25 @@