From 0322596b91aed3666612441d999008e9551d622e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 05:11:29 +0000 Subject: [PATCH 01/21] =?UTF-8?q?electron=E5=B0=8F=E7=99=BD=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E2=80=94js=E6=96=87=E4=BB=B6=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈嘉旭 <12092666+dream-of-love@user.noreply.gitee.com> --- ...07\344\273\266\347\220\206\350\247\243.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 "RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" new file mode 100644 index 0000000..119ccf4 --- /dev/null +++ "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" @@ -0,0 +1,71 @@ + +```markdown +# Electron学习笔记 + +## 1.6 +--基于框架学习 + +### 主进程index.js + +#### 定义了一个静态方法getWindow,用于获取或创建一个 Electron 的浏览器窗口。具体功能如下: +1. 检查this.browserWindow是否存在。 +2. 如果不存在,则创建一个新的BrowserWindow实例,并调用onCreate方法进行初始化,最后返回该实例。 +3. 如果已存在,则直接返回现有的browserWindow。 + +#### 配置 Electron 应用的主窗口,包括窗口大小、初始状态、菜单栏设置以及 WebPreferences 的详细配置,确保应用在启动时能够按照预期的行为进行渲染和交互。 + +#### 创建和初始化一个Electron应用窗口的静态方法onCreate。主要功能如下: +1. 监听窗口准备就绪事件(44-46):当窗口准备好显示时,调用context.show()显示窗口。 +2. 处理新窗口打开请求(47-50):拦截新窗口打开请求,使用默认浏览器打开链接,并拒绝创建新窗口。 +3. 加载开发或生产环境资源(51-56): + - 如果是开发环境且设置了环境变量ELECTRON_RENDERER_URL,则打开开发者工具并加载指定URL。 + - 否则,加载本地HTML文件。 + +#### Electron应用的主进程(main process)部分,主要负责在应用启动时执行一系列初始化操作,并处理窗口管理和应用关闭事件。具体功能如下: +1. 应用准备就绪时: + - 设置应用程序模型ID为com.electron。 + - 监听browser-window-created事件,在创建浏览器窗口时调用utils.optimizer.watchWindowShortcuts(window)方法来监控窗口快捷键。 + - 监听pingIPC消息,并在收到消息时打印pong。 + - 调用createWindow()函数创建主窗口。 + - 监听activate事件,当应用被激活且没有打开的窗口时,重新创建主窗口。 +2. 所有窗口关闭时(73-77): + - 如果操作系统不是macOS(darwin),则退出应用。(苹果系统特点) + +### 预处理进程 +用于在渲染进程(renderer process)中安全地暴露API给网页内容。具体功能如下: +1. 严格模式: + - 使用"use strict"确保代码运行在严格模式下,避免一些常见的编程错误。 +2. 引入依赖: + - 引入electron模块和@electron-toolkit/preload模块。 + - 定义一个空对象api,用于自定义API。 +3. 上下文隔离检查: + - 检查process.contextIsolated是否为true,以确定是否启用了上下文隔离(context isolation)。 +4. 上下文隔离启用时: + - 使用electron.contextBridge.exposeInMainWorld方法将preload.electronAPI和自定义的api暴露给主世界(main world),即网页内容可以访问这些API。 + - 如果暴露过程中发生错误,捕获并打印错误信息。 +5. 上下文隔离未启用时: + - 直接将preload.electronAPI和api挂载到全局window对象上,使网页内容可以直接访问这些API。 + +#### API解释与作用: +- API是一种接口,允许不同软件组件之间进行通信。 +- 在Electron应用中,API通过预加载脚本安全地暴露给渲染进程,以便前端代码可以调用这些API与主进程或其他部分进行交互。 +- api对象可以包含自定义的方法和属性,根据需求进行扩展。 + +### 渲染进程 +配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个
元素,用于作为前端框架的挂载点或放置主要内容。 + +## 综合运行过程 +1. 启动应用: + - 主进程首先启动,等待Electron应用准备就绪。 +2. 创建窗口: + - 主进程调用createWindow()函数,通过IndexWindow.getWindow()创建一个新的浏览器窗口。 + - 窗口配置中指定了预加载脚本../preload/index.js,并在窗口创建后加载index.html文件。 +3. 加载渲染进程: + - 渲染进程加载index.html,设置字符编码、页面标题、内容安全策略,并引入必要的JavaScript模块和CSS样式文件。 + - 渲染进程中的前端代码可以通过预加载脚本暴露的API与主进程进行通信。 +4. 交互与响应: + - 用户与应用交互时,前端代码可以通过暴露的API调用主进程的功能,例如发送IPC消息、获取数据等。 + - 主进程处理这些请求并返回结果,前端根据结果更新UI。 +``` + +这个Markdown文档严格遵循了您提供的原始文档内容,没有添加任何额外的理解或解释,并保持了原有的结构和链接。如果有任何需要进一步调整的地方,请告知! \ No newline at end of file -- Gitee From dc8e49dbfa7790ef66a4b1de5e15fd87194b0588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 06:31:07 +0000 Subject: [PATCH 02/21] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Ru?= =?UTF-8?q?oYi-Geek-Electron/electron=E5=B0=8F=E7=99=BD=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E2=80=94js=E6=96=87=E4=BB=B6=E7=90=86=E8=A7=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\344\273\266\347\220\206\350\247\243.md" | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 "RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" deleted file mode 100644 index 119ccf4..0000000 --- "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" +++ /dev/null @@ -1,71 +0,0 @@ - -```markdown -# Electron学习笔记 - -## 1.6 ---基于框架学习 - -### 主进程index.js - -#### 定义了一个静态方法getWindow,用于获取或创建一个 Electron 的浏览器窗口。具体功能如下: -1. 检查this.browserWindow是否存在。 -2. 如果不存在,则创建一个新的BrowserWindow实例,并调用onCreate方法进行初始化,最后返回该实例。 -3. 如果已存在,则直接返回现有的browserWindow。 - -#### 配置 Electron 应用的主窗口,包括窗口大小、初始状态、菜单栏设置以及 WebPreferences 的详细配置,确保应用在启动时能够按照预期的行为进行渲染和交互。 - -#### 创建和初始化一个Electron应用窗口的静态方法onCreate。主要功能如下: -1. 监听窗口准备就绪事件(44-46):当窗口准备好显示时,调用context.show()显示窗口。 -2. 处理新窗口打开请求(47-50):拦截新窗口打开请求,使用默认浏览器打开链接,并拒绝创建新窗口。 -3. 加载开发或生产环境资源(51-56): - - 如果是开发环境且设置了环境变量ELECTRON_RENDERER_URL,则打开开发者工具并加载指定URL。 - - 否则,加载本地HTML文件。 - -#### Electron应用的主进程(main process)部分,主要负责在应用启动时执行一系列初始化操作,并处理窗口管理和应用关闭事件。具体功能如下: -1. 应用准备就绪时: - - 设置应用程序模型ID为com.electron。 - - 监听browser-window-created事件,在创建浏览器窗口时调用utils.optimizer.watchWindowShortcuts(window)方法来监控窗口快捷键。 - - 监听pingIPC消息,并在收到消息时打印pong。 - - 调用createWindow()函数创建主窗口。 - - 监听activate事件,当应用被激活且没有打开的窗口时,重新创建主窗口。 -2. 所有窗口关闭时(73-77): - - 如果操作系统不是macOS(darwin),则退出应用。(苹果系统特点) - -### 预处理进程 -用于在渲染进程(renderer process)中安全地暴露API给网页内容。具体功能如下: -1. 严格模式: - - 使用"use strict"确保代码运行在严格模式下,避免一些常见的编程错误。 -2. 引入依赖: - - 引入electron模块和@electron-toolkit/preload模块。 - - 定义一个空对象api,用于自定义API。 -3. 上下文隔离检查: - - 检查process.contextIsolated是否为true,以确定是否启用了上下文隔离(context isolation)。 -4. 上下文隔离启用时: - - 使用electron.contextBridge.exposeInMainWorld方法将preload.electronAPI和自定义的api暴露给主世界(main world),即网页内容可以访问这些API。 - - 如果暴露过程中发生错误,捕获并打印错误信息。 -5. 上下文隔离未启用时: - - 直接将preload.electronAPI和api挂载到全局window对象上,使网页内容可以直接访问这些API。 - -#### API解释与作用: -- API是一种接口,允许不同软件组件之间进行通信。 -- 在Electron应用中,API通过预加载脚本安全地暴露给渲染进程,以便前端代码可以调用这些API与主进程或其他部分进行交互。 -- api对象可以包含自定义的方法和属性,根据需求进行扩展。 - -### 渲染进程 -配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个
元素,用于作为前端框架的挂载点或放置主要内容。 - -## 综合运行过程 -1. 启动应用: - - 主进程首先启动,等待Electron应用准备就绪。 -2. 创建窗口: - - 主进程调用createWindow()函数,通过IndexWindow.getWindow()创建一个新的浏览器窗口。 - - 窗口配置中指定了预加载脚本../preload/index.js,并在窗口创建后加载index.html文件。 -3. 加载渲染进程: - - 渲染进程加载index.html,设置字符编码、页面标题、内容安全策略,并引入必要的JavaScript模块和CSS样式文件。 - - 渲染进程中的前端代码可以通过预加载脚本暴露的API与主进程进行通信。 -4. 交互与响应: - - 用户与应用交互时,前端代码可以通过暴露的API调用主进程的功能,例如发送IPC消息、获取数据等。 - - 主进程处理这些请求并返回结果,前端根据结果更新UI。 -``` - -这个Markdown文档严格遵循了您提供的原始文档内容,没有添加任何额外的理解或解释,并保持了原有的结构和链接。如果有任何需要进一步调整的地方,请告知! \ No newline at end of file -- Gitee From cb3402d00441a143732b2f0953b48b7736b91842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 06:31:35 +0000 Subject: [PATCH 03/21] =?UTF-8?q?electron=E5=B0=8F=E7=99=BD=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E2=80=94js=E6=96=87=E4=BB=B6=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈嘉旭 <12092666+dream-of-love@user.noreply.gitee.com> --- ...07\344\273\266\347\220\206\350\247\243.md" | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 "RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" new file mode 100644 index 0000000..5cbbbb7 --- /dev/null +++ "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" @@ -0,0 +1,73 @@ +```markdown +# Electron学习笔记 + +--基于框架学习 + +### 主进程index.js +!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/electindex.jpg) +#### 定义了一个静态方法getWindow,用于获取或创建一个 Electron 的浏览器窗口。具体功能如下: +1. 检查this.browserWindow是否存在。 +2. 如果不存在,则创建一个新的BrowserWindow实例,并调用onCreate方法进行初始化,最后返回该实例。 +3. 如果已存在,则直接返回现有的browserWindow。 +!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/elecindex流程图.png) + +!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/electron主窗口.jpg) +#### 配置 Electron 应用的主窗口,包括窗口大小、初始状态、菜单栏设置以及 WebPreferences 的详细配置,确保应用在启动时能够按照预期的行为进行渲染和交互。 + +!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/main.jpg) +#### 创建和初始化一个Electron应用窗口的静态方法onCreate。主要功能如下: +1. 监听窗口准备就绪事件(44-46):当窗口准备好显示时,调用context.show()显示窗口。 +2. 处理新窗口打开请求(47-50):拦截新窗口打开请求,使用默认浏览器打开链接,并拒绝创建新窗口。 +3. 加载开发或生产环境资源(51-56): + - 如果是开发环境且设置了环境变量ELECTRON_RENDERER_URL,则打开开发者工具并加载指定URL。 + - 否则,加载本地HTML文件。 +!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/oncreate.jpg) +#### Electron应用的主进程(main process)部分,主要负责在应用启动时执行一系列初始化操作,并处理窗口管理和应用关闭事件。具体功能如下: +1. 应用准备就绪时: + - 设置应用程序模型ID为com.electron。 + - 监听browser-window-created事件,在创建浏览器窗口时调用utils.optimizer.watchWindowShortcuts(window)方法来监控窗口快捷键。 + - 监听pingIPC消息,并在收到消息时打印pong。 + - 调用createWindow()函数创建主窗口。 + - 监听activate事件,当应用被激活且没有打开的窗口时,重新创建主窗口。 +2. 所有窗口关闭时(73-77): + - 如果操作系统不是macOS(darwin),则退出应用。(苹果系统特点) + +### 预处理进程 +!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/preload.jpg) +用于在渲染进程(renderer process)中安全地暴露API给网页内容。具体功能如下: +1. 严格模式: + - 使用"use strict"确保代码运行在严格模式下,避免一些常见的编程错误。 +2. 引入依赖: + - 引入electron模块和@electron-toolkit/preload模块。 + - 定义一个空对象api,用于自定义API。 +3. 上下文隔离检查: + - 检查process.contextIsolated是否为true,以确定是否启用了上下文隔离(context isolation)。 +4. 上下文隔离启用时: + - 使用electron.contextBridge.exposeInMainWorld方法将preload.electronAPI和自定义的api暴露给主世界(main world),即网页内容可以访问这些API。 + - 如果暴露过程中发生错误,捕获并打印错误信息。 +5. 上下文隔离未启用时: + - 直接将preload.electronAPI和api挂载到全局window对象上,使网页内容可以直接访问这些API。 +#### API解释与作用: +- API是一种接口,允许不同软件组件之间进行通信。 +- 在Electron应用中,API通过预加载脚本安全地暴露给渲染进程,以便前端代码可以调用这些API与主进程或其他部分进行交互。 +- api对象可以包含自定义的方法和属性,根据需求进行扩展。 + +### 渲染进程 +!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/渲染.jpg) +配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个
元素,用于作为前端框架的挂载点或放置主要内容。 + +## 综合运行过程 +1. 启动应用: + - 主进程首先启动,等待Electron应用准备就绪。 +2. 创建窗口: + - 主进程调用createWindow()函数,通过IndexWindow.getWindow()创建一个新的浏览器窗口。 + - 窗口配置中指定了预加载脚本../preload/index.js,并在窗口创建后加载index.html文件。 +3. 加载渲染进程: + - 渲染进程加载index.html,设置字符编码、页面标题、内容安全策略,并引入必要的JavaScript模块和CSS样式文件。 + - 渲染进程中的前端代码可以通过预加载脚本暴露的API与主进程进行通信。 +4. 交互与响应: + - 用户与应用交互时,前端代码可以通过暴露的API调用主进程的功能,例如发送IPC消息、获取数据等。 + - 主进程处理这些请求并返回结果,前端根据结果更新UI。 +``` + +这个Markdown文档严格遵循了您提供的原始文档内容,没有添加任何额外的理解或解释,并保持了原有的结构和链接。如果有任何需要进一步调整的地方,请告知! -- Gitee From 1432e78d17015507d0b666c77a59d3b2c6d0f4f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 10:08:04 +0000 Subject: [PATCH 04/21] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Ru?= =?UTF-8?q?oYi-Geek-Electron/electron=E5=B0=8F=E7=99=BD=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E2=80=94js=E6=96=87=E4=BB=B6=E7=90=86=E8=A7=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\344\273\266\347\220\206\350\247\243.md" | 73 ------------------- 1 file changed, 73 deletions(-) delete mode 100644 "RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" deleted file mode 100644 index 5cbbbb7..0000000 --- "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" +++ /dev/null @@ -1,73 +0,0 @@ -```markdown -# Electron学习笔记 - ---基于框架学习 - -### 主进程index.js -!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/electindex.jpg) -#### 定义了一个静态方法getWindow,用于获取或创建一个 Electron 的浏览器窗口。具体功能如下: -1. 检查this.browserWindow是否存在。 -2. 如果不存在,则创建一个新的BrowserWindow实例,并调用onCreate方法进行初始化,最后返回该实例。 -3. 如果已存在,则直接返回现有的browserWindow。 -!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/elecindex流程图.png) - -!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/electron主窗口.jpg) -#### 配置 Electron 应用的主窗口,包括窗口大小、初始状态、菜单栏设置以及 WebPreferences 的详细配置,确保应用在启动时能够按照预期的行为进行渲染和交互。 - -!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/main.jpg) -#### 创建和初始化一个Electron应用窗口的静态方法onCreate。主要功能如下: -1. 监听窗口准备就绪事件(44-46):当窗口准备好显示时,调用context.show()显示窗口。 -2. 处理新窗口打开请求(47-50):拦截新窗口打开请求,使用默认浏览器打开链接,并拒绝创建新窗口。 -3. 加载开发或生产环境资源(51-56): - - 如果是开发环境且设置了环境变量ELECTRON_RENDERER_URL,则打开开发者工具并加载指定URL。 - - 否则,加载本地HTML文件。 -!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/oncreate.jpg) -#### Electron应用的主进程(main process)部分,主要负责在应用启动时执行一系列初始化操作,并处理窗口管理和应用关闭事件。具体功能如下: -1. 应用准备就绪时: - - 设置应用程序模型ID为com.electron。 - - 监听browser-window-created事件,在创建浏览器窗口时调用utils.optimizer.watchWindowShortcuts(window)方法来监控窗口快捷键。 - - 监听pingIPC消息,并在收到消息时打印pong。 - - 调用createWindow()函数创建主窗口。 - - 监听activate事件,当应用被激活且没有打开的窗口时,重新创建主窗口。 -2. 所有窗口关闭时(73-77): - - 如果操作系统不是macOS(darwin),则退出应用。(苹果系统特点) - -### 预处理进程 -!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/preload.jpg) -用于在渲染进程(renderer process)中安全地暴露API给网页内容。具体功能如下: -1. 严格模式: - - 使用"use strict"确保代码运行在严格模式下,避免一些常见的编程错误。 -2. 引入依赖: - - 引入electron模块和@electron-toolkit/preload模块。 - - 定义一个空对象api,用于自定义API。 -3. 上下文隔离检查: - - 检查process.contextIsolated是否为true,以确定是否启用了上下文隔离(context isolation)。 -4. 上下文隔离启用时: - - 使用electron.contextBridge.exposeInMainWorld方法将preload.electronAPI和自定义的api暴露给主世界(main world),即网页内容可以访问这些API。 - - 如果暴露过程中发生错误,捕获并打印错误信息。 -5. 上下文隔离未启用时: - - 直接将preload.electronAPI和api挂载到全局window对象上,使网页内容可以直接访问这些API。 -#### API解释与作用: -- API是一种接口,允许不同软件组件之间进行通信。 -- 在Electron应用中,API通过预加载脚本安全地暴露给渲染进程,以便前端代码可以调用这些API与主进程或其他部分进行交互。 -- api对象可以包含自定义的方法和属性,根据需求进行扩展。 - -### 渲染进程 -!(https://gitee.com/dream-of-love/publish-required-materials/blob/master/渲染.jpg) -配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个
元素,用于作为前端框架的挂载点或放置主要内容。 - -## 综合运行过程 -1. 启动应用: - - 主进程首先启动,等待Electron应用准备就绪。 -2. 创建窗口: - - 主进程调用createWindow()函数,通过IndexWindow.getWindow()创建一个新的浏览器窗口。 - - 窗口配置中指定了预加载脚本../preload/index.js,并在窗口创建后加载index.html文件。 -3. 加载渲染进程: - - 渲染进程加载index.html,设置字符编码、页面标题、内容安全策略,并引入必要的JavaScript模块和CSS样式文件。 - - 渲染进程中的前端代码可以通过预加载脚本暴露的API与主进程进行通信。 -4. 交互与响应: - - 用户与应用交互时,前端代码可以通过暴露的API调用主进程的功能,例如发送IPC消息、获取数据等。 - - 主进程处理这些请求并返回结果,前端根据结果更新UI。 -``` - -这个Markdown文档严格遵循了您提供的原始文档内容,没有添加任何额外的理解或解释,并保持了原有的结构和链接。如果有任何需要进一步调整的地方,请告知! -- Gitee From 6bace79e02063e02e658819729fe59743123e6b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 10:08:25 +0000 Subject: [PATCH 05/21] =?UTF-8?q?electron=E5=B0=8F=E7=99=BD=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E2=80=94js=E6=96=87=E4=BB=B6=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈嘉旭 <12092666+dream-of-love@user.noreply.gitee.com> --- ...07\344\273\266\347\220\206\350\247\243.md" | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 "RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" new file mode 100644 index 0000000..3be7485 --- /dev/null +++ "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" @@ -0,0 +1,181 @@ +# Electron学习笔记 + +--基于框架学习 + +# 主进程index.js + +### getwindow() + +```bash + static getWindow() { + if (!this.browserWindow) { + this.browserWindow = new electron.BrowserWindow(this.browserWindowOptions); + this.onCreate(this.browserWindow); + return this.browserWindow; + } else { + return this.browserWindow; + } + } +} +``` + +定义了一个静态方法 getWindow,用于获取或创建一个 Electron 的浏览器窗口。具体功能如下: + +1. 检查 this.browserWindow 是否存在。 +2. 如果不存在,则创建一个新的 BrowserWindow 实例,并调用 onCreate 方法进行初始化,最后返回该实例。 +3. 如果已存在,则直接返回现有的 browserWindow。 + +流程图 +### 配置应用主窗口 + +```bash +class IndexWindow extends BaseWindow { + static browserWindowOptions = { + width: 900, + height: 670, + show: false, + autoHideMenuBar: true, + ...process.platform === "linux" ? { icon } : {}, + webPreferences: { + preload: path.join(__dirname, "../preload/index.js"), + sandbox: false, + nodeIntegration: true, + // 开启自带node环境 + webviewTag: true, + // 开启webview + contextIsolation: true, + // 开启context上下文 + webSecurity: false, + // 开启网络安全 + allowRunningInsecureContent: true + // 允许运行不安全内容 + } + }; +``` + +配置 Electron 应用的主窗口,包括窗口大小、初始状态、菜单栏设置以及 WebPreferences 的详细配置,确保应用在启动时能够按照预期的行为进行渲染和交互。 + +### onCreate + +```bash +static onCreate(context) { + context.on("ready-to-show", () => { + context.show(); + }); + context.webContents.setWindowOpenHandler((details) => { + electron.shell.openExternal(details.url); + return { action: "deny" }; + }); + if (utils.is.dev && process.env["ELECTRON_RENDERER_URL"]) { + context.webContents.openDevTools(); + context.loadURL(process.env["ELECTRON_RENDERER_URL"]); + } else { + context.loadFile(path.join(__dirname, "../renderer/index.html")); + } + } +} + +``` + +创建和初始化一个Electron应用窗口的静态方法onCreate。主要功能如下: + +1. 监听窗口准备就绪事件(44-46):当窗口准备好显示时,调用context.show()显示窗口。 +2. 处理新窗口打开请求(47-50):拦截新窗口打开请求,使用默认浏览器打开链接,并拒绝创建新窗口。 +3. 加载开发或生产环境资源(51-56): + o 如果是开发环境且设置了环境变量ELECTRON_RENDERER_URL,则打开开发者工具并加载指定URL。 + o 否则,加载本地HTML文件。 + +# 应用主进程 + +```ts +electron.app.whenReady().then(() => { + utils.electronApp.setAppUserModelId("com.electron"); + electron.app.on("browser-window-created", (_, window) => { + utils.optimizer.watchWindowShortcuts(window); + }); + electron.ipcMain.on("ping", () => console.log("pong")); + createWindow(); + electron.app.on("activate", function() { + if (electron.BrowserWindow.getAllWindows().length === 0) createWindow(); + }); +}); +electron.app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + electron.app.quit(); + } +}); +Electron应用的主进程(main process)部分,主要负责在应用启动时执行一系列初始化操作,并处理窗口管理和应用关闭事件。具体功能如下: +1. 应用准备就绪时: +o 设置应用程序模型ID为com.electron。 +o 监听browser-window-created事件,在创建浏览器窗口时调用utils.optimizer.watchWindowShortcuts(window)方法来监控窗口快捷键。 +o 监听ping IPC消息,并在收到消息时打印pong。 +o 调用createWindow()函数创建主窗口。 +o 监听activate事件,当应用被激活且没有打开的窗口时,重新创建主窗口。 +2. 所有窗口关闭时: +o 如果操作系统不是macOS(darwin),则退出应用。(苹果系统特点) + +``` + +# 预处理进程: + +```ts +"use strict"; +const electron = require("electron"); +const preload = require("@electron-toolkit/preload"); +const api = {}; +if (process.contextIsolated) { + try { + electron.contextBridge.exposeInMainWorld("electron", preload.electronAPI); + electron.contextBridge.exposeInMainWorld("api", api); + } catch (error) { + console.error(error); + } +} else { + window.electron = preload.electronAPI; + window.api = api; +} +``` + +用于在渲染进程(renderer process)中安全地暴露API给网页内容。具体功能如下: + +1. 严格模式: + o 使用"use strict"确保代码运行在严格模式下,避免一些常见的编程错误。 +2. 引入依赖: + o 引入electron模块和@electron-toolkit/preload模块。 + o 定义一个空对象api,用于自定义API。 +3. 上下文隔离检查: + o 检查process.contextIsolated是否为true,以确定是否启用了上下文隔离(context isolation)。 +4. 上下文隔离启用时: + o 使用electron.contextBridge.exposeInMainWorld方法将preload.electronAPI和自定义的api暴露给主世界(main world),即网页内容可以访问这些API。 + o 如果暴露过程中发生错误,捕获并打印错误信息。 +5. 上下文隔离未启用时: + o 直接将preload.electronAPI和api挂载到全局window对象上,使网页内容可以直接访问这些API。 + +#API解释与作用: +• API 是一种接口,允许不同软件组件之间进行通信。 +• 在Electron应用中,API通过预加载脚本安全地暴露给渲染进程,以便前端代码可以调用这些API与主进程或其他部分进行交互。 +• api对象可以包含自定义的方法和属性,根据需求进行扩展。 + +#渲染进程 + +```ts + + + + Electron + + + + + + + +
+ + +``` + +配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个`
`元素,用于作为前端框架的挂载点或放置主要内容。 -- Gitee From caebd537b98f87c1af86b9a149d1124f0f3e64c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 10:09:15 +0000 Subject: [PATCH 06/21] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RuoYi-Geek-Electron/image/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 RuoYi-Geek-Electron/image/.keep diff --git a/RuoYi-Geek-Electron/image/.keep b/RuoYi-Geek-Electron/image/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 299533fa7233a58e8bdd2c3ea6dde8ddb79e20ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 10:09:48 +0000 Subject: [PATCH 07/21] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈嘉旭 <12092666+dream-of-love@user.noreply.gitee.com> --- RuoYi-Geek-Electron/image/x-lct.png | Bin 0 -> 39060 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 RuoYi-Geek-Electron/image/x-lct.png diff --git a/RuoYi-Geek-Electron/image/x-lct.png b/RuoYi-Geek-Electron/image/x-lct.png new file mode 100644 index 0000000000000000000000000000000000000000..fc15f745013ce0d0f64ba50f592b4de3d0434fde GIT binary patch literal 39060 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

%u#ov||rkv_4bqhjWD@&{CnHPaA{GFROI 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 literal 0 HcmV?d00001 -- Gitee From d55f45dac5170406f65f1206973b68ff262a28ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 10:25:33 +0000 Subject: [PATCH 08/21] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Ru?= =?UTF-8?q?oYi-Geek-Electron/electron=E5=B0=8F=E7=99=BD=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E2=80=94js=E6=96=87=E4=BB=B6=E7=90=86=E8=A7=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\344\273\266\347\220\206\350\247\243.md" | 181 ------------------ 1 file changed, 181 deletions(-) delete mode 100644 "RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" deleted file mode 100644 index 3be7485..0000000 --- "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" +++ /dev/null @@ -1,181 +0,0 @@ -# Electron学习笔记 - ---基于框架学习 - -# 主进程index.js - -### getwindow() - -```bash - static getWindow() { - if (!this.browserWindow) { - this.browserWindow = new electron.BrowserWindow(this.browserWindowOptions); - this.onCreate(this.browserWindow); - return this.browserWindow; - } else { - return this.browserWindow; - } - } -} -``` - -定义了一个静态方法 getWindow,用于获取或创建一个 Electron 的浏览器窗口。具体功能如下: - -1. 检查 this.browserWindow 是否存在。 -2. 如果不存在,则创建一个新的 BrowserWindow 实例,并调用 onCreate 方法进行初始化,最后返回该实例。 -3. 如果已存在,则直接返回现有的 browserWindow。 - -流程图 -### 配置应用主窗口 - -```bash -class IndexWindow extends BaseWindow { - static browserWindowOptions = { - width: 900, - height: 670, - show: false, - autoHideMenuBar: true, - ...process.platform === "linux" ? { icon } : {}, - webPreferences: { - preload: path.join(__dirname, "../preload/index.js"), - sandbox: false, - nodeIntegration: true, - // 开启自带node环境 - webviewTag: true, - // 开启webview - contextIsolation: true, - // 开启context上下文 - webSecurity: false, - // 开启网络安全 - allowRunningInsecureContent: true - // 允许运行不安全内容 - } - }; -``` - -配置 Electron 应用的主窗口,包括窗口大小、初始状态、菜单栏设置以及 WebPreferences 的详细配置,确保应用在启动时能够按照预期的行为进行渲染和交互。 - -### onCreate - -```bash -static onCreate(context) { - context.on("ready-to-show", () => { - context.show(); - }); - context.webContents.setWindowOpenHandler((details) => { - electron.shell.openExternal(details.url); - return { action: "deny" }; - }); - if (utils.is.dev && process.env["ELECTRON_RENDERER_URL"]) { - context.webContents.openDevTools(); - context.loadURL(process.env["ELECTRON_RENDERER_URL"]); - } else { - context.loadFile(path.join(__dirname, "../renderer/index.html")); - } - } -} - -``` - -创建和初始化一个Electron应用窗口的静态方法onCreate。主要功能如下: - -1. 监听窗口准备就绪事件(44-46):当窗口准备好显示时,调用context.show()显示窗口。 -2. 处理新窗口打开请求(47-50):拦截新窗口打开请求,使用默认浏览器打开链接,并拒绝创建新窗口。 -3. 加载开发或生产环境资源(51-56): - o 如果是开发环境且设置了环境变量ELECTRON_RENDERER_URL,则打开开发者工具并加载指定URL。 - o 否则,加载本地HTML文件。 - -# 应用主进程 - -```ts -electron.app.whenReady().then(() => { - utils.electronApp.setAppUserModelId("com.electron"); - electron.app.on("browser-window-created", (_, window) => { - utils.optimizer.watchWindowShortcuts(window); - }); - electron.ipcMain.on("ping", () => console.log("pong")); - createWindow(); - electron.app.on("activate", function() { - if (electron.BrowserWindow.getAllWindows().length === 0) createWindow(); - }); -}); -electron.app.on("window-all-closed", () => { - if (process.platform !== "darwin") { - electron.app.quit(); - } -}); -Electron应用的主进程(main process)部分,主要负责在应用启动时执行一系列初始化操作,并处理窗口管理和应用关闭事件。具体功能如下: -1. 应用准备就绪时: -o 设置应用程序模型ID为com.electron。 -o 监听browser-window-created事件,在创建浏览器窗口时调用utils.optimizer.watchWindowShortcuts(window)方法来监控窗口快捷键。 -o 监听ping IPC消息,并在收到消息时打印pong。 -o 调用createWindow()函数创建主窗口。 -o 监听activate事件,当应用被激活且没有打开的窗口时,重新创建主窗口。 -2. 所有窗口关闭时: -o 如果操作系统不是macOS(darwin),则退出应用。(苹果系统特点) - -``` - -# 预处理进程: - -```ts -"use strict"; -const electron = require("electron"); -const preload = require("@electron-toolkit/preload"); -const api = {}; -if (process.contextIsolated) { - try { - electron.contextBridge.exposeInMainWorld("electron", preload.electronAPI); - electron.contextBridge.exposeInMainWorld("api", api); - } catch (error) { - console.error(error); - } -} else { - window.electron = preload.electronAPI; - window.api = api; -} -``` - -用于在渲染进程(renderer process)中安全地暴露API给网页内容。具体功能如下: - -1. 严格模式: - o 使用"use strict"确保代码运行在严格模式下,避免一些常见的编程错误。 -2. 引入依赖: - o 引入electron模块和@electron-toolkit/preload模块。 - o 定义一个空对象api,用于自定义API。 -3. 上下文隔离检查: - o 检查process.contextIsolated是否为true,以确定是否启用了上下文隔离(context isolation)。 -4. 上下文隔离启用时: - o 使用electron.contextBridge.exposeInMainWorld方法将preload.electronAPI和自定义的api暴露给主世界(main world),即网页内容可以访问这些API。 - o 如果暴露过程中发生错误,捕获并打印错误信息。 -5. 上下文隔离未启用时: - o 直接将preload.electronAPI和api挂载到全局window对象上,使网页内容可以直接访问这些API。 - -#API解释与作用: -• API 是一种接口,允许不同软件组件之间进行通信。 -• 在Electron应用中,API通过预加载脚本安全地暴露给渲染进程,以便前端代码可以调用这些API与主进程或其他部分进行交互。 -• api对象可以包含自定义的方法和属性,根据需求进行扩展。 - -#渲染进程 - -```ts - - - - Electron - - - - - - - -

- - -``` - -配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个`
`元素,用于作为前端框架的挂载点或放置主要内容。 -- Gitee From 547c71fdbd18630b348929bd64019ab33b81c6cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Mon, 13 Jan 2025 10:25:59 +0000 Subject: [PATCH 09/21] =?UTF-8?q?electron=E5=B0=8F=E7=99=BD=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E2=80=94js=E6=96=87=E4=BB=B6=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈嘉旭 <12092666+dream-of-love@user.noreply.gitee.com> --- ...07\344\273\266\347\220\206\350\247\243.md" | 180 ++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 "RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" new file mode 100644 index 0000000..aec7179 --- /dev/null +++ "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" @@ -0,0 +1,180 @@ +# Electron学习笔记 + +--基于框架学习 + +# 主进程index.js + +### getwindow() + +```bash + static getWindow() { + if (!this.browserWindow) { + this.browserWindow = new electron.BrowserWindow(this.browserWindowOptions); + this.onCreate(this.browserWindow); + return this.browserWindow; + } else { + return this.browserWindow; + } + } +} +``` + +定义了一个静态方法 getWindow,用于获取或创建一个 Electron 的浏览器窗口。具体功能如下: + +1. 检查 this.browserWindow 是否存在。 +2. 如果不存在,则创建一个新的 BrowserWindow 实例,并调用 onCreate 方法进行初始化,最后返回该实例。 +3. 如果已存在,则直接返回现有的 browserWindow。 + +### 配置应用主窗口 + +```bash +class IndexWindow extends BaseWindow { + static browserWindowOptions = { + width: 900, + height: 670, + show: false, + autoHideMenuBar: true, + ...process.platform === "linux" ? { icon } : {}, + webPreferences: { + preload: path.join(__dirname, "../preload/index.js"), + sandbox: false, + nodeIntegration: true, + // 开启自带node环境 + webviewTag: true, + // 开启webview + contextIsolation: true, + // 开启context上下文 + webSecurity: false, + // 开启网络安全 + allowRunningInsecureContent: true + // 允许运行不安全内容 + } + }; +``` + +配置 Electron 应用的主窗口,包括窗口大小、初始状态、菜单栏设置以及 WebPreferences 的详细配置,确保应用在启动时能够按照预期的行为进行渲染和交互。 + +### onCreate + +```bash +static onCreate(context) { + context.on("ready-to-show", () => { + context.show(); + }); + context.webContents.setWindowOpenHandler((details) => { + electron.shell.openExternal(details.url); + return { action: "deny" }; + }); + if (utils.is.dev && process.env["ELECTRON_RENDERER_URL"]) { + context.webContents.openDevTools(); + context.loadURL(process.env["ELECTRON_RENDERER_URL"]); + } else { + context.loadFile(path.join(__dirname, "../renderer/index.html")); + } + } +} + +``` + +创建和初始化一个Electron应用窗口的静态方法onCreate。主要功能如下: + +1. 监听窗口准备就绪事件(44-46):当窗口准备好显示时,调用context.show()显示窗口。 +2. 处理新窗口打开请求(47-50):拦截新窗口打开请求,使用默认浏览器打开链接,并拒绝创建新窗口。 +3. 加载开发或生产环境资源(51-56): + o 如果是开发环境且设置了环境变量ELECTRON_RENDERER_URL,则打开开发者工具并加载指定URL。 + o 否则,加载本地HTML文件。 + +# 应用主进程 + +```ts +electron.app.whenReady().then(() => { + utils.electronApp.setAppUserModelId("com.electron"); + electron.app.on("browser-window-created", (_, window) => { + utils.optimizer.watchWindowShortcuts(window); + }); + electron.ipcMain.on("ping", () => console.log("pong")); + createWindow(); + electron.app.on("activate", function() { + if (electron.BrowserWindow.getAllWindows().length === 0) createWindow(); + }); +}); +electron.app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + electron.app.quit(); + } +}); +Electron应用的主进程(main process)部分,主要负责在应用启动时执行一系列初始化操作,并处理窗口管理和应用关闭事件。具体功能如下: +1. 应用准备就绪时: +o 设置应用程序模型ID为com.electron。 +o 监听browser-window-created事件,在创建浏览器窗口时调用utils.optimizer.watchWindowShortcuts(window)方法来监控窗口快捷键。 +o 监听ping IPC消息,并在收到消息时打印pong。 +o 调用createWindow()函数创建主窗口。 +o 监听activate事件,当应用被激活且没有打开的窗口时,重新创建主窗口。 +2. 所有窗口关闭时: +o 如果操作系统不是macOS(darwin),则退出应用。(苹果系统特点) + +``` + +# 预处理进程: + +```ts +"use strict"; +const electron = require("electron"); +const preload = require("@electron-toolkit/preload"); +const api = {}; +if (process.contextIsolated) { + try { + electron.contextBridge.exposeInMainWorld("electron", preload.electronAPI); + electron.contextBridge.exposeInMainWorld("api", api); + } catch (error) { + console.error(error); + } +} else { + window.electron = preload.electronAPI; + window.api = api; +} +``` + +用于在渲染进程(renderer process)中安全地暴露API给网页内容。具体功能如下: + +1. 严格模式: + o 使用"use strict"确保代码运行在严格模式下,避免一些常见的编程错误。 +2. 引入依赖: + o 引入electron模块和@electron-toolkit/preload模块。 + o 定义一个空对象api,用于自定义API。 +3. 上下文隔离检查: + o 检查process.contextIsolated是否为true,以确定是否启用了上下文隔离(context isolation)。 +4. 上下文隔离启用时: + o 使用electron.contextBridge.exposeInMainWorld方法将preload.electronAPI和自定义的api暴露给主世界(main world),即网页内容可以访问这些API。 + o 如果暴露过程中发生错误,捕获并打印错误信息。 +5. 上下文隔离未启用时: + o 直接将preload.electronAPI和api挂载到全局window对象上,使网页内容可以直接访问这些API。 + +#API解释与作用: +• API 是一种接口,允许不同软件组件之间进行通信。 +• 在Electron应用中,API通过预加载脚本安全地暴露给渲染进程,以便前端代码可以调用这些API与主进程或其他部分进行交互。 +• api对象可以包含自定义的方法和属性,根据需求进行扩展。 + +#渲染进程 + +```ts + + + + Electron + + + + + + + +
+ + +``` + +配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个`
`元素,用于作为前端框架的挂载点或放置主要内容。 -- Gitee From 18b7c9554e356f57b588aff1590b178a043317e9 Mon Sep 17 00:00:00 2001 From: ttmdawn <2086232477@qq.com> Date: Mon, 13 Jan 2025 18:40:08 +0800 Subject: [PATCH 10/21] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=98=89=E6=97=AD?= =?UTF-8?q?=E7=9A=84=E9=83=A8=E5=88=86=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4js\346\226\207\344\273\266\347\220\206\350\247\243.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" index 3be7485..48b9219 100644 --- "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" +++ "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" @@ -25,7 +25,8 @@ 2. 如果不存在,则创建一个新的 BrowserWindow 实例,并调用 onCreate 方法进行初始化,最后返回该实例。 3. 如果已存在,则直接返回现有的 browserWindow。 -流程图 +流程图 + ### 配置应用主窗口 ```bash @@ -156,7 +157,7 @@ if (process.contextIsolated) { • 在Electron应用中,API通过预加载脚本安全地暴露给渲染进程,以便前端代码可以调用这些API与主进程或其他部分进行交互。 • api对象可以包含自定义的方法和属性,根据需求进行扩展。 -#渲染进程 +# 渲染进程 ```ts @@ -178,4 +179,4 @@ if (process.contextIsolated) { ``` -配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个`
`元素,用于作为前端框架的挂载点或放置主要内容。 +配置了内容安全策略,引入了必要的JavaScript模块和CSS样式文件。页面主体中有一个 `
`元素,用于作为前端框架的挂载点或放置主要内容。 -- Gitee From 3b5baffa642373365f509e08565286ade3bda0d4 Mon Sep 17 00:00:00 2001 From: ttmdawn <2086232477@qq.com> Date: Mon, 13 Jan 2025 18:47:45 +0800 Subject: [PATCH 11/21] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" | 3 --- 1 file changed, 3 deletions(-) diff --git "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" index 8cafc77..48b9219 100644 --- "a/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" +++ "b/RuoYi-Geek-Electron/electron\345\260\217\347\231\275\345\255\246\344\271\240\342\200\224js\346\226\207\344\273\266\347\220\206\350\247\243.md" @@ -25,11 +25,8 @@ 2. 如果不存在,则创建一个新的 BrowserWindow 实例,并调用 onCreate 方法进行初始化,最后返回该实例。 3. 如果已存在,则直接返回现有的 browserWindow。 -<<<<<<< HEAD 流程图 -======= ->>>>>>> 547c71fdbd18630b348929bd64019ab33b81c6cd ### 配置应用主窗口 ```bash -- Gitee From ab6c8688ba89b1517825bb87ec6be672df629bcb Mon Sep 17 00:00:00 2001 From: ttmdawn <2086232477@qq.com> Date: Mon, 13 Jan 2025 21:37:51 +0800 Subject: [PATCH 12/21] =?UTF-8?q?=E9=83=A8=E5=88=86=E5=B0=8F=E4=BF=AE+?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E7=89=88readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 91 ++++++++++++++----- README.md | 37 ++++++++ ...53\351\200\237\345\220\257\345\212\250.md" | 43 --------- 3 files changed, 104 insertions(+), 67 deletions(-) diff --git a/README.en.md b/README.en.md index bd23f84..b0f064c 100644 --- a/README.en.md +++ b/README.en.md @@ -1,36 +1,79 @@ + # RuoYi-Geek-Doc -#### Description -RuoYi-Geek-SpringBoot3、RuoYi-Geek-Vue3、RuoYi-Geek-App、RuoYi-Geek-Electron框架的文档 +## Repository Overview + +This repository is dedicated to housing documentation for various frameworks within the GEEK-XD ecosystem, such as RuoYi-Geek-SpringBoot3, RuoYi-Geek-Vue3, RuoYi-Geek-App, and RuoYi-Geek-Electron. + +## Introduction to the GEEK-XD Ecosystem + +The original versions of RuoYi-Vue and RuoYi-App were built on SpringBoot2 + Vue2 as enterprise-level development frameworks, receiving widespread love and positive feedback from developers. However, with the advancement of technology, SpringBoot3 and Vue3 have gradually caught the attention of developers. To meet the demand for new technologies, the official RuoYi documentation provides an upgrade path from SpringBoot2 to SpringBoot3. At the same time, community-driven versions like RuoYi-Vue3 and RuoYi-App-Vue3 have emerged, showcasing the community's enthusiasm and effort towards technological upgrades. + +However, during the upgrade process, the official methods retained some old features for compatibility with Java 1.8, not fully embracing all the characteristics of SpringBoot3 and Java 17. Meanwhile, the community's RuoYi-Vue3 and RuoYi-App-Vue3 versions, developed by different teams, exhibited some shortcomings in terms of compatibility and integration. More critically, although these versions support TypeScript, they lack a suitable tsconfig.json configuration file, resulting in suboptimal TypeScript syntax hinting environments in mainstream editors like VSCode. + +In response to these issues, the RuoYi-Geek ecosystem was born. It aims to provide developers with a comprehensive solution that retains the core features of the original version while integrating the advantages of community editions. In RuoYi-Geek, we have extensively researched commonly used RuoYi extensions in enterprise development and integrated them directly into the framework to ensure developers can get started quickly and develop efficiently. We have adopted the latest SpringBoot3 + Vue3 tech stack, completely removing old methods retained for Java 1.8 compatibility. Importantly, we have added common tsconfig.json configurations for the TypeScript development environment, ensuring developers receive a more comfortable and convenient syntax hinting experience in editors like VSCode. + +Furthermore, we plan to inject even more super-practical tools into this framework and its companions, making daily development or enterprise projects easier to handle! Imagine having a moment where one of our small tools boosts your efficiency so much it feels like you've got a power-up! We sincerely hope this framework becomes an indispensable assistant to you, making your work less "grueling" and more enjoyable, efficient, and comfortable. XD😄 \\(@^0^@)/ + +RuoYi-Geek is not just a simple upgrade; it's a comprehensive optimization and integration of the RuoYi ecosystem. We believe that through RuoYi-Geek, developers will be able to develop excellent enterprise applications more efficiently and joyfully. + +## Framework Introduction + +### RuoYi-Geek-SpringBoot3 + +This framework is a Java rapid development framework based on SpringBoot3 + Vue3 with front-end and back-end separation. + +This framework represents the Springboot 3 backend version of our ecosystem. Paired with the Vue3 version of the RuoYi Geek ecosystem, this version has carried out foundational design work on payment modules and third-party login modules, and significantly enhanced the code generator, now supporting field-level associated table operations. Additionally, an online API development module has been added, allowing users to modify interfaces using MyBatis online. Other functional modules are continuously being updated and perfected. + +### RuoYi-Geek-Vue3 + +This framework is a Java rapid development framework based on SpringBoot3 + Vue3 with front-end and back-end separation. + +This framework represents the Vue3 frontend version of our ecosystem. Currently, it has added support for three.js, and works alongside the Springboot 3 backend version of the RuoYi Geek ecosystem. This version has also carried out foundational design work on payment modules and third-party login modules, and significantly enhanced the code generator, now supporting field-level associated table operations. Additionally, an online API development module has been added, allowing users to modify interfaces using MyBatis online. Other functional modules are continuously being updated and perfected. + +### RuoYi-Geek-App + +The RuoYi Geek ecosystem App version is a secondary development based on the RuoYi-App framework, adopting the Uniapp combined with Vue3 tech stack. It supports both JavaScript and TypeScript development and is compatible with CSS, SCSS, and Less style languages. For performance optimization, we have implemented initial code segmentation. Moreover, we have integrated uview-plus, uchart, and related templates for reference and use. + +### RuoYi-Geek-Electron + +RuoYi-Geek-Electron aims to build a comfortable desktop application environment for RuoYi-Geek-SpringBoot3 and RuoYi-Geek-Vue3, simplifying development with decorators. It is currently under development. -#### Software Architecture -Software architecture description -#### Installation +# Contact Us: -1. xxxx -2. xxxx -3. xxxx +### Technical Exchange QQ Group: 744785891 -#### Instructions +We welcome all developers interested in RuoYi-Geek to join our community 😆! -1. xxxx -2. xxxx -3. xxxx +QQ QR Code -#### Contribution +### Business Cooperation 😆 -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request +We welcome various opportunities for business cooperation, be it technical consultation, project collaboration, or other forms of partnership. We look forward to working with you to create a future together. +If you are interested, please contact us via the following methods: + + + + + + + + + +
+ QQ
+ QQ Number: 2086232477 +
+ WeChat
+ WeChat ID: tantianming000 +
+ QQ QR Code + + WeChat QR Code +
-#### Gitee Feature +We look forward to establishing long-term and stable cooperative relationships with you and exploring more possibilities together. -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +Note: The images provided are placeholders for QR codes that link to the QQ and WeChat contact information. If these images need to be accessible outside of the Chinese environment, ensure that the links or images are correctly configured for external access. diff --git a/README.md b/README.md index acf8111..c5a8b14 100644 --- a/README.md +++ b/README.md @@ -37,3 +37,40 @@ RuoYi-Geek不仅仅是一个简单的升级版本,更是对于RuoYi生态的 ### RuoYi-Geek-Electron RuoYi-Geek-Electron旨在为RuoYi-Geek-SpringBoot3与RuoYi-Geek-Vue3搭建一个舒适的窗口应用环境,并用装饰器简化开发。目前正在完善中。。。。。。。 + + +# 联系我们: + +### 技术交流群 QQ:744785891 + +欢迎所有对 RuoYi-Geek 感兴趣的开发者加入我们的社区😆! + +QQ二维码 + +### 商业合作😆 + +我们欢迎各类商业合作机会,无论是技术咨询、项目合作还是其他形式的合作,都期待与您携手共创未来。 +如果您有兴趣,请通过以下方式联系我们: + + + + + + + + + + +
+ QQ
+ QQ号:2086232477 +
+ 微信
+ 微信号:tantianming000 +
+ QQ二维码 + + 微信二维码 +
+ +我们期待着与您建立长期稳定的合作关系,并共同探索更多的可能性。 diff --git "a/RuoYi-Geek-Vue3/RuoYi-Geek-Vue3\345\277\253\351\200\237\345\220\257\345\212\250.md" "b/RuoYi-Geek-Vue3/RuoYi-Geek-Vue3\345\277\253\351\200\237\345\220\257\345\212\250.md" index 2edca3e..e78e7e7 100644 --- "a/RuoYi-Geek-Vue3/RuoYi-Geek-Vue3\345\277\253\351\200\237\345\220\257\345\212\250.md" +++ "b/RuoYi-Geek-Vue3/RuoYi-Geek-Vue3\345\277\253\351\200\237\345\220\257\345\212\250.md" @@ -27,12 +27,6 @@ yarn dev # 前端访问地址 http://localhost:80 ``` -## Electron - -electron项目已经迁移至: - -https://gitee.com/geek-xd/ruoyi-geek-electron.git - ## 内置功能 1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 @@ -71,43 +65,6 @@ https://gitee.com/geek-xd/ruoyi-geek-electron.git -### 原有功能演示 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # 联系我们: ### 技术交流群 QQ:744785891 -- Gitee From 08c17068e7fe3c4f7d7333c900a1255839d349b7 Mon Sep 17 00:00:00 2001 From: ttmdawn <2086232477@qq.com> Date: Mon, 13 Jan 2025 21:41:23 +0800 Subject: [PATCH 13/21] =?UTF-8?q?=E5=88=A0=E9=99=A4app=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E9=99=84=E5=BD=95=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pp\345\277\253\351\200\237\345\220\257\345\212\250.md" | 8 -------- 1 file changed, 8 deletions(-) diff --git "a/RuoYi-Geek-App/RuoYi-Geek-App\345\277\253\351\200\237\345\220\257\345\212\250.md" "b/RuoYi-Geek-App/RuoYi-Geek-App\345\277\253\351\200\237\345\220\257\345\212\250.md" index d6b8254..01295ac 100644 --- "a/RuoYi-Geek-App/RuoYi-Geek-App\345\277\253\351\200\237\345\220\257\345\212\250.md" +++ "b/RuoYi-Geek-App/RuoYi-Geek-App\345\277\253\351\200\237\345\220\257\345\212\250.md" @@ -209,14 +209,6 @@ app.use(uviewPlus); -# 附录 - -[Vue3 官网](https://cn.vuejs.org/); -[uniapp 官网](https://uniapp.dcloud.net.cn/); -[uView-plus 官网](https://uiadmin.net/uview-plus/); -[uCharts 官网](https://www.ucharts.cn/v2/#/); -[RuoYi 官网](http://ruoyi.vip/); - # 联系我们: ### 技术交流群 QQ:744785891 -- Gitee From 70626dbf3d5129122fb266a4f24c36519aa07a23 Mon Sep 17 00:00:00 2001 From: ying <2739482286@qq.com> Date: Tue, 14 Jan 2025 13:00:12 +0800 Subject: [PATCH 14/21] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\351\200\237\345\220\257\345\212\250.md" | 0 ...53\351\200\237\345\220\257\345\212\250.md" | 63 +++++++++++++++++++ 2 files changed, 63 insertions(+) delete mode 100644 "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" create mode 100644 "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot\345\277\253\351\200\237\345\220\257\345\212\250.md" diff --git "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" deleted file mode 100644 index e69de29..0000000 diff --git "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot\345\277\253\351\200\237\345\220\257\345\212\250.md" "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot\345\277\253\351\200\237\345\220\257\345\212\250.md" new file mode 100644 index 0000000..6a706b8 --- /dev/null +++ "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot\345\277\253\351\200\237\345\220\257\345\212\250.md" @@ -0,0 +1,63 @@ +# 快速启动 + +## 项目下载到本地 + +利用git将项目从远程仓库拉取到本地,用VSCode打开文件夹 + +``` +git clone https://gitee.com/geek-xd/ruoyi-geek-springboot3.git +``` + +## 配置数据库 + +rouyi-geek-springboot3 —— rouyi-admin —— src ——resources —— application-druid.yml ,按此路径,修改对应数据库用户名username和密码password、数据库名称ry + +``` +# 主库数据源 + MASTER: + url: jdbc:mysql://127.0.0.1/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 123456 +``` + +运行数据库文件,此过程会用到sql文件的存储地址,即rouyi-geek-springboot3 —— sql的路径 + +## 运行项目 + +VSCode中运行,出现RYGeek表示成功 + +# 联系我们: + +### 技术交流群 QQ:744785891 + +欢迎所有对 RuoYi-Geek 感兴趣的开发者加入我们的社区😆! + +QQ二维码 + +### 商业合作😆 + +我们欢迎各类商业合作机会,无论是技术咨询、项目合作还是其他形式的合作,都期待与您携手共创未来。 +如果您有兴趣,请通过以下方式联系我们: + + + + + + + + + + +
+ QQ
+ QQ号:2086232477 +
+ 微信
+ 微信号:tantianming000 +
+ QQ二维码 + + 微信二维码 +
+ +我们期待着与您建立长期稳定的合作关系,并共同探索更多的可能性。 -- Gitee From 9cc98d2d1a0a469f00710dc14bbbd854247341f7 Mon Sep 17 00:00:00 2001 From: ttmdawn <2086232477@qq.com> Date: Tue, 14 Jan 2025 15:25:13 +0800 Subject: [PATCH 15/21] =?UTF-8?q?=E5=B0=8F=E4=BF=AEspringboot3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...t3\345\277\253\351\200\237\345\220\257\345\212\250.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot\345\277\253\351\200\237\345\220\257\345\212\250.md" => "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" (87%) diff --git "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot\345\277\253\351\200\237\345\220\257\345\212\250.md" "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" similarity index 87% rename from "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot\345\277\253\351\200\237\345\220\257\345\212\250.md" rename to "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" index 6a706b8..a2da8e7 100644 --- "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot\345\277\253\351\200\237\345\220\257\345\212\250.md" +++ "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" @@ -14,10 +14,10 @@ rouyi-geek-springboot3 —— rouyi-admin —— src ——resources —— appl ``` # 主库数据源 - MASTER: - url: jdbc:mysql://127.0.0.1/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: root - password: 123456 + MASTER: + url: jdbc:mysql://127.0.0.1/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 123456 ``` 运行数据库文件,此过程会用到sql文件的存储地址,即rouyi-geek-springboot3 —— sql的路径 -- Gitee From a02fbc2f3cad4da11a8d58438ff4a59188acc3b1 Mon Sep 17 00:00:00 2001 From: ying <2739482286@qq.com> Date: Tue, 14 Jan 2025 20:37:22 +0800 Subject: [PATCH 16/21] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\233\256\347\273\223\346\236\204.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204.md" "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204.md" index e69de29..eb9a52c 100644 --- "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204.md" +++ "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204.md" @@ -0,0 +1,48 @@ +本项目是基于 Spring Boot 的后台管理系统,对若依(RuoYi)框架进行完善升级,它具有模块化设计,灵活的系统配置和权限管理等功能。以下是一个典型的框架目录结构示例: + +``` +ruoyi-geek-project/ +├── ruoyi-admin # 后台管理模块 +│ ├── src +│ │ ├── main +│ │ ├── java # Java源代码 +│ │ │ └── com/ruoyi # 主要包路径 +│ │ │ ├── web +│ │ │ │ │──controller #响应输入,处理请求 +│ │ │ │ │── core #基础服务 +│ │ │ ├── RuoYiApplication.java # 启动类 +│ │ │ ├── RuoYiServletInitializer.java # Servlet容器 +│ │ │ +│ │ └── resources # 资源文件 +│ │ ├── application-auth.yml # app配置 +│ │ ├── application-druid.yml # 主数据源配置 +│ │ ├── application-pay.yml # 支付宝配置 +│ │ └── application.yml # 开发环境配置 +│ └── pom.xml # Maven依赖管理 +├── ruoyi-framework # 系统框架模块 +│ ├── src +│ │ ├── main +│ │ ├── aspectj #数据处理 +│ │ │── config #基础配置 +│ │ │── datasource #数据源配置 +│ │ │── interceptor #拦截器 +│ │ │── manager #业务逻辑管理层 +│ │ │──security #应用安全验证 +│ │ └── web # 交互配置 +│ └── pom.xml # Maven依赖管理 +├── ruoyi-middleware # 中间件配置模块 +│ +├── ruoyi-models # 数据模型配置 +│ +├── ruoyi-pay # 支付接口配置 +│ +├── ruoyi-plugins # 扩展功能 +│ +├── ruoyi-system # 系统管理模块 +│ ├── src +│ │ ├── main +│ │ │ ├── java # 框架相关的Java源码 +│ │ │ └── resources # 框架相关的资源文件 +│ └── pom.xml # Maven依赖管理 +└── sql # 数据库脚本目录 +``` -- Gitee From 228a8d84322a5db18fb6faaa15c2504a0976cfad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Tue, 14 Jan 2025 13:45:55 +0000 Subject: [PATCH 17/21] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=9B=AE=E5=BD=95-x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈嘉旭 <12092666+dream-of-love@user.noreply.gitee.com> --- ...\347\233\256\347\273\223\346\236\204-x.md" | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" diff --git "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" new file mode 100644 index 0000000..32ea537 --- /dev/null +++ "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" @@ -0,0 +1,80 @@ +<<<<<<< HEAD + +#RuoYi-Geek-SpringBoot3项目结构 +```bash +├── ruoyi-admin // 管理后台模块 +│ ├── src/main +│ │ ├── java/com/ruoyi //项目的 Java 源代码 +│ │ │ └── web // Web 相关的 Java 类 +│ │ │ ├── RuoYiApplication.java //应用程序主类,用于启动应用程序。 +│ │ │ └── RuoYiServletInitializer.java //Servlet 初始化类 +│ │ └── resources //资源文件 +│ └── target //输出目录 +│ └── pom.xml //配置文件 +├── ruoyi-auth //认证模块 +│ ├── ruoyi-auth-common // 通用模块或库 +│ ├── ruoyi-auth-starter // 启动器 +│ ├── ruoyi-oauth-justauth // OAuth 认证和授权 +│ ├── ruoyi-oauth-wx //微信认证和授权。 +│ ├── ruoyi-tfa-email // 邮件双因素认证 +│ ├── ruoyi-tfa-phone // 手机双因素认证 +│ └── pom.xml //配置文件 +├── ruoyi-common //公共模块 +│ ├── src/main/java/com/ruoyi/common +│ │ ├── annotation // 自定义注解 +│ │ ├── config // 配置类 +│ │ ├── constant // 常量类 +│ │ ├── core // 核心业务逻辑类 +│ │ ├── enums // 缓存枚举类。 +│ │ ├── exception // 异常处理类。 +│ │ ├── filter // 过滤器类。 +│ │ ├── service // 服务层接口和实现类。 +│ │ ├── utils // 工具类。 +│ │ └── xss // 与跨站脚本(XSS)防护相关的类。 +├── ruoyi-framework //框架模块 +│ ├── src/main/java/com/ruoyi/framework +│ │ ├── aspectj //AOP切面 +│ │ ├── config // 配置类 +│ │ ├── datasource // 数据源配置 +│ │ ├── interceptor // 拦截器 +│ │ ├── manager // 管理器 +│ │ ├── security // 安全配置 +│ │ └── web // Web 相关配置 +│ ├── generated-sources // 注解处理器生成的源代码文件 +│ ├── generated-test-sources // 测试注解处理器生成的源代码文件 +├── ruoyi-middleware //中间件模块 +│ ├── ruoyi-middleware-minio // MinIO存储服务 +│ ├── ruoyi-middleware-rabbitmq // 与RabbitMQ消息队列服务 +│ ├── ruoyi-middleware-redis // Redis缓存服务 +│ └── ruoyi-middleware-starter // 中间件启动器 +├── ruoyi-models //模型模块 +│ ├── ruoyi-generator // 代码生成器 +│ ├── ruoyi-models-starter // 模型启动器 +│ ├── ruoyi-online // 在线模块 +│ ├── ruoyi-quartz // 定时任务 +├── ruoyi-pay //支付模块 +│ ├── ruoyi-pay-alipay // 支付宝支付 +│ ├── ruoyi-pay-common // 通用支付组件 +│ ├── ruoyi-pay-sqb // SQB 支付 +│ ├── ruoyi-pay-starter // pay启动器 +│ ├── ruoyi-pay-wx // 微信支付 +└── ruoyi-plugins //插件模块 +│ ├── ruoyi-alibaba-oss // 阿里云 OSS 存储 +│ ├── ruoyi-atomikos // Atomikos事务管理 +│ ├── ruoyi-ehcache // Ehcache 缓存 +│ ├── ruoyi-mybatis-interceptor // MyBatis 拦截 +│ ├── ruoyi-mybatis-jpa // MyBatis 和 JPA 集成 +│ ├── ruoyi-mybatis-plus // MyBatis Plus 扩展 +│ ├── ruoyi-netty // Netty 网络编程 +│ ├── ruoyi-plugins-starter // 插件启动器 +│ ├── ruoyi-websocket // WebSocket支持 +├── ruoyi-system //系统模块 +├── sql //SQL脚本目录 +│ ├── auth.sql //数据库认证SQL 脚本。 +│ ├── create_database.sql // 创建数据库 SQL 脚本。 +│ ├── gen.sql // 生成相关数据SQL 脚本。 +│ ├── online.sql // 在线服务相关SQL 脚本。 +│ ├── pay.sql // 支付相关的 SQL 脚本。 +│ ├── quartz.sql // Quartz 定时任务相关的 SQL 脚本。 +│ └── ry_20230223.sql // 系统初始数据 SQL 脚本。 +``` \ No newline at end of file -- Gitee From f4727ad3aa0821b38e5b830588063625302a5b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Tue, 14 Jan 2025 21:58:22 +0800 Subject: [PATCH 18/21] RuoYi-Geek-SpringBoot3/test.md --- RuoYi-Geek-SpringBoot3/test.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 RuoYi-Geek-SpringBoot3/test.md diff --git a/RuoYi-Geek-SpringBoot3/test.md b/RuoYi-Geek-SpringBoot3/test.md new file mode 100644 index 0000000..e2d9784 --- /dev/null +++ b/RuoYi-Geek-SpringBoot3/test.md @@ -0,0 +1 @@ +# 测试上传 -- Gitee From 9e9994c4a402c797ea28cd437fcdb393b7a1513a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Tue, 14 Jan 2025 14:00:16 +0000 Subject: [PATCH 19/21] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Ru?= =?UTF-8?q?oYi-Geek-SpringBoot3/test.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RuoYi-Geek-SpringBoot3/test.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 RuoYi-Geek-SpringBoot3/test.md diff --git a/RuoYi-Geek-SpringBoot3/test.md b/RuoYi-Geek-SpringBoot3/test.md deleted file mode 100644 index e2d9784..0000000 --- a/RuoYi-Geek-SpringBoot3/test.md +++ /dev/null @@ -1 +0,0 @@ -# 测试上传 -- Gitee From 4ee600b0501e2c8ad650c058d731ef2530615a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Tue, 14 Jan 2025 22:00:40 +0800 Subject: [PATCH 20/21] =?UTF-8?q?RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringB?= =?UTF-8?q?oot3=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84-x.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" index 32ea537..c2efdda 100644 --- "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" +++ "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" @@ -1,6 +1,7 @@ <<<<<<< HEAD -#RuoYi-Geek-SpringBoot3项目结构 +# RuoYi-Geek-SpringBoot3项目结构 + ```bash ├── ruoyi-admin // 管理后台模块 │ ├── src/main @@ -77,4 +78,4 @@ │ ├── pay.sql // 支付相关的 SQL 脚本。 │ ├── quartz.sql // Quartz 定时任务相关的 SQL 脚本。 │ └── ry_20230223.sql // 系统初始数据 SQL 脚本。 -``` \ No newline at end of file +``` -- Gitee From 4317fa66ad83afb263385c2003111c7b2b1facc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=97=AD?= <12092666+dream-of-love@user.noreply.gitee.com> Date: Tue, 14 Jan 2025 22:04:10 +0800 Subject: [PATCH 21/21] =?UTF-8?q?RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringB?= =?UTF-8?q?oot3=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84-x.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ngBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" index c2efdda..d84840c 100644 --- "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" +++ "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" @@ -1,4 +1,3 @@ -<<<<<<< HEAD # RuoYi-Geek-SpringBoot3项目结构 -- Gitee