diff --git a/app/api/endpoints/user.py b/app/api/endpoints/user.py index 6fc853f..f8815cb 100644 --- a/app/api/endpoints/user.py +++ b/app/api/endpoints/user.py @@ -18,6 +18,7 @@ from typing import List from typing import Optional from datetime import datetime from sqlalchemy import text +from app.models.community import CommunityDB router = APIRouter() @@ -346,19 +347,30 @@ async def get_user_list( skip: int = 0, limit: int = 10, role: Optional[str] = None, + phone: Optional[str] = None, # 手机号精确查询 db: Session = Depends(get_db), admin: UserDB = Depends(get_admin_user) ): """获取用户列表(管理员)""" - query = db.query(UserDB) + # 使用 join 查询用户和小区信息 + query = db.query( + UserDB, + CommunityDB.name.label('community_name') + ).outerjoin( + CommunityDB, + UserDB.community_id == CommunityDB.id + ) # 如果指定了角色,添加角色筛选条件 if role: - # 修复 JSON_CONTAINS 语法 - query = query.filter(text(f"JSON_CONTAINS(roles, '\"{role}\"')")) + query = query.filter(text(f"JSON_CONTAINS(users.roles, '\"{role}\"')")) + + # 如果指定了手机号,添加精确匹配条件 + if phone: + query = query.filter(UserDB.phone == phone) total = query.count() - users = query.order_by( + results = query.order_by( UserDB.create_time.desc() ).offset(skip).limit(limit).all() @@ -367,10 +379,13 @@ async def get_user_list( return f"{phone[:3]}****{phone[7:]}" user_list = [] - for user in users: + for user, community_name in results: user_info = UserInfo.model_validate(user) user_info.phone = mask_phone(user_info.phone) # 手机号脱敏 - user_list.append(user_info) + user_list.append({ + **user_info.model_dump(), + "community_name": community_name + }) return success_response(data={ "total": total, @@ -405,4 +420,41 @@ async def reset_password( ) except Exception as e: db.rollback() - return error_response(code=500, message=f"密码重置失败: {str(e)}") \ No newline at end of file + return error_response(code=500, message=f"密码重置失败: {str(e)}") + +class UpdateUserCommunityRequest(BaseModel): + user_id: int + community_id: Optional[int] = None # None 表示清除归属小区 + +@router.put("/community", response_model=ResponseModel) +async def update_user_community( + request: UpdateUserCommunityRequest, + db: Session = Depends(get_db), + admin: UserDB = Depends(get_admin_user) # 仅管理员可操作 +): + """更新用户归属小区(管理员)""" + # 查找用户 + user = db.query(UserDB).filter(UserDB.userid == request.user_id).first() + if not user: + return error_response(code=404, message="用户不存在") + + # 如果指定了小区ID,验证小区是否存在 + if request.community_id is not None: + community = db.query(CommunityDB).filter( + CommunityDB.id == request.community_id + ).first() + if not community: + return error_response(code=404, message="小区不存在") + + try: + # 更新用户归属小区 + user.community_id = request.community_id + db.commit() + + return success_response( + message="更新成功", + data=UserInfo.model_validate(user) + ) + except Exception as e: + db.rollback() + return error_response(code=500, message=f"更新失败: {str(e)}") \ No newline at end of file diff --git a/app/models/user.py b/app/models/user.py index adc9d98..7a7643a 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -36,6 +36,7 @@ class UserDB(Base): roles = Column(JSON, default=lambda: [UserRole.USER]) # 存储角色列表 create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) + community_id = Column(Integer, ForeignKey("communities.id"), nullable=True) # 归属小区 # Pydantic 模型 class UserLogin(BaseModel): @@ -54,7 +55,9 @@ class UserInfo(BaseModel): points: int = 0 roles: List[UserRole] create_time: datetime - coupon_count: Optional[int] = 0 # 添加优惠券数量字段 + coupon_count: Optional[int] = 0 + community_id: Optional[int] = None + community_name: Optional[str] = None class Config: from_attributes = True