CMS

Java (11), Swing, SimpleLibrary

Появляются идеи новых проектов, и они должны получать свою страничку на сайте. А добавление одного нового проекта вызывает необходимость внести изменения на все страницы сайта. Затем приходится долго проверять созданное. И да, можно, конечно, и так, но зачем?

Я сделал собственную CMS (систему управления контентом) для ведения своего сайта. Проблема решена! Конечно, можно было бы взять что-то готовое, но что? И сколько времени мне понадобилось бы для его изучения? Удалось бы сделать сайт таким, каким я его придумал, или всего лишь примерно таким? Думаю, язык программирования Java — это лучшая в мире CMS :-)

Кроме того, эта CMS позволила попрактиковаться в работе с файлами на Java, а также в создании пользовательского интерфейса с помощью Swing, в частности: в работе с текстовыми полями, радиокнопками, комбобоксами и редактировании списка.

Для разработки использован Eclipse. Проект расположен здесь: https://github.com/weekend-game/cms/ (EN) и здесь: https://gitflic.ru/project/weekend-game/cms/ (RU).

Как запустить программу

Скачайте репозиторий на свой компьютер. Всё необходимое для работы программы расположено в папке app. Зайдите в папку app и запустите программу двойным кликом по CMS.jar или, если она не запускается, двойным кликом по CMS.bat. Если и последнее не запускает программу, то скачайте и установите Java 11 или новее и снова попробуйте способы, описанные выше.

Как открыть проект в Eclipse

В Eclipse, в меню выберите File - Import... В появившемся окне выберите Existing Projects into Workspace. Укажите папку скачанного вами репозитория и нажмите кнопку Finish. Проект откроется в Eclipse. В Package Explorer (в левой части экрана) дважды кликните на файле CMS.java. Файл откроется для редактирования (в центральной части экрана). Запустите программу на выполнение, нажав Ctrl+F11 или так, как вам удобно запускать программы в Eclipse.

Как работать с программой

Программа помогает создать HTML-страницы сайта в определённом стиле - стиле моего сайта. Если нужно что-то другое или что-то ещё, то надо дорабатывать программу.

Чтобы легче понять пояснения ниже, надо запустить программу и открыть созданный с её помощью сайт. Видим, что сайт состоит из двух видов страниц: главной страницы и страниц проектов, подобных этой странице. Все страницы проектов, в принципе, одинаковы.

Главная страница (index.htm)

В центральной части страницы крупным шрифтом отображается название всего проекта. В данном случае это название моего профиля - Weekend Game. Если запустить программу, то мы увидим, что в появившемся окне будет несколько полей. Поле "Название проекта" отвечает именно за то, что будет отображаться в центральной части главной страницы. Верхняя часть страницы содержит ссылку на сайт с проектами и предлагает писать письма на мой адрес. Она выполнена на английском языке. Нижняя часть содержит аналогичную информацию, но написана на русском языке. Для указания всех этих атрибутов в CMS предназначены поля "Сайт для проектов на английском", "Сайт для проектов на русском" и "Электронная почта".

Видим, что на странице, выше и ниже названия всего проекта (профиля), расположены линейки меню, т.е. ссылки на страницы каждого проекта (репозитория). Предполагается, что сверху будут ссылки на страницы на английском языке, а снизу - на русском.

Страницы проектов (репозиториев)

Перечень страниц проектов (репозиториев) указывается в CMS в разделе "Список страниц". Подразумеваются страницы проектов. Для каждой страницы указывается "Язык" (EN или RU). Эти значения определяют, где будет расположена ссылка на страницу на главной странице: сверху или снизу. Ссылки будут формироваться в той последовательности, в которой они указаны в списке страниц. Расположение можно поменять кнопками "Вверх" и "Вниз", расположенными справа от списка. Поле "Наименование" определяет название страницы на естественном языке, а поле "Имя файла" — это имя файла страницы, которая будет сгенерирована.

При генерации страниц будет сформирована не только главная страница, но и страницы для каждой строки из списка страниц. Каждая страница проекта будет содержать заголовок крупным шрифтом и взятый из поля "Наименование", а также линейку меню, содержащую ссылки на все страницы EN или RU, в зависимости от атрибута самой страницы. Таких линеек меню будет две: вверху и внизу страницы. В самом низу будет предложение посетить сайты с проектами и email. Содержимое же страницы будет взято из одноимённого файла из папки, указанной в поле "Папка расположения файлов с текстами". Например, для генерации страницы cms.htm следует не только указать её в списке страниц, но и разместить описание CMS в одноимённом файле (cms.htm) и поместить его в папку, указанную в поле "Папка расположения файлов с текстами". Если такого файла не найдётся, страница cms.htm всё равно будет создана, но она будет иметь только заголовок и завершение.

Генерация сайта

Чтобы получить страницы сайта, нажмите кнопку "Сформировать страницы". Все сформированные HTML-файлы будут расположены в папке, указанной в поле "Папка для размещения сформированных страниц". Таблицу стилей моя CMS не формирует. Её следует создать вручную и расположить там, где удобно. Также самостоятельно позаботьтесь о размещении файлов с изображениями.

Внимание! Не редактируйте вручную сгенерированные HTML-файлы в папке для размещения страниц, так как при очередной генерации они будут переписаны.

Как программа написана

Главным классом приложения является класс CMS. Именно он содержит статический метод main() для запуска программы. В его конструкторе создаётся всё необходимое для работы.

Программа использует классы модуля game.weekend.simplelibrary. Именно поэтому для её создания потребовалось создать всего лишь четыре новых класса.

Прежде всего, вызывается метод Proper.read(). Proper (из simplelibrary) - это класс, который нужен, чтобы приложение могло сохранять данные между сеансами работы. Так сохраняется расположение и размер главного окна, предпочитаемый язык интерфейса, а также вся информация полей ввода и данные списка страниц. Метод read() читает файл с ранее записанными данными. Метод save() делает обратное: записывает всё, что запомнено в объекте, в файл. Метод setProperty(name, value) сохраняет значение value с именем "name". Метод getProperty(name, def) читает значение с именем "name", а если оно не записывалось, то будет возвращено значение def. Для записи и восстановления расположения и размеров окна приложения используется пара методов saveBounds() и setBounds().

Затем статическим методом Loc.setLanguage() устанавливается язык интерфейса. Класс Loc (из simplelibrary) отвечает за I18n. Работает это так: все строки, которые предназначены для отображения, написаны на английском языке с использованием нижнего подчёркивания вместо пробела. Метод Loc.get(строка) будет возвращать строки на ранее установленном языке, если, конечно, найдётся файл локализации messages_xx.properties, где xx - условное обозначение языка. Иначе в английской фразе подчёркивания будут заменены на пробел, а первая буква будет сделана прописной. И получившееся будет использовано для отображения. Для целей данной программы этого вполне достаточно.

Создаётся объект класса SiteDescriptor - объект для хранения всей информации о сайте, который будет сгенерирован. У созданного объекта тут же вызывается метод siteDescriptor.readData(). Здесь происходит чтение этой самой информации.

Создаётся окно приложения - объект класса JFrame. И сразу вызывается метод makeJFrame(), в котором в окне приложения располагаются компоненты пользовательского интерфейса. Для их расположения используется класс GBL. GBL (из simplelibrary) - это упрощение менеджера расположения GridBagLayout, адаптированное под нужды приложения. Компонентов пользовательского интерфейса не так уж много, но для их создания и настройки приходится писать много текста. Чтобы несколько упростить, всё, что связано с редактированием списка страниц, выделено в отдельный класс: ListEditor. Объект класса ListEditor формирует панель редактора списка страниц, которую можно получить методом getPanel() и расположить где угодно. Я её, естественно, располагаю на единственном экране своего приложения.

Затем я инициализирую класс Mes (из simplelibrary), предназначенный для отображения различных сообщений с помощью диалоговых окон. Методы Mes статические, и это создаёт некоторую связанность классов моих программ, но я отношусь к нему как к System.out в Java.

В заключение я вызываю метод readFromSiteDescriptor(), который заполнит компоненты пользовательского интерфейса ранее прочитанными данными из SiteDescriptor().

Основная работа выполняется в слушателе кнопки "Сформировать страницы". Вызывается метод класса Generator DoIt(). Этот метод и сформирует страницы сайта на основании имеющихся данных.

Более подробно о работе программы можно узнать, скачав проект, открыв его в Eclipse, читая тексты классов, внося изменения, запуская программу и наблюдая, что из этого получается.

Итоги

Создание даже такой небольшой CMS существенно облегчило ведение моего сайта.

Хорошо бы…

Блог быстро разрастается. Надо убирать в архив старые записи.

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