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

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

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

这种方案可行吗。。。

7680 次点击
所在节点    程序员
79 条回复
jziwenchen
2020-04-17 15:12:21 +08:00
graphql 可以了解看看
sun1991
2020-04-17 15:14:58 +08:00
要区分具体需求是什么再谈实现, 不要一上来就一顿喷...
曾经做过的灵活可定制查询界面大概就是这样的实现.
lneoi
2020-04-17 15:15:16 +08:00
这样处理太繁琐了吧 有点像是做后台的大量查询的需求
fumichael
2020-04-17 15:15:44 +08:00
像这个一样?前端可以组装查询条件呀
但不能后端直接接收前端参数作为 sql 语句
我想到的是,可以使用枚举进行处理
https://i.loli.net/2020/04/17/AfIQ4U7weZtDdSB.png
purensong
2020-04-17 15:16:08 +08:00
graphQL 不错
cedoo22
2020-04-17 15:18:52 +08:00
没安全规则吗???让前端拼。。😂😂
z1154505909
2020-04-17 15:21:19 +08:00
前端拼接????头一次听说
CismonX
2020-04-17 15:24:59 +08:00
突然想起来之前我们学校有个英语课在线答题系统,前端传给后端的参数是一条条完整的 SQL 。

有好事者试着传了个 DROP TABLE xxx,然后就没有然后了😂
zycojamie
2020-04-17 15:40:59 +08:00
安全的话,后端说他们通过框架层去校验和拦截,前端需要把传统的查询参数由{ user:"张三"}变成{ user:{
matchType:"1",
propertyName:"user",
propertyValue:"张三",
dataType:"string"
}}
matchType 为 1 代表“包含”
Erroad
2020-04-17 15:51:44 +08:00
前端把 ui“翻译”成参数还是很正常的,拼 sql 是肯定不行的,让前端拼 sql 给后端的后端都是 xx
littleylv
2020-04-17 15:54:12 +08:00
@cedoo22 #26
@z1154505909 #27
你们到底有没看仔细看楼主说的。。。。。。。。。。。。。。无力吐槽
wyz123723
2020-04-17 15:57:23 +08:00
现在后端真是越来越烂 /懒了
wellsc
2020-04-17 16:00:49 +08:00
graphql + 1
1et
2020-04-17 16:03:14 +08:00
string 和 int 确实有点迷,传 like 、=没什么问题,比如 name:3 默认等值查询,name_like:3 是模糊查询
javapythongo
2020-04-17 16:10:51 +08:00
我觉得可以
buffzty
2020-04-17 16:13:50 +08:00
我就是这样做的.已经用了一年多了.如果项目很小,开发速度第一可以试试.缺点就是只能普通查询,如果查询有 join 的需要手动写规则
下面这个是我查询列表的一个通用方法.新加一个模型只需要设置一下 model 类型 和 filter 映射和 order 映射
用这套接口速度起飞,但有局限性
```php
// Base controller
public function lists(): Json
{
$json = new JsonRes();
[$page, $limit, $filter, $order, $extra] = $this->getListParam();
$scene = $extra['scene'] ?? $this->model::SCENE['default'];
$where = $this->model::buildWhereMap($filter);
$fmtOrder = $this->model::buildFmtOrder($order);
if ( $scene === $this->model::SCENE['admin'] && !$this->isAdminUser() ) {
return $this->noAuth();
}
[$list, $count] = $this->model::getListNotThrowEmptyEx($page, $limit,
$this->model::NEED_COUNT, $where, [], $order);
$fmtList = [];
/** @var \app\model\Base $model */
foreach ($list as $model) {
$fmtList[] = $model->getFmtDetail($scene);
}
$json->setData([
'list' => $fmtList,
]);
$json->setPage($page);
$json->setLimit($limit);
$json->setCount($count);
return json($json);
}

// Base Model
/**
* 根据 filter 构建查询条件.
*
* @param array|null $filterList
* @param array $filterFieldMapDbField
* @return array
*/
public static function buildWhereMap($filterList, array $filterFieldMapDbField =
[]): array
{

$filterFieldMapDbField = empty($filterFieldMapDbField) ? static::FILTER_FIELD_MAP_DB_FIELD : $filterFieldMapDbField;
$map = [];
if ( !is_array($filterList) ) {
return [];
}
foreach ($filterList as $filterField => $item) {
if ( $item instanceof Closure ) {
$map[] = $item;
continue;
}
if ( !is_array($item) || !array_key_exists('condition', $item)
|| !array_key_exists('val', $item) ) {
continue;
}
if ( $item['val'] === '' || $item['condition'] === Condition::TYPE['undefined'] ||
!in_array($item['condition'], Condition::TYPE, true)
) {
continue;
}
if ( !array_key_exists($filterField, $filterFieldMapDbField) ) {
continue;
}
$dbField = $filterFieldMapDbField[$filterField];
$condition = Condition::DB_CONDITION[$item['condition']];
$map[] = [
$dbField, $condition, Condition::formatVal($item['condition'], $item['val']),
];
}

return $map;
}
```
前端代码:
```typescript
// 一个模型只需要定义下面这些 就可以使用通用增删改查 5 个接口了
type Model = Expert
const route = '/expert'
type FilterKeys =
| 'id'
| 'ctime'
| 'expertCode'
| 'name'
| 'userName'
| 'departmentId'
| 'orgCode'
| 'orgName'
| 'provCode'
| 'cityCode'
| 'countyCode'
| 'provName'
| 'cityName'
| 'countyName'
| 'level'
| 'intro'
| 'type'
| 'mobile'
| 'phone'
| 'email'
| 'qq'
| 'wx'
| 'remark'
| 'serviceType'
type OrderKeys = 'id' | 'ctime'
type Scene = 'admin' | 'default'
interface QueryExtra extends BaseExtra<Scene> {}
type ActGetListParam = GetListParam<FilterKeys, OrderKeys, QueryExtra>
type AddData = Omit<Model, 'adeptLabelList' | 'department' | 'id'>
type EditData = AddData & Pick<Model, 'id'>

export async function lists<T = Model>(data: ActGetListParam) {
return bpost<{ list: T[] }>({
url: route + '/list',
data,
})
}
```
buffzty
2020-04-17 16:14:56 +08:00
谁能告诉我这破站到底怎么发代码?
baiyi
2020-04-17 16:19:57 +08:00
GraphQL +10086
xgfan
2020-04-17 16:40:17 +08:00
这不就是那个男人经常推广的场景吗?
masker
2020-04-17 17:00:09 +08:00
@pap3r 你这种优越🐶,真把自己当回事

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

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

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

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

© 2021 V2EX