Browse Source

Merge branch 'master' into dev

gaoshuaixing 4 years ago
parent
commit
62fcdd11c8

+ 5 - 1
README.md

@@ -41,7 +41,11 @@
 3. 常用命令
     ```
     # 开发者模式
-    npm run dev
+        # 1:【进入前端目录】,启动vue
+        cd frontend && npm install && npm run serve
+        
+        # 2:【根目录】,启动后端服务
+        cd ../ && npm run dev
 
     # 生产者模式
     npm run start

+ 17 - 8
app/controller/v1/example.js

@@ -1,6 +1,6 @@
 'use strict';
 
-const BaseController = require('../base'); 
+const BaseController = require('../base');
 const os = require('os');
 const fs = require('fs');
 const path = require('path');
@@ -20,13 +20,13 @@ class ExampleController extends BaseController {
         break;
       case 'picture' :
         dir = os.userInfo().homedir + '/Pictures';
-        break;    
+        break;
       case 'doc' :
         dir = os.userInfo().homedir + '/Documents';
-        break;      
+        break;
       case 'music' :
         dir = os.userInfo().homedir + '/Music';
-        break;    
+        break;
     }
 
     await service.example.openLocalDir(dir);
@@ -34,6 +34,15 @@ class ExampleController extends BaseController {
     self.sendSuccess(data);
   }
 
+  async executeJS() {
+    const self = this;
+    const { ctx, service } = this;
+    const body = ctx.request.body;
+    const str = body.str;
+    let data = await service.example.executeJS(str);
+    self.sendSuccess(data);
+  }
+
   async uploadFile() {
     const self = this;
     const { ctx, service } = this;
@@ -42,24 +51,24 @@ class ExampleController extends BaseController {
     //   this.app.logger.info('file:', file);
 
     //   try {
-    //     let tmpFile = fs.readFileSync(file.filepath) 
+    //     let tmpFile = fs.readFileSync(file.filepath)
     //     fs.writeFileSync(path.join(tmpDir, file.filename), tmpFile)
     //   } finally {
     //     await fs.unlink(file.filepath, function(){});
     //   }
-    //   const fileStream = fs.createReadStream(path.join(tmpDir, file.filename)) 
+    //   const fileStream = fs.createReadStream(path.join(tmpDir, file.filename))
     //   const uploadRes = await service.example.uploadFileToSMMS(fileStream);
     // }
     const file = ctx.request.files[0];
     //this.app.logger.info('file:', file);
 
     try {
-      let tmpFile = fs.readFileSync(file.filepath) 
+      let tmpFile = fs.readFileSync(file.filepath)
       fs.writeFileSync(path.join(tmpDir, file.filename), tmpFile)
     } finally {
       await fs.unlink(file.filepath, function(){});
     }
-    const fileStream = fs.createReadStream(path.join(tmpDir, file.filename)) 
+    const fileStream = fs.createReadStream(path.join(tmpDir, file.filename))
     const uploadRes = await service.example.uploadFileToSMMS(fileStream);
 
     self.sendData(uploadRes);

+ 1 - 1
app/public/index.html

@@ -1 +1 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>electron-egg</title><link href="/css/chunk-85272794.56abef7d.css" rel="prefetch"><link href="/js/chunk-0facd6c5.d60d4450.js" rel="prefetch"><link href="/js/chunk-23265f79.da93d63b.js" rel="prefetch"><link href="/js/chunk-2d209522.0701dc73.js" rel="prefetch"><link href="/js/chunk-85272794.20d8c8f3.js" rel="prefetch"><link href="/css/app.3886a9b8.css" rel="preload" as="style"><link href="/css/chunk-vendors.a1538f74.css" rel="preload" as="style"><link href="/js/app.ccc8bea4.js" rel="preload" as="script"><link href="/js/chunk-vendors.3d275796.js" rel="preload" as="script"><link href="/css/chunk-vendors.a1538f74.css" rel="stylesheet"><link href="/css/app.3886a9b8.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but electron-egg doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.3d275796.js"></script><script src="/js/app.ccc8bea4.js"></script></body></html>
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>electron-egg</title><link href="/css/chunk-85272794.56abef7d.css" rel="prefetch"><link href="/js/chunk-0facd6c5.d60d4450.js" rel="prefetch"><link href="/js/chunk-23265f79.cf6a544a.js" rel="prefetch"><link href="/js/chunk-85272794.a366dbbc.js" rel="prefetch"><link href="/js/chunk-ef3e31dc.31aef086.js" rel="prefetch"><link href="/css/app.3886a9b8.css" rel="preload" as="style"><link href="/css/chunk-vendors.a1538f74.css" rel="preload" as="style"><link href="/js/app.b6046f35.js" rel="preload" as="script"><link href="/js/chunk-vendors.3d275796.js" rel="preload" as="script"><link href="/css/chunk-vendors.a1538f74.css" rel="stylesheet"><link href="/css/app.3886a9b8.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but electron-egg doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.3d275796.js"></script><script src="/js/app.b6046f35.js"></script></body></html>

File diff suppressed because it is too large
+ 0 - 0
app/public/js/app.b6046f35.js


File diff suppressed because it is too large
+ 0 - 0
app/public/js/app.b6046f35.js.map


+ 2 - 0
app/public/js/chunk-23265f79.cf6a544a.js

@@ -0,0 +1,2 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-23265f79"],{"5cb9":function(t,n,e){"use strict";e.r(n);var o=function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",[e("h3",{style:{marginBottom:"16px"}},[t._v(" demo1 打开文件夹实现 ")]),e("a-list",{attrs:{bordered:"","data-source":t.data},scopedSlots:t._u([{key:"renderItem",fn:function(n){return e("a-list-item",{on:{click:function(e){return t.openDirectry(n.id)}}},[t._v(" "+t._s(n.content)+" "),e("a-button",{attrs:{type:"link"}},[t._v(" 打开 ")])],1)}}])})],1)},a=[],u=e("a358"),c=[{content:"【下载】目录",id:"download"},{content:"【图片】目录",id:"picture"},{content:"【文档】目录",id:"doc"},{content:"【音乐】目录",id:"music"}],i={data:function(){return{data:c}},methods:{openDirectry:function(t){console.log("id:",t);var n={id:t};Object(u["c"])(n).then((function(t){if(0!==t.code)return!1})).catch((function(t){console.log("err:",t)}))}}},r=i,d=e("2877"),l=Object(d["a"])(r,o,a,!1,null,null,null);n["default"]=l.exports},a358:function(t,n,e){"use strict";e.d(n,"b",(function(){return u})),e.d(n,"c",(function(){return c})),e.d(n,"a",(function(){return i}));var o=e("b775"),a={outApi:"/api/v1/outApi",openDir:"/api/v1/example/openLocalDir",uploadFile:"/api/v1/example/uploadFile",executeJS:"/api/v1/example/executeJS",autoLaunchEnable:"/api/v1/setting/autoLaunchEnable",autoLaunchDisable:"/api/v1/setting/autoLaunchDisable",autoLaunchIsEnabled:"/api/v1/setting/autoLaunchIsEnabled"};function u(t,n){return Object(o["b"])({url:a[t],method:"post",data:n})}function c(t){return Object(o["b"])({url:a.openDir,method:"post",data:t})}function i(t){return Object(o["b"])({url:a.executeJS,method:"post",data:t})}}}]);
+//# sourceMappingURL=chunk-23265f79.cf6a544a.js.map

File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-23265f79.cf6a544a.js.map


+ 0 - 2
app/public/js/chunk-23265f79.da93d63b.js

@@ -1,2 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-23265f79"],{"5cb9":function(t,n,e){"use strict";e.r(n);var o=function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",[e("h3",{style:{marginBottom:"16px"}},[t._v(" demo1 打开文件夹实现 ")]),e("a-list",{attrs:{bordered:"","data-source":t.data},scopedSlots:t._u([{key:"renderItem",fn:function(n){return e("a-list-item",{on:{click:function(e){return t.openDirectry(n.id)}}},[t._v(" "+t._s(n.content)+" "),e("a-button",{attrs:{type:"link"}},[t._v(" 打开 ")])],1)}}])})],1)},a=[],i=e("a358"),u=[{content:"【下载】目录",id:"download"},{content:"【图片】目录",id:"picture"},{content:"【文档】目录",id:"doc"},{content:"【音乐】目录",id:"music"}],c={data:function(){return{data:u}},methods:{openDirectry:function(t){console.log("id:",t);var n={id:t};Object(i["b"])(n).then((function(t){if(0!==t.code)return!1})).catch((function(t){console.log("err:",t)}))}}},r=c,d=e("2877"),l=Object(d["a"])(r,o,a,!1,null,null,null);n["default"]=l.exports},a358:function(t,n,e){"use strict";e.d(n,"a",(function(){return i})),e.d(n,"b",(function(){return u}));var o=e("b775"),a={outApi:"/api/v1/outApi",openDir:"/api/v1/example/openLocalDir",uploadFile:"/api/v1/example/uploadFile",autoLaunchEnable:"/api/v1/setting/autoLaunchEnable",autoLaunchDisable:"/api/v1/setting/autoLaunchDisable",autoLaunchIsEnabled:"/api/v1/setting/autoLaunchIsEnabled"};function i(t,n){return Object(o["b"])({url:a[t],method:"post",data:n})}function u(t){return Object(o["b"])({url:a.openDir,method:"post",data:t})}}}]);
-//# sourceMappingURL=chunk-23265f79.da93d63b.js.map

File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-23265f79.da93d63b.js.map


+ 0 - 2
app/public/js/chunk-2d209522.0701dc73.js

@@ -1,2 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d209522"],{a90d:function(t,n,e){"use strict";e.r(n);var o=function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",[e("h3",{style:{marginBottom:"16px"}},[t._v(" demo3 渲染进程与主进程IPC通信 ")]),e("a-list",{attrs:{bordered:""}},[e("a-input-search",{on:{search:t.helloHandle},model:{value:t.content,callback:function(n){t.content=n},expression:"content"}},[e("a-button",{attrs:{slot:"enterButton"},slot:"enterButton"},[t._v(" send ")])],1)],1)],1)},l=[],a={data:function(){return{content:"hello",reply:""}},methods:{helloHandle:function(t){var n=this;this.$callMain("example.hello",t).then((function(t){n.$message.info(t)}))}}},s=a,c=e("2877"),r=Object(c["a"])(s,o,l,!1,null,null,null);n["default"]=r.exports}}]);
-//# sourceMappingURL=chunk-2d209522.0701dc73.js.map

File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-2d209522.0701dc73.js.map


File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-85272794.20d8c8f3.js


File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-85272794.20d8c8f3.js.map


File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-85272794.a366dbbc.js


File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-85272794.a366dbbc.js.map


File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-ef3e31dc.31aef086.js


File diff suppressed because it is too large
+ 0 - 0
app/public/js/chunk-ef3e31dc.31aef086.js.map


+ 2 - 0
app/router/example.js

@@ -7,6 +7,8 @@ module.exports = app => {
   const { router, controller } = app;
   // open local dir
   router.post('/api/v1/example/openLocalDir', controller.v1.example.openLocalDir);
+  // executeJS
+  router.post('/api/v1/example/executeJS', controller.v1.example.executeJS);
   // upload file
   router.post('/api/v1/example/uploadFile', controller.v1.example.uploadFile);
   // get ws url

+ 6 - 0
app/service/example.js

@@ -11,6 +11,12 @@ class ExampleService extends BaseService {
     return true;
   }
 
+  async executeJS(str) {
+    const self = this;
+    let result = await self.ipcCall('example.executeJS', str);
+    return result;
+  }
+
   async uploadFileToSMMS(tmpFile) {
     const res = {
       code: 1000,

+ 1 - 1
app/view/index.ejs

@@ -1 +1 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>electron-egg</title><link href="/css/chunk-85272794.56abef7d.css" rel="prefetch"><link href="/js/chunk-0facd6c5.d60d4450.js" rel="prefetch"><link href="/js/chunk-23265f79.da93d63b.js" rel="prefetch"><link href="/js/chunk-2d209522.0701dc73.js" rel="prefetch"><link href="/js/chunk-85272794.20d8c8f3.js" rel="prefetch"><link href="/css/app.3886a9b8.css" rel="preload" as="style"><link href="/css/chunk-vendors.a1538f74.css" rel="preload" as="style"><link href="/js/app.ccc8bea4.js" rel="preload" as="script"><link href="/js/chunk-vendors.3d275796.js" rel="preload" as="script"><link href="/css/chunk-vendors.a1538f74.css" rel="stylesheet"><link href="/css/app.3886a9b8.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but electron-egg doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.3d275796.js"></script><script src="/js/app.ccc8bea4.js"></script></body></html>
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>electron-egg</title><link href="/css/chunk-85272794.56abef7d.css" rel="prefetch"><link href="/js/chunk-0facd6c5.d60d4450.js" rel="prefetch"><link href="/js/chunk-23265f79.cf6a544a.js" rel="prefetch"><link href="/js/chunk-85272794.a366dbbc.js" rel="prefetch"><link href="/js/chunk-ef3e31dc.31aef086.js" rel="prefetch"><link href="/css/app.3886a9b8.css" rel="preload" as="style"><link href="/css/chunk-vendors.a1538f74.css" rel="preload" as="style"><link href="/js/app.b6046f35.js" rel="preload" as="script"><link href="/js/chunk-vendors.3d275796.js" rel="preload" as="script"><link href="/css/chunk-vendors.a1538f74.css" rel="stylesheet"><link href="/css/app.3886a9b8.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but electron-egg doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.3d275796.js"></script><script src="/js/app.b6046f35.js"></script></body></html>

+ 18 - 8
electron/api.js

@@ -61,17 +61,27 @@ exports.setup = async function () {
     socket.on('ipc', (message, callback) => {
       ELog.info('[ api ] [setup] socket id:' + socket.id + ' message cmd: ' + message.cmd);
       const data = apis[message.cmd](...message.params);
-      const result = {
-        err: null,
-        data: data,
-      };
-      callback(result);
+      if (data && typeof data.then === 'function') { // 判断是否是异步
+        data.then((data) => {
+          const result = {
+            err: null,
+            data: data,
+          };
+          callback(result)
+        });
+      } else {
+        const result = {
+          err: null,
+          data: data,
+        };
+        callback(result);
+      }
     });
   });
 
   server.listen(port, listen, function() {
     ELog.info('[ api ] [setup] server is listening on', `${listen}:${port}`);
-  });  
+  });
 };
 
 function setApi() {
@@ -88,7 +98,7 @@ function setApi() {
       });
     }
   });
-};
+}
 
 /**
  * get api method name
@@ -99,4 +109,4 @@ function setApi() {
 function getApiName (jsname, method) {
   return jsname + '.' + method;
   //return jsname + method.charAt(0).toUpperCase() + method.slice(1);
-};
+}

+ 15 - 7
electron/apis/example.js

@@ -1,11 +1,14 @@
 'use strict';
 
 const path = require('path');
-const { app, shell } = require('electron');
+const {
+  app,
+  webContents,
+  shell
+} = require('electron');
 
 exports.getPath = function () {
   const dir = app.getAppPath();
-
   return dir;
 }
 
@@ -14,15 +17,20 @@ exports.openDir = function (dir = '') {
     return false;
   }
   dir = getElectronPath(dir);
-  shell.openItem(dir);
-
+  shell.openPath(dir);
   return true;
 }
 
-function getElectronPath (filepath) {
+exports.executeJS = function (str) {
+  let jscode = `(()=>{alert('${str}');return 'fromJs:${str}';})()`;
+  console.log(jscode);
+  return webContents.fromId(1).executeJavaScript(jscode);
+}
+
+function getElectronPath(filepath) {
   //filepath = path.resolve(filepath);
-  filepath=filepath.replace("resources",""); 
-  filepath=filepath.replace("app.asar",""); 
+  filepath = filepath.replace("resources", "");
+  filepath = filepath.replace("app.asar", "");
   filepath = path.normalize(filepath);
   return filepath;
 };

+ 1 - 1
electron/ipc/index.js

@@ -1,6 +1,6 @@
 const { ipcMain: ipc } = require('electron')
 const path = require('path')
-const fs = require('fs-extra')
+const fs = require('fs')
 
 /**
  * 发送响应信息给渲染进程

+ 1 - 1
electron/setup.js

@@ -21,7 +21,7 @@ module.exports = () => {
   }
   // electron业务模块
   api.setup();
-  // 加载所有的主进程函数
+  // ipc模块
   ipc.setup();
 }
 

+ 12 - 0
frontend/src/api/main.js

@@ -5,6 +5,7 @@ const mainApi = {
   outApi: '/api/v1/outApi',
   openDir: '/api/v1/example/openLocalDir',
   uploadFile: '/api/v1/example/uploadFile',
+  executeJS: '/api/v1/example/executeJS',
   autoLaunchEnable: '/api/v1/setting/autoLaunchEnable',
   autoLaunchDisable: '/api/v1/setting/autoLaunchDisable',
   autoLaunchIsEnabled: '/api/v1/setting/autoLaunchIsEnabled'
@@ -52,4 +53,15 @@ export function uploadFile (parameter) {
     method: 'post',
     data: parameter
   })
+}
+
+/**
+ * executeJS
+ */
+export function executeJS (parameter) {
+  return request({
+    url: mainApi.executeJS,
+    method: 'post',
+    data: parameter
+  })
 }

+ 36 - 11
frontend/src/views/example/Ipc.vue

@@ -1,23 +1,39 @@
 <template>
   <div>
-    <h3 :style="{ marginBottom: '16px' }">
-      demo3 渲染进程与主进程IPC通信
-    </h3>
-    <a-list bordered>
-      <!-- <a-button @click="helloHandle">打招呼</a-button> -->
-      <a-input-search v-model="content" @search="helloHandle">
-        <a-button slot="enterButton">
-          send
-        </a-button>
-      </a-input-search>
-    </a-list>
+    <div>
+      <h3 :style="{ marginBottom: '16px' }">
+        demo3 渲染进程与主进程IPC通信
+      </h3>
+      <a-list bordered>
+        <!-- <a-button @click="helloHandle">打招呼</a-button> -->
+        <a-input-search v-model="content" @search="helloHandle">
+          <a-button slot="enterButton">
+            send
+          </a-button>
+        </a-input-search>
+      </a-list>
+    </div>
+    <div style="margin-top: 20px;">
+      <h3 :style="{ marginBottom: '16px' }">
+        demo4 主进程API执行网页函数
+      </h3>
+      <a-list bordered>
+        <a-input-search v-model="content2" @search="executeJSHandle">
+          <a-button slot="enterButton">
+            send
+          </a-button>
+        </a-input-search>
+      </a-list>
+    </div>
   </div>
 </template>
 <script>
+import { executeJS } from '@/api/main'
 export default {
   data() {
     return {
       content: 'hello',
+      content2: 'hello world',
       reply: ''
     }
   },
@@ -27,6 +43,15 @@ export default {
       this.$callMain('example.hello', value).then(r => {
         self.$message.info(r);
       })
+    },
+    executeJSHandle(value) {
+        executeJS({str: value}).then(res => {
+          if (res.code == 0) {
+            console.log(res.data);
+          }
+        }).catch(err => {
+          console.log('err:', err)
+        })
     }
   }
 }

+ 4 - 2
package.json

@@ -1,12 +1,13 @@
 {
   "name": "electron-egg",
-  "version": "1.9.0",
+  "version": "1.9.4",
   "description": "A fast, desktop software development framework",
   "main": "main.js",
   "softName": "electron-egg",
   "scripts": {
     "start": "electron .",
     "dev": "electron . --env=local",
+    "test": "concurrently \"cd ./frontend && npm run serve\" \"electron . --env=local\"",
     "build-w": "electron-builder -w",
     "build-m": "electron-builder -m",
     "build-l": "electron-builder -l deb tar.xz",
@@ -93,11 +94,12 @@
   "devDependencies": {
     "autod": "^3.0.1",
     "autod-egg": "^1.1.0",
+    "concurrently": "^6.1.0",
     "devtron": "^1.4.0",
     "egg-bin": "^4.12.3",
     "egg-ci": "^1.11.0",
     "egg-mock": "^3.21.0",
-    "electron": "^8.4.1",
+    "electron": "^12.0.10",
     "electron-builder": "^22.7.0",
     "eslint": "^5.13.0",
     "eslint-config-egg": "^7.1.0",

Some files were not shown because too many files changed in this diff