You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

24 KiB

基础实体模型

**本文档引用的文件** - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) - [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java) - [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java) - [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [DataOwnership.java](file://crm-base/src/main/java/com/crm/base/security/DataOwnership.java) - [DataScopeHelper.java](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java) - [DataVisibilityContext.java](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java) - [LoginUser.java](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java) - [SecurityUtils.java](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java) - [IBaseService.java](file://crm-base/src/main/java/com/crm/base/service/IBaseService.java) - [BaseServiceImpl.java](file://crm-base/src/main/java/com/crm/base/service/impl/BaseServiceImpl.java) - [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java) - [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向所有业务实体的标准化建模,聚焦于基础实体模型的设计与使用。内容涵盖:

  • BaseEntity、OwnedEntity 等基础实体的通用字段设计、继承关系与公共属性
  • 状态枚举与值对象枚举的统一规范(如 StatusEnum、HasValueEnum)
  • 审计字段(创建时间、更新时间、操作人)、数据所有权控制、软删除机制
  • 扩展模式与自定义字段添加方法、通用查询条件支持
  • 实体基类设计原则、ORM 映射配置与性能优化建议 目标是为企业级 CRM 后端提供统一、可复用、易扩展的基础模型参考。

项目结构

基础实体模型位于 crm-base 模块中,围绕 domain/entity、domain/enums、config、security、service、mapper 等包组织,形成“领域模型 + 基础设施”的清晰分层。

graph TB
subgraph "基础层 crm-base"
A["entity/BaseEntity"] --> B["entity/OwnedEntity"]
C["enums/StatusEnum"] --> D["enums/HasValueEnum"]
E["config/MetaObjectFillHandler"] --> F["config/MybatisPlusConfig"]
G["config/CrmSqlInjector"] --> H["mapper/CrmBaseMapper"]
I["security/DataOwnership"] --> J["security/DataScopeHelper"]
K["security/DataVisibilityContext"] --> L["security/LoginUser"]
M["service/IBaseService"] --> N["service/impl/BaseServiceImpl"]
end
B --> C
B --> D
N --> H
J --> K

图表来源

  • BaseEntity.java
  • OwnedEntity.java
  • StatusEnum.java
  • HasValueEnum.java
  • MetaObjectFillHandler.java
  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • CrmBaseMapper.java
  • DataOwnership.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • LoginUser.java
  • IBaseService.java
  • BaseServiceImpl.java

章节来源

  • BaseEntity.java
  • OwnedEntity.java
  • StatusEnum.java
  • HasValueEnum.java
  • MetaObjectFillHandler.java
  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • CrmBaseMapper.java
  • DataOwnership.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • LoginUser.java
  • IBaseService.java
  • BaseServiceImpl.java

核心组件

  • BaseEntity:所有业务实体的根基类,定义统一的标识、审计与通用能力(如分页、排序、逻辑删除标记等)。
  • OwnedEntity:在 BaseEntity 基础上增加数据所有权相关字段与校验,用于实现租户/部门/用户级别的数据隔离。
  • StatusEnum / HasValueEnum:统一的状态与值对象枚举规范,确保跨模块一致性与可扩展性。
  • MetaObjectFillHandler:自动填充审计字段(创建时间、更新时间、创建人、更新人),减少样板代码。
  • MybatisPlusConfig / CrmSqlInjector:集成 MyBatis-Plus 的能力,注入通用 SQL 片段与分页插件。
  • DataOwnership / DataScopeHelper / DataVisibilityContext:数据可见性与权限上下文管理,支撑细粒度数据范围控制。
  • IBaseService / BaseServiceImpl:通用服务接口与实现,封装 CRUD、分页、批量操作与审计填充。
  • CrmBaseMapper:通用 Mapper 基类,为各业务 Mapper 提供统一扩展点。

章节来源

  • BaseEntity.java
  • OwnedEntity.java
  • StatusEnum.java
  • HasValueEnum.java
  • MetaObjectFillHandler.java
  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • DataOwnership.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • IBaseService.java
  • BaseServiceImpl.java
  • CrmBaseMapper.java

架构总览

下图展示了基础实体模型与 ORM、安全上下文、服务层的协作关系。

classDiagram
class BaseEntity {
+id
+createTime
+updateTime
+createBy
+updateBy
+deleted
+通用查询方法()
}
class OwnedEntity {
+ownerId
+tenantId
+deptId
+数据范围校验()
}
class StatusEnum {
+code
+desc
+isValid()
}
class HasValueEnum {
+value
+label
+toOptions()
}
class MetaObjectFillHandler {
+fillInsert()
+fillUpdate()
}
class MybatisPlusConfig {
+分页插件()
+元对象处理器()
}
class CrmSqlInjector {
+注入通用SQL()
}
class DataOwnership {
+注解 : 数据所有权
}
class DataScopeHelper {
+构建数据范围()
}
class DataVisibilityContext {
+设置上下文()
+获取上下文()
}
class LoginUser {
+userId
+deptId
+tenantId
}
class IBaseService {
+CRUD()
+分页()
+批量()
}
class BaseServiceImpl {
+实现通用服务()
}
class CrmBaseMapper {
+通用Mapper()
}
OwnedEntity --|> BaseEntity : "继承"
MetaObjectFillHandler --> BaseEntity : "填充审计字段"
MybatisPlusConfig --> MetaObjectFillHandler : "注册"
CrmSqlInjector --> CrmBaseMapper : "注入SQL"
DataOwnership --> DataScopeHelper : "驱动范围计算"
DataScopeHelper --> DataVisibilityContext : "读写上下文"
DataVisibilityContext --> LoginUser : "读取当前用户"
IBaseService <|-- BaseServiceImpl : "实现"
BaseServiceImpl --> CrmBaseMapper : "调用"

图表来源

  • BaseEntity.java
  • OwnedEntity.java
  • StatusEnum.java
  • HasValueEnum.java
  • MetaObjectFillHandler.java
  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • DataOwnership.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • LoginUser.java
  • IBaseService.java
  • BaseServiceImpl.java
  • CrmBaseMapper.java

详细组件分析

基础实体:BaseEntity

  • 职责:定义所有实体的通用字段与行为,包括主键、审计字段、逻辑删除标记、通用查询辅助方法。
  • 关键设计要点:
    • 审计字段:创建时间、更新时间、创建人、更新人,通过元对象处理器自动填充。
    • 软删除:通过逻辑删除字段配合 MyBatis-Plus 插件实现,避免物理删除带来的数据丢失风险。
    • 通用查询:提供分页、排序、条件构造等便捷方法,提升开发效率。
  • 扩展建议:
    • 新增通用字段时,需同步在元对象处理器中配置默认值或填充策略。
    • 若需要额外的查询能力,优先在 CrmSqlInjector 中注入通用 SQL 片段,保持 Mapper 简洁。

章节来源

  • BaseEntity.java
  • MetaObjectFillHandler.java
  • MybatisPlusConfig.java
  • CrmSqlInjector.java

数据所有权实体:OwnedEntity

  • 职责:在 BaseEntity 基础上引入数据所有权相关字段(如 owner、tenant、dept),并配套数据范围校验与过滤。
  • 关键设计要点:
    • 字段设计:包含所有者标识、租户标识、部门标识等,便于多租户与部门级数据隔离。
    • 数据范围:结合 DataOwnership 注解与 DataScopeHelper,动态生成 WHERE 条件,限制查询范围。
    • 上下文管理:通过 DataVisibilityContext 维护当前请求的数据可见性,从 LoginUser 提取用户信息。
  • 扩展建议:
    • 新增数据维度(如项目、客户群)时,扩展 OwnedEntity 字段并在 DataScopeHelper 中补充规则。
    • 对敏感操作进行二次校验,确保写入路径也遵循所有权约束。

章节来源

  • OwnedEntity.java
  • DataOwnership.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • LoginUser.java

枚举规范:StatusEnum 与 HasValueEnum

  • 职责:统一状态与值对象的表达,保证跨模块一致性。
  • 关键设计要点:
    • StatusEnum:定义状态码、描述、有效性校验;推荐提供 toLabel、isValid 等方法。
    • HasValueEnum:定义 value/label 对,并提供 toOptions 等前端友好输出方法。
  • 扩展建议:
    • 新增枚举时,遵循相同的命名与结构约定,避免散乱定义。
    • 在 DTO/VO 层尽量使用枚举类型,减少字符串硬编码。

章节来源

  • StatusEnum.java
  • HasValueEnum.java

审计字段自动填充:MetaObjectFillHandler

  • 职责:在插入与更新时自动填充审计字段(创建时间、更新时间、创建人、更新人)。
  • 关键设计要点:
    • 插入填充:设置 createTime、createBy 等默认值。
    • 更新填充:设置 updateTime、updateBy,避免覆盖未变更字段。
    • 安全上下文:从 SecurityUtils 或 DataVisibilityContext 获取当前登录用户信息。
  • 扩展建议:
    • 如需额外审计字段(如 IP、设备),可在填充器中追加逻辑。
    • 注意并发场景下的线程安全,避免共享可变状态。

章节来源

  • MetaObjectFillHandler.java
  • MybatisPlusConfig.java
  • SecurityUtils.java
  • DataVisibilityContext.java

ORM 配置与通用能力:MybatisPlusConfig、CrmSqlInjector、CrmBaseMapper

  • 职责:集成 MyBatis-Plus 的分页、元对象处理器、SQL 注入器,提供通用 Mapper 能力。
  • 关键设计要点:
    • 分页插件:启用分页拦截器,统一分页行为。
    • 元对象处理器:注册 MetaObjectFillHandler,实现审计字段自动填充。
    • SQL 注入:通过 CrmSqlInjector 注入通用 SQL 片段(如软删除过滤、数据范围条件)。
    • 通用 Mapper:CrmBaseMapper 作为业务 Mapper 的父类,提供统一扩展点。
  • 扩展建议:
    • 新增通用查询条件时,优先在 CrmSqlInjector 中定义,避免在各 Mapper 中重复实现。
    • 合理配置分页参数,避免全表扫描与大结果集传输。

章节来源

  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • CrmBaseMapper.java

通用服务:IBaseService 与 BaseServiceImpl

  • 职责:封装 CRUD、分页、批量操作与审计填充,为业务 Service 提供统一基类。
  • 关键设计要点:
    • 标准接口:定义 save、update、deleteById、getById、page、list 等通用方法。
    • 实现细节:在 BaseServiceImpl 中统一处理事务、异常、审计字段填充与数据范围过滤。
    • 扩展点:允许子类覆写特定方法以注入业务逻辑。
  • 扩展建议:
    • 复杂查询建议在 Service 层组合多个 Mapper 方法,保持单一职责。
    • 批量操作注意性能与事务边界,必要时拆分批次。

章节来源

  • IBaseService.java
  • BaseServiceImpl.java

数据可见性与权限:DataOwnership、DataScopeHelper、DataVisibilityContext、LoginUser

  • 职责:基于注解与上下文实现细粒度的数据范围控制,确保用户只能访问其有权访问的数据。
  • 关键设计要点:
    • 注解驱动:DataOwnership 标注在 Controller/Service 方法上,声明数据范围策略。
    • 范围计算:DataScopeHelper 根据上下文与策略生成 WHERE 条件。
    • 上下文管理:DataVisibilityContext 保存当前请求的用户与租户信息。
    • 用户信息:LoginUser 承载 userId、deptId、tenantId 等关键标识。
  • 扩展建议:
    • 新增数据维度时,扩展 DataScopeHelper 的规则集合。
    • 对越权访问进行日志记录与告警,提升安全性。

章节来源

  • DataOwnership.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • LoginUser.java

通用常量:CommonConstants

  • 职责:集中定义系统级常量(如分页默认值、状态码、错误码等),避免魔法数字。
  • 使用建议:
    • 所有模块引用 CommonConstants 中的常量,保持一致性。
    • 新增常量时按分类组织,便于检索与维护。

章节来源

  • CommonConstants.java

依赖关系分析

下图展示基础实体模型与 ORM、安全、服务层之间的依赖关系。

graph LR
BaseEntity --> MetaObjectFillHandler
OwnedEntity --> BaseEntity
OwnedEntity --> DataScopeHelper
DataScopeHelper --> DataVisibilityContext
DataVisibilityContext --> LoginUser
MybatisPlusConfig --> MetaObjectFillHandler
CrmSqlInjector --> CrmBaseMapper
IBaseService --> BaseServiceImpl
BaseServiceImpl --> CrmBaseMapper

图表来源

  • BaseEntity.java
  • OwnedEntity.java
  • MetaObjectFillHandler.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • LoginUser.java
  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • CrmBaseMapper.java
  • IBaseService.java
  • BaseServiceImpl.java

章节来源

  • BaseEntity.java
  • OwnedEntity.java
  • MetaObjectFillHandler.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • LoginUser.java
  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • CrmBaseMapper.java
  • IBaseService.java
  • BaseServiceImpl.java

性能考虑

  • 分页与排序:
    • 始终使用分页查询,避免一次性加载大结果集。
    • 在常用查询字段上建立索引,提升排序与过滤性能。
  • 审计字段填充:
    • 仅在必要字段触发填充,避免不必要的数据库写入。
    • 批量操作时合并填充逻辑,减少往返次数。
  • 数据范围过滤:
    • 将数据范围条件下推到 SQL 层,减少内存过滤开销。
    • 对高频维度(如 tenantId、deptId)建立复合索引。
  • 缓存与幂等:
    • 对只读枚举与字典数据使用缓存,降低数据库压力。
    • 对写操作实现幂等性,避免重复提交导致的数据不一致。
  • 连接池与事务:
    • 合理配置连接池大小与超时时间,避免连接耗尽。
    • 控制事务边界,避免长事务阻塞资源。

[本节为通用指导,不直接分析具体文件]

故障排查指南

  • 审计字段未填充:
    • 检查 MetaObjectFillHandler 是否已注册到 MybatisPlusConfig。
    • 确认实体字段名与填充策略一致,且未被手动覆盖。
  • 数据范围无效:
    • 检查 DataOwnership 注解是否正确标注,以及 DataVisibilityContext 是否设置了正确的上下文。
    • 验证 DataScopeHelper 的规则是否覆盖了新维度。
  • 分页异常:
    • 确认分页插件已启用,且查询未绕过分页拦截器。
    • 检查 SQL 中是否存在不支持分页的函数或子查询。
  • 软删除问题:
    • 确认 CrmSqlInjector 已注入软删除过滤条件。
    • 检查业务逻辑是否误用物理删除方法。

章节来源

  • MetaObjectFillHandler.java
  • MybatisPlusConfig.java
  • DataOwnership.java
  • DataScopeHelper.java
  • DataVisibilityContext.java
  • CrmSqlInjector.java

结论

通过 BaseEntity 与 OwnedEntity 的统一抽象,配合枚举规范、审计填充、数据范围控制与通用服务层,本项目为业务实体提供了标准化、可扩展、高性能的基础模型参考。遵循本文档的设计原则与实践建议,可显著提升开发效率与系统可维护性。

[本节为总结性内容,不直接分析具体文件]

附录

  • 最佳实践清单:
    • 所有实体继承 BaseEntity 或 OwnedEntity。
    • 使用 StatusEnum/HasValueEnum 表达状态与值对象。
    • 通过 MetaObjectFillHandler 自动填充审计字段。
    • 使用 DataOwnership 与 DataScopeHelper 控制数据范围。
    • 在 CrmSqlInjector 中注入通用 SQL 片段。
    • 通过 IBaseService/BaseServiceImpl 封装通用 CRUD。
  • 常见问题速查:
    • 审计字段为空:检查填充器注册与字段名匹配。
    • 数据范围不生效:检查注解与上下文设置。
    • 分页失效:检查分页插件与 SQL 兼容性。
    • 软删除异常:检查注入的通用 SQL 与调用方法。

[本节为补充说明,不直接分析具体文件]