From f741f84b4d64f2e07a80bbb783903479d4aef703 Mon Sep 17 00:00:00 2001 From: CmosQAQ <407775702@qq.com> Date: Thu, 1 Jun 2023 19:02:28 +0800 Subject: [PATCH] commit --- app/Article.py | 20 ++++++------ app/Login.py | 15 +++++---- app/account_service.py | 1 - app/difficulty.py | 18 +++++------ app/main.py | 8 ++--- app/pickle_idea.py | 36 +++++++++++---------- app/pickle_idea2.py | 4 ++- app/user_service.py | 3 +- app/wordfreqCMD.py | 73 ++++++++++++++++++++---------------------- requirements.txt | 2 +- 10 files changed, 92 insertions(+), 88 deletions(-) diff --git a/app/Article.py b/app/Article.py index df9ac3a..d5e63cd 100644 --- a/app/Article.py +++ b/app/Article.py @@ -22,12 +22,12 @@ def total_number_of_essays(): return len(result) -def get_article_title(s): - return s.split('\n')[0] +def get_article_title(article): + return article.split('\n')[0] -def get_article_body(s): - lst = s.split('\n') +def get_article_body(article): + lst = article.split('\n') lst.pop(0) # remove the first line return '\n'.join(lst) @@ -111,11 +111,11 @@ def within_range(x, y, r): return x > y and abs(x - y) <= r -def get_question_part(s): - s = s.strip() +def get_question_part(article): + article = article.strip() result = [] flag = 0 - for line in s.split('\n'): + for line in article.split('\n'): line = line.strip() if line == 'QUESTION': result.append(line) @@ -127,11 +127,11 @@ def get_question_part(s): return '\n'.join(result) -def get_answer_part(s): - s = s.strip() +def get_answer_part(article): + article = article.strip() result = [] flag = 0 - for line in s.split('\n'): + for line in article.split('\n'): line = line.strip() if line == 'ANSWER': flag = 1 diff --git a/app/Login.py b/app/Login.py index cd750d1..2e2cecd 100644 --- a/app/Login.py +++ b/app/Login.py @@ -3,6 +3,7 @@ import string from datetime import datetime, timedelta from UseSqlite import InsertQuery, RecordQuery + def md5(s): ''' MD5摘要 @@ -12,14 +13,16 @@ def md5(s): h = hashlib.md5(s.encode(encoding='utf-8')) return h.hexdigest() + # import model.user after the defination of md5(s) to avoid circular import from model.user import get_user_by_username, insert_user, update_password_by_username path_prefix = '/var/www/wordfreq/wordfreq/' path_prefix = './' # comment this line in deployment -def verify_pass(newpass,oldpass): - if(newpass==oldpass): + +def verify_pass(new_password, old_password): + if new_password == old_password: return True @@ -53,7 +56,7 @@ def change_password(username, old_password, new_password): if not verify_user(username, old_password): # 旧密码错误 return False # 将用户名和密码一起加密,以免暴露不同用户的相同密码 - if verify_pass(new_password,old_password): #新旧密码一致 + if verify_pass(new_password, old_password): #新旧密码一致 return False update_password_by_username(username, new_password) return True @@ -73,11 +76,11 @@ class UserName: def validate(self): if len(self.username) > 20: return f'{self.username} is too long. The user name cannot exceed 20 characters.' - if self.username.startswith('.'): # a user name must not start with a dot + if self.username.startswith('.'): # a user name must not start with a dot return 'Period (.) is not allowed as the first letter in the user name.' - if ' ' in self.username: # a user name must not include a whitespace + if ' ' in self.username: # a user name must not include a whitespace return 'Whitespace is not allowed in the user name.' - for c in self.username: # a user name must not include special characters, except non-leading periods or underscores + for c in self.username: # a user name must not include special characters, except non-leading periods or underscores if c in string.punctuation and c != '.' and c != '_': return f'{c} is not allowed in the user name.' if self.username in ['signup', 'login', 'logout', 'reset', 'mark', 'back', 'unfamiliar', 'familiar', 'del', 'admin']: diff --git a/app/account_service.py b/app/account_service.py index a7ed0c4..7259e15 100644 --- a/app/account_service.py +++ b/app/account_service.py @@ -43,7 +43,6 @@ def signup(): return jsonify({'status': '1'}) - @accountService.route("/login", methods=['GET', 'POST']) def login(): ''' diff --git a/app/difficulty.py b/app/difficulty.py index cb93768..03d3bfa 100644 --- a/app/difficulty.py +++ b/app/difficulty.py @@ -18,25 +18,25 @@ def load_record(pickle_fname): return d -def convert_test_type_to_difficulty_level(d): +def convert_test_type_to_difficulty_level(words_dict): """ 对原本的单词库中的单词进行难度评级 - :param d: 存储了单词库pickle文件中的单词的字典 + :param words_dict: 存储了单词库pickle文件中的单词的字典 :return: """ result = {} - L = list(d.keys()) # in d, we have test types (e.g., CET4,CET6,BBC) for each word + words_lst = list(words_dict.keys()) # in words_dict, we have test types (e.g., CET4,CET6,BBC) for each word - for k in L: - if 'CET4' in d[k]: + for k in words_lst: + if 'CET4' in words_dict[k]: result[k] = 4 # CET4 word has level 4 - elif 'OXFORD3000' in d[k]: + elif 'OXFORD3000' in words_dict[k]: result[k] = 5 - elif 'CET6' in d[k] or 'GRADUATE' in d[k]: + elif 'CET6' in words_dict[k] or 'GRADUATE' in words_dict[k]: result[k] = 6 - elif 'OXFORD5000' in d[k] or 'IELTS' in d[k]: + elif 'OXFORD5000' in words_dict[k] or 'IELTS' in words_dict[k]: result[k] = 7 - elif 'BBC' in d[k]: + elif 'BBC' in words_dict[k]: result[k] = 8 return result # {'apple': 4, ...} diff --git a/app/main.py b/app/main.py index 4e3f829..6308f3d 100644 --- a/app/main.py +++ b/app/main.py @@ -63,7 +63,7 @@ def mark_word(): ''' if request.method == 'POST': d = load_freq_history(path_prefix + 'static/frequency/frequency.p') - lst_history = pickle_idea.dict2lst(d) + lst_history = pickle_idea.dict_to_lst(d) lst = [] for word in request.form.getlist('marked'): lst.append((word, 1)) @@ -86,7 +86,7 @@ def mainpage(): lst = f.get_freq() # save history d = load_freq_history(path_prefix + 'static/frequency/frequency.p') - lst_history = pickle_idea.dict2lst(d) + lst_history = pickle_idea.dict_to_lst(d) d = pickle_idea.merge_frequency(lst, lst_history) pickle_idea.save_frequency_to_pickle(d, path_prefix + 'static/frequency/frequency.p') return render_template('mainpage_post.html', lst=lst, yml=Yaml.yml) @@ -96,8 +96,8 @@ def mainpage(): number_of_essays = total_number_of_essays() d = load_freq_history(path_prefix + 'static/frequency/frequency.p') d_len = len(d) - lst = sort_in_descending_order(pickle_idea.dict2lst(d)) - return render_template('mainpage_get.html', + lst = sort_in_descending_order(pickle_idea.dict_to_lst(d)) + return render_template('mainpage_get.html', admin_name=ADMIN_NAME, random_ads=random_ads, d_len=d_len, diff --git a/app/pickle_idea.py b/app/pickle_idea.py index 45bd19a..4f193ff 100644 --- a/app/pickle_idea.py +++ b/app/pickle_idea.py @@ -10,7 +10,7 @@ import pickle from datetime import datetime -def lst2dict(lst, d): +def lst_to_dict(lst, d): ''' Store the information in list lst to dictionary d. Note: nothing is returned. @@ -25,14 +25,14 @@ def lst2dict(lst, d): d[word] += freq -def dict2lst(d): - return list(d.items()) # a list of (key, value) pairs +def dict_to_lst(d): + return list(d.items()) # a list of (key, value) pairs -def merge_frequency(lst1, lst2): +def merge_frequency(list1, list2): d = {} - lst2dict(lst1, d) - lst2dict(lst2, d) + lst_to_dict(list1, d) + lst_to_dict(list2, d) return d @@ -54,33 +54,35 @@ def save_frequency_to_pickle(d, pickle_fname): pickle.dump(d2, f) f.close() -def unfamiliar(path,word): - f = open(path,"rb") + +def unfamiliar(path, word): + f = open(path, "rb") dic = pickle.load(f) dic[word] += [datetime.now().strftime('%Y%m%d%H%M')] - fp = open(path,"wb") - pickle.dump(dic,fp) + fp = open(path, "wb") + pickle.dump(dic, fp) -def familiar(path,word): - f = open(path,"rb") + +def familiar(path, word): + f = open(path, "rb") dic = pickle.load(f) - if len(dic[word])>1: + if len(dic[word]) > 1: del dic[word][0] else: dic.pop(word) - fp = open(path,"wb") - pickle.dump(dic,fp) + fp = open(path, "wb") + pickle.dump(dic, fp) if __name__ == '__main__': lst1 = [('apple',2), ('banana',1)] d = {} - lst2dict(lst1, d) # d will change + lst_to_dict(lst1, d) # d will change save_frequency_to_pickle(d, 'frequency.p') # frequency.p is our database lst2 = [('banana',2), ('orange', 4)] d = load_record('frequency.p') - lst1 = dict2lst(d) + lst1 = dict_to_lst(d) d = merge_frequency(lst2, lst1) print(d) diff --git a/app/pickle_idea2.py b/app/pickle_idea2.py index 0da55bc..f3104a5 100644 --- a/app/pickle_idea2.py +++ b/app/pickle_idea2.py @@ -11,6 +11,7 @@ import pickle from datetime import datetime + def lst2dict(lst, d): ''' Store the information in list lst to dictionary d. @@ -25,7 +26,8 @@ def lst2dict(lst, d): else: d[word] += dates -def deleteRecord(path,word): + +def deleteRecord(path, word): with open(path, 'rb') as f: db = pickle.load(f) try: diff --git a/app/user_service.py b/app/user_service.py index 2e5feed..75971a6 100644 --- a/app/user_service.py +++ b/app/user_service.py @@ -93,7 +93,7 @@ def familiar(username, word): @userService.route("///del", methods=['GET', 'POST']) -def deleteword(username, word): +def delete_word(username, word): ''' 删除单词 :param username: 用户名 @@ -181,6 +181,7 @@ def user_mark_word(username): else: return 'Under construction' + def get_time(): ''' 获取当前时间 diff --git a/app/wordfreqCMD.py b/app/wordfreqCMD.py index e56ba0c..69065d6 100644 --- a/app/wordfreqCMD.py +++ b/app/wordfreqCMD.py @@ -6,10 +6,11 @@ import collections import string import operator -import os, sys # 引入模块sys,因为我要用里面的sys.argv列表中的信息来读取命令行参数。 +import os, sys # 引入模块sys,因为我要用里面的sys.argv列表中的信息来读取命令行参数。 import pickle_idea -def freq(fruit): + +def freq(s): ''' 功能: 把字符串转成列表。 目的是得到每个单词的频率。 输入: 字符串 @@ -18,54 +19,53 @@ def freq(fruit): ''' result = [] - - fruit = fruit.lower() # 字母转小写 - flst = fruit.split() # 字符串转成list - c = collections.Counter(flst) + s = s.lower() # 字母转小写 + word_lst = s.split() # 字符串转成list + c = collections.Counter(word_lst) result = c.most_common() return result -def youdao_link(s): # 有道链接 - link = 'http://youdao.com/w/eng/' + s + '/#keyfrom=dict2.index'# 网址 +def youdao_link(word): # 有道链接 + link = 'http://youdao.com/w/eng/' + word + '/#keyfrom=dict2.index' # 网址 return link -def file2str(fname):#文件转字符 - f = open(fname) #打开 - s = f.read() #读取 - f.close() #关闭 - return s +def file_to_str(f_name): # 文件转字符 + f = open(f_name) # 打开 + f_str = f.read() # 读取 + f.close() # 关闭 + return f_str -def remove_punctuation(s): # 这里是s是形参 (parameter)。函数被调用时才给s赋值。 - special_characters = '\_©~<=>+-/[]*&$%^@.,?!:;#()"“”—‘’{}|' # 把里面的字符都去掉 +def remove_punctuation(s): # 这里是words_text是形参 (parameter)。函数被调用时才给words_text赋值。 + special_characters = '\_©~<=>+-/[]*&$%^@.,?!:;#()"“”—‘’{}|' # 把里面的字符都去掉 for c in special_characters: - s = s.replace(c, ' ') # 防止出现把 apple,apple 移掉逗号后变成 appleapple 情况 + s = s.replace(c, ' ') # 防止出现把 apple,apple 移掉逗号后变成 appleapple 情况 s = s.replace('--', ' ') - s = s.strip() # 去除前后的空格 - + s = s.strip() # 去除前后的空格 + if '\'' in s: n = len(s) - t = '' # 用来收集我需要保留的字符 - for i in range(n): # 只有单引号前后都有英文字符,才保留 + characters = '' # 用来收集我需要保留的字符 + for i in range(n): # 只有单引号前后都有英文字符,才保留 if s[i] == '\'': i_is_ok = i - 1 >= 0 and i + 1 < n - if i_is_ok and s[i-1] in string.ascii_letters and s[i+1] in string.ascii_letters: - t += s[i] + if i_is_ok and s[i - 1] in string.ascii_letters and s[i + 1] in string.ascii_letters: + characters += s[i] else: - t += s[i] - return t + characters += s[i] + return characters else: return s -def sort_in_descending_order(lst):# 单词按频率降序排列 +def sort_in_descending_order(lst): # 单词按频率降序排列 lst2 = sorted(lst, reverse=True, key=lambda x: (x[1], x[0])) return lst2 -def sort_in_ascending_order(lst):# 单词按频率降序排列 +def sort_in_ascending_order(lst): # 单词按频率降序排列 lst2 = sorted(lst, reverse=False, key=lambda x: (x[1], x[0])) return lst2 @@ -89,22 +89,22 @@ def make_html_page(lst, fname): # 只是在wordfreqCMD.py中的main函数中调 if __name__ == '__main__': num = len(sys.argv) - if num == 1: # 从键盘读入字符串 + if num == 1: # 从键盘读入字符串 s = input() - elif num == 2: # 从文件读入字符串 + elif num == 2: # 从文件读入字符串 fname = sys.argv[1] - s = file2str(fname) + s = file_to_str(fname) else: print('I can accept at most 2 arguments.') - sys.exit()# 结束程序运行, 下面的代码不会被执行了。 + sys.exit() # 结束程序运行, 下面的代码不会被执行了。 - s = remove_punctuation(s) # 这里是s是实参(argument),里面有值 + s = remove_punctuation(s) # 这里是s是实参(argument),里面有值 L = freq(s) for x in sort_in_descending_order(L): - print('%s\t%d\t%s' % (x[0], x[1], youdao_link(x[0])))#函数导出 + print('%s\t%d\t%s' % (x[0], x[1], youdao_link(x[0]))) # 函数导出 # 把频率的结果放result.html中 - make_html_page(sort_in_descending_order(L), 'result.html') + make_html_page(sort_in_descending_order(L), 'result.html') print('\nHistory:\n') if os.path.exists('frequency.p'): @@ -112,12 +112,9 @@ if __name__ == '__main__': else: d = {} - print(sort_in_descending_order(pickle_idea.dict2lst(d))) + print(sort_in_descending_order(pickle_idea.dict_to_lst(d))) # 合并频率 - lst_history = pickle_idea.dict2lst(d) + lst_history = pickle_idea.dict_to_lst(d) d = pickle_idea.merge_frequency(L, lst_history) pickle_idea.save_frequency_to_pickle(d, 'frequency.p') - - - diff --git a/requirements.txt b/requirements.txt index 338b71c..2210969 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Flask==1.1.2 +Flask==2.2.3 selenium==3.141.0 PyYAML~=6.0 pony==0.7.16