一、构成
注册 -> 数据库(mysql) -> 登录
注:
1.若不能用mysql,可以用excel创建一个.CSV文件,使用Python的文件操作进行调取
import hashlib
str_user_name = input("请输入账号:")
str_password = input("请输入密码:")
p = open("user_password.csv","a")
hash_password = hashlib.md5(password.encode(encoding="UTF-8")).hexdigest()
p.write("{},{},{}\n".format(user_name,password,hash_password))
p.close()
2.若借鉴下面代码请安装并配置好mysql
二、代码实现
1.引用hashlib库对密码进行hash运算,pymysql库用于连接mysql数据库
import hashlib
import pymysql
2.注册模块:包括用户名操作和密码操作
def user_registration(): #注册
"""
注册账户
:return:
"""
user_name=enter_user_name()
if is_user_exist(user_name):
password=enter_password()
hash_password = hashlib.md5(password.encode(encoding="UTF-8")).hexdigest()
insert_data((user_name,hash_password,"用户","申请中"))
else:
print("您输入账户已存在")
*输入账户:要求账户为10位并且前两位为小写字母,后8位位数字
def enter_user_name():
"""
输入账户
:return:格式正确的账户
"""
while True:
str_user_name = input("请输入账号:格式为双小写字母加8位数字")
if len(str_user_name) == 10 and is_user_format(str_user_name):
return str_user_name
else:
print("您的格式不正确,请重新输入10位账号")
continue
*判断账户是否在数据库中,输出bool值
def is_user_exist(user_name):
"""
判断账户存在
:param user_name:账户
:return: bool
"""
tuple_user=data_obtained(user_name)
for item in tuple_user:
if user_name == item[0]:
return False
return True
def is_user_format(str_user_name):
"""
判断账户格式
:param str_user_name: 账户 str
:return: bool
"""
for item in str_user_name[0:2]:
if not is_small_letter(item):
print("您的格式不正确,请重新输入")
return False
for item in str_user_name[2:]:
if not is_number(item):
print("您的格式不正确,请重新输入")
return False
return True
def is_number(number):
"""
判断数字
:letter: 字符
:return: bool
"""
try:
if 0 <= eval(number) <= 9:
return True
return False
except:
print()
return False
*输入密码操作,要求密码为强密码格式
def enter_password():
"""
输入密码
:return: 强密码
"""
while True:
str_password = input("请输入密码:包含大小写字母,数字,特殊字符并大于等于6位")
if len(str_password) >= 6:
if is_str_format(str_password) ==4:
return str_password
else:
print("您的密码强度不够,请重新输入")
continue
else:
print("密码的长度不够,请重新输入")
continue
def is_str_format(str_password):
"""
判断密码字符格式
:param str_password: 密码
:return:
"""
count_big_letter = count_small_letter = count_num = count_special_character = 0
for item in str_password:
if is_big_letter(item):
count_big_letter = 1
elif is_small_letter(item):
count_small_letter = 1
elif is_number(item):
count_num = 1
elif is_special_character(item):
count_special_character = 1
else:
print("有非法字符,请重新输入")
return False
return count_big_letter+count_num+count_small_letter+count_special_character
def is_big_letter(big_letter):
"""
判断大写字母
:big_letter:字符
:return: Bool
"""
if "A"<=big_letter<="Z":
return True
return False
def is_small_letter(small_letter):
"""
判断小写字母
:big_letter:字符
:return: Bool
"""
if "a"<= small_letter <="z":
return True
return False
def is_special_character(special_character):
"""
判断特殊字符
:big_letter:字符
:return: Bool
"""
if ord(special_character)<48 or 58<ord(special_character)<65 or 91<ord(special_character)<97 or 123<ord(special_character)<128:
return True
return False
3.登录模块,(下面代码涉及到mysql的操作)
*从数据库中调取数据
def data_obtained(id):
"""
调取数据
:return:
"""
conn=pymysql.connect(host="localhost",user="root",passwd="123456")
conn.select_db("user")
curcor = conn.cursor()
sql = "select * from user where id=%s ;"
curcor.execute(sql,(id))
user = curcor.fetchall()
return user
*往数据库中插入数据
def insert_data(data):
conn = pymysql.connect(host="localhost", user="root", passwd="123456")
conn.select_db("user")
curcor = conn.cursor()
sql = "insert into user value (%s,%s,%s,%s)"
curcor.execute(sql,(data[0],data[1],data[2],data[3]))
print("操作成功")
curcor.close()
conn.commit()
conn.close()
*修改密码
def update_passport(id,passport):
"""
更新密码
:param id:
:param passport:
:return:
"""
conn = pymysql.connect(host="localhost", user="root", passwd="123456")
conn.select_db("user")
curcor = conn.cursor()
sql = "update user set passport =%s where id=%s;"
curcor.execute(sql,(passport,id))
print("操作成功")
curcor.close()
conn.commit()
conn.close()
*修改账户状态
def update_conditions(id,conditions="正常"):
"""
更新账号状态
:param id:账号
:param conditions:状态,正常,
:return:
"""
conn = pymysql.connect(host="localhost", user="root", passwd="123456")
conn.select_db("user")
curcor = conn.cursor()
sql = "update user set conditions =%s where id=%s;"
curcor.execute(sql,(conditions,id))
print("操作成功")
curcor.close()
conn.commit()
conn.close()
def register():#登录
"""
登录
:return: bool
"""
count = 0
while True:
user_name=enter_user_name()
password=enter_password()
if count != 3:
if is_user_password_equality(user_name,password) and is_user_conditions(user_name):
print("登录成功")
if data_obtained(user_name)[0][-2] =="管理员":
if administrator_mean() == False:
return False
else:
mean()
else:
count +=1
continue
else:
update_conditions(user_name, conditions="锁定")
print("输入超过3次,账号已锁定,请联系管理员解锁!")
def is_user_password_equality(user_name,password):
"""
判断账户密码相对应
:user_name:账户
:return: bool
"""
tuple_user=data_obtained(user_name)[0]
hash_password = hashlib.md5(password.encode(encoding="UTF-8")).hexdigest()
if user_name == tuple_user[0] and hash_password == tuple_user[1]:
return True
print("您输入账户不存在或密码错误,请重新输入")
return False
def is_user_conditions(id):
"""
判断用户状态
:param id: 用户名
:return: bool
"""
tuple_user = data_obtained(id)[0]
if tuple_user[-1] =="正常":
return True
print("你的用户处于申请中,请联系管理员")
return False
def delete_data(user_name):
conn = pymysql.connect(host="localhost", user="root", passwd="123456")
conn.select_db("user")
curcor = conn.cursor()
sql = "delete from user where user_name=%s;"
curcor.execute(sql,(user_name))
curcor.close()
conn.commit()
conn.close()
def data_all_obtained():
"""
调取所有数据
:return:
"""
conn=pymysql.connect(host="localhost",user="root",passwd="123456")
conn.select_db("user")
curcor = conn.cursor()
sql = "select * from user ;"
curcor.execute(sql)
user = curcor.fetchall()
print("{:<12}\t{:<70}\t{:<5}\t{:<5}".format("账户","密码","性质","状态"))
for items in user:
print("{:<12}\t{:<70}\t{:<5}\t{:<5}".format(items[0],items[1],items[2],items[3]))
def data_falue_conditions():
"""
调取状态异常数据
:return:
"""
conn=pymysql.connect(host="localhost",user="root",passwd="123456")
conn.select_db("user")
curcor = conn.cursor()
sql = "select * from user where conditions <>'正常';"
curcor.execute(sql)
user = curcor.fetchall()
print("{:<12}\t{:<5}".format("账户","状态"))
for items in user:
print("{:<12}\t{:<5}".format(items[0],items[-1]))
def register_mean():
"""
菜单
"""
while True:
try:
int_choice = int(input("""
**********菜单**********
1.注册
2.登录
3.退出
"""))
except:
print("指令错误,请重新输入")
continue
if int_choice == 1:
user_registration()
continue
elif int_choice ==2:
register()
continue
elif int_choice ==3:
print("程序结束,谢谢使用")
return False
def administrator_mean():
print("欢迎进入墨非墨所创信息系统,该模块为管理员模块,欢迎使用")
while True:
try:
int_choice = int(input("""
**********菜单**********
1.查看用户
2.修改密码
3.用户确认
4.删除用户
5.退出
**********墨非墨**********
"""))
except:
print("指令错误,请重新输入")
continue
if int_choice == 1:
data_all_obtained()
continue
elif int_choice == 2:
id=input("账户")
passport = input("修改的密码")
update_passport(id,passport)
continue
elif int_choice == 3:
data_falue_conditions()
id = input("账户")
update_conditions(id)
continue
elif int_choice == 4:
id = input("请输入删除账户")
delete_data(id)
print("此功能尚在开发,代码已完成")
continue
elif int_choice == 5:
print("返回上级菜单")
return False
else:
print("指令错误,请重新输入")
continue
def mean():
print("欢迎进入墨非墨所创信息系统,该模块待完善,敬请期待")
return False
register_mean()
*************************************************************************************************************