user.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from core.db import WordDatabase
  2. from werkzeug.security import generate_password_hash, check_password_hash
  3. import os
  4. from configure import conf
  5. from flask_login import UserMixin, AnonymousUserMixin
  6. import shutil
  7. from typing import Optional, Tuple
  8. class AnonymousUser(AnonymousUserMixin):
  9. ...
  10. class UserWordDataBase(WordDatabase, UserMixin):
  11. def __init__(self, user: str, path: str):
  12. super().__init__(user, path)
  13. self.done(f'''
  14. CREATE TABLE IF NOT EXISTS User (
  15. id INTEGER PRIMARY KEY AUTOINCREMENT, -- 记录ID
  16. passwd TEXT NOT NULL -- 密码hash
  17. )''')
  18. if self.search(columns=["COUNT(ID)"], table="User")[0][0] == 0:
  19. self.insert(table="User", columns=["passwd"], values=f"'{generate_password_hash('88888888')}'") # 默认密码
  20. self.user = user
  21. def get_id(self):
  22. return self.user
  23. def check_passwd(self, passwd: str) -> bool:
  24. res = self.search(table="User", columns=["passwd"], limit=1, order_by=[("ID", "ASC")])
  25. if len(res) == 0:
  26. return False
  27. return check_password_hash(res[0][0], passwd)
  28. def set_passwd(self, passwd: str, record_id: int = 1):
  29. self.update(table="User", kw={"passwd": f"'{generate_password_hash(passwd)}'"}, where=f"id={record_id}")
  30. def delete_user(self):
  31. self.delete_self()
  32. def get_box_count(self) -> Tuple[list, list, int, int]:
  33. res = self.search(columns=["COUNT(word)", "COUNT(DISTINCT word)", "box"], table="Word", group_by=["box"])
  34. print(res)
  35. ret = [0, 0, 0, 0, 0]
  36. ret_distinct = [0, 0, 0, 0, 0]
  37. for i in res:
  38. ret[i[2] - 1] = i[0]
  39. ret_distinct[i[2] - 1] = i[1]
  40. return ret, ret_distinct, sum(ret), sum(ret_distinct)
  41. def reset(self):
  42. self.update(table="Word", kw={"box": "1"}, where="1")
  43. def check_base_db():
  44. if os.path.exists(os.path.join(conf["DB_TEMPLATE"], "base.db")):
  45. return
  46. WordDatabase("base", conf["DB_TEMPLATE"])
  47. def check_template(template: str) -> bool:
  48. check_base_db()
  49. return os.path.exists(os.path.join(conf["DB_TEMPLATE"], f"{template}.db"))
  50. def get_template():
  51. check_base_db()
  52. file_list = os.listdir(conf["DB_TEMPLATE"])
  53. template = []
  54. for i in file_list:
  55. if i.endswith(".db"):
  56. i = i[:-3]
  57. template.append((i, i.replace("_", " ")))
  58. return template
  59. def create_user(template: str, name: str, passwd: str):
  60. check_base_db()
  61. if not os.path.exists(os.path.join(conf["DB_TEMPLATE"], f"{template}.db")):
  62. return 0, None
  63. if os.path.exists(os.path.join(conf["DB_PATH"], f"{name}.db")):
  64. return -1, None
  65. shutil.copy(os.path.join(conf["DB_TEMPLATE"], f"{template}.db"), os.path.join(conf["DB_PATH"], f"{name}.db"))
  66. user = UserWordDataBase(name, conf["DB_PATH"])
  67. if len(passwd) > 0:
  68. user.set_passwd(passwd)
  69. return 1, user
  70. def load_user(name: str, passwd: Optional[str]):
  71. if not os.path.exists(os.path.join(conf["DB_PATH"], f"{name}.db")):
  72. return None
  73. user = UserWordDataBase(name, conf["DB_PATH"])
  74. if passwd is None or user.check_passwd(passwd):
  75. return user
  76. return None