
halo插件开发记录(二)
了解基本的框架结构
├── ui/ # 前端代码 (Vue/TS)
├── src/ # 后端代码 (Java/Spring Boot)
├── build.gradle # Gradle 构建脚本
├── gradle/ # Gradle Wrapper 配置
├── gradlew # Gradle Wrapper (Linux/macOS)
├── gradlew.bat # Gradle Wrapper (Windows)
├── settings.gradle # Gradle 项目设置
├── LICENSE # 开源许可证
└── README.md # 项目说明文档
Gradle 相关
build.gradle
build.gradle 文件是 Gradle 构建工具 的核心 构建脚本(或配置文件)。
简单来说,它的作用是:
告诉 Gradle 如何构建你的项目:它定义了项目结构、源代码位置、编译选项等。
管理项目依赖:声明项目需要依赖哪些外部库(jars),Gradle 会自动下载和管理它们。
定义构建任务:配置各种构建步骤,如编译代码 (compileJava)、运行测试 (test)、打包应用 (jar 或 bootJar)、构建前端 (buildFrontend 等自定义任务)。
应用插件:通过引入插件(如 Java 插件、Spring Boot 插件、Node 插件)来扩展 Gradle 的功能,简化特定类型项目的构建。
配置项目属性:设置项目的版本号、分组 ID 等元数据。
你可以把它想象成一个 构建说明书 或 自动化脚本,Gradle 读取这个文件就知道该如何一步步地编译、测试、打包你的软件。你之前提供的那个 build.gradle 文件就是一个用于构建 Halo 插件项目的具体说明书。
plugins
plugins {
id 'java' // 使用 Java 插件,支持 Java 项目的构建
id "com.github.node-gradle.node" version "7.1.0" // 集成 Node.js 插件,用于管理前端依赖和构建
id "io.freefair.lombok" version "8.13.1" // 集成 Lombok 插件,简化 Java 代码(如自动生成 getter/setter)
id "run.halo.plugin.devtools" version "0.5.0" // 集成 Halo 插件,提供开发工具支持
}
java
插件:用于构建和管理 Java 项目。
com.github.node-gradle.node
插件:用于管理前端依赖(如 Node.js 和 npm/yarn/pnpm),并支持前端构建任务。
io.freefair.lombok
插件:简化 Java 代码开发,减少样板代码。
run.halo.plugin.devtools
插件:提供开发工具支持,可能包括热部署、调试等功能。
项目配置
group 'run.halo.starter'
sourceCompatibility = JavaVersion.VERSION_17
group
:定义项目的组 ID,通常用于 Maven 坐标。
sourceCompatibility
:指定 Java 源代码的兼容性版本为 Java 17。
repositories
repositories {
mavenCentral() // 使用 Maven 中央仓库
maven { url 'https://s01.oss.sonatype.org/content/repositories/releases' } // OSS Sonatype 的发布仓库
maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' } // OSS Sonatype 的快照仓库
maven { url 'https://repo.spring.io/milestone' } // Spring 的里程碑仓库
}
配置了多个 Maven 仓库,用于下载项目依赖。
dependencies
dependencies {
implementation platform('run.halo.tools.platform:plugin:2.20.0-SNAPSHOT') // 使用 Halo 工具平台
compileOnly 'run.halo.app:api' // 编译时依赖 Halo API,不打包到最终产物
testImplementation 'run.halo.app:api' // 测试时依赖 Halo API
testImplementation 'org.springframework.boot:spring-boot-starter-test' // 测试依赖 Spring Boot 的测试工具
}
implementation platform(...)
:引入 Halo 工具平台,可能是一个 BOM(Bill of Materials),用于管理依赖版本。
compileOnly
:仅在编译时需要的依赖,不会打包到最终产物。
testImplementation
:测试时需要的依赖。
spring-boot-starter-test
:Spring Boot 提供的测试工具,包含 JUnit 和其他测试支持。
test
test {
useJUnitPlatform() // 使用 JUnit 5 平台运行测试
}
配置测试任务,使用 JUnit 5 作为测试框架。
Java 编译配置
tasks.withType(JavaCompile).configureEach {
options.encoding = "UTF-8" // 设置 Java 编译时的编码为 UTF-8
}
配置所有 Java 编译任务,指定编码为 UTF-8,避免乱码问题。
前端构建配置
ode {
nodeProjectDir = file("${project.projectDir}/ui") // 指定前端项目的目录
}
tasks.register('buildFrontend', PnpmTask) {
args = ['build'] // 定义构建前端的任务,执行 `pnpm build`
dependsOn('installDepsForUI') // 构建前依赖安装前端依赖
}
tasks.register('installDepsForUI', PnpmTask) {
args = ['install'] // 定义安装前端依赖的任务,执行 `pnpm install`
}
build {
tasks.named('compileJava').configure {
dependsOn('buildFrontend') // 在编译 Java 前先构建前端
}
}
node
配置:指定前端项目的目录为ui
。
buildFrontend
任务:使用 PNPM 执行前端构建命令build
。
installDepsForUI
任务:使用 PNPM 安装前端依赖。
build
配置:在编译 Java 代码之前,先执行前端构建任务。
Halo 插件配置
halo {
version = '2.20.18' // 指定 Halo 版本
superAdminUsername = 'admin' // 超级管理员用户名
superAdminPassword = 'admin' // 超级管理员密码
externalUrl = 'http://localhost:8090' // 外部访问地址
port = 8090 // 应用程序运行的端口
debug = true // 启用调试模式
}
settings.gradle
主要用于管理 Gradle 插件的仓库和定义项目的根目录名称
pluginManagement
pluginManagement {
repositories {
gradlePluginPortal()
}
}
pluginManagement
是 Gradle 的顶级配置块,用于管理项目中使用的插件。它定义了 Gradle 在解析插件时应该从哪些仓库中查找插件。
repositories
配置
repositories
块指定了 Gradle 插件的仓库来源。在这里,使用了
gradlePluginPortal()
,表示插件的仓库是 Gradle Plugin Portal,这是 Gradle 官方的插件仓库地址。
rootProject.name
rootProject.name = 'plugin-starter'
ootProject.name
定义了 Gradle 项目的根目录名称。在这里,根项目的名称被设置为
plugin-starter
。
UI(插件后台前端UI)
├── ui/ # 前端代码 (Vue/TS)
│ ├── src/
│ │ ├── assets/ # 静态资源 (图片等)
│ │ ├── views/ # Vue 页面组件
│ │ ├── components/ # (推荐) 可复用 Vue 组件
│ │ ├── styles/ # (推荐) 全局样式
│ │ └── index.ts # 前端入口文件
│ ├── package.json # 前端依赖管理
│ ├── tsconfig.json # TypeScript 配置
│ └── vite.config.ts # Vite 构建配置
ui/src/
前端源代码目录,存放所有前端开发的核心代码。
这是前端项目的核心部分,通常会被打包工具(如 Vite)编译和打包。
src/assets/
静态资源目录,存放图片、字体、图标等静态文件。
这些资源通常会在项目中通过相对路径引用,或者通过构建工具被打包到最终的输出目录中。
src/views/
页面组件目录,存放 Vue 页面级别的组件。
每个页面通常对应一个独立的
.vue
文件,负责一个完整的页面逻辑和 UI。示例:
HomeView.vue
:首页组件AboutView.vue
:关于页面组件
src/components/
可复用组件目录,存放可复用的 Vue 组件。
这些组件通常是通用的 UI 组件(如按钮、表单、模态框等),可以在多个页面中复用。
示例:
Button.vue
:按钮组件Input.vue
:输入框组件
src/styles/
全局样式目录,存放项目的全局 CSS 或 SCSS 文件。
这些样式通常会影响整个项目的外观,例如全局的字体、颜色、布局等。
示例:
global.scss
:全局样式文件variables.scss
:定义全局变量(如颜色、字体大小等)
src/index.ts
前端入口文件,项目的启动文件。
通常在这里初始化 Vue 应用,并挂载到 DOM 中。
示例代码:
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
ui/package.json
前端依赖管理文件,用于管理前端项目的依赖和脚本。
包含项目所需的前端库(如 Vue、Vite、TypeScript 等)以及开发脚本。
示例:
{ "name": "ui", "version": "1.0.0", "scripts": { "dev": "vite", "build": "vite build", "serve": "vite preview" }, "dependencies": { "vue": "^3.2.0" }, "devDependencies": { "vite": "^4.0.0", "typescript": "^5.0.0" } }
ui/tsconfig.json
TypeScript 配置文件,用于定义 TypeScript 的编译选项。
指定如何处理 TypeScript 代码(如模块解析、严格模式等)。
示例:
{ "compilerOptions": { "target": "ESNext", "module": "ESNext", "strict": true, "jsx": "preserve", "moduleResolution": "node", "baseUrl": ".", "paths": { "@/*": ["src/*"] } }, "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] }
ui/vite.config.ts
Vite 构建配置文件,用于定义 Vite 的构建和开发服务器行为。
可以配置开发服务器、构建输出、插件等。
示例:
import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; export default defineConfig({ plugins: [vue()], server: { port: 3000, // 开发服务器端口 open: true // 自动打开浏览器 }, build: { outDir: 'dist', // 构建输出目录 minify: 'esbuild' // 构建时使用 esbuild 压缩 } });
后端代码 (Java/Spring Boot)
├── src/ # 后端代码 (Java/Spring Boot)
│ └── main/
│ ├── java/ # Java 源代码
│ │ └── run/halo/starter/
│ │ └── StarterPlugin.java # 插件后端入口类
│ └── resources/ # 资源文件
│ ├── console/ # 前端构建产物
│ │ ├── main.js
│ │ └── style.css
│ └── plugin.yaml # 插件描述文件 (必需)
从 2.11 开始,Halo 支持了 UC 个人中心,且个人中心和 Console 的插件机制共享,所以为了避免歧义,
resources/console
在后续版本会被重命名为resources/ui
,但同时也会兼容resources/console
。
项目根目录
src/
:后端代码的根目录,存放所有与后端相关的源代码和资源文件。通常遵循 Maven 或 Gradle 的标准目录结构,
main
目录下分为java
和resources
两部分。
目录结构详解
src/main/java/
Java 源代码目录,存放所有后端逻辑的 Java 类文件。
遵循包名结构组织代码,便于管理和模块化。
run/halo/starter/
项目主包路径,通常与项目的
group
和artifactId
对应。在这里,
run.halo.starter
是项目的包名,StarterPlugin.java
是插件的入口类。
StarterPlugin.java
插件后端入口类,通常是 Spring Boot 应用的主类或插件的初始化类。
负责启动插件、注册服务、配置路由等。
示例代码:
package run.halo.starter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class StarterPlugin { public static void main(String[] args) { SpringApplication.run(StarterPlugin.class, args); } }
如果是一个插件系统,该类可能会集成到主应用中,或者通过某种方式动态加载。
src/main/resources/
资源文件目录,存放非代码的静态文件和配置文件。
这些文件会被打包到最终的 JAR 或 WAR 文件中。
console/
存放前端项目的构建结果(如
main.js
和style.css
)。这些文件可能是之前通过传统方式(如 Webpack)构建的前端代码,供后端直接提供静态资源。
plugin.yaml
插件描述文件,必需的配置文件,用于描述插件的基本信息。
插件系统通常需要一个元数据文件来定义插件的名称、版本、入口点等信息。
示例内容:
name: Starter Plugin version: 1.0.0 description: A starter plugin for the Halo system. entry: run.halo.starter.StarterPlugin dependencies: - name: core version: 2.0.0
用途:
插件系统通过该文件识别和加载插件。
定义插件的依赖关系、入口类、元数据等信息。