这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
- 数据结构
- 要设计的单词本需要根据艾宾浩斯遗忘曲线图,每日更新当天需要复习的单词,为了是西安这个功能,我们在单词上下文表格中(即words表中)增加了一个review_date字段、一个coll_date字段(储存单词的收录时间)以及一个next字段,用这两个字段来实现单词的每日更新。
- 定义了一个period_type表格来实现对单词复习模式的定义,不同的周期模式其复习时间间隔是不一样的,比如论文中学习的单词用'paper'复习模式,此复习模式共需要复习5次,分别是单词收录后的第1,2,4,7,15天。period模式的字段counts用于表示当前复习模式有多少次复习,即后续有几个复习天数是有效的。
- 函数实现
- 这里定义了一个python脚本,用于每天固定时间运行,用于更新数据库的单词复习时间字段
- 固定运行脚本的时间设置成每天的凌晨1点,这样凌晨一点后就可以更新当天需要复习的单词
- 函数的实现逻辑是根据next和counts进行比较,判断下一个执行周期是否超出了周期数目,即单词是否复习完毕
- 筛选出未完成复习的单词,更新其下一次的复习时间,分两种情况:如果当前存储的review_date是今天或后面的某天,则无需更新下一次复习时间;反之,根据next计算下一个复习时间,并更新数据库中的review_date,接着将next的值加一,表示进入下一个复习周期
- 代码展示
def set_review_date(self):
sql = "SELECT words.index, coll_date, counts, period_1, period_2,period_3,period_4,period_5,period_6," \
"period_7, review_date FROM words join period_type on words.period=period_type.period where next<counts;"
self.cursor.execute(sql)
_words = self.cursor.fetchall()
for _word in _words:
# _word looks like (1, datetime.date(2023, 2, 6), 5, 1, 2, 4, 7, 15, None, None, datetime.date(2023, 2, 7))
review_date = _word[10]
if datetime.now().date() == review_date:
continue
for i in range(_word[2]):
review_date = _word[1] + timedelta(days=_word[i + 3])
if datetime.now().date() <= review_date:
sql = f"UPDATE words SET review_date='{review_date}', next='{i+1}' WHERE words.index={_word[0]}"
self.cursor.execute(sql)
self.db.commit()
break
- 其中sql语句表示words表格和period_type表格联合查询,查出单词索引,收录日期,复习周期总数,不同复习周期阶段的间隔天数,复习时间等
- sql查询的筛选条件是next小于counts
- 对查到的数据进行分析,复习日期小于当前日期的需要进入下一个复习阶段,更新数据库中next和review_date字段
- 单词复习时间更新的功能实现完毕
- 每日只需从words中读取当前日期复习的单词,组织到web端显示即可