Files
张翔 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

127 lines
4.0 KiB
SQL

-- CreateTable
CREATE TABLE "User" (
"id" TEXT NOT NULL PRIMARY KEY,
"username" TEXT NOT NULL,
"password" TEXT NOT NULL,
"nickname" TEXT NOT NULL DEFAULT '',
"avatar" TEXT NOT NULL DEFAULT '',
"email" TEXT NOT NULL DEFAULT '',
"phone" TEXT NOT NULL DEFAULT '',
"status" INTEGER NOT NULL DEFAULT 1,
"role" TEXT NOT NULL DEFAULT 'admin',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "ContentModel" (
"id" TEXT NOT NULL PRIMARY KEY,
"code" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT NOT NULL DEFAULT '',
"fields" TEXT NOT NULL,
"isPageType" BOOLEAN NOT NULL DEFAULT false,
"urlPattern" TEXT NOT NULL DEFAULT '',
"hasVersions" BOOLEAN NOT NULL DEFAULT false,
"hasDraft" BOOLEAN NOT NULL DEFAULT false,
"icon" TEXT NOT NULL DEFAULT '',
"sortOrder" INTEGER NOT NULL DEFAULT 0,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "ContentItem" (
"id" TEXT NOT NULL PRIMARY KEY,
"modelId" TEXT NOT NULL,
"modelCode" TEXT NOT NULL,
"title" TEXT NOT NULL,
"slug" TEXT NOT NULL DEFAULT '',
"status" TEXT NOT NULL DEFAULT 'draft',
"data" TEXT NOT NULL,
"version" INTEGER NOT NULL DEFAULT 1,
"sortOrder" INTEGER NOT NULL DEFAULT 0,
"publishedAt" DATETIME,
"createdBy" TEXT NOT NULL DEFAULT 'system',
"updatedBy" TEXT NOT NULL DEFAULT 'system',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
CONSTRAINT "ContentItem_modelId_fkey" FOREIGN KEY ("modelId") REFERENCES "ContentModel" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "ContentZone" (
"id" TEXT NOT NULL PRIMARY KEY,
"code" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT NOT NULL DEFAULT '',
"pageCode" TEXT NOT NULL DEFAULT '',
"zoneKey" TEXT NOT NULL DEFAULT '',
"allowedModels" TEXT NOT NULL DEFAULT '[]',
"items" TEXT NOT NULL DEFAULT '[]',
"settings" TEXT NOT NULL DEFAULT '{}',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "MediaAsset" (
"id" TEXT NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"path" TEXT NOT NULL,
"url" TEXT NOT NULL,
"mimeType" TEXT NOT NULL,
"size" INTEGER NOT NULL DEFAULT 0,
"width" INTEGER NOT NULL DEFAULT 0,
"height" INTEGER NOT NULL DEFAULT 0,
"alt" TEXT NOT NULL DEFAULT '',
"storageType" TEXT NOT NULL DEFAULT 'local',
"createdBy" TEXT NOT NULL DEFAULT 'system',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "AuditLog" (
"id" TEXT NOT NULL PRIMARY KEY,
"module" TEXT NOT NULL,
"targetId" TEXT NOT NULL,
"action" TEXT NOT NULL,
"operator" TEXT NOT NULL,
"beforeData" TEXT NOT NULL DEFAULT '{}',
"afterData" TEXT NOT NULL DEFAULT '{}',
"ip" TEXT NOT NULL DEFAULT '',
"userAgent" TEXT NOT NULL DEFAULT '',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- CreateIndex
CREATE UNIQUE INDEX "User_username_key" ON "User"("username");
-- CreateIndex
CREATE UNIQUE INDEX "ContentModel_code_key" ON "ContentModel"("code");
-- CreateIndex
CREATE INDEX "ContentItem_modelCode_idx" ON "ContentItem"("modelCode");
-- CreateIndex
CREATE INDEX "ContentItem_status_idx" ON "ContentItem"("status");
-- CreateIndex
CREATE UNIQUE INDEX "ContentItem_modelCode_slug_key" ON "ContentItem"("modelCode", "slug");
-- CreateIndex
CREATE UNIQUE INDEX "ContentZone_code_key" ON "ContentZone"("code");
-- CreateIndex
CREATE INDEX "ContentZone_pageCode_idx" ON "ContentZone"("pageCode");
-- CreateIndex
CREATE INDEX "AuditLog_module_idx" ON "AuditLog"("module");
-- CreateIndex
CREATE INDEX "AuditLog_targetId_idx" ON "AuditLog"("targetId");
-- CreateIndex
CREATE INDEX "AuditLog_createdAt_idx" ON "AuditLog"("createdAt");