web_user.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. from flask_login import UserMixin, AnonymousUserMixin
  2. from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
  3. from conf import Config
  4. from tool.login import create_uid
  5. from tool.typing import *
  6. from core.user import User
  7. from . import views
  8. class WebAnonymous(AnonymousUserMixin):
  9. def __init__(self):
  10. self.group = "匿名用户"
  11. self.score = "0"
  12. self.reputation = "0"
  13. self.rubbish = "0"
  14. self.is_manager = lambda: False
  15. @staticmethod
  16. def get_qr_code():
  17. return ""
  18. @property
  19. def name(self):
  20. return ""
  21. @property
  22. def uid(self):
  23. return ""
  24. @property
  25. def order(self):
  26. return ""
  27. @staticmethod
  28. def get_order_goods_list():
  29. return []
  30. @staticmethod
  31. def get_garbage_list_count():
  32. return 0
  33. @staticmethod
  34. def get_garbage_list(limit, offset):
  35. return []
  36. @staticmethod
  37. def get_user():
  38. return None
  39. class WebUser(UserMixin):
  40. def __init__(self, name: uname_t, passwd: passwd_t = None, uid: uid_t = None):
  41. super(WebUser, self).__init__()
  42. self._name = name
  43. if uid is None:
  44. self._uid = create_uid(name, passwd)
  45. else:
  46. self._uid = uid
  47. self.score = "0"
  48. self.reputation = "0"
  49. self.rubbish = "0"
  50. self.group = "普通成员"
  51. self.update_info()
  52. def update_info(self):
  53. user = views.website.get_user_by_id(self._uid)
  54. if user is None:
  55. return
  56. if user.is_manager():
  57. self.group = "管理员"
  58. self.score = "0"
  59. self.reputation = "0"
  60. self.rubbish = "0"
  61. else:
  62. self.group = "普通成员"
  63. res = user.get_info()
  64. self.score = res.get('score', '0')
  65. self.reputation = res.get('reputation', '0')
  66. self.rubbish = res.get('rubbish', '0')
  67. @property
  68. def is_active(self):
  69. """Flask要求的属性"""
  70. return views.website.load_user_by_id(self._uid) is not None
  71. @property
  72. def is_authenticated(self):
  73. """Flask要求的属性"""
  74. return views.website.load_user_by_id(self._uid) is not None
  75. def get_id(self):
  76. """Flask要求的方法"""
  77. return self._uid
  78. @property
  79. def name(self):
  80. return self._name
  81. @property
  82. def uid(self):
  83. return self._uid[:Config.show_uid_len]
  84. @property
  85. def order(self) -> str:
  86. cur = views.website.db.search(columns=["OrderID"],
  87. table="orders",
  88. where=f"UserID = '{self._uid}' and status=0")
  89. if cur is None or cur.rowcount == 0:
  90. return "None"
  91. assert cur.rowcount == 1
  92. return str(cur.fetchone()[0])
  93. def is_manager(self):
  94. return self.group == "管理员"
  95. def get_qr_code(self):
  96. s = Serializer(Config.passwd_salt, expires_in=3600) # 3h有效
  97. token = s.dumps({"order": f"{self.order}", "uid": f"{self._uid}"})
  98. return self.order, self._uid, token
  99. def get_order_goods_list(self):
  100. order = self.order
  101. if order is None:
  102. return []
  103. cur = views.website.db.search(columns=["Name", "Quantity"],
  104. table="order_goods_view",
  105. where=f"OrderID = '{order}'")
  106. if cur is None:
  107. return []
  108. res = []
  109. for i in range(cur.rowcount):
  110. re = cur.fetchone()
  111. res.append(f"#{i} {re[0]} x {re[1]}")
  112. return res
  113. def get_garbage_list_count(self):
  114. return views.website.get_user_garbage_count(self._uid)
  115. def get_garbage_list(self, limit: int, offset: int = 0):
  116. return views.website.get_user_garbage_list(self._uid, limit=limit, offset=offset)
  117. def get_user(self) -> User:
  118. res = views.website.get_user_by_id(self._uid)
  119. return res
  120. def write_news(self, text: str):
  121. return views.website.write_news(text, self._uid)