Files
novalon-website/prisma/schema.prisma
T
张翔 b5245f9aa2 feat(cms): 添加 CMS 内容管理系统与 Admin 管理后台
- 新增 Prisma + SQLite 数据库模型 (Category, Content, Media, User 等)
- 新增 Admin 管理后台 (认证、内容管理、媒体管理)
- 新增 CMS API 路由 (CRUD, 草稿/发布, 重新验证)
- 新增 CMS 内容版本的历史归档页面
- 新增 components/cms 内容渲染组件
- 新增 components/admin 管理后台 UI 组件
- 更新 Contact API 路由
2026-07-07 06:53:58 +08:00

125 lines
3.5 KiB
Plaintext

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<string, unknown>
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])
}