跳到主要内容

System:组织、权限与租户

用户、部门与岗位​

业务流程与读写职责​

管理后台维护用户、部门和岗位。AdminUserServiceImpl 创建用户时保存账号,再写入岗位关系(service/user/AdminUserServiceImpl.java:112);修改岗位时对关系表求增删差集(164 行),按岗位查询用户也读取该表(306 行)。因此 post_ids 是实体集合表达,关系表支持反向查询。parent_id 支持组织树,leader_user_id 表达负责人,用户 status 控制账号状态,login_ip/login_date 保存最近登录信息,password 保存密码加密结果。

对象关系与设计约定​

用户通过 dept_id 关联部门;system_dept.parent_id 构成部门树,leader_user_id 指向负责人用户。用户岗位既有 system_users.post_ids JSON 数组,也有 system_user_post 关系表;当前创建与修改用户会维护关系表,不能将其视为废弃表。证据:service/user/AdminUserServiceImpl.java:112、164(相对本服务 Java 根)。UserPostDO.postId 的“角色 ID”注释与类型引用不符,本文按岗位解释。

核验日期:2026-09-18。以下为源码预期结构,Java 类型不等同于 SQL 列型、长度、可空性或默认值。实际结构与索引见实测对照。各表继承字段已逐表展开;公共映射解释来源。下述关联均为代码逻辑关联,物理外键以实测为准。

system_dept​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java:18;继承 TenantBaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java:13。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long部门ID;@TableId30
namename: String部门名称34
parent_idparentId: Long父部门ID 关联 #id40
sortsort: Integer显示顺序44
leader_user_idleaderUserId: Long负责人 关联 AdminUserDO#getId()50
phonephone: String联系电话54
emailemail: String邮箱58
statusstatus: Integer部门状态 枚举 CommonStatusEnum64
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO
tenant_idtenantId: Long租户编号TenantBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectList()(14)、selectByParentIdAndName()(20)、selectCountByParentId()(24)、selectListByParentId()(28)、selectListByLeaderUserId()(32)。以上方法行号相对该表 Mapper。

system_post​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/PostDO.java:16;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/PostMapper.java:14。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long岗位序号;@TableId26
namename: String岗位名称30
codecode: String岗位编码34
sortsort: Integer岗位排序38
statusstatus: Integer状态 枚举 CommonStatusEnum44
remarkremark: String备注48
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectList()(15)、selectPage()(21)、selectByName()(29)、selectByCode()(33)。以上方法行号相对该表 Mapper。

system_user_post​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/UserPostDO.java:16;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/UserPostMapper.java:13。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long自增主键;@TableId26
user_iduserId: Long用户 ID 关联 AdminUserDO#getId()32
post_idpostId: Long岗位 ID,逻辑关联 PostDO.id;原注释误写角色38
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectListByUserId()(14)、deleteByUserIdAndPostId()(18)、selectListByPostIds()(24)、deleteByUserId()(28)。以上方法行号相对该表 Mapper。

system_users​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java:22;继承 TenantBaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java:14。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long用户ID;@TableId35
usernameusername: String用户账号39
passwordpassword: String加密后的密码 因为目前使用 BCryptPasswordEncoder 加密器,所以无需自己处理 salt 盐45
nicknamenickname: String用户昵称49
remarkremark: String备注53
dept_iddeptId: Long部门 ID57
post_idspostIds: Set<Long>岗位编号数组;@TableField(typeHandler = JacksonTypeHandler.class)62
emailemail: String用户邮箱66
mobilemobile: String手机号码70
sexsex: Integer用户性别 枚举类 SexEnum76
avataravatar: String用户头像80
statusstatus: Integer帐号状态 枚举 CommonStatusEnum86
login_iploginIp: String最后登录IP90
login_dateloginDate: LocalDateTime最后登录时间94
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO
tenant_idtenantId: Long租户编号TenantBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectByUsername()(15)、selectByEmail()(19)、selectByMobile()(23)、selectPage()(27)、selectListByNickname()(38)、selectListByStatus()(42)、selectListByDeptIds()(46)。以上方法行号相对该表 Mapper。

返回 System 总览

角色与菜单权限​

业务流程与读写职责​

管理员维护角色与菜单后,由 PermissionServiceImpl.assignRoleMenu(service/permission/PermissionServiceImpl.java:135)写角色—菜单关系,由 assignUserRole(213 行)写用户—角色关系;授权查询再组合角色和权限缓存。菜单路由字段回答“展示哪一页”,permission 回答“允许哪个操作”,data_scope 与部门集合回答“允许访问哪些业务数据”。授权变更伴随缓存失效,MySQL 关系仍是权限事实来源。

对象关系与设计约定​

system_user_role(user_id,role_id) 连接用户与角色;system_role_menu(role_id,menu_id) 连接角色与菜单;system_menu.parent_id 构成菜单树。role.data_scope_dept_ids 是自定义数据权限部门集合,不是单个外键。权限标识 menu.permission 由前后端鉴权使用,同一权限可匹配多个菜单。

核验日期:2026-09-18。以下为源码预期结构,Java 类型不等同于 SQL 列型、长度、可空性或默认值。实际结构与索引见实测对照。各表继承字段已逐表展开;公共映射解释来源。下述关联均为代码逻辑关联,物理外键以实测为准。

system_menu​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java:17;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/MenuMapper.java:12。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long菜单编号;@TableId32
namename: String菜单名称36
permissionpermission: String权限标识 一般格式为:$系统:$模块:$操作 例如说:system:admin:add,即 system 服务的添加管理员。 当我们把该 MenuDO 赋予给角色后,意味着该角色有该资源: - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。47
typetype: Integer菜单类型 枚举 MenuTypeEnum53
sortsort: Integer显示顺序57
parent_idparentId: Long父菜单ID61
pathpath: String路由地址 如果 path 为 http(s) 时,则它是外链67
iconicon: String菜单图标71
componentcomponent: String组件路径75
component_namecomponentName: String组件名79
statusstatus: Integer状态 枚举 CommonStatusEnum85
visiblevisible: Boolean是否可见 只有菜单、目录使用 当设置为 true 时,该菜单不会展示在侧边栏,但是路由还是存在。例如说,一些独立的编辑页面 /edit/1024 等等92
keep_alivekeepAlive: Boolean是否缓存 只有菜单、目录使用,否使用 Vue 路由的 keep-alive 特性 注意:如果开启缓存,则必须填写 #componentName 属性,否则无法缓存99
always_showalwaysShow: Boolean是否总是显示 如果为 false 时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单105
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectByParentIdAndName()(13)、selectCountByParentId()(17)、selectList()(21)、selectListByPermission()(27)、selectByComponentName()(31)。以上方法行号相对该表 Mapper。

system_role​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/RoleDO.java:22;继承 TenantBaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java:16。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long角色ID;@TableId32
namename: String角色名称36
codecode: String角色标识 枚举42
sortsort: Integer角色排序46
statusstatus: Integer角色状态 枚举 CommonStatusEnum52
typetype: Integer角色类型 枚举 RoleTypeEnum58
remarkremark: String备注62
data_scopedataScope: Integer数据范围 枚举 DataScopeEnum69
data_scope_dept_idsdataScopeDeptIds: Set<Long>数据范围(指定部门数组) 适用于 #dataScope 的值为 DataScopeEnum#DEPT_CUSTOM 时;@TableField(typeHandler = JacksonTypeHandler.class)76
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO
tenant_idtenantId: Long租户编号TenantBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectPage()(17)、selectByName()(26)、selectByCode()(30)、selectListByStatus()(34)。以上方法行号相对该表 Mapper。

system_role_menu​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/RoleMenuDO.java:15;继承 TenantBaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java:12。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long自增主键;@TableId25
role_idroleId: Long角色ID29
menu_idmenuId: Long菜单ID33
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO
tenant_idtenantId: Long租户编号TenantBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectListByRoleId()(13)、selectListByRoleId()(17)、selectListByMenuId()(21)、deleteListByRoleIdAndMenuIds()(25)、deleteListByMenuId()(31)、deleteListByRoleId()(35)。以上方法行号相对该表 Mapper。

system_user_role​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/UserRoleDO.java:15;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/UserRoleMapper.java:12。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long自增主键;@TableId25
user_iduserId: Long用户 ID29
role_idroleId: Long角色 ID33
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectListByUserId()(13)、deleteListByUserIdAndRoleIdIds()(17)、deleteListByUserId()(23)、deleteListByRoleId()(27)、selectListByRoleIds()(31)、selectListByRoleId()(35)。以上方法行号相对该表 Mapper。

返回 System 总览

租户与套餐​

业务流程与读写职责​

TenantServiceImpl.createTenant(service/tenant/TenantServiceImpl.java:99)先校验名称、域名和套餐并保存租户,再切换租户上下文创建管理员角色与用户、分配权限,最后回填 contact_user_id。套餐 menu_ids 决定初始菜单能力,expire_time/account_count 表达期限和账号数量限制;用户及授权写入复用对应领域 Service,不能只插入 tenant 表便认为租户初始化完成。

对象关系与设计约定​

system_tenant.package_id 指向套餐,内置套餐标识 0 为代码约定,不能据此认定物理外键存在。contact_user_id 关联管理用户,套餐 menu_ids 是菜单 ID 的 JSON 集合。租户表与套餐自身继承 BaseDO,不从 Java 继承 tenant_id。

核验日期:2026-09-18。以下为源码预期结构,Java 类型不等同于 SQL 列型、长度、可空性或默认值。实际结构与索引见实测对照。各表继承字段已逐表展开;公共映射解释来源。下述关联均为代码逻辑关联,物理外键以实测为准。

system_tenant​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantDO.java:17;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java:18。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long租户编号,自增35
namename: String租户名,唯一39
contact_user_idcontactUserId: Long联系人的用户编号 关联 AdminUserDO#getId()45
contact_namecontactName: String联系人49
contact_mobilecontactMobile: String联系手机53
statusstatus: Integer租户状态 枚举 CommonStatusEnum59
websitewebsite: String绑定域名63
package_idpackageId: Long租户套餐编号 关联 TenantPackageDO#getId() 特殊逻辑:系统内置租户,不使用套餐,暂时使用 #PACKAGE_ID_SYSTEM 标识70
expire_timeexpireTime: LocalDateTime过期时间74
account_countaccountCount: Integer账号数量78
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(框架按 id 命名识别,实体未显式标注 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectPage()(19)、selectByName()(29)、selectByWebsite()(33)、selectCountByPackageId()(37)、selectListByPackageId()(41)。以上方法行号相对该表 Mapper。

system_tenant_package​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantPackageDO.java:18;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantPackageMapper.java:18。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long套餐编号,自增31
namename: String套餐名,唯一35
statusstatus: Integer租户套餐状态 枚举 CommonStatusEnum41
remarkremark: String备注45
menu_idsmenuIds: Set<Long>关联的菜单编号;@TableField(typeHandler = JacksonTypeHandler.class)50
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(框架按 id 命名识别,实体未显式标注 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectPage()(19)、selectListByStatus()(28)、selectByName()(32)。以上方法行号相对该表 Mapper。

返回 System 总览

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答