先上流程图,还得27寸4K显示器,画图各种爽:

ReadMe:

运行程序前的提示:
1.抱歉,你得装prettytable模块......
2.还得抱歉,如果shell中运行,最好把字体调得小点,表格比较长......蛋疼 为什么写两个版本:
武sir这期的作业不是很难,但有一个需求的逻辑个人感觉不是很合理:普通用户可以选择管理员操作的选项。
当然银角的目的是为了我们把装饰器运用到实际程序中。
一般页面展示中,管理员操作选项对于普通用户会做两种处理:
1、将选项灰色显示或者不能点击
2、普通用户登录后不显示管理员操作选项,如果管理员登录后则显示
出于以上原因,我写了两个版本。
所以写代码注释时,我只写了第一个版本的,即crm.py 两个版本区别:
第一个版本crm.py 基本是按武sir的需求写的,略有不同的是,我把登陆和注册作为入口
第二个版本crm_v2.py 是在第一个版本基础上稍作修改,只是判断登录用户的是否为管理员,如果管理员登录则比普通用户多显示管理操作选项 文件说明:
crm.py:第一个版本,管理员以及普通用户操作均显示在主菜单
crm_v2.py:第二个版本,主菜单根据登录用户的角色判断是否显示管理员操作的选项
user_info:用户信息,以管道符隔开:账号|密码|邮箱|电话|用户角色 测试账号:
可以自己注册,也可以使用现成的。
管理员:admin/admin alex/3714
普通用户:chengchen/123 cc/123 操作流程:
登录/注册---->用户操作主菜单(普通用户操作【查看账户信息,修改帐户信息】,管理员操作【搜索,遍历用户,提升权限,重置密码】) 功能:
1.程序入口为登录、注册页面,用户可选择对应操作
2.登录时添加了随机验证码的功能
3.登录后显示操作主菜单,普通用户可查看本帐户信息,也可修改帐户信息
4.管理员操作权限做了限制,如果普通用户选择会提示用户权限不足
5.管理员可对所有用户进行搜索、遍历所有用户、提升权限、重置所有用户密码、增加删除用户等操作
6.管理员提升用户权限时,会对账号角色进行判断,如果已为管理员,会提示
7.用户做修改操作时,避免了多个用户账号前几个字母相同时出现的用户越权现象:比如管理员为chengchen,普通用户为chengc
8.显示用户信息时,对密码加密显示,并且查找时,对密码字段不进行查找

user_info 文件:

alex||alex@gmail.com||
admin|admin|admin@admin.org||
chengchen||chengchen@.com||
chengc||chengc@oldboy.com||
cc||niubi@niubi.com||
||@.com||
ccccc||@ccccc.com||
ccc|ccc|ccc@oldboy.org||

Code version1:

#!/usr/bin/env python
# -*-coding=utf-8-*-
# Auther:ccorz Mail:ccniubi@163.com Blog:http://www.cnblogs.com/ccorz/
# GitHub:https://github.com/ccorzorz
import prettytable, time, random, os USER_STATE = False
LOGIN_STATE=False
USER_NAME = None def check_user_type(func):
def inner(*args, **kwargs):
if USER_STATE:
r = func(*args, **kwargs)
return r
else:
print('\033[31;1m用户%s权限不够,管理员才可使用此功能\033[0m' % USER_NAME)
return inner def check_user_state(USER_NAME):
with open('user_info', 'r') as f:
for line in f:
line = line.strip()
if line.startswith(USER_NAME) and USER_NAME == line.split('|')[0]:
user_states = line.split('|')[4]
if user_states == '':
global USER_STATE
USER_STATE = True
else:
pass
return USER_STATE def user_name_list():
name_list = []
with open('user_info', 'r') as f:
for line in f:
name_list.append(line.strip().split('|')[0])
return name_list def user_pwd_list():
pwd_list = []
with open('user_info', 'r') as f:
for line in f:
pwd_list.append(line.strip().split('|')[1])
return pwd_list def veri_code():
li = []
for i in range(6):
r = random.randrange(0, 5)
if r == 1 or r == 4:
num = random.randrange(0, 9)
li.append(str(num))
else:
temp = random.randrange(65, 91)
char = chr(temp)
li.append(char)
r_code = ''.join(li)
print('\033[31;1m%s\033[0m' % r_code)
return r_code def find_user_line_list(USER_NAME):
with open('user_info','r') as f:
for line in f:
if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
user_name=USER_NAME
pwd=line.strip().split('|')[1]
mail=line.strip().split('|')[2]
tel=line.strip().split('|')[3]
user_t=line.strip().split('|')[4]
line_list=[user_name,pwd,mail,tel,user_t]
else:
pass
return line_list def change_pwd(USER_NAME):
new_pwd=input('请输入新的密码:')
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
line_list=find_user_line_list(USER_NAME)
line_list[1]=new_pwd
new_line='|'.join(line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True def change_mail(USER_NAME):
new_mail=input('请输入新邮箱:')
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
line_list=find_user_line_list(USER_NAME)
line_list[2]=new_mail
new_line='|'.join(line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True def change_tel(USER_NAME):
new_tel=input('请输入新的电话号码:')
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
line_list=find_user_line_list(USER_NAME)
line_list[3]=new_tel
new_line='|'.join(line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True def modify_user_info(USER_NAME):
row=prettytable.PrettyTable()
row.field_names=['修改密码','修改邮箱','修改联系电话']
row.add_row([1,2,3])
print(row)
while True:
inp=input('请选择功能菜单,\033[32;1m返回主菜单请输入b或者back\033[0m:')
if inp == '':
res=change_pwd(USER_NAME)
if res:
print('密码修改成功')
break
elif inp == '':
res=change_mail(USER_NAME)
if res:
print('邮箱修改成功')
break
elif inp == '':
res=change_tel(USER_NAME)
if res:
print('电话修改成功')
break
elif inp == 'back' or inp == 'b':
break
else:
print('输入有误,请重新输入!')
return True def no_pwd_file():
with open('user_info', 'r') as f, open('no_pwd', 'w') as new_f:
for line in f:
line = line.strip().lower().split('|')
del line[1]
line = '|'.join(line)
new_f.write('%s\n' % line) @check_user_type
def show_all_user():
no_pwd_file()
row = prettytable.PrettyTable()
row.field_names = ['用户名', '密码', '邮箱', '电话', '账户类型']
with open('no_pwd','r') as f:
for line in f:
line = line.strip()
if line.split('|')[3]=='':
user_type='管理员'
elif line.split('|')[3]=='':
user_type='普通用户'
row.add_row([line.split('|')[0],'***',line.split('|')[1],
line.split('|')[2],user_type])
print(row)
os.remove('no_pwd')
return True def show_user_info(USER_NAME):
user_info_list = []
with open('user_info', 'r') as f:
for line in f:
line = line.strip()
if line.startswith(USER_NAME) and USER_NAME == line.split('|')[0]:
user_info_list.extend(line.split('|'))
if len(user_info_list) == 0:
print('无此用户或者没有相关权限')
else:
user_type = None
if user_info_list[4] == '':
user_type = '管理员'
elif user_info_list[4] == '':
user_type = '普通用户'
row = prettytable.PrettyTable()
row.field_names = ['用户名', '密码', '邮箱', '电话', '账户类型']
row.add_row([user_info_list[0], '****', user_info_list[2],
user_info_list[3], user_type])
print(row) def regis():
name_list = user_name_list()
i = 0
while i < 3:
name = input('请输入用户名:')
if name in name_list:
print('用户名%s已被注册' % name)
i += 1
return False,name
else:
pwd = input('请输入密码:')
mail = input('请输入邮箱:')
tel = input('请输入电话:')
info = [name, pwd, mail, tel, '']
new_line = '|'.join(info)
with open('user_info', 'a') as f:
f.write('%s\n' % new_line)
break
return True,name def login():
name_list = user_name_list()
pwd_list = user_pwd_list()
exit_flag = 0
i_a = 0
i_b = 0
i_c = 0
while i_a < 3 and exit_flag == 0:
USER_NAME= input('请输入用户名:')
if USER_NAME in name_list:
while i_b < 3 and exit_flag == 0:
pwd = input('请输入%s的密码:' % USER_NAME)
if pwd == pwd_list[name_list.index(USER_NAME)]:
while i_c < 3 and exit_flag == 0:
r_code = veri_code()
c_cod = input('请输入红色字体显示的校验码:')
if c_cod.lower() == r_code.lower():
global LOGIN_STATE
LOGIN_STATE = True
print("登陆成功")
exit_flag = 1
elif i_c == 2:
exit_flag = 1
print('验证次数超过三次,登陆退出...')
else:
i_c += 1
'校验码不正确,请重新验证'
elif i_b == 2:
exit_flag = 1
print('尝试次数过多,退出登陆系统.')
else:
i_b += 1
print('密码不正确,请重新输入..')
else:
i_a += 1
print('无此账户,请确认用户名')
return LOGIN_STATE, USER_NAME @check_user_type
def search(keywords):
no_pwd_file()
res = []
search_res_list = []
user_type = None
with open('no_pwd', 'r') as f:
for line in f:
line = line.strip()
if keywords in line:
res.append(line)
if len(res) == 0:
print('通过关键字查询,无结果.')
else:
for line in res:
if line.split('|')[3] == '':
user_type = '普通用户'
elif line.split('|')[3] == '':
user_type = '管理员'
li = [line.split('|')[0], line.split('|')[1],
line.split('|')[2], user_type, ]
search_res_list.append(li)
row = prettytable.PrettyTable()
row.field_names = ['用户名', '邮箱', '电话', '用户类型']
for line in search_res_list:
row.add_row([line[0], line[1], line[2], line[3], ])
print(row)
os.remove('no_pwd') @check_user_type
def update_user(account):
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(account) and account == line.strip().split('|')[0]:
new_line_list=line.strip().split('|')
if new_line_list[4] == '':
return False
else:
new_line_list[4]=''
new_line='|'.join(new_line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True @check_user_type
def reset_pwd(account,new_pwd):
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(account) and account == line.strip().split('|')[0]:
new_line_list=line.strip().split('|')
new_line_list[1]=new_pwd
new_line='|'.join(new_line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True @check_user_type
def dele_user():
show_all_user()
name=input('输入您要删除的用户')
name_list=user_name_list()
if name in name_list:
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(name) and name == line.strip().split('|')[0]:
pass
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
print('账户%s删除完毕'%name)
else:
print('无%s的账户信息,请确认后再操作'%name) @check_user_type
def edit_user():
row=prettytable.PrettyTable()
row.field_names=['增加用户','删除用户']
row.add_row([1,2])
print(row)
while True:
inp=input('请选择功能\033[32;1m返回输入back或b\033[0m:')
if inp == '':
res,name=regis()
if res:
print('新增用户%s'%name)
break
elif inp == '':
dele_user()
break
elif inp == 'b' or inp == 'back':
break
else:
print('输入有误,请重新输入') def logout():
global USER_STATE,LOGIN_STATE,USER_NAME
USER_STATE, LOGIN_STATE, USER_NAME=False,False,None
exit('程序已退出!!') def show_menu():
row=prettytable.PrettyTable()
row.field_names=['查看%s账户信息'%USER_NAME,'修改%s帐户信息'%USER_NAME,
'\033[31;1m模糊查询\033[0m','\033[31;1m查看所有用户\033[0m',
'\033[31;1m提升指定用户为管理员\033[0m',
'\033[31;1m重置成员密码\033[0m',
'\033[31;1m增删成员\033[0m','退出']
row.add_row([1,2,3,4,5,6,7,'q&quit'])
print('\033[32;1m欢迎来到大牛逼CRM系统\033[0m'.center(120))
print(row) def main():
row = prettytable.PrettyTable()
row.field_names = ['功能', '登录' , '注册用户']
row.add_row(['快捷键','',''])
print(row)
inp = input('请输入菜单序列号:')
if inp == '':
global LOGIN_STATE, USER_NAME
LOGIN_STATE, USER_NAME = login()
global USER_STATE
USER_STATE = check_user_state(USER_NAME)
if LOGIN_STATE:
while True:
show_menu()
inp=input('输入相应序列号,选择相应功能,'
'\033[31;1m红色字体为管理员操作,请慎选\033[0m:')
if inp == '':
show_user_info(USER_NAME)
time.sleep(1)
elif inp == '':
modify_user_info(USER_NAME)
time.sleep(1)
elif inp == '':
show_all_user()
time.sleep(1)
elif inp == '':
keywords = input('请输入您要查询的关键字')
res = search(keywords)
time.sleep(1)
elif inp == '':
res=show_all_user()
if res:
account=input('请输入您要提升的用户账号名称:')
name_list=user_name_list()
if account in name_list:
res=update_user(account)
if res:
print('权限提升成功')
else:
print('\033[31;1m%s已经是管理员,'
'无需提升权限!\033[0m'%account)
time.sleep(1)
else:
print('\033[31;1m无此账户:%s信息\033[0m'%account)
else:
pass
time.sleep(1)
elif inp == '':
res=show_all_user()
if res:
account=input('请输入您要修改用户账号名称:')
name_list=user_name_list()
if account in name_list:
new_pwd=input('请输入账户的新密码:')
res=reset_pwd(account,new_pwd)
if res:
print('密码已重置成功')
else:
print('\033[31;1m无此账户:%s信息\033[0m'%account)
time.sleep(1)
else:
pass
time.sleep(1)
elif inp == '':
edit_user()
time.sleep(1)
if inp == 'q' or inp == 'quit':
logout()
else:
print('输入有误,请重新输入!')
else:
exit('登陆有误,程序退出')
elif inp == '':
res,name=regis()
if res:
print('用户%s注册成功' % name)
else:
pass
else:
exit('选择错误,程序退出') main()

Code version2:

#!/usr/bin/env python
# -*-coding=utf-8-*-
# Auther:ccorz Mail:ccniubi@163.com Blog:http://www.cnblogs.com/ccorz/
# GitHub:https://github.com/ccorzorz import prettytable, time, random, os USER_STATE = False
LOGIN_STATE=False
USER_NAME = None def check_user_type(func):
def inner(*args, **kwargs):
if USER_STATE:
r = func(*args, **kwargs)
return r
else:
print('\033[31;1m用户%s权限不够,管理员才可使用此功能\033[0m' % USER_NAME)
return inner def check_user_state(USER_NAME):
with open('user_info', 'r') as f:
for line in f:
line = line.strip()
if line.startswith(USER_NAME) and USER_NAME == line.split('|')[0]:
user_states = line.split('|')[4]
if user_states == '':
global USER_STATE
USER_STATE = True
else:
pass
return USER_STATE def user_name_list():
name_list = []
with open('user_info', 'r') as f:
for line in f:
name_list.append(line.strip().split('|')[0])
return name_list def user_pwd_list():
pwd_list = []
with open('user_info', 'r') as f:
for line in f:
pwd_list.append(line.strip().split('|')[1])
# print(pwd_list)
return pwd_list def veri_code():
li = []
for i in range(6):
r = random.randrange(0, 5)
if r == 1 or r == 4:
num = random.randrange(0, 9)
li.append(str(num))
else:
temp = random.randrange(65, 91)
char = chr(temp)
li.append(char)
r_code = ''.join(li)
print('\033[31;1m%s\033[0m' % r_code)
return r_code def find_user_line_list(USER_NAME):
with open('user_info','r') as f:
for line in f:
if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
user_name=USER_NAME
pwd=line.strip().split('|')[1]
mail=line.strip().split('|')[2]
tel=line.strip().split('|')[3]
user_t=line.strip().split('|')[4]
line_list=[user_name,pwd,mail,tel,user_t]
else:
pass
return line_list def change_pwd(USER_NAME):
new_pwd=input('请输入新的密码:')
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
line_list=find_user_line_list(USER_NAME)
line_list[1]=new_pwd
new_line='|'.join(line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True def change_mail(USER_NAME):
new_mail=input('请输入新邮箱:')
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
line_list=find_user_line_list(USER_NAME)
line_list[2]=new_mail
new_line='|'.join(line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True def change_tel(USER_NAME):
new_tel=input('请输入新的电话号码:')
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
line_list=find_user_line_list(USER_NAME)
line_list[3]=new_tel
new_line='|'.join(line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True def modify_user_info(USER_NAME):
row=prettytable.PrettyTable()
row.field_names=['修改密码','修改邮箱','修改联系电话']
row.add_row([1,2,3])
print(row)
while True:
inp=input('请选择功能菜单,\033[32;1m返回主菜单请输入b或者back\033[0m:')
if inp == '':
res=change_pwd(USER_NAME)
if res:
print('密码修改成功')
break
elif inp == '':
res=change_mail(USER_NAME)
if res:
print('邮箱修改成功')
break
elif inp == '':
res=change_tel(USER_NAME)
if res:
print('电话修改成功')
break
elif inp == 'back' or inp == 'b':
break
else:
print('输入有误,请重新输入!')
return True def no_pwd_file():
with open('user_info', 'r') as f, open('no_pwd', 'w') as new_f:
for line in f:
line = line.strip().lower().split('|')
del line[1]
line = '|'.join(line)
new_f.write('%s\n' % line) @check_user_type
def show_all_user():
# print('USER_NAME:%s'%USER_NAME)
# print('USER_STATE:%s'%USER_STATE)
no_pwd_file()
row = prettytable.PrettyTable()
row.field_names = ['用户名', '密码', '邮箱', '电话', '账户类型']
with open('no_pwd','r') as f:
for line in f:
line = line.strip()
if line.split('|')[3]=='':
user_type='管理员'
elif line.split('|')[3]=='':
user_type='普通用户'
row.add_row([line.split('|')[0],'***',line.split('|')[1],
line.split('|')[2],user_type])
print(row)
os.remove('no_pwd')
return True def show_user_info(USER_NAME):
user_info_list = []
with open('user_info', 'r') as f:
for line in f:
line = line.strip()
if line.startswith(USER_NAME) and USER_NAME == line.split('|')[0]:
user_info_list.extend(line.split('|'))
if len(user_info_list) == 0:
print('无此用户或者没有相关权限')
else:
user_type = None
if user_info_list[4] == '':
user_type = '管理员'
elif user_info_list[4] == '':
user_type = '普通用户'
row = prettytable.PrettyTable()
row.field_names = ['用户名', '密码', '邮箱', '电话', '账户类型']
row.add_row([user_info_list[0], '****', user_info_list[2],
user_info_list[3], user_type])
print(row) def regis():
name_list = user_name_list()
i = 0
while i < 3:
name = input('请输入用户名:')
if name in name_list:
print('用户名%s已被注册' % name)
i += 1
return False,name
else:
pwd = input('请输入密码:')
mail = input('请输入邮箱:')
tel = input('请输入电话:')
info = [name, pwd, mail, tel, '']
new_line = '|'.join(info)
with open('user_info', 'a') as f:
f.write('%s\n' % new_line)
break
return True,name def login():
name_list = user_name_list()
pwd_list = user_pwd_list()
exit_flag = 0
i_a = 0
i_b = 0
i_c = 0
while i_a < 3 and exit_flag == 0:
USER_NAME= input('请输入用户名:')
if USER_NAME in name_list:
while i_b < 3 and exit_flag == 0:
pwd = input('请输入%s的密码:' % USER_NAME)
if pwd == pwd_list[name_list.index(USER_NAME)]:
while i_c < 3 and exit_flag == 0:
r_code = veri_code()
c_cod = input('请输入红色字体显示的校验码:')
if c_cod.lower() == r_code.lower():
global LOGIN_STATE
LOGIN_STATE = True
print("登陆成功")
exit_flag = 1
elif i_c == 2:
exit_flag = 1
print('验证次数超过三次,登陆退出...')
else:
i_c += 1
'校验码不正确,请重新验证'
elif i_b == 2:
exit_flag = 1
print('尝试次数过多,退出登陆系统.')
else:
i_b += 1
print('密码不正确,请重新输入..')
else:
i_a += 1
print('无此账户,请确认用户名')
return LOGIN_STATE, USER_NAME @check_user_type
def search(keywords):
no_pwd_file()
res = []
search_res_list = []
user_type = None
with open('no_pwd', 'r') as f:
for line in f:
line = line.strip()
if keywords in line:
res.append(line)
if len(res) == 0:
print('通过关键字查询,无结果.')
else:
for line in res:
if line.split('|')[3] == '':
user_type = '普通用户'
elif line.split('|')[3] == '':
user_type = '管理员'
li = [line.split('|')[0], line.split('|')[1],
line.split('|')[2], user_type, ]
search_res_list.append(li)
row = prettytable.PrettyTable()
row.field_names = ['用户名', '邮箱', '电话', '用户类型']
for line in search_res_list:
row.add_row([line[0], line[1], line[2], line[3], ])
print(row)
os.remove('no_pwd') @check_user_type
def update_user(account):
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(account) and account == line.strip().split('|')[0]:
new_line_list=line.strip().split('|')
if new_line_list[4] == '':
return False
else:
new_line_list[4]=''
new_line='|'.join(new_line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True @check_user_type
def reset_pwd(account,new_pwd):
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(account) and account == line.strip().split('|')[0]:
new_line_list=line.strip().split('|')
new_line_list[1]=new_pwd
new_line='|'.join(new_line_list)
new_f.write('%s\n'%new_line)
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
return True @check_user_type
def dele_user():
show_all_user()
name=input('输入您要删除的用户')
name_list=user_name_list()
if name in name_list:
with open('user_info','r') as f,open('user_info_new','w') as new_f:
for line in f:
if line.strip().startswith(name) and name == line.strip().split('|')[0]:
pass
else:
new_f.write(line)
os.rename('user_info','user_info.bak')
os.rename('user_info_new','user_info')
os.remove('user_info.bak')
print('账户%s删除完毕'%name)
else:
print('无%s的账户信息,请确认后再操作'%name) @check_user_type
def edit_user():
row=prettytable.PrettyTable()
row.field_names=['增加用户','删除用户']
row.add_row([1,2])
print(row)
while True:
inp=input('请选择功能\033[32;1m返回输入back或b\033[0m:')
if inp == '':
res,name=regis()
if res:
print('新增用户%s'%name)
break
elif inp == '':
dele_user()
break
elif inp == 'b' or inp == 'back':
break
else:
print('输入有误,请重新输入') def logout():
global USER_STATE,LOGIN_STATE,USER_NAME
USER_STATE, LOGIN_STATE, USER_NAME=False,False,None
exit('程序已退出!!') def show_menu():
row=prettytable.PrettyTable()
row.field_names=['\033[31;1m模糊查询\033[0m','\033[31;1m查看所有用户\033[0m',
'\033[31;1m提升指定用户为管理员\033[0m',
'\033[31;1m重置成员密码\033[0m',
'\033[31;1m增删成员\033[0m']
row.add_row([3,4,5,6,7])
# print('\033[32;1m欢迎来到大牛逼CRM系统\033[0m'.center(75))
print(row) def show_menu_2():
row=prettytable.PrettyTable()
row.field_names=['查看%s账户信息'%USER_NAME,'修改%s帐户信息'%USER_NAME,
'\033[31;1m退出\033[0m']
row.add_row([1,2,'q&quit'])
print('\033[32;1m欢迎来到大牛逼CRM系统\033[0m'.center(50))
print(row) def main():
row = prettytable.PrettyTable()
row.field_names = ['功能', '登录' , '注册用户']
row.add_row(['快捷键','',''])
print(row)
inp = input('请输入菜单序列号:')
if inp == '':
global LOGIN_STATE, USER_NAME
LOGIN_STATE, USER_NAME = login()
global USER_STATE
USER_STATE = check_user_state(USER_NAME)
print('USER_STATE:%s'%USER_STATE)
if LOGIN_STATE:
while True:
show_menu_2()
if USER_STATE:
show_menu()
else:pass
inp=input('输入相应序列号,选择相应功能,'
'\033[31;1m红色字体为管理员操作,请慎选\033[0m:')
if inp == '':
show_user_info(USER_NAME)
time.sleep(1)
elif inp == '':
modify_user_info(USER_NAME)
time.sleep(1)
elif inp == '':
show_all_user()
time.sleep(1)
elif inp == '':
keywords = input('请输入您要查询的关键字')
res = search(keywords)
time.sleep(1)
elif inp == '':
res=show_all_user()
if res:
account=input('请输入您要提升的用户账号名称:')
name_list=user_name_list()
if account in name_list:
res=update_user(account)
if res:
print('权限提升成功')
else:
print('\033[31;1m%s已经是管理员,'
'无需提升权限!\033[0m'%account)
time.sleep(1)
else:
print('\033[31;1m无此账户:%s信息\033[0m'%account)
else:
pass
time.sleep(1)
elif inp == '':
res=show_all_user()
if res:
account=input('请输入您要修改用户账号名称:')
name_list=user_name_list()
if account in name_list:
new_pwd=input('请输入账户的新密码:')
res=reset_pwd(account,new_pwd)
if res:
print('密码已重置成功')
else:
print('\033[31;1m无此账户:%s信息\033[0m'%account)
time.sleep(1)
else:
pass
time.sleep(1)
elif inp == '':
edit_user()
time.sleep(1)
elif inp == 'q' or inp == 'quit':
logout()
else:
print('输入有误,请重新输入!')
else:
exit('登陆有误,程序退出')
elif inp == '':
res,name=regis()
if res:
print('用户%s注册成功' % name)
else:
pass
else:
exit('选择错误,程序退出') main()

Day4作业:蛋疼CRM系统的更多相关文章

  1. CRM系统(第一部分)

      阅读目录 1.需求分析 2.数据库表设计 3.起步 4.录入数据 5.知识点 1.需求分析 CRM客户关系管理软件---> 学员管理 用户:企业内部用户 用户量: 业务场景: 2.数据库表设 ...

  2. Django CRM系统

    本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 我2013年刚加入老男孩教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每 ...

  3. crm 系统项目(二) admin 后台操作表格

    crm 系统项目(二) admin 后台操作表格 1. app下创建 templates  运行的时候 先找全局的templates——> 按照app的注册顺序找templates中的文件 2. ...

  4. crm 系统项目(一) 登录,注册,校验

    crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db impo ...

  5. Java高级项目实战之CRM系统01:CRM系统概念和分类、企业项目开发流程

    1. CRM系统介绍 CRM系统即客户关系管理系统, 顾名思义就是管理公司与客户之间的关系. 是一种以"客户关系一对一理论"为基础,旨在改善企业与客户之间关系的新型管理机制.客户关 ...

  6. 如何在CRM系统中集成ActiveReports最终报表设计器

    有时候,将ActiveReports设计器集成到业务系统中,为用户提供一些自定义的数据表,用户不需要了解如何底层的逻辑关系和后台代码,只需要选择几张关联的数据表,我们会根据用户的选择生成可供用户直接使 ...

  7. CRM系统简析

    寄语: 简单阐述一下对CRM系统应用的理解,此内容参考网上资料所整理. CRM是Customer Relationship Management的缩写,简称客户关系管理. CRM系统可以从三个方面来分 ...

  8. 面向企业客户的制造业CRM系统的不成熟思考

    CRM就是客户关系管理(Customer Relationship Management),一直一知半解,最近有涉及这方面的需求,所以稍作研究,并思考一些相关问题. CRM是什么? CRM具体如何定义 ...

  9. Java课程设计——博客作业教学数据分析系统(201521123084 林正晟)

    #课程设计--博客作业教学数据分析系统(201521123084 林正晟) 1.团队课程设计博客链接 博客作业教学数据分析系统 2.个人负责模块或任务说明 学生登陆界面的前端实现和与数据库的连接 学生 ...

随机推荐

  1. 二、操作XML DOM:XML Document

    需要添加的命名空间:using System.Xml; 一.创建xml文件: 1.XmlDocument方式创建 XmlDocument xmldoc = new XmlDocument(); //加 ...

  2. Solr添加paoding分词器

    1.Solr3.6.2 并可运行 paoding-analysis3.0.jar  下载 2.1 解压{$Solr-Path}/example/webapp 下的solr.war文件,解压到当前文件夹 ...

  3. Nutch2.1+mysql+solr3.6.1+中文网站抓取

    1.mysql 数据库配置 linux mysql安装步骤省略. 在首先进入/etc/my.cnf (mysql为5.1的话就不用修改my.cnf,会导致mysql不能启动)在[mysqld] 下添加 ...

  4. div 水平垂直居中

    css <style> .main{ background: #999999; width: 600px; height: 400px; position: absolute; top: ...

  5. ElementUI 之 Cascader 级联选择器指定 value label

    ElementUI 的 Cascader 级联选择器个人觉得很好用,但是对 :options="options" 里的数据格式是有特定要求的:input 框显示的值是 option ...

  6. 25 | MySQL是怎么保证高可用的?

    在上一篇文章中,我和你介绍了binlog的基本内容,在一个主备关系中,每个备库接收主库的binlog并执行. 正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确地执行,备库就能 ...

  7. 使用 Java 创建聊天客户端-2

    1.项目截图 java聊天核心代码: MyJavaChatClient ================================================================ ...

  8. Zotero使用教程(1)-安装及配置

    小书匠kindle   作为一名科研人员,经常要阅读大量文献(当然我收集>>阅读,哎!),收集来的文献一般我们使用文件夹管理,通常使用文件夹命名和层级分布解决论文的分类问题.   但是,实 ...

  9. DES 加密 转码 脱敏

    from pyDes import des, CBC, PAD_PKCS5 import binascii # 秘钥 KEY = 'mHAxsLYz' from pyDes import des, C ...

  10. php curl 传递数据

    <?php header("Content-type: text/html; charset=utf-8"); /** * curl 传递数据 */ class curl { ...