diff --git a/backend/app/admin/crud/crud_user.py b/backend/app/admin/crud/crud_user.py index 8f79df54..d6155ce9 100644 --- a/backend/app/admin/crud/crud_user.py +++ b/backend/app/admin/crud/crud_user.py @@ -87,7 +87,6 @@ class CRUDUser(CRUDPlus[User]): :param obj: 注册用户参数 :return: """ - obj.avatar = str(obj.avatar) # noqa: fix pgsql compatibility dict_obj = obj.model_dump() dict_obj.update({'is_staff': True, 'salt': None}) new_user = self.model(**dict_obj) @@ -110,7 +109,6 @@ class CRUDUser(CRUDPlus[User]): role_ids = obj.roles del obj.roles - obj.avatar = str(obj.avatar) # noqa: fix pgsql compatibility count = await self.update_model(db, input_user.id, obj) stmt = select(Role).where(Role.id.in_(role_ids)) diff --git a/backend/app/admin/schema/user.py b/backend/app/admin/schema/user.py index 32c8b643..c17a8753 100644 --- a/backend/app/admin/schema/user.py +++ b/backend/app/admin/schema/user.py @@ -1,13 +1,13 @@ from datetime import datetime -from typing import Any +from typing import Annotated, Any -from pydantic import ConfigDict, Field, HttpUrl, model_validator +from pydantic import ConfigDict, Field, HttpUrl, PlainSerializer, model_validator from typing_extensions import Self from backend.app.admin.schema.dept import GetDeptDetail from backend.app.admin.schema.role import GetRoleWithRelationDetail from backend.common.enums import StatusType -from backend.common.schema import CustomEmailStr, CustomPhoneNumber, SchemaBase +from backend.common.schema import CustomEmailStr, CustomPhoneNumber, SchemaBase, ser_string class AuthSchemaBase(SchemaBase): @@ -40,7 +40,7 @@ class AddOAuth2UserParam(AuthSchemaBase): password: str | None = Field(None, description='密码') nickname: str | None = Field(None, description='昵称') email: CustomEmailStr | None = Field(None, description='邮箱') - avatar: HttpUrl | None = Field(None, description='头像地址') + avatar: Annotated[HttpUrl, PlainSerializer(ser_string)] | None = Field(None, description='头像地址') class ResetPasswordParam(SchemaBase): @@ -57,7 +57,7 @@ class UserInfoSchemaBase(SchemaBase): dept_id: int | None = Field(None, description='部门 ID') username: str = Field(description='用户名') nickname: str = Field(description='昵称') - avatar: HttpUrl | None = Field(None, description='头像地址') + avatar: Annotated[HttpUrl, PlainSerializer(ser_string)] | None = Field(None, description='头像地址') email: CustomEmailStr | None = Field(None, description='邮箱') phone: CustomPhoneNumber | None = Field(None, description='手机号') diff --git a/backend/common/schema.py b/backend/common/schema.py index 6eae4aa7..e3b29810 100644 --- a/backend/common/schema.py +++ b/backend/common/schema.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import Annotated +from typing import Annotated, Any from pydantic import BaseModel, ConfigDict, EmailStr, Field, validate_email @@ -27,3 +27,9 @@ class SchemaBase(BaseModel): else timezone.to_str(x), }, ) + + +def ser_string(value: Any) -> str | None: + if value: + return str(value) + return value