Files
edgeKey/prisma/migrations/0001_init.sql
ggyy ef8d17719f feat(邮件): 支持多邮局配置管理
- 将邮件配置从单例改为多实例,支持创建、编辑、删除多个配置
- 修改数据库模型,移除 provider 唯一约束,添加索引
- 新增配置激活、删除、清空日志功能
- 重构服务层,统一推送设置同步逻辑
- 更新前端接口,支持配置 ID 参数传递
2026-04-22 18:48:03 +08:00

268 lines
8.6 KiB
SQL

-- CreateTable
CREATE TABLE "Admin" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"username" TEXT NOT NULL,
"passwordHash" TEXT NOT NULL,
"nickname" TEXT,
"email" TEXT,
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "SiteSetting" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT DEFAULT 1,
"siteName" TEXT NOT NULL,
"siteUrl" TEXT,
"siteSubtitle" TEXT,
"logoIcon" TEXT,
"logo" TEXT,
"notice" TEXT,
"supportContact" TEXT,
"footerText" TEXT,
"orderNotice" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "Category" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL,
"slug" TEXT NOT NULL,
"description" TEXT,
"sort" INTEGER NOT NULL DEFAULT 0,
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "Product" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"categoryId" INTEGER,
"name" TEXT NOT NULL,
"slug" TEXT NOT NULL,
"subtitle" TEXT,
"description" TEXT,
"coverImage" TEXT,
"price" INTEGER NOT NULL,
"status" TEXT NOT NULL DEFAULT 'DRAFT',
"deliveryType" TEXT NOT NULL DEFAULT 'CARD_AUTO',
"stockMode" TEXT NOT NULL DEFAULT 'FINITE',
"minBuy" INTEGER NOT NULL DEFAULT 1,
"maxBuy" INTEGER NOT NULL DEFAULT 1,
"sort" INTEGER NOT NULL DEFAULT 0,
"isVisibleStock" BOOLEAN NOT NULL DEFAULT true,
"isContactRequired" BOOLEAN NOT NULL DEFAULT true,
"purchaseNote" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
CONSTRAINT "Product_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "Category" ("id") ON DELETE SET NULL ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "Card" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"productId" INTEGER NOT NULL,
"content" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'UNUSED',
"batchNo" TEXT,
"orderId" INTEGER,
"soldAt" DATETIME,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
CONSTRAINT "Card_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT "Card_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "Order" ("id") ON DELETE SET NULL ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "Order" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"orderNo" TEXT NOT NULL,
"queryToken" TEXT NOT NULL,
"productId" INTEGER NOT NULL,
"productNameSnapshot" TEXT NOT NULL,
"unitPrice" INTEGER NOT NULL,
"quantity" INTEGER NOT NULL,
"amount" INTEGER NOT NULL,
"contactType" TEXT NOT NULL DEFAULT 'EMAIL',
"contactValue" TEXT,
"buyerNote" TEXT,
"paymentProvider" TEXT NOT NULL,
"paymentChannel" TEXT,
"paymentOrderNo" TEXT,
"status" TEXT NOT NULL DEFAULT 'PENDING',
"paymentStatus" TEXT NOT NULL DEFAULT 'UNPAID',
"deliveryStatus" TEXT NOT NULL DEFAULT 'NOT_DELIVERED',
"paidAt" DATETIME,
"deliveredAt" DATETIME,
"closedAt" DATETIME,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
CONSTRAINT "Order_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "OrderDelivery" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"orderId" INTEGER NOT NULL,
"deliveryType" TEXT NOT NULL DEFAULT 'CARD',
"contentSnapshot" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'SUCCESS',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "OrderDelivery_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "Order" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "PaymentConfig" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"provider" TEXT NOT NULL,
"name" TEXT NOT NULL,
"isEnabled" BOOLEAN NOT NULL DEFAULT false,
"configJson" TEXT NOT NULL,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "PaymentLog" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"orderId" INTEGER,
"provider" TEXT NOT NULL,
"orderNo" TEXT,
"paymentOrderNo" TEXT,
"eventType" TEXT NOT NULL,
"rawPayload" TEXT NOT NULL,
"verifyStatus" TEXT NOT NULL DEFAULT 'PENDING',
"message" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "PaymentLog_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "Order" ("id") ON DELETE SET NULL ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "EmailConfig" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"provider" TEXT NOT NULL,
"name" TEXT NOT NULL,
"isEnabled" BOOLEAN NOT NULL DEFAULT false,
"configJson" TEXT NOT NULL,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "EmailTemplate" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"scene" TEXT NOT NULL,
"name" TEXT NOT NULL,
"subject" TEXT NOT NULL,
"content" TEXT NOT NULL,
"isEnabled" BOOLEAN NOT NULL DEFAULT true,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "EmailLog" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"orderId" INTEGER,
"provider" TEXT NOT NULL,
"apiProvider" TEXT,
"scene" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'SUCCESS',
"toEmail" TEXT NOT NULL,
"subject" TEXT NOT NULL,
"messageId" TEXT,
"error" TEXT,
"triggeredBy" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "EmailLog_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "Order" ("id") ON DELETE SET NULL ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "AdminOperationLog" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"adminId" INTEGER NOT NULL,
"action" TEXT NOT NULL,
"targetType" TEXT NOT NULL,
"targetId" TEXT,
"detail" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "AdminOperationLog_adminId_fkey" FOREIGN KEY ("adminId") REFERENCES "Admin" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
);
-- CreateIndex
CREATE UNIQUE INDEX "Admin_username_key" ON "Admin"("username");
-- CreateIndex
CREATE UNIQUE INDEX "Category_slug_key" ON "Category"("slug");
-- CreateIndex
CREATE UNIQUE INDEX "Product_slug_key" ON "Product"("slug");
-- CreateIndex
CREATE INDEX "Product_categoryId_idx" ON "Product"("categoryId");
-- CreateIndex
CREATE INDEX "Product_status_sort_idx" ON "Product"("status", "sort");
-- CreateIndex
CREATE INDEX "Card_productId_status_idx" ON "Card"("productId", "status");
-- CreateIndex
CREATE INDEX "Card_orderId_idx" ON "Card"("orderId");
-- CreateIndex
CREATE UNIQUE INDEX "Order_orderNo_key" ON "Order"("orderNo");
-- CreateIndex
CREATE INDEX "Order_productId_idx" ON "Order"("productId");
-- CreateIndex
CREATE INDEX "Order_status_createdAt_idx" ON "Order"("status", "createdAt");
-- CreateIndex
CREATE INDEX "Order_paymentStatus_createdAt_idx" ON "Order"("paymentStatus", "createdAt");
-- CreateIndex
CREATE INDEX "Order_deliveryStatus_createdAt_idx" ON "Order"("deliveryStatus", "createdAt");
-- CreateIndex
CREATE INDEX "OrderDelivery_orderId_createdAt_idx" ON "OrderDelivery"("orderId", "createdAt");
-- CreateIndex
CREATE UNIQUE INDEX "PaymentConfig_provider_key" ON "PaymentConfig"("provider");
-- CreateIndex
CREATE INDEX "PaymentLog_provider_createdAt_idx" ON "PaymentLog"("provider", "createdAt");
-- CreateIndex
CREATE INDEX "PaymentLog_orderNo_idx" ON "PaymentLog"("orderNo");
-- CreateIndex
CREATE INDEX "PaymentLog_orderId_idx" ON "PaymentLog"("orderId");
-- CreateIndex
CREATE INDEX "EmailConfig_provider_idx" ON "EmailConfig"("provider");
-- CreateIndex
CREATE UNIQUE INDEX "EmailTemplate_scene_key" ON "EmailTemplate"("scene");
-- CreateIndex
CREATE INDEX "EmailLog_provider_createdAt_idx" ON "EmailLog"("provider", "createdAt");
-- CreateIndex
CREATE INDEX "EmailLog_scene_createdAt_idx" ON "EmailLog"("scene", "createdAt");
-- CreateIndex
CREATE INDEX "EmailLog_status_createdAt_idx" ON "EmailLog"("status", "createdAt");
-- CreateIndex
CREATE INDEX "EmailLog_orderId_idx" ON "EmailLog"("orderId");
-- CreateIndex
CREATE INDEX "AdminOperationLog_adminId_createdAt_idx" ON "AdminOperationLog"("adminId", "createdAt");