文章目录
实现用户注册与校验
一、基础功能需求
版本一:
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)