Python之第三十一天的努力--模拟博客园登录系统(改良版)

模拟博客园登录系统(改良版)

未改良之前的代码详见:Python之第二十四天的努力--模拟博客园登录系统程序

改良的内容:

1.对注册者的密码进行加密在写入文件。

2.简化了部分函数。

3.把整体函数进行分模块

以下为改良后的代码:

  1. 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.退出整个程序要求:
            就是结束整个程序。
    '''
    
  2. 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('您输入有误请重新输入。')
    
  3. conf文件夹 ---> settings(配置文件)

    '''
    配置文件
    '''
    
    import os
    BASE_PATH = os.path.dirname(os.path.dirname(__file__))
    
    username_path = os.path.join(BASE_PATH,'db','registrants')
    
  4. 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
    
  5. 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()
    
  6. db文件夹 ---> registrants(存放注册用户信息的文件)

    用户信息包括用户名和加密后的密码

    aaaaaa|96e79218965eb72c92a549dd5a330112
    bbbbbb|e3ceb5881a0a1fdaad01296d7554868d
    cccccc|1a100d2c0dab19c4430e7d73762b3423
    dddddd|73882ab1fa529d7273da0db6b49cc4f3
    
  7. log文件夹 ---> access

    待完善

posted @ 2020-07-09 16:53  ET-珩  阅读(122)  评论(0)    收藏  举报