This commit is contained in:
liubiren 2026-07-24 16:19:33 +08:00
parent b2d78e73b3
commit d712a0e137
4 changed files with 23 additions and 19 deletions

View File

@ -11,13 +11,14 @@ from sqlmodel import Field, JSON, SQLModel
class CaptchaRecord(SQLModel, table=True): class CaptchaRecord(SQLModel, table=True):
""" """
验证码记录 验证码记录
邮箱和创建时间联合作为主键 邮箱验证码和失效时间联合作为主键
""" """
email: str = Field(..., primary_key=True, description="邮箱") email: str = Field(..., primary_key=True, description="邮箱")
captcha: str = Field( captcha: str = Field(
default_factory=lambda: "".join(choices("0123456789", k=6)), default_factory=lambda: "".join(choices("0123456789", k=6)),
primary_key=True,
description="验证码", description="验证码",
) )
is_valid: bool = Field( is_valid: bool = Field(
@ -37,7 +38,7 @@ class CaptchaRecord(SQLModel, table=True):
) )
# 用户 # 用户记录
class UserRecord(SQLModel, table=True): class UserRecord(SQLModel, table=True):
id: str = Field( id: str = Field(
default_factory=lambda: str(uuid7()), default_factory=lambda: str(uuid7()),

View File

@ -126,7 +126,7 @@ class AuthState(rx.State):
async with self: async with self:
# 创建验证码记录并获取验证码 # 创建验证码记录并获取验证码
database_state = await self.get_state(DatabaseState) database_state = await self.get_state(DatabaseState)
captcha = await database_state.create_captchas_record(email=self.email) captcha = await database_state.create_captcha_record(email=self.email)
# 构建验证码邮件 # 构建验证码邮件
message = MIMEText( message = MIMEText(
@ -223,18 +223,22 @@ class AuthState(rx.State):
self.is_logging_in = True self.is_logging_in = True
# 更新验证码记录 # 获取数据库状态
database_state = await self.get_state(DatabaseState) database_state = await self.get_state(DatabaseState)
if not await database_state.get_captcha(email=self.email, captcha=self.captcha): # 核验验证码
if not await database_state.verify_captcha(
email=self.email, captcha=self.captcha
):
self.is_logging_in = False self.is_logging_in = False
self.login_error_message = "验证码错误" self.login_error_message = "验证码错误"
return return
# 创建用户记录 # 创建用户记录
user_id = await database_state.create_users_record(email=self.email) user_id = await database_state.create_user_record(email=self.email)
# 设置会话状态中用户唯一标识 # 获取会话状态
conversation_state = await self.get_state(ConversationState) conversation_state = await self.get_state(ConversationState)
await conversation_state.set_user_id(user_id=user_id) # 加载
await conversation_state.load(user_id=user_id)
self.user_id = user_id self.user_id = user_id

View File

@ -118,9 +118,9 @@ class ConversationState(rx.State):
# 会话创建状态True表示正在创建False表示未正在创建 # 会话创建状态True表示正在创建False表示未正在创建
is_conversation_creating: bool = False is_conversation_creating: bool = False
async def set_user_id(self, user_id: str) -> None: async def load(self, user_id: str) -> None:
""" """
设置用户唯一标识 加载
:param user_id: 用户唯一标识 :param user_id: 用户唯一标识
:return: None :return: None
""" """
@ -130,7 +130,6 @@ class ConversationState(rx.State):
# 数据库状态 # 数据库状态
database_state = await self.get_state(DatabaseState) database_state = await self.get_state(DatabaseState)
# 获取会话字典 # 获取会话字典
self.conversations = await database_state.get_conversations( self.conversations = await database_state.get_conversations(
user_id=self.user_id user_id=self.user_id

View File

@ -66,7 +66,7 @@ class DatabaseState(rx.State):
核验验证码 核验验证码
:param email: 邮箱 :param email: 邮箱
:param captcha: 验证码 :param captcha: 验证码
:return: 是否更新成功True 表示更新成功False 表示更新失败 :return: 是否核验成功True 表示核验成功False 表示核验失败根据邮箱和验证码未找到有效且未核验的记录或失效
""" """
async with rx.asession() as session: async with rx.asession() as session:
result = await session.exec( result = await session.exec(
@ -86,7 +86,7 @@ class DatabaseState(rx.State):
await session.refresh(record) await session.refresh(record)
return True return True
async def create_users_record(self, email: str) -> str: async def create_user_record(self, email: str) -> str:
""" """
创建用户记录 创建用户记录
:param email: 邮箱 :param email: 邮箱
@ -97,14 +97,14 @@ class DatabaseState(rx.State):
select(UserRecord).where(UserRecord.email == email) select(UserRecord).where(UserRecord.email == email)
) )
record = result.first() record = result.first()
# 若用户记录存在则返回用户唯一标识,否则创建新用户记录并返回所创建的用户唯一标识 # 若记录存在则返回用户唯一标识,否则创建并返回所创建记录的用户唯一标识
if record: if record:
return record.id return record.id
new_user = UserRecord(email=email) record = UserRecord(email=email)
session.add(new_user) session.add(record)
await session.commit() await session.commit()
await session.refresh(new_user) await session.refresh(record)
return new_user.id return record.id
async def get_conversations(self, user_id: str) -> Dict[str, Conversation]: async def get_conversations(self, user_id: str) -> Dict[str, Conversation]:
""" """