后端要求前端传的查询参数

2020-04-17 14:39:12 +08:00
 zycojamie

比如,你输入一个手机号,进行查询,要把你手机号的值,查询是 like 还是=,数据是 string 还是 int,模糊还是精准查询,全部前端拼给后端。。。

这种方案可行吗。。。

8014 次点击
所在节点    程序员
79 条回复
vitoliu
2020-04-17 17:59:53 +08:00
防 sql 注入的工具很多,后端随便引一下就解决了,而且的确能摆脱大量的判空和 if else 。
参数混淆啥的也都没做,而且看参数名应该是 B 端系统吧,用户量少这么干的确也没啥问题。
不过前端传驼峰不传下划线的确让我感觉挺不得劲的哈哈哈。
areless
2020-04-17 18:06:44 +08:00
可行,写了一套这样的前后端,本来想用。感觉那就每天没事干,盯着前端写 SQL 就可以了
IGJacklove
2020-04-17 18:09:47 +08:00
@ZSeptember 感觉一个接口和这个也没啥关系吧,换个方式,加个枚举什么的都比前端传 like 强吧
Deffi
2020-04-17 18:18:31 +08:00
我是移动端,要是考虑版本迭代,逻辑变更,我不会用这种接口。前端应该尽量少做逻辑处理
red2dog
2020-04-17 18:19:44 +08:00
graphql ++
guyeu
2020-04-17 18:51:11 +08:00
在有很多复杂查询的场景使用自己的 DSL 代替若干个接口是有意义的,但需要注意的是不应该让前端拼 SQL,而且需要对 DSL 的应用范围进行限制,最好是从设计上避免危险操作的可能性。
guyeu
2020-04-17 18:52:53 +08:00
不拼 SQL 的主要原因是让数据库和客户端解耦,因为在不通的架构模式下 SQL 的写法可能有较大差异,这不应该影响客户端实现,而表结构也不应该对客户端透明。
k9990009
2020-04-17 18:59:05 +08:00
可以的,但是不要前端拼 SQL 。以前我们前端人手不够,前端也是后端写的。自定义参数解析。然后后端调用根据关键字,这个关键字正好是 mybatis plus 的方法名,通过反射调用自动拼。后端只要继承默认实现 CRUD 就好了。比如前端传 name_leftlike,只要写前端就好了,超爽。后端做参数过滤就好了。
oatw
2020-04-17 19:01:40 +08:00
@zycojamie 不考虑后端的前端和不考虑前端的后端,都是业余选手。就像这个架构师。
randyo
2020-04-17 19:05:34 +08:00
流量不要钱吗,前端为了摆脱复杂数据果断抛回去让后端自己写
rioshikelong121
2020-04-17 19:08:09 +08:00
这样前端也得懂表结构了 而且复杂的 sql 怎么处理。还得单独写接口吧。
kohos
2020-04-17 19:18:51 +08:00
这种如果是 where 后面全部靠前端提供的参数生成的话,很不安全,例如楼主的接口,改一下 roleId 就能操作其他角色的数据了,后端想偷懒也不是这样做的
component
2020-04-17 19:47:46 +08:00
GraphQL 了解一下
jugelizi
2020-04-17 19:50:53 +08:00
可行
但不是拼接。
应该是传 json k v 指定查询类型 以及查询内容
MilletChili
2020-04-17 19:51:20 +08:00
一般的查询,我都是叫前端去拼的,虽然我就是那个前端
start_num = int(request.GET.get('start_num') or 0) # 起始数
get_num = int(request.GET.get('get_num') or 10) # 需求数
filters = request.GET.get('filters') # 筛选条件
sorts = request.GET.get('sorts') # 排序条件
want_fileds = request.GET.get('want_fileds') # 指定需要的字段
is_distinct = request.GET.get('is_distinct') # 是否去重

qset = model.objects.using(using_database).all()

if filters:
# print('筛选条件:',filters)
qset = filterHelper(filters, qset)
if sorts:
# print('排序条件:',sorts)
qset = qset.order_by(*sorts.split(','))
if is_distinct == 'yes':
qset = qset.distinct()

all_num = qset.count() # 总个数
qset = qset[start_num: start_num + get_num]

if want_fileds:
data_list = createSerializers(model, want_fileds.split(','))(qset, many=True).data
else:
data_list = Ser_L(qset, many=True).data
data = {'all_num': all_num, 'data_list': data_list}
CEBBCAT
2020-04-17 19:56:17 +08:00
wushigejiajia01
2020-04-17 20:19:01 +08:00
楼主大致意思: 前端传参,要把参数类型,以及查询范围都传给后端,这样后端能把接口做的很灵活多用

应该是这个意思吧?

只要不是由前端拼接 SQL,这没啥问题啊
shadeofgod
2020-04-17 21:30:25 +08:00
这届后端还是不行 🐶
jswh
2020-04-17 21:44:49 +08:00
管理后台可以,产品中最好不要。这事我也干过,本质上可所谓的 restful 或者 graphql 的想法是一样的,就是定义一套自己的 DSL 免得老是做相同的事情。
lizhuoli
2020-04-17 21:53:46 +08:00
重新自己实现一个垃圾版本 GraphQL ?意义何在

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663436

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX