From 5a287a627a009f24b7765738c7cf68fe6e81b0ca Mon Sep 17 00:00:00 2001 From: aixianling Date: Fri, 2 Sep 2022 15:25:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=8B=E5=8A=A8=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=BA=93=E4=BF=A1=E6=81=AF=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/appsSync.js | 38 +++++++++++++++++++++++++++ bin/tools.js | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 bin/appsSync.js create mode 100644 bin/tools.js diff --git a/bin/appsSync.js b/bin/appsSync.js new file mode 100644 index 00000000..9e7dd196 --- /dev/null +++ b/bin/appsSync.js @@ -0,0 +1,38 @@ +const axios = require("axios"); +const {chalkTag, findApp, fs} = require("./tools"); +const compiler = require('vue-template-compiler') +const saveApps = app => { + if (app.list.length > 0) { + return axios.post("http://192.168.1.87:12525/node/wechatapps/addOrUpdate", app, {timeout: 1000}).then(res => { + if (res.data.code == 0) chalkTag.done("产品库目录已同步至后台数据库...") + }).catch(() => 0) + } else return Promise.reject("没有应用") +} +const getAppInfo = (file, apps) => { + if (/[\\\/](App[^\\\/]+)\.vue$/g.test(file)) { + const name = file.replace(/.+[\\\/](App[^\\\/]+)\.vue$/, '$1'), + source = fs.readFileSync(file).toString(), + parsed = compiler.parseComponent(source), + script = parsed.script?.content || "", + label = script.match(/label:[^,]+/)?.[0]?.replace(/.+["']([^"']+).+/, '$1') + apps.push({ + id: file.replace(/\.vue$/, '').replace(/[\\\/]/g, '_'), + label: label || name, + libPath: file.replace(/\.vue$/, ''), + name, + type: 'web' + }) + } +} +const sync = () => { + chalkTag.info("开始扫描库工程...") + const list = [] + Promise.all([ + findApp('packages', app => getAppInfo(app, list)), + findApp('project', app => getAppInfo(app, list)), + ]).then(() => { + chalkTag.info("正在同步...") + saveApps({type: "web", list}).catch(() => 0).finally(() => chalkTag.done("同步成功!")) + }) +} +sync() diff --git a/bin/tools.js b/bin/tools.js new file mode 100644 index 00000000..63150450 --- /dev/null +++ b/bin/tools.js @@ -0,0 +1,70 @@ +const fsExtra = require('fs-extra') +const path = require('path') +const chalk = require('chalk') +const fs = require('fs') +/** + * 将函数封装成promise + */ +const promisify = fn => { + return function () { + let args = arguments; + return new Promise(function (resolve, reject) { + [].push.call(args, function (err, result) { + if (err) { + console.log(err) + reject(err); + } else { + resolve(result); + } + }); + fn.apply(null, args); + }); + } +} + +const readdir = promisify(fs.readdir) +const stat = promisify(fs.stat) + +/** + * 封装打印工具 + */ +const {log} = console +const chalkTag = { + info: msg => log([chalk.bgBlue.black(' INFO '), msg].join(' ')), + done: msg => log([chalk.bgGreen.black(' DONE '), msg].join(' ')), + warn: msg => log([chalk.bgYellow.black(' WARN '), msg].join(' ')), + error: msg => log([chalk.bgRed.black(' ERROR '), msg].join(' ')), +} + +/** + * 遍历应用的方法 + */ +const findApp = (dir, cb) => { + fsExtra.ensureDirSync(dir) + return readdir(dir).then(apps => { + return Promise.all(apps.map(e => { + let cPath = path.join(dir, e) + return stat(cPath).then(state => { + if (state.isDirectory()) { + return findApp(cPath, cb) + } else if (state.isFile()) { + cb && cb(cPath) + } + }) + }) || []) + }) +} +const copyFiles = (dir, source = 'src/mods') => { + chalkTag.info(`开始扫描${source}...`) + return new Promise(resolve => { + fsExtra.emptyDir(dir, err => { + if (!err) { + fsExtra.copy(source, dir).then(() => { + chalkTag.done(source + ' 扫描完毕') + resolve() + }) + } + }) + }) +} +module.exports = {findApp, chalkTag, fsExtra, copyFiles, fs, path} diff --git a/package.json b/package.json index cfa7aeed..d7567a4e 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "dev": "vue-cli-service serve", "lib": "npm unpublish --force&&npm publish", - "ui": "npm i dvcp-ui@latest" + "ui": "npm i dvcp-ui@latest", + "sync": "node bin/appsSync.js" }, "files": [ "packages",