继续完善我对数据权限的奇思妙想

文章介绍了如何使用MyBatis-Plus的DataPermissionHandler插件,通过自定义注解@DataScope实现按角色限制数据访问,如限制角色只能查看特定区域或金额范围内的订单。规则配置灵活,支持复杂逻辑,如反射执行方法获取数据权限条件。

思路是使用MyBatis-Plus提供的DataPermissionHandler数据权限插件,使用自定义注解@DataScope在方法上,通过切面查询该账号拥有的角色List,是否关联有的数据规则,执行SQL前进行拦截,解析拼接SQL。

例子 我们想在订单不分页接口限制某个角色只能查看收获地址中存在钦北区或者订单金额小于等于100的订单。

那么我们可以添加一个mark(我这里暂时把他叫做标记),标记这个接口为order-list

image-20231205112116030

在这个标记下添加我们需要的两条规则

image-20231205112231485

image-20231205112244807

image-20231205112253529

再给普通角色配置一下他在这个接口适用的规则,就是刚刚添加的规则

image-20231205112841923

然后使用注解@DataScope("order-list")在mapper的接口上,这里我们用重写MyBatis的list()接口来测试,如下:

 

java

复制代码

// 建议使用在mapper方法接口上 @Mapper public interface OrderMapper extends BaseMapper<Order> { @DataScope("order-list") @Override List<Order> selectList(@Param(Constants.WRAPPER) Wrapper<Order> queryWrapper); } // 用在service层方法上时,要注意调用的方法是否是本类的方法 // 如果是,会导致代理失败,数据权限失效 @Service public class OrderServiceImpl extends EntityServiceImpl<OrderMapper, Order, OrderDto, OrderQuery> implements OrderService { @Override public List<OrderDto> list(OrderQuery query) { LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(StrUtil.isNotBlank(query.getReceiverName()), Order::getReceiverName, query.getReceiverName()); // ...其他条件 return afterQueryHandler(list(queryWrapper), new BOrderQueryHandler()); } }

在查询调用OrderServiceImpl#list(OrderQuery query)方法时,原本的sql为 SELECT * FROM ex_order WHERE deleted=0

经过数据权限处理后则为 SELECT * FROM ex_order WHERE deleted = 0 AND (order_amount <= 100 OR receiver_address LIKE '%钦北区%')

从而实现了数据权限的控制。

当然这只是简单需求,复杂的需求也提供了解决办法:规则处可以配置全限定类名加方法,可以带参,解析规则时会反射执行该方法得到返回值,该功能可以实现复杂的数据权限需求,就看你怎么搭配。

例如:查看订单金额为整数且为偶数的订单

image.png

 

java

复制代码

// 太变态了,方法名都不知道怎么起了 private List<Long> getLimitOrderId() { // 查出订单进行过滤然后返回能看的订单idList return idList; }

wonder-server: 一个灵活的数据权限管理 (gitee.com) 欢迎来指点指点

<think> 嗯,用户想要了解Python的奇思妙想相关内容。从用户提供的三个引用来看,ta似乎对Python的一些非常规用法特别感兴趣。 用户给的第一个引用是关于用Python做矩阵乘法的有趣尝试。虽然这个实现方式比较基础,但体现了Python列表推导式的灵活应用。第二个引用展示了一个巧妙的技巧:通过globals()动态获取所有类实例并进行操作,这在元编程和反射中很有价值。第三个引用更有深度,提出了将中文字符转化为像素点信息供神经网络处理的创新思路。 用户可能是个喜欢探索Python边界的开发者,或者正在寻找编程灵感。ta提到的"奇思妙想"应该是指那些跳出常规框架的创造性用法。我应该重点介绍那些能展现Python动态特性、元编程能力和跨领域应用的例子。 考虑到用户之前没有限定领域,我可以从多个维度组织内容:语言特性妙用、算法实现技巧、跨学科创新应用等。需要确保每个例子都足够"奇妙"但又不脱离实际用途。 特别要注意的是,用户提供的第三个引用涉及NLP与CV的交叉领域,这个方向很有价值,应该详细说明其原理和潜在应用。不过要避免过于学术化的表述,保持趣味性。 </think> 以下是一些展现Python语言灵活性与创造力的奇思妙想实现,涵盖数学计算、元编程、图像处理等方向: --- ### 1. 矩阵乘法的非常规实现 用户尝试用纯列表推导模拟向量乘法,虽非高效但体现Python简洁性: ```python vec1 = [2, 3, 4] vec2 = [1, 2, 3] result = sum(x * y for x in vec1 for y in vec2) # 改进为生成器表达式 print(result) # 输出:2*1+2*2+2*3 + 3*1+...+4*3 = 140 ``` **创新点**:用一行代码替代循环,通过`itertools.product`可进一步优化[^1]。 --- ### 2. 动态捕获类实例的元编程技巧 通过反射机制自动收集所有类实例并操作: ```python class Person: instances = {} def __init__(self, name): self.name = name # 注册实例到类字典 self.__class__.instances[id(self)] = self # 实例化后可直接访问所有对象 Person("张三"), Person("李四") print([obj.name for obj in Person.instances.values()]) # ['张三','李四'] ``` **优势**:避免手动维护实例列表,适用于自动化测试、批量操作等场景[^2]。 --- ### 3. 中文文字到像素图像的神经计算预处理 将中文字符转化为可训练的像素矩阵(简化示例): ```python from PIL import Image, ImageDraw def char_to_pixels(char, size=32): """将单字转为灰度图像""" img = Image.new('L', (size, size), 255) draw = ImageDraw.Draw(img) draw.text((5, 5), char, fill=0) return list(img.getdata()) # 返回像素值列表 # 示例:生成「神」字的像素向量 pixel_data = char_to_pixels('神') print(f"像素维度: {len(pixel_data)}") # 1024维向量 ``` **应用价值**:将离散文本转化为连续图像数据,便于CNN/RNN处理语义关联[^3]。 --- ### 4. 利用闭包实现状态持久化 突破面向对象限制,用函数闭包保存状态: ```python def counter(start=0): count = start def _increment(): nonlocal count count += 1 return count return _increment timer = counter(10) print(timer(), timer()) # 输出:11, 12 ``` **特点**:避免类定义的冗余,轻量级状态管理方案。 --- ### 5. 用字典实现Switch-Case结构 Python无原生switch语法,但可通过字典模拟: ```python def case_1(): return "执行操作A" def case_2(): return "执行操作B" switch_dict = {1: case_1, 2: case_2} # 调用示例 result = switch_dict.get(2, lambda: "默认操作")() print(result) # 输出:执行操作B ``` **灵活性**:动态修改行为字典,实现策略模式。 --- ### 6. 递归目录扫描器(单行实现) 利用生成器递归遍历文件系统: ```python import os def scan(path): yield from (os.path.join(p, f) for p, _, fs in os.walk(path) for f in fs) # 打印某目录下所有.py文件 [print(f) for f in scan("/code") if f.endswith(".py")] ``` **Pythonic思维**:结合生成器与条件推导提升可读性。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值