generator client { provider = "prisma-client" output = "../src/generated/prisma" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } // ============ 用户与认证 ============ model User { id String @id @default(cuid()) username String @unique password String nickname String @default("") avatar String @default("") email String @default("") phone String @default("") status Int @default(1) // 1=正常, 0=禁用 role String @default("admin") // admin | editor createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } // ============ 内容模型定义 ============ model ContentModel { id String @id @default(cuid()) code String @unique name String description String @default("") fields String // JSON: FieldDefinition[] isPageType Boolean @default(false) urlPattern String @default("") hasVersions Boolean @default(false) hasDraft Boolean @default(false) icon String @default("") sortOrder Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt items ContentItem[] } // ============ 内容条目 ============ model ContentItem { id String @id @default(cuid()) modelId String modelCode String title String slug String @default("") status String @default("draft") // draft | published | archived data String // JSON: Record version Int @default(1) sortOrder Int @default(0) publishedAt DateTime? createdBy String @default("system") updatedBy String @default("system") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt model ContentModel @relation(fields: [modelId], references: [id]) @@unique([modelCode, slug]) @@index([modelCode]) @@index([status]) } // ============ 内容区域 ============ model ContentZone { id String @id @default(cuid()) code String @unique name String description String @default("") pageCode String @default("") zoneKey String @default("") allowedModels String @default("[]") // JSON: string[] items String @default("[]") // JSON: ContentZoneItem[] settings String @default("{}") // JSON: ContentZoneSettings createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([pageCode]) } // ============ 媒体资源 ============ model MediaAsset { id String @id @default(cuid()) name String path String url String mimeType String size Int @default(0) width Int @default(0) height Int @default(0) alt String @default("") storageType String @default("local") // local | oss | s3 createdBy String @default("system") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } // ============ 操作日志 ============ model AuditLog { id String @id @default(cuid()) module String // model | item | zone | theme | media targetId String action String // create | update | delete | publish | unpublish operator String beforeData String @default("{}") // JSON afterData String @default("{}") // JSON ip String @default("") userAgent String @default("") createdAt DateTime @default(now()) @@index([module]) @@index([targetId]) @@index([createdAt]) }