При редактировании бизнес-контента, записывается информация о том, кто, когда и с какого IP-адреса внес изменения (включая исходное и измененное значения), сохраняется в базе данных (начиная с версии OnClickListener.3, ограничение на использование базы данных снято, теперь можно использовать любые пользовательские способы сохранения). С версии 1.1.0 проект перенесен на Spring Boot 2.0. Для использования версии 1.0 используйте 1.0.9.
Обновление 8 июня 2020: Удалены неправильные реализации кэширования, улучшена структура методов API, разделены методы получения новых и старых данных для удобства кэширования, удалены стандартные реализации кэширования, рекомендуется реализовать собственное кэширование.
Обновление 20 января 2020: Удалены зависимости от FastJSON, уменьшено количество лишних зависимостей, добавлено стандартное кэширование для предотвращения необходимости обращения к базе данных при каждом запросе. Если требуется кэширование, рекомендуется использовать стандартное кэширование как пример для реализации собственного парсера и включения собственного кэширования. Обновление 19 января 2020: Решены проблемы с параллельным доступом, проект перенесен на GitHub (будет обновляться и на Gitee), используется GitHub Actions для автоматической загрузки в официальный Maven репозиторий.
Обновление 12 декабря 2019: Улучшена структура хранения информации в объекте operateLog, улучшена возможность настройки пользовательского logService, добавлены примеры кода для упрощения использования.
Обновление 2 июля 2019: В связи с тем, что некоторые пользователи спрашивали, как использовать проект, добавлена функция автоматической загрузки через starter, теперь можно использовать проект, добавив зависимость в pom.
GitHub адрес: https://github.com/lwydyby/wwmxd-log
<dependency>
<groupId>com.gitee.lwydyby</groupId>
<artifactId>wwmxd-log</artifactId>
<version>${latest.version}</version>
</dependency>
```### Требования
- Maven
- JDK 1. 8
- Spring Boot 2. 1. 5 RELEASE
### Использование
1. Используйте аннотацию `@EnableModifyLog` на методах, где требуется запись. Параметры аннотации следующие:
```java
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface EnableModifyLog {
/**
* @return Описание операции на русском языке. Можно использовать ModifyName.
*/
ModifyName modifyType() default ModifyName.UPDATE;
/**
* @return Класс для парсинга данных. По умолчанию используется DefaultContentParse.
*/
Class parseclass() default DefaultContentParse.class;
/**
* @return Класс сервиса для выполнения запроса к базе данных.
*/
Class serviceclass() default IService.class;
/**
* @return Имя конкретной бизнес-операции.
*/
String handleName() default "";
/**
* @return Необходимость использования стандартного сравнения изменений.
*/
boolean needDefaultCompare() default false;
/**
* @return Тип идентификатора.
*/
Class idType() default String.class;
/**
* @return Использование стандартного кэша.
*/
boolean defaultCache() default false;
}
```
Пример простого использования:
```java
@EnableModifyLog(modifyType = ModifyName.SAVE, serviceclass = DemoService.class)
public BaseResponse addDemo(@RequestBody Demo demo) {
// . . .
}
```
2. Создайте класс для парсинга данных. По умолчанию используется `DefaultContentParse`, который использует идентификатор для запроса. Для создания собственного парсера, наследуйте интерфейс `ContentParser` и укажите его в аннотации.
```java
/**
* Базовый класс для парсинга данных.
*/```markdown
* Для одиночных таблиц можно использовать идентификатор для запроса.
* Для сложных запросов к нескольким таблицам создайте собственные классы.
* @author zk
* @date 2018-03-02
*/
public class DefaultContentParse implements ContentParser {
@Override
public Object getOldResult(JoinPoint joinPoint, EnableModifyLog enableModifyLog) {
Object info = joinPoint.getArgs()[0];
Object id = ReflectionUtils.getFieldValue(info, "id");
Assert.notNull(id, "Не удалось получить идентификатор. Проверьте переданные параметры.");
Class idType = enableModifyLog.idType();
if (idType.isInstance(id)) {
Class cls = enableModifyLog.serviceclass();
IService service = (IService) SpringUtil.getBean(cls);
Object result = service.selectById((S) idType.cast(id));
return result;
} else {
throw new RuntimeException("Проверьте тип id");
}
}
@Override
public Object getNewResult(JoinPoint joinPoint, EnableModifyLog enableModifyLog) {
return getOldResult(joinPoint, enableModifyLog);
}
}
3. Реализация пользовательского метода запроса для интерфейса IService (не ограничивается только прямым запросом к базе данных, если учитывать нагрузку на производительность, можно использовать кэш)
```java
public interface IService<T, S> {
T selectById(S id);
}
```4. Реализация интерфейса OperatelogService по требованию (можно использовать JPA или MyBatis)
```java
public interface OperatelogService {
void insert(Operatelog operatelog);
}
public enum ModifyName {
SAVE, UPDATE, DELETE, GET;
}
@DataName(name="Дата операции")
private String modifydate;
Для справки, можно использовать свои запросы
DROP TABLE IF EXISTS `operatelog`;
CREATE TABLE `operatelog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Пользователь',
`modifydate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Дата операции',
`modifyname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Название операции',
`modifyobject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Объект операции',
`modifycontent` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Содержание операции',
`modifyip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'IP',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )