Skip to content

数据库设计

1. 概述

系统采用 EF Core 作为 ORM,通过 Code First 模式管理数据库:

  • 开发环境:SQLite(数据库文件 Chet.Admin.db,启动自动创建)
  • 生产环境:PostgreSQL(推荐)
  • 数据库上下文AppDbContext(位于 Chet.Admin.Data 项目)

实体配置通过 Fluent API 在 Data/{Module}/{Entity}Config.cs 中定义,启动时自动迁移并写入种子数据。

2. RBAC 权限模型

系统核心是 RBAC(基于角色的访问控制)模型:

关系说明

  • 用户 ↔ 角色:多对多(通过 UserRole 中间表)
  • 角色 ↔ 菜单:多对多(通过 RoleMenu 中间表)
  • 角色 → 数据权限范围:一对一(Role.DataScope 字段),自定义范围通过 RoleDataScopeDept 关联部门
  • 用户 → 部门:多对一(User.DepartmentId

3. 实体 ER 图

4. 数据表结构

4.1 Users(用户表)

继承 BaseEntity(含 IdCreatedAtUpdatedAt)。

字段类型约束说明
IdINTPK, 自增主键
NameNVARCHAR(100)NOT NULL用户名
EmailNVARCHAR(255)NOT NULL, UNIQUE邮箱(登录凭证)
PasswordHashNVARCHAR(MAX)NOT NULLBCrypt 哈希
RefreshTokenNVARCHAR(MAX)NULL刷新令牌
RefreshTokenExpiryTimeDATETIME2NULL刷新令牌过期时间
AvatarNVARCHARNULL头像 URL
DepartmentIdINTNULL, FK部门 ID
LoginFailCountINT默认 0连续登录失败次数
LockedUntilDATETIME2NULL锁定截止时间
PasswordChangedAtDATETIME2NULL密码最后修改时间
MustChangePasswordBIT默认 0是否强制改密
CreatedAtDATETIME2自动创建时间(UTC)
UpdatedAtDATETIME2自动更新时间(UTC)

4.2 Roles(角色表)

字段类型约束说明
IdINTPK主键
CodeNVARCHARNOT NULL角色编码(如 admin)
NameNVARCHARNOT NULL角色名称
DescriptionNVARCHARNULL描述
SortINT默认 0排序
IsEnabledBIT默认 1是否启用
DataScopeNVARCHAR默认 All数据权限范围
CreatedAt / UpdatedAtDATETIME2自动时间戳

4.3 Menus(菜单表)

字段类型约束说明
IdINTPK主键
NameNVARCHARNOT NULL菜单名称
PathNVARCHARNOT NULL路由路径
ComponentNVARCHARNULL组件路径
RedirectNVARCHARNULL重定向路径
IconNVARCHARNULL图标
ParentIdINT默认 0父菜单 ID(0=顶级)
TypeNVARCHAR默认 Menu类型:Directory/Menu/Button/Api
SortINT默认 0排序
IsEnabledBIT默认 1是否启用
IsExternalBIT默认 0是否外链
DescriptionNVARCHAR(200)NULL权限/按钮描述
CreatedAt / UpdatedAtDATETIME2自动时间戳

4.4 Departments(部门表)

字段类型约束说明
IdINTPK主键
NameNVARCHARNOT NULL部门名称
CodeNVARCHARNOT NULL部门编码
LeaderNVARCHARNULL负责人
PhoneNVARCHARNULL联系电话
EmailNVARCHARNULL邮箱
ParentIdINT默认 0父部门 ID(0=顶级)
SortINT默认 0排序
IsEnabledBIT默认 1是否启用
CreatedAt / UpdatedAtDATETIME2自动时间戳

4.5 Dictionaries(字典表)

字段类型约束说明
IdINTPK主键
DictTypeNVARCHARNOT NULL字典类型编码(如 user_status)
NameNVARCHARNOT NULL字典名称
ValueNVARCHARNOT NULL字典值
LabelNVARCHARNOT NULL显示标签
SortINT默认 0排序
IsEnabledBIT默认 1是否启用
RemarkNVARCHARNULL备注
ParentIdINTNULL父级 ID(类型项为 null)
CreatedAt / UpdatedAtDATETIME2自动时间戳

4.6 关联表

UserRoles(用户-角色)

字段类型约束
UserIdINTPK, FK → Users.Id
RoleIdINTPK, FK → Roles.Id

RoleMenus(角色-菜单)

字段类型约束
RoleIdINTPK, FK → Roles.Id
MenuIdINTPK, FK → Menus.Id

RoleDataScopeDepts(角色-自定义数据权限部门)

字段类型约束
IdINTPK
RoleIdINTFK → Roles.Id
DepartmentIdINTFK → Departments.Id

4.7 AuditLogs(操作日志表)

此表不继承 BaseEntity,自带主键与时间字段。

字段类型约束说明
IdINTPK主键
UserIdINT操作人 ID
UserNameNVARCHARNOT NULL操作人用户名
ActionNVARCHARNOT NULL操作类型(Create/Update/Delete/Login/Logout/Assign)
ModuleNVARCHARNOT NULL模块(User/Role/Menu/Auth 等)
DescriptionNVARCHARNOT NULL操作描述
TargetIdNVARCHARNULL操作目标 ID
HttpMethodNVARCHARNOT NULL请求方法
RequestPathNVARCHARNOT NULL请求路径
RequestDataNVARCHAR(MAX)NULL请求参数(JSON)
StatusCodeINT响应状态码
ClientIpNVARCHARNOT NULL客户端 IP
UserAgentNVARCHARNULLUser-Agent
DurationBIGINT执行耗时(ms)
OperatedAtDATETIME2默认 UTC操作时间

4.8 Notifications(通知表)

字段类型约束说明
IdINTPK主键
TitleNVARCHARNOT NULL通知标题
ContentNVARCHARNOT NULL通知内容(支持 HTML)
TypeNVARCHAR默认 Notification类型:Announcement/Notification/Todo
PriorityNVARCHAR默认 Normal优先级:Low/Normal/High/Urgent
SenderIdINTNULL发送人 ID(null=系统)
IsGlobalBIT默认 0是否全局公告
CreatedAtDATETIME2默认 UTC创建时间

NotificationRecipients(通知接收表)

字段类型约束说明
IdINTPK主键
NotificationIdINTFK通知 ID
UserIdINTFK接收用户 ID
IsReadBIT默认 0是否已读
ReadAtDATETIME2NULL阅读时间

4.9 Files(文件表)

字段类型约束说明
IdINTPK主键
FileNameNVARCHARNOT NULL原始文件名
StoredNameNVARCHARNOT NULL存储文件名(GUID)
FilePathNVARCHARNOT NULL相对路径
ContentTypeNVARCHARNOT NULLMIME 类型
FileSizeBIGINT文件大小(bytes)
DescriptionNVARCHARNULL描述
UploaderIdINTNULL上传人 ID
CreatedAtDATETIME2默认 UTC上传时间

5. 种子数据

首次启动时自动初始化以下数据:

  • 管理员用户admin@example.com / Admin@123
  • 角色:超级管理员(admin)
  • 菜单:系统管理相关菜单树(含 Button/Api 权限节点)
  • 部门:根部门
  • 字典user_statusmenu_typegenderyes_no

6. 数据库迁移命令

bash
# 进入后端目录
cd Chet.Admin.Api

# 生成新迁移
dotnet ef migrations add <迁移名> \
  --project Chet.Admin.Infrastructure/Chet.Admin.Data \
  --startup-project Chet.Admin.Api

# 应用迁移到数据库
dotnet ef database update \
  --project Chet.Admin.Infrastructure/Chet.Admin.Data \
  --startup-project Chet.Admin.Api

# 移除最后一个迁移
dotnet ef migrations remove \
  --project Chet.Admin.Infrastructure/Chet.Admin.Data \
  --startup-project Chet.Admin.Api

启动时 DatabaseConfiguration 会自动执行 EnsureCreated / 迁移并写入种子数据,开发环境通常无需手动执行迁移命令。

7. 切换到 PostgreSQL

生产环境推荐使用 PostgreSQL:

  1. 修改 appsettings.json 连接字符串:
json
{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Database=chet_admin;Username=postgres;Password=yourpassword"
  }
}
  1. Chet.Admin.Data.csproj 中引用 PostgreSQL EF Core 提供程序

  2. DatabaseConfiguration.cs 中将 UseSqlite 替换为 UseNpgsql

  3. 执行迁移命令生成 PostgreSQL 数据库结构

基于 MIT 协议发布