from datetime import datetime from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Float, DateTime from sqlalchemy.orm import relationship from .database import Base import uuid import bcrypt # class ModelBase(Base): # __abstract__ = True # id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) # created_at = Column(DateTime, default=db.func.current_timestamp()) # updated_at = Column(DateTime, # default=func.current_timestamp(), # onupdate=func.current_timestamp()) class User(Base): __tablename__ = "users" id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) email = Column(String, unique=True, index=True) encrypted_password = Column(String) is_active = Column(Boolean, default=True) items = relationship("Item", back_populates="owner") # write a sql to update the user's password # $2b$12$huJdmqFPzWU.9rumd2wpSOZUnCJ0bufmA4vl5T9PDc7V.xLgWAqSu # UPDATE = "UPDATE users SET encrypted_password = '$2b$12$huJdmqFPzWU.9rumd2wpSOZUnCJ0bufmA4vl5T9PDc7V.xLgWAqSu' WHERE email = 'admin@xichen.pub'" def set_password(self, password: str): hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt()) self.encrypted_password = str(hashed, encoding='utf-8') def verify_password(self, password: str): return bcrypt.checkpw(password.encode(), bytes(self.encrypted_password, encoding='utf-8')) def __str__(self): return f"" def __repr__(self): return f"" class Item(Base): __tablename__ = "items" id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) title = Column(String) description = Column(String) owner_id = Column(String, ForeignKey("users.id")) owner = relationship("User", back_populates="items") # region 记忆单词相关 class UserBook(Base): __tablename__ = "user_book" id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) owner_id = Column(String, ForeignKey("users.id")) book_id = Column(String, ForeignKey("book.bk_id")) title = Column(String) batch_size = Column(Integer, default=10) random = Column(Boolean, default=True) memorizing_batch = Column(String, default='') class UserMemoryBatch(Base): __tablename__ = "user_memory_batch" id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) user_book_id = Column(String, ForeignKey("user_book.id")) story = Column(String, default="") translated_story = Column(String, default="") batch_type = Column(String, default="新词") # 新词, 回忆, 复习 create_time = Column(DateTime, default=datetime.now) update_time = Column(DateTime, onupdate=datetime.now, default=datetime.now) words = relationship("UserMemoryWord", back_populates="batch") class UserMemoryBatchAction(Base): __tablename__ = "user_memory_batch_action" """ 开始记忆到结束记忆的时间,可以计算记忆效率 """ id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) batch_id = Column(String, ForeignKey("user_memory_batch.id")) action = Column(String, default="start") # start or end create_time = Column(DateTime, default=datetime.now) update_time = Column(DateTime, onupdate=datetime.now, default=datetime.now) class UserMemoryBatchGenerationHistory(Base): __tablename__ = "user_memory_batch_generation_history" """ 开始记忆到结束记忆的时间,可以计算记忆效率 """ id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) batch_id = Column(String, ForeignKey("user_memory_batch.id")) story = Column(String, default="") translated_story = Column(String, default="") create_time = Column(DateTime, default=datetime.now) update_time = Column(DateTime, onupdate=datetime.now, default=datetime.now) class UserMemoryWord(Base): __tablename__ = "user_memory_word" id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) batch_id = Column(String, ForeignKey("user_memory_batch.id")) word_id = Column(String, ForeignKey("word.vc_id")) batch = relationship("UserMemoryBatch", back_populates="words") class UserMemoryAction(Base): __tablename__ = "user_memory_action" id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) batch_id = Column(String, ForeignKey("user_memory_batch.id")) word_id = Column(String, ForeignKey("word.vc_id")) action = Column(String, default="remenber") # remenber or forget create_time = Column(DateTime, default=datetime.now) update_time = Column(DateTime, onupdate=datetime.now, default=datetime.now) # endregion class Book(Base): __tablename__ = "book" # {'bk_id': 'd645920e395fedad7bbbed0e', # 'bk_parent_id': '6512bd43d9caa6e02c990b0a', # 'bk_level': 2, # 'bk_order': 2.0, # 'bk_name': '人教版高中英语1 - 必修', # 'bk_item_num': 315, # 'bk_direct_item_num': 315, # 'bk_author': '刘道义', # 'bk_book': '人教版普通高中课程标准实验教科书 英语 1 必修', # 'bk_comment': '黑体:本单元重点词汇和短语;无“△”:课标词汇,要求掌握;有“△”:不要求掌握(会出现大量缩写、人名、地名和短语,请选背)。', # 'bk_organization': '人民教育出版社 课程教材研究所;英语课程教材研究开发中心', # 'bk_publisher': '人民教育出版社', # 'bk_version': '2007年1月第2版', # 'bk_flag': '默认:152;黑体:97;前△:66'}, bk_id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) bk_order = Column(Float) bk_name = Column(String) bk_item_num = Column(Integer) bk_author = Column(String, default='') bk_comment = Column(String, default='') bk_organization = Column(String, default='') bk_publisher = Column(String, default='') bk_version = Column(String, default='') permission = Column(String, default='private') creator = Column(String, ForeignKey("users.id")) create_time = Column(DateTime, default=datetime.now) update_time = Column(DateTime, onupdate=datetime.now, default=datetime.now) def __str__(self): return f"{self.bk_name}\n [{self.bk_item_num} words, {self.bk_version}]" def __repr__(self): return f"" class Unit(Base): __tablename__ = "unit" # ['bv_id', 'bv_book_id', 'bv_voc_id', 'bv_flag', 'bv_tag', 'bv_order'] # {'bv_id': '58450c828958a37d5c10f763', # 'bv_book_id': 'd645920e395fedad7bbbed0e', # 'bv_voc_id': '57067b9ca172044907c615d7', # 'bv_flag': 4, # 'bv_tag': 'Unit 1', # 'bv_order': 1}, bv_id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) bv_voc_id = Column(String, ForeignKey("word.vc_id")) bv_book_id = Column(String, ForeignKey("book.bk_id")) bv_flag = Column(Integer) bv_tag = Column(String) bv_order = Column(Integer) class Word(Base): __tablename__ = "word" # vc_id>vc_vocabulary>vc_phonetic_uk>vc_phonetic_us>vc_frequency>vc_difficulty>vc_acknowledge_rate # 57067c89a172044907c6698e>superspecies>[su:pərsˈpi:ʃi:z]>[supɚsˈpiʃiz]>0.0>1>0.664122 vc_id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())) vc_vocabulary = Column(String) vc_translation = Column(String) vc_phonetic_uk = Column(String) vc_phonetic_us = Column(String) vc_frequency = Column(Float) vc_difficulty = Column(Float) vc_acknowledge_rate = Column(Float) def __str__(self): return f"{self.vc_vocabulary} {self.vc_translation}\n[{self.vc_phonetic_uk}] [{self.vc_phonetic_us}]" def __repr__(self): return f"{self.vc_vocabulary} {self.vc_translation}\n[{self.vc_phonetic_uk}] [{self.vc_phonetic_us}]"