40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
# app/models/domain/users.py
|
||
from typing import List, Optional
|
||
|
||
from pydantic import Field
|
||
|
||
from app.models.common import DateTimeModelMixin, IDModelMixin
|
||
from app.models.domain.rwmodel import RWModel
|
||
from app.services import security
|
||
|
||
|
||
class User(RWModel):
|
||
"""
|
||
公开用户信息(会被用于文章作者、Profile 等场景)。
|
||
新增 email_verified 字段,便于前端展示与登录后逻辑判断。
|
||
"""
|
||
username: str
|
||
email: str
|
||
bio: str = ""
|
||
image: Optional[str] = None
|
||
phone: Optional[str] = None
|
||
user_type: Optional[str] = None
|
||
company_name: Optional[str] = None
|
||
email_verified: bool = False
|
||
roles: List[str] = Field(default_factory=list)
|
||
|
||
|
||
class UserInDB(IDModelMixin, DateTimeModelMixin, User):
|
||
"""
|
||
数据库存储模型(私有字段)
|
||
"""
|
||
salt: str = ""
|
||
hashed_password: str = ""
|
||
|
||
def check_password(self, password: str) -> bool:
|
||
return security.verify_password(self.salt + password, self.hashed_password)
|
||
|
||
def change_password(self, password: str) -> None:
|
||
self.salt = security.generate_salt()
|
||
self.hashed_password = security.get_password_hash(self.salt + password)
|