user_router.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. """
  2. 用户API路由
  3. 提供用户信息查询和更新的API端点
  4. 需求: 9.1, 10.1, 10.2, 10.3, 10.4
  5. """
  6. from fastapi import APIRouter, Depends, Request
  7. from sqlalchemy.orm import Session
  8. from app.database import get_db
  9. from app.middleware import get_current_user_from_request
  10. from app.models.user import User
  11. from app.schemas.user_schema import UserUpdate, UserResponse
  12. from app.services.user_service import UserService
  13. from app.services.token_revocation_service import token_revocation_service
  14. from app.services.data_encryption_service import encryption_service
  15. from app.services.encryption_service import encryption_service as rsa_encryption_service
  16. router = APIRouter(prefix="/api/users", tags=["用户"])
  17. @router.get("/me", response_model=UserResponse)
  18. def get_current_user_info(
  19. request: Request,
  20. db: Session = Depends(get_db),
  21. current_user: User = Depends(get_current_user_from_request)
  22. ):
  23. """获取当前用户信息"""
  24. response_data = UserResponse.model_validate(current_user)
  25. if response_data.email:
  26. response_data.email = encryption_service.mask_sensitive_data(response_data.email)
  27. if response_data.phone:
  28. response_data.phone = encryption_service.mask_sensitive_data(response_data.phone)
  29. return response_data
  30. @router.put("/me", response_model=UserResponse)
  31. def update_current_user(
  32. data: UserUpdate,
  33. request: Request,
  34. db: Session = Depends(get_db),
  35. current_user: User = Depends(get_current_user_from_request)
  36. ):
  37. """更新当前用户信息"""
  38. user_service = UserService(db)
  39. user = user_service.update_user(current_user.id, data)
  40. # 返回响应时对敏感字段进行掩码处理
  41. response_data = UserResponse.model_validate(user)
  42. if response_data.email:
  43. response_data.email = encryption_service.mask_sensitive_data(response_data.email)
  44. if response_data.phone:
  45. response_data.phone = encryption_service.mask_sensitive_data(response_data.phone)
  46. return response_data
  47. @router.delete("/me")
  48. def delete_current_user(
  49. request: Request,
  50. db: Session = Depends(get_db),
  51. current_user: User = Depends(get_current_user_from_request)
  52. ):
  53. """删除当前用户(申请注销)。账户会从 users 表中移除。"""
  54. user_service = UserService(db)
  55. # 撤销该用户所有已签发的 session/token
  56. try:
  57. token_revocation_service.revoke_user_sessions(current_user.id)
  58. except Exception:
  59. pass
  60. user_service.delete_user(current_user.id)
  61. return {"message": "账户已申请注销并已移除"}
  62. @router.post("/me/verify", response_model=UserResponse)
  63. def submit_user_verification(
  64. data: dict,
  65. request: Request,
  66. db: Session = Depends(get_db),
  67. current_user: User = Depends(get_current_user_from_request)
  68. ):
  69. """提交实名认证(接收RSA加密数据)"""
  70. if "encrypted_data" not in data:
  71. from fastapi import HTTPException
  72. raise HTTPException(status_code=400, detail="缺少加密数据")
  73. user_service = UserService(db)
  74. user = user_service.submit_verification(current_user.id, data["encrypted_data"])
  75. return UserResponse.model_validate(user)
  76. @router.get("/config/public")
  77. def get_public_config(db: Session = Depends(get_db)):
  78. """获取公开配置(无需认证)"""
  79. from app.services.system_config_manager import config_manager
  80. return {
  81. "enable_verification_reminder": config_manager.get_bool("enable_verification_reminder", True)
  82. }
  83. @router.get("/rsa-public-key")
  84. def get_rsa_public_key():
  85. """获取RSA公钥(用于前端加密)"""
  86. return {
  87. "public_key": rsa_encryption_service.get_public_key_pem()
  88. }