简单的python后台管理程序
作者:前程明亮 发布时间:2022-01-07 03:49:30
标签:python,后台管理
一、作业需求
二、流程图
三、源码与具体思路
import shutil
import os
import sys
USER_LOGIN = {'is_login': False}
def outer(func): #装饰器,若没有登陆则输出“请登陆”
def inner(*args, **kwargs):
if USER_LOGIN['is_login']:
r = func(*args, **kwargs)
return r
else:
print("请登陆")
return inner
def outer1(func): #装饰器,若不是管理员则输出“权限不足”
def inner1(*args, **kwargs):
if USER_LOGIN['user_type'] == '2':
r = func(*args, **kwargs)
return r
else:
print("不是管理员,权限不足")
return inner1
@outer
def change_pwd(changed_user, changed_pwd, type_user): #修改密码
if type_user == '1':
print("欢迎%s修改密码".center(50, '-') % USER_LOGIN['current_user'])
with open('regist', 'r', encoding='utf-8') as f1, open('regist_new', 'w', encoding='utf-8') as f2:
for line in f1:
read_list = line.strip().split('|')
if read_list[0] == changed_user:
read_list[1] = changed_pwd
f2.write('|'.join(read_list) + '\n')
continue
f2.write(line)
shutil.move('regist', 'regist_bak') #把regist文件复制到regist_bak文件中去
os.rename('regist_new', 'regist') #再将regist_new改名为regist 妙妙妙!
else:
print("没有权限修改管理员密码")
@outer
def look_information(): #查看本用户信息
print("欢迎%s查看信息".center(50, '-') % USER_LOGIN['current_user'])
with open('regist', 'r+', encoding='utf-8') as f:
for line in f:
read_list = line.strip().split('|')
if read_list[0] == USER_LOGIN['current_user']:
print("用户名:%s" % read_list[0])
print("密码:%s" % read_list[1])
print("邮箱:%s" % read_list[2])
print("电话:%s" % read_list[3])
def login(user, pwd): #登陆
with open('regist', 'r+', encoding='utf-8') as f:
for line in f:
read_list = line.strip().split('|')
if read_list[0] == user and read_list[1] == pwd: #若用户存在
USER_LOGIN['is_login'] = True
USER_LOGIN['current_user'] = user
USER_LOGIN['user_type'] = read_list[-1]
print("欢迎%s登陆".center(50, '-') % USER_LOGIN['current_user'])
break
if not USER_LOGIN['is_login']: #若用户还没注册
print("用户不存在,请注册")
def register(reg_user, reg_pwd, reg_email, reg_phone): #注册
register_list = []
register_list.append(reg_user) #将用户信息加入列表
register_list.append(reg_pwd)
register_list.append(reg_email)
register_list.append(reg_phone)
register_list.append('1')
with open('regist', 'a', encoding='utf-8') as f: #将用户信息写入文件
li = '|'.join(register_list)
f.write(li + '\n')
print("注册/添加信息:", li)
def delete_func(dele_user, type_user): #删除普通用户
if type_user == '1': #若删除的是普通用户
exit_flag = False
with open('regist', 'r+', encoding='utf-8') as f1, open('regist_new', 'w', encoding='utf-8') as f2:
for line in f1:
ret_list = line.strip().split('|')
if ret_list[0] == dele_user:
exit_flag = True #标志位原本设为False,当找到相应用户删除后,标志位设为True
print("普通用户删除成功")
continue
f2.write(line)
shutil.move('regist', 'regist_bak')
os.rename('regist_new', 'regist')
if not exit_flag:
print("要删除普通用户不存在")
elif type_user == '2': #若删除的是管理员用户
print("没有权限删除管理员帐号")
def upper_level(upper_user): #升级为管理员
with open('regist', 'r+', encoding='utf-8') as f1, open('regist_new', 'w', encoding='utf-8') as f2:
for line in f1:
li = line.strip().split('|')
if li[0] == upper_user:
li[-1] = '2'
print("%s已成为管理员" % upper_user)
f2.write('|'.join(li) + '\n')
continue
f2.write(line)
shutil.move('regist', 'regist_bak')
os.rename('regist_new', 'regist')
def search(search_info): #简单搜索
with open('regist', 'r+', encoding='utf-8') as f:
for line in f:
ret_list = line.strip().split('|')
if search_info in ret_list:
print(ret_list)
def get_usertype(user): #通地用户名获得用户类型,返回1或2
with open('regist', 'r+', encoding='utf-8') as f:
for line in f:
li = line.strip().split('|')
if li[0] == user:
return li[-1] #返回帐号的类型 1或2
@outer1
def admin_user(): #管理员调用
num = input("请选择:1.修改密码;2.查看本用户信息;3.修改普通用户密码;"
"4.删除/添加普通用户;5.权限管理;6.关键字搜索普通用户信息;7.退出:")
if num == '1':
new_pwd = input("请输入新的密码:")
change_pwd(new_pwd)
elif num == '2':
look_information()
elif num == '3':
user_changed = input("请输入修改密码的用户名:")
type_user = get_usertype(user_changed)
new_pwd = input("请输入新的密码:")
change_pwd(user_changed, new_pwd, type_user)
elif num == '4':
add_or_dele = input("1.删除普通用户;2.添加普通用户")
if add_or_dele == '1':
delete_username = input("请输入要删除普通用户的用户名:")
type_user = get_usertype(delete_username)
delete_func(delete_username, type_user)
elif add_or_dele == '2':
regi_username = input("请输入注册用户名:")
regi_pwd = input("请输入注册密码:")
regi_email = input("请输入邮箱:")
regi_phone = input("请输入电话:")
register(regi_username, regi_pwd, regi_email, regi_phone)
elif num == '5':
upper_user = input("请输入升级为管理员的普通用户名:")
upper_level(upper_user)
elif num == '6':
search_information = input("请输入要查找的关键字:")
search(search_information)
elif num == '7':
sys.exit()
def main():
while True:
choice = input("请选择:1.登陆;2.注册;3.修改密码;4.查看信息;5.后台管理;6.退出:")
if choice == '1':
username = input("请输入用名名:")
password = input("请输入密码:")
login(username, password)
elif choice == '2':
regi_username = input("请输入注册用户名:")
regi_pwd = input("请输入注册密码:")
regi_email = input("请输入邮箱:")
regi_phone = input("请输入电话:")
register(regi_username, regi_pwd,regi_email,regi_phone)
print("注册成功".center(50, '*'))
elif choice == '3':
new_pwd = input("请输入新的密码:")
current_user = USER_LOGIN['current_user']
change_pwd(current_user, new_pwd)
print("修改密码成功,请重新登陆".center(50, '-'))
sys.exit()
elif choice == '4':
look_information()
elif choice == '5':
admin_user()
elif choice == '6':
sys.exit()
main()
为了方便,再贴下不折叠代码
@outer1
def admin_user(): #管理员调用
num = input("请选择:1.修改密码;2.查看本用户信息;3.修改普通用户密码;"
"4.删除/添加普通用户;5.权限管理;6.关键字搜索普通用户信息;7.退出:")
if num == '1':
new_pwd = input("请输入新的密码:")
change_pwd(new_pwd)
elif num == '2':
look_information()
elif num == '3':
user_changed = input("请输入修改密码的用户名:")
type_user = get_usertype(user_changed)
new_pwd = input("请输入新的密码:")
change_pwd(user_changed, new_pwd, type_user)
elif num == '4':
add_or_dele = input("1.删除普通用户;2.添加普通用户")
if add_or_dele == '1':
delete_username = input("请输入要删除普通用户的用户名:")
type_user = get_usertype(delete_username)
delete_func(delete_username, type_user)
elif add_or_dele == '2':
regi_username = input("请输入注册用户名:")
regi_pwd = input("请输入注册密码:")
regi_email = input("请输入邮箱:")
regi_phone = input("请输入电话:")
register(regi_username, regi_pwd, regi_email, regi_phone)
elif num == '5':
upper_user = input("请输入升级为管理员的普通用户名:")
upper_level(upper_user)
elif num == '6':
search_information = input("请输入要查找的关键字:")
search(search_information)
elif num == '7':
sys.exit()
def main():
while True:
choice = input("请选择:1.登陆;2.注册;3.修改密码;4.查看信息;5.后台管理;6.退出:")
if choice == '1':
username = input("请输入用名名:")
password = input("请输入密码:")
login(username, password)
elif choice == '2':
regi_username = input("请输入注册用户名:")
regi_pwd = input("请输入注册密码:")
regi_email = input("请输入邮箱:")
regi_phone = input("请输入电话:")
register(regi_username, regi_pwd,regi_email,regi_phone)
print("注册成功".center(50, '*'))
elif choice == '3':
new_pwd = input("请输入新的密码:")
current_user = USER_LOGIN['current_user']
change_pwd(current_user, new_pwd)
print("修改密码成功,请重新登陆".center(50, '-'))
sys.exit()
elif choice == '4':
look_information()
elif choice == '5':
admin_user()
elif choice == '6':
sys.exit()
main()
四、坑总结
1.怎么修改密码?
当时我蒙了。因为如果用f.write(xx),是直接写在文件的最后面的。这样我想,好吧写在最后面也行。
但将已修改密码的记录加在最后一行,那又怎么把原来的删掉?又多了一个麻烦。
或者说,不加在最后一行,直接改那一行,又怎么做?
shutil.move('regist', 'regist_bak')
#把regist文件复制到regist_bak文件中去
os.rename('regist_new', 'regist')
#再将regist_new改名为regist 妙妙妙!
2.怎么修改用户user_type(将1改为2)
我看到有的博客有replace()方法。
new_str = line.replace(read_list[1], changed_pwd) 刚开始我也用了,但是,后来有BUG!
比如:当用户名与密码一样是,修改密码时,把密码也修改了。还不止,用replace()方法,在改
user_type时也出现把用户名等修改的现象。当时我再次蒙比。这不科学!
后来仔细看了replace()的源码才发现我错了。
也可以看看Python replace()方法
3.当我登入管理员后,添加普通用户后,发现不能再次登入管理员了。
于是我回去看register(reg_user, reg_pwd, reg_email, reg_phone),
发现我滥用全局变量
USER_LOGIN['user_type'] = '1'
register_list.append(USER_LOGIN['user_type'])
原来这里我重新赋值USER_LOGIN['user_type'] = '1'
后来为了解决这类问题,写了个get_user_type()方法


猜你喜欢
- 多线程编程当中, 线程的存在形态比较抽象. 通过前台线程\后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现
- 一、tensor的创建1.使用tensor小写字母的tensor接收具体的数据,可以直接按照numpy的方式输入数组。2.使用Tensor大
- 某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法。用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需
- MySQL日志文件相信大家都有很多的了解,MySQL日志文件一般在:/var/log/mysqld.log,下面就教您修改MySQL日志文件
- 1.C语言实现1.1代码说明a 创建双向链表:在创建哈夫曼树的过程中,需要不断对结点进行更改和删除,所以选用双向链表的结构更容易
- 写在前面今天Python笔记的内容是:异常处理一旦Python脚本发生异常,程序需捕获并处理异常。异常处理使得程序能够在处理异常后继续正常执
- 计时器setTimeout()和setInterval()两个都是js的计时功能的函数两个有些区别。 setTimeout(): 在js手册
- JS是一段一段执行的(以<script>标签来分割),执行每一段之前,都有一个“预编译”,预编译干的活是:声明所有var变量(初
- 2006-10-8表数据:tab1id name numA  
- 一:Zmail的优势:1:自动填充大多数导致服务端拒信的头信息(From To LocalHost之类的)2:将一个字典映射为email,构
- 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数
- Golang中的errorGolang中的 error 就是一个简单的接口类型。只要实现了这个接口,就可以将其视为一种 errortype
- 一开始的目的是学习十大挖掘算法(机器学习算法),并用编码实现一遍,但越往后学习,越往后实现编码,越发现自己的编码水平低下,学习能力低。这一个
- SQL Server 提供系统数据类型集,定义了可与 SQL Server 一起使用的所有数据类型。下面列出系统提供的数据类型集。 可以定义
- 一、文本文件读取与写入1 读取文件的 read() 方法file_object.read([size])file_object 表示文件对象
- 前言在机器学习中,我们会经常和矩阵打交道。在矩阵的运算中,python默认的输出是浮点数,但是如果我们想要矩阵的元素以分数的形式显示,可以通
- 写在前面作为一名找不到工作的爬虫菜鸡人士来说,登陆这一块肯定是个比较大的难题。 从今天开始准备一点点对大型网站进行逐个登陆破解。加
- clock()方法返回当前的处理器时间,以秒表示Unix上一个浮点数。精度取决于具有相同名称的C函数,但在任何情况下,这是使用于
- <!--#include file="admin_Checkuser.asp"--> <%
- 问题你的包中包含代码需要去读取的数据文件。你需要尽可能地用最便捷的方式来做这件事。解决方案假设你的包中的文件组织成如下:mypackage/