了解基本的框架结构

├── 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 构建工具 的核心 构建脚本(或配置文件)。

简单来说,它的作用是:

  1. 告诉 Gradle 如何构建你的项目:它定义了项目结构、源代码位置、编译选项等。

  2. 管理项目依赖:声明项目需要依赖哪些外部库(jars),Gradle 会自动下载和管理它们。

  3. 定义构建任务:配置各种构建步骤,如编译代码 (compileJava)、运行测试 (test)、打包应用 (jar 或 bootJar)、构建前端 (buildFrontend 等自定义任务)。

  4. 应用插件:通过引入插件(如 Java 插件、Spring Boot 插件、Node 插件)来扩展 Gradle 的功能,简化特定类型项目的构建。

  5. 配置项目属性:设置项目的版本号、分组 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 插件,提供开发工具支持
}

项目配置​

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 的测试工具
}

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 目录下分为 javaresources 两部分。


​​目录结构详解​​

​​src/main/java/​​

  • ​Java 源代码目录​​,存放所有后端逻辑的 Java 类文件。

  • 遵循包名结构组织代码,便于管理和模块化。

​​run/halo/starter/​​

  • ​项目主包路径​​,通常与项目的 groupartifactId 对应。

  • 在这里,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.jsstyle.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
  • ​用途​​:

    • 插件系统通过该文件识别和加载插件。

    • 定义插件的依赖关系、入口类、元数据等信息。