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:
张翔
2026-07-07 06:53:58 +08:00
parent 829d83522c
commit b5245f9aa2
87 changed files with 25659 additions and 0 deletions
@@ -0,0 +1,126 @@
-- 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");
+3
View File
@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "sqlite"