feat(cms): 添加 CMS 内容管理系统与 Admin 管理后台
- 新增 Prisma + SQLite 数据库模型 (Category, Content, Media, User 等) - 新增 Admin 管理后台 (认证、内容管理、媒体管理) - 新增 CMS API 路由 (CRUD, 草稿/发布, 重新验证) - 新增 CMS 内容版本的历史归档页面 - 新增 components/cms 内容渲染组件 - 新增 components/admin 管理后台 UI 组件 - 更新 Contact API 路由
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
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])
|
||||
}
|
||||
Reference in New Issue
Block a user