diff --git a/README.md b/README.md index c5a8b14f3a98eb076e4d037e7c216b84d597f4ec..b13b64d1b57e28c11a7273cc03a138db6ed13bcd 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,6 @@ RuoYi-Geek不仅仅是一个简单的升级版本,更是对于RuoYi生态的 RuoYi-Geek-Electron旨在为RuoYi-Geek-SpringBoot3与RuoYi-Geek-Vue3搭建一个舒适的窗口应用环境,并用装饰器简化开发。目前正在完善中。。。。。。。 - # 联系我们: ### 技术交流群 QQ:744785891 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/1.RuoYi-Geek-App\345\277\253\351\200\237\345\220\257\345\212\250.md" similarity index 100% rename from "RuoYi-Geek-App/RuoYi-Geek-App\345\277\253\351\200\237\345\220\257\345\212\250.md" rename to "RuoYi-Geek-App/1.RuoYi-Geek-App\345\277\253\351\200\237\345\220\257\345\212\250.md" diff --git "a/RuoYi-Geek-Electron/RuoYi-Geek-Electron\345\277\253\351\200\237\345\220\257\345\212\250.md" "b/RuoYi-Geek-Electron/1.RuoYi-Geek-Electron\345\277\253\351\200\237\345\220\257\345\212\250.md" similarity index 100% rename from "RuoYi-Geek-Electron/RuoYi-Geek-Electron\345\277\253\351\200\237\345\220\257\345\212\250.md" rename to "RuoYi-Geek-Electron/1.RuoYi-Geek-Electron\345\277\253\351\200\237\345\220\257\345\212\250.md" diff --git "a/RuoYi-Geek-Electron/2.RuoYi-Geek-Electron\351\241\271\347\233\256\347\273\223\346\236\204-x.md" "b/RuoYi-Geek-Electron/2.RuoYi-Geek-Electron\351\241\271\347\233\256\347\273\223\346\236\204-x.md" new file mode 100644 index 0000000000000000000000000000000000000000..40e7690e511120c7ae9365d16dbec97fcfd0b790 --- /dev/null +++ "b/RuoYi-Geek-Electron/2.RuoYi-Geek-Electron\351\241\271\347\233\256\347\273\223\346\236\204-x.md" @@ -0,0 +1,27 @@ + +# RuoYi-Geek-Electron项目结构 + +```bash +├── build //编译后的文件 +├── dist //发布版本 +├── node_modules //Node.js 依赖包 +├── out //编译输出 +│ ├── main //主进程 +│ ├── preload //预加载 +│ └── renderer //渲染进程 +├── resources //资源 +├── src //源代码(ts) +│ ├── main //主进程 +│ │ ├── annotation // 注解 +│ │ │ ├── BindMapping.ts //绑定映射 +│ │ │ └── WorkerRunner.ts //工作线程运行器 +│ │ └── utils //工具函数 +│ │ └── window //窗口相关 +│ │ │ ├── BaseWindow.ts //基础窗口 +│ │ │ └── IndexWindow.ts //主窗口 +│ │ └── index.ts // 入口 +│ ├── preload //预加载 +│ └── renderer //渲染进程 + + +``` 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/3.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" similarity index 96% rename from "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" rename to "RuoYi-Geek-Electron/3.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 48b9219bd8171c83575837e7944e8fdb42d1c02e..1dc775155bad39bc4aac5cb41f3861f772bebd04 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/3.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" @@ -1,182 +1,182 @@ -# 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样式文件。页面主体中有一个 `
`元素,用于作为前端框架的挂载点或放置主要内容。 +# 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样式文件。页面主体中有一个 `
`元素,用于作为前端框架的挂载点或放置主要内容。 diff --git "a/RuoYi-Geek-SpringBoot3/1.RuoYi-Geek-SpringBoot3\347\256\200\344\273\213.md" "b/RuoYi-Geek-SpringBoot3/1.RuoYi-Geek-SpringBoot3\347\256\200\344\273\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..8544b66048bfccae5ab65417d63072cf02f4040a --- /dev/null +++ "b/RuoYi-Geek-SpringBoot3/1.RuoYi-Geek-SpringBoot3\347\256\200\344\273\213.md" @@ -0,0 +1,54 @@ +RuoYi-Geek-SpringBoot3 是基于Spring Boot 3 和 RuoYi-Geek 框架开发的开源项目,旨在提供一个高效、灵活、易用的后台管理系统解决方案。它结合了 RuoYi 的优秀特性和 Spring Boot 3 的新功能,适合快速开发企业级应用。 + +# 平台简介 + +本平台是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 + +* 前端采用Vue3、Element Plus。 +* 后端采用Spring Boot3、Spring Security、Redis & Jwt。 +* 权限认证使用Jwt,支持多终端认证系统。 +* 支持加载动态权限菜单,多方式轻松权限控制。 +* 高效率开发,使用代码生成器可以一键生成前后端代码。 +* 多数据源与分库分表默认集成 +* 所有非基本模块可随意插拔,让开发更加简单高效 +* 提供了多个工具模块助力开发,如:在线接口模块、mybatis-jpa模块 +* 提供了多个常见业务模块简化开发,如:第三方认证模块、支付模块 +* 提供了多个常见的服务模块集成开发,如:websocket模块、minio模块 + +# 主要特性 + +**核心:模块化架构设计,支持各个模块的快速安拆,对第三方认证、第三方支付模块设计了基础的规范和基础模块。** + +1. **Spring Boot 3 支持** : + +* 基于 Spring Boot 3 开发,充分利用其新特性和性能优化。 +* 支持 Java 17 及以上版本。 +* 改用SpringBoot3+java17的更新的技术栈并改掉所有的弃用的方法。 + +2. **RuoYi-Geek 框架** : + +* 继承了 RuoYi 的模块化设计,便于扩展和维护。 +* 提供丰富的后台管理功能,如用户管理、角色管理、权限管理等。 + + 3. **前后端分离** : +* 前端采用 Vue、Element Plus,后端提供 Spring Boot3、Spring Security、Redis & Jwt,便于前后端独立开发和部署。 + +4. **安全性** : + +* 集成 Spring Security,提供完善的权限控制和认证机制。 +* 支持 JWT 等现代认证方式。 + +5. **数据库支持** : + +* 支持多种数据库,如 MySQL、Oracle 等。 +* 集成 MyBatis-Plus,简化数据库操作。 + +6. **代码生成器** : + +* 升级了代码生成器(配合本项目的vue3版本才可用),使关联表生成更加简单。 + +# 适用场景 + +* **企业级后台管理系统** :适用于需要复杂权限管理和多模块集成的企业应用。 +* **快速开发平台** :适合需要快速搭建原型的项目,减少开发周期。 +* **学习与教学** :适合学习和研究 Spring Boot 3 和 RuoYi 框架的开发者。 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/2.RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" similarity index 100% rename from "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.md" rename to "RuoYi-Geek-SpringBoot3/2.RuoYi-Geek-SpringBoot3\345\277\253\351\200\237\345\220\257\345\212\250.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/3.RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204.md" similarity index 98% rename from "RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204-x.md" rename to "RuoYi-Geek-SpringBoot3/3.RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204.md" index d84840c1138ea4838e392a77c7437a27e59caadd..15c18b011a828b1dce723e35a5fb4139727078c9 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/3.RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204.md" @@ -1,80 +1,80 @@ - -# 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 脚本。 -``` + +# 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 脚本。 +``` diff --git "a/RuoYi-Geek-SpringBoot3/4.SpringBoot3\346\240\270\345\277\203\351\200\273\350\276\221\347\220\206\350\247\243.md" "b/RuoYi-Geek-SpringBoot3/4.SpringBoot3\346\240\270\345\277\203\351\200\273\350\276\221\347\220\206\350\247\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..2bb05760c9460fcc383df9949a58242ffd0da85a --- /dev/null +++ "b/RuoYi-Geek-SpringBoot3/4.SpringBoot3\346\240\270\345\277\203\351\200\273\350\276\221\347\220\206\350\247\243.md" @@ -0,0 +1,81 @@ +# RuoYi-Geek-SpringBoot3核心逻辑理解 + +``` +core +├── controller +│ └── BaseController.java # 控制器基类,处理HTTP请求 +├── domain +│ ├── entity +│ │ ├── FileEntity.java # 文件实体类 +│ │ ├── SysDept.java # 系统部门实体类 +│ │ ├── SysDictData.java # 系统字典数据实体类 +│ │ ├── SysDictType.java # 系统字典类型实体类 +│ │ ├── SysMenu.java # 系统菜单实体类 +│ │ ├── SysRole.java # 系统角色实体类 +│ │ └── SysUser.java # 系统用户实体类 +│ └── model +│ │ ├── LoginBody.java # 登录请求体模型类 +│ │ ├── LoginUser.java # 登录用户模型类 +│ │ ├── RegisterBody.java# 注册请求体模型类 +│ ├── AjaxResult.java # 异步请求结果模型类 +│ ├── BaseEntity.java # 基础实体类 +│ ├── Message.java # 消息模型类 +│ ├── R.java # 响应模型类 +│ ├── TreeEntity.java # 树形实体类 +│ └── TreeSelect.java # 树形选择模型类 +├── page +│ ├── PageDomain.java # 分页领域模型类 +│ ├── TableDataInfo.java # 表格数据信息模型类 +│ └── TableSupport.java # 表格支持类 +├── security\service +│ └── IPermissionService.java # 权限服务接口 +└── text + ├── CharsetKit.java # 字符集工具类 + ├── Convert.java # 转换工具类 + └── StrFormatter.java # 字符串格式化工具类 +``` + + + + +basectr流程图 + +## 分页处理 + +1、startPage:开始分页。 + +2、startOrderBy:设置排序规则。 + +3、clearPage:清理分页线程变量。 + +4、getDataTable:返回分页数据,包含总记录数和当前页的数据列表。 + +## 响应处理 + +1、success:返回成功消息(无参数)。 + +2、error:返回失败消息(无参数)。 + +3、success(String message):返回带有自定义消息的成功响应。 + +4、success(Object data):返回带有数据的成功响应。 + +5、error(String message):返回带有自定义消息的失败响应。 + +6、warn(String message):返回带有警告消息的响应。 + +7、toAjax(int rows):根据影响行数返回成功或失败响应。 + +8、toAjax(boolean result):根据布尔结果返回成功或失败响应。 + +## 用户信息获取 + +1、getLoginUser:获取当前登录用户的缓存信息。 + +2、getUserId:获取当前登录用户的 ID。 + +3、getDeptId:获取当前登录用户的部门 ID。 + +4、getUsername:获取当前登录用户的用户名。 + +5、redirect(String url):页面跳转。 diff --git "a/RuoYi-Geek-SpringBoot3/5.\345\211\215\345\220\216\347\253\257\344\272\244\344\272\222\344\270\216admin\347\220\206\350\247\243.md" "b/RuoYi-Geek-SpringBoot3/5.\345\211\215\345\220\216\347\253\257\344\272\244\344\272\222\344\270\216admin\347\220\206\350\247\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..6dd6ddc3aa70bca820b56ddcf14a087e3ad349e9 --- /dev/null +++ "b/RuoYi-Geek-SpringBoot3/5.\345\211\215\345\220\216\347\253\257\344\272\244\344\272\222\344\270\216admin\347\220\206\350\247\243.md" @@ -0,0 +1,217 @@ +# 交互 + +## 验证码 + +系统发出GET请求,请求方法为captchaImage,向前端发出请求,通过反向代理,url请求前端,进行代理,映射到后端,解决跨域问题 + +验证码请求 + +``` +请求url:http://localhost/dev-api/captchaImage +``` + +login.vue + +``` +
+ +
+ +function getCode() { + getCodeImg().then(res => { + captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled; + if (captchaEnabled.value) { + codeUrl.value = "data:image/gif;base64," + res.img; + loginForm.value.uuid = res.uuid; + } + }); +} +``` + +后端:创建ajax对象,判断是否开启验证码验证,若开启,生成键值,判断生成数字还是字符串类验证码,数字类验证码生成表达式,以@作为分割,做不同处理 + +CacheController.java + +``` +// 映射HTTP GET请求到 /captchaImage 路径上,由 getCode 方法处理。 + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException { + ······ + } +``` + +系统请求 + +## 登录 + +点击登录按钮,是为了把表单提交到后台,系统发出POST请求,请求login方法。具体过程,点击登录后,先执行handleLogin方法,在方法体中执行login方法,封装用户名、密码等信息,返回给POST请求。通过反向代理映射到后端。 + +登录请求 + +``` +请求url: +http://localhost/dev-api/login +``` + +login.vue + +``` + + 登 录 + 登 录 中... + + +function handleLogin() { + ······ +} +``` + +后端:前端输入的信息封装成对象传过来,后端要完成的事情如下:登录前置校验、验证码校验、IP校验、用户验证、生成Token + +用户验证写入操作日志和用户登录日志 + +SysLoginService.java + +``` +// 记录操作日志 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + //修改用户登录信息 + recordLoginInfo(loginUser.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + +``` + +SysLoginController.java + +``` +@PostMapping("/login") + public AjaxResult login(@RequestBody LoginBody loginBody) { + AjaxResult ajax = AjaxResult.success(); + // 生成Token + String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid());//前边那些步骤通过login方法完成 + ajax.put(Constants.TOKEN, token); + return ajax; + } +``` + +# java/com/ruoyi + +## web + +### controller + +#### common + +##### CaptchaController.java:验证码操作处理 + +该控制器处理HTTP GET请求以生成并返回验证码图像,并将验证码信息存储在缓存中以便后续验证使用 + +``` + //通过 @Resource 注解注入了两个不同类型的验证码生产者实例captchaProducer和captchaProducerMath,分别用于生成字符型和数学运算型验证码。 + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; +``` + +##### CommonController.java:文件上传下载 + +该控制器提供了处理通用文件下载和上传请求的功能,包括单文件和多文件上传,以及两种方式的文件下载。通过使用 `@RestController`, `@GetMapping`, 和 `@PostMapping` 注解,使得每个方法可以轻松地映射到HTTP请求上。 + +``` + //映射HTTP GET请求到/download路径上,由filedownload方法处理 + //处理GET请求 /common/download + @GetMapping("/download") + @Anonymous + public void fileDownload( + @RequestParam("fileName") String fileName, + @RequestParam("delete") Boolean delete, + HttpServletResponse response, + HttpServletRequest request) { + + } + +//处理POST请求 /common/upload 以上传单个文件 + @PostMapping("/upload") + @Anonymous + public AjaxResult uploadFile(@RequestBody MultipartFile file) throws Exception { + + } +``` + +#### monitor + +##### CacheController.java:缓存管理 + +该控制器提供了对缓存的监控和管理功能,包括获取缓存名称列表、获取特定缓存中的键列表、获取特定缓存键对应的值、清除特定缓存或所有缓存等操作。 + +``` +//获取缓存值列表,只有monitor:cache:list权限的用户才能访问,设置了路径参数 cacheName 和 cacheKey + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getValue/{cacheName}/{cacheKey}") + + public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) + { + ValueWrapper valueWrapper = CacheUtils.get(cacheName, cacheKey); + //创建一个 SysCache 对象,存储缓存名称、缓存键名和缓存值。 + SysCache sysCache = new SysCache(); + + } +``` + +##### ServerController.java + +该控制器主要用于获取服务器的监控信息,通过调用 `/monitor/server` 这个GET接口,经过权限验证后,可以得到服务器状态的相关信息,并通过RESTful API提供给客户端。 + +##### SysLogininfoController.java + +该控制器主要用于管理系统的访问记录(登录信息),包括获取、导出、删除和清理这些记录,以及解锁用户账户。 + +##### SysUserOnlineController.java + +该控制器主要用于管理操作日志记录,包括获取、导出、删除和清理这些记录。 + +#### system + +SysConfigController.java + +它主要用于管理系统配置参数,允许用户通过HTTP请求执行查询、添加、修改、删除以及导出等操作。 + +SysDeptController.java + +该控制器主要用于管理系统的部门信息,包括获取、查询、新增、修改和删除部门等操作。 + +SysDictDataController.java + +该控制器主要用于管理系统中的数据字典信息,包括查询、导出、新增、修改和删除字典数据等操作。 + +SysDictTypeController.java + +该控制器主要用于管理系统中的数据字典类型信息,包括查询、导出、新增、修改、删除以及刷新缓存等操作 + +SysIndexController.java + +该控制器主要用于处理访问系统首页的请求,并返回一个提示信息给用户。 + +SysLoginController.java + +该控制器主要用于处理用户登录验证、获取用户信息以及获取路由信息等操作。 + +#### tool + +### core + +## RuoYiApplication.java:启动程序 + +启动程序,输出启动成功标识,获取环境配置对象env(用于读取配置文件),读取IP、端口信息并输出 + +## RuoYiServletInitializer.java:部署应用运行 + +继承公共类,重写configure方法,将springboot应用在servlet容器中进行部署 + +# resources + +# pom.xml diff --git "a/RuoYi-Geek-SpringBoot3/6.\350\216\267\345\217\226\346\225\260\346\215\256\351\200\273\350\276\221\347\220\206\350\247\243.md" "b/RuoYi-Geek-SpringBoot3/6.\350\216\267\345\217\226\346\225\260\346\215\256\351\200\273\350\276\221\347\220\206\350\247\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..3ec40b3a6f72b42d941fc985e009a4b88d1a5f0b --- /dev/null +++ "b/RuoYi-Geek-SpringBoot3/6.\350\216\267\345\217\226\346\225\260\346\215\256\351\200\273\350\276\221\347\220\206\350\247\243.md" @@ -0,0 +1,53 @@ +# 数据读取 + + + + +### 前端发起请求: +``` + 前端向后端发送GET请求 + + 请求URL为http://localhost/dev-api/sys/post/list?pageNum=1&pageSize=10。 +``` + +### 后端处理请求: +``` + 后端接收到请求后,查询数据库获取岗位管理数据。 + + 将查询结果封装成JSON格式返回给前端。 +``` + +### 前端接收响应: +``` + 前端接收到后端返回的JSON数据。 + + 解析JSON数据并将其渲染到页面上,显示在表格中。 +``` + + + + +# 数据更改(增删改查) + + + +### 前端发起请求: +``` + 前端向后端发送POST请求 + + 请求URL为http://localhost/dev-api/sys/post。 +``` + +### 后端处理请求: +``` + 后端接收到请求后,处理新增岗位数据 + + 将新增结果返回给前端 +``` + +### 前端接收响应: +``` + 前端接收到后端返回的响应 + + 根据响应结果更新前端界面 +``` diff --git "a/RuoYi-Geek-SpringBoot3/7.\347\224\250\346\210\267\346\235\203\351\231\220\344\270\216\350\217\234\345\215\225\350\267\257\347\224\261\350\216\267\345\217\226\347\220\206\350\247\243.md" "b/RuoYi-Geek-SpringBoot3/7.\347\224\250\346\210\267\346\235\203\351\231\220\344\270\216\350\217\234\345\215\225\350\267\257\347\224\261\350\216\267\345\217\226\347\220\206\350\247\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..27c5ac463d698e455d862874076358404b92232c --- /dev/null +++ "b/RuoYi-Geek-SpringBoot3/7.\347\224\250\346\210\267\346\235\203\351\231\220\344\270\216\350\217\234\345\215\225\350\267\257\347\224\261\350\216\267\345\217\226\347\220\206\350\247\243.md" @@ -0,0 +1,89 @@ +# 用户角色与权限获取 + +系统请求getInfo方法,该方法在任意一个页面跳转时都会调用,是在路由中配置的,前端用来获取用户信息。后端获取用户角色和权限信息,传递给前端 + +验证码请求 + +``` +请求url:http://localhost/dev-api/getInfo +``` + +permission.js :调用getInfo方法 + +``` +// 判断当前用户是否已拉取完user_info信息 + useUserStore().getInfo().then(() => { //调用getInfo方法 + isRelogin.show = false + usePermissionStore().generateRoutes().then(accessRoutes => { + // 根据roles权限生成可访问的路由表 + accessRoutes.forEach(route => { + if (!isHttp(route.path)) { + router.addRoute(route) // 动态添加可访问路由表 + } + }) + next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 + }) + }).catch(err => { + useUserStore().logOut().then(() => { + ElMessage.error(err) + next({ path: '/' }) + }) + }) +``` + +user.ts:定义getInfo方法,对于后端的角色权限信息处理 + +``` +getInfo() { + return new Promise((resolve, reject) => { + getInfo().then((res:any) => { + const user = res.user + // @ts-ignore + const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar; + + if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 + this.roles = res.roles + this.permissions = res.permissions + } else { + this.roles = ['ROLE_DEFAULT'] + } + this.name = user.userName + this.avatar = avatar; + resolve(res) + }).catch(error => { + reject(error) + }) + }) + }, +``` + +login.js + +``` +// 获取用户详细信息 +export function getInfo() { + return request({ + url: '/getInfo', + method: 'get' + }) +} +``` + +后端:通过getInfo方法获取角色信息和权限信息,当权限为*:*: *时,表示所有权限,管理员拥有次此权限,其他用户没有,数据库中sys_user_role记录角色与权限的对应关系。 + +SysLoginController.java + +> ``` +> @GetMapping("getInfo") +> public AjaxResult getInfo() { +> LoginUser loginUser = SecurityUtils.getLoginUser(); +> SysUser user = loginUser.getUser(); +> // 角色集合 +> Set roles = permissionService.getRolePermission(user); +> // 权限集合 +> Set permissions = permissionService.getMenuPermission(user); +> ······ +> } +> ``` + +# 动态菜单路由获取 diff --git "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\347\256\200\344\273\213.md" "b/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\347\256\200\344\273\213.md" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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" deleted file mode 100644 index eb9a52c103b88dd60140fbae4960d075bf6b3203..0000000000000000000000000000000000000000 --- "a/RuoYi-Geek-SpringBoot3/RuoYi-Geek-SpringBoot3\351\241\271\347\233\256\347\273\223\346\236\204.md" +++ /dev/null @@ -1,48 +0,0 @@ -本项目是基于 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 # 数据库脚本目录 -``` diff --git a/RuoYi-Geek-SpringBoot3/images/captcha-imag.png b/RuoYi-Geek-SpringBoot3/images/captcha-imag.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9904cdf98ede6a537f17467cc9e78fb60e29f9 Binary files /dev/null and b/RuoYi-Geek-SpringBoot3/images/captcha-imag.png differ diff --git a/RuoYi-Geek-SpringBoot3/images/captcha-request.png b/RuoYi-Geek-SpringBoot3/images/captcha-request.png new file mode 100644 index 0000000000000000000000000000000000000000..fa082614b11e0be54380d6a8acd505fa849290b7 Binary files /dev/null and b/RuoYi-Geek-SpringBoot3/images/captcha-request.png differ diff --git a/RuoYi-Geek-SpringBoot3/images/getInfo-request.png b/RuoYi-Geek-SpringBoot3/images/getInfo-request.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6252a33b2a069406e575acf3db25f7a721db4e Binary files /dev/null and b/RuoYi-Geek-SpringBoot3/images/getInfo-request.png differ diff --git a/RuoYi-Geek-SpringBoot3/images/list1.png b/RuoYi-Geek-SpringBoot3/images/list1.png new file mode 100644 index 0000000000000000000000000000000000000000..6e3706d1bfbbfb20a236a793a3c253294ca3fbec Binary files /dev/null and b/RuoYi-Geek-SpringBoot3/images/list1.png differ diff --git a/RuoYi-Geek-SpringBoot3/images/login-request.png b/RuoYi-Geek-SpringBoot3/images/login-request.png new file mode 100644 index 0000000000000000000000000000000000000000..b3434e9ac535170996894de586c5a9e3ed1fca9f Binary files /dev/null and b/RuoYi-Geek-SpringBoot3/images/login-request.png differ diff --git a/RuoYi-Geek-SpringBoot3/images/post1.png b/RuoYi-Geek-SpringBoot3/images/post1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff42f91aba652916a7d3ccb057df3d683f3883c Binary files /dev/null and b/RuoYi-Geek-SpringBoot3/images/post1.png differ diff --git "a/RuoYi-Geek-SpringBoot3/images/\346\265\201\347\250\213\345\233\2761.png" "b/RuoYi-Geek-SpringBoot3/images/\346\265\201\347\250\213\345\233\2761.png" new file mode 100644 index 0000000000000000000000000000000000000000..18618bf1a59573dd8d4ec0ec1dd9744ca96e3636 Binary files /dev/null and "b/RuoYi-Geek-SpringBoot3/images/\346\265\201\347\250\213\345\233\2761.png" differ 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/1.RuoYi-Geek-Vue3\345\277\253\351\200\237\345\220\257\345\212\250.md" similarity index 99% rename from "RuoYi-Geek-Vue3/RuoYi-Geek-Vue3\345\277\253\351\200\237\345\220\257\345\212\250.md" rename to "RuoYi-Geek-Vue3/1.RuoYi-Geek-Vue3\345\277\253\351\200\237\345\220\257\345\212\250.md" index e78e7e7d0f97f5355894266b62a303d326e22a01..234fb52d6342e160665520260f5a1482c04d149f 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/1.RuoYi-Geek-Vue3\345\277\253\351\200\237\345\220\257\345\212\250.md" @@ -14,7 +14,7 @@ git clone https://gitee.com/geek-xd/ruoyi-geek-vue3.git # 进入项目目录 -cd RuoYi-Vue3 +cd ruoyi-geek-vue3 # 安装依赖 yarn --registry=https://registry.npmmirror.com diff --git "a/RuoYi-Geek-Vue3/2.RuoYi-Geek-Vue3\351\241\271\347\233\256\347\273\223\346\236\204.md" "b/RuoYi-Geek-Vue3/2.RuoYi-Geek-Vue3\351\241\271\347\233\256\347\273\223\346\236\204.md" new file mode 100644 index 0000000000000000000000000000000000000000..608ac44f75abb1946153265f5f9510b87bfc8d74 --- /dev/null +++ "b/RuoYi-Geek-Vue3/2.RuoYi-Geek-Vue3\351\241\271\347\233\256\347\273\223\346\236\204.md" @@ -0,0 +1,39 @@ + +# RuoYi-Geek-Vue3项目结构 + +```bash +├── node_modules # 第三方依赖库 +├── public # 静态资源 +├── src # 源代码文件 +│ ├── annotation # TypeScript +│ │ ├── Api.ts # API接口定义 +│ │ ├── Schema.ts # 数据模式定义 +│ │ └── SchemaComponent.ts # Schema组件定义 +│ ├── api # API请求 +│ │ ├── monitor # 监控API +│ │ ├── online # 在线API +│ │ ├── pay # 支付API +│ │ └── system # 系统API +│ │ └── tool # 工具 +│ │ ├── login.js # 登录 +│ │ └── menu.js # 菜单 +│ ├──assets # 静态资源 +│ ├──components # Vue组件 +│ ├── directive # 自定义指令 +│ ├── hook # Hook +│ ├── layout # 布局 +│ ├── plugins # 插件 +│ ├── router # 路由 +│ ├── store # Vuex状态管理 +│ ├── types # 类型定义 +│ ├── utils # 工具函数 +│ └── views # 视图 +│ ├──App.vue # 主入口 +│ ├── env.d.ts # 环境类型 +│ ├── env.d.ts # 环境类型 +│ ├──main.js # 应用启动 +│ ├──permission.js # 权限 +│ ├── settings.ts # 设置 +└── vite # Vite插件配置 + +```