user_service.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. from sqlalchemy.orm import Session
  2. from app.dao.user_dao import UserDAO
  3. from app.model.user_model import User
  4. from app.utils.logger import Logger, ErrorHandler
  5. class UserService:
  6. def __init__(self, db_session: Session):
  7. self.user_dao = UserDAO(db_session)
  8. def get_all_users(self):
  9. """获取所有用户"""
  10. return self.user_dao.get_all()
  11. def get_user_by_id(self, user_id: int):
  12. """根据ID获取用户"""
  13. user = self.user_dao.get_by_id(user_id)
  14. if not user:
  15. raise ValueError(f"User with id {user_id} not found.")
  16. return user
  17. def get_user_by_username(self, username: str):
  18. """根据用户名获取用户"""
  19. user = self.user_dao.get_by_username(username)
  20. if not user:
  21. raise ValueError(f"User with username {username} not found.")
  22. return user
  23. def create_user(self, username: str, email: str, password: str):
  24. """创建新用户"""
  25. Logger.info("开始创建用户", {
  26. 'username': username,
  27. 'email': email
  28. })
  29. try:
  30. # 验证输入
  31. if not username or not email or not password:
  32. Logger.warning("用户创建失败:缺少必要参数", {
  33. 'username': username,
  34. 'email': email,
  35. 'has_password': bool(password)
  36. })
  37. raise ValueError("Username, email and password are required.")
  38. if len(password) < 6:
  39. Logger.warning("用户创建失败:密码长度不足", {
  40. 'username': username,
  41. 'password_length': len(password)
  42. })
  43. raise ValueError("Password must be at least 6 characters long.")
  44. # 检查用户名是否已存在
  45. if self.user_dao.exists_by_username(username):
  46. Logger.warning("用户创建失败:用户名已存在", {
  47. 'username': username
  48. })
  49. raise ValueError("Username already exists.")
  50. # 检查邮箱是否已存在
  51. if self.user_dao.exists_by_email(email):
  52. Logger.warning("用户创建失败:邮箱已存在", {
  53. 'email': email
  54. })
  55. raise ValueError("Email already exists.")
  56. # 创建新用户
  57. new_user = User(username=username, email=email)
  58. new_user.set_password(password)
  59. created_user = self.user_dao.create(new_user)
  60. Logger.info("用户创建成功", {
  61. 'user_id': created_user.id,
  62. 'username': created_user.username,
  63. 'email': created_user.email
  64. })
  65. return created_user
  66. except Exception as e:
  67. Logger.error("用户创建过程中发生异常", e, {
  68. 'username': username,
  69. 'email': email
  70. })
  71. raise
  72. def authenticate_user(self, username: str, password: str):
  73. """验证用户登录"""
  74. Logger.info("开始用户认证", {
  75. 'username': username
  76. })
  77. try:
  78. if not username or not password:
  79. Logger.warning("用户认证失败:缺少用户名或密码", {
  80. 'username': username,
  81. 'has_password': bool(password)
  82. })
  83. raise ValueError("Username and password are required.")
  84. user = self.user_dao.get_by_username(username)
  85. if not user:
  86. Logger.warning("用户认证失败:用户不存在", {
  87. 'username': username
  88. })
  89. raise ValueError("Invalid username or password.")
  90. if not user.is_active:
  91. Logger.warning("用户认证失败:账户已禁用", {
  92. 'user_id': user.id,
  93. 'username': username
  94. })
  95. raise ValueError("User account is disabled.")
  96. if not user.check_password(password):
  97. Logger.warning("用户认证失败:密码错误", {
  98. 'user_id': user.id,
  99. 'username': username
  100. })
  101. raise ValueError("Invalid username or password.")
  102. Logger.info("用户认证成功", {
  103. 'user_id': user.id,
  104. 'username': user.username
  105. })
  106. return user
  107. except Exception as e:
  108. Logger.error("用户认证过程中发生异常", e, {
  109. 'username': username
  110. })
  111. raise
  112. def update_user(self, user_id: int, username: str = None, email: str = None, is_active: bool = None):
  113. """更新用户信息"""
  114. user = self.get_user_by_id(user_id)
  115. if username is not None and username != user.username:
  116. if self.user_dao.exists_by_username(username):
  117. raise ValueError("Username already exists.")
  118. user.username = username
  119. if email is not None and email != user.email:
  120. if self.user_dao.exists_by_email(email):
  121. raise ValueError("Email already exists.")
  122. user.email = email
  123. if is_active is not None:
  124. user.is_active = is_active
  125. return self.user_dao.update(user)
  126. def change_password(self, user_id: int, old_password: str, new_password: str):
  127. """修改用户密码"""
  128. Logger.info("开始修改用户密码", {
  129. 'user_id': user_id
  130. })
  131. try:
  132. user = self.get_user_by_id(user_id)
  133. if not user.check_password(old_password):
  134. Logger.warning("密码修改失败:当前密码错误", {
  135. 'user_id': user_id,
  136. 'username': user.username
  137. })
  138. raise ValueError("Current password is incorrect.")
  139. if len(new_password) < 6:
  140. Logger.warning("密码修改失败:新密码长度不足", {
  141. 'user_id': user_id,
  142. 'username': user.username,
  143. 'new_password_length': len(new_password)
  144. })
  145. raise ValueError("New password must be at least 6 characters long.")
  146. user.set_password(new_password)
  147. updated_user = self.user_dao.update(user)
  148. Logger.info("用户密码修改成功", {
  149. 'user_id': user_id,
  150. 'username': user.username
  151. })
  152. return updated_user
  153. except Exception as e:
  154. Logger.error("密码修改过程中发生异常", e, {
  155. 'user_id': user_id
  156. })
  157. raise
  158. def delete_user(self, user_id: int):
  159. """删除用户"""
  160. user = self.get_user_by_id(user_id)
  161. self.user_dao.delete(user)
  162. return True