user.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from sqlalchemy import distinct, func, or_
  2. from sqlalchemy.orm import Session
  3. from app.core.security import verify_password, hash_password
  4. from app.models.user import RoleUser, User
  5. from app.models.role import Role
  6. from app.services.base import CrudService
  7. class UserService:
  8. @staticmethod
  9. def get_by_id(db: Session, id: int) -> User | None:
  10. return CrudService.get_by_id(User, db, id)
  11. @staticmethod
  12. def get_paged(db: Session, page: int, page_size: int, filters: list | None = None):
  13. return CrudService.get_paged(User, db, page, page_size, filters)
  14. @staticmethod
  15. def create(db: Session, obj_in: dict) -> User:
  16. if "password" in obj_in and obj_in["password"]:
  17. obj_in["password"] = hash_password(obj_in["password"])
  18. return CrudService.create(User, db, obj_in)
  19. @staticmethod
  20. def update(db: Session, id: int, obj_in: dict) -> User | None:
  21. if "password" in obj_in and obj_in["password"]:
  22. obj_in["password"] = hash_password(obj_in["password"])
  23. return CrudService.update(User, db, id, obj_in)
  24. @staticmethod
  25. def soft_delete(db: Session, id: int) -> bool:
  26. return CrudService.soft_delete(User, db, id)
  27. @staticmethod
  28. def authenticate(db: Session, username: str, password: str) -> User | None:
  29. user = (
  30. db.query(User)
  31. .filter(User.username == username, User.del_flag == 0, User.status == 1)
  32. .first()
  33. )
  34. if not user:
  35. return None
  36. if not verify_password(password, user.password):
  37. return None
  38. return user
  39. @staticmethod
  40. def get_user_roles(db: Session, user_id: int) -> list[Role]:
  41. user = db.query(User).filter(User.id == user_id, User.del_flag == 0).first()
  42. if not user:
  43. return []
  44. return list(user.roles)
  45. @staticmethod
  46. def summary_stats(db: Session) -> dict:
  47. """用户管理顶部卡片:全量聚合(与列表分页无关)。"""
  48. base = User.del_flag == 0
  49. total = db.query(func.count()).select_from(User).filter(base).scalar() or 0
  50. enabled = db.query(func.count()).select_from(User).filter(base, User.status == 1).scalar() or 0
  51. disabled = db.query(func.count()).select_from(User).filter(base, User.status == 0).scalar() or 0
  52. admin = (
  53. db.query(func.count(distinct(User.id)))
  54. .select_from(User)
  55. .join(RoleUser, RoleUser.user_id == User.id)
  56. .join(Role, Role.id == RoleUser.role_id)
  57. .filter(base, or_(Role.role_code == "ADMIN", Role.role_name == "管理员"))
  58. .scalar()
  59. or 0
  60. )
  61. return {
  62. "total_count": int(total),
  63. "enabled_count": int(enabled),
  64. "disabled_count": int(disabled),
  65. "admin_count": int(admin),
  66. }