解决数据的互斥问题

有两种方法

  1. 建立一个表
  2. 用位运算法

建立一个表


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的添加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值