example.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. 'use strict';
  2. const _ = require('lodash');
  3. const path = require('path');
  4. const is = require('electron-is');
  5. const unzip = require("unzip-crx-3");
  6. const Controller = require('ee-core').Controller;
  7. const electronApp = require('electron').app;
  8. const {dialog, webContents, shell, BrowserWindow, BrowserView, Notification, powerMonitor, screen, nativeTheme} = require('electron');
  9. const chromeExtension = require('../library/chromeExtension');
  10. let myTimer = null;
  11. let browserViewObj = null;
  12. let notificationObj = null;
  13. /**
  14. * 示例控制器
  15. * @class
  16. */
  17. class ExampleController extends Controller {
  18. /**
  19. * 所有方法接收两个参数
  20. * @param args 前端 或 egg,传的参数(单个参数,或参数数组)
  21. * @param event - IpcMainEvent 文档:https://www.electronjs.org/docs/latest/api/structures/ipc-main-event
  22. */
  23. constructor(ctx) {
  24. super(ctx);
  25. //this.myTimer = null;
  26. }
  27. /**
  28. * test
  29. */
  30. async test (args) {
  31. let obj = {
  32. status:'ok'
  33. }
  34. // 调用egg的某个api
  35. // const result = await this.app.curlEgg('post', '/api/v1/example/test2', {name: 'gsx2'});
  36. // console.log('fffffffffff: ', result);
  37. //this.app.logger.info('ssssssssssssssssssss');
  38. return obj;
  39. }
  40. /**
  41. * hello
  42. */
  43. hello (args) {
  44. let newMsg = args + " +1";
  45. let content = '';
  46. content = '收到:' + args + ',返回:' + newMsg;
  47. // let channel = "example.socketMessageStop";
  48. // event.reply(`${channel}`, '另外的数据');
  49. return content;
  50. }
  51. /**
  52. * 消息提示对话框
  53. */
  54. messageShow () {
  55. dialog.showMessageBoxSync({
  56. type: 'info', // "none", "info", "error", "question" 或者 "warning"
  57. title: '自定义标题-message',
  58. message: '自定义消息内容',
  59. detail: '其它的额外信息'
  60. })
  61. return '打开了消息框';
  62. }
  63. /**
  64. * 消息提示与确认对话框
  65. */
  66. messageShowConfirm () {
  67. const res = dialog.showMessageBoxSync({
  68. type: 'info',
  69. title: '自定义标题-message',
  70. message: '自定义消息内容',
  71. detail: '其它的额外信息',
  72. cancelId: 1, // 用于取消对话框的按钮的索引
  73. defaultId: 0, // 设置默认选中的按钮
  74. buttons: ['确认', '取消'], // 按钮及索引
  75. })
  76. let data = (res === 0) ? '点击确认按钮' : '点击取消按钮';
  77. return data;
  78. }
  79. /**
  80. * 选择目录
  81. */
  82. selectFolder () {
  83. const filePaths = dialog.showOpenDialogSync({
  84. properties: ['openDirectory', 'createDirectory']
  85. });
  86. if (_.isEmpty(filePaths)) {
  87. return null
  88. }
  89. return filePaths[0];
  90. }
  91. /**
  92. * 打开目录
  93. */
  94. openDirectory (args) {
  95. if (!args.id) {
  96. return false;
  97. }
  98. const dir = electronApp.getPath(args.id);
  99. shell.openPath(dir);
  100. return true;
  101. }
  102. /**
  103. * 长消息 - 开始
  104. */
  105. socketMessageStart (args, event) {
  106. // 每隔1秒,向前端页面发送消息
  107. // 用定时器模拟
  108. // 前端ipc频道 channel
  109. const channel = 'controller.example.socketMessageStart';
  110. myTimer = setInterval(function(e, c, msg) {
  111. let timeNow = Date.now();
  112. let data = msg + ':' + timeNow;
  113. e.reply(`${c}`, data)
  114. }, 1000, event, channel, args)
  115. return '开始了'
  116. }
  117. /**
  118. * 长消息 - 停止
  119. */
  120. socketMessageStop () {
  121. clearInterval(myTimer);
  122. return '停止了'
  123. }
  124. /**
  125. * 执行js语句
  126. */
  127. executeJS (args) {
  128. let jscode = `(()=>{alert('${args}');return 'fromJs:${args}';})()`;
  129. return webContents.fromId(1).executeJavaScript(jscode);
  130. }
  131. /**
  132. * 加载视图内容
  133. */
  134. loadViewContent (args) {
  135. let content = null;
  136. if (args.type == 'html') {
  137. content = path.join('file://', electronApp.getAppPath(), args.content)
  138. } else {
  139. content = args.content;
  140. }
  141. browserViewObj = new BrowserView();
  142. this.app.electron.mainWindow.setBrowserView(browserViewObj)
  143. browserViewObj.setBounds({
  144. x: 300,
  145. y: 170,
  146. width: 650,
  147. height: 400
  148. });
  149. browserViewObj.webContents.loadURL(content);
  150. return true
  151. }
  152. /**
  153. * 移除视图内容
  154. */
  155. removeViewContent () {
  156. this.app.electron.mainWindow.removeBrowserView(browserViewObj);
  157. return true
  158. }
  159. /**
  160. * 打开新窗口
  161. */
  162. createWindow (args) {
  163. let content = null;
  164. if (args.type == 'html') {
  165. content = path.join('file://', electronApp.getAppPath(), args.content)
  166. } else {
  167. content = args.content;
  168. }
  169. let winObj = new BrowserWindow({
  170. x: 10,
  171. y: 10,
  172. width: 980,
  173. height: 650
  174. })
  175. winObj.loadURL(content);
  176. return winObj.id
  177. }
  178. /**
  179. * 加载扩展程序
  180. */
  181. async loadExtension (args) {
  182. const crxFile = args[0];
  183. if (_.isEmpty(crxFile)) {
  184. return false;
  185. }
  186. const extensionId = path.basename(crxFile, '.crx');
  187. const chromeExtensionDir = chromeExtension.getDirectory();
  188. const extensionDir = path.join(chromeExtensionDir, extensionId);
  189. console.log("[api] [example] [loadExtension] extension id:", extensionId);
  190. unzip(crxFile, extensionDir).then(() => {
  191. console.log("[api] [example] [loadExtension] unzip success!");
  192. chromeExtension.load(extensionId);
  193. });
  194. return true;
  195. }
  196. }
  197. module.exports = ExampleController;