849 lines
27 KiB
SQL
849 lines
27 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "OrderStatus" AS ENUM ('PENDING', 'PAID', 'SHIPPED', 'COMPLETED', 'CANCELLED', 'REFUNDED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT,
|
|
"phone" TEXT,
|
|
"username" TEXT NOT NULL,
|
|
"password" TEXT,
|
|
"firstName" TEXT,
|
|
"lastName" TEXT,
|
|
"avatar" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"emailVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
"phoneVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
"lastLoginAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"mfaSecret" TEXT,
|
|
"mfaEnabled" BOOLEAN NOT NULL DEFAULT false,
|
|
"loginAttempts" INTEGER NOT NULL DEFAULT 0,
|
|
"lockedUntil" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "roles" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"isSystem" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "roles_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "permissions" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"resource" TEXT NOT NULL,
|
|
"action" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "permissions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "user_roles" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"roleId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "user_roles_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "role_permissions" (
|
|
"id" TEXT NOT NULL,
|
|
"roleId" TEXT NOT NULL,
|
|
"permissionId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "role_permissions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "files" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"originalName" TEXT NOT NULL,
|
|
"mimeType" TEXT NOT NULL,
|
|
"size" INTEGER NOT NULL,
|
|
"path" TEXT NOT NULL,
|
|
"url" TEXT,
|
|
"cdnUrl" TEXT,
|
|
"storageType" TEXT NOT NULL DEFAULT 'local',
|
|
"bucket" TEXT,
|
|
"fileHash" TEXT,
|
|
"category" TEXT,
|
|
"tags" TEXT[],
|
|
"isPublic" BOOLEAN NOT NULL DEFAULT false,
|
|
"accessCount" INTEGER NOT NULL DEFAULT 0,
|
|
"lastAccessedAt" TIMESTAMP(3),
|
|
"ownerId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "files_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "sessions" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"token" TEXT NOT NULL,
|
|
"refreshToken" TEXT,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"refreshExpiresAt" TIMESTAMP(3),
|
|
"ipAddress" TEXT,
|
|
"userAgent" TEXT,
|
|
"deviceName" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "sessions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "oauth_accounts" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"provider" TEXT NOT NULL,
|
|
"providerId" TEXT NOT NULL,
|
|
"providerData" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "oauth_accounts_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "realname_auth" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"realName" TEXT NOT NULL,
|
|
"idCardNumber" TEXT NOT NULL,
|
|
"idCardFrontUrl" TEXT,
|
|
"idCardBackUrl" TEXT,
|
|
"faceImageUrl" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"rejectReason" TEXT,
|
|
"verifiedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "realname_auth_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "login_history" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"ipAddress" TEXT,
|
|
"userAgent" TEXT,
|
|
"deviceName" TEXT,
|
|
"loginMethod" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "login_history_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "payment_channels" (
|
|
"id" TEXT NOT NULL,
|
|
"code" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"isEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"isSandbox" BOOLEAN NOT NULL DEFAULT true,
|
|
"config" JSONB NOT NULL,
|
|
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "payment_channels_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "payment_orders" (
|
|
"id" TEXT NOT NULL,
|
|
"orderNo" TEXT NOT NULL,
|
|
"channelOrderNo" TEXT,
|
|
"userId" TEXT NOT NULL,
|
|
"channelId" TEXT,
|
|
"amount" DECIMAL(12,2) NOT NULL,
|
|
"currency" TEXT NOT NULL DEFAULT 'CNY',
|
|
"subject" TEXT NOT NULL,
|
|
"body" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"paidAt" TIMESTAMP(3),
|
|
"cancelledAt" TIMESTAMP(3),
|
|
"clientIp" TEXT,
|
|
"userAgent" TEXT,
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "payment_orders_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "payment_refunds" (
|
|
"id" TEXT NOT NULL,
|
|
"refundNo" TEXT NOT NULL,
|
|
"channelRefundNo" TEXT,
|
|
"orderId" TEXT NOT NULL,
|
|
"channelId" TEXT,
|
|
"userId" TEXT NOT NULL,
|
|
"amount" DECIMAL(12,2) NOT NULL,
|
|
"reason" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"processedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "payment_refunds_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "payment_logs" (
|
|
"id" TEXT NOT NULL,
|
|
"orderId" TEXT,
|
|
"refundId" TEXT,
|
|
"type" TEXT NOT NULL,
|
|
"action" TEXT NOT NULL,
|
|
"request" JSONB,
|
|
"response" JSONB,
|
|
"status" TEXT NOT NULL,
|
|
"error" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "payment_logs_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "orders" (
|
|
"id" TEXT NOT NULL,
|
|
"orderNo" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"status" "OrderStatus" NOT NULL DEFAULT 'PENDING',
|
|
"totalAmount" DECIMAL(12,2) NOT NULL,
|
|
"paidAmount" DECIMAL(12,2) NOT NULL,
|
|
"discountAmount" DECIMAL(12,2) NOT NULL DEFAULT 0,
|
|
"paymentMethod" TEXT,
|
|
"paymentOrderId" TEXT,
|
|
"remark" TEXT,
|
|
"paidAt" TIMESTAMP(3),
|
|
"shippedAt" TIMESTAMP(3),
|
|
"completedAt" TIMESTAMP(3),
|
|
"cancelledAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "orders_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "order_items" (
|
|
"id" TEXT NOT NULL,
|
|
"orderId" TEXT NOT NULL,
|
|
"productId" TEXT NOT NULL,
|
|
"productName" TEXT NOT NULL,
|
|
"productImage" TEXT,
|
|
"quantity" INTEGER NOT NULL,
|
|
"unitPrice" DECIMAL(12,2) NOT NULL,
|
|
"totalAmount" DECIMAL(12,2) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "order_items_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notifications" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT,
|
|
"type" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"content" TEXT NOT NULL,
|
|
"contentHtml" TEXT,
|
|
"channel" TEXT NOT NULL,
|
|
"channelData" JSONB,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"sentAt" TIMESTAMP(3),
|
|
"readAt" TIMESTAMP(3),
|
|
"priority" TEXT NOT NULL DEFAULT 'normal',
|
|
"metadata" JSONB,
|
|
"expiresAt" TIMESTAMP(3),
|
|
"templateId" TEXT,
|
|
"templateVersion" INTEGER,
|
|
"variables" JSONB,
|
|
"retryCount" INTEGER NOT NULL DEFAULT 0,
|
|
"maxRetries" INTEGER NOT NULL DEFAULT 3,
|
|
"errorMessage" TEXT,
|
|
"deduplicationId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "notifications_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notification_templates" (
|
|
"id" TEXT NOT NULL,
|
|
"code" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"channels" TEXT[],
|
|
"version" INTEGER NOT NULL DEFAULT 1,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "notification_templates_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notification_template_locales" (
|
|
"id" TEXT NOT NULL,
|
|
"templateId" TEXT NOT NULL,
|
|
"locale" TEXT NOT NULL,
|
|
"subject" TEXT,
|
|
"title" TEXT,
|
|
"content" TEXT NOT NULL,
|
|
"contentHtml" TEXT,
|
|
"variables" TEXT[],
|
|
"isDefault" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "notification_template_locales_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notification_channels" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"provider" TEXT NOT NULL,
|
|
"config" JSONB NOT NULL,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"priority" INTEGER NOT NULL DEFAULT 0,
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "notification_channels_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notification_preferences" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"emailEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"smsEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"pushEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"inAppEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"securityEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"marketingEnabled" BOOLEAN NOT NULL DEFAULT false,
|
|
"systemEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"quietStartHour" INTEGER,
|
|
"quietEndHour" INTEGER,
|
|
"timezone" TEXT DEFAULT 'Asia/Shanghai',
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "notification_preferences_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notification_batches" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"type" TEXT NOT NULL,
|
|
"scheduledAt" TIMESTAMP(3),
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"totalCount" INTEGER NOT NULL DEFAULT 0,
|
|
"sentCount" INTEGER NOT NULL DEFAULT 0,
|
|
"failedCount" INTEGER NOT NULL DEFAULT 0,
|
|
"creatorId" TEXT,
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "notification_batches_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notification_batch_items" (
|
|
"id" TEXT NOT NULL,
|
|
"batchId" TEXT NOT NULL,
|
|
"notificationId" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"sentAt" TIMESTAMP(3),
|
|
"errorMessage" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "notification_batch_items_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "articles" (
|
|
"id" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"summary" TEXT,
|
|
"content" TEXT NOT NULL,
|
|
"contentHtml" TEXT,
|
|
"coverImage" TEXT,
|
|
"authorId" TEXT NOT NULL,
|
|
"categoryId" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'draft',
|
|
"viewCount" INTEGER NOT NULL DEFAULT 0,
|
|
"likeCount" INTEGER NOT NULL DEFAULT 0,
|
|
"commentCount" INTEGER NOT NULL DEFAULT 0,
|
|
"isTop" BOOLEAN NOT NULL DEFAULT false,
|
|
"isRecommend" BOOLEAN NOT NULL DEFAULT false,
|
|
"publishedAt" TIMESTAMP(3),
|
|
"reviewedAt" TIMESTAMP(3),
|
|
"reviewedBy" TEXT,
|
|
"reviewComment" TEXT,
|
|
"seoTitle" TEXT,
|
|
"seoKeywords" TEXT,
|
|
"seoDescription" TEXT,
|
|
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
|
"version" INTEGER NOT NULL DEFAULT 1,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "articles_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "article_versions" (
|
|
"id" TEXT NOT NULL,
|
|
"articleId" TEXT NOT NULL,
|
|
"version" INTEGER NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"content" TEXT NOT NULL,
|
|
"contentHtml" TEXT,
|
|
"summary" TEXT,
|
|
"changeLog" TEXT,
|
|
"authorId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "article_versions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "categories" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"icon" TEXT,
|
|
"parentId" TEXT,
|
|
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
|
"articleCount" INTEGER NOT NULL DEFAULT 0,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"seoTitle" TEXT,
|
|
"seoKeywords" TEXT,
|
|
"seoDescription" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "categories_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "tags" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"articleCount" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "tags_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "article_tags" (
|
|
"id" TEXT NOT NULL,
|
|
"articleId" TEXT NOT NULL,
|
|
"tagId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "article_tags_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "comments" (
|
|
"id" TEXT NOT NULL,
|
|
"content" TEXT NOT NULL,
|
|
"articleId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"parentId" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"likeCount" INTEGER NOT NULL DEFAULT 0,
|
|
"ipAddress" TEXT,
|
|
"userAgent" TEXT,
|
|
"reviewedAt" TIMESTAMP(3),
|
|
"reviewedBy" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "comments_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_phone_key" ON "users"("phone");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_username_key" ON "users"("username");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "roles_name_key" ON "roles"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "permissions_name_key" ON "permissions"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "user_roles_userId_roleId_key" ON "user_roles"("userId", "roleId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "role_permissions_roleId_permissionId_key" ON "role_permissions"("roleId", "permissionId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "files_ownerId_idx" ON "files"("ownerId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "files_storageType_idx" ON "files"("storageType");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "files_category_idx" ON "files"("category");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "files_fileHash_idx" ON "files"("fileHash");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "sessions_token_key" ON "sessions"("token");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "sessions_refreshToken_key" ON "sessions"("refreshToken");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "oauth_accounts_provider_providerId_key" ON "oauth_accounts"("provider", "providerId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "realname_auth_userId_key" ON "realname_auth"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "payment_channels_code_key" ON "payment_channels"("code");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_channels_type_idx" ON "payment_channels"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_channels_isEnabled_idx" ON "payment_channels"("isEnabled");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "payment_orders_orderNo_key" ON "payment_orders"("orderNo");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_orders_userId_idx" ON "payment_orders"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_orders_orderNo_idx" ON "payment_orders"("orderNo");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_orders_status_idx" ON "payment_orders"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_orders_createdAt_idx" ON "payment_orders"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "payment_refunds_refundNo_key" ON "payment_refunds"("refundNo");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_refunds_orderId_idx" ON "payment_refunds"("orderId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_refunds_userId_idx" ON "payment_refunds"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_refunds_status_idx" ON "payment_refunds"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_logs_orderId_idx" ON "payment_logs"("orderId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_logs_refundId_idx" ON "payment_logs"("refundId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "payment_logs_createdAt_idx" ON "payment_logs"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "orders_orderNo_key" ON "orders"("orderNo");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "orders_paymentOrderId_key" ON "orders"("paymentOrderId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "orders_userId_idx" ON "orders"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "orders_orderNo_idx" ON "orders"("orderNo");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "orders_status_idx" ON "orders"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "orders_createdAt_idx" ON "orders"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "order_items_orderId_idx" ON "order_items"("orderId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "order_items_productId_idx" ON "order_items"("productId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notifications_userId_idx" ON "notifications"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notifications_status_idx" ON "notifications"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notifications_channel_idx" ON "notifications"("channel");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notifications_type_idx" ON "notifications"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notifications_priority_idx" ON "notifications"("priority");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notifications_deduplicationId_idx" ON "notifications"("deduplicationId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "notification_templates_code_key" ON "notification_templates"("code");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_templates_code_idx" ON "notification_templates"("code");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_templates_isActive_idx" ON "notification_templates"("isActive");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_template_locales_locale_idx" ON "notification_template_locales"("locale");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "notification_template_locales_templateId_locale_key" ON "notification_template_locales"("templateId", "locale");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_channels_type_idx" ON "notification_channels"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_channels_isActive_idx" ON "notification_channels"("isActive");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "notification_preferences_userId_key" ON "notification_preferences"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_batches_status_idx" ON "notification_batches"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_batches_creatorId_idx" ON "notification_batches"("creatorId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_batch_items_batchId_idx" ON "notification_batch_items"("batchId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_batch_items_notificationId_idx" ON "notification_batch_items"("notificationId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notification_batch_items_status_idx" ON "notification_batch_items"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "articles_slug_key" ON "articles"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "articles_authorId_idx" ON "articles"("authorId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "articles_categoryId_idx" ON "articles"("categoryId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "articles_status_idx" ON "articles"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "articles_publishedAt_idx" ON "articles"("publishedAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "articles_slug_idx" ON "articles"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "article_versions_articleId_idx" ON "article_versions"("articleId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "article_versions_articleId_version_key" ON "article_versions"("articleId", "version");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "categories_slug_key" ON "categories"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "categories_parentId_idx" ON "categories"("parentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "categories_slug_idx" ON "categories"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "tags_name_key" ON "tags"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "tags_slug_key" ON "tags"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "tags_slug_idx" ON "tags"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "article_tags_articleId_idx" ON "article_tags"("articleId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "article_tags_tagId_idx" ON "article_tags"("tagId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "article_tags_articleId_tagId_key" ON "article_tags"("articleId", "tagId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "comments_articleId_idx" ON "comments"("articleId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "comments_userId_idx" ON "comments"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "comments_parentId_idx" ON "comments"("parentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "comments_status_idx" ON "comments"("status");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "permissions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "files" ADD CONSTRAINT "files_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "sessions" ADD CONSTRAINT "sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "oauth_accounts" ADD CONSTRAINT "oauth_accounts_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "realname_auth" ADD CONSTRAINT "realname_auth_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "payment_orders" ADD CONSTRAINT "payment_orders_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "payment_orders" ADD CONSTRAINT "payment_orders_channelId_fkey" FOREIGN KEY ("channelId") REFERENCES "payment_channels"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "payment_refunds" ADD CONSTRAINT "payment_refunds_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "payment_orders"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "payment_refunds" ADD CONSTRAINT "payment_refunds_channelId_fkey" FOREIGN KEY ("channelId") REFERENCES "payment_channels"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "payment_refunds" ADD CONSTRAINT "payment_refunds_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "payment_logs" ADD CONSTRAINT "payment_logs_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "payment_orders"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "payment_logs" ADD CONSTRAINT "payment_logs_refundId_fkey" FOREIGN KEY ("refundId") REFERENCES "payment_refunds"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "orders" ADD CONSTRAINT "orders_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "orders" ADD CONSTRAINT "orders_paymentOrderId_fkey" FOREIGN KEY ("paymentOrderId") REFERENCES "payment_orders"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "order_items" ADD CONSTRAINT "order_items_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "orders"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notifications" ADD CONSTRAINT "notifications_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notifications" ADD CONSTRAINT "notifications_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "notification_templates"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notification_template_locales" ADD CONSTRAINT "notification_template_locales_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "notification_templates"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notification_preferences" ADD CONSTRAINT "notification_preferences_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notification_batches" ADD CONSTRAINT "notification_batches_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notification_batch_items" ADD CONSTRAINT "notification_batch_items_batchId_fkey" FOREIGN KEY ("batchId") REFERENCES "notification_batches"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notification_batch_items" ADD CONSTRAINT "notification_batch_items_notificationId_fkey" FOREIGN KEY ("notificationId") REFERENCES "notifications"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "articles" ADD CONSTRAINT "articles_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "articles" ADD CONSTRAINT "articles_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "article_versions" ADD CONSTRAINT "article_versions_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "articles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "article_versions" ADD CONSTRAINT "article_versions_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "categories" ADD CONSTRAINT "categories_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "article_tags" ADD CONSTRAINT "article_tags_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "articles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "article_tags" ADD CONSTRAINT "article_tags_tagId_fkey" FOREIGN KEY ("tagId") REFERENCES "tags"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "comments" ADD CONSTRAINT "comments_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "articles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "comments" ADD CONSTRAINT "comments_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "comments" ADD CONSTRAINT "comments_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "comments"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|