Структура проекта
Проект делаться на две основные части: backend и frontend
Основные настройки хранятся в файле src/main/resources/luna-plugin.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: Фильтры для servletissuesExportModules: Реализация модулей для экспорта задачqueryFunctions: Реализация кастомный query-фукнций для поиска, например assignee =curentUser()clauseValueProviders: Реализация автодополнения для полейreportModules: ОтчетыdirectoryTypes: Авторизация пользователейbulkActions: Массовые операцииworkflowConditions: Функции-условия для переходовworkflowValidators: Функции-фалидаторы для переходовworkflowPostfunctions: Постфункции для переходовcomponents: Другие виды отключаемых компонентов
Frontend
Для настройки фронтенда используется файл frontend/vite.config.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
Вы так же можете использовать компоненты из самой Луны например компоненты выбора даты, диалоговые окна и т.д.
Сборка
Для сборки проекта запустите команду
luna-sdk package
# или можете использовать свой maven:
mvn packageПосле сборки плагин сам обновляется в запущенном инстансе Луны(если она запущена через luna-sdk run).
TIP
Вы так же можете запустить dev сервер для фронтенда, что бы каждый раз не пересобирать плагин
cd frontend
npm run devВ таком случае после изменения файлов фронтенда он будет автоматически пересобираться. А запущенный инстанс Луны сам подхватывает его из папки resources.