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,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");
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user