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.
558 lines
27 KiB
558 lines
27 KiB
|
1 month ago
|
# 领域模型与实体
|
||
|
|
|
||
|
|
<cite>
|
||
|
|
**本文引用的文件**
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
||
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
||
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
- [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)
|
||
|
|
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
|
||
|
|
- [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java)
|
||
|
|
- [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.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)
|
||
|
|
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [AuthIdentityMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthIdentityMapper.java)
|
||
|
|
- [SysDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysDeptMapper.java)
|
||
|
|
- [SysUserRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysUserRoleMapper.java)
|
||
|
|
- [SysRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMapper.java)
|
||
|
|
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java)
|
||
|
|
- [SysRoleMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMenuMapper.java)
|
||
|
|
- [SysUserDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysUserDeptMapper.java)
|
||
|
|
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
|
||
|
|
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
|
||
|
|
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
|
||
|
|
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
|
||
|
|
</cite>
|
||
|
|
|
||
|
|
## 目录
|
||
|
|
1. [简介](#简介)
|
||
|
|
2. [项目结构](#项目结构)
|
||
|
|
3. [核心组件](#核心组件)
|
||
|
|
4. [架构总览](#架构总览)
|
||
|
|
5. [详细组件分析](#详细组件分析)
|
||
|
|
6. [依赖关系分析](#依赖关系分析)
|
||
|
|
7. [性能考虑](#性能考虑)
|
||
|
|
8. [故障排查指南](#故障排查指南)
|
||
|
|
9. [结论](#结论)
|
||
|
|
10. [附录](#附录)
|
||
|
|
|
||
|
|
## 简介
|
||
|
|
本章节聚焦认证相关的领域模型与实体设计,围绕用户、身份标识、部门、角色与菜单等核心对象,阐述实体关系映射、枚举类型定义、数据验证规则,以及数据库表结构设计、字段含义与业务约束。文档旨在帮助开发者快速理解并正确使用这些实体,确保权限控制、数据范围与多源身份接入的一致性与可维护性。
|
||
|
|
|
||
|
|
## 项目结构
|
||
|
|
认证域位于 crm-auth 模块,基础通用能力位于 crm-base 模块。实体类集中在 domain/entity 包下,枚举在 domain/enums 包下,数据访问层在 mapper 包下,服务实现位于 service/impl 包中。基础实体 BaseEntity 与 OwnedEntity 提供公共字段与审计能力,MyBatis-Plus 配置与填充策略由 base 模块统一提供。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph TB
|
||
|
|
subgraph "认证域(crm-auth)"
|
||
|
|
A["AuthUser"] --> B["AuthIdentity"]
|
||
|
|
A --> C["SysUserRole"]
|
||
|
|
C --> D["SysRole"]
|
||
|
|
D --> E["SysRoleMenu"]
|
||
|
|
E --> F["SysMenu"]
|
||
|
|
A --> G["SysUserDept"]
|
||
|
|
G --> H["SysDept"]
|
||
|
|
end
|
||
|
|
subgraph "基础域(crm-base)"
|
||
|
|
I["BaseEntity"] --> A
|
||
|
|
J["OwnedEntity"] --> A
|
||
|
|
K["CrmBaseMapper"] --> L["各Mapper接口"]
|
||
|
|
end
|
||
|
|
L --> M["MyBatis-Plus配置"]
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
||
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
||
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
- [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)
|
||
|
|
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
|
||
|
|
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [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)
|
||
|
|
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
|
||
|
|
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
|
||
|
|
|
||
|
|
## 核心组件
|
||
|
|
本节概述认证相关核心实体的职责与关系:
|
||
|
|
- AuthUser 用户实体:系统内用户的主体信息,关联身份标识、角色与部门。
|
||
|
|
- AuthIdentity 身份标识:支持多种登录来源(如账号密码、第三方平台),通过类型区分。
|
||
|
|
- SysDept 部门实体:组织树形结构,用于数据范围与权限隔离。
|
||
|
|
- SysUserRole 用户角色关联:多对多关系,承载用户与角色的绑定。
|
||
|
|
- SysRole 角色实体:权限集合的载体,与菜单存在多对多关系。
|
||
|
|
- SysMenu 菜单实体:功能点与资源标识,支撑菜单与按钮级权限。
|
||
|
|
- SysRoleMenu 角色菜单关联:角色与菜单的多对多中间表。
|
||
|
|
- SysUserDept 用户部门关联:用户与部门的归属关系,支撑数据可见范围。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
||
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
||
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
|
||
|
|
## 架构总览
|
||
|
|
下图展示认证域实体之间的关系与数据流向,包括用户、身份、角色、菜单与部门的关联,以及基础实体提供的公共字段与审计能力。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
classDiagram
|
||
|
|
class BaseEntity {
|
||
|
|
+id
|
||
|
|
+createBy
|
||
|
|
+createTime
|
||
|
|
+updateBy
|
||
|
|
+updateTime
|
||
|
|
+remark
|
||
|
|
}
|
||
|
|
class OwnedEntity {
|
||
|
|
+ownerId
|
||
|
|
+ownerType
|
||
|
|
}
|
||
|
|
class AuthUser {
|
||
|
|
+username
|
||
|
|
+status
|
||
|
|
+deptIds
|
||
|
|
+roleIds
|
||
|
|
}
|
||
|
|
class AuthIdentity {
|
||
|
|
+userId
|
||
|
|
+identityType
|
||
|
|
+thirdPartyId
|
||
|
|
+credential
|
||
|
|
}
|
||
|
|
class SysDept {
|
||
|
|
+parentId
|
||
|
|
+name
|
||
|
|
+sort
|
||
|
|
+status
|
||
|
|
}
|
||
|
|
class SysUserRole {
|
||
|
|
+userId
|
||
|
|
+roleId
|
||
|
|
}
|
||
|
|
class SysRole {
|
||
|
|
+code
|
||
|
|
+name
|
||
|
|
+status
|
||
|
|
}
|
||
|
|
class SysMenu {
|
||
|
|
+parentId
|
||
|
|
+type
|
||
|
|
+path
|
||
|
|
+permission
|
||
|
|
+status
|
||
|
|
}
|
||
|
|
class SysRoleMenu {
|
||
|
|
+roleId
|
||
|
|
+menuId
|
||
|
|
}
|
||
|
|
class SysUserDept {
|
||
|
|
+userId
|
||
|
|
+deptId
|
||
|
|
}
|
||
|
|
BaseEntity <|-- AuthUser
|
||
|
|
BaseEntity <|-- SysDept
|
||
|
|
BaseEntity <|-- SysRole
|
||
|
|
BaseEntity <|-- SysMenu
|
||
|
|
OwnedEntity <|-- AuthUser
|
||
|
|
AuthUser "1" o-- "n" AuthIdentity : "一对多"
|
||
|
|
AuthUser "1" o-- "n" SysUserRole : "多对多"
|
||
|
|
SysRole "1" o-- "n" SysUserRole : "多对多"
|
||
|
|
SysRole "1" o-- "n" SysRoleMenu : "多对多"
|
||
|
|
SysMenu "1" o-- "n" SysRoleMenu : "多对多"
|
||
|
|
AuthUser "1" o-- "n" SysUserDept : "多对多"
|
||
|
|
SysDept "1" o-- "n" SysUserDept : "多对多"
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [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)
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
||
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
||
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
|
||
|
|
## 详细组件分析
|
||
|
|
|
||
|
|
### AuthUser 用户实体
|
||
|
|
- 职责:表示系统用户主记录,承载用户名、状态、所属部门与角色等关键信息。
|
||
|
|
- 继承关系:继承 BaseEntity 与 OwnedEntity,获得通用审计字段与数据所有者标记。
|
||
|
|
- 关联关系:
|
||
|
|
- 与 AuthIdentity 一对多:一个用户可拥有多个身份标识(如手机号、邮箱、第三方ID)。
|
||
|
|
- 与 SysUserRole 多对多:通过中间表建立用户与角色的绑定。
|
||
|
|
- 与 SysUserDept 多对多:通过中间表建立用户与部门的归属。
|
||
|
|
- 数据验证与约束:
|
||
|
|
- 用户名唯一性、非空校验。
|
||
|
|
- 状态字段受 StatusEnum 约束,仅允许有效值。
|
||
|
|
- 部门与角色通过中间表维护,避免冗余与不一致。
|
||
|
|
- 使用示例:
|
||
|
|
- 注册新用户时创建 AuthUser,并插入一条或多条 AuthIdentity。
|
||
|
|
- 分配角色与部门时写入 SysUserRole 与 SysUserDept。
|
||
|
|
- 查询用户权限时,基于角色与菜单关联计算可用权限集。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [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)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
|
||
|
|
### AuthIdentity 身份标识
|
||
|
|
- 职责:抽象不同登录来源的身份凭证,支持账号密码与第三方平台登录。
|
||
|
|
- 关键字段:
|
||
|
|
- identityType:身份类型,受 IdentityTypeEnum 约束(如账号、第三方)。
|
||
|
|
- thirdPartyId:第三方平台的唯一标识。
|
||
|
|
- credential:加密后的凭证或令牌。
|
||
|
|
- 数据验证与约束:
|
||
|
|
- 同一 userId 下 identityType 唯一,防止重复来源冲突。
|
||
|
|
- 第三方登录需校验 thirdPartyId 的唯一性。
|
||
|
|
- 使用示例:
|
||
|
|
- 第三方授权回调时,根据 identityType 与 thirdPartyId 查找或创建 AuthIdentity。
|
||
|
|
- 账号密码登录时,校验 credential 并与 AuthUser 关联。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
|
||
|
|
|
||
|
|
### SysDept 部门实体
|
||
|
|
- 职责:组织部门树,支撑数据范围与权限隔离。
|
||
|
|
- 关键字段:
|
||
|
|
- parentId:父部门ID,根节点为空或特定值。
|
||
|
|
- name:部门名称。
|
||
|
|
- sort:排序权重。
|
||
|
|
- status:状态受 StatusEnum 约束。
|
||
|
|
- 数据验证与约束:
|
||
|
|
- 父子层级关系自引用,禁止循环引用。
|
||
|
|
- 名称唯一性在同一父级下校验。
|
||
|
|
- 使用示例:
|
||
|
|
- 初始化部门树时按 sort 顺序构建。
|
||
|
|
- 数据范围过滤时,依据用户所属部门及其子部门生成 SQL 条件。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
||
|
|
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
|
||
|
|
|
||
|
|
### SysUserRole 用户角色关联
|
||
|
|
- 职责:用户与角色的多对多中间表,承载授权关系。
|
||
|
|
- 关键字段:
|
||
|
|
- userId:用户ID。
|
||
|
|
- roleId:角色ID。
|
||
|
|
- 数据验证与约束:
|
||
|
|
- (userId, roleId) 组合唯一,避免重复授权。
|
||
|
|
- 外键约束保证引用完整性。
|
||
|
|
- 使用示例:
|
||
|
|
- 为用户分配角色时批量插入 SysUserRole。
|
||
|
|
- 撤销角色时删除对应记录。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
|
||
|
|
### SysRole 角色实体
|
||
|
|
- 职责:权限集合的载体,描述一组可访问的资源与操作。
|
||
|
|
- 关键字段:
|
||
|
|
- code:角色编码,全局唯一。
|
||
|
|
- name:角色名称。
|
||
|
|
- status:状态受 StatusEnum 约束。
|
||
|
|
- 数据验证与约束:
|
||
|
|
- code 唯一性校验。
|
||
|
|
- 状态变更需遵循业务流程。
|
||
|
|
- 使用示例:
|
||
|
|
- 创建系统预设角色(管理员、普通用户)并分配菜单权限。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
||
|
|
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
|
||
|
|
|
||
|
|
### SysMenu 菜单实体
|
||
|
|
- 职责:功能点与资源标识,支撑菜单与按钮级权限。
|
||
|
|
- 关键字段:
|
||
|
|
- parentId:父菜单ID,形成树形结构。
|
||
|
|
- type:菜单类型,受 MenuTypeEnum 约束(目录、菜单、按钮)。
|
||
|
|
- path:路由路径。
|
||
|
|
- permission:权限标识。
|
||
|
|
- status:状态受 StatusEnum 约束。
|
||
|
|
- 数据验证与约束:
|
||
|
|
- 父子层级关系自引用,禁止循环引用。
|
||
|
|
- permission 唯一性校验。
|
||
|
|
- 使用示例:
|
||
|
|
- 前端根据菜单树渲染导航。
|
||
|
|
- 后端基于 permission 进行接口级鉴权。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
||
|
|
- [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.java)
|
||
|
|
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
|
||
|
|
|
||
|
|
### SysRoleMenu 角色菜单关联
|
||
|
|
- 职责:角色与菜单的多对多中间表,承载菜单授权。
|
||
|
|
- 关键字段:
|
||
|
|
- roleId:角色ID。
|
||
|
|
- menuId:菜单ID。
|
||
|
|
- 数据验证与约束:
|
||
|
|
- (roleId, menuId) 组合唯一。
|
||
|
|
- 外键约束保证引用完整性。
|
||
|
|
- 使用示例:
|
||
|
|
- 为角色批量授权菜单时插入多条记录。
|
||
|
|
- 取消授权时删除对应记录。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
||
|
|
|
||
|
|
### SysUserDept 用户部门关联
|
||
|
|
- 职责:用户与部门的归属关系,支撑数据可见范围。
|
||
|
|
- 关键字段:
|
||
|
|
- userId:用户ID。
|
||
|
|
- deptId:部门ID。
|
||
|
|
- 数据验证与约束:
|
||
|
|
- (userId, deptId) 组合唯一。
|
||
|
|
- 外键约束保证引用完整性。
|
||
|
|
- 使用示例:
|
||
|
|
- 用户加入部门后插入记录。
|
||
|
|
- 数据范围过滤时,结合 DataScopeEnum 决定查询范围。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
|
||
|
|
### 枚举类型定义
|
||
|
|
- IdentityTypeEnum:身份类型枚举,区分账号、第三方等平台来源。
|
||
|
|
- DataScopeEnum:数据范围枚举,定义个人、本部门、本部门及子部门、全部等范围。
|
||
|
|
- MenuTypeEnum:菜单类型枚举,区分目录、菜单、按钮。
|
||
|
|
- StatusEnum:通用状态枚举,定义启用、禁用等状态。
|
||
|
|
- HasValueEnum:通用有值/无值枚举,用于布尔语义化表达。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
|
||
|
|
- [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java)
|
||
|
|
- [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.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)
|
||
|
|
|
||
|
|
### 数据库表结构设计
|
||
|
|
以下为认证域核心表的建议结构与字段说明(以实际实体与约定为准):
|
||
|
|
- auth_user
|
||
|
|
- id: 主键
|
||
|
|
- username: 用户名(唯一)
|
||
|
|
- status: 状态(受 StatusEnum 约束)
|
||
|
|
- owner_id: 数据所有者ID
|
||
|
|
- owner_type: 数据所有者类型
|
||
|
|
- create_by/create_time/update_by/update_time/remark: 审计字段
|
||
|
|
- auth_identity
|
||
|
|
- id: 主键
|
||
|
|
- user_id: 用户ID(外键)
|
||
|
|
- identity_type: 身份类型(受 IdentityTypeEnum 约束)
|
||
|
|
- third_party_id: 第三方ID(唯一)
|
||
|
|
- credential: 凭证(加密存储)
|
||
|
|
- 审计字段同上
|
||
|
|
- sys_dept
|
||
|
|
- id: 主键
|
||
|
|
- parent_id: 父部门ID
|
||
|
|
- name: 部门名称
|
||
|
|
- sort: 排序
|
||
|
|
- status: 状态
|
||
|
|
- 审计字段同上
|
||
|
|
- sys_user_role
|
||
|
|
- id: 主键
|
||
|
|
- user_id: 用户ID(外键)
|
||
|
|
- role_id: 角色ID(外键)
|
||
|
|
- 唯一约束(user_id, role_id)
|
||
|
|
- sys_role
|
||
|
|
- id: 主键
|
||
|
|
- code: 角色编码(唯一)
|
||
|
|
- name: 角色名称
|
||
|
|
- status: 状态
|
||
|
|
- 审计字段同上
|
||
|
|
- sys_menu
|
||
|
|
- id: 主键
|
||
|
|
- parent_id: 父菜单ID
|
||
|
|
- type: 菜单类型(受 MenuTypeEnum 约束)
|
||
|
|
- path: 路由路径
|
||
|
|
- permission: 权限标识(唯一)
|
||
|
|
- status: 状态
|
||
|
|
- 审计字段同上
|
||
|
|
- sys_role_menu
|
||
|
|
- id: 主键
|
||
|
|
- role_id: 角色ID(外键)
|
||
|
|
- menu_id: 菜单ID(外键)
|
||
|
|
- 唯一约束(role_id, menu_id)
|
||
|
|
- sys_user_dept
|
||
|
|
- id: 主键
|
||
|
|
- user_id: 用户ID(外键)
|
||
|
|
- dept_id: 部门ID(外键)
|
||
|
|
- 唯一约束(user_id, dept_id)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
||
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
||
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
- [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)
|
||
|
|
|
||
|
|
### 数据验证规则与业务约束
|
||
|
|
- 唯一性约束:
|
||
|
|
- 用户名、角色编码、菜单权限标识、第三方ID、(userId, identityType)、(userId, roleId)、(roleId, menuId)、(userId, deptId) 等组合唯一。
|
||
|
|
- 状态约束:
|
||
|
|
- 所有状态字段受 StatusEnum 约束,仅允许预定义值。
|
||
|
|
- 层级约束:
|
||
|
|
- 部门与菜单的父子关系禁止循环引用,需在应用层校验。
|
||
|
|
- 数据范围:
|
||
|
|
- 数据范围受 DataScopeEnum 控制,结合用户部门与角色权限生成查询条件。
|
||
|
|
- 审计字段:
|
||
|
|
- 通过 MetaObjectFillHandler 自动填充创建与更新时间、操作人等。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
|
||
|
|
- [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java)
|
||
|
|
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
|
||
|
|
|
||
|
|
### 使用示例
|
||
|
|
- 用户注册与身份绑定:
|
||
|
|
- 创建 AuthUser,插入 AuthIdentity(identityType=账号,credential=加密密码)。
|
||
|
|
- 分配角色与部门:写入 SysUserRole 与 SysUserDept。
|
||
|
|
- 第三方登录流程:
|
||
|
|
- 根据第三方回调获取 thirdPartyId,查找或创建 AuthIdentity(identityType=第三方)。
|
||
|
|
- 校验成功后返回用户上下文。
|
||
|
|
- 权限与菜单加载:
|
||
|
|
- 基于用户角色与 SysRoleMenu 获取菜单树。
|
||
|
|
- 接口鉴权时校验 permission 是否命中。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
||
|
|
|
||
|
|
## 依赖关系分析
|
||
|
|
认证域实体依赖基础域的公共实体与配置,数据访问层通过 MyBatis-Plus 的 Mapper 接口进行 CRUD 操作。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph LR
|
||
|
|
A["AuthUser"] --> B["AuthIdentity"]
|
||
|
|
A --> C["SysUserRole"]
|
||
|
|
C --> D["SysRole"]
|
||
|
|
D --> E["SysRoleMenu"]
|
||
|
|
E --> F["SysMenu"]
|
||
|
|
A --> G["SysUserDept"]
|
||
|
|
G --> H["SysDept"]
|
||
|
|
I["BaseEntity"] --> A
|
||
|
|
J["OwnedEntity"] --> A
|
||
|
|
K["CrmBaseMapper"] --> L["AuthUserMapper"]
|
||
|
|
K --> M["AuthIdentityMapper"]
|
||
|
|
K --> N["SysDeptMapper"]
|
||
|
|
K --> O["SysUserRoleMapper"]
|
||
|
|
K --> P["SysRoleMapper"]
|
||
|
|
K --> Q["SysMenuMapper"]
|
||
|
|
K --> R["SysRoleMenuMapper"]
|
||
|
|
K --> S["SysUserDeptMapper"]
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
||
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
||
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
||
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
||
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
||
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
||
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
||
|
|
- [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)
|
||
|
|
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
|
||
|
|
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [AuthIdentityMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthIdentityMapper.java)
|
||
|
|
- [SysDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysDeptMapper.java)
|
||
|
|
- [SysUserRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysUserRoleMapper.java)
|
||
|
|
- [SysRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMapper.java)
|
||
|
|
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java)
|
||
|
|
- [SysRoleMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMenuMapper.java)
|
||
|
|
- [SysUserDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysUserDeptMapper.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
|
||
|
|
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [AuthIdentityMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthIdentityMapper.java)
|
||
|
|
- [SysDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysDeptMapper.java)
|
||
|
|
- [SysUserRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysUserRoleMapper.java)
|
||
|
|
- [SysRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMapper.java)
|
||
|
|
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java)
|
||
|
|
- [SysRoleMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMenuMapper.java)
|
||
|
|
- [SysUserDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysUserDeptMapper.java)
|
||
|
|
|
||
|
|
## 性能考虑
|
||
|
|
- 索引优化:
|
||
|
|
- 为高频查询字段建立索引,如 user_id、identity_type、third_party_id、role_id、menu_id、dept_id。
|
||
|
|
- 组合唯一约束自动创建复合索引,提升去重与关联查询效率。
|
||
|
|
- 缓存策略:
|
||
|
|
- 部门树与菜单树可缓存,减少重复构建成本。
|
||
|
|
- 用户权限集可在会话或Redis中缓存,缩短鉴权路径。
|
||
|
|
- 批量操作:
|
||
|
|
- 批量插入角色菜单与用户部门关联,降低事务开销。
|
||
|
|
- 分页与投影:
|
||
|
|
- 列表查询使用分页与必要字段投影,减少网络传输与内存占用。
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 故障排查指南
|
||
|
|
- 常见错误与定位:
|
||
|
|
- 唯一性冲突:检查用户名、角色编码、菜单权限标识、第三方ID等是否重复。
|
||
|
|
- 层级循环:校验部门与菜单的父子关系,避免闭环。
|
||
|
|
- 状态非法:确认状态字段取值是否在枚举范围内。
|
||
|
|
- 审计字段未填充:检查 MetaObjectFillHandler 是否正确配置。
|
||
|
|
- 调试建议:
|
||
|
|
- 开启SQL日志,观察生成的SQL与参数。
|
||
|
|
- 使用单元测试覆盖注册、授权、鉴权流程。
|
||
|
|
- 通过日志追踪用户上下文与数据范围计算过程。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
|
||
|
|
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
|
||
|
|
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
|
||
|
|
- [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.java)
|
||
|
|
- [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java)
|
||
|
|
|
||
|
|
## 结论
|
||
|
|
认证域实体围绕用户、身份、角色、菜单与部门构建了完整的权限与数据范围体系。通过统一的基类与枚举约束,确保了数据一致性与可维护性。配合 MyBatis-Plus 的数据访问层与填充策略,实现了高效的CRUD与审计能力。建议在开发中严格遵循唯一性、层级与状态约束,合理使用索引与缓存,保障系统性能与稳定性。
|
||
|
|
|
||
|
|
[本节为总结性内容,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 附录
|
||
|
|
- ID生成策略:
|
||
|
|
- 使用 Snowflake 或自定义 ID 生成器,确保分布式环境下的唯一性。
|
||
|
|
- 配置项:
|
||
|
|
- MyBatis-Plus 配置包含分页、填充、注入器等,影响实体行为与SQL生成。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
|
||
|
|
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
|