framework.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. 'use strict';
  2. const path = require('path');
  3. const fs = require('fs');
  4. const { exec } = require('child_process');
  5. const { Controller } = require('ee-core');
  6. const { app: electronApp, shell } = require('electron');
  7. const dayjs = require('dayjs');
  8. const Ps = require('ee-core/ps');
  9. const Log = require('ee-core/log');
  10. const Utils = require('ee-core/utils');
  11. let myTimer = null;
  12. /**
  13. * electron-egg framework - 功能demo
  14. * @class
  15. */
  16. class FrameworkController extends Controller {
  17. constructor(ctx) {
  18. super(ctx);
  19. }
  20. /**
  21. * 所有方法接收两个参数
  22. * @param args 前端传的参数
  23. * @param event - ipc通信时才有值。详情见:控制器文档
  24. */
  25. /**
  26. * test
  27. */
  28. async test() {
  29. const result = await this.service.example.test('electron');
  30. // let tmpDir = Ps.getLogDir();
  31. // Log.info('tmpDir:', tmpDir);
  32. let mid = await Utils.machineIdSync(true);
  33. Log.info('mid 11111111:', mid);
  34. Utils.machineId().then((id) => {
  35. Log.info('mid 222222222:', id);
  36. });
  37. return result;
  38. }
  39. /**
  40. * json数据库操作
  41. */
  42. async dbOperation(args) {
  43. const { service } = this;
  44. const paramsObj = args;
  45. //Log.info('eeeee paramsObj:', paramsObj);
  46. const data = {
  47. action: paramsObj.action,
  48. result: null,
  49. all_list: []
  50. };
  51. switch (paramsObj.action) {
  52. case 'add' :
  53. data.result = await service.storage.addTestData(paramsObj.info);;
  54. break;
  55. case 'del' :
  56. data.result = await service.storage.delTestData(paramsObj.delete_name);;
  57. break;
  58. case 'update' :
  59. data.result = await service.storage.updateTestData(paramsObj.update_name, paramsObj.update_age);
  60. break;
  61. case 'get' :
  62. data.result = await service.storage.getTestData(paramsObj.search_age);
  63. break;
  64. }
  65. data.all_list = await service.storage.getAllTestData();
  66. return data;
  67. }
  68. /**
  69. * sqlite数据库操作
  70. */
  71. async sqlitedbOperation(args) {
  72. const { service } = this;
  73. const paramsObj = args;
  74. //Log.info('eeeee paramsObj:', paramsObj);
  75. const data = {
  76. action: paramsObj.action,
  77. result: null,
  78. all_list: []
  79. };
  80. switch (paramsObj.action) {
  81. case 'add' :
  82. data.result = await service.storage.addTestDataSqlite(paramsObj.info);;
  83. break;
  84. case 'del' :
  85. data.result = await service.storage.delTestDataSqlite(paramsObj.delete_name);;
  86. break;
  87. case 'update' :
  88. data.result = await service.storage.updateTestDataSqlite(paramsObj.update_name, paramsObj.update_age);
  89. break;
  90. case 'get' :
  91. data.result = await service.storage.getTestDataSqlite(paramsObj.search_age);
  92. break;
  93. case 'getDataDir' :
  94. data.result = await service.storage.getDataDir();
  95. break;
  96. case 'setDataDir' :
  97. data.result = await service.storage.setCustomDataDir(paramsObj.data_dir);
  98. break;
  99. }
  100. data.all_list = await service.storage.getAllTestDataSqlite();
  101. return data;
  102. }
  103. /**
  104. * 调用其它程序(exe、bash等可执行程序)
  105. */
  106. openSoftware(softName) {
  107. if (!softName) {
  108. return false;
  109. }
  110. let softwarePath = path.join(Ps.getExtraResourcesDir(), softName);
  111. Log.info('[openSoftware] softwarePath:', softwarePath);
  112. // 检查程序是否存在
  113. if (!fs.existsSync(softwarePath)) {
  114. return false;
  115. }
  116. // 命令行字符串 并 执行
  117. let cmdStr = 'start ' + softwarePath;
  118. exec(cmdStr);
  119. return true;
  120. }
  121. /**
  122. * 检查是否有新版本
  123. */
  124. checkForUpdater() {
  125. const autoUpdaterAddon = this.app.addon.autoUpdater;
  126. autoUpdaterAddon.checkUpdate();
  127. return;
  128. }
  129. /**
  130. * 下载新版本
  131. */
  132. downloadApp() {
  133. const autoUpdaterAddon = this.app.addon.autoUpdater;
  134. autoUpdaterAddon.download();
  135. return;
  136. }
  137. /**
  138. * 检测http服务是否开启
  139. */
  140. async checkHttpServer() {
  141. const httpServerConfig = this.app.config.httpServer;
  142. const url = httpServerConfig.protocol + httpServerConfig.host + ':' + httpServerConfig.port;
  143. const data = {
  144. enable: httpServerConfig.enable,
  145. server: url
  146. }
  147. return data;
  148. }
  149. /**
  150. * 一个http请求访问此方法
  151. */
  152. async doHttpRequest() {
  153. // http方法
  154. const method = this.app.request.method;
  155. // http get 参数
  156. let params = this.app.request.query;
  157. params = (params instanceof Object) ? params : JSON.parse(JSON.stringify(params));
  158. // http post 参数
  159. const body = this.app.request.body;
  160. const httpInfo = {
  161. method,
  162. params,
  163. body
  164. }
  165. Log.info('httpInfo:', httpInfo);
  166. if (!body.id) {
  167. return false;
  168. }
  169. const dir = electronApp.getPath(body.id);
  170. shell.openPath(dir);
  171. return true;
  172. }
  173. /**
  174. * 一个socket io请求访问此方法
  175. */
  176. async doSocketRequest(args) {
  177. if (!args.id) {
  178. return false;
  179. }
  180. const dir = electronApp.getPath(args.id);
  181. shell.openPath(dir);
  182. return true;
  183. }
  184. /**
  185. * 异步消息类型
  186. * @param args 前端传的参数
  187. * @param event - IpcMainInvokeEvent 文档:https://www.electronjs.org/zh/docs/latest/api/structures/ipc-main-invoke-event
  188. */
  189. async ipcInvokeMsg(args, event) {
  190. let timeNow = dayjs().format('YYYY-MM-DD HH:mm:ss');
  191. const data = args + ' - ' + timeNow;
  192. return data;
  193. }
  194. /**
  195. * 同步消息类型
  196. * @param args 前端传的参数
  197. * @param event - IpcMainEvent 文档:https://www.electronjs.org/docs/latest/api/structures/ipc-main-event
  198. */
  199. async ipcSendSyncMsg(args) {
  200. let timeNow = dayjs().format('YYYY-MM-DD HH:mm:ss');
  201. const data = args + ' - ' + timeNow;
  202. return data;
  203. }
  204. /**
  205. * 双向异步通信
  206. * @param args 前端传的参数
  207. * @param event - IpcMainEvent 文档:https://www.electronjs.org/docs/latest/api/structures/ipc-main-event
  208. */
  209. ipcSendMsg(args, event) {
  210. // 前端ipc频道 channel
  211. const channel = 'controller.example.ipcSendMsg';
  212. if (args.type == 'start') {
  213. // 每隔1秒,向前端页面发送消息
  214. // 用定时器模拟
  215. myTimer = setInterval(function(e, c, msg) {
  216. let timeNow = Date.now();
  217. let data = msg + ':' + timeNow;
  218. e.reply(`${c}`, data)
  219. }, 1000, event, channel, args.content)
  220. return '开始了'
  221. } else if (args.type == 'end') {
  222. clearInterval(myTimer);
  223. return '停止了'
  224. } else {
  225. return 'ohther'
  226. }
  227. }
  228. /**
  229. * 上传文件
  230. */
  231. async uploadFile() {
  232. let tmpDir = Ps.getLogDir();
  233. const files = this.app.request.files;
  234. let file = files.file;
  235. let tmpFilePath = path.join(tmpDir, file.originalFilename);
  236. try {
  237. let tmpFile = fs.readFileSync(file.filepath);
  238. fs.writeFileSync(tmpFilePath, tmpFile);
  239. } finally {
  240. await fs.unlink(file.filepath, function(){});
  241. }
  242. const fileStream = fs.createReadStream(tmpFilePath);
  243. const uploadRes = await this.service.example.uploadFileToSMMS(fileStream);
  244. return uploadRes;
  245. }
  246. /**
  247. * 启动java项目
  248. */
  249. async startJavaServer() {
  250. let data = {
  251. code: 0,
  252. msg: '',
  253. server: ''
  254. }
  255. const javaCfg = this.app.config.addons.javaServer || {};
  256. if (!javaCfg.enable) {
  257. data.code = -1;
  258. data.msg = 'addon not enabled!';
  259. return data;
  260. }
  261. const javaServerAddon = this.app.addon.javaServer;
  262. await javaServerAddon.createServer();
  263. data.server = 'http://localhost:' + javaCfg.port;
  264. return data;
  265. }
  266. /**
  267. * 关闭java项目
  268. */
  269. async closeJavaServer() {
  270. let data = {
  271. code: 0,
  272. msg: '',
  273. }
  274. const javaCfg = this.app.config.addons.javaServer || {};
  275. if (!javaCfg.enable) {
  276. data.code = -1;
  277. data.msg = 'addon not enabled!';
  278. return data;
  279. }
  280. const javaServerAddon = this.app.addon.javaServer;
  281. await javaServerAddon.kill();
  282. return data;
  283. }
  284. /**
  285. * 任务
  286. */
  287. someJob(args, event) {
  288. let jobId = args.id;
  289. let action = args.action;
  290. let result;
  291. switch (action) {
  292. case 'create':
  293. result = this.service.example.doJob(jobId, action, event);
  294. break;
  295. case 'close':
  296. this.service.example.doJob(jobId, action, event);
  297. break;
  298. default:
  299. }
  300. let data = {
  301. jobId,
  302. action,
  303. result
  304. }
  305. return data;
  306. }
  307. /**
  308. * 创建任务池
  309. */
  310. async createPool(args, event) {
  311. let num = args.number;
  312. this.service.example.doCreatePool(num, event);
  313. // test monitor
  314. this.service.example.monitorJob();
  315. return;
  316. }
  317. /**
  318. * 通过进程池执行任务
  319. */
  320. someJobByPool(args, event) {
  321. let jobId = args.id;
  322. let action = args.action;
  323. let result;
  324. switch (action) {
  325. case 'run':
  326. result = this.service.example.doJobByPool(jobId, action, event);
  327. break;
  328. default:
  329. }
  330. let data = {
  331. jobId,
  332. action,
  333. result
  334. }
  335. return data;
  336. }
  337. /**
  338. * 测试接口
  339. */
  340. hello(args) {
  341. Log.info('hello ', args);
  342. }
  343. }
  344. FrameworkController.toString = () => '[class FrameworkController]';
  345. module.exports = FrameworkController;