前言

那么这里博主先安利一些干货满满的专栏了!

这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助!

操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482Linux Syshttps://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482这两个是博主学习数据结构的同时,手撕模拟STL标准模版库各种容器的专栏。

STL源码剖析https://blog.csdn.net/yu_cblog/category_11983210.html?spm=1001.2014.3001.5482手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html


题目要求

  • 设计用户交互界面,进行账户(登录需要用户名及密码,信息包括姓名、学号和密码评分)的输入和储存,并对于用户输入的密码进行评分。
  • 要求至少实现三名用户的信息保存,需通过测试,验证保存账户的有效性,允许用户进行密码修改;
  • 在输入正确的账户信息后,打印账户中保存的信息。

密码按如下规则进行计分(累计),规则如下:

一、密码长度:
  • 5 分: 小于等于4 个字符
  • 10 分: 5 到7 字符
  • 25 分: 大于等于8 个字符
二、字母:
  • 0 分: 没有字母
  • 10 分: 全都是小(大)写字母
  • 20 分: 大小写混合字母
三、数字:
  • 0 分: 没有数字
  • 10 分: 1 个数字
  • 20 分: 大于1 个数字
四、符号:
  • 0 分: 没有符号
  • 10 分: 1 个符号
  • 25 分: 大于1 个符号
五、奖励:
  • 2 分: 字母和数字
  • 3 分: 字母、数字和符号
  • 5 分: 大小写字母、数字和符号

在获得一个密码后,根据如下的评分规则:

  • >= 90: 非常安全
  • >= 80: 安全
  • >= 70: 非常强
  • >= 60: 强
  • >= 50: 一般
  • >= 25: 弱
  • >= 0: 非常弱

并输出最终的评估结果 密码等级样例:

  • 38$@NoNoNo 期望输出:您的密码属于非常安全等级
  • 123 期望输出:您的密码属于弱等级

注意在实现中验证所有功能,请在报告中包含运行截图、涉及的代码,以及自己对于该问题的理解。注意使用模块化设计,并在关键位置添加注释。

摘要

通过实现Account_System类和User_Information类实现该账号管理系统

账户管理系统功能简介:

题目要求的功能:

  • 通过实现User_Information对每个用户的信息进行存储,并包含了密码等级评定功能,用户可以根据系统提示的密码评级选择是否重新设置密码。

  • 通过过实现Account_System对所有用户的信息进行统一管理,并对外提供用户操作接口

额外实现的功能:

  • Account_System类提供用户操作接口,用户可以通过目录选择对账户信息的增、删、查和改的功能

代码

# 没必要用继承,这里也不应该用继承

from ast import main
from curses.ascii import isdigit, islower, isupper
import pandas as pd
import sys # =================================== 个人信息类 =================================== #
# ================================ User_Information =============================== # class User_Information:
def __init__(self) -> None:
self.__Password_Rating_list = ['very_secure', 'secure', 'very_strong',
'strong', 'general', 'weak', 'very_weak'] # 类里面访问足够了 - 设为私有属性
self.user_name = None
self.pass_word = None
self.name = None
self.Student_ID = 0
self.Password_Rating = None def __Get_security_level(self, string='') -> str: # 类里面访问足够了 - 设为私有方法
score = 0
length = len(string)
digit_cnt = 0 # 数字个数
upper_cnt = 0 # 大写字母个数
lower_cnt = 0 # 小写字母个数
sym_cnt = 0 # 符号的个数
# 遍历字符串
for i in range(0, len(string)):
if string[i].isdigit():
digit_cnt += 1
elif string[i].isupper():
upper_cnt += 1
elif string[i].islower():
lower_cnt += 1
sym_cnt = length-digit_cnt-upper_cnt-lower_cnt
# 计算得分
# 密码长度
if length <= 4:
score += 5
elif length <= 7 and length >= 5:
score += 10
elif length >= 8:
score += 25
# 字母
if upper_cnt == 0 and lower_cnt == 0:
score += 0 # 没有字母
elif (upper_cnt and lower_cnt == 0) or (upper_cnt == 0 and lower_cnt):
score += 10 # 全都是小(大)写字母
elif upper_cnt and lower_cnt:
score += 20 # 大小写混合字母
# 数字
if digit_cnt == 0:
score += 0
elif digit_cnt == 1:
score += 10
elif digit_cnt > 1:
score += 20
# 符号
if sym_cnt == 0:
score += 0
elif sym_cnt == 1:
score += 10
elif sym_cnt > 1:
score += 25
# 额外加分
if sym_cnt == 0 and upper_cnt and lower_cnt and digit_cnt:
score += 2
elif ((sym_cnt and upper_cnt == 0 and lower_cnt and digit_cnt) or
(sym_cnt and upper_cnt and lower_cnt == 0 and digit_cnt)):
score += 3
else:
score += 5
# 计算等级
if score >= 90:
return self.__Password_Rating_list[0]
elif score >= 80:
return self.__Password_Rating_list[1]
elif score >= 70:
return self.__Password_Rating_list[2]
elif score >= 60:
return self.__Password_Rating_list[3]
elif score >= 50:
return self.__Password_Rating_list[4]
elif score >= 25:
return self.__Password_Rating_list[5]
elif score >= 0:
return self.__Password_Rating_list[6] def __set_pass_word(self) -> tuple: # 类里面访问足够了 - 设为私有方法
'''密码设置'''
pass_word = None
while True:
pass_word = input("请设置密码:>")
level = self.__Get_security_level(pass_word)
print(f"当前的密码等级为: {level} ,如果不需要重新输入请按q退出!")
choose = input()
if choose == 'q':
break
return pass_word, level def set_user_info(self):
'''设置用户人信息'''
self.name = input("请输入用户人姓名:>")
self.Student_ID = input("请输入学号:>")
self.user_name = input("请设置账户用户名:>")
self.pass_word, self.Password_Rating = self.__set_pass_word() def modify_pass_word(self):
'''修改密码'''
print("请修改")
self.pass_word, self.Password_Rating = self.__set_pass_word()
print("修改成功!") # =================================== 账户管理系统类 =================================== #
# =================================== Account_System ================================== # class Account_System:
def __init__(self) -> None:
self.account_list = [] def add_person_info(self):
person = User_Information()
print("============== 添加信息 ==============")
person.set_user_info() # 设置该对象信息
self.account_list.append(person)
print("============== 添加成功 ==============")
print()
def delete_person_info(self):
user_name=input("请输入要删除的用户名:>")
for i in range(0,len(self.account_list)):
if self.account_list[i].user_name == user_name:
self.account_list.pop(i)
print("删除成功!")
return
print("找不到该账户信息!") def search_person_info(self):
user_name=input("请输入要查找的用户名:>")
for i in range(0,len(self.account_list)):
if self.account_list[i].user_name == user_name:
tmp = self.__to_dict(self.account_list[i])
print()
s = pd.Series(tmp)
print(s)
print()
return
print("找不到该账户信息!") def modify_person_password(self):
user_name=input("请输入要修改密码的用户名:>")
for i in range(0,len(self.account_list)):
if self.account_list[i].user_name == user_name:
self.account_list[i].modify_pass_word()
return
print("找不到该账户信息!") def print_sys_info(self):
print("============= 当前账户信息 =============")
print(f"当前账户人数为:{len(self.account_list)}人")
info_dict_list = []
for i in range(0, len(self.account_list)):
tmp = self.__to_dict(self.account_list[i])
info_dict_list.append(tmp)
# 最后用Dataframe打印比较好
print()
df = pd.DataFrame(info_dict_list)
df.index=df.index+1 # 解决打印不对齐问题
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.width', 180) # 设置打印宽度(**重要**) print(df) # 打印DataFrame
print() def __to_dict(self, user: User_Information) -> dict:
ans = {}
ans['用户名'] = user.user_name
ans['密码等级'] = user.Password_Rating
ans['姓名'] = user.name
ans['学号'] = user.Student_ID
return ans def menu(self):
print("==== 学生账户管理系统 ====")
print("* 1.添加用户 *")
print("* 2.删除用户 *")
print("* 3.查找用户 *")
print("* 4.修改密码 *")
print("* 5.打印信息 *")
print("* 0.退出系统 *")
print("==== 学生账户管理系统 ====")
input_ch = int(input("请选择:>"))
return input_ch def start_account_sys(self):
input_ch = self.menu()
while input_ch:
if input_ch==1:
self.add_person_info()
elif input_ch==2:
self.delete_person_info()
elif input_ch==3:
self.search_person_info()
elif input_ch==4:
self.modify_person_password()
elif input_ch==5:
self.print_sys_info()
elif input_ch==0:
sys.exit()
else:
print("err,请重新选择")
input_ch = self.menu() # ======================================= 测试 ======================================= # def main() -> None:
stu_sys = Account_System()
stu_sys.start_account_sys() if __name__=='__main__':
main()

基于Python的用户登录和密码强度等级测试|Python小应用的更多相关文章

  1. 基于jwt的用户登录认证

    最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...

  2. 基于cookie的用户登录状态管理

    cookie是什么 先来花5分钟看完这篇文章:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies 看完上文,相信大家对cookie已经有 ...

  3. python实现用户登录、注册实例

    python面向函数式编程,模拟用户登录验证.注册的代码实现. 主要有以下两个文件: 1.user.txt文档文件,相当于数据库的用户信息表,主要是记录用户名和密码. 注意:1)此文档需要与.py文件 ...

  4. python 模拟用户登录代码

    需求:输入用户名,判断用户是否被锁定,锁定则退出,否则进入密码验证,输入三次错误密码之后此用户被锁定. userlist.txt里,用":"将用户名.密码.状态码分开: [root ...

  5. 基于Struts2的用户登录程序

    基本步骤: 1.新建Java工程,File>New>Project>Web>Dynamic Web Project,并将工程命名为:Struts2_Demo 2.导入strut ...

  6. python程序—用户登录

    编写一个用户登录程序: 1.登录成功显示登录页面 2.登录失败,显示密码错误,并且显示错误几次 3.登录失败三次,退出程序 username= 'root' passwd= ' count= prin ...

  7. Python入门-用户登录程序升级版

    编写登陆接口 基础需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 升级需求: 可以支持多个用户登录 (提示,通过列表存多个账户信息) 用户3次认证失败后,退出程序,再次启动程 ...

  8. python实现用户登录问候

    创建一个至少包含 5个用户名的列表,且其中一个用户名为 'admin' .想象你要编写代码,在每位用户登录网站后都打印一条问候消息.遍历用户名列表,并向每位用户打印一条问候消息.添加一条 if 语句, ...

  9. 一段关于用户登录 和乘法表的python代码

    用户登录代码(低配): name = 1password =11counter = 1while counter <3 : a = int(input ('name:')) #注意这里 inpu ...

  10. Flask最强攻略 - 跟DragonFire学Flask - 第五篇 做一个用户登录之后查看学员信息的小例子

    需求: 1. 用户名: oldboy 密码: oldboy123 2. 用户登录成功之后跳转到列表页面 3. 失败有消息提示,重新登录 4.点击学生名称之后,可以看到学生的详细信息 后端: from ...

随机推荐

  1. Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D)

    补题链接:Here 1511A. Review Site 题意:\(n\) 个影评人,\(a_i\) 有三种类型,如下 \(a_i = 1\) ,则表示支持 \(a_i = 0\) ,则表示不支持 \ ...

  2. 十三、docker的四种网络类型

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  3. uni-app学习笔记

    uniapp封装请求方法(含请求期间的Loading样式) https://blog.csdn.net/weixin_43242112/article/details/108019404?utm_me ...

  4. 最简单的http文件服务器

    概述 需求来了,部署一个简单方便的文件服务器,可以查看.下载文件,不需要鉴权,越简单越好. 环境 centos:CentOS  release 7.0 (Final)或以上版本 httpd:2.4.6 ...

  5. Socket 如何处理粘包

    Socket 如何处理粘包 什么是粘包什么是半包? 粘包: 比如发送了AA BB 两条消息,但是另一方接收到的消息却是AAB,像这种一次性读取了俩条数据的情况就是粘包 半包: 比如发送的消息是ABC时 ...

  6. HanLP — 感知机(Perceptron)

    感知机(Perceptron)是一个二类分类的线性分类模型,属于监督式学习算法.最终目的: 将不同的样本分本 感知机饮食了多个权重参数,输入的特征向量先是和对应的权重相乘,再加得到的积相加,然后将加权 ...

  7. 达梦数据库varchar和nvarchar的验证

    达梦数据库varchar和nvarchar的验证 测试SQL create tablespace zhaobsh datafile '/opt/dmdbms/data/DAMENG/zhaobsh.d ...

  8. [转帖]PolarDB和Oceanbase的区别和联系

    PolarDB-X 和 OceanBase 都是阿里云提供的分布式关系型数据库产品,它们都具有高可用.高性能.分布式等特点.但是两者也存在一些差异. 数据库理论基础不同 PolarDB-X 基于传统的 ...

  9. [转帖]新版 Elasticsearch 中的强悍插件 X-pack

    https://zhuanlan.zhihu.com/p/36337697   3 人赞同了该文章 作者:Alan 岂安科技运维工程师努力踏上一条为后人留坑的运维之路.(逃 1 前言 Elk 日志可视 ...

  10. [转帖]Ipmitool跟OS下的ipmi模块之间的关系

    https://www.jianshu.com/p/71614d3288e8 OS下默认加载了ipmi的相关模块 注:此时OS下可以正常使用ipmitool命令访问本机的ipmi 设备. [root@ ...