This commit is contained in:
parent
b2d78e73b3
commit
d712a0e137
|
|
@ -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()),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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]:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue