sysmgr-nest/prisma/schema.prisma
2026-10-11 22:32:14 +08:00

301 lines
11 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 通用系统管理脚手架 (sysmgr) 数据模型
// 约定:表名 sys_ 前缀;列 snake_case(模型 camelCase + @map);业务键关联(角色/资源/组织/字典/租户用 code,用户用 id)。
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
/// 租户
model Tenant {
id String @id @default(uuid(7)) @db.VarChar(36)
code String @unique @db.VarChar(64)
name String @db.VarChar(128)
status String @default("enabled") @db.VarChar(16)
remark String? @db.VarChar(255)
brandName String? @map("brand_name") @db.VarChar(64)
logoUrl String? @map("logo_url") @db.VarChar(255)
themeColor String? @map("theme_color") @db.VarChar(16)
copyright String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(36)
updatedAt DateTime @updatedAt @map("updated_at")
@@map("sys_tenant")
}
/// 用户
model User {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
username String @db.VarChar(64)
passwordHash String @map("password_hash") @db.VarChar(255)
nickname String? @db.VarChar(64)
email String? @db.VarChar(128)
phone String? @db.VarChar(32)
avatar String? @db.VarChar(255)
status String @default("enabled") @db.VarChar(16)
tokenVersion Int @default(0) @map("token_version")
lockedAt DateTime? @map("locked_at")
lockReason String? @map("lock_reason") @db.VarChar(255)
mustChangePassword Boolean @default(false) @map("must_change_password")
orgCode String? @map("org_code") @db.VarChar(64)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(36)
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@unique([tenantCode, username])
@@index([tenantCode])
@@index([orgCode])
@@map("sys_user")
}
/// 角色
model Role {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
code String @db.VarChar(64)
name String @db.VarChar(64)
dataScope String @default("all") @map("data_scope") @db.VarChar(16)
status String @default("enabled") @db.VarChar(16)
remark String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(36)
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@unique([tenantCode, code])
@@index([tenantCode])
@@map("sys_role")
}
/// 资源(菜单/按钮/接口)
model Resource {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
parentCode String? @map("parent_code") @db.VarChar(64)
type String @db.VarChar(16)
code String @db.VarChar(128)
name String @db.VarChar(64)
path String? @db.VarChar(255)
component String? @db.VarChar(255)
method String? @db.VarChar(8)
apiPath String? @map("api_path") @db.VarChar(255)
icon String? @db.VarChar(64)
sort Int @default(0)
status String @default("enabled") @db.VarChar(16)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(36)
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@unique([tenantCode, code])
@@index([tenantCode])
@@index([parentCode])
@@map("sys_resource")
}
/// 组织
model Org {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
parentCode String? @map("parent_code") @db.VarChar(64)
code String @db.VarChar(64)
name String @db.VarChar(64)
leader String? @db.VarChar(64)
sort Int @default(0)
status String @default("enabled") @db.VarChar(16)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(36)
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@unique([tenantCode, code])
@@index([tenantCode])
@@index([parentCode])
@@map("sys_org")
}
/// 字典类型
model DictType {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
code String @db.VarChar(64)
name String @db.VarChar(64)
status String @default("enabled") @db.VarChar(16)
builtIn Boolean @default(false) @map("built_in")
remark String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(36)
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@unique([tenantCode, code])
@@index([tenantCode])
@@map("sys_dict_type")
}
/// 字典项
model DictItem {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
dictTypeCode String @map("dict_type_code") @db.VarChar(64)
label String @db.VarChar(64)
value String @db.VarChar(64)
sort Int @default(0)
status String @default("enabled") @db.VarChar(16)
builtIn Boolean @default(false) @map("built_in")
colorType String? @map("color_type") @db.VarChar(16)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(36)
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@unique([tenantCode, dictTypeCode, value])
@@index([tenantCode, dictTypeCode])
@@map("sys_dict_item")
}
/// 参数配置
model Config {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
key String @db.VarChar(128)
value String? @db.Text
remark String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(36)
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@unique([tenantCode, key])
@@map("sys_config")
}
/// 操作日志(只增,硬删)
model AuditLog {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
userId String? @map("user_id") @db.VarChar(36)
username String? @db.VarChar(64)
module String? @db.VarChar(64)
action String? @db.VarChar(64)
method String? @db.VarChar(8)
path String? @db.VarChar(255)
params String? @db.Text
result String? @db.Text
status String? @db.VarChar(16)
errorMessage String? @map("error_message") @db.Text
ip String? @db.VarChar(64)
userAgent String? @map("user_agent") @db.VarChar(255)
durationMs Int? @map("duration_ms")
createdAt DateTime @default(now()) @map("created_at")
@@index([tenantCode, createdAt])
@@map("sys_audit_log")
}
/// 登录日志(只增,硬删)
model LoginLog {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
username String? @db.VarChar(64)
ip String? @db.VarChar(64)
userAgent String? @map("user_agent") @db.VarChar(255)
status String @default("success") @db.VarChar(16)
message String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at")
@@index([tenantCode, createdAt])
@@map("sys_login_log")
}
/// 刷新令牌(会话载体,硬删)
model RefreshToken {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
userId String @map("user_id") @db.VarChar(36)
sid String? @db.VarChar(36)
jti String @unique @db.VarChar(64)
tokenHash String @map("token_hash") @db.VarChar(255)
ip String? @db.VarChar(64)
userAgent String? @map("user_agent") @db.VarChar(255)
loginAt DateTime @default(now()) @map("login_at")
expireAt DateTime @map("expire_at")
revokedAt DateTime? @map("revoked_at")
createdAt DateTime @default(now()) @map("created_at")
@@index([tenantCode, userId])
@@index([sid])
@@map("sys_refresh_token")
}
/// 通知/公告
model Notice {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
title String @db.VarChar(128)
content String @db.Text
status String @default("enabled") @db.VarChar(16)
createdBy String? @map("created_by") @db.VarChar(36)
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@index([tenantCode])
@@map("sys_notice")
}
/// 通知已读追踪
model NoticeRead {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
noticeId String @map("notice_id") @db.VarChar(36)
userId String @map("user_id") @db.VarChar(36)
readAt DateTime @default(now()) @map("read_at")
@@unique([tenantCode, noticeId, userId])
@@index([tenantCode, userId])
@@map("sys_notice_read")
}
/// 用户-角色关联
model UserRole {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
userId String @map("user_id") @db.VarChar(36)
roleCode String @map("role_code") @db.VarChar(64)
@@unique([tenantCode, userId, roleCode])
@@index([tenantCode, userId])
@@map("sys_user_role")
}
/// 角色-资源关联
model RoleResource {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
roleCode String @map("role_code") @db.VarChar(64)
resourceCode String @map("resource_code") @db.VarChar(128)
@@unique([tenantCode, roleCode, resourceCode])
@@index([tenantCode, roleCode])
@@map("sys_role_resource")
}
/// 角色-组织关联(数据权限「自定义」)
model RoleOrg {
id String @id @default(uuid(7)) @db.VarChar(36)
tenantCode String @map("tenant_code") @db.VarChar(64)
roleCode String @map("role_code") @db.VarChar(64)
orgCode String @map("org_code") @db.VarChar(64)
@@unique([tenantCode, roleCode, orgCode])
@@map("sys_role_org")
}