Skip to content

Структура проекта

Проект делаться на две основные части: backend и frontend

Основные настройки хранятся в файле src/main/resources/luna-plugin.yaml

Пример конфигурации

yaml
# yaml-language-server: $schema=https://raw.githubusercontent.com/thankjura/luna-schemas/refs/heads/master/luna-plugin.schema.json?v12

key: ${project.groupId}.${project.artifactId} # Resolved from pom.xml
name: ${project.name}
version: ${project.version}
description: "${project.description}"
vendor:
  name: ${project.organization.name}
  url: ${project.organization.url}
resources:
  - key: messages
    type: i18n
    path: messages
  - key: styles
    type: css
    path: frontend/frontend.css
routes:
  - routeName: myDemoPage # Unique route name, use it in WebItem
    routePath: demo-page
    component: frontend/DemoView.js # Path to compiled component
    parent: admin
  - routeName: myTodoPage
    routePath: todo-page
    component: frontend/TodoView.js
    parent: admin
scanPackages:
  - ru.mysite.plugin # Scan packages for auto-inject components
restPackages:
  - name: Rest pack
    packages:
      - ru.mysite.plugin.rest
activeDocs:
  - ru.mysite.plugin.db.CardEntity
webSections:
  - key: TodoAdminSideBarSection
    name: Demo admin side bar section
    className: ru.mysite.plugin.web.DemoAdminSideBarSection
webItems:
  - key: DemoAdminWebItem
    name: Demo web item
    className: ru.mysite.plugin.web.DemoAdminWebItem
  - key: TodoAdminWebItem
    name: Todo web item
    className: ru.mysite.plugin.web.TodoAdminWebItem

Это лишь пример, остальные параметры можно узнать изучив схему.

Backend

В файле luna-plugin.yaml вы регистрируете компоненты плагина.

luna-plugin.yaml

  • scanPackages: список пакетов для сканирования для ленивой загрузки бинов
  • resources: подключаемые ресурсы(файлы переводов, стили, компоненты)
  • routes: Добавление маршрутов для пользовательских страниц
  • restPackages: Список пакетов в где надо искать rest-контроллеры
  • activeDocs: Список классов в которых хранится описание пользовательских таблиц
  • webSections: Реализация секций(для построения меню)
  • webItems: Реализация кнопок/элементов меню
  • webSectionProviders и webItemProviders: Классы генераторы секций и элементов меню
  • fieldTypes: Реализация кастомных типов полей
  • fieldSearchers: Реализация кастомный поисковых модулей
  • filters: Фильтры для servlet
  • issuesExportModules: Реализация модулей для экспорта задач
  • queryFunctions: Реализация кастомный query-фукнций для поиска, например assignee = curentUser()
  • clauseValueProviders: Реализация автодополнения для полей
  • reportModules: Отчеты
  • directoryTypes: Авторизация пользователей
  • bulkActions: Массовые операции
  • workflowConditions: Функции-условия для переходов
  • workflowValidators: Функции-фалидаторы для переходов
  • workflowPostfunctions: Постфункции для переходов
  • components: Другие виды отключаемых компонентов

Frontend

Для настройки фронтенда используется файл frontend/vite.config.ts

ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import pluginExternal from "vite-plugin-external";

// https://vite.dev/config/
export default defineConfig({
  base: './',
  plugins: [
    pluginExternal({
      externals: {
        'luna': '__LUNA_COMPONENTS__',
        'vue': 'Vue',
        'axios': 'axios',
        'I18N': 'I18N',
        'sortablejs': 'Sortable',
        'chart.js': 'ChartJs',
        'vue-router': 'VueRouter',
      }
    }),
    vue()
  ],
  resolve: {
    alias: {
      '@': resolve(__dirname, 'src'),
    }
  },
  build: {
    sourcemap: true,
    minify: 'terser',
    lib: {
      entry: [
      	resolve(__dirname, 'src/views/DemoView.vue'),
        resolve(__dirname, 'src/views/TodoView.vue'),
      ],
      formats: ['es'],
    },
    rolldownOptions: {
      output: {
        entryFileNames: '[name].js',
        exports: 'named',
      },
    },
    outDir: resolve(__dirname, '../src/main/resources/frontend'),
    emptyOutDir: true,
  },
})

IMPORTANT

Обратите внимание, что компоненты которые вы будите использовать, должны собираться в отельные файлы. Например вы делаете кастомный тип поля и хотите у него указать компоненты для просмотра и редактирование. Добавьте эти два компонента в build.lib.entry. Вспомогательные компоненты добавлять не нужно, они загрузятся автоматически.

TIP

Вы так же можете использовать компоненты из самой Луны например компоненты выбора даты, диалоговые окна и т.д.

Сборка

Для сборки проекта запустите команду

shell
luna-sdk package
# или можете использовать свой maven: 
mvn package

После сборки плагин сам обновляется в запущенном инстансе Луны(если она запущена через luna-sdk run).

TIP

Вы так же можете запустить dev сервер для фронтенда, что бы каждый раз не пересобирать плагин

shell
cd frontend
npm run dev

В таком случае после изменения файлов фронтенда он будет автоматически пересобираться. А запущенный инстанс Луны сам подхватывает его из папки resources.