有两种方法
- 建立一个表
- 用位运算法
建立一个表
class Mutual(Base):
"""
角色配置资源的互斥表
"""
resource_id1 = Column(Integer, comment="一级资源id")
resource_id2 = Column(Integer, comment="二级资源id")
__table_args__ = ({'comment': '角色配置资源的互斥表'})
表里加入限制
代码的逻辑
def role_resource_add(db: Session, resource_info) -> dict:
# 删除对应的数据
db.query(RoleResource).filter(RoleResource.role_id == resource_info.role_id).delete()
resource_id_list = resource_info.resource_list.split(',')
if not resource_info.resource_list:
db.commit()
return True
# 解决互斥
for i in resource_id_list:
sql = f"select * from mutual where resource_id1={int(i)} or resource_id2={int(i)}"
res = db.execute(sql)
res_list = []
for rid in res:
res_list.append(str(rid.resource_id1))
res_list.append(str(rid.resource_id2))
# 合并&去重
inter_list = list(set(resource_id_list).intersection(set(res_list)))
print('inter_list: ', inter_list)
if len(inter_list) > 1:
print('>>>>>++++++++')
return False
# 配置资源
db_obj = []
for i in resource_id_list:
db_obj = RoleResource(
role_id=resource_info.role_id,
resource_id=i
)
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
位运算法
代码逻辑
def role_resource_add(db: Session, resource_info) -> dict:
# 删除对应的数据
db.query(RoleResource).filter(RoleResource.role_id == resource_info.role_id).delete()
resource_id_list = resource_info.resource_list.split(',')
if not resource_info.resource_list:
db.commit()
return True
# 解决互斥
promition = 0
for i in resource_id_list:
resource = db.query(Resource).filter(Resource.id == i).first()
if resource.promition:
promition = promition | resource.promition
roles = db.query(Role).filter(Role.id == resource_info.role_id).first()
if roles.pid > 0:
parent = db.query(Role).filter(Role.id == roles.pid).first()
print('role:', parent.promition)
print('=====', promition)
promition2 = promition | parent.promition
if promition == promition2 or parent.promition == promition2:
print('==已发生互斥==')
return False
print('promition2', promition2)
print('+++++++++')
sql = f"update role set promition={promition2} where id={resource_info.role_id}"
db.execute(sql)
db.commit()
# 配置资源
db_obj = []
for i in resource_id_list:
db_obj = RoleResource(
role_id=resource_info.role_id,
resource_id=i)
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
需要给资源添加一个字段,参数为1 、2 、4 、8 、16…
角色也需要添加一个字段,角色的一级分类需要的是:2和4的添加或2 、4 、16的添加