// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } /// 租户表 model Tenant { id Int @id @default(autoincrement()) name String /// 租户名称 code String @unique /// 租户编码(唯一,用于访问链接) domain String? @unique /// 租户域名(可选,用于子域名访问) description String? /// 租户描述 isSuper Int @default(0) @map("is_super") /// 是否为超级租户:0-否,1-是 validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 creator Int? /// 创建人ID(超级租户的用户ID) modifier Int? /// 修改人ID createTime DateTime @default(now()) @map("create_time") /// 创建时间 modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 users User[] roles Role[] menus TenantMenu[] permissions Permission[] dicts Dict[] configs Config[] creatorUser User? @relation("TenantCreator", fields: [creator], references: [id], onDelete: SetNull) modifierUser User? @relation("TenantModifier", fields: [modifier], references: [id], onDelete: SetNull) @@map("tenants") } /// 用户表 model User { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") /// 租户ID username String /// 用户名(在租户内唯一) password String /// 密码(加密存储) nickname String /// 昵称 email String? /// 邮箱(在租户内唯一,可选) avatar String? /// 头像URL validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 creator Int? @map("creator") /// 创建人ID modifier Int? @map("modifier") /// 修改人ID createTime DateTime @default(now()) @map("create_time") /// 创建时间 modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) roles UserRole[] logs Log[] createdBy User? @relation("UserCreator", fields: [creator], references: [id], onDelete: SetNull) modifiedBy User? @relation("UserModifier", fields: [modifier], references: [id], onDelete: SetNull) createdUsers User[] @relation("UserCreator") modifiedUsers User[] @relation("UserModifier") createdRoles Role[] @relation("RoleCreator") modifiedRoles Role[] @relation("RoleModifier") createdPermissions Permission[] @relation("PermissionCreator") modifiedPermissions Permission[] @relation("PermissionModifier") createdMenus Menu[] @relation("MenuCreator") modifiedMenus Menu[] @relation("MenuModifier") createdDicts Dict[] @relation("DictCreator") modifiedDicts Dict[] @relation("DictModifier") createdDictItems DictItem[] @relation("DictItemCreator") modifiedDictItems DictItem[] @relation("DictItemModifier") createdConfigs Config[] @relation("ConfigCreator") modifiedConfigs Config[] @relation("ConfigModifier") createdTenants Tenant[] @relation("TenantCreator") modifiedTenants Tenant[] @relation("TenantModifier") @@unique([tenantId, username]) @@unique([tenantId, email]) @@map("users") } /// 角色表 model Role { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") /// 租户ID name String /// 角色名称(在租户内唯一) code String /// 角色编码(在租户内唯一) description String? /// 角色描述 validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 creator Int? /// 创建人ID modifier Int? /// 修改人ID createTime DateTime @default(now()) @map("create_time") /// 创建时间 modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) users UserRole[] permissions RolePermission[] creatorUser User? @relation("RoleCreator", fields: [creator], references: [id], onDelete: SetNull) modifierUser User? @relation("RoleModifier", fields: [modifier], references: [id], onDelete: SetNull) @@unique([tenantId, name]) @@unique([tenantId, code]) @@map("roles") } /// 用户角色关联表 model UserRole { id Int @id @default(autoincrement()) userId Int @map("user_id") /// 用户ID roleId Int @map("role_id") /// 角色ID user User @relation(fields: [userId], references: [id], onDelete: Cascade) role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) @@unique([userId, roleId]) @@map("user_roles") } /// 权限表 model Permission { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") /// 租户ID name String /// 权限名称 code String /// 权限编码(在租户内唯一) resource String /// 资源名称,如 user, role, menu action String /// 操作类型,如 create, read, update, delete description String? /// 权限描述 validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 creator Int? /// 创建人ID modifier Int? /// 修改人ID createTime DateTime @default(now()) @map("create_time") /// 创建时间 modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) roles RolePermission[] creatorUser User? @relation("PermissionCreator", fields: [creator], references: [id], onDelete: SetNull) modifierUser User? @relation("PermissionModifier", fields: [modifier], references: [id], onDelete: SetNull) @@unique([tenantId, resource, action]) @@unique([tenantId, code]) @@map("permissions") } /// 角色权限关联表 model RolePermission { id Int @id @default(autoincrement()) roleId Int @map("role_id") /// 角色ID permissionId Int @map("permission_id") /// 权限ID role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade) @@unique([roleId, permissionId]) @@map("role_permissions") } /// 菜单表(全局菜单模板,超级租户管理) model Menu { id Int @id @default(autoincrement()) name String /// 菜单名称 path String? /// 路由路径 icon String? /// 图标 component String? /// 组件路径 parentId Int? @map("parent_id") /// 父菜单ID permission String? /// 权限编码(用于控制菜单显示,如:menu:read) sort Int @default(0) /// 排序 validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 creator Int? @map("creator") /// 创建人ID modifier Int? @map("modifier") /// 修改人ID createTime DateTime @default(now()) @map("create_time") /// 创建时间 modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 parent Menu? @relation("MenuTree", fields: [parentId], references: [id]) children Menu[] @relation("MenuTree") tenantMenus TenantMenu[] /// 租户菜单关联 creatorUser User? @relation("MenuCreator", fields: [creator], references: [id], onDelete: SetNull) modifierUser User? @relation("MenuModifier", fields: [modifier], references: [id], onDelete: SetNull) @@map("menus") } /// 租户菜单关联表(租户分配的菜单) model TenantMenu { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") /// 租户ID menuId Int @map("menu_id") /// 菜单ID tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) menu Menu @relation(fields: [menuId], references: [id], onDelete: Cascade) @@unique([tenantId, menuId]) @@map("tenant_menus") } /// 数据字典表 model Dict { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") /// 租户ID name String /// 字典名称 code String /// 字典编码(在租户内唯一) description String? /// 字典描述 validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 creator Int? /// 创建人ID modifier Int? /// 修改人ID createTime DateTime @default(now()) @map("create_time") /// 创建时间 modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) items DictItem[] creatorUser User? @relation("DictCreator", fields: [creator], references: [id], onDelete: SetNull) modifierUser User? @relation("DictModifier", fields: [modifier], references: [id], onDelete: SetNull) @@unique([tenantId, code]) @@map("dicts") } /// 字典项表 model DictItem { id Int @id @default(autoincrement()) dictId Int @map("dict_id") /// 字典ID label String /// 标签 value String /// 值 sort Int @default(0) /// 排序 validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 creator Int? @map("creator") /// 创建人ID modifier Int? @map("modifier") /// 修改人ID createTime DateTime @default(now()) @map("create_time") /// 创建时间 modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 dict Dict @relation(fields: [dictId], references: [id], onDelete: Cascade) creatorUser User? @relation("DictItemCreator", fields: [creator], references: [id], onDelete: SetNull) modifierUser User? @relation("DictItemModifier", fields: [modifier], references: [id], onDelete: SetNull) @@map("dict_items") } /// 系统配置表 model Config { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") /// 租户ID key String /// 配置键(在租户内唯一) value String /// 配置值 description String? /// 配置描述 creator Int? /// 创建人ID modifier Int? /// 修改人ID createTime DateTime @default(now()) @map("create_time") /// 创建时间 modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) creatorUser User? @relation("ConfigCreator", fields: [creator], references: [id], onDelete: SetNull) modifierUser User? @relation("ConfigModifier", fields: [modifier], references: [id], onDelete: SetNull) @@unique([tenantId, key]) @@map("configs") } /// 日志记录表 model Log { id Int @id @default(autoincrement()) userId Int? @map("user_id") /// 用户ID action String /// 操作类型 content String? @db.Text /// 操作内容(使用 TEXT 类型支持长文本) ip String? /// IP地址 userAgent String? @map("user_agent") /// 用户代理 createTime DateTime @default(now()) @map("create_time") /// 创建时间 user User? @relation(fields: [userId], references: [id], onDelete: SetNull) @@map("logs") }