发布于: 2025-1-4最后更新: 2025-1-6字数 2839阅读时长 8 分钟

type
status
date
slug
summary
tags
category
icon
password

electron-egg使用ThinkPHP项目指南

示例demo
electron-egg-tp
jhs1873Updated Jan 6, 2025

🧑‍💻 User

electron-egg 使用thinkphp

🤖 Assistant

在基于 electron-egg 的项目中使用 ThinkPHP,是指将 ThinkPHP 框架作为后端服务,同时通过 electron-egg 提供前端界面和打包能力。具体实现可以参考以下步骤。

前置知识

  1. Electron-egg 是一个结合了 Electron 和 Egg.js 的完整解决方案,用来在桌面端构建全栈应用。
  1. ThinkPHP 是一个 PHP 框架,用作后端 API 服务,接收来自 Electron 前端 (即 local 客户端) 发出的请求。

主要任务

  1. 启动 ThinkPHP 后端服务。
  1. 在 Electron 主进程和渲染进程中与 ThinkPHP API 交互。
  1. 优化本地调试和打包时的流程。

完整实现步骤

1. 准备环境

确保您已经安装以下工具:
  • Node.js v16.20.0 (Electron 使用)
  • PHP (至少7.2+,ThinkPHP 依赖)
  • Composer (用于安装 ThinkPHP 项目)

2. 创建项目

下拉 electron-egg

shell

git clone https://gitee.com/dromara/electron-egg.git cd electron-egg git checkout -b demo remotes/origin/demo npm install cd frontend npm install
Shell
  • electron-egg 安装问题查看文档

3. 添加 ThinkPHP 后端服务

将 ThinkPHP 安装到项目中。此处以 api 作为子目录部署 ThinkPHP:

shell

# 进入您的工程根目录cd electron-egg # 使用 Composer 安装 ThinkPHP composer create-project topthink/think api
Shell
设置 PHP 开发服务器
进入 api 目录,启动 PHP 的内置开发服务器 (例如用于调试):

shell

cd api php think run
Shell
此时,ThinkPHP 服务将在默认的 http://127.0.0.1:8000 启动。

4. Electron 与 ThinkPHP 通信

修改frontend目录

.env.development修改

shell

VITE_GO_URL="http://localhost:8000"
Shell
frontend\src\views\framework\socket\HttpServer.vue 行91

plain

/hello 改为 /index
Plain text

调用示例

在打开的窗口中 框架->http服务 2. 使用http与服务端通信 点击发送请求按钮
这样,点击页面按钮后便可以通过 Electron 渲染进程调用 ThinkPHP 后端的接口。

5. 生产环境部署

前后端本地通信

由于 Electron 应用会被打包到本地运行,PHP 服务也需要被带到本地运行环境中。可以通过以下两种方式处理:
  1. PHP 内核 + 本地服务:将 PHP 和 ThinkPHP 服务打包到本地,Electron 启动时通过 Node.js 调用 php 运行内置 Web 开发服务器。
  1. 使用第三方 API 网关:将 ThinkPHP 的服务托管到外部服务器(如部署在云端),Electron 直接调用云端 API。

实现方式一:本地集成 PHP 服务

在 Electron 主进程中,启动一个 PHP 的子进程 在 electron/service/cross.js

javascript

/** * create thinkphp service * 启动ThinkPHP服务进程 */async createThinkphpServer() { const serviceName = "tp"; const opt = { name: 'tpapi', // 修改:直接使用 PHP 可执行文件作为 cmd cmd: path.join(Ps.getExtraResourcesDir(), 'php-7.3/php'), // 修改:设置正确的工作目录 directory: path.join(Ps.getExtraResourcesDir(), 'api'), // 修改:调整参数格式 args: ['think', 'run', '--port=8000'], appExit: true, } const entity = await Cross.run(serviceName, opt); Log.info('server name:', entity.name); Log.info('server config:', entity.config); Log.info('server url:', Cross.getUrl(entity.name)); return; }
JavaScript
electron/preload/index.js 行19 新增

plain

Services.get('cross').createThinkphpServer();
Plain text
build/extraResources 引入php-7.3程序 在 electron-egg 项目运行时,PHP 服务启动于本地 127.0.0.1:8000

实现方式二:云端部署 ThinkPHP

简单地把 PHP/ThinkPHP 部署到服务器,然后前端请求地址改成云端的 API 地址 (http://yourdomain.com/api)。
例如: frontend/.env.production

shell

VITE_GO_URL = 'http://yourdomain.com'; // 云端地址
Shell
这样无需捆绑 PHP,减少本地应用的复杂程度。

总结

  • ThinkPHP 可以作为后端服务,一个本地的 PHP 服务器运行于 Electron 环境。
  • electron-egg 的前端和后端可以通过 HTTP 请求使用 axios 或 fetch 和 ThinkPHP API 进行通信。
  • 生产环境中可以选择打包 PHP 到离线环境,或直接使用云后端解决方案,取决于具体项目需求。

🧑‍💻 User

如果使用了thinkphp 那么egg的作用是什么 是不是就不需要了

🤖 Assistant

在使用 ThinkPHP 作为后端框架的同时,如果你已经引入了 electron-egg(基于 Egg.js),会造成一个问题:系统中已经有两个后端框架(ThinkPHP 和 Egg.js),导致架构的复杂性增加。因此需要仔细思考和规划系统的实际需求,决定是否真的需要继续保留 Egg.js 的功能。
下面分析一下两者的作用,以及哪些情况可以直接移除 Egg.js。

ThinkPHP 和 Egg.js 的主要职责

  • ThinkPHP
    • ThinkPHP 是一种 PHP 框架,传统上用于开发 Web 应用或 API 服务。
    • 如果您已经使用 ThinkPHP 来搭建后端 API,那么意味着所有与业务相关的数据库、逻辑处理、接口输出都会由 ThinkPHP 提供。
    • 在 electron-egg 项目中,ThinkPHP 更像是完全独立的后端服务。
  • Egg.js
    • Egg.js 是 Node.js 的框架,在 electron-egg 中,它默认作为 Electron 框架的本地后端服务。
    • Egg.js 服务直接运行于 Electron 进程中,用于管理内部的本地请求、文件读取、提供 API 服务等任务。
    • 在某些 Electron 应用中,Egg.js 可用于承担业务逻辑(替代 PHP 或其他 API)。

当你引入 ThinkPHP 时,Egg.js 还能有什么作用?

如果后端服务完全交给 ThinkPHP 来处理,那么 Egg.js 的核心价值可能就大幅下降。但仍然有一些场景下,Egg.js 能发挥作用:

1. 适配自定义 Node.js 功能

Egg.js 本质上是一个 Node.js 框架,可以运行在 Electron 应用的本地环境中。它可以用来处理一些本地功能,而这些功能并非 ThinkPHP 的强项,例如:
  • 控制本地文件系统(读写、上传、下载等操作)。
  • 调用系统命令行接口(如调用 ffmpeg 转码,或其他本地脚本)。
  • 功能性的插件(如 WebSocket 服务、定时任务)。
  • 本地数据持久化(如读取、写入配置文件)。

2. 作为 ThinkPHP 服务的代理

Egg.js 可以作为一个中间代理层:
  • 当 Electron 渲染进程(前端)发起请求时,Egg.js 可以接收请求并转发到本地运行的 ThinkPHP 服务。
  • 这样可以隐藏 ThinkPHP 服务的运行细节,同时提升安全性(前端不知道后端的真实地址或端口)。
  • 通过这种方式,你还能灵活地增加请求的拦截器、权限校验、缓存等功能。

3. 提供前后端一体化功能

如果你的桌面应用有多个 API 源:
  • 考虑到 ThinkPHP 主要处理数据库相关的核心业务逻辑,Egg.js 可以用来处理一些与 Electron 桌面应用耦合较强的 API(如本地通知、本地用户权限管理等)。
  • Egg.js 可以与 Electron 渲染进程使用类似 ipcMain/ipcRenderer 的机制,提供一种单独的逻辑层。

4. 分工与模块化

在复杂应用中,可能需要多个层次的 API 服务。你可以用 Egg.js 和 ThinkPHP 分工:
  • Egg.js:负责本地服务和前后端交互。
  • ThinkPHP:负责业务逻辑和数据库处理。

哪些情况可以直接移除 Egg.js?

如果你的项目目标非常简单,例如:
  1. 纯粹的数据库/业务接口由 ThinkPHP 提供服务,且不涉及任何本地服务逻辑。
  1. 你的桌面应用功能不需要用到其他本地 API。
  1. 你的 Electron 应用前后端通信可以直接通过 AJAX 或 WebSocket 与 ThinkPHP 通信(而不是通过 Egg.js 转发)。
这种情况下,Egg.js 服务的作用可以完全由 ThinkPHP 取代,那么直接移除 Egg.js 是完全可以的。

移除 Egg.js 后的架构示例

如果移除了 Egg.js,本地架构会变得简单:
  1. 后端服务:ThinkPHP 提供所有的后端 API(本地运行的 PHP 内置服务,或远程云端服务)。
  1. Electron 主进程
      • 负责启动 ThinkPHP 服务(通过 php 子进程)。
      • 管理应用生命周期。
  1. Electron 渲染进程
      • 前端页面直接通过 AJAX 或 fetch 与 ThinkPHP API 通信,获取和推送数据。
整体系统的请求流如下:

plain

Electron 前端 --> ThinkPHP API 服务
Plain text

保留 Egg.js 的架构示例

如果 ThinkPHP 和 Egg.js 同时存在,你可以定义它们的职责边界,以支持更复杂的需求:
  1. ThinkPHP:
      • 提供主要的业务逻辑(如用户登录、订单管理、数据存储等)。
      • ThinkPHP 运行在一个本地的 PHP 服务器上,由 Electron 主进程启动。
  1. Egg.js:
      • 提供本地化服务,比如文件系统操作、调用系统 API 或管理 Electron 的进程、窗口等。
      • 作为代理或中间层,将部分请求转发到 ThinkPHP,从而对 ThinkPHP 服务进行“封装”。
请求流示例:
  1. Electron 前端调用 Egg.js 的接口(本地主机 http://127.0.0.1:7001)。
  1. Egg.js 根据请求决定:
      • 是否处理请求(如文件操作、通知管理)。
      • 或者将请求转发给 ThinkPHP 并返回其响应。

plain

Electron 前端 --> Egg.js 服务 --> ThinkPHP 服务
Plain text

结论

  1. 移除 Egg.js 的推荐场景:
      • 如果 ThinkPHP 可以完全满足您的所有后端 API 需求,并且不需要本地 API 或代理层。
      • 您希望项目架构精简,便于维护。
  1. 保留 Egg.js 的推荐场景:
      • 如果项目中有较多本地功能需要实现(本地文件系统、通知、系统调用保护等)。
      • 如果需要一个代理层来封装或增强 ThinkPHP 提供的服务。
      • 如果打算长期扩展项目,Egg.js 可以兼容未来更多 Node.js 插件或功能。
根据实际需求选择合适的架构,可以大幅降低开发和后续维护成本。

ThinkPHP伪静态

  • ThinkPHP 默认支持伪静态,只需结合服务器环境(Apache、Nginx、IIS 或 PHP 内置服务器)配置好对应的 URL 重写规则即可。
  • 开发环境中,直接运行 php think run,伪静态 URL 通常无需额外配置。
  • 生产环境中,一般推荐使用 Nginx 或 Apache 配置伪静态,避免暴露入口文件(如 index.php),从而让 URL 更加优雅、美观,并对 SEO 友好。

使用ai询问,然后手动实践,再修改文档.过程耗时将近2小时.算是初步的electron-egg 可以引入thinkphp来使用了. (electron-egg 引入tp的意义就是在于折腾.)
💡
打包目前只测了win平台.
打包构建前需要把api目录移动到build/extraResources目录下(可以手动移动或者使用命令移动)
php.exe后面可以更换成 static-php-cli
thinkphp构建成phar
php启动动态端口,前端动态获取php执行端口.
当然这些玩法需要折腾,使用内置的node 或者集成好的go也是不错的选择.
 

Loading...
brain.js构建训练神经网络

brain.js构建训练神经网络


初识quasar浏览器扩展

初识quasar浏览器扩展