zoukankan      html  css  js  c++  java
  • Electron集成其他桌面程序时记录登录账号

    最近在实现Electron编写一个桌面程序,集成医院his系统,在his中通过调取已经装好的Electron exe程序,调取Electron exe程序时需要参入参数(登录账号信息),可通过以下命令获得参数:

    process.argv
     
    但是每次his重新加载后调起后,可能多次调起Electron exe程序,需要kill前面的程序,保证只起一个程序
    解决方法:
    每次启动程序后写入一个文件,记录当前账号以及进程id
    启动程序时去读取当前文件,如果判断到账号未修改则退出新启动的exe程序
    自动更新时,会重新启动程序,次数的参数会变为“--updated”,也需要从文件中获取,实现自动登录
    具体代码如下,需要在写入启动文件中:
    import { app, BrowserWindow, ipcMain, shell } from 'electron'
    import path from "path"
    import fs from "fs"
    // 查找之前是否有进程,并杀掉
    import childProcess from 'child_process'
    const exec = childProcess.exec
    
    const killProcess = (pid) => {
        let cmd = process.platform === 'win32' ? 'tasklist' : 'ps aux'
        exec(cmd, function (err, stdout, stderr) {
          if (err) {
            return console.error(err)
          }
          const lines = stdout.split('
    ');
          for(let line of lines){
            const processMessage = line.trim().split(/s+/)
            if(processMessage[0].startsWith('xiaobao')) console.log(processMessage, 'pidpidpid1')
            if(processMessage[1] == pid){
              console.log(pid, 'find kill')
            //   process.kill(pid)
              break;
            }
          }
        })
    }
    
    const findProcess = (pid, cb) => {
        let cmd = process.platform === 'win32' ? 'tasklist' : 'ps aux'
        exec(cmd, function (err, stdout, stderr) {
          if (err) {
            return console.error(err)
          }
          let re = null;
          const lines = stdout.split('
    ');
          for(let line of lines){
            const processMessage = line.trim().split(/s+/)
            if(processMessage[1] == pid){
              console.log(processMessage[1], 'sssss');
              re = processMessage;
              break;
            }
          }
          cb(re)
        })
    }
    
    const writeFile=(path, data)=>{
        fs.writeFile(path, JSON.stringify(data),(err) => {
            if (err) {
                throw err;
            }
            console.log(err);
        });
    }
    
    const bootApp =()=>{
        let user = process.argv[process.argv.length - 1];
        const logsPath = path.join(app.getAppPath(), '../../../') + '/logs';
        // 判断是否重新启动小宝
        fs.exists(logsPath, (exists)=> {
          if(exists){
            // 读取文件
            fs.readFile(logsPath, function (err, data) {
                if (err) {
                    return console.error(err);
                }
                let logsInfo = {}
                try{
                  logsInfo = JSON.parse(data.toString());
                }catch(e){
                  console.log(e);
                }
                // 判断是否存在进程,或者通过别的渠道将进程已经关闭
                findProcess(logsInfo.pid,(data)=>{
                    // 如果存在进程
                    if(data){
                      // 如果账户不相同,则关闭前面进程,重新启动
                        if(logsInfo.user !== user){
                            console.log('user changed, kill old pro and write new info', user, logsInfo.pid);
                            if(user === '--updated'){
                              console.log('auto update, user not change', logsInfo.user);
                              global.arguments.push(logsInfo.user)
                              user = logsInfo.user
                            }
                            writeFile(logsPath, {
                                user, 
                                pid: process.pid
                            });
                            process.kill(logsInfo.pid)
                        }else{
                            // 否则退出当前程序
                            console.log('same user, app quit')
                            app.quit()
                        }
                    }else{
                        // 如果进程不存在需要写入新起的进程数据
                        console.log('process not exit, write info');
                        // 如果判断是自动更新时,自动更新的参数为‘--updated’
                        if(user === '--updated'){
                          console.log('auto update, user not change', logsInfo.user);
                          global.arguments.push(logsInfo.user)
                          user = logsInfo.user
                        }
                        writeFile(logsPath, {
                            user, 
                            pid: process.pid
                        });
                    }
                })
            });
          }else{
            // 不存在文件写文件
            writeFile(logsPath, {
                user, 
                pid: process.pid
            });
          }
        })
    }
    
    
    export {
        killProcess,
        findProcess,
        bootApp
    }

    在main.dev.js中引入

    if (process.env.NODE_ENV === 'production') {
      const sourceMapSupport = require('source-map-support');
      sourceMapSupport.install();
      const proSetting = require('./prod.setting.js');
      proSetting.bootApp();
    }

    注意:写入的文件要在安装程序路径上级,否则会被重新安装以后覆盖,这样无法做到自动更新时实现自动登录

  • 相关阅读:
    启动django报错
    celery简单使用
    git简单使用
    selinux干扰mysql启动
    python操作xml文件时,带有^M符号
    获取服务器内网地址
    WebStorm激活
    linux nohup python 后台运行无输出问题
    安装FTP
    sql server还原数据库代码
  • 原文地址:https://www.cnblogs.com/jlj9520/p/11327269.html
Copyright © 2011-2022 走看看