From 766faee96e1cd1d3578b8895721d9fbec8874d7d Mon Sep 17 00:00:00 2001 From: aixianling Date: Wed, 18 Jan 2023 12:08:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=89=93=E5=8C=85=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 18 +++++----- package.json | 7 +++- src/rest/index.js | 6 ++-- src/tools/childProcess.js | 28 ++++++++++++++++ src/utils/dbUitls.js | 5 +-- src/websocket/custom/getZip.js | 60 ++++++++++++++++++++++++++++++++++ src/websocket/index.js | 14 ++++++++ 7 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 src/tools/childProcess.js create mode 100644 src/websocket/custom/getZip.js create mode 100644 src/websocket/index.js diff --git a/index.js b/index.js index 711f06a..b8f1c2f 100644 --- a/index.js +++ b/index.js @@ -1,17 +1,19 @@ const express = require('express') const db = require('./src/utils/dbUitls') const rest = require('./src/rest') -const app = express() +const ws = require('./src/websocket') +const ews = require('express-ws') +const chalk = require("chalk"); +const log = console.log +const app = express(); +ews(app) const port = 12525 - +chalk.level = 1 app.listen(port, () => { - console.log('启动数据库连接池...') db.init() - console.log('启动接口...') app.use(express.json()) // for parsing application/json - app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded - rest.init(app).then(()=>{ - console.log(`serve is listening on ${port}`) + app.use(express.urlencoded({extended: true})) // for parsing application/x-www-form-urlencoded + Promise.all([rest.init(app), ws.init(app)]).then(() => { + log(`${chalk.bgGreen.black(" DONE ")} serve is listening on ${port}`) }) - }) diff --git a/package.json b/package.json index bc44050..974975a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "dev": "forever -w --watchDirectory src index.js ", - "pro": "forever start index.js" + "pro": "forever start index.js", + "stop": "forever stopall" }, "repository": { "type": "git", @@ -23,10 +24,14 @@ "axios": "^1.2.1", "dayjs": "^1.11.0", "express": "^4.17.3", + "express-ws": "^5.0.2", "fs-extra": "^10.0.1", "helmet": "^5.0.2", "mysql": "^2.18.1", "sql": "^0.78.0", "uuid": "^8.3.2" + }, + "devDependencies": { + "chalk": "^4.1.2" } } diff --git a/src/rest/index.js b/src/rest/index.js index b6079c8..f68fee0 100644 --- a/src/rest/index.js +++ b/src/rest/index.js @@ -1,16 +1,16 @@ const {findFile} = require("../utils/fsUtils"); +const chalk = require("chalk"); +const log = console.log module.exports = { init: ins => { return findFile('./src/rest', file => { if (!/index\.js/.test(file)) { let rest = require(file.replace(/src[\\\/]rest/, '.')) - console.log(`初始化接口:${rest.action}`) + log(`${chalk.bgBlue.black(" REST ")} ${rest.action}`) if (rest.method == "post") { ins.post(rest.action, (req, res) => rest.execute(req, res)) } } - }).then(() => { - console.log("接口初始化完毕") }) } } diff --git a/src/tools/childProcess.js b/src/tools/childProcess.js new file mode 100644 index 0000000..a481f4c --- /dev/null +++ b/src/tools/childProcess.js @@ -0,0 +1,28 @@ +const {exec} = require("child_process"); + +class Process { + constructor(cmd) { + this.cmd = cmd + this.pid = exec(cmd, {windowsHide: true, encoding: "utf8"}); + } + + static new(cmd) { + return new Promise((resolve, reject) => exec(cmd, {windowsHide: true}, (err) => { + if (!err) { + resolve() + } else reject(err) + })) + } + + ins() { + return new Promise((resolve, reject) => { + this.pid.on('close', (code, err) => { + if (code == 0 && !err) { + resolve() + } else reject(err) + }) + }) + } +} + +module.exports = Process diff --git a/src/utils/dbUitls.js b/src/utils/dbUitls.js index 376c8ad..e6fafaa 100644 --- a/src/utils/dbUitls.js +++ b/src/utils/dbUitls.js @@ -2,14 +2,14 @@ const mysql = require("mysql"); const dbConfig = require("../config/db"); const {v4: uuid} = require("uuid"); const dayjs = require("dayjs"); +const chalk = require("chalk"); const query = sql => new Promise((resolve, reject) => { this.pool?.getConnection((err, conn) => { if (err) { - console.log(err) + reject(err) } else { conn.query(sql, (err, result) => { if (err) { - console.log(err) reject(err) } else { conn.release() @@ -23,6 +23,7 @@ module.exports = { pool: null, init: () => { this.pool = mysql.createPool(dbConfig) + console.log(`${chalk.bgBlue.black(" DATABASE ")} 数据库已连接`) }, query, list: ({table, search, con = ''}) => { diff --git a/src/websocket/custom/getZip.js b/src/websocket/custom/getZip.js new file mode 100644 index 0000000..a0e4633 --- /dev/null +++ b/src/websocket/custom/getZip.js @@ -0,0 +1,60 @@ +const db = require("../../utils/dbUitls"); +const execute = require("../../tools/exec") +const process = require("../../tools/childProcess") +const dayjs = require("dayjs") +const fse = require("fs-extra"); + +const handleZip = (id, ws) => { + const uniCon = `id='${id}'` + const sendMessage = data => ws.send(JSON.stringify(data)) + db.detail({table: "node_custom_config", id}).then(info => { + if (info?.id) { + sendMessage({code: 0, progress: 1, data: `正在处理 ${info.name} 的打包工作...`}) + const buildPath = { + web: 'base-web', + wxwork: 'base-wxcp', + mp: 'dvcp_v2_wxmp' + }[info.type] || {} + let path = `../${buildPath}`, {dist} = info, pid + dist = dist || `../zips/${info.name}v${info.version || "1.0.0"}` + Promise.all([ + db.query(`update node_custom_config set download=null,error=null,zipTime='${dayjs().format("YYYY-MM-DD HH:mm:ss")}' where ${uniCon}`), + process.new(`./shell/update.sh ${info.name} ${path}`)]) + .then(() => sendMessage({code: 0, progress: 30})) + .then(() => pid = new process(`cd ${path}&&npm run apps&&node bin/pages.js ${id}&&npm run build`)).then(() => pid.ins()) + .then(() => fse.emptyDir(dist)) + .then(() => sendMessage({code: 0, progress: 70})) + .then(() => pid = new process(`./shell/move.sh ${info.type} ${path} ${dist}`)).then(() => pid.ins()) + .then(() => sendMessage({code: 0, progress: 90})) + .then(() => db.query(`update node_custom_config set download='${dayjs().format("YYYY-MM-DD HH:mm:ss")}',error='' where ${uniCon}`)) + .then(() => db.detail({table: "node_custom_config", id})) + .then(row => sendMessage({code: 0, progress: 100, row})) + .catch(err => { + console.log(err) + const msg = `执行失败:${err.cmd}` + return db.query(`update node_custom_config set error='${msg}',zipTime=null where ${uniCon}`) + .then(() => db.detail({table: "node_custom_config", id})) + .then(row => sendMessage({code: 1, row})) + .catch(() => 0) + }) + } + }).catch(err => { + console.log(err) + }) +} + +module.exports = { + action: "/custom/getZip", + execute: (ws, request) => { + const {id} = request.query + handleZip(id, ws) + ws.onmessage = res => { + if (res?.data) { + const data = JSON.parse(res.data) + if (data.cid == id) { + + } else if (id == data.id) handleZip(id, ws) + } + } + } +} diff --git a/src/websocket/index.js b/src/websocket/index.js new file mode 100644 index 0000000..84b698f --- /dev/null +++ b/src/websocket/index.js @@ -0,0 +1,14 @@ +const {findFile} = require("../utils/fsUtils"); +const chalk = require("chalk"); +const {log} = console +module.exports = { + init: ins => { + return findFile('./src/websocket', file => { + if (!/index\.js/.test(file)) { + const ws = require(file.replace(/src[\\\/]websocket/, '.')) + log(`${chalk.bgBlue.black(" WEBSOCKET ")} ${ws.action}`) + ins.ws(ws.action, ws.execute) + } + }) + } +}