就如前文已经把chrome插件与electron关联上,现在缺一个运行的核心。
之前根据配置化自动化程序以及搭建好,只不过当时写死了一个流程图数据数组。现在需要就是通过参数的形式传入即可。这里考虑的传入配置数据的文件,毕竟数据量会很大。所以实现步骤可以分为以下:
步骤1: 读取传入参数:filePath
步骤2: 利用fs读取filePath文件的数据
步骤3: 拿到数据执行
基本代码如下:
// 设置 filepath参数
const argv = require('minimist')(process.argv.slice(2), {
string: ['filepath'],
});
// 利用fs读取filePath文件的数据
// const mode = argv.mode || 'dev'
try {
const data = fs.readFileSync(argv.filepath, 'utf-8');
const dataconfig = JSON.parse(data);
taskData = JSON.parse(dataconfig.task)
if (Array.isArray(taskData)) {
// console.log('taskData---', taskData)
// 步骤3: 执行
await runTask({ browser, taskData, env })
logger.info('任务结束',)
} else {
// console.error('读取或解析任务数据时发生错误: 数据类型错误',);
logger.error('读取或解析任务数据时发生错误: 数据类型错误',)
}
} catch (err) {
// console.error('读取或解析任务数据时发生错误 err:', err);
logger.error('程序执行异常:', err)
}
未到预期
通过 child_process 去执行这个脚本,发现并没有弹cmd命令行窗,这不符合预期想要的结果。
经查询可通过打包exe格式可以解决
// electron中执行
const terminal = process.platform === 'win32' ? 'cmd.exe' : 'x-terminal-emulator';
const command = process.platform === 'win32' ? `/c start ${path.join(__dirname, `${process.env.CHROME_DIST}task.run-win.exe `)} --filepath ${filepath}` : '-e notepad.exe';
spawn(terminal, [command])
pkg 打包
npm install -g pkg
pkg ./index.js --public
配置数据持久化
我们希望配置自动化的数据可以长期使用,这样下次进来就不用重新设计。这个时候就可以用到 sqlite3。
先定义数据库字段,
1、id 唯一标识,
2、filepath 文件路径
3、 taskdesc 任务描述
4、taskurl 当前任务操作的网页url
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const { app } = require('electron');
class Sqlite {
db: any
constructor() {
// 创建一个 SQLite 数据库文件
const dbPath = path.join(app.getPath('userData'), 'jest.pro.db');
this.db = new sqlite3.Database(dbPath);
this.db.serialize(() => {
this.db.run('CREATE TABLE IF NOT EXISTS jest_task (id TEXT, filepath TEXT, taskdesc TEXT, taskurl TEXT )');
});
}
// 运行sql
run(sql, params) {
return new Promise((resolve, reject) => {
this.db.run(sql, (err) => {
console.log('run--', err)
if (err === null) {
resolve(err);
} else {
reject(err);
}
});
});
}
all(sql, params = '') {
return new Promise((resolve, reject) => {
this.db.all(sql, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
// 关闭数据库
close() {
this.db.close();
}
static getInstance() {
if (!Sqlite.instance) {
Sqlite.instance = new Sqlite()
}
return Sqlite.instance
}
}
export default Sqlite
CRUD
当我们在electron 对流程图进行删除、添加、修改操作时,使用ipc通信,同时对数据库进行操作。
import Sqlite from "./data.sqlite";
export const saveTask = (id, filepath, taskdesc, taskurl) => {
Sqlite.getInstance().run(`INSERT INTO jest_task VALUES ('${id}', '${filepath}', '${taskdesc}', '${taskurl}');`)
}
export const getAllTask = async () => {
try {
return await Sqlite.getInstance().all(`SELECT * FROM jest_task;`)
} catch (error) {
return []
}
}
export const deleteTask = (id) => {
Sqlite.getInstance().run(`DELETE FROM jest_task WHERE id = '${id}';`)
}
最后
一波操作下来,整个配置流程图自动化的桌面应用就完成。嘿嘿。
整个项目源码