web_user.py 4.1 KB

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