增加 用户所属小区

增加 按照手机号查询用户
This commit is contained in:
aaron 2025-01-16 23:10:02 +08:00
parent e3f86632b6
commit 649ab1f493
2 changed files with 63 additions and 8 deletions

View File

@ -18,6 +18,7 @@ from typing import List
from typing import Optional from typing import Optional
from datetime import datetime from datetime import datetime
from sqlalchemy import text from sqlalchemy import text
from app.models.community import CommunityDB
router = APIRouter() router = APIRouter()
@ -346,19 +347,30 @@ async def get_user_list(
skip: int = 0, skip: int = 0,
limit: int = 10, limit: int = 10,
role: Optional[str] = None, role: Optional[str] = None,
phone: Optional[str] = None, # 手机号精确查询
db: Session = Depends(get_db), db: Session = Depends(get_db),
admin: UserDB = Depends(get_admin_user) 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: if role:
# 修复 JSON_CONTAINS 语法 query = query.filter(text(f"JSON_CONTAINS(users.roles, '\"{role}\"')"))
query = query.filter(text(f"JSON_CONTAINS(roles, '\"{role}\"')"))
# 如果指定了手机号,添加精确匹配条件
if phone:
query = query.filter(UserDB.phone == phone)
total = query.count() total = query.count()
users = query.order_by( results = query.order_by(
UserDB.create_time.desc() UserDB.create_time.desc()
).offset(skip).limit(limit).all() ).offset(skip).limit(limit).all()
@ -367,10 +379,13 @@ async def get_user_list(
return f"{phone[:3]}****{phone[7:]}" return f"{phone[:3]}****{phone[7:]}"
user_list = [] user_list = []
for user in users: for user, community_name in results:
user_info = UserInfo.model_validate(user) user_info = UserInfo.model_validate(user)
user_info.phone = mask_phone(user_info.phone) # 手机号脱敏 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={ return success_response(data={
"total": total, "total": total,
@ -406,3 +421,40 @@ async def reset_password(
except Exception as e: except Exception as e:
db.rollback() db.rollback()
return error_response(code=500, message=f"密码重置失败: {str(e)}") 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)}")

View File

@ -36,6 +36,7 @@ class UserDB(Base):
roles = Column(JSON, default=lambda: [UserRole.USER]) # 存储角色列表 roles = Column(JSON, default=lambda: [UserRole.USER]) # 存储角色列表
create_time = Column(DateTime(timezone=True), server_default=func.now()) create_time = Column(DateTime(timezone=True), server_default=func.now())
update_time = Column(DateTime(timezone=True), onupdate=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now())
community_id = Column(Integer, ForeignKey("communities.id"), nullable=True) # 归属小区
# Pydantic 模型 # Pydantic 模型
class UserLogin(BaseModel): class UserLogin(BaseModel):
@ -54,7 +55,9 @@ class UserInfo(BaseModel):
points: int = 0 points: int = 0
roles: List[UserRole] roles: List[UserRole]
create_time: datetime 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: class Config:
from_attributes = True from_attributes = True