feat(db): 迁移 manage-db Java 源代码(任务 T1.2)

- 删除原有 Java 源代码
- 从 gym-manage 复制 Java 源代码
- 批量替换包名:cn.novalon.gym.manage → cn.novalon.manage
- 编译验证通过

相关文档: docs/superpowers/specs/2026-04-27-migration-phase-1.json
This commit is contained in:
张翔
2026-04-27 13:30:36 +08:00
parent 90a3be5376
commit f6d6d67718
10 changed files with 104 additions and 26 deletions
@@ -2,6 +2,7 @@ package cn.novalon.manage.db.converter;
import cn.novalon.manage.sys.audit.domain.AuditLog; import cn.novalon.manage.sys.audit.domain.AuditLog;
import cn.novalon.manage.db.entity.AuditLogEntity; import cn.novalon.manage.db.entity.AuditLogEntity;
import io.r2dbc.postgresql.codec.Json;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -28,8 +29,8 @@ public class AuditLogConverter {
domain.setOperationType(entity.getOperationType()); domain.setOperationType(entity.getOperationType());
domain.setOperator(entity.getOperator()); domain.setOperator(entity.getOperator());
domain.setOperationTime(entity.getOperationTime()); domain.setOperationTime(entity.getOperationTime());
domain.setBeforeData(entity.getBeforeData()); domain.setBeforeData(entity.getBeforeData() != null ? entity.getBeforeData().asString() : null);
domain.setAfterData(entity.getAfterData()); domain.setAfterData(entity.getAfterData() != null ? entity.getAfterData().asString() : null);
domain.setChangedFields(entity.getChangedFields()); domain.setChangedFields(entity.getChangedFields());
domain.setIpAddress(entity.getIpAddress()); domain.setIpAddress(entity.getIpAddress());
domain.setUserAgent(entity.getUserAgent()); domain.setUserAgent(entity.getUserAgent());
@@ -53,8 +54,8 @@ public class AuditLogConverter {
entity.setOperationType(domain.getOperationType()); entity.setOperationType(domain.getOperationType());
entity.setOperator(domain.getOperator()); entity.setOperator(domain.getOperator());
entity.setOperationTime(domain.getOperationTime()); entity.setOperationTime(domain.getOperationTime());
entity.setBeforeData(domain.getBeforeData()); entity.setBeforeData(domain.getBeforeData() != null ? Json.of(domain.getBeforeData()) : null);
entity.setAfterData(domain.getAfterData()); entity.setAfterData(domain.getAfterData() != null ? Json.of(domain.getAfterData()) : null);
entity.setChangedFields(domain.getChangedFields()); entity.setChangedFields(domain.getChangedFields());
entity.setIpAddress(domain.getIpAddress()); entity.setIpAddress(domain.getIpAddress());
entity.setUserAgent(domain.getUserAgent()); entity.setUserAgent(domain.getUserAgent());
@@ -1,5 +1,6 @@
package cn.novalon.manage.db.entity; 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.Column;
import org.springframework.data.relational.core.mapping.Table; import org.springframework.data.relational.core.mapping.Table;
@@ -28,10 +29,10 @@ public class AuditLogEntity extends BaseEntity {
private java.time.LocalDateTime operationTime; private java.time.LocalDateTime operationTime;
@Column("before_data") @Column("before_data")
private String beforeData; private Json beforeData;
@Column("after_data") @Column("after_data")
private String afterData; private Json afterData;
@Column("changed_fields") @Column("changed_fields")
private String[] changedFields; private String[] changedFields;
@@ -85,19 +86,19 @@ public class AuditLogEntity extends BaseEntity {
this.operationTime = operationTime; this.operationTime = operationTime;
} }
public String getBeforeData() { public Json getBeforeData() {
return beforeData; return beforeData;
} }
public void setBeforeData(String beforeData) { public void setBeforeData(Json beforeData) {
this.beforeData = beforeData; this.beforeData = beforeData;
} }
public String getAfterData() { public Json getAfterData() {
return afterData; return afterData;
} }
public void setAfterData(String afterData) { public void setAfterData(Json afterData) {
this.afterData = afterData; this.afterData = afterData;
} }
@@ -5,17 +5,12 @@ import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.annotation.Transient;
import org.springframework.data.domain.Persistable; import org.springframework.data.domain.Persistable;
import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Column;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/**
* 数据库实体基类
*
* @author 张翔
* @date 2026-03-13
*/
public abstract class BaseEntity implements Persistable<Long> { public abstract class BaseEntity implements Persistable<Long> {
@Id @Id
@@ -40,6 +35,9 @@ public abstract class BaseEntity implements Persistable<Long> {
@Column("deleted_at") @Column("deleted_at")
private LocalDateTime deletedAt; private LocalDateTime deletedAt;
@Transient
private boolean newEntity = true;
@Override @Override
public Long getId() { public Long getId() {
return id; return id;
@@ -89,12 +87,16 @@ public abstract class BaseEntity implements Persistable<Long> {
this.deletedAt = deletedAt; this.deletedAt = deletedAt;
} }
/**
* 判断实体是否为新的
* 如果createdAt为null,则认为是新实体
*/
@Override @Override
public boolean isNew() { public boolean isNew() {
return createdAt == null; return newEntity;
}
public void markNotNew() {
this.newEntity = false;
}
public void markNew() {
this.newEntity = true;
} }
} }
@@ -7,6 +7,7 @@ import cn.novalon.manage.db.dao.AuditLogDao;
import cn.novalon.manage.db.entity.AuditLogEntity; import cn.novalon.manage.db.entity.AuditLogEntity;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@@ -26,10 +27,12 @@ public class AuditLogRepository implements IAuditLogRepository {
private final AuditLogDao auditLogDao; private final AuditLogDao auditLogDao;
private final AuditLogConverter auditLogConverter; 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.auditLogDao = auditLogDao;
this.auditLogConverter = auditLogConverter; this.auditLogConverter = auditLogConverter;
this.r2dbcEntityTemplate = r2dbcEntityTemplate;
} }
@Override @Override
@@ -41,6 +44,12 @@ public class AuditLogRepository implements IAuditLogRepository {
@Override @Override
public Mono<AuditLog> save(AuditLog auditLog) { public Mono<AuditLog> save(AuditLog auditLog) {
AuditLogEntity entity = auditLogConverter.toEntity(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) return auditLogDao.save(entity)
.map(auditLogConverter::toDomain); .map(auditLogConverter::toDomain);
} }
@@ -49,6 +49,12 @@ public class OperationLogRepository implements IOperationLogRepository {
@Override @Override
public Mono<OperationLog> save(OperationLog operationLog) { public Mono<OperationLog> save(OperationLog operationLog) {
OperationLogEntity entity = operationLogConverter.toEntity(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) return operationLogDao.save(entity)
.map(operationLogConverter::toDomain); .map(operationLogConverter::toDomain);
} }
@@ -60,6 +60,20 @@ public class SysMenuRepository implements ISysMenuRepository {
@Override @Override
public Mono<SysMenu> save(SysMenu sysMenu) { public Mono<SysMenu> save(SysMenu sysMenu) {
SysMenuEntity entity = sysMenuConverter.toEntity(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<SysMenu> update(SysMenu sysMenu) {
SysMenuEntity entity = sysMenuConverter.toEntity(sysMenu);
entity.markNotNew();
return sysMenuDao.save(entity) return sysMenuDao.save(entity)
.map(sysMenuConverter::toDomain); .map(sysMenuConverter::toDomain);
} }
@@ -4,7 +4,9 @@ import cn.novalon.manage.sys.core.domain.SysPermission;
import cn.novalon.manage.sys.core.repository.ISysPermissionRepository; import cn.novalon.manage.sys.core.repository.ISysPermissionRepository;
import cn.novalon.manage.db.converter.SysPermissionConverter; import cn.novalon.manage.db.converter.SysPermissionConverter;
import cn.novalon.manage.db.dao.SysPermissionDao; import cn.novalon.manage.db.dao.SysPermissionDao;
import cn.novalon.manage.db.entity.SysPermissionEntity;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@@ -20,10 +22,12 @@ public class SysPermissionRepository implements ISysPermissionRepository {
private final SysPermissionDao sysPermissionDao; private final SysPermissionDao sysPermissionDao;
private final SysPermissionConverter sysPermissionConverter; 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.sysPermissionDao = sysPermissionDao;
this.sysPermissionConverter = sysPermissionConverter; this.sysPermissionConverter = sysPermissionConverter;
this.r2dbcEntityTemplate = r2dbcEntityTemplate;
} }
@Override @Override
@@ -40,7 +44,14 @@ public class SysPermissionRepository implements ISysPermissionRepository {
@Override @Override
public Mono<SysPermission> save(SysPermission sysPermission) { public Mono<SysPermission> 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); .map(sysPermissionConverter::toDomain);
} }
@@ -4,6 +4,8 @@ import cn.novalon.manage.sys.core.domain.SysRolePermission;
import cn.novalon.manage.sys.core.repository.ISysRolePermissionRepository; import cn.novalon.manage.sys.core.repository.ISysRolePermissionRepository;
import cn.novalon.manage.db.converter.SysRolePermissionConverter; import cn.novalon.manage.db.converter.SysRolePermissionConverter;
import cn.novalon.manage.db.dao.SysRolePermissionDao; 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 org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@@ -19,15 +21,24 @@ public class SysRolePermissionRepository implements ISysRolePermissionRepository
private final SysRolePermissionDao sysRolePermissionDao; private final SysRolePermissionDao sysRolePermissionDao;
private final SysRolePermissionConverter sysRolePermissionConverter; 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.sysRolePermissionDao = sysRolePermissionDao;
this.sysRolePermissionConverter = sysRolePermissionConverter; this.sysRolePermissionConverter = sysRolePermissionConverter;
this.r2dbcEntityTemplate = r2dbcEntityTemplate;
} }
@Override @Override
public Mono<SysRolePermission> save(SysRolePermission rolePermission) { public Mono<SysRolePermission> 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); .map(sysRolePermissionConverter::toDomain);
} }
@@ -53,6 +53,12 @@ public class SysRoleRepository implements ISysRoleRepository {
@Override @Override
public Mono<SysRole> save(SysRole sysRole) { public Mono<SysRole> save(SysRole sysRole) {
SysRoleEntity entity = sysRoleConverter.toEntity(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) return sysRoleDao.save(entity)
.map(sysRoleConverter::toDomain); .map(sysRoleConverter::toDomain);
} }
@@ -156,6 +162,7 @@ public class SysRoleRepository implements ISysRoleRepository {
@Override @Override
public Mono<SysRole> updateRole(SysRole role) { public Mono<SysRole> updateRole(SysRole role) {
SysRoleEntity entity = sysRoleConverter.toEntity(role); SysRoleEntity entity = sysRoleConverter.toEntity(role);
entity.markNotNew();
return sysRoleDao.save(entity) return sysRoleDao.save(entity)
.map(sysRoleConverter::toDomain); .map(sysRoleConverter::toDomain);
} }
@@ -70,6 +70,20 @@ public class SysUserRepository implements ISysUserRepository {
@Override @Override
public Mono<SysUser> save(SysUser sysUser) { public Mono<SysUser> save(SysUser sysUser) {
SysUserEntity entity = sysUserConverter.toEntity(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<SysUser> update(SysUser sysUser) {
SysUserEntity entity = sysUserConverter.toEntity(sysUser);
entity.markNotNew();
return sysUserDao.save(entity) return sysUserDao.save(entity)
.map(sysUserConverter::toDomain); .map(sysUserConverter::toDomain);
} }
@@ -176,6 +190,7 @@ public class SysUserRepository implements ISysUserRepository {
public Mono<Void> logicalDeleteById(Long id) { public Mono<Void> logicalDeleteById(Long id) {
return sysUserDao.findById(id) return sysUserDao.findById(id)
.flatMap(entity -> { .flatMap(entity -> {
entity.markNotNew();
entity.setDeletedAt(java.time.LocalDateTime.now()); entity.setDeletedAt(java.time.LocalDateTime.now());
return sysUserDao.save(entity).then(); return sysUserDao.save(entity).then();
}); });
@@ -192,6 +207,7 @@ public class SysUserRepository implements ISysUserRepository {
public Mono<Void> restoreById(Long id) { public Mono<Void> restoreById(Long id) {
return sysUserDao.findById(id) return sysUserDao.findById(id)
.flatMap(entity -> { .flatMap(entity -> {
entity.markNotNew();
entity.setDeletedAt(null); entity.setDeletedAt(null);
return sysUserDao.save(entity).then(); return sysUserDao.save(entity).then();
}); });