Python之第三十一天的努力--模拟博客园登录系统(改良版)
模拟博客园登录系统(改良版)
未改良之前的代码详见:Python之第二十四天的努力--模拟博客园登录系统程序
改良的内容:
1.对注册者的密码进行加密在写入文件。
2.简化了部分函数。
3.把整体函数进行分模块
以下为改良后的代码:
-
doc文件夹 ---> 模拟博客园登录系统(改良版)项目功能说明.txt
''' 用代码模拟博客园系统。 项目分析: 一.首先启动程序,页面显示下面内容供用户选择: 1.请登录 2.请注册') 3.进入文章页面 4.进入评论页面 5.进入日记页面 6.进入收藏页面 7.注销账号 8.退出整个程序 二.必须实现的功能: 1.注册功能要求: a.用户名、密码要记录在文件(username)中,其中密码要进行加密。 b.用户名要求:只能含有字母或者数字不能含有特殊字符并且确保用户名唯一。 c.密码要求:长度要在6~14个字符之间。 2.登录功能要求: a.用户输入用户名、密码进行登录验证。 b.登录成功之后才能访问3~7选项,如果没有登录或登录不成功是访问3~7选项。 不允许访问,让其先登录。(装饰器) c.超过三次登录还未成功,则退出整个程序。 3.进入文章页面要求: a.提示欢迎xx进入文章页面。 b.此时用户可以选择:直接写入内容,还是导入md文件。 ① 如果选择直接写入内容:让用户直接写文件名|文件内容。最后创建一个文章。 ② 如果选择导入md文件:让用户输入已经准备好的md文件的文件路径 (相对路径即可:比如 一.md ),然后将此md文件的全部内容写入文章(一.text)中。 4.进入评论页面要求: 提示欢迎xx进入评论页面。 5.进入日记页面要求: 提示欢迎xx进入日记页面。 6.进入收藏页面要求: 提示欢迎xx进入收藏页面。 7.注销账号要求: 不是退出整个程序,而是将已经登录的状态变成未登录的状态(访问3~7选项时 需要重新登录)。 8.退出整个程序要求: 就是结束整个程序。 ''' -
core文件夹 ---> src(主逻辑模块)
''' 主逻辑模块 ''' import hashlib from conf import settings from lib import common def MD5(pwd): ''' 加密算法 @param pwd:需要加密的密码 @return: 加密后的密码 ''' ret = hashlib.md5() ret.update(pwd.encode('utf-8')) return ret.hexdigest() def table_print(): ''' 打印目录 @return: ''' print('1.请登录') print('2.请注册') print('3.进入文章页面') print('4.进入评论页面') print('5.进入日记页面') print('6.进入收藏页面') print('7.注销账号') print('8.退出整个程序') def get_user_paw(): ''' 获取用户名和密码,并放入到一个字典里 @return: 用户名密码的字典 ''' user_dict = {} with open(settings.username_path,encoding='utf-8') as f1: for line in f1: line_list = line.strip().split('|') user_dict[line_list[0].strip()] = line_list[1].strip() return user_dict def registration(): ''' 注册函数 @return: ''' while 1: registration_name = input('请输入用户名(只能包含数字和字母):') registration_pwd = input('请输入密码(长度为6~14个字符):') if registration_name.isalnum() and 6 <= len(registration_pwd) <= 14: u_dict = get_user_paw() if registration_name in list(u_dict.keys()): print('用户名以存在,请重新输入') else: with open(settings.username_path,encoding='utf-8',mode='a') as f2: registration_pwd_md5 = MD5(registration_pwd) f2.write(f'{registration_name}|{registration_pwd_md5}\n') break else: print('您输入的用户名或密码错误,请重新输入') print('注册成功!') if back_quit(): return True else: return login_status_dict = { 'username': None, 'status': False, } def login(): ''' 登录函数 @return: ''' u_dict = get_user_paw() count = 1 print('请登录') while count < 4: username = input('请输入用户名:').strip() password = input('请输入密码:').strip() password_md5 = MD5(password) if username in u_dict.keys() and password_md5 == u_dict[username]: print('登录成功') login_status_dict['username'] = username login_status_dict['status'] = True return True else: print('用户名或密码错误') count += 1 print('用户名或密码3次输入均不正确,自动退出程序') return False @common.auth def article(): ''' 文章界面 @return: ''' while 1: print(f'欢迎{login_status_dict["username"]}进入文章页面') write_num = input('选择直接写入内容输入1,选择导入md文件输入2,输入B或b返回上一个界面,输入Q或q直接退出:') if write_num.isdecimal(): write_num = int(write_num) if write_num == 1: article_name = input('请输入文件名:') article_content = input('请输入文章内容:') with open(article_name,encoding='utf-8',mode='w') as f3: f3.write(article_content) elif write_num == 2: article_name = input('请输入文件路径:') with open(article_name,encoding='utf-8') as f4,\ open(article_name[:-2] + 'text',encoding='utf-8',mode='w') as f5: f5.write(f4.read()) elif write_num.upper() == 'B': break elif write_num.upper() == 'Q': return False return True @common.auth def comment(): ''' 评论界面 @return: ''' print(f'欢迎{login_status_dict["username"]}进入评论页面') if back_quit(): return True else: return @common.auth def dariy(): ''' 日记界面 @return: ''' print(f'欢迎{login_status_dict["username"]}进入日记页面') if back_quit(): return True else: return @common.auth def collection(): ''' 收藏界面 @return: ''' print(f'欢迎{login_status_dict["username"]}进入收藏页面') if back_quit(): return True else: return @common.auth def cancel_login(): ''' 注销界面 @return: ''' login_status_dict['username'] = None login_status_dict['status'] = False print('您已注销') if back_quit(): return True else: return def _quit(): ''' 退出程序 @return: ''' return False def back_quit(): ''' 返回或直接退出 @return: ''' while 1: s_quit = input('输入B或b返回上一个页面,输入Q或q直接退出:').strip() if s_quit.upper() == 'B': break elif s_quit.upper() == 'Q': return else: print('您输入有误请重新输入') return True def run(): while 1: dic = { 1:login, 2:registration, 3:article, 4:comment, 5:dariy, 6:collection, 7:cancel_login, 8:_quit, } table_print() open_num = input('请输入您要进行的操作的序号:').strip() if open_num.isdecimal(): open_num = int(open_num) if 1 <= open_num <= 8: if dic[open_num](): continue else: return else: print('您输入有误请重新输入。') else: print('您输入有误请重新输入。') -
conf文件夹 ---> settings(配置文件)
''' 配置文件 ''' import os BASE_PATH = os.path.dirname(os.path.dirname(__file__)) username_path = os.path.join(BASE_PATH,'db','registrants') -
lib文件夹 ---> common(公共组件)
''' 公共组件 ''' from core import src def auth(f): ''' 装饰器 @param f: 修饰的函数名 @return: ''' def inner(*args,**kwargs): if src.login_status_dict['status']: ret = f(*args,**kwargs) return ret else: if src.login(): ret = f(*args, **kwargs) return ret return inner -
bin文件夹 ---> starts(启动文件)
''' 启动文件 ''' import os import sys BASE_PATH = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_PATH) from core import src if __name__ == '__main__': src.run() -
db文件夹 ---> registrants(存放注册用户信息的文件)
用户信息包括用户名和加密后的密码
aaaaaa|96e79218965eb72c92a549dd5a330112 bbbbbb|e3ceb5881a0a1fdaad01296d7554868d cccccc|1a100d2c0dab19c4430e7d73762b3423 dddddd|73882ab1fa529d7273da0db6b49cc4f3 -
log文件夹 ---> access
待完善

浙公网安备 33010602011771号