webman-electron 使用webman开发windows桌面程序

Ace华

基本情况

使用electron框架,封装了webman,使得webman直接变成客户端,运行后,自动启动webman服务,退出软件后,自动关闭所有webman进程及子进程。

之前分享的phpdesktop-webman,不是特别好用,一个是谷歌的内核版本太低了,才57,导致有很多现代的写法都不能用。第二个是之前的有时会有多次启动,后台php进程不会退出的情况。总之不太稳定。

这次使用的electron和webman的结合,chrome内核版本是Chrome/106.0.5249.199的,可以说特别先进了,而且,兼容windows7系统。
其次,在退出后,也会退出后部的php进程
比较好用。

推荐给大家

使用说明

双击 electron-webman.exe运行
用户名:admin
密码:admin

此项目为electron和webman的结合,将webman项目和php放在resources\extraResources下,会自动启动服务,软件关闭后,会自动关闭所有webman进程及子进程。
仓库源地址是electron-egg,我将其改为可根据setting.json动态配置,以及适配webman
源仓库地址:
https://gitee.com/dromara/electron-egg
源仓库官方文档:
https://www.kaka996.com/

部分原软件的设置没有迁移过来,个人觉得够用了,后续再添加

如果软件打开后,无法正常显示,大概是因为setting.json中的webman的port配置错误,请核对是否与webman项目下的config.php中的listen的端口一致

demo项目已改为兼容sqlite后,不支持原项目的所有表功能,webman官网只支持mysql,已注释下面 table.render 代码

建议在mysql上开发好后,使用navicat的数据库迁移工具,将mysql数据库转为sqlite数据库,然后,关闭代码生成等功能

为了兼容sqlite,需要替换源webman-admin框架的2个文件,一个是
plugin/admin/app/common/Util.php
plugin/admin/app/controller/Crud.php

可以自行对比修改了什么内容

设置文件在根目录下的setting.json文件中,具体含义如下:


{
  "openDevTools": true, // 是否打开浏览器调试工具
  "openAppMenu": true, // 是否打开应用程序顶部菜单
  "windowsOption": {
    "title": "学生管理系统xxx", // 软件顶部或左上角名称(会被 html中的 title标签覆盖)
    "width": 980,// 软件窗口宽度
    "height": 650,// 软件窗口高度
    "minWidth": 400,// 软件窗口最小宽度
    "minHeight": 300,// 软件窗口最小高度
  },
  "logger": {
    "level": "ERROR", // 日志等级,支持 info error debug warn,默认是 info
    "rotator": "day",  // day:按天切割 | none:无
    "appLogName": "app.log",// 业务日志名
    "coreLogName": "ee-core.log",// 框架核心日志名
    "errorLogName": "error.log" // 错误日志名
  },
  "webman": {
    "enable": true, // 是否开启webman,此项一定要打开
    "hostname": "localhost", // 如果enable为true,并且此项是localhost/127.0.0.1,则会根据下面的配置自动启动webman服务,如果此项是ip地址,则相当于远程访问其他服务器的webman服务
    "phpPath": "php8.0", // php.exe所在目录,确保放在 resources\extraResources下
    "port": 8789, // webman监听的端口,值为webman项目下的config.php中的listen的端口
    "projectPath": "webman", // webman项目目录,确保放在resources\extraResources下
    "stdioIgnore": false // 是否输出webman进程的日志
  }
}

若出现环境变量问题的解决方法

如果在新电脑上运行,可能需要将resource\php8的目录添加到环境变量中,测试中发现,绝对路径\php.exe 绝对路径\windows.php 会提示 php is not recognized as an internal command,但如果将windows.php换成start.php就没事。可能是因为没有注释掉那个监控进程导致的。
如果在新客户端上部署,出现上面这个问题的话,2个建议,一是将monitor进程注释,二是将resource\php8的目录添加到环境变量中。可以使用下面语句,制作成.bat文件,用户双击即可添加环境变量。

setx path /m "%path%;%~dp0resources\php8.0;"

后,实际测试,如果不想加环境变量,则必须关闭monitor进程,也不是因为monitor进程导致环境变量的问题,而是php.exe 后面在没有环境变量的环境下,就不能跟2个php文件,所以,在交付给客户的时候,必须关闭monitor进程

下载地址

蓝奏云:
https://wwck.lanzouj.com/ixdp71i78aoj

相关源码:

我用蓝奏浏览器分享了[webman-electron-egg], 下载链接:https://wwp.lanzoup.com/iNK9R1l1xuqd , 你可以不限速下载哦

3560 25 28
25个评论

hatn

cool 这就很棒棒了

  • Ace华 2023-12-18

    嘻嘻,谢谢,我已经用这个做了好几个客户端了,开发速度杠杠的

walkor

TM

点赞

  • 暂无评论
初心by

666

  • 暂无评论
xia

支持支持,感觉还是前后端分离打包安全点,这样数据库配置也在客户端

  • Ace华 2023-12-20

    用的是sqlite,客户端的数据,你用其他软件做的放在,也是在客户端呀

Mr_Deng

改了代码,要怎样重新生成exe呢?

  • Ace华 2023-12-20

    exe就不需要重新生成呀,你的php代码是放在resourece\webman\下的

administrator

给楼主点赞
以后做桌面的话,可以尝试一下
感谢分享

  • 暂无评论
Mr_Deng

截图
这。。。

  • Ace华 2023-12-21

    这是你自己业务的错误哦

  • Ace华 2023-12-21

    我这边测试mkdir没问题

  • Ace华 2023-12-21

    递归创建目录的话,你第三个参数要写true,不能省略的

  • Mr_Deng 2023-12-21

    呃,我下载下来就双击的,没有业务呢,难道跟我环境有关系

  • Ace华 2023-12-21

    你本地测试可以?或者启动后,浏览器运行webman的地址测试

  • Mr_Deng 2023-12-21

    呃,运行测试地址后就可以了

  • Ace华 2023-12-21

    可以发代码出来看看?

  • Ace华 2023-12-21

    mkdir的话,如果是多级目录,如果第3个参数没有写,必须保证前面的目录存在,如果是要连续创建的话,第3个参数必须是true

  • Jonlinc 2024-01-03

    我本地跑了也是这个错误,发现原因是没有D盘,所以创建不了目录,改了php.ini中的路径就可以了

  • Ace华 2024-01-04

    哦哦,谢谢提醒,这个是跟我自带的php设置有关,我用的是phpenv,在php.ini中写死了应该

  • ye 2024-01-11

    是这个原因 建议改成当前路径再发下

软饭工程师

mac 可以支持吗

  • Ace华 2023-12-21

    暂时还没支持,技术上支持很简单,就是没有mac可以测试

  • 软饭工程师 2023-12-21

    我有mac,可以出个文档吗

  • 软饭工程师 2023-12-21

    打包前的源码可以开源吗,我的mac上electron 安装好了

  • Ace华 2023-12-21

    晚上回去私发你,留个邮箱

  • Ace华 2023-12-21

    晚上我源码上传云吧

  • Ace华 2023-12-21

    你可以先下载electron-egg,研究一下里面的javaServer那个插件,里面有关于mac的参考代码,稍微改一改就行

  • TM 2023-12-21

    electron-egg 我之前也看过这个 看起来挺好用的,内置挺多东西

  • 软饭工程师 2023-12-21

    好的,谢谢

  • Ace华 2023-12-21

    源码已发邮箱

  • 软饭工程师 2023-12-21

    谢谢

  • Ace华 2023-12-21

    期待你的mac版本。建议可以修改我加的一个webman的插件,里面有todo的内容,修改修改应该就能用了

奇衡三

感谢大佬的分享

  • 暂无评论
软饭工程师

你好,请问这个地方怎么修改

    /**
     * 创建服务
     */
    async create(cfg) {
        this.options = cfg;
        if (this.options.enable === false) {
            return;
        }
        const hostname = this.options.hostname;

        if (['localhost', '127.0.0.1'].indexOf(hostname) === -1) {
            // 不是localhost就退出,不启动服务
            return;
        }

        try {
            const phpPath = this.options.phpPath;
            const projectPath = this.options.projectPath;
            const stdioIgnore = this.options.stdioIgnore;

            let phpBinaryPath = path.join(UtilsPs.getExtraResourcesDir(), phpPath, "php");
            const windowsPhpPath = path.join(UtilsPs.getExtraResourcesDir(), projectPath, "start.php");
            Log.info("[addon:webmanServer] phpBinaryPath file path:", phpBinaryPath);
            Log.info("[addon:webmanServer] windowsPhpPath file path:", windowsPhpPath);

            if (!fs.existsSync(phpBinaryPath)) throw new Error('php does not exist');
            if (!fs.existsSync(windowsPhpPath)) throw new Error('start.php does not exist');
            // const processOption = stdioIgnore === true ? {stdio: 'ignore'} : {"start"};
            const processOption = "start -d";
            Log.info("[addon:webmanServer] processOption :", processOption);

            if (is.windows()) {
                this.phpProcess = spawn(phpBinaryPath, [windowsPhpPath], processOption);
                if (!stdioIgnore) {
                    this.phpProcess.stdout.on('data', (data) => {
                        Log.info(`[addon:webmanServer] ${data}`);
                    });
                }
            } else if (is.macOS()) {
                // todo macos
                this.phpProcess = spawn(phpBinaryPath, [windowsPhpPath], processOption);
                if (!stdioIgnore) {
                    this.phpProcess.stdout.on('data', (data) => {
                        Log.info(`[addon:webmanServer] ${data}`);
                    });
                }
            } else {
                // todo linux
            }

            // Log.info("[addon:webmanServer] cmdStr:", cmdStr);
            // exec(cmdStr);

        } catch (err) {
            Log.error('[addon:webmanServer] throw error:', err);
        }
    }

windows 用户执行 php windows.php 启动就可以了
mac 用户启动webman 需要执行

php start.php start

我这个代码执行npm run dev 出现报错

~/electron/electron-egg-webman ❯ 2023-12-22 10:04:33,152 INFO 32361 [addon:security] load
2023-12-22 10:04:33,153 INFO 32361 [addon:awaken] load
2023-12-22 10:04:33,161 INFO 32361 [addon:webmanServer] phpBinaryPath file path: /Users/110/electron/electron-egg-webman/build/extraResources/php8.0/php
2023-12-22 10:04:33,161 INFO 32361 [addon:webmanServer] windowsPhpPath file path: /Users/110/electron/electron-egg-webman/build/extraResources/webman/start.php
2023-12-22 10:04:33,161 INFO 32361 [addon:webmanServer] processOption : start -d
2023-12-22 10:04:33,164 ERROR 32361 [addon:webmanServer] throw error: TypeError [ERR_INVALID_ARG_TYPE]: The "options" argument must be of type object. Received type string ('start -d')
    at normalizeSpawnArguments (node:child_process:533:5)
    at spawn (node:child_process:702:13)
    at WebmanServer.create (/Users/110/electron/electron-egg-webman/electron/addon/webman/server.js:57:35)
    at WebmanServerAddon.create (/Users/110/electron/electron-egg-webman/electron/addon/webman/index.js:30:29)
    at /Users/110/electron/electron-egg-webman/electron/preload/index.js:19:29
    at AppLoader.loadFile (/Users/110/electron/electron-egg-webman/node_modules/ee-core/core/lib/loader/ee_loader.js:259:13)
    at Index._loderPreload (/Users/110/electron/electron-egg-webman/node_modules/ee-core/ee/eeApp.js:363:33)
    at Index.createWindow (/Users/110/electron/electron-egg-webman/node_modules/ee-core/ee/eeApp.js:97:16) {
  code: 'ERR_INVALID_ARG_TYPE'
}
(node:32361) electron: Failed to load URL: http://localhost:8789/ with error: ERR_CONNECTION_REFUSED
(Use `Electron --trace-warnings ...` to show where the warning was created)

另外,我node 的版本是v20.5.1,会有问题吗
electron-egg 的示例demo 可以跑起来
win 代码直接在mac 上运行会有空格或者回车字符串的问题,需要把no_moudle 删除重新安装依赖

  • 暂无评论
软饭工程师

截图起来了,但是好像验证码挂了

  • Ace华 2023-12-22

    只要起来了,验证码应该问题不大的,刷新一下,或者,打开的时候,把那个devtools打开,关闭缓存调试

longxiaowang

win7刚打开exe文件白屏,第二次打开还是白屏,第四次再打开正常。

  • 暂无评论
Taotao

作者就很棒

  • 暂无评论
Taotao

为啥我的win11一直报错,截图

  • Taotao 2023-12-31

    我知道是为什么了,因为我之前开了webman的8787,端口占用了,那个wenman项目关了就好了

  • Ace华 2023-12-31

    可以改端口的,server.php中

3030879494@qq.com

刚才切换到了demo分支,报了好几个npm包的错误,已经在github上提出issus了.

jcy_tcp

厉害呀,大佬能分享你源码吗

  • 暂无评论
ye

大佬 源码 git地址也分享下啊
是做了个嵌套 然后通过setting.json 修改配置及嵌套地址么?

  • jcy_tcp 2024-01-11

    大致看了egg的文档,应该可以参照egg-go 集成go的方式,集成webman.可以试一下,虽然我目前没计划去测试

  • Ace华 2024-01-13

    可以,晚上分享

  • Ace华 2024-01-14

    源码已发

  • ye 2024-01-15

    感谢大佬 学习下

zjkal✅

先支持一个

  • 暂无评论
Tinywan

加油,顶起!

  • 暂无评论
owenzhang

感谢分享,大佬git地址也分享下

  • Ace华 2024-01-31

    没放git,源码上面已经公开

foggy

请问这个只支持sqlite 不支持MySQL吗?

  • 暂无评论
hsnic

https://wwp.lanzoup.com/iNK9R1l1xuqd 用这个源码接哪里操作?
需要先安装

进入目录 ./electron-egg/

npm install
再执行
npm run build-wz
打包?
还是直接 npm run build-wz打包?

  • Ace华 2024-02-25

    可以查看electron egg官网的

artisan
NB👍,弥补php的GUI开发这块的短板
  • 暂无评论
z

可以把打包的phar放进去吗

  • 暂无评论

Ace华

500
积分
0
获赞数
0
粉丝数
2023-02-14 加入
🔝