python开发实现用户注册与校验

实现用户注册与校验

一、基础功能需求

版本一:

1.综合使用当前所学知识,如列表、字典、字符串、函数等,实现一个基于命令行的用户注册功能。

2.用户注册时必须要输入 用户名、密码、手机号码,用针对用户的输入必须进行验证。

3.用户名的规则:只能是大小写字母或数字,且不能以数字开头,长度为5-12位。

4.密码的规则:密码必须且只能由字母大小写和数字组成,长度为6~15位。

5.手机号码的规则:按照标准的中国手机号码规则进行校验。

6.如果校验成功,则允许用户注册,注册信息保存于列表或字典中,否则要求用户继续输入。

版本二:

(1)基于命令行给用户设定一个菜单,让用户决定下一步干什么。

(2)支持多用户注册,注册时,如果已经存在的用户名不能注册。

(3)将注册的用户名密码电话等信息保存在,文本文件中(CSV文件)。

(4)实现用户的登录功能,用于登录校验

(5)在使用CSV保存用户数据的情况下,让用户可以修改密码(输入用户名,输入旧密码,输入新密码)

(6)用户在输入用户名,密码,电话时,如果超过三次,则结束运行

二、功能代码实现

1.结构设计

(1)以什么数据结构来保存用户信息?

  • 列表:['zhangsan','zhang123','192168230147']
  • 字典:{'username':'zhangsan','password':'zhang123','phone':'192168230147'}

那如果是针对多个用户呢:

  • [{},{},{},{}] 列表中嵌入字典
    • 一个字典代表一个用户
    • 一个列表包含多个字典(用户)

(2)有很多的校验,是否可以使用函数进行管理?

check_username()
check_password()
check_phone()
input_user()
input_password()
input_phone()
do_reg()

(3)有明确的提示信息,有明确的错误信息,代码的运行过程,如何提升用户体验。

2.代码实现

在这里插入图片描述

全自动测试代码
#使用全自动测试代码进行单元测试
def test_driver(func, expectarg, *args):
    actual = func(*args)
    if actual == expectarg:
        print("测试 %s 成功" % func.__name__)
    else:
        print("测试 %s 失败" % func.__name__)


if __name__ == '__main__':  # 直接 main 然后回车就可以自动弹出这一行
    pass
    # 用户名规则单元测试
    test_driver(check_username, True, 'ymqyyds')
    test_driver(check_username, False, 'ymq6')
    test_driver(check_username, True, 'aymqyyd')
    test_driver(check_username, True, 'yhmjqx')
    test_driver(check_username, False, 'ymqyyds666ymq')
    test_driver(check_username, False, 'sigeman*nre')

    #密码规则单元测试
    test_driver(check_password, True, 'Woniu123')
    test_driver(check_password, True, 'YhMjQx521134')
    test_driver(check_password, False, 'nishizhensb')
    test_driver(check_password, False, 'Woniu12345678978945613')
    test_driver(check_password, False, 'Woniuxy')
    test_driver(check_password, True, 'Woniu123')
    test_driver(check_password, False, 'woniu123')

    # 电话规则单元测试
    test_driver(check_phone, True, '13892696338')
    test_driver(check_phone, False, '13892696')
    test_driver(check_phone, False, '13892696338666')
    test_driver(check_phone, True, '18710666870')
    test_driver(check_phone, True, '13772816626')
    test_driver(check_phone, False, '12892696338')
    test_driver(check_phone, False, '53892696338')

(1)检查用户名规则
'''
用户名的规则:
长度为5-12位,使用 len 函数进行判断
且不能以数字开头 username[0] 不能是 0-9 的范围
只能是大小写字母或数字
'''

def check_username(username):
    if len(username) < 5 or len(username) > 12:
        return False

    if username[0] >= '0' and username[0] <= '9':
        return False

    for char in username:
        if not ((ord(char) in range(65,91)) or (ord(char) in range(97, 123)) or (ord(char) in range(48,58))):
        # if not ((char >= 'A' and char <= 'Z') or (char >= 'a' and char <= 'z') or (char >= '0' and char <= '9')):
            return False

    return True
(2)检查密码规则
'''
密码的规则:
密码必须且只能由字母大小写和数字组成:至少有一位是大写,至少一位小写,至少一位数字
长度为6~15位
'''
def check_password(password):
    if not (len(password) >= 6 and len(password) <= 15):
        return False
	# 如果出现大写,小写,数字,那么就增加数字,通过数字来判断密码是否出现了这些对应的要求
    lower = 0
    upper = 0
    digital = 0
    for char in password:
        if ord(char) in range(65,91):
            upper += 1
        elif ord(char) in range(97,123):
            lower += 1
        elif ord(char) in range(48,58):
            digital += 1

    if lower < 1 or upper < 1 or digital < 1:
        return False

    return True
(3)检查电话规则
'''
电话的规则:
1.必须以 1 开头
2.第二位必须是 3-9 
3.后面九位数都是数字
'''
def check_phone(phone):
    pattern = '^1[3-9]\d{9}$'
    if re.match(pattern,phone):
        return True
    else:
        return False
(4)动态读取csv文件,并将第一行作为key值
def read_csv(filepath, has_first_column = True):
    with open(filepath, 'r') as f:
        content = f.readlines()  # readlines() 将每一行作为一个字符串读出来并作为列表中的一个元素
        if not has_first_column:
            raise Exception('Your csv does not have first line be used to key')  # 抛出异常结束函数运行
            # return None
        key_line = content[0].strip().split(',')
        csv_list = []
        columnnum = len(key_line)
        for i in range(1,len(content)):
            line = content[i].strip()
            csv_dict = {}
            for j in range(0, columnnum):
                csv_dict[key_line[j]] = line.split(',')[j]
            csv_list.append(csv_dict)
    return csv_list
(5)读取csv文件,并检查用户是否存在
def is_user_exists(username):
    user_list = read_csv('./user.csv')
    # print(user_list)
    # for i in range(0,len(user_list)):
    for user in user_list:
        if user['username'] == username:
            return True
    return  False
(6)读取csv文件,并检查用户是否存在,如果存在则以字典形式返回该用户信息
 def check_and_get_user(username):
    user_list = read_csv('./user.csv')
    # print(user_list)
    # for i in range(0,len(user_list)):
    for user in user_list:
        if user['username'] == username:
            return user
    return None
(7)修改用户密码,修改一个CSV文件中的某一行中的某一列,不能直接使用文件(python中不存在直接使用文件)
def change_password(username,newpassword):
    csv_list = read_csv('./user.csv')
    # print(csv_list)
    index = 0
    for user in csv_list:
        # print(user)
        if user['username'] == username:
            index = csv_list.index(user)
            break
    csv_list[index]['password'] = newpassword
    # print(csv_list)
    with open('./user.csv', mode='w') as f:
        f.write("username,password,phone\n")
        for user in csv_list:
            line = ''
            # print(user)
            line = f"{user['username']},{user['password']},{user['phone']}\n"
            line = line.replace(' ','').replace("'","")
            f.write(line)
  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值