Python_sqlalchemy_users_acl

"""
权限管理系统的设计
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