oa-email-code-login 实现邮箱验证码登录

这个提交包含在:
2026-05-27 06:49:58 +08:00
父节点 afa03c0b71
当前提交 7f96cc0379
共修改 21 个文件,包含 1027 行新增和 45 行删除
@@ -0,0 +1,24 @@
CREATE TABLE "email_login_codes" (
"id" UUID NOT NULL,
"employee_id" UUID NOT NULL,
"code_hash" TEXT NOT NULL,
"expires_at" TIMESTAMP(3) NOT NULL,
"used_at" TIMESTAMP(3),
"attempts_count" INTEGER NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"created_ip" TEXT,
"created_user_agent" TEXT,
CONSTRAINT "email_login_codes_pkey" PRIMARY KEY ("id")
);
CREATE INDEX "email_login_codes_employee_id_created_at_idx"
ON "email_login_codes"("employee_id", "created_at");
CREATE INDEX "email_login_codes_expires_at_idx"
ON "email_login_codes"("expires_at");
ALTER TABLE "email_login_codes"
ADD CONSTRAINT "email_login_codes_employee_id_fkey"
FOREIGN KEY ("employee_id") REFERENCES "employees"("id")
ON DELETE RESTRICT ON UPDATE CASCADE;
+19
查看文件
@@ -680,6 +680,7 @@ model Employee {
approval_transfers_from ApprovalTransfer[] @relation("TransferFrom")
approval_transfers_to ApprovalTransfer[] @relation("TransferTo")
password_reset_codes PasswordResetCode[]
email_login_codes EmailLoginCode[]
lifecycle_events EmployeeLifecycleEvent[]
checklist_tasks EmployeeChecklistTask[]
presence_records EmployeePresence[]
@@ -731,6 +732,24 @@ model PasswordResetCode {
@@map("password_reset_codes")
}
model EmailLoginCode {
id String @id @default(uuid()) @db.Uuid
employee_id String @db.Uuid
code_hash String
expires_at DateTime
used_at DateTime?
attempts_count Int @default(0)
created_at DateTime @default(now())
created_ip String?
created_user_agent String?
employee Employee @relation(fields: [employee_id], references: [id], onDelete: Restrict)
@@index([employee_id, created_at])
@@index([expires_at])
@@map("email_login_codes")
}
model EmployeeRole {
employee_id String @db.Uuid
role_code RoleCode