1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/agile-framework-agile-dictionary

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

agile-dictionary : словарь парсер

spring-boot maven

Как это работает

  • Автоматическая загрузка при запуске После интеграции этого компонента данные словарей будут автоматически загружены вместе с запуском Spring-приложения. Это позволит загрузить данные словарей из базы данных в кэш, что повысит производительность запросов к кэшу.

  • Синхронизация кэша Интегрирование кэширующего компонента agile-cache позволяет менять тип кэширования spring.cache.type, такие как Redis, EhCache, Memory и так далее. Для использования кэша обратитесь к документации кэширующего компонента https://gitee.com/agile-framework/agile-cache.

  • Комплексное преобразование Предоставленный набор инструментов cloud.agileframework.dictionary.util.DictionaryUtil обеспечивает множество способов комплексного преобразования словарей, таких как конвертирование между кодами и значениями словарей, перевод на основе информации о родительских словарях, полное преобразование значений/кодов словарей, анализ аннотаций словарей, работа с множественными данными словарей, использование пользовательского разделителя словарей, установка дефолтных значений и многое другое.* Аннотация словаря Аннотация cloud.agileframework.dictionary.annotation.Dictionary используется для добавления метаданных к свойствам POJO-классов. Она может использоваться через метод DictionaryUtil.cover или встроена в компоненты уровня базы данных для незаметной работы с данными.* Пользовательский разделитель словарей Разделитель словарей — это специальный символ, используемый для разделения уровней в полном пути словаря. Например, если словарь "Статус" имеет два значения "Открыто" и "Закрыто", то полное значение словаря будет "Статус/Открыто" и "Статус/Закрыто". Этот разделитель можно указывать при вызове инструмента перевода или аннотации словаря.

  • Поддержка различных типов данных Словарь поддерживает различные типы данных, такие как целочисленные, строки и перечисления. При работе с перечислениями используется имя элемента перечисления в качестве источника для конвертации. Примеры использования можно найти в тестовых примерах исходного кода.* Полное преобразование значений/кодов словарей В дополнение к текущему преобразованию значений/кодов словарей, также предоставляется возможность полного преобразования значений/кодов словарей со всеми родительскими значениями/кодами, разделёнными разделителем словарей. Например, если словарь "Статус" имеет два значения "Открыто" и "Закрыто", то текущие значения будут "Открыто" и "Закрыто", а полные значения соответственно "Статус/Открыто" и "Статус/Закрыто". То же самое относится к кодам словарей.*

  • Каскадные значения словарей В качестве примера можно рассмотреть каскадный словарь с такими атрибутами как "страна", "город" и "регион". В структуре данных часто присутствуют все эти три свойства одновременно. При переводе вложенного словаря требуется использовать значение родительского словаря. Поддержка этой функциональности реализована через аннотацию, которая используется следующим образом: country представляет страну, city — город, region — регион.* Изолированные источники данных Поддерживает наличие нескольких источников данных (нескольких словарей).

    private String country;
    private String city;
    private String region;

    @Dictionary(fieldName = {"country"})
    private String countryValue;
    @Dictionary(fieldName = {"country", "city"})
    private String cityValue;
    @Dictionary(fieldName = {"country", "city", "region"})
    private String regionValue;
  • Поддержка обратной и прямой конвертации Аннотация и инструменты поддерживают взаимное преобразование между кодом словаря и значением словаря. По умолчанию направление преобразования указывается через аннотацию, и это преобразование от кода словаря к значению словаря. Направление преобразования может быть изменено через параметр directionType, например:
    private String countryName;

    @Dictionary(fieldName = "countryName", directionType = DirectionType.NameToCode)
    private String countryCode;
  • Пользовательская персистентность данных По умолчанию данные словаря хранятся в памяти. Пользователи могут реализовать собственный способ персистентности данных словаря, реализовав интерфейс cloud.agileframework.dictionary.DictionaryDataManager. Например, можно использовать MySQL для хранения данных словаря. Структура данных словаря должна соответствовать интерфейсу cloud.agileframework.dictionary.DictionaryDatabase. При переходе на использование MySQL разработчики должны будут наследовать ORM-маппинг таблицы словаря от этого интерфейса и реализовать его методы.* Настройка соединения компонента По умолчанию включенный компонент можно настроить, установив параметр agile.dictionary.enable=true. Этот параметр по умолчанию имеет значение true. Пользователи также могут использовать механизм исключения Spring Boot для исключения загрузки компонента.

Быстрое начало работы

Первый проект начинается очень просто.

Шаг 1: Скачивание пакета

Вы можете скачать пакет с последней стабильной версией. Пакет уже загружен в центральный Maven-репозиторий и может быть указан непосредственно в pom.xml.

Пример использования версии agile-dictionary-2.1.0.M5.jar.

Шаг 2: Добавление зависимости Maven

<!-- Объявление центрального репозитория -->
<repository>
    <id>central</id>
    <url>https://repo1.maven.org/maven2/</url>
</repository>

<!-- Добавление зависимости -->
<dependency>
    <groupId>cloud.agileframework</groupId>
    <artifactId>agile-dictionary</artifactId>
    <version>2.1.0.M5</version>
</dependency>

Шаг 3: Из коробки

Обзор часто используемых методов:
    /**
     * Преобразование объекта словаря
     *
     * @param fullCode полный путь словарной записи, например status.yes
     * @return объект данных словаря
     */
    public static DictionaryDataBase coverDicBean(String fullCode);

    /**
     * Преобразование объекта словаря
     *
     * @param fullCode  полный путь словарной записи, например status-yes
     * @param splitChar пользовательский разделитель, например '-'
     * @return объект данных словаря
     */
    public static DictionaryDataBase coverDicBean(String fullCode, String splitChar);
```    /**
     * Преобразование объекта словаря
     *
     * @param fullName полный путь значения словаря
     * @return объект данных словаря
     */
    public static DictionaryDataBase convertDictionaryBeanByFullName(String fullName);

    /**
     * Преобразование объекта словаря
     *
     * @param fullName  полный путь значения словаря
     * @param splitChar пользовательский разделитель
     * @return объект данных словаря
     */
    public static DictionaryDataBase convertDictionaryBeanByFullName(String fullName, String splitChar);

    /**
     * Получение словаря по родительской словарной записи и значению подсловаря
     *
     * @param parentCode родительская словарная запись
     * @param name       значение подсловаря
     * @return данные словаря
     */
    public static DictionaryDataBase convertDictionaryBeanByParent(String parentCode, String name);

    /**
     * Преобразование кода в значение словаря
     *
     * @param fullCodes полный путь словарной записи, поддерживаются множественные записи с разделителем запятой, результат - значения без полного пути, разделённые запятой
     * @return значения словаря
     */
    public static String convertDictionaryName(String fullCodes);

    /**
     * Преобразование кода в значение словаря
     *
     * @param fullCodes   полный путь словарной записи, поддерживаются множественные записи с разделителем запятой, результат - значения без полного пути, разделённые запятой
     * @param defaultName значение по умолчанию при отсутствии соответствия
     * @return значения словаря
     */
    public static String convertDictionaryName(String fullCodes, String defaultName);```java
    /**
     * Преобразование значений словаря на основе родительского словаря и нескольких дочерних словарей (разделены запятой)
     *
     * @param parentCode   Код полного пути родительского словаря
     * @param codes        Коллекция кодов дочерних словарей, разделённых запятой
     * @param defaultValue Значение по умолчанию
     * @return Коллекция значений дочерних словарей без полного пути, разделённых запятой
     */
    public static String coverDicNameByParent(String parentCode, String codes, String defaultValue);

    /**
     * Преобразование значений словарей на основе родительского словаря и множественного потомков (через запятую)
     *
     * @param parentCode   Полный путь родительского кода словаря
     * @param codes        Коллекция кодов потомков, разделённых запятыми
     * @param defaultValue Значение по умолчанию
     * @param isFull       Режим полного пути для перевода (true - да, false - нет)
     * @param splitChar    Пользовательский разделитель
     * @return Значения словаря, разделённые запятыми
     */
    public static String coverDicNameByParent(String parentCode, String codes, String defaultValue, boolean isFull, String splitChar);
```    /**
     * Преобразование кода в значение словаря
     *
     * @param fullCodes   Полный путь кода словаря, поддерживающий несколько полных путей через запятую, результат — значения словаря, разделённые запятыми
     * @param defaultName Значение по умолчанию при отсутствии словаря
     * @param isFull      true — полное имя, false — значение словаря
     * @param splitChar   Пользовательский разделитель
     * @return Значение словаря
     */
    public static String coverDicName(String fullCodes, String defaultName, boolean isFull, String splitChar);

    /**
     * Преобразование значения словаря в код словаря
     *
     * @param fullNames Полный путь значения словаря, поддерживающий несколько полных путей через запятую, результат — коллекция кодов словаря, разделённых запятыми
     * @return Код словаря
     */
    public static String coverDicCode(String fullNames);

    /**
     * Преобразование значения словаря в код словаря
     * @param defaultCode Значение по умолчанию при отсутствии словаря
     * @param fullNames Полный путь значения словаря, поддерживающий несколько полных путей через запятую, результат — коллекция кодов словаря, разделённых запятыми
     * @return Код словаря
     */
    public static String coverDicCode(String fullNames, String defaultCode);    /**
     * Преобразование значений словаря на основе родительского значения и множества потомков (через запятую)
     *
     * @param parentName Полный путь родительского значения словаря
     * @param names      Коллекция значений потомков, разделённых запятыми
     * @return Коллекция кодов потомков, разделённых запятыми, без полного пути
     */
    public static String coverDicCodeByParent(String parentName, String names);    /**
     * Преобразование значений словаря на основе родительского значения и множества потомков (через запятую)
     *
     * @param parentName   Полный путь родительского значения словаря
     * @param names        Коллекция значений потомков, разделённых запятыми
     * @param defaultValue Значение по умолчанию
     * @return Коллекция кодов потомков, разделённых запятыми, без полного пути
     */
    public static String coverDicCodeByParent(String parentName, String names, String defaultValue);
    
    /**
     * Преобразование словарной кодировки на основе значений родительского словаря и значений дочерних словарей (через запятую)
     *
     * @param parentName   Полное имя родительского словаря
     * @param names        Коллекция значений дочерних словарей, разделённых запятыми
     * @param defaultValue Значение по умолчанию
     * @param isFull       Признак полного пути при переводе
     * @param splitChar    Разделитель
     * @return Словарная кодировка, разделённая запятыми
     */
    public static String coverDicCodeByParent(String parentName, String names, String defaultValue, boolean isFull, String splitChar);

    /**
     * Преобразование кодировки в значение словаря
     *
     * @param fullNames    Полное имя словаря, поддерживающее несколько полных имён словарей через запятую, результат — кодировка словаря без полного имени, разделённая запятыми
     * @param defaultName  Значение по умолчанию
     * @param isFull       true если полное имя, false если значение словаря
     * @param splitChar    Разделитель
     * @return Кодировка словаря
     */
    public static String coverDicCode(String fullNames, String defaultName, boolean isFull, String splitChar);    /**
     * Инструмент преобразования коллекций в словарную кодировку, преобразует в тип List/Map
     *
     * @param list           Коллекция для преобразования
     * @param dictionaryCode Используемый словарь
     * @param suffix         Конечный суффикс для хранения значения словаря
     * @param column         Количество колонок для преобразования
     * @param <T>            Генерик
     * @return Возвращает тип List/Map с добавленным _text полем
     * @throws NoSuchFieldException   Исключение "нет такого поля"
     * @throws IllegalAccessException Исключение "недопустимый доступ"
     */
    public static <T> List<Map<String, Object>> coverMapDictionary(List<T> list, String dictionaryCode, String suffix, String column);```markdown
/**
 * Преобразование объекта в словарь
 *
 * @param o               Объект POJO или Map
 * @param dictionaryCodes Словарные кодировки для колонок, количество должно совпадать с количеством колонок
 * @param suffix          Заключительный суффикс для хранения значения словаря
 * @param columns         Колонки для преобразования
 * @param <T>             Генерик
 * @return Преобразованное значение Map
 * @throws NoSuchFieldException   Исключение "нет такого поля"
 * @throws IllegalAccessException Исключение "недопустимый доступ"
 */
public static <T> Map<String, Object> coverMapDictionary(T o, String[] dictionaryCodes, String suffix, String[] columns);

/**
 * Инструмент преобразования типов коллекций в список/List/T типа
 *
 * @param list            Коллекция, которую требуется преобразовать
 * @param dictionaryCodes Используемые коды словарей
 * @param columns         Набор полей для преобразования
 * @param <T>             Генерик
 * @return Возвращает список/List/Map типа, поля со словарными кодами автоматически преобразуются в значения словарей
 */
public static <T> List<T> coverBeanDictionary(List<T> list, String[] dictionaryCodes, String[] columns, String[] textColumns, String[] defaultValues);
```Примечание: В данном контексте "generic type" обычно не переводится, так как это общепринятый термин в программировании. Однако, если требуется более подробное объяснение, можно использовать "общий тип".

```markdown
/**
 * Автоматическое преобразование словарей, анализирует аннотацию Dictionary
 *
 * @param o   Целевой объект данных
 * @param <T> Общий тип
 */
public static <T> void cover(T o);

/**
 * Автоматическое преобразование словарей, анализирует аннотацию Dictionary
 *
 * @param list Целевой список объектов данных
 * @param <T>  Общий тип
 */
public static <T> void cover(List<T> list);
Использование аннотации словаря: cloud.agileframework.dictionary.annotation.Dictionary
    public static class TuDou {
        /**
         * Ключ словаря
         */
        private String status;

        /**
         * Приведённое значение словаря после перевода
         */
        @Dictionary(fieldName = "status", isFull = true)
        private String text;
        ...
    }

Этот объект или этот набор объектов может быть использован в качестве аргумента при вызове метода cover класса DictionaryUtil, что приведёт к автоматическому заполнению значения text с помощью ключа status.

Настройка пользовательского способа хранения

По умолчанию используется способ хранения в памяти. Когда разработчики хотят использовать пользовательский способ хранения, они могут реализовать или расширить указанные выше интерфейсы и внедрить эти реализации в контейнер Spring.


```markdown
//DictionaryDataBase: базовый класс структурированных данных словаря (обычно используется для ORM отображения таблиц словарей в базе данных), предоставляет id, parentId, children, sort и другие свойства
@Entity
public class MyDictionaryDo extends DictionaryDataBase {
    //Примечание
    private String commit;
    //
}

Инструмент управления пользовательским хранением данных словаря

//AbstractDictionaryDataManager: абстрактный менеджер данных словаря (предоставляет API взаимодействия с уровнем хранения, такие как операции CRUD словаря и синхронизация вторичного кэша)
@Service
public class MyDictionaryService extends AbstractDictionaryDataManager {
    ...
}

//Общее использование
//Обратите внимание, что методы add, update и другие в MyDictionaryService являются прямыми операциями уровня хранения, тогда как методы add, update и другие внутри sync() выполняют операции уровня хранения + синхронизацию первичного и вторичного кэшей
@Autowired
private MyDictionaryService service;

public void crud(MyDictionaryDo dic) {
    //Добавление
    service.sync().add(dic);
    //Редактирование
    service.sync().update(dic);
    //Удаление
    service.sync().delete(dic);
    //Запрос
    service.sync().all();
    service.sync().tree();
}
Аннотация словаря

Аннотация словаря позволяет определять словарь перевода, направление перевода, полное путь значений, разделители перевода и другие параметры.

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dictionary {
```    String NULL = "null";

    /**
     * Код словаря
     */
    String dicCode() default "";

    /**
     * Название поля словаря
     */
    String[] fieldName();

    /**
     * Включает ли полное путь к значениям
     */
    boolean isFull() default false;

    /**
     * Разделитель полного пути к значениям
     */
    String split() default ".";

    /**
     * Направление перевода
     */
    DirectionType directionType() default DirectionType.CODE_TO_NAME;

    /**
     * Значение по умолчанию при отсутствии данных
     */
    String defaultValue() default NULL;

    /**
     * Является ли это первичным ключом
     *
     * Если является первичным ключом, то вызывается метод findById
     */
    boolean id() default false;

    /**
     * Определение источника данных
     */
    String dataSource() default Constant.AgileAbout.DIC_DATASOURCE;
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Словарь-анализатор Автоматическая загрузка. После интеграции этого компонента данные словаря будут загружаться вместе с запуском spring-приложения. Данные словаря в постоянном слое будут загружаться как кэш, чтобы повысить производительность запросов к кэшу. Синхронизация кэша. Интеграция компонента кэширования agile-cache позволяет реализоват... Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/agile-framework-agile-dictionary.git
git@api.gitlife.ru:oschina-mirror/agile-framework-agile-dictionary.git
oschina-mirror
agile-framework-agile-dictionary
agile-framework-agile-dictionary
master