"""
权限管理系统的设计
1. 登陆、注册、找回密码
2. 权限管理
3. 角色管理
4. 角色分配权限
5. 动态显示当前登陆用户权限菜单
"""
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,ForeignKey,CHAR,VARCHAR,UniqueConstraint
from sqlalchemy.orm import sessionmaker
from urllib.parse import quote_plus as urlquote
host = "home.vimll.com"
port = xxx
user = "xxxx"
password = 'xxx'
db_name = "flask"
con_info = f'mysql+pymysql://{user}:{urlquote(password)}@{host}:{port}/{
db_name}?charset=utf8'
#建立链接
engine = create_engine(con_info, max_overflow=10)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
#创建用户信息表
class User(Base):
__tablename__ = 'user'
uid = Column(Integer,primary_key=True,autoincrement=True)
name = Column(CHAR(20),nullable=False)
pwd = Column(CHAR(20),nullable=False)
role_id = Column(Integer,ForeignKey('role.rid'))
#__table_args__的参数必须是元组的形式
__table_args__ = (
UniqueConstraint(name,pwd,name='uni_np'), #用户名和密码不能重复!
)
#创建权限表
class Authority(Base):
__tablename__ ='authority'
aid = Column(Integer,primary_key=True,autoincrement=True)
auth = Column(VARCHAR(255),nullable=True)
#创建角色表
class Role(Base):
__tablename__ ='role'
rid = Column(Integer,primary_key=True,autoincrement=True)
dep = Column(VARCHAR(255),nullable=False)
#角色权限关系表
class Ro_au(Base):
__tablename__ ='ro_au'
id = Column(Integer,primary_key=True,autoincrement=True)
rid = Column(Integer,ForeignKey('role.rid'))
aid = Column(Integer,ForeignKey('authority.aid'))
#创建原始关系表
def original_table():
session.add_all([
Role(dep='项目经理'),
Role(dep='技术部'),
Role(dep='运营部'),
Role(dep='人事部'),
Role(dep='后勤部'),
Role(dep='普通员工'),
Authority(auth='查看个人信息'),
Authority(auth='更改用户信息'),
Authority(auth='删除用户'),
Authority(auth='设定项目整体方案'),
Authority(auth='查看项目进度'),
Authority(auth='查看项目经费'),
Authority(auth='查看项目计划'),
Authority(auth='项目技术方案'),
Authority(auth='项目支出管理'),
Authority(auth='项目人事安排'),
Authority(auth='项目后勤保障'),
])
session.commit()
session.add_all([
User(name='alex',pwd='3714',role_id=1),
User(name='egon',pwd='123456',role_id=2),
User(name='sl',pwd='761379545',role_id=2),
User(name='eric',pwd='123456',role_id=3),
User(name='mick',pwd='123456',role_id=4),
User(name='john',pwd='123456',role_id=5),
User(name='kaka',pwd='123456',role_id=6),
])
session.add_all([
Ro_au(rid=1,aid=1),Ro_au(rid=1,aid=5),Ro_au(rid=1,aid=6),
Ro_au(rid=2, aid=1),Ro_au(rid=2, aid=4),Ro_au(rid=2, aid=8),
Ro_au(rid=3, aid=1),Ro_au(rid=3, aid=5),Ro_au(rid=3, aid=6),Ro_au(rid=3, aid=7),
Ro_au(rid=4, aid=1),Ro_au(rid=4, aid=2),Ro_au(rid=4, aid=3),
Ro_au(rid=5, aid=1),Ro_au(rid=5, aid=9),Ro_au(rid=5, aid=11),
Ro_au(rid=6, aid=1),
])
session.commit()
#创建数据库所有表
def creat_db():
Base.metadata.create_all(engine)
#删除数据库所用表
def drop_db():
Base.metadata.drop_all(engine)
#显示个人权限
def show_auth(user_name):
user_role_id = session.query(User.role_id).filter(User.name == user_name).scalar_subquery()
user_dep_list = session.query(Role.dep).filter(Role.rid == user_role_id).all()
for row in user_dep_list:
user_dep = row[0]
print('您当前所属部门名称:', user_dep)
print('\33[33m您具有的权限如下:\33[37m')
auth_list = session.query(Authority.auth).join(Ro_au).filter(Ro_au.rid == user_role_id).all()
count = 1
for auth in auth_list:
print(count, auth[0])
count += 1
#显示所有部门信息
def show_department():
print('公司现有部门如下:')
dep_list = session.query(Role).all()
for dep in dep_list:
print(dep[0],dep[1])
def login():
while True:
user_name = input('请输入用户名【返回B】:\n>>>').strip()
if user_name.lower() == 'b':
break
user_pwd = input('请输入用户密码【返回B】:\n>>>').strip()
if user_pwd.lower() == 'b':
break
user_list = session.query(User.name,User.pwd).all()
if (user_name,user_pwd) in user_list:
print('登陆成功!')
choice = input('【1、进入个人权限界面】'
'\n【2、查看公司具有的所有部门】'
'\n【B、返回主界面】'
'\n>>>').strip()
if choice == '1':
show_auth(user_name)
continue
if choice == '2':
show_department()
continue
if choice.lower() == 'b':
break
else:
print('用户名或者密码错误!')
continue
#用户注册
def register():
while True:
user_name = input('请输入用户名【返回B】:\n>>>').strip()
if not user_name:continue
if user_name.lower() == 'b':
break
name_list = session.query(User.name).all()
if (user_name,) in name_list:
print('该用户名已经存在!')
break
else:
user_pwd = input('请输入用户密码:\n>>>').strip()
if not user_pwd:continue
dep_list = session.query(Role.rid,Role.dep).all()
for row in dep_list:
print(row.rid,row.dep)
user_role = input('请输入所属部门序号:\n>>>').strip()
if not user_role:
print('部门序号不能为空,请重新开始!')
continue
if user_role.isdigit():
session.add(User(name=user_name,pwd=user_pwd,role_id=int(user_role))) #写入数据库
session.commit()
print('新的员工信息已经注册成功!')
break
else:
print('您选择的部门有误,请重新选择!')
#找回密码
def find_pwd():
while True:
user_name =input('请输入用户名【返回B】:').strip()
if not user_name:continue
if user_name.lower() == 'b':
break
name_list =session.query(User.name).all()
if (user_name,) in name_list:
pwd_list =session.query(User.pwd).filter(User.name==user_name).all()
print('您的密码为:')
for pwd in pwd_list:
print(pwd[0])
else:
print('您输入的用户名不存在!')
if __name__ == '__main__':
while True:
creat_tab_choice = input('是否要在数据库中创建原始关系表?第一次请选择是!'
'**此操作会删除已添加的数据!**【是Y否N】:\n>>>').strip()
if creat_tab_choice.lower() == 'y':
drop_db()
creat_db()
original_table()
print('基本权限管理原始表已创建!')
elif creat_tab_choice.lower() == 'n':
pass
else:
print('您的操作有误,请重新选择!')
continue
while True:
print('欢迎进入权限管理系统!'.center(21, '*'))
choice = input('登录L\t注册R\t找回密码F\t退出Q:\n>>>').strip()
if choice.lower() == 'q':
print('成功退出权限管理系统,欢迎您再次使用!')
break
elif choice.lower() == 'l':
login()
elif choice.lower() == 'r':
register()
elif choice.lower() == 'f':
find_pwd()
else:
print('您输入的指令有误,请重新选择!')
continue
break