From f6d6d67718cbc574fea51f5e5e693ecd1cccf91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Mon, 27 Apr 2026 13:30:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(db):=20=E8=BF=81=E7=A7=BB=20manage-db=20Ja?= =?UTF-8?q?va=20=E6=BA=90=E4=BB=A3=E7=A0=81=EF=BC=88=E4=BB=BB=E5=8A=A1=20T?= =?UTF-8?q?1.2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除原有 Java 源代码 - 从 gym-manage 复制 Java 源代码 - 批量替换包名:cn.novalon.gym.manage → cn.novalon.manage - 编译验证通过 相关文档: docs/superpowers/specs/2026-04-27-migration-phase-1.json --- .../db/converter/AuditLogConverter.java | 9 +++---- .../manage/db/entity/AuditLogEntity.java | 13 +++++----- .../novalon/manage/db/entity/BaseEntity.java | 24 ++++++++++--------- .../db/repository/AuditLogRepository.java | 11 ++++++++- .../db/repository/OperationLogRepository.java | 6 +++++ .../db/repository/SysMenuRepository.java | 14 +++++++++++ .../repository/SysPermissionRepository.java | 15 ++++++++++-- .../SysRolePermissionRepository.java | 15 ++++++++++-- .../db/repository/SysRoleRepository.java | 7 ++++++ .../db/repository/SysUserRepository.java | 16 +++++++++++++ 10 files changed, 104 insertions(+), 26 deletions(-) diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/AuditLogConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/AuditLogConverter.java index c55186f..d124e6a 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/AuditLogConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/AuditLogConverter.java @@ -2,6 +2,7 @@ package cn.novalon.manage.db.converter; import cn.novalon.manage.sys.audit.domain.AuditLog; import cn.novalon.manage.db.entity.AuditLogEntity; +import io.r2dbc.postgresql.codec.Json; import org.springframework.stereotype.Component; @@ -28,8 +29,8 @@ public class AuditLogConverter { domain.setOperationType(entity.getOperationType()); domain.setOperator(entity.getOperator()); domain.setOperationTime(entity.getOperationTime()); - domain.setBeforeData(entity.getBeforeData()); - domain.setAfterData(entity.getAfterData()); + domain.setBeforeData(entity.getBeforeData() != null ? entity.getBeforeData().asString() : null); + domain.setAfterData(entity.getAfterData() != null ? entity.getAfterData().asString() : null); domain.setChangedFields(entity.getChangedFields()); domain.setIpAddress(entity.getIpAddress()); domain.setUserAgent(entity.getUserAgent()); @@ -53,8 +54,8 @@ public class AuditLogConverter { entity.setOperationType(domain.getOperationType()); entity.setOperator(domain.getOperator()); entity.setOperationTime(domain.getOperationTime()); - entity.setBeforeData(domain.getBeforeData()); - entity.setAfterData(domain.getAfterData()); + entity.setBeforeData(domain.getBeforeData() != null ? Json.of(domain.getBeforeData()) : null); + entity.setAfterData(domain.getAfterData() != null ? Json.of(domain.getAfterData()) : null); entity.setChangedFields(domain.getChangedFields()); entity.setIpAddress(domain.getIpAddress()); entity.setUserAgent(domain.getUserAgent()); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/AuditLogEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/AuditLogEntity.java index a73dc03..29b55c5 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/AuditLogEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/AuditLogEntity.java @@ -1,5 +1,6 @@ package cn.novalon.manage.db.entity; +import io.r2dbc.postgresql.codec.Json; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; @@ -28,10 +29,10 @@ public class AuditLogEntity extends BaseEntity { private java.time.LocalDateTime operationTime; @Column("before_data") - private String beforeData; + private Json beforeData; @Column("after_data") - private String afterData; + private Json afterData; @Column("changed_fields") private String[] changedFields; @@ -85,19 +86,19 @@ public class AuditLogEntity extends BaseEntity { this.operationTime = operationTime; } - public String getBeforeData() { + public Json getBeforeData() { return beforeData; } - public void setBeforeData(String beforeData) { + public void setBeforeData(Json beforeData) { this.beforeData = beforeData; } - public String getAfterData() { + public Json getAfterData() { return afterData; } - public void setAfterData(String afterData) { + public void setAfterData(Json afterData) { this.afterData = afterData; } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/BaseEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/BaseEntity.java index 47855f7..201fb65 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/BaseEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/BaseEntity.java @@ -5,17 +5,12 @@ import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.annotation.Transient; import org.springframework.data.domain.Persistable; import org.springframework.data.relational.core.mapping.Column; import java.time.LocalDateTime; -/** - * 数据库实体基类 - * - * @author 张翔 - * @date 2026-03-13 - */ public abstract class BaseEntity implements Persistable { @Id @@ -40,6 +35,9 @@ public abstract class BaseEntity implements Persistable { @Column("deleted_at") private LocalDateTime deletedAt; + @Transient + private boolean newEntity = true; + @Override public Long getId() { return id; @@ -89,12 +87,16 @@ public abstract class BaseEntity implements Persistable { this.deletedAt = deletedAt; } - /** - * 判断实体是否为新的 - * 如果createdAt为null,则认为是新实体 - */ @Override public boolean isNew() { - return createdAt == null; + return newEntity; + } + + public void markNotNew() { + this.newEntity = false; + } + + public void markNew() { + this.newEntity = true; } } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/AuditLogRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/AuditLogRepository.java index 18c2925..0ae8228 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/AuditLogRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/AuditLogRepository.java @@ -7,6 +7,7 @@ import cn.novalon.manage.db.dao.AuditLogDao; import cn.novalon.manage.db.entity.AuditLogEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -26,10 +27,12 @@ public class AuditLogRepository implements IAuditLogRepository { private final AuditLogDao auditLogDao; private final AuditLogConverter auditLogConverter; + private final R2dbcEntityTemplate r2dbcEntityTemplate; - public AuditLogRepository(AuditLogDao auditLogDao, AuditLogConverter auditLogConverter) { + public AuditLogRepository(AuditLogDao auditLogDao, AuditLogConverter auditLogConverter, R2dbcEntityTemplate r2dbcEntityTemplate) { this.auditLogDao = auditLogDao; this.auditLogConverter = auditLogConverter; + this.r2dbcEntityTemplate = r2dbcEntityTemplate; } @Override @@ -41,6 +44,12 @@ public class AuditLogRepository implements IAuditLogRepository { @Override public Mono save(AuditLog auditLog) { AuditLogEntity entity = auditLogConverter.toEntity(auditLog); + if (entity.isNew()) { + return r2dbcEntityTemplate.insert(AuditLogEntity.class) + .using(entity) + .doOnNext(e -> e.markNotNew()) + .map(auditLogConverter::toDomain); + } return auditLogDao.save(entity) .map(auditLogConverter::toDomain); } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/OperationLogRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/OperationLogRepository.java index 0c47214..2b12965 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/OperationLogRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/OperationLogRepository.java @@ -49,6 +49,12 @@ public class OperationLogRepository implements IOperationLogRepository { @Override public Mono save(OperationLog operationLog) { OperationLogEntity entity = operationLogConverter.toEntity(operationLog); + if (entity.isNew()) { + return r2dbcEntityTemplate.insert(OperationLogEntity.class) + .using(entity) + .doOnNext(e -> e.markNotNew()) + .map(operationLogConverter::toDomain); + } return operationLogDao.save(entity) .map(operationLogConverter::toDomain); } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysMenuRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysMenuRepository.java index a6b2922..74fdc5b 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysMenuRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysMenuRepository.java @@ -60,6 +60,20 @@ public class SysMenuRepository implements ISysMenuRepository { @Override public Mono save(SysMenu sysMenu) { SysMenuEntity entity = sysMenuConverter.toEntity(sysMenu); + if (entity.isNew()) { + return r2dbcEntityTemplate.insert(SysMenuEntity.class) + .using(entity) + .doOnNext(e -> e.markNotNew()) + .map(sysMenuConverter::toDomain); + } + return sysMenuDao.save(entity) + .map(sysMenuConverter::toDomain); + } + + @Override + public Mono update(SysMenu sysMenu) { + SysMenuEntity entity = sysMenuConverter.toEntity(sysMenu); + entity.markNotNew(); return sysMenuDao.save(entity) .map(sysMenuConverter::toDomain); } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysPermissionRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysPermissionRepository.java index 1c5d234..ed44e8e 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysPermissionRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysPermissionRepository.java @@ -4,7 +4,9 @@ import cn.novalon.manage.sys.core.domain.SysPermission; import cn.novalon.manage.sys.core.repository.ISysPermissionRepository; import cn.novalon.manage.db.converter.SysPermissionConverter; import cn.novalon.manage.db.dao.SysPermissionDao; +import cn.novalon.manage.db.entity.SysPermissionEntity; import org.springframework.data.domain.Sort; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -20,10 +22,12 @@ public class SysPermissionRepository implements ISysPermissionRepository { private final SysPermissionDao sysPermissionDao; private final SysPermissionConverter sysPermissionConverter; + private final R2dbcEntityTemplate r2dbcEntityTemplate; - public SysPermissionRepository(SysPermissionDao sysPermissionDao, SysPermissionConverter sysPermissionConverter) { + public SysPermissionRepository(SysPermissionDao sysPermissionDao, SysPermissionConverter sysPermissionConverter, R2dbcEntityTemplate r2dbcEntityTemplate) { this.sysPermissionDao = sysPermissionDao; this.sysPermissionConverter = sysPermissionConverter; + this.r2dbcEntityTemplate = r2dbcEntityTemplate; } @Override @@ -40,7 +44,14 @@ public class SysPermissionRepository implements ISysPermissionRepository { @Override public Mono save(SysPermission sysPermission) { - return sysPermissionDao.save(sysPermissionConverter.toEntity(sysPermission)) + SysPermissionEntity entity = sysPermissionConverter.toEntity(sysPermission); + if (entity.isNew()) { + return r2dbcEntityTemplate.insert(SysPermissionEntity.class) + .using(entity) + .doOnNext(e -> e.markNotNew()) + .map(sysPermissionConverter::toDomain); + } + return sysPermissionDao.save(entity) .map(sysPermissionConverter::toDomain); } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRolePermissionRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRolePermissionRepository.java index 7f99baa..6bae21a 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRolePermissionRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRolePermissionRepository.java @@ -4,6 +4,8 @@ import cn.novalon.manage.sys.core.domain.SysRolePermission; import cn.novalon.manage.sys.core.repository.ISysRolePermissionRepository; import cn.novalon.manage.db.converter.SysRolePermissionConverter; import cn.novalon.manage.db.dao.SysRolePermissionDao; +import cn.novalon.manage.db.entity.SysRolePermissionEntity; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -19,15 +21,24 @@ public class SysRolePermissionRepository implements ISysRolePermissionRepository private final SysRolePermissionDao sysRolePermissionDao; private final SysRolePermissionConverter sysRolePermissionConverter; + private final R2dbcEntityTemplate r2dbcEntityTemplate; - public SysRolePermissionRepository(SysRolePermissionDao sysRolePermissionDao, SysRolePermissionConverter sysRolePermissionConverter) { + public SysRolePermissionRepository(SysRolePermissionDao sysRolePermissionDao, SysRolePermissionConverter sysRolePermissionConverter, R2dbcEntityTemplate r2dbcEntityTemplate) { this.sysRolePermissionDao = sysRolePermissionDao; this.sysRolePermissionConverter = sysRolePermissionConverter; + this.r2dbcEntityTemplate = r2dbcEntityTemplate; } @Override public Mono save(SysRolePermission rolePermission) { - return sysRolePermissionDao.save(sysRolePermissionConverter.toEntity(rolePermission)) + SysRolePermissionEntity entity = sysRolePermissionConverter.toEntity(rolePermission); + if (entity.isNew()) { + return r2dbcEntityTemplate.insert(SysRolePermissionEntity.class) + .using(entity) + .doOnNext(e -> e.markNotNew()) + .map(sysRolePermissionConverter::toDomain); + } + return sysRolePermissionDao.save(entity) .map(sysRolePermissionConverter::toDomain); } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRoleRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRoleRepository.java index 39ac854..bdbcfa3 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRoleRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRoleRepository.java @@ -53,6 +53,12 @@ public class SysRoleRepository implements ISysRoleRepository { @Override public Mono save(SysRole sysRole) { SysRoleEntity entity = sysRoleConverter.toEntity(sysRole); + if (entity.isNew()) { + return r2dbcEntityTemplate.insert(SysRoleEntity.class) + .using(entity) + .doOnNext(e -> e.markNotNew()) + .map(sysRoleConverter::toDomain); + } return sysRoleDao.save(entity) .map(sysRoleConverter::toDomain); } @@ -156,6 +162,7 @@ public class SysRoleRepository implements ISysRoleRepository { @Override public Mono updateRole(SysRole role) { SysRoleEntity entity = sysRoleConverter.toEntity(role); + entity.markNotNew(); return sysRoleDao.save(entity) .map(sysRoleConverter::toDomain); } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserRepository.java index c6bccf5..1364d2d 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserRepository.java @@ -70,6 +70,20 @@ public class SysUserRepository implements ISysUserRepository { @Override public Mono save(SysUser sysUser) { SysUserEntity entity = sysUserConverter.toEntity(sysUser); + if (entity.isNew()) { + return r2dbcEntityTemplate.insert(SysUserEntity.class) + .using(entity) + .doOnNext(e -> e.markNotNew()) + .map(sysUserConverter::toDomain); + } + return sysUserDao.save(entity) + .map(sysUserConverter::toDomain); + } + + @Override + public Mono update(SysUser sysUser) { + SysUserEntity entity = sysUserConverter.toEntity(sysUser); + entity.markNotNew(); return sysUserDao.save(entity) .map(sysUserConverter::toDomain); } @@ -176,6 +190,7 @@ public class SysUserRepository implements ISysUserRepository { public Mono logicalDeleteById(Long id) { return sysUserDao.findById(id) .flatMap(entity -> { + entity.markNotNew(); entity.setDeletedAt(java.time.LocalDateTime.now()); return sysUserDao.save(entity).then(); }); @@ -192,6 +207,7 @@ public class SysUserRepository implements ISysUserRepository { public Mono restoreById(Long id) { return sysUserDao.findById(id) .flatMap(entity -> { + entity.markNotNew(); entity.setDeletedAt(null); return sysUserDao.save(entity).then(); });